16 #include <TClonesArray.h> 17 #include <THashList.h> 20 #include <TObjArray.h> 23 #include "AliAnalysisUtils.h" 24 #include "AliAODTrack.h" 25 #include "AliESDEvent.h" 26 #include "AliESDtrack.h" 27 #include "AliESDtrackCuts.h" 29 #include "AliEMCALTriggerPatchInfo.h" 30 #include "AliEMCALGeometry.h" 32 #include "AliInputEventHandler.h" 33 #include "AliVCluster.h" 34 #include "AliVEvent.h" 38 #if __cplusplus < 201103L 48 AliAnalysisTaskEventSelectionRef::AliAnalysisTaskEventSelectionRef():
50 fClusterContainerName(
""),
56 fTriggerPatchContainer(
nullptr),
74 DefineOutput(1, TList::Class());
87 fTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(
true, 1);
90 fTrackCuts->SetMaxDCAToVertexXYPtDep(
"0.0182+0.0350/pt^1.01");
94 TArrayD ptbinning, energybinning;
98 TString triggers[6] = {
"MB",
"EMC7",
"EJ1",
"EJ2",
"EG1",
"EG2"};
99 TString selectionStatus[3] = {
"All",
"Accepted",
"Rejected"};
100 for(
TString *trgit = triggers; trgit < triggers +
sizeof(triggers)/
sizeof(
TString); ++trgit){
101 fHistos->
CreateTH1(Form(
"hEventCount%sBeforeEventSelection", trgit->Data()), Form(
"Event count for trigger %s before event selection", trgit->Data()), 1, 0.5, 1.5);
102 fHistos->
CreateTH1(Form(
"hEventCount%sBeforeOfflineTrigger", trgit->Data()), Form(
"Event count for trigger %s before offline selection", trgit->Data()), 1, 0.5, 1.5);
103 fHistos->
CreateTH1(Form(
"hEventCount%sAfterOfflineTrigger", trgit->Data()), Form(
"Event count for trigger %s before offline selection", trgit->Data()), 1, 0.5, 1.5);
104 fHistos->
CreateTH1(Form(
"hVertexTrigger%sBeforeEventSelection", trgit->Data()), Form(
"Vertex Distribution for trigger %s before event selection", trgit->Data()), 400, -40, 40);
105 fHistos->
CreateTH1(Form(
"hVertexTrigger%sBeforeOfflineTrigger", trgit->Data()), Form(
"Vertex Distribution for trigger %s before offline trigger", trgit->Data()), 400, -40, 40);
106 fHistos->
CreateTH1(Form(
"hVertexTrigger%sAfterOfflineTrigger", trgit->Data()), Form(
"Vertex Distribution for trigger %s after offline trigger", trgit->Data()), 400, -40, 40);
107 for(
TString *statit = selectionStatus; statit < selectionStatus +
sizeof(selectionStatus)/
sizeof(
TString); ++statit){
108 fHistos->
CreateTH1(Form(
"hTrackPt%s%s", statit->Data(), trgit->Data()), Form(
"Pt spectrum of tracks in %s events of trigger %s", statit->Data(), trgit->Data()), ptbinning);
109 fHistos->
CreateTH1(Form(
"hClusterEnergy%s%s", statit->Data(), trgit->Data()), Form(
"Cluster energy spectrum in %s events of trigger %s", statit->Data(), trgit->Data()), energybinning);
110 if(trgit->CompareTo(
"MB"))
111 fHistos->
CreateTH1(Form(
"hPatchEnergy%s%s", statit->Data(), trgit->Data()), Form(
"Patch energy spectrum in %s events of trigger %s", statit->Data(), trgit->Data()), energybinning);
114 fHistos->
CreateTH1(Form(
"hPatchEnergy%sMinBias", trgit->Data()), Form(
"Patch energy spectrum for %s patches found in MB events", trgit->Data()), energybinning);
127 fGeometry = AliEMCALGeometry::GetInstanceFromRunNumber(fInputEvent->GetRunNumber());
131 TString triggerstring = fInputEvent->GetFiredTriggerClasses();
132 UInt_t selectionstatus = fInputHandler->IsEventSelected();
133 Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
134 isEJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ1"),
135 isEJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains(
"EJ2"),
136 isEG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG1"),
137 isEG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains(
"EG2"),
138 isEMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains(
"CEMC7");
139 if(!(isMinBias || isEMC7 || isEG1 || isEG2 || isEJ1 || isEJ2))
return;
140 const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
142 if(vtx->GetNContributors() < 1)
return;
143 if(fInputEvent->IsA() == AliESDEvent::Class() &&
fAnalysisUtils->IsFirstEventInChunk(fInputEvent))
return;
144 bool isSelected = kTRUE;
145 if(!
fAnalysisUtils->IsVertexSelected2013pA(fInputEvent)) isSelected = kFALSE;
146 if(
fAnalysisUtils->IsPileUpEvent(fInputEvent)) isSelected = kFALSE;
148 if(vtx->GetZ() < -10. || vtx->GetZ() > 10.) isSelected = kFALSE;
152 AliVTrack *trk(
nullptr);
Double_t etaEMCAL(0.), phiEMCAL(0.);
Int_t supermoduleID(-1);
153 for(
int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); itrk++){
154 trk =
static_cast<AliESDtrack *
>(fInputEvent->GetTrack(itrk));
155 if(TMath::Abs(trk->Eta()) > 0.6)
continue;
156 if(trk->IsA() == AliESDtrack::Class()){
157 AliESDtrack *origtrack =
static_cast<AliESDtrack *
>(trk);
159 AliESDtrack copytrack(*origtrack);
160 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
161 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
162 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
164 AliAODTrack *origtrack =
static_cast<AliAODTrack *
>(trk);
166 AliAODTrack copytrack(*origtrack);
167 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
168 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
169 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
171 if(!
fGeometry->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID))
continue;
172 if(supermoduleID < 0 || supermoduleID >= 10)
continue;
200 const char *triggerclass,
203 bool isOfflineSelected
207 fHistos->
FillTH1(Form(
"hVertexTrigger%sBeforeEventSelection", triggerclass), vtxz);
208 fHistos->
FillTH1(Form(
"hEventCount%sBeforeEventSelection", triggerclass), 1.);
211 fHistos->
FillTH1(Form(
"hEventCount%sBeforeOfflineTrigger", triggerclass), 1);
212 fHistos->
FillTH1(Form(
"hVertexTrigger%sBeforeOfflineTrigger", triggerclass), vtxz);
213 if(isOfflineSelected){
214 fHistos->
FillTH1(Form(
"hEventCount%sAfterOfflineTrigger", triggerclass), 1);
215 fHistos->
FillTH1(Form(
"hVertexTrigger%sAfterOfflineTrigger", triggerclass), vtxz);
220 for(TIter trackIter = TIter(
fTrackContainer).Begin(); trackIter != TIter::End(); ++trackIter){
221 ProcessTrack(triggerclass, static_cast<AliVTrack *>(*trackIter), isOfflineSelected);
226 for(TIter clsit = TIter(
fClusterContainer).Begin(); clsit != TIter::End(); ++clsit){
227 ProcessCluster(triggerclass, static_cast<AliVCluster *>(*clsit), isOfflineSelected);
233 ProcessOfflinePatch(triggerclass, static_cast<AliEMCALTriggerPatchInfo *>(*patchiter), isOfflineSelected);
239 const char *triggerclass,
240 const AliVTrack * track,
241 bool isOfflineSelected
244 fHistos->
FillTH1(Form(
"hTrackPtAll%s", triggerclass), TMath::Abs(track->Pt()));
245 if(isOfflineSelected){
246 fHistos->
FillTH1(Form(
"hTrackPtAccepted%s", triggerclass), TMath::Abs(track->Pt()));
248 fHistos->
FillTH1(Form(
"hTrackPtRejected%s", triggerclass), TMath::Abs(track->Pt()));
253 const char *triggerclass,
254 const AliVCluster *clust,
255 bool isOfflineSelected
258 if(!clust->IsEMCAL())
return;
259 fHistos->
FillTH1(Form(
"hClusterEnergyAll%s", triggerclass), clust->E());
260 if(isOfflineSelected){
261 fHistos->
FillTH1(Form(
"hClusterEnergyAccepted%s", triggerclass), clust->E());
263 fHistos->
FillTH1(Form(
"hClusterEnergyRejected%s", triggerclass), clust->E());
268 const char * triggerclass,
269 const AliEMCALTriggerPatchInfo * patch,
270 bool isOfflineSelected
273 bool isSingleShower = patch->IsGammaLowSimple();
274 bool isJetPatch = patch->IsJetLowSimple();
275 if(!(isSingleShower || isJetPatch))
return;
276 TString triggerstring(triggerclass);
277 if(!triggerstring.CompareTo(
"MB")){
287 bool singleShowerTrigger = !triggerstring.CompareTo(
"EMC7") || !triggerstring.CompareTo(
"EG1") || !triggerstring.CompareTo(
"EG2");
288 if((isSingleShower && singleShowerTrigger) || (isJetPatch && !singleShowerTrigger)){
289 fHistos->
FillTH1(Form(
"hPatchEnergyAll%s", triggerclass), patch->GetPatchE());
290 if(isOfflineSelected)
291 fHistos->
FillTH1(Form(
"hPatchEnergyAccepted%s", triggerclass), patch->GetPatchE());
293 fHistos->
FillTH1(Form(
"hPatchEnergyRejected%s", triggerclass), patch->GetPatchE());
303 std::vector<double> mybinning;
304 std::map<double,double> definitions;
305 definitions.insert(std::pair<double, double>(1, 0.05));
306 definitions.insert(std::pair<double, double>(2, 0.1));
307 definitions.insert(std::pair<double, double>(4, 0.2));
308 definitions.insert(std::pair<double, double>(7, 0.5));
309 definitions.insert(std::pair<double, double>(16, 1));
310 definitions.insert(std::pair<double, double>(32, 2));
311 definitions.insert(std::pair<double, double>(40, 4));
312 definitions.insert(std::pair<double, double>(50, 5));
313 definitions.insert(std::pair<double, double>(100, 10));
314 definitions.insert(std::pair<double, double>(200, 20));
315 double currentval = 0.;
316 mybinning.push_back(currentval);
317 for(std::map<double,double>::iterator
id = definitions.begin();
id != definitions.end(); ++id){
318 double limit =
id->first, binwidth =
id->second;
319 while(currentval < limit){
320 currentval += binwidth;
321 mybinning.push_back(currentval);
324 binning.Set(mybinning.size());
326 for(std::vector<double>::iterator it = mybinning.begin(); it != mybinning.end(); ++it)
335 std::vector<double> mybinning;
336 std::map<double,double> definitions;
337 definitions.insert(std::pair<double, double>(1, 0.05));
338 definitions.insert(std::pair<double, double>(2, 0.1));
339 definitions.insert(std::pair<double, double>(4, 0.2));
340 definitions.insert(std::pair<double, double>(7, 0.5));
341 definitions.insert(std::pair<double, double>(16, 1));
342 definitions.insert(std::pair<double, double>(36, 2));
343 definitions.insert(std::pair<double, double>(40, 4));
344 definitions.insert(std::pair<double, double>(50, 5));
345 definitions.insert(std::pair<double, double>(100, 10));
346 definitions.insert(std::pair<double, double>(200, 20));
347 double currentval = 0.;
348 mybinning.push_back(currentval);
349 for(std::map<double,double>::iterator
id = definitions.begin();
id != definitions.end(); ++id){
350 double limit =
id->first, binwidth =
id->second;
351 while(currentval < limit){
352 currentval += binwidth;
353 mybinning.push_back(currentval);
356 binning.Set(mybinning.size());
358 for(std::vector<double>::iterator it = mybinning.begin(); it != mybinning.end(); ++it)
377 if(!track->TestFilterBit(AliAODTrack::kTrkGlobal))
return false;
378 if(track->GetTPCNCrossedRows() < 120)
return false;
EMCAL L1 Jet trigger, low threshold.
Bool_t IsOfflineSelected(EmcalTriggerClass trgcls, const AliVEvent *const data) const
Select event as triggered event.
Bool_t TrackSelectionESD(AliESDtrack *track)
TObjArray * fTrackContainer
void CreateEnergyBinning(TArrayD &binning) const
AliEMCALGeometry * fGeometry
void CreatePtBinning(TArrayD &binning) const
TString fClusterContainerName
AliESDtrackCuts * fTrackCuts
AliAnalysisUtils * fAnalysisUtils
void FillEventCounterHists(const char *triggerclass, double vtxz, bool isSelected, bool isOfflineSelected)
EMCAL L1 Gamma trigger, high threshold.
void ProcessCluster(const char *triggerclass, const AliVCluster *clust, bool isOfflineSelected)
EMCAL L1 Jet trigger, high threshold.
void ProcessOfflinePatch(const char *triggerclass, const AliEMCALTriggerPatchInfo *patch, bool isOfflineSelected)
THashList * GetListOfHistograms() const
Get the list of histograms.
Bool_t TrackSelectionAOD(AliAODTrack *track)
void ProcessTrack(const char *triggerclass, const AliVTrack *track, bool isOfflineSelected)
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
EMCAL L1 Gamma trigger, low threshold.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
AliAnalysisTaskEventSelectionRef()
virtual void UserExec(Option_t *)
AliEmcalTriggerOfflineSelection * fTriggerSelection
Analysis of high- tracks in triggered events.
Container class for histograms.
TClonesArray * fClusterContainer
TClonesArray * fTriggerPatchContainer
virtual ~AliAnalysisTaskEventSelectionRef()
virtual void UserCreateOutputObjects()