3 // Class to select tracks in MC events.
7 #include "AliEmcalMCTrackSelector.h"
9 #include <TClonesArray.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"),
39 //________________________________________________________________________
40 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) :
41 AliAnalysisTaskSE(name),
42 fTracksOutName("PicoTracks"),
55 //________________________________________________________________________
56 AliEmcalMCTrackSelector::~AliEmcalMCTrackSelector()
61 //________________________________________________________________________
62 void AliEmcalMCTrackSelector::UserCreateOutputObjects()
64 // Create my user objects.
66 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
68 AliFatal("No analysis manager!");
72 AliVEventHandler *handler = mgr->GetInputEventHandler();
74 AliFatal("No input handler!");
78 if (handler->InheritsFrom("AliESDInputHandler"))
84 fTracksOut = new TClonesArray("AliMCParticle");
86 fTracksOut = new TClonesArray("AliAODMCParticle");
87 fTracksOut->SetName(fTracksOutName);
89 fTracksMapName = fTracksOutName;
90 fTracksMapName += "_Map";
91 fTracksMap = new TH1I(fTracksMapName, fTracksMapName, 1000, 0, 1);
94 //________________________________________________________________________
95 void AliEmcalMCTrackSelector::UserExec(Option_t *)
97 // Main loop, called for each event.
99 AliError("Could not retrieve event! Returning");
103 if (fEsdMode && !MCEvent()) {
104 AliError("Could not retrieve MC event! Returning");
109 // add tracks to event if not yet there
110 if (!(InputEvent()->FindListObject(fTracksOutName)))
111 InputEvent()->AddObject(fTracksOut);
113 if (!(InputEvent()->FindListObject(fTracksMapName)))
114 InputEvent()->AddObject(fTracksMap);
117 fTracksIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
119 AliError("Could not retrieve AOD MC particles! Returning");
122 TClass *cl = fTracksIn->GetClass();
123 if (!cl->GetBaseClass("AliAODMCParticle")) {
124 AliError(Form("%s: Collection %s does not contain AliAODMCParticle!", GetName(), AliAODMCParticle::StdBranchName()));
133 // clear container (normally a null operation as the event should clean it already)
134 fTracksOut->Delete();
136 const Int_t Ntracks = GetNumberOfTracks();
137 new (fTracksMap) TH1I(fTracksMapName, fTracksMapName, Ntracks-2, 0, 1); // Ntracks - 2, we use also over- and uner-flow bins
140 for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
142 fTracksMap->SetBinContent(iTracks, 0);
144 AliVParticle* track = GetTrack(iTracks);
149 if (TMath::Abs(track->Eta()) > 1)
152 Int_t pdgCode = track->PdgCode();
153 if (fRejectNK && (pdgCode == 130 || pdgCode == 2112)) continue;
155 if (fChargedMC && track->Charge() == 0) continue;
157 fTracksMap->SetBinContent(iTracks, nacc);
159 AddTrack(track, nacc);
165 //________________________________________________________________________
166 Int_t AliEmcalMCTrackSelector::GetNumberOfTracks() const
169 return MCEvent()->GetNumberOfTracks();
171 return fTracksIn->GetEntries();
174 //________________________________________________________________________
175 AliVParticle* AliEmcalMCTrackSelector::GetTrack(Int_t i)
178 if (!MCEvent()->IsPhysicalPrimary(i))
181 return MCEvent()->GetTrack(i);
184 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(fTracksIn->At(i));
185 if (!part->IsPhysicalPrimary())
192 //________________________________________________________________________
193 void AliEmcalMCTrackSelector::AddTrack(AliVParticle *track, Int_t nacc)
196 AliMCParticle *part = static_cast<AliMCParticle*>(track);
197 new ((*fTracksOut)[nacc]) AliMCParticle(part->Particle(), 0, part->Label());
200 AliAODMCParticle *part = static_cast<AliAODMCParticle*>(track);
201 new ((*fTracksOut)[nacc]) AliAODMCParticle(*part);