9 #include "AliAnalysisManager.h"
10 #include "AliInputEventHandler.h"
11 #include "AliVEvent.h"
12 #include "AliVTrdTrack.h"
15 #include "AliMCEvent.h"
16 #include "AliGenPythiaEventHeader.h"
19 #include "AliESDEvent.h"
20 #include "AliESDInputHandler.h"
21 #include "AliESDtrack.h"
22 #include "AliESDTrdTrack.h"
23 #include "AliESDTrdTracklet.h"
24 #include "AliESDTrdTrigger.h"
27 #include "AliAODEvent.h"
28 #include "AliAODJet.h"
29 #include "AliAODTrack.h"
32 #include "AliAnalysisTaskJetServices.h"
33 #include "AliAnalysisHelperJetTasks.h"
35 #include "AliAnalysisTaskJetsTriggerTRD.h"
37 AliAnalysisTaskJetsTriggerTRD::AliAnalysisTaskJetsTriggerTRD(const char *name) :
38 AliAnalysisTaskSE(name),
42 fShortTaskId("jets_trg_trd"),
51 DefineOutput(1, TList::Class());
54 AliAnalysisTaskJetsTriggerTRD::~AliAnalysisTaskJetsTriggerTRD()
60 void AliAnalysisTaskJetsTriggerTRD::UserCreateOutputObjects()
62 // create user output objects
66 fOutputList = new TList();
67 fOutputList->SetOwner();
70 TH1 *histStat = AddHistogram(ID(kHistStat), "event statistics;;counts",
71 kStatLast-1, .5, kStatLast-.5);
72 histStat->GetXaxis()->SetBinLabel(ID(kStatSeen));
73 histStat->GetXaxis()->SetBinLabel(ID(kStatTrg));
74 histStat->GetXaxis()->SetBinLabel(ID(kStatUsed));
75 histStat->GetXaxis()->SetBinLabel(ID(kStatEvCuts));
77 AddHistogram(ID(kHistJetPtMC), "leading jet spectrum (MC, |#eta| < 0.5);p_{T} (GeV/c);counts",
78 fNoJetPtBins, 0., fJetPtBinMax);
80 AddHistogram(ID(kHistNoJets), "number of jets;N^{jet};counts",
83 AddHistogram(ID(kHistTrackGTU), "GTU track p_{T};p_{T} (GeV/c);counts",
86 AddHistogram(ID(kHistNPtMin),
87 "rejection;p_{T}^{min};N_{trk};trigger",
90 kTrgLast - 1, .5, kTrgLast - .5);
92 AddHistogram(ID(kHistLeadJetPt),
93 "leading jet spectrum (|#eta| < 0.5);p_{T} (GeV/c);counts",
94 fNoJetPtBins, 0., fJetPtBinMax,
95 kTrgLast - 1, .5, kTrgLast - .5);
96 AddHistogram(ID(kHistJetPt),
97 "jet spectrum (|#eta| < 0.5);p_{T} (GeV/c);trigger",
98 fNoJetPtBins, 0., fJetPtBinMax,
99 kTrgLast - 1, .5, kTrgLast - .5);
100 AddHistogram(ID(kHistJetPtITS),
101 "jet spectrum (|#eta| < 0.5);p_{T} (GeV/c);trigger",
102 fNoJetPtBins, 0., fJetPtBinMax,
103 kTrgLast - 1, .5, kTrgLast - .5);
104 AddHistogram(ID(kHistJetPt3x3),
105 "jet spectrum (|#eta| < 0.5);p_{T} (GeV/c);trigger",
106 fNoJetPtBins, 0., fJetPtBinMax,
107 kTrgLast - 1, .5, kTrgLast - .5);
109 for (Int_t iHist = kHistLeadJetPt; iHist <= kHistJetPt3x3; ++iHist) {
110 TH1 *h = GetHistogram(Hist_t (iHist));
111 h->GetYaxis()->SetBinLabel(ID(kTrgMinBias));
112 h->GetYaxis()->SetBinLabel(ID(kTrgInt7));
113 h->GetYaxis()->SetBinLabel(ID(kTrgInt8));
114 h->GetYaxis()->SetBinLabel(ID(kTrgEMC7));
115 h->GetYaxis()->SetBinLabel(ID(kTrgEMC8));
116 h->GetYaxis()->SetBinLabel(ID(kTrgInt7WUHJT));
117 h->GetYaxis()->SetBinLabel(ID(kTrgInt8WUHJT));
118 h->GetYaxis()->SetBinLabel(ID(kTrgEMC7WUHJT));
119 h->GetYaxis()->SetBinLabel(ID(kTrgEMC8WUHJT));
120 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEJE));
121 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEGA));
124 AddHistogram(ID(kHistJetPtNoTracks3),
125 "number of tracks above 3 GeV;p_{T}^{jet};no. of tracks",
126 fNoJetPtBins, 0., fJetPtBinMax,
129 PostData(1, fOutputList);
132 Bool_t AliAnalysisTaskJetsTriggerTRD::Notify()
134 // actions to be taken upon notification about input file change
141 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
144 TFile *curfile = tree->GetCurrentFile();
146 Error("Notify","No current file");
150 Float_t nEntries = (Float_t) tree->GetTree()->GetEntries();
151 if (!AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(), fXsection, fAvgTrials)) {
152 AliError("retrieval of cross section failed");
153 // ??? what to set as cross section?
157 fAvgTrials /= nEntries;
160 return AliAnalysisTaskSE::Notify();
163 void AliAnalysisTaskJetsTriggerTRD::UserExec(Option_t * /* option */)
167 // setup pointers to input data (null if unavailable)
169 // esdEvent: ESD input
170 // outEvent: AOD output
171 // aodEvent: AOD input if available, otherwise AOD output
172 AliMCEvent *mcEvent = this->MCEvent();
173 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(this->InputEvent()); // could also be AOD input
174 AliAODEvent* outEvent = this->AODEvent();
175 AliAODEvent *aodEvent = outEvent;
176 if (dynamic_cast<AliAODEvent*>(this->InputEvent()))
177 aodEvent = (AliAODEvent*) (this->InputEvent());
179 if ((fDebug > 0) && esdEvent)
180 printf("event: %s-%06i\n", CurrentFileName(), esdEvent->GetEventNumberInFile());
182 // Int_t nTracksMC = mcEvent ? mcEvent->GetNumberOfTracks() : 0; // no. of MC tracks
183 // Int_t nTracks = InputEvent()->GetNumberOfTracks(); // no. of global tracks
184 Int_t nTracksTRD = InputEvent()->GetNumberOfTrdTracks(); // no. of GTU tracks
190 Float_t leadingJetPtMC = 0.; // leading jet energy from MC information
191 Float_t leadingJetPtRec = 0.; // leading jet energy from AOD information
193 // record number of sampled events and detect trigger contributions
194 FillH1(kHistStat, kStatSeen);
195 if (!DetectTriggers()) {
196 AliError("Failed to detect the triggers");
200 // only continue for events from interesting triggers
201 if (fTriggerMask == 0)
203 FillH1(kHistStat, kStatTrg);
205 // no further technical requirements for the event at the moment
206 FillH1(kHistStat, kStatUsed);
209 const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
211 (vtx->GetNContributors() < 3.) ||
214 FillH1(kHistStat, kStatEvCuts);
216 // extract MC information
218 // check for PYTHIA event header
219 AliGenPythiaEventHeader *pythiaHeader =
220 dynamic_cast<AliGenPythiaEventHeader*> (mcEvent->GenEventHeader());
222 AliWarning("MC event without PYTHIA event header!\n");
225 fPtHard = pythiaHeader->GetPtHard();
226 // Int_t nTrials = pythiaHeader->Trials();
228 // loop over jets from PYTHIA
229 for (Int_t iJet = 0; iJet < pythiaHeader->NTriggerJets(); iJet++) {
231 pythiaHeader->TriggerJet(iJet, p);
232 TLorentzVector pJet(p);
233 Float_t pt = pJet.Pt();
234 // only consider jets with |eta| < 0.5
235 Float_t eta = pJet.Eta();
236 if (TMath::Abs(eta) > 0.5)
238 if (pt > leadingJetPtMC)
241 // fill histogram for leading jet pt spectrum
242 FillH1(kHistJetPtMC, leadingJetPtMC, fXsection);
246 // loop over GTU tracks
247 for (Int_t iTrack = 0; iTrack < nTracksTRD; ++iTrack) {
248 AliVTrdTrack *trk = InputEvent()->GetTrdTrack(iTrack);
249 FillH1(kHistTrackGTU, TMath::Abs(trk->Pt()));
252 partGtu.Sort(kSortAscending);
254 Int_t nTracksPerStack[90] = { 0 };
255 Int_t nTracksPerStackMax = 0;
257 TIter nextPartGtu(&partGtu);
258 while (AliVTrdTrack *trdTrack = (AliVTrdTrack*) nextPartGtu()) {
259 // count no. of tracks in stack,
260 // check whether this number was reached before,
261 // if not store pt^min(n),
262 // i.e. pt of current track because of sorting
264 Int_t sec = trdTrack->GetSector();
265 Int_t stack = trdTrack->GetStack();
267 if ((sec > -1) && (sec < 18) &&
268 (stack > -1) && (stack < 5)) {
269 ++nTracksPerStack[5*sec + stack];
270 if (nTracksPerStack[5*sec + stack] > nTracksPerStackMax) {
271 ++nTracksPerStackMax;
273 for (Int_t iTrigger = 1; iTrigger < kTrgLast; ++iTrigger)
274 if (IsTrigger(Trigger_t (iTrigger)))
276 TMath::Abs(trdTrack->Pt()), nTracksPerStackMax, iTrigger);
280 AliError(Form("Invalid sector or stack: %i %i",
286 // loop over jets from AOD event
288 TClonesArray *jetArray =
289 dynamic_cast<TClonesArray*> (aodEvent->FindListObject(fJetBranchName));
291 Int_t nJets = jetArray->GetEntriesFast();
292 FillH1(kHistNoJets, nJets);
294 AliAODJet *leadJet = 0x0;
295 // AliAODJet *subleadJet = 0x0;
297 for (Int_t iJet = 0; iJet < nJets; ++iJet) {
298 AliAODJet *jet = (AliAODJet*) (*jetArray)[iJet];
299 if (TMath::Abs(jet->Eta()) < 0.5) {
300 // check contributing tracks
301 Int_t nJetTracks = jet->GetRefTracks()->GetEntriesFast();
302 Int_t nJetTracks3 = 0;
303 AliAODTrack *leadingTrack = 0x0;
304 for (Int_t iTrack=0; iTrack < nJetTracks; ++iTrack) {
305 AliAODTrack *track = (AliAODTrack*) jet->GetRefTracks()->At(iTrack);
307 // count constituents above 3 GeV/c
308 if (track->Pt() > 3.)
311 // find the leading track
313 (track->Pt() > leadingTrack->Pt()))
314 leadingTrack = track;
318 if (TMath::Abs(jet->Pt()) > leadingJetPtRec) {
319 leadingJetPtRec = TMath::Abs(jet->Pt());
320 // subleadJet = leadJet;
325 for (Int_t iTrigger = 1; iTrigger < kTrgLast; ++iTrigger)
326 if (IsTrigger(Trigger_t (iTrigger)))
327 FillH1(kHistJetPt, jet->Pt(), iTrigger);
329 // integrated over all triggers
330 FillH2(kHistJetPtNoTracks3, jet->Pt(), nJetTracks3);
332 // limit to jets with leading track having an ITS contribution
333 // with a hit in any SPD layer
335 (leadingTrack->GetFlags() & AliVTrack::kITSrefit) &&
336 (leadingTrack->HasPointOnITSLayer(0) || leadingTrack->HasPointOnITSLayer(1)))
337 for (Int_t iTrigger = 1; iTrigger < kTrgLast; ++iTrigger)
338 if (IsTrigger(Trigger_t (iTrigger)))
339 FillH1(kHistJetPtITS, jet->Pt(), iTrigger);
341 // limit to jets having 3 tracks above 3 GeV/c
343 for (Int_t iTrigger = 1; iTrigger < kTrgLast; ++iTrigger)
344 if (IsTrigger(Trigger_t (iTrigger)))
345 FillH1(kHistJetPt3x3, jet->Pt(), iTrigger);
348 // fill leading jet information
349 for (Int_t iTrigger = 1; iTrigger < kTrgLast; ++iTrigger)
350 if (IsTrigger(Trigger_t (iTrigger)))
351 FillH1(kHistLeadJetPt, leadJet ? leadJet->Pt() : 0., iTrigger);
354 printf("no jet array found as branch %s\n", fJetBranchName);
358 printf("no AOD event found\n");
361 PostData(1, fOutputList);
364 void AliAnalysisTaskJetsTriggerTRD::Terminate(const Option_t * /* option */)
366 // actions at task termination
370 Bool_t AliAnalysisTaskJetsTriggerTRD::DetectTriggers()
374 AliInputEventHandler *inputHandler =
375 (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
377 AliVEvent::EOfflineTriggerTypes physSel = (AliVEvent::EOfflineTriggerTypes) inputHandler->IsEventSelected();
378 TString trgClasses = InputEvent()->GetFiredTriggerClasses();
381 printf("trg: %8s %8s %8s %8s %8s %8s %8s (%s)\n",
382 (physSel & AliVEvent::kAnyINT) ? "kAnyINT" : " ",
383 (physSel & AliVEvent::kCINT5) ? "kCINT5" : " ",
384 (physSel & AliVEvent::kINT7) ? "kINT7" : " ",
385 (physSel & AliVEvent::kINT8) ? "kINT8" : " ",
386 (physSel & AliVEvent::kMB) ? "kMB" : " ",
387 (physSel & AliVEvent::kEMC7) ? "kEMC7" : " ",
388 (physSel & AliVEvent::kTRD) ? "kTRD" : " ",
393 if ((physSel & (AliVEvent::kMB)))
394 MarkTrigger(kTrgMinBias);
396 if ((physSel & (AliVEvent::kINT7)))
397 MarkTrigger(kTrgInt7);
399 if ((physSel & (AliVEvent::kINT8)))
400 MarkTrigger(kTrgInt8);
402 if ((physSel & (AliVEvent::kEMC7)) &&
403 trgClasses.Contains("CEMC7"))
404 MarkTrigger(kTrgEMC7);
406 if ((physSel & (AliVEvent::kEMC8)) &&
407 trgClasses.Contains("CEMC8"))
408 MarkTrigger(kTrgEMC8);
410 if ((physSel & (AliVEvent::kEMCEJE)))
411 MarkTrigger(kTrgEMCEJE);
413 if ((physSel & (AliVEvent::kEMCEGA)))
414 MarkTrigger(kTrgEMCEGA);
416 // for the TRD-triggered events we use the classes
417 if (trgClasses.Contains("CINT7WUHJT-"))
418 MarkTrigger(kTrgInt7WUHJT);
420 if (trgClasses.Contains("CINT8WUHJT-"))
421 MarkTrigger(kTrgInt8WUHJT);
423 if (trgClasses.Contains("CEMC7WUHJT-"))
424 MarkTrigger(kTrgEMC7WUHJT);
426 if (trgClasses.Contains("CEMC8WUHJT-"))
427 MarkTrigger(kTrgEMC8WUHJT);
432 // ----- histogram management -----
433 TH1* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
434 Int_t xbins, Float_t xmin, Float_t xmax,
438 hName.Form("%s_%s", fShortTaskId, hid);
442 h = new TH1I(hName.Data(), title,
445 h = new TH1F(hName.Data(), title,
447 GetHistogram(hist) = h;
452 TH2* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
453 Int_t xbins, Float_t xmin, Float_t xmax,
454 Int_t ybins, Float_t ymin, Float_t ymax,
458 hName.Form("%s_%s", fShortTaskId, hid);
462 h = GetHistogram(hist) = new TH2I(hName.Data(), title,
466 h = GetHistogram(hist) = new TH2F(hName.Data(), title,
473 TH3* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
474 Int_t xbins, Float_t xmin, Float_t xmax,
475 Int_t ybins, Float_t ymin, Float_t ymax,
476 Int_t zbins, Float_t zmin, Float_t zmax,
480 hName.Form("%s_%s", fShortTaskId, hid);
484 h = GetHistogram(hist) = new TH3I(hName.Data(), title,
489 h = GetHistogram(hist) = new TH3F(hName.Data(), title,