]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalMCTrackSelector.cxx
d6e15f68b76be21a1487078464fd035c98d2bd04
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalMCTrackSelector.cxx
1 // $Id$
2 //
3 // Class to select tracks in MC events.
4 //
5 // Author: S. Aiola
6
7 #include "AliEmcalMCTrackSelector.h"
8
9 #include <TClonesArray.h>
10 #include <TH1I.h>
11
12 #include "AliAnalysisManager.h"
13 #include "AliVEvent.h"
14 #include "AliMCEvent.h"
15 #include "AliVParticle.h"
16 #include "AliLog.h"
17
18 ClassImp(AliEmcalMCTrackSelector)
19
20 //________________________________________________________________________
21 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector() : 
22   AliAnalysisTaskSE("AliEmcalMCTrackSelector"),
23   fTracksOutName("PicoTracks"),
24   fRejectNK(kFALSE),
25   fChargedMC(kFALSE),
26   fInit(kFALSE),
27   fTracksMapName(""),
28   fTracksOut(0),
29   fTracksMap(0)
30 {
31   // Constructor.
32 }
33
34 //________________________________________________________________________
35 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) : 
36   AliAnalysisTaskSE(name),
37   fTracksOutName("PicoTracks"),
38   fRejectNK(kFALSE),
39   fChargedMC(kFALSE),
40   fInit(kFALSE),
41   fTracksMapName(""),
42   fTracksOut(0),
43   fTracksMap(0)
44 {
45   // Constructor.
46 }
47
48 //________________________________________________________________________
49 AliEmcalMCTrackSelector::~AliEmcalMCTrackSelector()
50 {
51   // Destructor.
52 }
53
54 //________________________________________________________________________
55 void AliEmcalMCTrackSelector::UserCreateOutputObjects()
56 {
57   // Create my user objects.
58
59   fTracksOut = new TClonesArray("AliMCParticle");
60   fTracksOut->SetName(fTracksOutName);
61
62   fTracksMapName = fTracksOutName;
63   fTracksMapName += "_Map";
64   fTracksMap = new TH1I(fTracksMapName, fTracksMapName, 1000, 0, 1);
65 }
66
67 //________________________________________________________________________
68 void AliEmcalMCTrackSelector::UserExec(Option_t *) 
69 {
70   // Main loop, called for each event.
71
72   AliMCEvent *mcevent = MCEvent();
73   AliVEvent *event = InputEvent();
74
75   if (!event) {
76     AliError("Could not retrieve event! Returning");
77     return;
78   }
79
80   if (!mcevent) {
81     AliError("Could not retrieve MC event! Returning");
82     return;
83   }
84
85   if (!fInit) {
86     // add tracks to event if not yet there
87     if (!(event->FindListObject(fTracksOutName))) 
88       event->AddObject(fTracksOut);
89
90     if (!(event->FindListObject(fTracksMapName)))
91       event->AddObject(fTracksMap);
92
93     fInit = kTRUE;
94   }
95
96   // clear container (normally a null operation as the event should clean it already)
97   fTracksOut->Delete();
98
99   const Int_t Ntracks = mcevent->GetNumberOfTracks();
100   new (fTracksMap) TH1I(fTracksMapName, fTracksMapName, Ntracks-2, 0, 1);  // Ntracks - 2, we use also over- and uner-flow bins
101
102   // loop over tracks
103   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
104
105     fTracksMap->SetBinContent(iTracks, -1);
106
107     if (!mcevent->IsPhysicalPrimary(iTracks))
108       continue;
109
110     AliMCParticle* track = dynamic_cast<AliMCParticle*>(mcevent->GetTrack(iTracks));
111
112     if (!track)
113       continue;
114
115     if (TMath::Abs(track->Eta()) > 1) 
116       continue;
117     
118     Int_t pdgCode = track->PdgCode();
119     if (fRejectNK && (pdgCode == 130 || pdgCode == 2112)) continue;
120     
121     if (fChargedMC && track->Charge() == 0) continue;
122
123     fTracksMap->SetBinContent(iTracks, nacc);
124     new ((*fTracksOut)[nacc]) AliMCParticle(track->Particle(), 0, track->Label());
125
126     ++nacc;
127   }
128 }