10 #include "AliAnalysisManager.h"
11 #include "AliInputEventHandler.h"
12 #include "AliVEvent.h"
13 #include "AliVTrdTrack.h"
16 #include "AliMCEvent.h"
17 #include "AliGenPythiaEventHeader.h"
20 #include "AliESDEvent.h"
21 #include "AliESDInputHandler.h"
22 #include "AliESDtrack.h"
23 #include "AliESDTrdTrack.h"
24 #include "AliESDTrdTracklet.h"
25 #include "AliESDTrdTrigger.h"
28 #include "AliAODEvent.h"
29 #include "AliAODJet.h"
30 #include "AliAODTrack.h"
33 #include "AliAnalysisTaskJetServices.h"
34 #include "AliAnalysisHelperJetTasks.h"
36 #include "AliAnalysisTaskJetsTriggerTRD.h"
38 AliAnalysisTaskJetsTriggerTRD::AliAnalysisTaskJetsTriggerTRD(const char *name) :
39 AliAnalysisTaskSE(name),
44 fShortTaskId("jets_trg_trd"),
45 fNoTriggers(kTrgLast),
52 fGlobalEfficiencyGTU(.8),
53 fGtuLabel(-1) // -3 for hw, -1821 for re-simulation
57 DefineOutput(1, TList::Class());
60 AliAnalysisTaskJetsTriggerTRD::~AliAnalysisTaskJetsTriggerTRD()
66 void AliAnalysisTaskJetsTriggerTRD::UserCreateOutputObjects()
68 // create user output objects
72 fOutputList = new TList();
73 fOutputList->SetOwner();
76 TH1 *histStat = AddHistogram(ID(kHistStat), "event statistics;;counts",
77 kStatLast-1, .5, kStatLast-.5);
78 histStat->GetXaxis()->SetBinLabel(ID(kStatSeen));
79 histStat->GetXaxis()->SetBinLabel(ID(kStatTrg));
80 histStat->GetXaxis()->SetBinLabel(ID(kStatUsed));
81 histStat->GetXaxis()->SetBinLabel(ID(kStatEvCuts));
84 fNoTriggers = kTrgMCLast;
85 AddHistogram(ID(kHistXsection), "xsection stats",
87 AddHistogram(ID(kHistPtHard), "pt hard;#hat{p}_{T} (GeV/c);counts",
88 fNoJetPtBins, 0., fJetPtBinMax);
89 AddHistogram(ID(kHistJetPtMC), "leading jet spectrum (MC, |#eta| < 0.5);p_{T}^{jet} (GeV/c);counts",
90 fNoJetPtBins, 0., fJetPtBinMax);
93 AddHistogram(ID(kHistJetEtaAvg), "average eta",
96 AddHistogram(ID(kHistNoJets), "number of jets;N^{jet};counts",
99 AddHistogram(ID(kHistTrackGTU), "GTU track p_{T};p_{T} (GeV/c);counts",
102 AddHistogram(ID(kHistTrackEffGTU), "found GTU tracks;p_{T} (GeV/c);#eta;#varphi",
105 100, 0., 2.*TMath::Pi());
106 AddHistogram(ID(kHistTrackEffMC), "wanted GTU tracks;p_{T} (GeV/c);#eta;#varphi",
109 100, 0., 2.*TMath::Pi());
111 AddHistogram(ID(kHistNPtMin),
112 "rejection;p_{T}^{min};N_{trk};trigger",
115 fNoTriggers - 1, .5, fNoTriggers - .5);
118 AddHistogram(ID(kHistLeadJetPt),
119 "leading jet spectrum (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);counts",
120 fNoJetPtBins, 0., fJetPtBinMax,
121 fNoTriggers - 1, .5, fNoTriggers - .5);
122 AddHistogram(ID(kHistLeadJetPtEta),
123 "leading jet #eta (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger;#eta",
124 fNoJetPtBins, 0., fJetPtBinMax,
125 fNoTriggers - 1, .5, fNoTriggers - .5,
127 AddHistogram(ID(kHistLeadJetPtPhi),
128 "leading jet #phi (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger;#varphi",
129 fNoJetPtBins, 0., fJetPtBinMax,
130 fNoTriggers - 1, .5, fNoTriggers - .5,
131 40, 0., 2. * TMath::Pi());
132 AddHistogram(ID(kHistLeadJetEtaPhi),
133 "leading jet #eta - #varphi (|#eta| < 0.5);#eta;trigger;#varphi",
135 fNoTriggers - 1, .5, fNoTriggers - .5,
136 40, 0., 2. * TMath::Pi());
138 AddHistogram(ID(kHistLeadJetPtTrackPt),
139 "leading jet pt vs track pt;p_{T} (GeV/c);trigger;p_{T}^{jet,ch} (GeV/c)",
141 fNoTriggers - 1, .5, fNoTriggers - .5,
142 fNoJetPtBins, 0., fJetPtBinMax);
143 AddHistogram(ID(kHistLeadJetPtZ),
144 "leading jet pt vs z;z;trigger;p_{T}^{jet,ch} (GeV/c)",
146 fNoTriggers - 1, .5, fNoTriggers - .5,
147 fNoJetPtBins, 0., fJetPtBinMax);
148 AddHistogram(ID(kHistLeadJetPtXi),
149 "leading jet pt vs #xi;#xi;trigger;p_{T}^{jet,ch} (GeV/c)",
151 fNoTriggers - 1, .5, fNoTriggers - .5,
152 fNoJetPtBins, 0., fJetPtBinMax);
155 AddHistogram(ID(kHistJetPt),
156 "jet spectrum (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger",
157 fNoJetPtBins, 0., fJetPtBinMax,
158 fNoTriggers - 1, .5, fNoTriggers - .5);
159 AddHistogram(ID(kHistJetPtEta),
160 "jet #eta (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger;#eta",
161 fNoJetPtBins, 0., fJetPtBinMax,
162 fNoTriggers - 1, .5, fNoTriggers - .5,
164 AddHistogram(ID(kHistJetPtPhi),
165 "jet #phi (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger;#varphi",
166 fNoJetPtBins, 0., fJetPtBinMax,
167 fNoTriggers - 1, .5, fNoTriggers - .5,
168 40, 0., 2. * TMath::Pi());
169 AddHistogram(ID(kHistJetEtaPhi),
170 "jet #eta - #varphi (|#eta| < 0.5);#eta;trigger;#varphi",
172 fNoTriggers - 1, .5, fNoTriggers - .5,
173 40, 0., 2. * TMath::Pi());
175 AddHistogram(ID(kHistJetPtITS),
176 "jet spectrum (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger",
177 fNoJetPtBins, 0., fJetPtBinMax,
178 fNoTriggers - 1, .5, fNoTriggers - .5);
179 AddHistogram(ID(kHistJetPt3x3),
180 "jet spectrum (|#eta| < 0.5);p_{T}^{jet,ch} (GeV/c);trigger",
181 fNoJetPtBins, 0., fJetPtBinMax,
182 fNoTriggers - 1, .5, fNoTriggers - .5);
184 AddHistogram(ID(kHistJetPtTrackPt),
185 "jet pt vs track pt;p_{T} (GeV/c);trigger;p_{T}^{jet,ch} (GeV/c)",
187 fNoTriggers - 1, .5, fNoTriggers - .5,
188 fNoJetPtBins, 0., fJetPtBinMax);
189 AddHistogram(ID(kHistJetPtZ),
190 "jet pt vs z;z;trigger;p_{T}^{jet,ch} (GeV/c)",
192 fNoTriggers - 1, .5, fNoTriggers - .5,
193 fNoJetPtBins, 0., fJetPtBinMax);
194 AddHistogram(ID(kHistJetPtXi),
195 "jet pt vs #xi;#xi;trigger;p_{T}^{jet,ch} (GeV/c)",
197 fNoTriggers - 1, .5, fNoTriggers - .5,
198 fNoJetPtBins, 0., fJetPtBinMax);
200 for (Int_t iHist = kHistLeadJetPt; iHist <= kHistJetPtXi; ++iHist) {
201 TH1 *h = GetHistogram(Hist_t (iHist));
202 h->GetYaxis()->SetBinLabel(ID(kTrgMinBias));
203 h->GetYaxis()->SetBinLabel(ID(kTrgInt7));
204 h->GetYaxis()->SetBinLabel(ID(kTrgInt8));
205 h->GetYaxis()->SetBinLabel(ID(kTrgEMC7));
206 h->GetYaxis()->SetBinLabel(ID(kTrgEMC8));
207 h->GetYaxis()->SetBinLabel(ID(kTrgPbPb));
208 h->GetYaxis()->SetBinLabel(ID(kTrgCentral));
209 h->GetYaxis()->SetBinLabel(ID(kTrgSemiCentral));
210 h->GetYaxis()->SetBinLabel(ID(kTrgInt7WUHJT));
211 h->GetYaxis()->SetBinLabel(ID(kTrgInt8WUHJT));
212 h->GetYaxis()->SetBinLabel(ID(kTrgEMC7WUHJT));
213 h->GetYaxis()->SetBinLabel(ID(kTrgEMC8WUHJT));
214 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEJE));
215 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEGA));
216 h->GetYaxis()->SetBinLabel(ID(kTrgInt7_WU));
217 h->GetYaxis()->SetBinLabel(ID(kTrgInt7_WUHJT));
218 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEJE_WU));
219 h->GetYaxis()->SetBinLabel(ID(kTrgEMCEJE_WUHJT));
221 h->GetYaxis()->SetBinLabel(ID(kTrgMC3x3Vtx));
222 h->GetYaxis()->SetBinLabel(ID(kTrgMC3x3TRD));
223 h->GetYaxis()->SetBinLabel(ID(kTrgMC3x3TRDeff));
224 h->GetYaxis()->SetBinLabel(ID(kTrgMC3x3TRDeffmap));
228 AddHistogram(ID(kHistJetPtNoTracks3),
229 "number of tracks above 3 GeV;p_{T}^{jet,ch};no. of tracks",
230 fNoJetPtBins, 0., fJetPtBinMax,
233 PostData(1, fOutputList);
236 Bool_t AliAnalysisTaskJetsTriggerTRD::Notify()
238 // actions to be taken upon notification about input file change
241 // we should only count the cross section we see in the analysis,
242 // i.e. fXsection / nTrials
246 Float_t xSection = 0.;
247 Float_t nTrials = 0.;
248 Float_t nEntries = 0.;
250 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
253 TFile *curfile = tree->GetCurrentFile();
255 AliError("No current file");
259 if (!AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(), xSection, nTrials)) {
260 AliError("retrieval of cross section failed");
263 nEntries = (Float_t) tree->GetTree()->GetEntries();
265 fAvgTrials = nTrials / nEntries;
267 fAvgXsection = xSection / (nTrials / nEntries);
270 printf("n_trials = %f\n", nTrials);
273 return AliAnalysisTaskSE::Notify();
276 void AliAnalysisTaskJetsTriggerTRD::UserExec(Option_t * /* option */)
280 // setup pointers to input data (null if unavailable)
282 // esdEvent: ESD input
283 // outEvent: AOD output
284 // aodEvent: AOD input if available, otherwise AOD output
285 AliMCEvent *mcEvent = this->MCEvent();
286 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(this->InputEvent()); // could also be AOD input
287 AliAODEvent* outEvent = this->AODEvent();
288 AliAODEvent *aodEvent = outEvent;
289 if (dynamic_cast<AliAODEvent*>(this->InputEvent()))
290 aodEvent = (AliAODEvent*) (this->InputEvent());
292 if ((fDebug > 0) && esdEvent)
293 printf("event: %s-%06i\n", CurrentFileName(), esdEvent->GetEventNumberInFile());
295 Int_t nTracksMC = mcEvent ? mcEvent->GetNumberOfTracks() : 0; // no. of MC tracks
296 // Int_t nTracks = InputEvent()->GetNumberOfTracks(); // no. of global tracks
297 Int_t nTracksTRD = InputEvent()->GetNumberOfTrdTracks(); // no. of GTU tracks
303 Float_t leadingJetPtMC = 0.; // leading jet energy from MC information
304 Float_t leadingJetPtRec = 0.; // leading jet energy from AOD information
306 // record number of sampled events and detect trigger contributions
307 FillH1(kHistStat, kStatSeen);
308 if (!DetectTriggers()) {
309 AliError("Failed to detect the triggers");
313 // only continue for events from interesting triggers
314 if (fTriggerMask == 0)
316 FillH1(kHistStat, kStatTrg);
318 // no further technical requirements for the event at the moment
319 FillH1(kHistStat, kStatUsed);
321 if (fAvgXsection == 0.) {
322 AliError("zero cross section");
325 FillH1(kHistXsection, .5, fAvgXsection);
329 const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
331 (vtx->GetNContributors() < 3.) ||
334 FillH1(kHistStat, kStatEvCuts);
336 // extract MC information
338 // check for PYTHIA event header
339 AliGenPythiaEventHeader *pythiaHeader =
340 dynamic_cast<AliGenPythiaEventHeader*> (mcEvent->GenEventHeader());
342 AliWarning("MC event without PYTHIA event header!\n");
345 fPtHard = pythiaHeader->GetPtHard();
346 Int_t nTrials = pythiaHeader->Trials();
349 FillH1(kHistPtHard, fPtHard);
351 // loop over jets from PYTHIA
354 for (Int_t iJet = 0; iJet < pythiaHeader->NTriggerJets(); iJet++) {
356 pythiaHeader->TriggerJet(iJet, p);
357 TLorentzVector pJet(p);
358 Float_t pt = pJet.Pt();
359 // only consider jets with |eta| < 0.5
360 Float_t eta = pJet.Eta();
361 if (TMath::Abs(eta) > 0.5)
363 if (pt > leadingJetPtMC)
366 // for eta averge determination consider only jets above 60 GeV
374 // fill histogram for leading jet pt spectrum
375 FillH1(kHistJetPtMC, leadingJetPtMC);
376 // fill histogram for eta average
377 if ((eta1 > -1.) && (eta2 > -1.))
378 FillH1(kHistJetEtaAvg, (eta1 + eta2)/2.);
381 for (Int_t iTrack = 0; iTrack < nTracksMC; ++iTrack) {
382 AliVParticle *part = mcEvent->GetTrack(iTrack);
383 if (AcceptTrackMC(iTrack)) {
384 FillH3(kHistTrackEffMC, part->Pt(), part->Eta(), part->Phi());
389 // loop over GTU tracks
390 for (Int_t iTrack = 0; iTrack < nTracksTRD; ++iTrack) {
391 AliVTrdTrack *trk = InputEvent()->GetTrdTrack(iTrack);
392 // printf("trk %p has pt %5.2f and label %i\n",
393 // trk, trk->Pt(), trk->GetLabel());
394 if ((fGtuLabel != -1) && (trk->GetLabel() != fGtuLabel))
396 FillH1(kHistTrackGTU, TMath::Abs(trk->Pt()));
399 partGtu.Sort(kSortAscending);
401 Int_t nTracksPerStack[90] = { 0 };
402 Int_t nTracksPerStackMax = 0;
404 TIter nextPartGtu(&partGtu);
405 while (AliVTrdTrack *trdTrack = (AliVTrdTrack*) nextPartGtu()) {
406 // count no. of tracks in stack,
407 // check whether this number was reached before,
408 // if not store pt^min(n),
409 // i.e. pt of current track because of sorting
411 Int_t sec = trdTrack->GetSector();
412 Int_t stack = trdTrack->GetStack();
414 if ((sec > -1) && (sec < 18) &&
415 (stack > -1) && (stack < 5)) {
416 ++nTracksPerStack[5*sec + stack];
417 if (nTracksPerStack[5*sec + stack] > nTracksPerStackMax) {
418 ++nTracksPerStackMax;
420 for (Int_t iTrigger = 1; iTrigger < fNoTriggers; ++iTrigger)
421 if (IsTrigger(Trigger_t (iTrigger)))
423 TMath::Abs(trdTrack->Pt()), nTracksPerStackMax, iTrigger);
426 Int_t label = trdTrack->GetLabel();
428 if (AcceptTrackMC(label)) {
429 AliVParticle *part = MCEvent()->GetTrack(label);
430 FillH3(kHistTrackEffGTU, part->Pt(), part->Eta(), part->Phi());
434 AliWarning(Form("GTU track at %p with no label", trdTrack));
435 const Int_t nLayers = 6;
436 for (Int_t iLayer = 0; iLayer < nLayers; ++iLayer) {
437 AliVTrdTracklet *trkl = trdTrack->GetTracklet(iLayer);
439 AliWarning(Form("tracklet in layer %i has label %i\n",
440 iLayer, trkl->GetLabel()));
446 AliError(Form("Invalid sector or stack: %i %i",
452 // loop over jets from AOD event
454 TClonesArray *jetArray =
455 dynamic_cast<TClonesArray*> (aodEvent->FindListObject(fJetBranchName));
457 Int_t nJets = jetArray->GetEntriesFast();
458 FillH1(kHistNoJets, nJets);
460 AliAODJet *leadJet = 0x0;
461 // AliAODJet *subleadJet = 0x0;
463 for (Int_t iJet = 0; iJet < nJets; ++iJet) {
464 AliAODJet *jet = (AliAODJet*) (*jetArray)[iJet];
465 if (TMath::Abs(jet->Eta()) < 0.5) {
466 // check contributing tracks
467 Int_t nJetTracks = jet->GetRefTracks()->GetEntriesFast();
468 Int_t nJetTracks3 = 0;
469 AliAODTrack *leadingTrack = 0x0;
470 for (Int_t iTrack=0; iTrack < nJetTracks; ++iTrack) {
471 AliAODTrack *track = (AliAODTrack*) jet->GetRefTracks()->At(iTrack);
473 // count constituents above 3 GeV/c
474 if (track->Pt() > 3.)
477 // find the leading track
479 (track->Pt() > leadingTrack->Pt()))
480 leadingTrack = track;
484 if (TMath::Abs(jet->Pt()) > leadingJetPtRec) {
485 leadingJetPtRec = TMath::Abs(jet->Pt());
486 // subleadJet = leadJet;
490 // jet pt spectrum and
491 // fragmentation function
492 for (Int_t iTrigger = 1; iTrigger < fNoTriggers; ++iTrigger)
493 if (IsTrigger(Trigger_t (iTrigger))) {
494 Float_t jetPt = jet->Pt();
496 FillH1(kHistJetPt, jetPt, iTrigger);
498 FillH3(kHistJetPtEta, jet->Pt(), iTrigger, jet->Eta());
499 FillH3(kHistJetPtPhi, jet->Pt(), iTrigger, jet->Phi());
501 FillH3(kHistJetEtaPhi, jet->Eta(), iTrigger, jet->Phi());
503 Int_t nTracks = jet->GetRefTracks()->GetEntriesFast();
504 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
505 AliVParticle *track = dynamic_cast<AliVParticle*>(jet->GetRefTracks()->At(iTrack));
507 Float_t trackPt = track->Pt();
508 Float_t z = trackPt / jetPt;
509 Float_t xi = - TMath::Log(z);
510 FillH3(kHistJetPtTrackPt, trackPt, iTrigger, jet->Pt());
511 FillH3(kHistJetPtZ, z, iTrigger, jet->Pt());
512 FillH3(kHistJetPtXi, xi, iTrigger, jet->Pt());
517 // integrated over all triggers
518 FillH2(kHistJetPtNoTracks3, jet->Pt(), nJetTracks3);
520 // limit to jets with leading track having an ITS contribution
521 // with a hit in any SPD layer
523 (leadingTrack->GetFlags() & AliVTrack::kITSrefit) &&
524 (leadingTrack->HasPointOnITSLayer(0) || leadingTrack->HasPointOnITSLayer(1)))
525 for (Int_t iTrigger = 1; iTrigger < fNoTriggers; ++iTrigger)
526 if (IsTrigger(Trigger_t (iTrigger)))
527 FillH1(kHistJetPtITS, jet->Pt(), iTrigger);
529 // limit to jets having 3 tracks above 3 GeV/c
531 for (Int_t iTrigger = 1; iTrigger < fNoTriggers; ++iTrigger)
532 if (IsTrigger(Trigger_t (iTrigger)))
533 FillH1(kHistJetPt3x3, jet->Pt(), iTrigger);
537 // fill leading jet information
538 for (Int_t iTrigger = 1; iTrigger < fNoTriggers; ++iTrigger)
539 if (IsTrigger(Trigger_t (iTrigger))) {
540 FillH2(kHistLeadJetPt, leadJet ? leadJet->Pt() : 0., iTrigger);
542 Float_t leadJetPt = leadJet->Pt();
544 FillH3(kHistLeadJetPtEta, leadJet->Pt(), iTrigger, leadJet->Eta());
545 FillH3(kHistLeadJetPtPhi, leadJet->Pt(), iTrigger, leadJet->Phi());
546 if (leadJet->Pt() > 50.)
547 FillH3(kHistLeadJetEtaPhi, leadJet->Eta(), iTrigger, leadJet->Phi());
549 Int_t nTracks = leadJet->GetRefTracks()->GetEntriesFast();
550 for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
551 AliVParticle *track = dynamic_cast<AliVParticle*>(leadJet->GetRefTracks()->At(iTrack));
553 Float_t trackPt = track->Pt();
554 Float_t z = trackPt / leadJetPt;
555 Float_t xi = - TMath::Log(z);
556 FillH3(kHistLeadJetPtTrackPt, trackPt, iTrigger, leadJet->Pt());
557 FillH3(kHistLeadJetPtZ, z, iTrigger, leadJet->Pt());
558 FillH3(kHistLeadJetPtXi, xi, iTrigger, leadJet->Pt());
565 printf("no jet array found as branch %s\n", fJetBranchName);
569 printf("no AOD event found\n");
572 PostData(1, fOutputList);
575 void AliAnalysisTaskJetsTriggerTRD::Terminate(const Option_t * /* option */)
577 // actions at task termination
579 printf("total trials: %d\n", fNTrials);
582 Bool_t AliAnalysisTaskJetsTriggerTRD::DetectTriggers()
586 AliInputEventHandler *inputHandler =
587 (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
589 AliVEvent::EOfflineTriggerTypes physSel = (AliVEvent::EOfflineTriggerTypes) inputHandler->IsEventSelected();
590 TString trgClasses = InputEvent()->GetFiredTriggerClasses();
592 fTrdTrg.CalcTriggers(InputEvent());
594 UInt_t inputMaskL1 = 0;
595 if (AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*> (InputEvent()))
596 inputMaskL1 = esdEvent->GetHeader()->GetL1TriggerInputs();
597 else if (AliAODEvent *aodEvent = dynamic_cast<AliAODEvent*> (InputEvent()))
598 inputMaskL1 = aodEvent->GetHeader()->GetL1TriggerInputs();
601 printf("trg: %8s %8s %8s %8s %8s %8s %8s (%s)\n",
602 (physSel & AliVEvent::kAnyINT) ? "kAnyINT" : " ",
603 (physSel & AliVEvent::kCINT5) ? "kCINT5" : " ",
604 (physSel & AliVEvent::kINT7) ? "kINT7" : " ",
605 (physSel & AliVEvent::kINT8) ? "kINT8" : " ",
606 (physSel & AliVEvent::kMB) ? "kMB" : " ",
607 (physSel & AliVEvent::kEMC7) ? "kEMC7" : " ",
608 (physSel & AliVEvent::kTRD) ? "kTRD" : " ",
613 printf("trg: %8s %8s %8s %8s (%s)\n",
614 fTrdTrg.IsFired(AliTRDTriggerAnalysis::kHJT) ? "HJT" : " ",
615 fTrdTrg.IsFired(AliTRDTriggerAnalysis::kHSE) ? "HSE" : " ",
616 fTrdTrg.IsFired(AliTRDTriggerAnalysis::kHQU) ? "HQU" : " ",
617 fTrdTrg.IsFired(AliTRDTriggerAnalysis::kHEE) ? "HEE" : " ",
622 if ((physSel & (AliVEvent::kMB)))
623 MarkTrigger(kTrgMinBias);
625 if ((physSel & (AliVEvent::kAnyINT | AliVEvent::kCentral | AliVEvent::kSemiCentral)))
626 MarkTrigger(kTrgPbPb);
628 if ((physSel & (AliVEvent::kINT7))) {
629 MarkTrigger(kTrgInt7);
630 if (trgClasses.Contains("WU")) {
631 MarkTrigger(kTrgInt7_WU);
632 if (inputMaskL1 & (1 << 9))
633 MarkTrigger(kTrgInt7_WUHJT);
637 if ((physSel & (AliVEvent::kINT8)))
638 MarkTrigger(kTrgInt8);
640 if ((physSel & (AliVEvent::kEMC7)) &&
641 trgClasses.Contains("CEMC7"))
642 MarkTrigger(kTrgEMC7);
644 if ((physSel & (AliVEvent::kEMC8)) &&
645 trgClasses.Contains("CEMC8"))
646 MarkTrigger(kTrgEMC8);
648 if ((physSel & (AliVEvent::kEMCEJE))) {
649 MarkTrigger(kTrgEMCEJE);
650 if (trgClasses.Contains("WU")) {
651 MarkTrigger(kTrgEMCEJE_WU);
652 if (inputMaskL1 & (1 << 9))
653 MarkTrigger(kTrgEMCEJE_WUHJT);
657 if ((physSel & (AliVEvent::kEMCEGA)))
658 MarkTrigger(kTrgEMCEGA);
660 // for the TRD-triggered events we use the classes
661 if (trgClasses.Contains("CINT7WUHJT-"))
662 MarkTrigger(kTrgInt7WUHJT);
664 if (trgClasses.Contains("CINT8WUHJT-"))
665 MarkTrigger(kTrgInt8WUHJT);
667 if (trgClasses.Contains("CEMC7WUHJT-"))
668 MarkTrigger(kTrgEMC7WUHJT);
670 if (trgClasses.Contains("CEMC8WUHJT-"))
671 MarkTrigger(kTrgEMC8WUHJT);
679 Bool_t AliAnalysisTaskJetsTriggerTRD::DetectMCTriggers()
681 AliMCEvent *mcEvent = MCEvent();
683 Int_t nTracksMC = mcEvent ? mcEvent->GetNumberOfTracks() : 0; // no. of MC tracks
684 TList partMC; // list of particles
686 // fill tracks passing cuts to list
687 for (Int_t iTrackMC = 0; iTrackMC < nTracksMC; ++iTrackMC) {
688 AliVParticle *part = mcEvent->GetTrack(iTrackMC);
690 // only consider primaries
691 if (!mcEvent->IsPhysicalPrimary(iTrackMC))
694 // only consider charged particles
695 if (part->Charge() == 0)
698 // only look at particles in eta-acceptance of the central barrel
699 if (TMath::Abs(part->Eta()) >= 0.9)
705 // sort, starting from highest pt
706 partMC.Sort(kSortAscending);
708 Int_t nTracksInStack[4][90] = { { 0 } };
710 // iterate over accepted tracks
711 TIter nextMcPart(&partMC);
712 while (AliVParticle *part = (AliMCParticle*) (nextMcPart())) {
713 Float_t pt = part->Pt();
714 Float_t eta = part->Eta();
715 Float_t phi = part->Phi();
717 Int_t phiBin = (Int_t) (phi / (2 / 18. *TMath::Pi()));
718 // ??? use actual geometry
719 Int_t etaBin = (Int_t) ((eta + .9) / (1.8 / 5.));
721 Int_t pdgCode = ((AliMCParticle*) part)->Particle()->GetPdgCode();
723 printf("pt = %f, eta = %f, phi = %f, phiBin = %d, etaBin = %d, pdgCode = %d\n",
724 pt, eta, phi, phiBin, etaBin, pdgCode);
726 // increment number of tracks in stack
727 Int_t bin = phiBin * 5 + etaBin;
728 ++nTracksInStack[0][bin];
730 // if minimum number reached and
731 // the track has pt above threshold
733 if ((nTracksInStack[0][bin] >= 3) &&
735 MarkTrigger(kTrgMC3x3Vtx);
737 // only propagate particles that do not decay before ???
740 // why not use track references?
741 Float_t rTrack = pt / .15;
743 Float_t phiTrd = phi + TMath::ASin(rTrd / 2 / rTrack);
745 phiTrd += 2*TMath::Pi();
746 else if (phiTrd > 2*TMath::Pi())
747 phiTrd -= 2*TMath::Pi();
748 Float_t etaTrd = eta;
750 Int_t secTrd = (Int_t) (phiTrd / (2.*TMath::Pi()/18.));
751 Int_t stackTrd = (Int_t) ((etaTrd+0.9) / (1.8/5.));
752 Int_t binTrd = secTrd * 5 + stackTrd;
754 // increment number of tracks in stack
755 ++nTracksInStack[1][binTrd];
756 if (gRandom->Uniform() < fGlobalEfficiencyGTU)
757 ++nTracksInStack[2][binTrd];
758 if (gRandom->Uniform() < GetEfficiencyTRD(pt, eta, phi))
759 ++nTracksInStack[3][binTrd];
761 // if minimum number reached and
762 // the track has pt above threshold
765 if (nTracksInStack[1][binTrd] >= 3)
766 MarkTrigger(kTrgMC3x3TRD);
767 if (nTracksInStack[2][binTrd] >= 3)
768 MarkTrigger(kTrgMC3x3TRDeff);
769 if (nTracksInStack[3][binTrd] >= 3)
770 MarkTrigger(kTrgMC3x3TRDeffmap);
777 Bool_t AliAnalysisTaskJetsTriggerTRD::AcceptTrackMC(Int_t track) const
779 // only consider primaries
780 if (!MCEvent()->IsPhysicalPrimary(track))
783 const AliVParticle *part = MCEvent()->GetTrack(track);
785 // only consider charged particles
786 if (part->Charge() == 0)
789 // only look at particles in eta-acceptance of the central barrel
790 if (TMath::Abs(part->Eta()) >= 0.9)
797 // ----- histogram management -----
798 TH1* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
799 Int_t xbins, Float_t xmin, Float_t xmax,
803 hName.Form("%s_%s", fShortTaskId, hid);
807 h = new TH1I(hName.Data(), title,
810 h = new TH1F(hName.Data(), title,
812 GetHistogram(hist) = h;
817 TH2* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
818 Int_t xbins, Float_t xmin, Float_t xmax,
819 Int_t ybins, Float_t ymin, Float_t ymax,
823 hName.Form("%s_%s", fShortTaskId, hid);
827 h = GetHistogram(hist) = new TH2I(hName.Data(), title,
831 h = GetHistogram(hist) = new TH2F(hName.Data(), title,
838 TH3* AliAnalysisTaskJetsTriggerTRD::AddHistogram(Hist_t hist, const char *hid, TString title,
839 Int_t xbins, Float_t xmin, Float_t xmax,
840 Int_t ybins, Float_t ymin, Float_t ymax,
841 Int_t zbins, Float_t zmin, Float_t zmax,
845 hName.Form("%s_%s", fShortTaskId, hid);
849 h = GetHistogram(hist) = new TH3I(hName.Data(), title,
854 h = GetHistogram(hist) = new TH3F(hName.Data(), title,