3 // Class to select tracks in MC events.
7 #include "AliEmcalMCTrackSelector.h"
9 #include <TClonesArray.h>
11 #include "AliNamedArrayI.h"
12 #include "AliAnalysisManager.h"
13 #include "AliVEventHandler.h"
14 #include "AliVEvent.h"
15 #include "AliMCEvent.h"
16 #include "AliVParticle.h"
17 #include "AliAODMCParticle.h"
18 #include "AliMCParticle.h"
21 ClassImp(AliEmcalMCTrackSelector)
23 //________________________________________________________________________
24 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector() :
25 AliAnalysisTaskSE("AliEmcalMCTrackSelector"),
26 fTracksOutName("PicoTracks"),
40 //________________________________________________________________________
41 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) :
42 AliAnalysisTaskSE(name),
43 fTracksOutName("PicoTracks"),
57 //________________________________________________________________________
58 AliEmcalMCTrackSelector::~AliEmcalMCTrackSelector()
63 //________________________________________________________________________
64 void AliEmcalMCTrackSelector::UserCreateOutputObjects()
66 // Create my user objects.
68 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
70 AliFatal("No analysis manager!");
74 AliVEventHandler *handler = mgr->GetInputEventHandler();
76 AliFatal("No input handler!");
80 if (handler->InheritsFrom("AliESDInputHandler"))
86 fTracksOut = new TClonesArray("AliMCParticle");
88 fTracksOut = new TClonesArray("AliAODMCParticle");
89 fTracksOut->SetName(fTracksOutName);
91 fTracksMapName = fTracksOutName;
92 fTracksMapName += "_Map";
93 fTracksMap = new AliNamedArrayI(fTracksMapName, 99999);
96 //________________________________________________________________________
97 void AliEmcalMCTrackSelector::UserExec(Option_t *)
99 // Main loop, called for each event.
101 AliError("Could not retrieve event! Returning");
105 if (fEsdMode && !MCEvent()) {
106 AliError("Could not retrieve MC event! Returning");
111 // add tracks to event if not yet there
112 if (!(InputEvent()->FindListObject(fTracksOutName)))
113 InputEvent()->AddObject(fTracksOut);
115 if (!(InputEvent()->FindListObject(fTracksMapName)))
116 InputEvent()->AddObject(fTracksMap);
119 fTracksIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
121 AliError("Could not retrieve AOD MC particles! Returning");
124 TClass *cl = fTracksIn->GetClass();
125 if (!cl->GetBaseClass("AliAODMCParticle")) {
126 AliError(Form("%s: Collection %s does not contain AliAODMCParticle!", GetName(), AliAODMCParticle::StdBranchName()));
135 // clear container (normally a null operation as the event should clean it already)
136 fTracksOut->Delete();
139 const Int_t Ntracks = GetNumberOfTracks();
142 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
144 if (iTracks >= fTracksMap->GetSize())
145 fTracksMap->Set(iTracks*2);
147 fTracksMap->AddAt(-1, iTracks);
149 AliVParticle* track = GetTrack(iTracks);
154 if (TMath::Abs(track->Eta()) > fEtaMax)
157 Int_t pdgCode = track->PdgCode();
158 if (fRejectNK && (pdgCode == 130 || pdgCode == 2112)) continue;
160 if (fChargedMC && track->Charge() == 0) continue;
162 fTracksMap->AddAt(nacc, iTracks);
164 AddTrack(track, nacc);
170 //________________________________________________________________________
171 Int_t AliEmcalMCTrackSelector::GetNumberOfTracks() const
174 return MCEvent()->GetNumberOfTracks();
176 return fTracksIn->GetEntries();
179 //________________________________________________________________________
180 AliVParticle* AliEmcalMCTrackSelector::GetTrack(Int_t i)
183 if (!MCEvent()->IsPhysicalPrimary(i))
186 return MCEvent()->GetTrack(i);
189 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fTracksIn->At(i));
190 if (!part->IsPhysicalPrimary())
197 //________________________________________________________________________
198 void AliEmcalMCTrackSelector::AddTrack(AliVParticle *track, Int_t nacc)
201 AliMCParticle *part = static_cast<AliMCParticle*>(track);
202 new ((*fTracksOut)[nacc]) AliMCParticle(part->Particle(), 0, part->Label());
205 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(track);
206 new ((*fTracksOut)[nacc]) AliAODMCParticle(*part);