7 #include "TStopwatch.h"
10 #include "AliAnalysisTask.h"
11 #include "AliAnalysisManager.h"
12 #include "AliTracker.h"
13 #include "AliESDEvent.h"
14 #include "AliESDInputHandler.h"
16 #include "AliMCEvent.h"
17 #include "AliMCEventHandler.h"
18 #include "AliESDtrackCuts.h"
19 #include "AliKineTrackCuts.h"
20 #include "AliMCParticle.h"
22 #include "AliAnalysisTasktrigger.h"
26 // Study trigger efficiencies for high-pt trigger
27 // Author: Jochen Thaeder <jochen@thaeder.de>
29 ClassImp(AliAnalysisTasktrigger)
32 * ---------------------------------------------------------------------------------
33 * Constructor / Destructor
34 * ---------------------------------------------------------------------------------
37 //________________________________________________________________________
38 AliAnalysisTasktrigger::AliAnalysisTasktrigger(const char *name) :
39 AliAnalysisTaskSE(name),
41 fMC(NULL), fESD(NULL), fESDHLT(NULL),
42 fESDTrackCuts(NULL), fESDHLTTrackCuts(NULL), fMCTrackCuts(NULL),
43 fIsSelected(kFALSE), fIsSelectedHLT(kFALSE), fIsSelectedMC(kFALSE),
44 fIsSelectedTask(kFALSE),
45 fOutputContainer(NULL),
46 fPtCount(NULL), fMultiplicity(NULL),
50 // Define input and output slots here
51 // Input slot #0 works with a TChain
52 // DefineInput(0, TChain::Class());
54 // Output slot #1 writes into a TObjArray container
55 DefineOutput(1, TObjArray::Class());
58 //________________________________________________________________________
59 const Int_t AliAnalysisTasktrigger::fgkNSettings = 7;
60 //________________________________________________________________________
61 const Double_t AliAnalysisTasktrigger::fgkTriggerPt[] = {1.0, 2.0, 2.5, 3.0, 5.0, 7.0, 10.0};
64 //________________________________________________________________________
65 const Int_t AliAnalysisTasktrigger::fgkNTrigger = 10;
67 //________________________________________________________________________
68 const Char_t *AliAnalysisTasktrigger::fgkTrigger[] = {
69 "p_{t}> 1.0", "p_{t}> 2.0", "p_{t}> 2.5",
70 "p_{t}> 3.0", "p_{t}> 5.0", "p_{t}> 7.0",
75 //________________________________________________________________________
76 const Int_t AliAnalysisTasktrigger::fgkNSelectionCuts = 5;
78 //________________________________________________________________________
79 const Char_t *AliAnalysisTasktrigger::fgkSelectionCuts[] = {
82 "AliPhysSel - PrimVertex",
83 "AliPhysSel - PrimVertex - Track (OFF)",
84 "AliPhysSel - PrimVertex - Track (HLT)",
87 //________________________________________________________________________
88 AliAnalysisTasktrigger::~AliAnalysisTasktrigger() {
100 delete fESDHLTTrackCuts;
101 fESDHLTTrackCuts = NULL;
112 delete[] fMultiplicity;
113 fMultiplicity = NULL;
121 * ---------------------------------------------------------------------------------
123 * ---------------------------------------------------------------------------------
126 //________________________________________________________________________
127 void AliAnalysisTasktrigger::UserCreateOutputObjects() {
131 fOutputContainer = new TObjArray(1);
132 fOutputContainer->SetName(GetName()) ;
133 fOutputContainer->SetOwner(kTRUE) ;
135 SetupTrigHistograms();
137 SetupMultHistograms();
141 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
143 fTrigger = new Bool_t[kNModes*fgkNTrigger];
144 fPtCount = new Int_t[kNModes*fgkNTrigger];
146 fMultiplicity = new Int_t[fgkNSelectionCuts];
148 fRandom = new TRandom3(0);
151 //________________________________________________________________________
152 void AliAnalysisTasktrigger::UserExec(Option_t *) {
154 // Called for each event
161 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
163 for (Int_t mode = 0; mode < kNModes; ++mode) {
165 if (mode == kMC && !fMC) continue;
167 // -- Fill Cut Studies
168 // ---------------------
169 FillCutStudies(mode);
171 // -- Fill Counter loop
172 // ----------------------
176 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
178 // -- Evaluate Trigger
179 // ---------------------
182 // -- Fill Trigger Histograms
183 // ----------------------------
184 FillTriggerHistograms();
186 // -- Fill Trigger Studies
187 // -------------------------
188 FillTriggerStudies();
189 FillTriggerStudiesMC();
191 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
193 // -- Post output data.
194 PostData(1, fOutputContainer);
199 * ---------------------------------------------------------------------------------
200 * Trigger Methods - private
201 * ---------------------------------------------------------------------------------
204 //________________________________________________________________________
205 void AliAnalysisTasktrigger::EvaluateTrigger() {
206 // Evaluate Counters and Trigger
208 for (Int_t mode = 0; mode < kNModes; ++mode) {
209 Int_t offset = mode*fgkNTrigger;
211 // -- Single Particle Triggers
212 for ( Int_t idx = 0; idx < fgkNSettings; ++idx ) {
214 if ( fPtCount[offset+idx] >= 1 )
215 fTrigger[offset+idx] = kTRUE;
219 // ------------------
225 printf(" ERROR NO RANDOM !!!! \n");
227 // S1 : Reduce to 300 Hz -- [ 150 Hz min bias ]
228 // ---------------------------------------------
230 // > 1 GeV | 800 Hz * 0.1 ~ 80 Hz
231 if ( fPtCount[offset+0] >= 1 )
232 if ( fRandom->Rndm() < 0.1 )
234 // > 2 GeV | 230 Hz * 0.22 ~ 50 Hz
235 if ( fPtCount[offset+1] >= 1 )
236 if ( fRandom->Rndm() < 0.22 )
238 // > 3 GeV | 60 Hz * 0.5 ~ 30 Hz
239 if ( fPtCount[offset+3] >= 1 )
240 if ( fRandom->Rndm() < 0.5 )
243 if ( fPtCount[offset+4] >= 1 )
247 // S2 : Reduce to 400 Hz -- [ 200 Hz min bias ]
248 // ---------------------------------------------
250 // > 1 GeV | 800 Hz * 0.14 ~110 Hz
251 if ( fPtCount[offset+0] >= 1 )
252 if ( fRandom->Rndm() < 0.14 )
254 // > 2 GeV | 230 Hz * 0.39 ~ 90 Hz
255 if ( fPtCount[offset+1] >= 1 )
256 if ( fRandom->Rndm() < 0.39 )
258 // > 3 GeV | 60 Hz * 0.5 ~ 30 Hz
259 if ( fPtCount[offset+3] >= 1 )
260 if ( fRandom->Rndm() < 0.5 )
263 if ( fPtCount[offset+4] >= 1 )
267 // S3 : Reduce to 500 Hz -- [ 200 Hz min bias ]
268 // ---------------------------------------------
270 // > 1 GeV | 800 Hz * 0.2 ~160 Hz
271 if ( fPtCount[offset+0] >= 1 )
272 if ( fRandom->Rndm() < 0.2 )
274 // > 2 GeV | 230 Hz * 0.61 ~140 Hz
275 if ( fPtCount[offset+1] >= 1 )
276 if ( fRandom->Rndm() < 0.61 )
279 if ( fPtCount[offset+3] >= 1 )
282 fTrigger[offset+fgkNSettings] = s1;
283 fTrigger[offset+fgkNSettings+1] = s2;
284 fTrigger[offset+fgkNSettings+2] = s3;
291 * ---------------------------------------------------------------------------------
292 * Setup Cuts Methods - private
293 * ---------------------------------------------------------------------------------
296 //________________________________________________________________________
297 void AliAnalysisTasktrigger::SetupESDTrackCuts() {
300 // -- Pure Off-line track cuts
301 // fESDTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(kTRUE);
303 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
305 // -- HLT adopted track cuts
306 fESDHLTTrackCuts = new AliESDtrackCuts;
308 // -- turn off criteria
309 fESDHLTTrackCuts->SetDCAToVertex2D(kFALSE);
310 fESDHLTTrackCuts->SetRequireSigmaToVertex(kFALSE);
311 fESDHLTTrackCuts->SetRequireTPCRefit(kFALSE);
312 fESDHLTTrackCuts->SetRequireITSRefit(kFALSE);
315 fESDHLTTrackCuts->SetMaxDCAToVertexXY(3.0);
316 fESDHLTTrackCuts->SetMaxDCAToVertexZ(10.0);
317 fESDHLTTrackCuts->SetEtaRange(-1.0,1.0);
318 fESDHLTTrackCuts->SetMinNClustersTPC(60);
320 // -- Pre Trigger Bias
321 fESDHLTTrackCuts->SetPtRange(0.3);
323 fESDTrackCuts = fESDHLTTrackCuts;
325 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
327 fMCTrackCuts = new AliKineTrackCuts;
328 fMCTrackCuts->SetEtaRange(-1.0,1.0);
329 fMCTrackCuts->SetPtRange(0.3);
335 * ---------------------------------------------------------------------------------
336 * Fill Methods - private
337 * ---------------------------------------------------------------------------------
340 //________________________________________________________________________
341 void AliAnalysisTasktrigger::FillCutStudies( Int_t mode ) {
342 // Fill histograms for cut studies
344 for ( Int_t idx = 0; idx < fgkNSelectionCuts; idx++ )
345 fMultiplicity[idx] = 0;
348 Bool_t hasVertex = kFALSE;
349 AliESDEvent *esd = NULL;
353 hasVertex = fIsSelected;
356 else if (mode == kHLT) {
358 hasVertex = fIsSelectedHLT;
361 else if (mode == kMC) {
363 hasVertex = fIsSelectedMC;
366 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
367 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
369 if (mode == kOFF || mode == kHLT) {
371 for (Int_t idx = 0; idx < esd->GetNumberOfTracks(); idx++) {
373 AliESDtrack* track = esd->GetTrack(idx);
374 if (!track) continue;
377 // --------------------------------------------
379 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(track->Pt());
380 ++(fMultiplicity[cut]);
383 // --------------------------------------------
384 if (!fIsSelectedTask)
388 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(track->Pt());
389 ++(fMultiplicity[cut]);
391 // -- "AliPhysSel - PrimVertex"
392 // --------------------------------------------
397 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(track->Pt());
398 ++(fMultiplicity[cut]);
400 // -- "AliPhysSel - PrimVertex - Track (OFF)"
401 // --------------------------------------------
402 if (fESDTrackCuts->AcceptTrack(track)) {
404 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(track->Pt());
405 ++(fMultiplicity[cut]);
408 // -- "AliPhysSel - PrimVertex - Track (HLT)"
409 // --------------------------------------------
410 if (fESDHLTTrackCuts->AcceptTrack(track)) {
412 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(track->Pt());
413 ++(fMultiplicity[cut]);
416 } // for (Int_t idx = 0; idx < esd->GetNumberOfTracks(); idx++) {
419 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
420 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
424 AliStack* stack = fMC->Stack();
426 printf("Error : No Stack. \n");
430 for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
432 TParticle *particle = GetChargedPhysicalPrimary(stack, iterStack);
438 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(particle->Pt());
439 ++(fMultiplicity[cut]);
443 if (!fIsSelectedTask)
447 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(particle->Pt());
448 ++(fMultiplicity[cut]);
450 // -- "AliPhysSel - PrimVertex"
451 // --------------------------------------------
456 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(particle->Pt());
457 ++(fMultiplicity[cut]);
459 // -- "AliPhysSel - PrimVertex - Track (MC)"
460 // --------------------------------------------
461 if (!fMCTrackCuts->IsSelected(particle))
465 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(particle->Pt());
466 ++(fMultiplicity[cut]);
468 // -- "AliPhysSel - PrimVertex - Track (MC) - Findable"
469 // ------------------------------------------------------
470 if (!IsFindableMC(iterStack, 60.))
474 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sPt_%d", title, cut))))->Fill(particle->Pt());
475 ++(fMultiplicity[cut]);
477 } // for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
480 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
481 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
483 // -- Fill Multiplicity
484 for ( Int_t idx = 0; idx < fgkNSelectionCuts; idx++ )
485 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHist%sMult_%d", title, idx))))->Fill(fMultiplicity[idx]);
490 //________________________________________________________________________
491 void AliAnalysisTasktrigger::FillCounters( Int_t mode ) {
492 // Fill counters for trigger
494 Int_t offset = mode*fgkNTrigger ;
496 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
497 if (mode == kOFF || mode == kHLT) {
499 AliESDtrackCuts *cuts = fESDTrackCuts;
500 AliESDEvent *esd = fESD;
504 cuts = fESDHLTTrackCuts;
507 for (Int_t idx = 0; idx < esd->GetNumberOfTracks(); idx++) {
508 AliESDtrack* track = esd->GetTrack(idx);
509 if (!track) continue;
512 if ( !cuts->AcceptTrack(track) ) continue;
514 Int_t nClustersTPC = track->GetTPCclusters(0);
516 // Float_t ptTr = TMath::Abs(track->GetSigned1Pt()) - 3.5 * TMath::Sqrt( track->GetSigma1Pt2());
518 // -- Different Pt settings
519 for ( Int_t set=0; set < fgkNSettings ; set++ ) {
521 if ( fgkTriggerPt[set] == 3. ) { if ( nClustersTPC < 100 ) continue; }
522 else if ( fgkTriggerPt[set] == 5. ) { if ( nClustersTPC < 110 ) continue; }
523 else if ( fgkTriggerPt[set] == 7. ) { if ( nClustersTPC < 120 ) continue; }
524 else if ( fgkTriggerPt[set] == 10. ) { if ( nClustersTPC < 140 ) continue; }
525 else { if ( nClustersTPC < 80 ) continue; }
527 // if ( ptTr < 1/fgkTriggerPt[set] )
528 // ++(fPtCount[offset+set]);
530 if ( track->Pt() > fgkTriggerPt[set] )
531 ++(fPtCount[offset+set]);
534 } // for (Int_t idx = 0; idx < esd->GetNumberOfTracks(); idx++) {
535 } // if (mode == kOFF || mode == kHLT) {
538 AliStack* stack = fMC->Stack();
540 printf("Error : No Stack. \n");
544 for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
546 TParticle *particle = GetChargedPhysicalPrimary(stack, iterStack);
551 if ( !fMCTrackCuts->IsSelected(particle) ) continue;
553 // -- Different Pt settings
554 for ( Int_t set=0; set < fgkNSettings ; set++ ) {
556 if ( fgkTriggerPt[set] == 3. ) { if ( !IsFindableMC(iterStack, 100.) ) continue; }
557 else if ( fgkTriggerPt[set] == 5. ) { if ( !IsFindableMC(iterStack, 110.) ) continue; }
558 else if ( fgkTriggerPt[set] == 7. ) { if ( !IsFindableMC(iterStack, 120.) ) continue; }
559 else if ( fgkTriggerPt[set] == 10. ) { if ( !IsFindableMC(iterStack, 140.) ) continue; }
560 else { if ( !IsFindableMC(iterStack, 80.) ) continue; }
562 if ( particle->Pt() > fgkTriggerPt[set] )
563 ++(fPtCount[offset+set]);
565 } // for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
571 //________________________________________________________________________
572 void AliAnalysisTasktrigger::FillTriggerHistograms() {
573 // Fill histograms for trigger
575 Int_t nTracks = fESD->GetNumberOfTracks();
576 Int_t nTracksH = fESDHLT->GetNumberOfTracks();
581 nTracksM = fMC->Stack()->GetNtrack();
583 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggered"))->Fill(0);
584 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggered"))->Fill(fgkNTrigger+1, nTracks);
585 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggered"))->Fill(0);
586 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggered"))->Fill(fgkNTrigger+1, nTracksH);
587 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggered"))->Fill(0);
588 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggered"))->Fill(fgkNTrigger+1, nTracksM);
590 for ( Int_t idx = 0; idx < fgkNTrigger; idx++ ) {
591 if (fTrigger[(kOFF*fgkNTrigger)+idx]) {
592 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggered"))->Fill(idx+1);
593 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggered"))->Fill(fgkNTrigger+idx+2,nTracks);
595 if (fTrigger[(kHLT*fgkNTrigger)+idx]) {
596 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggered"))->Fill(idx+1);
597 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggered"))->Fill(fgkNTrigger+idx+2,nTracksH);
599 if (fTrigger[(kMC*fgkNTrigger)+idx]) {
600 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggered"))->Fill(idx+1);
601 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggered"))->Fill(fgkNTrigger+idx+2,nTracksM);
604 if (fTrigger[(kHLT*fgkNTrigger)+idx] && !fTrigger[(kOFF*fgkNTrigger)+idx]) {
605 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToOFF"))->Fill(idx+1);
606 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToOFF"))->Fill(fgkNTrigger+idx+2,nTracks);
608 if (fTrigger[(kHLT*fgkNTrigger)+idx] && !fTrigger[(kMC*fgkNTrigger)+idx]) {
609 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToMC"))->Fill(idx+1);
610 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToMC"))->Fill(fgkNTrigger+idx+2,nTracks);
612 if (fTrigger[(kOFF*fgkNTrigger)+idx] && !fTrigger[(kMC*fgkNTrigger)+idx]) {
613 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFFakeToMC"))->Fill(idx+1);
614 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFFakeToMC"))->Fill(fgkNTrigger+idx+2,nTracks);
618 if (!fTrigger[(kHLT*fgkNTrigger)+idx] && fTrigger[(kOFF*fgkNTrigger)+idx]) {
619 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToOFF"))->Fill(idx+1);
620 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToOFF"))->Fill(fgkNTrigger+idx+2,nTracks);
622 if (!fTrigger[(kHLT*fgkNTrigger)+idx] && fTrigger[(kMC*fgkNTrigger)+idx]) {
623 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToMC"))->Fill(idx+1);
624 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToMC"))->Fill(fgkNTrigger+idx+2,nTracks);
626 if (!fTrigger[(kOFF*fgkNTrigger)+idx] && fTrigger[(kMC*fgkNTrigger)+idx]) {
627 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFMissToMC"))->Fill(idx+1);
628 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFMissToMC"))->Fill(fgkNTrigger+idx+2,nTracks);
634 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggeredSel"))->Fill(0);
635 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggeredSel"))->Fill(fgkNTrigger+1, nTracks);
636 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggeredSel"))->Fill(0);
637 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggeredSel"))->Fill(fgkNTrigger+1, nTracksH);
638 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggeredSel"))->Fill(0);
639 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggeredSel"))->Fill(fgkNTrigger+1, nTracksM);
641 for ( Int_t idx = 0; idx < fgkNTrigger; idx++ ) {
642 if (fTrigger[(kOFF*fgkNTrigger)+idx]) {
643 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggeredSel"))->Fill(idx+1);
644 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFTriggeredSel"))->Fill(fgkNTrigger+idx+2,nTracks);
646 if (fTrigger[(kHLT*fgkNTrigger)+idx]) {
647 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggeredSel"))->Fill(idx+1);
648 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTTriggeredSel"))->Fill(fgkNTrigger+idx+2,nTracksH);
650 if (fTrigger[(kMC*fgkNTrigger)+idx]) {
651 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggeredSel"))->Fill(idx+1);
652 static_cast<TH1F*>(fOutputContainer->FindObject("fNMCTriggeredSel"))->Fill(fgkNTrigger+idx+2,nTracksM);
655 if (fTrigger[(kHLT*fgkNTrigger)+idx] && !fTrigger[(kOFF*fgkNTrigger)+idx]) {
656 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToOFFSel"))->Fill(idx+1);
657 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToOFFSel"))->Fill(fgkNTrigger+idx+2,nTracks);
659 if (fTrigger[(kHLT*fgkNTrigger)+idx] && !fTrigger[(kMC*fgkNTrigger)+idx]) {
660 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToMCSel"))->Fill(idx+1);
661 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTFakeToMCSel"))->Fill(fgkNTrigger+idx+2,nTracks);
663 if (fTrigger[(kOFF*fgkNTrigger)+idx] && !fTrigger[(kMC*fgkNTrigger)+idx]) {
664 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFFakeToMCSel"))->Fill(idx+1);
665 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFFakeToMCSel"))->Fill(fgkNTrigger+idx+2,nTracks);
668 if (!fTrigger[(kHLT*fgkNTrigger)+idx] && fTrigger[(kOFF*fgkNTrigger)+idx]) {
669 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToOFFSel"))->Fill(idx+1);
670 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToOFFSel"))->Fill(fgkNTrigger+idx+2,nTracks);
672 if (!fTrigger[(kHLT*fgkNTrigger)+idx] && fTrigger[(kMC*fgkNTrigger)+idx]) {
673 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToMCSel"))->Fill(idx+1);
674 static_cast<TH1F*>(fOutputContainer->FindObject("fNHLTMissToMCSel"))->Fill(fgkNTrigger+idx+2,nTracks);
676 if (!fTrigger[(kOFF*fgkNTrigger)+idx] && fTrigger[(kMC*fgkNTrigger)+idx]) {
677 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFMissToMCSel"))->Fill(idx+1);
678 static_cast<TH1F*>(fOutputContainer->FindObject("fNOFFMissToMCSel"))->Fill(fgkNTrigger+idx+2,nTracks);
686 //________________________________________________________________________
687 void AliAnalysisTasktrigger::FillTriggerStudies() {
688 // Fill histograms for trigger studies
690 // -- "AliPhysSel - PrimVertex"
691 // --------------------------------------------
695 Int_t multiplicity = 0;
697 for (Int_t idx = 0; idx < fESD->GetNumberOfTracks(); idx++) {
698 AliESDtrack* track = fESD->GetTrack(idx);
699 if (!track) continue;
701 // -- "AliPhysSel - PrimVertex - Track (OFF)"
702 // --------------------------------------------
703 if (!fESDTrackCuts->AcceptTrack(track))
706 // -- Fill Triggered Pt Spectra
707 for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
710 if ( fTrigger[(kOFF*fgkNTrigger)+trg] )
711 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_PtTriggered_OFF_%d",trg))))->Fill(track->Pt());
714 if ( fTrigger[(kHLT*fgkNTrigger)+trg] )
715 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_PtTriggered_HLT_%d",trg))))->Fill(track->Pt());
718 if ( fTrigger[(kMC*fgkNTrigger)+trg] )
719 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_PtTriggered_MC_%d",trg))))->Fill(track->Pt());
721 } // for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
725 } // for (Int_t idx = 0; idx < esd->GetNumberOfTracks(); idx++) {
727 // -- Fill Triggered Mult Spectra
728 for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
731 if ( fTrigger[(kOFF*fgkNTrigger)+trg] )
732 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_MultTriggered_OFF_%d",trg))))->Fill(multiplicity);
735 if ( fTrigger[(kHLT*fgkNTrigger)+trg] )
736 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_MultTriggered_HLT_%d",trg))))->Fill(multiplicity);
739 if ( fTrigger[(kMC*fgkNTrigger)+trg] )
740 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistOFF_MultTriggered_MC_%d",trg))))->Fill(multiplicity);
742 } // for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
748 //________________________________________________________________________
749 void AliAnalysisTasktrigger::FillTriggerStudiesMC() {
750 // Fill histograms for trigger studies
755 // -- "AliPhysSel - PrimVertex"
756 // --------------------------------------------
760 Int_t multiplicity = 0;
762 AliStack* stack = fMC->Stack();
764 printf("Error : No Stack. \n");
768 for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
770 TParticle *particle = GetChargedPhysicalPrimary(stack, iterStack);
774 if ( ! fMCTrackCuts->IsSelected(particle) )
777 if ( ! IsFindableMC(iterStack, 60.) )
780 for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
783 if ( fTrigger[(kOFF*fgkNTrigger)+trg] )
784 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_PtTriggered_OFF_%d",trg))))->Fill(particle->Pt());
787 if ( fTrigger[(kHLT*fgkNTrigger)+trg] )
788 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_PtTriggered_HLT_%d",trg))))->Fill(particle->Pt());
791 if ( fTrigger[(kMC*fgkNTrigger)+trg] )
792 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_PtTriggered_MC_%d",trg))))->Fill(particle->Pt());
794 } // for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
798 } // for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
800 // -- Fill Triggered Mult Spectra
801 for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
804 if ( fTrigger[(kOFF*fgkNTrigger)+trg] )
805 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_MultTriggered_OFF_%d",trg))))->Fill(multiplicity);
808 if ( fTrigger[(kHLT*fgkNTrigger)+trg] )
809 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_MultTriggered_HLT_%d",trg))))->Fill(multiplicity);
812 if ( fTrigger[(kMC*fgkNTrigger)+trg] )
813 (static_cast<TH1F*>(fOutputContainer->FindObject(Form("fHistMC_MultTriggered_MC_%d",trg))))->Fill(multiplicity);
815 } // for ( Int_t trg= 0; trg < fgkNTrigger; trg++ ) {
822 * ---------------------------------------------------------------------------------
823 * Setup Methods - private
824 * ---------------------------------------------------------------------------------
827 //________________________________________________________________________
828 Bool_t AliAnalysisTasktrigger::SetupEvent() {
829 // Setup Reading of event
831 // -- Clear Counters and Triggers
832 // --------------------------------
833 for ( Int_t idx = 0; idx < kNModes*fgkNTrigger; idx++ ) {
834 fTrigger[idx] = kFALSE;
838 fIsSelected = fIsSelectedHLT = fIsSelectedMC = fIsSelectedTask = kFALSE;
840 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
842 // -- ESD Event Handler
843 // ----------------------
845 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*>
846 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
849 printf("ERROR: Could not get ESDInputHandler");
853 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
855 // -- MC Event Handler - MC Event
856 // ---------------------------------
858 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*>
859 (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
861 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
865 fESD = esdH->GetEvent();
867 printf("ERROR: fESD not available \n");
871 fESDHLT = esdH->GetHLTEvent();
873 printf("ERROR: fESDHLT not available \n");
879 printf("ERROR: fMC not available \n");
883 if ( !fESD->GetPrimaryVertexTracks() ){
884 printf("ERROR: No Vertex \n");
888 if ( !fESDHLT->GetPrimaryVertexTracks() ){
889 printf("ERROR: No HLT Vertex \n");
893 if ( fMC && !fMC->GetPrimaryVertex() ){
894 printf("ERROR: No MC Vertex \n");
898 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
900 // -- Physics Selection
901 // ----------------------
903 fIsSelectedTask = esdH->IsEventSelected() & AliVEvent::kMB;
904 fIsSelected = fIsSelectedTask && (fESD->GetPrimaryVertexTracks())->GetStatus();
905 fIsSelectedHLT = fIsSelectedTask && (fESDHLT->GetPrimaryVertexTracks())->GetStatus();
907 fIsSelectedMC = fIsSelectedTask && (fMC->GetPrimaryVertex()); //->GetStatus();
912 //________________________________________________________________________
913 void AliAnalysisTasktrigger::SetupTrigHistograms() {
915 Int_t n = 2*(fgkNTrigger+1);
917 Double_t e = static_cast<Double_t>(2*(fgkNTrigger+1));
919 AddTriggerHist(new TH1F("fNOFFTriggered", "N events OFF triggered;;N Events", n, s, e));
920 AddTriggerHist(new TH1F("fNOFFTriggeredSel", "N events OFF triggered - OFF selected;;N Events", n, s, e));
922 AddTriggerHist(new TH1F("fNHLTTriggered", "N events HLT triggered;;N Events", n, s, e));
923 AddTriggerHist(new TH1F("fNHLTTriggeredSel", "N events HLT triggered - OFF selected;;N Events", n, s, e));
925 AddTriggerHist(new TH1F("fNMCTriggered", "N events MC triggered;;N Events", n, s, e));
926 AddTriggerHist(new TH1F("fNMCTriggeredSel", "N events MC triggered - OFF selected;;N Events", n, s, e));
930 AddTriggerHist(new TH1F("fNHLTFakeToOFF", "N events HLT fake (to OFF) triggered;;N Events", n, s, e));
931 AddTriggerHist(new TH1F("fNHLTFakeToOFFSel", "N events HLT fake (to OFF) triggered - OFF selected;;N Events", n, s, e));
933 AddTriggerHist(new TH1F("fNHLTFakeToMC", "N events HLT fake (to MC) triggered;;N Events", n, s, e));
934 AddTriggerHist(new TH1F("fNHLTFakeToMCSel", "N events HLT fake (to MC) triggered - OFF selected;;N Events", n, s, e));
936 AddTriggerHist(new TH1F("fNOFFFakeToMC", "N events OFF fake (to MC) triggered;;N Events", n, s, e));
937 AddTriggerHist(new TH1F("fNOFFFakeToMCSel", "N events OFF fake (to MC) triggered - OFF selected;;N Events", n, s, e));
941 AddTriggerHist(new TH1F("fNHLTMissToOFF", "N events HLT miss (to OFF) triggered;;N Events", n, s, e));
942 AddTriggerHist(new TH1F("fNHLTMissToOFFSel", "N events HLT miss (to OFF) triggered - MC selected;;N Events", n, s, e));
944 AddTriggerHist(new TH1F("fNHLTMissToMC", "N events HLT miss (to MC) triggered;;N Events", n, s, e));
945 AddTriggerHist(new TH1F("fNHLTMissToMCSel", "N events HLT miss (to MC) triggered - MC selected;;N Events", n, s, e));
947 AddTriggerHist(new TH1F("fNOFFMissToMC", "N events OFF miss (to MC) triggered;;N Events", n, s, e));
948 AddTriggerHist(new TH1F("fNOFFMissToMCSel", "N events OFF miss (to MC) triggered - MC selected;;N Events", n, s, e));
953 //________________________________________________________________________
954 void AliAnalysisTasktrigger::SetupPtHistograms() {
960 // -- Create LogPtBinning
961 // ------------------------
962 Double_t logMin = TMath::Log10(s);
963 Double_t logMax = TMath::Log10(e);
964 Double_t binwidth = (logMax-logMin)/n;
966 Double_t *logBinning = new Double_t[n+1];
969 for (Int_t ii = 1; ii <= n; ii++)
970 logBinning[ii] = s + TMath::Power(10, logMin + ii*binwidth);
972 // -- Create Histograms
973 // ----------------------
974 for ( Int_t idx = 0; idx < fgkNSelectionCuts; idx++ ) {
975 AddPtHist(new TH1F(Form("fHistOFFPt_%d",idx),
976 Form("OFF P_{T} distribution - %s", fgkSelectionCuts[idx]), n, logBinning));
977 AddPtHist(new TH1F(Form("fHistHLTPt_%d",idx),
978 Form("HLT P_{T} distribution - %s", fgkSelectionCuts[idx]), n, logBinning));
979 AddPtHist(new TH1F(Form("fHistMCPt_%d",idx),
980 Form("MC P_{T} distribution - %s", fgkSelectionCuts[idx]), n, logBinning));
983 for ( Int_t idx = 0; idx < fgkNTrigger; idx++ ) {
984 AddPtHist(new TH1F(Form("fHistOFF_PtTriggered_OFF_%d",idx),
985 Form("OFF Triggered - OFF P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
986 AddPtHist(new TH1F(Form("fHistOFF_PtTriggered_HLT_%d",idx),
987 Form("HLT Triggered - OFF P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
988 AddPtHist(new TH1F(Form("fHistOFF_PtTriggered_MC_%d",idx),
989 Form("MC Triggered - OFF P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
990 AddPtHist(new TH1F(Form("fHistMC_PtTriggered_OFF_%d",idx),
991 Form("OFF Triggered - MC P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
992 AddPtHist(new TH1F(Form("fHistMC_PtTriggered_HLT_%d",idx),
993 Form("HLT Triggered - MC P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
994 AddPtHist(new TH1F(Form("fHistMC_PtTriggered_MC_%d",idx),
995 Form("MC Triggered - MC P_{T} distribution - %s", fgkTrigger[idx]), n, logBinning));
1004 //________________________________________________________________________
1005 void AliAnalysisTasktrigger::SetupMultHistograms() {
1011 for ( Int_t idx = 0; idx < fgkNSelectionCuts; idx++ ) {
1012 AddMultHist(new TH1F(Form("fHistOFFMult_%d",idx),
1013 Form("Multiplicity distribution - %s", fgkSelectionCuts[idx]), n, s ,e));
1014 AddMultHist(new TH1F(Form("fHistHLTMult_%d",idx),
1015 Form("HLT Multiplicity distribution - %s", fgkSelectionCuts[idx]), n, s ,e));
1016 AddMultHist(new TH1F(Form("fHistMCMult_%d",idx),
1017 Form("MC Multiplicity distribution - %s", fgkSelectionCuts[idx]), n, s ,e));
1020 for ( Int_t idx = 0; idx < fgkNTrigger; idx++ ) {
1021 AddMultHist(new TH1F(Form("fHistOFF_MultTriggered_OFF_%d",idx),
1022 Form("OFF Triggered - OFF Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1023 AddMultHist(new TH1F(Form("fHistOFF_MultTriggered_HLT_%d",idx),
1024 Form("HLT Triggered - OFF Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1025 AddMultHist(new TH1F(Form("fHistOFF_MultTriggered_MC_%d",idx),
1026 Form("MC Triggered - OFF Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1027 AddMultHist(new TH1F(Form("fHistMC_MultTriggered_OFF_%d",idx),
1028 Form("OFF Triggered - MC Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1029 AddMultHist(new TH1F(Form("fHistMC_MultTriggered_HLT_%d",idx),
1030 Form("HLT Triggered - MC Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1031 AddMultHist(new TH1F(Form("fHistMC_MultTriggered_MC_%d",idx),
1032 Form("MC Triggered - MC Multiplicty distribution - %s", fgkTrigger[idx]), n, s ,e));
1039 * ---------------------------------------------------------------------------------
1040 * Helper Methods - private
1041 * ---------------------------------------------------------------------------------
1044 //________________________________________________________________________
1045 TParticle* AliAnalysisTasktrigger::GetChargedPhysicalPrimary( AliStack* stack, Int_t idx ) {
1046 // return charged physical primary particle
1048 TParticle *particle = stack->Particle(idx);
1053 if ( !(stack->IsPhysicalPrimary(idx)) )
1057 if (!particle->GetPDG())
1060 if (particle->GetPDG()->Charge() == 0.0)
1066 //________________________________________________________________________
1067 Bool_t AliAnalysisTasktrigger::IsFindableMC(Int_t idx, Float_t length) {
1071 // Ok, if track longer 60cm
1072 AliMCParticle *mcParticle = dynamic_cast<AliMCParticle*> (fMC->GetTrack(idx));
1077 Float_t tpcTrackLength = mcParticle->GetTPCTrackLength(AliTracker::GetBz(),0.05,counter,3.0);
1079 if ( tpcTrackLength > length )
1085 //________________________________________________________________________
1086 void AliAnalysisTasktrigger::AddTriggerHist(TH1F* hist) {
1087 // add histogram to output
1088 fOutputContainer->Add(hist);
1092 //________________________________________________________________________
1093 void AliAnalysisTasktrigger::AddPtHist(TH1F* hist) {
1094 // add histogram to output
1095 hist->GetXaxis()->SetTitle("P_{T} (GeV/c)");
1096 hist->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
1097 fOutputContainer->Add(hist);
1101 //________________________________________________________________________
1102 void AliAnalysisTasktrigger::AddMultHist(TH1F* hist) {
1103 // add histogram to output
1104 hist->GetXaxis()->SetTitle("#ESD tracks");
1105 fOutputContainer->Add(hist);