35 #include <TClonesArray.h> 37 #include <THashList.h> 40 #include <TLorentzVector.h> 41 #include <TObjArray.h> 42 #include <TParameter.h> 45 #include "AliAnalysisManager.h" 46 #include "AliAnalysisUtils.h" 49 #include "AliEMCALGeometry.h" 51 #include "AliEMCALTriggerPatchInfo.h" 53 #include "AliESDEvent.h" 54 #include "AliInputEventHandler.h" 56 #include "AliMultSelection.h" 57 #include "AliMultEstimator.h" 58 #include "AliVCluster.h" 59 #include "AliVEvent.h" 60 #include "AliVEventHandler.h" 61 #include "AliVVertex.h" 71 AliAnalysisTaskEmcalClustersRef::AliAnalysisTaskEmcalClustersRef() :
73 fCentralityRange(-999., 999.),
74 fRequestCentrality(false),
76 fCentralityEstimator(
"V0M"),
77 fBunchCrossingIndex(-1),
78 fEnergyDefinition(kDefaultEnergy),
80 fDoFillMultiplicityHistograms(false),
81 fClusterTimeRange(-50e-6, 50e-6)
106 TLinearBinning smbinning(21, -0.5, 20.5), etabinning(100, -0.7, 0.7), timebinning(1000, -500e-9, 500e-9), ncellbinning(101, -0.5, 100.5);
115 std::array<Double_t, 5> encuts = {1., 2., 5., 10., 20.};
116 Int_t sectorsWithEMCAL[10] = {4, 5, 6, 7, 8, 9, 13, 14, 15, 16};
119 TLinearBinning v0abinning(1000, 0., 1000.), trackletbinning(500, 0., 500.), itsclustbinning(500, 0., 500.), emcclustbinning(100, 0., 100.), emccellbinning(3000, 0., 3000.);
120 const TBinning *multbinning[6] = {&v0abinning, &trackletbinning, &trackletbinning, &itsclustbinning, &emcclustbinning, &emccellbinning};
122 fHistos->
CreateTH1(
"hEventCount" + trg,
"Event count for trigger class " + trg, 1, 0.5, 1.5, optionstring);
123 fHistos->
CreateTH1(
"hEventCentrality" + trg,
"Event centrality for trigger class " + trg, 103, -2., 101., optionstring);
124 fHistos->
CreateTH1(
"hVertexZ" + trg,
"z-position of the primary vertex for trigger class " + trg, 200, -40., 40., optionstring);
126 fHistos->
CreateTH1(
"hClusterEnergy" + trg,
"Cluster energy for trigger class " + trg, energybinning, optionstring);
127 fHistos->
CreateTH1(
"hClusterET" + trg,
"Cluster transverse energy for trigger class " + trg, energybinning, optionstring);
128 fHistos->
CreateTH1(
"hClusterEnergyFired" + trg,
"Cluster energy for trigger class " + trg +
", firing the trigger", energybinning, optionstring);
129 fHistos->
CreateTH1(
"hClusterETFired" + trg,
"Cluster transverse energy for trigger class " + trg +
", firing the trigger" , energybinning, optionstring);
130 fHistos->
CreateTH2(
"hClusterEnergySM" + trg,
"Cluster energy versus supermodule for trigger class " + trg, smbinning, energybinning, optionstring);
131 fHistos->
CreateTH2(
"hClusterETSM" + trg,
"Cluster transverse energy versus supermodule for trigger class " + trg, smbinning, energybinning, optionstring);
132 fHistos->
CreateTH2(
"hClusterEnergyFiredSM" + trg,
"Cluster energy versus supermodule for trigger class " + trg +
", firing the trigger" , smbinning, energybinning, optionstring);
133 fHistos->
CreateTH2(
"hClusterETFiredSM" + trg,
"Cluster transverse energy versus supermodule for trigger class " + trg +
", firing the trigger" , smbinning, energybinning, optionstring);
134 fHistos->
CreateTH2(
"hEtaEnergy" + trg,
"Cluster energy vs. eta for trigger class " + trg, etabinning, energybinning, optionstring);
135 fHistos->
CreateTH2(
"hEtaET" + trg,
"Cluster transverse energy vs. eta for trigger class " + trg, etabinning, energybinning, optionstring);
136 fHistos->
CreateTH2(
"hTimeEnergy" + trg,
"Cluster time vs. energy for trigger class " + trg, timebinning, energybinning, optionstring);
137 fHistos->
CreateTH2(
"hNCellEnergy" + trg,
"Cluster number of cells vs energy for trigger class " + trg, ncellbinning, energybinning, optionstring);
138 fHistos->
CreateTH2(
"hNCellET" + trg,
"Cluster number of cells vs transverse energy for trigger class " + trg, ncellbinning, energybinning, optionstring);
139 fHistos->
CreateTH2(
"hEtaEnergyFired" + trg,
"Cluster energy vs. eta for trigger class " + trg +
", firing the trigger", etabinning, energybinning, optionstring);
140 fHistos->
CreateTH2(
"hEtaETFired" + trg,
"Cluster transverse energy vs. eta for trigger class " + trg +
", firing the trigger", etabinning, energybinning, optionstring);
141 for(
int ism = 0; ism < 20; ism++){
142 fHistos->
CreateTH2(TString::Format(
"hEtaEnergySM%d", ism) + trg, TString::Format(
"Cluster energy vs. eta in Supermodule %d for trigger ", ism) + trg, etabinning, energybinning, optionstring);
143 fHistos->
CreateTH2(TString::Format(
"hEtaETSM%d", ism) + trg, TString::Format(
"Cluster transverse energy vs. eta in Supermodule %d for trigger ", ism) + trg, etabinning, energybinning, optionstring);
144 fHistos->
CreateTH2(TString::Format(
"hEtaEnergyFiredSM%d", ism) + trg, TString::Format(
"Cluster energy vs. eta in Supermodule %d for trigger ", ism) + trg +
", firing the trigger", etabinning, energybinning, optionstring);
145 fHistos->
CreateTH2(TString::Format(
"hEtaETFiredSM%d", ism) + trg, TString::Format(
"Cluster transverse energy vs. eta in Supermodule %d for trigger ", ism) + trg +
", firing the trigger", etabinning, energybinning, optionstring);
147 for(
int isec = 0; isec < 10; isec++){
148 fHistos->
CreateTH2(TString::Format(
"hEtaEnergySec%d", sectorsWithEMCAL[isec]) + trg, TString::Format(
"Cluster energy vs.eta in tracking sector %d for trigger ", sectorsWithEMCAL[isec]) + trg, etabinning, energybinning, optionstring);
149 fHistos->
CreateTH2(TString::Format(
"hEtaETSec%d", sectorsWithEMCAL[isec]) + trg, TString::Format(
"Cluster transverse energy vs.eta in tracking sector %d for trigger ", sectorsWithEMCAL[isec]) + trg, etabinning, energybinning, optionstring);
150 fHistos->
CreateTH2(TString::Format(
"hEtaEnergyFiredSec%d", sectorsWithEMCAL[isec]) + trg, TString::Format(
"Cluster energy vs.eta in tracking sector %d for trigger ", sectorsWithEMCAL[isec]) + trg +
", firing the trigger", etabinning, energybinning, optionstring);
151 fHistos->
CreateTH2(TString::Format(
"hEtaETFiredSec%d", sectorsWithEMCAL[isec]) + trg, TString::Format(
"Cluster transverse energy vs.eta in tracking sector %d for trigger ", sectorsWithEMCAL[isec]) + trg +
", firing the trigger", etabinning, energybinning, optionstring);
153 for(
auto ien : encuts){
154 fHistos->
CreateTH2(TString::Format(
"hEtaPhi%dG", static_cast<int>(ien)) + trg, TString::Format(
"cluster #eta-#phi map for clusters with energy larger than %f GeV/c for trigger class ", ien) + trg, 100, -0.7, 0.7, 200, 0, 2*TMath::Pi(), optionstring);
155 fHistos->
CreateTH2(TString::Format(
"hEtaPhiFired%dG", static_cast<int>(ien)) + trg, TString::Format(
"cluster #eta-#phi map for clusters fired the trigger with energy larger than %f GeV/c for trigger class", ien) + trg +
", firing the trigger", 200, -0.7, 0.7, 200, 0, 2*TMath::Pi(), optionstring);
163 AliMultSelection *mult =
dynamic_cast<AliMultSelection *
>(InputEvent()->FindListObject(
"MultSelection"));
165 AliErrorStream() << GetName() <<
": Centrality selection enabled but no centrality estimator found" << std::endl;
168 if(mult->IsEventSelected())
return false;
170 AliDebugStream(1) << GetName() <<
": Centrality " <<
fEventCentrality << std::endl;
172 AliDebugStream(1) << GetName() <<
": reject centrality: " <<
fEventCentrality << std::endl;
175 AliDebugStream(1) << GetName() <<
": select centrality " <<
fEventCentrality << std::endl;
178 AliDebugStream(1) << GetName() <<
": No centrality selection applied" << std::endl;
182 int bcindex = fInputEvent->GetHeader()->GetBunchCrossNumber() % 4;
189 AliDebugStream(1) << GetName() <<
": UserExec start" << std::endl;
191 TList ej1patches, dj1patches, ej2patches, dj2patches, eg1patches, dg1patches, eg2patches, dg2patches;
202 TList *selpatches(
nullptr);
205 if(!clust->IsEMCAL())
continue;
206 if(clust->GetIsExotic())
continue;
212 AliDebugStream(2) << GetName() <<
": Using cluster energy definition: default" << std::endl;
216 AliDebugStream(2) << GetName() <<
": Using cluster energy definition: corrected for non-linearity" << std::endl;
217 energy = clust->GetNonLinCorrEnergy();
220 AliDebugStream(2) << GetName() <<
": Using cluster energy definition: corrected for hadronic contribution" << std::endl;
221 energy = clust->GetHadCorrEnergy();
225 AliDebugStream(2) << GetName() <<
": Using energy " << energy <<
" (def: " << clust->E()
226 <<
" | NL: " << clust->GetNonLinCorrEnergy()
227 <<
" | HD: " << clust->GetHadCorrEnergy()
230 TLorentzVector posvec;
231 clust->GetMomentum(posvec,
fVertex);
239 selpatches =
nullptr;
240 if(trg.Contains(
"EJ2")) selpatches = &ej2patches;
241 if(trg.Contains(
"DJ2")) selpatches = &dj2patches;
242 if(trg.Contains(
"EJ1")) selpatches = &ej1patches;
243 if(trg.Contains(
"DJ1")) selpatches = &dj1patches;
244 if(trg.Contains(
"EG2")) selpatches = &eg2patches;
245 if(trg.Contains(
"DG2")) selpatches = &dg2patches;
246 if(trg.Contains(
"EG1")) selpatches = &eg1patches;
247 if(trg.Contains(
"DG1")) selpatches = &dg1patches;
256 Int_t supermoduleID = -1, sector = -1;
258 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << triggerclass << std::endl;
260 fGeom->SuperModuleNumberFromEtaPhi(eta, phi, supermoduleID);
261 fHistos->
FillTH1(
"hClusterEnergy" + triggerclass, energy, weight);
262 fHistos->
FillTH1(
"hClusterET" + triggerclass, transverseenergy, weight);
263 fHistos->
FillTH2(
"hEtaEnergy" + triggerclass, eta, energy, weight);
264 fHistos->
FillTH2(
"hEtaET" + triggerclass, eta, transverseenergy, weight);
265 fHistos->
FillTH2(
"hTimeEnergy" + triggerclass, clustertime, energy, weight);
266 fHistos->
FillTH2(
"hNCellEnergy" + triggerclass, ncell, energy, weight);
267 fHistos->
FillTH2(
"hNCellET" + triggerclass, ncell, transverseenergy, weight);
268 if(supermoduleID >= 0){
269 fHistos->
FillTH2(
"hClusterEnergySM" + triggerclass, supermoduleID, energy, weight);
270 fHistos->
FillTH2(
"hClusterETSM" + triggerclass, supermoduleID, transverseenergy, weight);
271 fHistos->
FillTH2(TString::Format(
"hEtaEnergySM%d", supermoduleID) + triggerclass, eta, energy, weight);
272 fHistos->
FillTH2(TString::Format(
"hEtaETSM%d", supermoduleID) + triggerclass, eta, transverseenergy, weight);
273 if(supermoduleID < 12)
274 sector = 4 + int(supermoduleID/2);
276 sector = 13 + int((supermoduleID-12)/2);
277 fHistos->
FillTH2(TString::Format(
"hEtaEnergySec%d", sector) + triggerclass, eta, energy, weight);
278 fHistos->
FillTH2(TString::Format(
"hEtaETSec%d", sector) + triggerclass, eta, transverseenergy, weight);
281 fHistos->
FillTH1(
"hClusterEnergyFired" + triggerclass, energy, weight);
282 fHistos->
FillTH1(
"hClusterETFired" + triggerclass, energy, weight);
283 fHistos->
FillTH2(
"hEtaEnergyFired" + triggerclass, eta, energy, weight);
284 fHistos->
FillTH2(
"hEtaETFired" + triggerclass, eta, energy, weight);
285 if(supermoduleID >= 0){
286 fHistos->
FillTH2(
"hClusterEnergyFiredSM" + triggerclass, supermoduleID, energy, weight);
287 fHistos->
FillTH2(
"hClusterETFiredSM" + triggerclass, supermoduleID, transverseenergy, weight);
288 fHistos->
FillTH2(TString::Format(
"hEtaEnergyFiredSM%d", supermoduleID) + triggerclass, eta, energy,weight);
289 fHistos->
FillTH2(TString::Format(
"hEtaETFiredSM%d", supermoduleID) + triggerclass, eta, transverseenergy, weight);
290 fHistos->
FillTH2(TString::Format(
"hEtaEnergyFiredSec%d", sector) + triggerclass, eta, energy, weight);
291 fHistos->
FillTH2(TString::Format(
"hEtaETFiredSec%d", sector) + triggerclass, eta, transverseenergy, weight);
294 Double_t encuts[5] = {1., 2., 5., 10., 20.};
295 for(
int ien = 0; ien < 5; ien++){
296 if(energy > encuts[ien]){
297 fHistos->
FillTH2(TString::Format(
"hEtaPhi%dG", static_cast<int>(encuts[ien])) + triggerclass, eta, phi, weight);
299 fHistos->
FillTH2(TString::Format(
"hEtaPhiFired%dG", static_cast<int>(encuts[ien])) + triggerclass, eta, phi, weight);
306 double v0amult = fInputEvent->GetVZEROData()->GetMTotV0A(),
307 trackletmult =
static_cast<double>(
CountTracklets(-0.8, 0.8, 0., TMath::TwoPi())),
308 emctrackletmult = static_cast<double>(
CountTracklets(-0.8, 0.8, 1.4, TMath::Pi())),
309 itsclustermult = fInputEvent->GetMultiplicity()->GetNumberOfSPDClusters(),
320 double data[6] = {v0amult, trackletmult, emctrackletmult, itsclustermult, emcclustermult, emccellocc};
328 for(TIter patchIter = TIter(fTriggerPatches).Begin(); patchIter != TIter::End(); ++patchIter){
332 etamax = TMath::Max(boundaries[0], boundaries[1]),
333 phimin = TMath::Min(boundaries[2], boundaries[3]),
334 phimax = TMath::Max(boundaries[2], boundaries[3]);
335 if(etaclust > etamin && etaclust < etamax && phiclust >
phimin && phiclust < phimax){
344 foundtriggers.Clear();
345 if(!triggerPatches)
return;
356 for(
auto patchiter : *triggerPatches){
357 AliEMCALTriggerPatchInfo *mypatch =
static_cast<AliEMCALTriggerPatchInfo *
>(patchiter);
358 if(!mypatch->IsOfflineSimple())
continue;
360 if(!mypatch->IsDCalPHOS())
continue;
362 if(mypatch->IsDCalPHOS())
continue;
365 if(!mypatch->IsGammaLowSimple())
continue;
367 if(!mypatch->IsJetLowSimple())
continue;
370 if(mypatch->GetPatchE() > threshold) foundtriggers.Add(patchiter);
375 AliEMCALTriggerPatchInfo *patch=
dynamic_cast<AliEMCALTriggerPatchInfo *
>(o);
376 boundaries[0] = patch->GetEtaMin();
377 boundaries[1] = patch->GetEtaMax();
378 boundaries[2] = patch->GetPhiMin();
379 boundaries[3] = patch->GetPhiMax();
385 if(!clust->IsEMCAL())
continue;
386 if(clust->GetIsExotic())
continue;
387 if(clust->E() > ecut) nclusters++;
395 AliVMultiplicity *mult = fInputEvent->GetMultiplicity();
396 for(
int itl = 0; itl < mult->GetNumberOfTracklets(); itl++){
397 double eta = mult->GetEta(itl), phi = mult->GetPhi(itl);
398 if(!(eta > etamin && eta < etamax))
continue;
399 if(!(phi > phimin && phi < phimax))
continue;
406 std::set<int> cellIDs;
407 AliVCaloCells *emccells = fInputEvent->GetEMCALCells();
408 for(
short icell = 0; icell < emccells->GetNumberOfCells(); icell++){
409 if(emccells->GetAmplitude(icell) > ecut){
410 int cellID = emccells->GetCellNumber(icell);
411 if(cellIDs.find(cellID) == cellIDs.end()) cellIDs.insert(cellID);
414 return cellIDs.size();
433 TString outfile(mgr->GetCommonFileName());
434 outfile +=
":ClusterQA_" +
TString(suffix);
436 printf(
"Outfile: %s, container: %s\n", outfile.Data(), containername.Data());
438 task->ConnectInput(0, mgr->GetCommonInputContainer());
439 mgr->ConnectOutput(task, 1, mgr->CreateContainer(containername.Data(), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
467 TString outfile(mgr->GetCommonFileName());
468 outfile +=
":ClusterQA";
470 task->ConnectInput(0, mgr->GetCommonInputContainer());
471 mgr->ConnectOutput(task, 1, mgr->CreateContainer(
"ClusterResults", AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
EMCAL L1 Jet trigger, low threshold.
AliCutValueRange< double > fClusterTimeRange
Selected range on cluster time.
void GetPatchBoundaries(TObject *o, Double_t *boundaries) const
Get the boundaries of the trigger patch.
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
std::vector< TString > GetSupportedTriggers()
Class creating a linear binning, used in the histogram manager.
Double_t fEventCentrality
! Current event centrality
THistManager * fHistos
Task Histogram container.
Bool_t CorrelateToTrigger(Double_t etaclust, Double_t phiclust, TList *triggerpatches) const
Check whether cluster is inside a trigger patch which has fired the trigger.
int CountEmcalClusters(double ecut)
Double_t GetTriggerWeight(const TString &triggerclass) const
DCAL L1 Gamma trigger, low threshold.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
DCAL L1 Jet trigger, high threshold.
virtual bool IsUserEventSelected()
User event selection: Select event in maching centrality range (if requested)
Energy corrected for the hadronic contribution.
Simple monitoring task for cluster-related quantities in EMCAL-triggered events.
Char_t fBunchCrossingIndex
Bunch Crossing index.
AliEmcalTriggerOfflineSelection * fTriggerSelection
Offline trigger selection.
Bool_t fRequestCentrality
Switch on request for centrality range.
void AddStep(Double_t max, Double_t binwidth)
EMCAL L1 Gamma trigger, high threshold.
Interface for binnings used by the histogram handler.
void SetOfflineTriggerSelection(AliEmcalTriggerOfflineSelection *sel)
Set an offline trigger selection.
DCAL L1 Jet trigger, low threshold.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
Bool_t fDoFillMultiplicityHistograms
Swich for multiplcity histograms.
EMCAL L1 Jet trigger, high threshold.
Base class for analyses using EMCAL triggers.
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
AliAnalysisTaskEmcalClustersRef()
Dummy (I/O) constructor.
TString fNameClusterContainer
Name of the cluster container in the event.
virtual void UserFillHistosAfterEventSelection()
AliEMCALGeometry * fGeom
!emcal geometry
EmcalTriggerClass
Definition of the various supported trigger types.
Bool_t fEnableSumw2
Enable sumw2 when creating histograms.
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
Helper class creating user defined custom binning.
static Bool_t IsSingleShower(EmcalTriggerClass cls)
Checks if the trigger class is a single shower patch trigger class.
Double_t GetThresholdForTrigger(EmcalTriggerClass trgcls) const
Get the offline trigger threshold (on energy) for a given trigger class.
static AliAnalysisTaskEmcalClustersRef * AddTaskEmcalClustersRef(const TString &nClusters="usedefault", const TString &suffix="")
Preconfigure task so that it can be used in subwagons.
DCAL L1 Gamma trigger, high threshold.
EMCAL L1 Gamma trigger, low threshold.
int CountTracklets(double etamin, double etamax, double phimin, double phimax)
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
int GetEMCALCellOccupancy(double ecut)
TString fCentralityEstimator
Centrality estimator (default: V0M for PbPb)
void SetClusterContainer(TString clustercontname)
static AliAnalysisTaskEmcalClustersRef * AddTaskEmcalClustersRefDefault(const TString &nClusters="usedefault")
Preconfigure task and add it to the analysis manager.
Analysis of high- tracks in triggered events.
Double_t fVertex[3]
!event vertex
AliCutValueRange< double > fCentralityRange
Selected centrality range.
TClonesArray * fTriggerPatchInfo
!trigger patch info array
Uncorrected energy measurement.
static Bool_t IsDCAL(EmcalTriggerClass cls)
Checks if the trigger class is a jet patch trigger class.
EnergyDefinition_t fEnergyDefinition
Energy definition used for a given cluster.
Energy corrected for non-linearity.
virtual void CreateUserHistos()
Creating histograms for the distributions monitored by the task.
virtual ~AliAnalysisTaskEmcalClustersRef()
Destructor.
void FillClusterHistograms(const TString &triggerclass, double energy, double transversenergy, double eta, double phi, double clustertime, int ncell, TList *triggerpatches)
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
Create a new THnSparse within the container.
static AliEmcalTriggerOfflineSelection * TriggerSelectionFactory(Double_t el0, Double_t eg1, Double_t eg2, Double_t ej1, Double_t ej2, AliEmcalTriggerOfflineSelection::EmcalEnergyDefinition_t endef=AliEmcalTriggerOfflineSelection::kFEEEnergy)
Configures EMCAL trigger offline selection used to restrict EMCAL triggered sample.
void FindPatchesForTrigger(TString triggerclass, const TClonesArray *triggerpatches, TList &foundpatches) const
bool IsInRange(t value) const
void SetMinimum(Double_t min)
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.