]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/EMCAL/AliEmcalMCTrackSelector.cxx
change order of bookkeeping events
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalMCTrackSelector.cxx
CommitLineData
578adbef 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
5be3857d 11#include "AliNamedArrayI.h"
578adbef 12#include "AliAnalysisManager.h"
09230f47 13#include "AliVEventHandler.h"
578adbef 14#include "AliVEvent.h"
15#include "AliMCEvent.h"
16#include "AliVParticle.h"
09230f47 17#include "AliAODMCParticle.h"
18#include "AliMCParticle.h"
578adbef 19#include "AliLog.h"
20
21ClassImp(AliEmcalMCTrackSelector)
22
23//________________________________________________________________________
24AliEmcalMCTrackSelector::AliEmcalMCTrackSelector() :
25 AliAnalysisTaskSE("AliEmcalMCTrackSelector"),
26 fTracksOutName("PicoTracks"),
27 fRejectNK(kFALSE),
28 fChargedMC(kFALSE),
1f12855f 29 fTracksMapName(""),
df16061d 30 fEtaMax(1),
31 fInit(kFALSE),
09230f47 32 fEsdMode(kFALSE),
33 fTracksIn(0),
1f12855f 34 fTracksOut(0),
35 fTracksMap(0)
578adbef 36{
37 // Constructor.
38}
39
40//________________________________________________________________________
41AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) :
42 AliAnalysisTaskSE(name),
43 fTracksOutName("PicoTracks"),
44 fRejectNK(kFALSE),
45 fChargedMC(kFALSE),
1f12855f 46 fTracksMapName(""),
df16061d 47 fEtaMax(1),
48 fInit(kFALSE),
09230f47 49 fEsdMode(kFALSE),
50 fTracksIn(0),
1f12855f 51 fTracksOut(0),
52 fTracksMap(0)
578adbef 53{
54 // Constructor.
55}
56
57//________________________________________________________________________
58AliEmcalMCTrackSelector::~AliEmcalMCTrackSelector()
59{
60 // Destructor.
61}
62
63//________________________________________________________________________
64void AliEmcalMCTrackSelector::UserCreateOutputObjects()
65{
66 // Create my user objects.
67
09230f47 68 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
69 if (!mgr) {
70 AliFatal("No analysis manager!");
71 return;
72 }
73
74 AliVEventHandler *handler = mgr->GetInputEventHandler();
75 if (!handler) {
76 AliFatal("No input handler!");
77 return;
78 }
79
7ee645b2 80 if (handler->InheritsFrom("AliESDInputHandler") || handler->InheritsFrom("AliDummyHandler"))
09230f47 81 fEsdMode = kTRUE;
82 else
83 fEsdMode = kFALSE;
84
85 if (fEsdMode)
86 fTracksOut = new TClonesArray("AliMCParticle");
87 else
88 fTracksOut = new TClonesArray("AliAODMCParticle");
578adbef 89 fTracksOut->SetName(fTracksOutName);
1f12855f 90
91 fTracksMapName = fTracksOutName;
92 fTracksMapName += "_Map";
cac0e10b 93 fTracksMap = new AliNamedArrayI(fTracksMapName, 99999);
578adbef 94}
95
96//________________________________________________________________________
97void AliEmcalMCTrackSelector::UserExec(Option_t *)
98{
99 // Main loop, called for each event.
09230f47 100 if (!InputEvent()) {
578adbef 101 AliError("Could not retrieve event! Returning");
102 return;
103 }
104
09230f47 105 if (fEsdMode && !MCEvent()) {
578adbef 106 AliError("Could not retrieve MC event! Returning");
107 return;
108 }
109
1f12855f 110 if (!fInit) {
111 // add tracks to event if not yet there
09230f47 112 if (!(InputEvent()->FindListObject(fTracksOutName)))
113 InputEvent()->AddObject(fTracksOut);
114
115 if (!(InputEvent()->FindListObject(fTracksMapName)))
116 InputEvent()->AddObject(fTracksMap);
117
118 if (!fEsdMode) {
119 fTracksIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
120 if (!fTracksIn) {
121 AliError("Could not retrieve AOD MC particles! Returning");
122 return;
123 }
124 TClass *cl = fTracksIn->GetClass();
125 if (!cl->GetBaseClass("AliAODMCParticle")) {
126 AliError(Form("%s: Collection %s does not contain AliAODMCParticle!", GetName(), AliAODMCParticle::StdBranchName()));
127 fTracksIn = 0;
128 return;
129 }
130 }
1f12855f 131
132 fInit = kTRUE;
578adbef 133 }
134
135 // clear container (normally a null operation as the event should clean it already)
1f12855f 136 fTracksOut->Delete();
5be3857d 137 fTracksMap->Clear();
7f76e479 138
09230f47 139 const Int_t Ntracks = GetNumberOfTracks();
7f76e479 140
141 // loop over tracks
578adbef 142 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
143
cac0e10b 144 if (iTracks >= fTracksMap->GetSize())
145 fTracksMap->Set(iTracks*2);
146
5be3857d 147 fTracksMap->AddAt(-1, iTracks);
1f12855f 148
09230f47 149 AliVParticle* track = GetTrack(iTracks);
578adbef 150
151 if (!track)
152 continue;
153
df16061d 154 if (TMath::Abs(track->Eta()) > fEtaMax)
578adbef 155 continue;
156
157 Int_t pdgCode = track->PdgCode();
158 if (fRejectNK && (pdgCode == 130 || pdgCode == 2112)) continue;
159
160 if (fChargedMC && track->Charge() == 0) continue;
1f12855f 161
5be3857d 162 fTracksMap->AddAt(nacc, iTracks);
09230f47 163
164 AddTrack(track, nacc);
1f12855f 165
578adbef 166 ++nacc;
167 }
168}
09230f47 169
170//________________________________________________________________________
171Int_t AliEmcalMCTrackSelector::GetNumberOfTracks() const
172{
173 if (fEsdMode)
174 return MCEvent()->GetNumberOfTracks();
175 else
176 return fTracksIn->GetEntries();
177}
178
179//________________________________________________________________________
180AliVParticle* AliEmcalMCTrackSelector::GetTrack(Int_t i)
181{
182 if (fEsdMode) {
183 if (!MCEvent()->IsPhysicalPrimary(i))
184 return 0;
185
186 return MCEvent()->GetTrack(i);
187 }
188 else {
189 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fTracksIn->At(i));
190 if (!part->IsPhysicalPrimary())
191 return 0;
192
193 return part;
194 }
195}
196
197//________________________________________________________________________
198void AliEmcalMCTrackSelector::AddTrack(AliVParticle *track, Int_t nacc)
199{
200 if (fEsdMode) {
201 AliMCParticle *part = static_cast<AliMCParticle*>(track);
202 new ((*fTracksOut)[nacc]) AliMCParticle(part->Particle(), 0, part->Label());
203 }
204 else {
205 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(track);
206 new ((*fTracksOut)[nacc]) AliAODMCParticle(*part);
207 }
208}