2 // Class to select particles in MC events.
6 #include "AliEmcalMCTrackSelector.h"
8 #include <TClonesArray.h>
10 #include "AliVEvent.h"
11 #include "AliMCEvent.h"
12 #include "AliAODMCParticle.h"
13 #include "AliMCParticle.h"
15 #include "AliNamedArrayI.h"
19 ClassImp(AliEmcalMCTrackSelector)
21 //________________________________________________________________________
22 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector() :
23 AliAnalysisTaskSE("AliEmcalMCTrackSelector"),
24 fParticlesOutName("MCParticlesSelected"),
30 fParticlesMapName(""),
43 //________________________________________________________________________
44 AliEmcalMCTrackSelector::AliEmcalMCTrackSelector(const char *name) :
45 AliAnalysisTaskSE(name),
46 fParticlesOutName("MCParticlesSelected"),
52 fParticlesMapName(""),
65 //________________________________________________________________________
66 AliEmcalMCTrackSelector::~AliEmcalMCTrackSelector()
71 //________________________________________________________________________
72 void AliEmcalMCTrackSelector::UserCreateOutputObjects()
74 // Create my user objects.
77 //________________________________________________________________________
78 void AliEmcalMCTrackSelector::UserExec(Option_t *)
80 // Main loop, called for each event.
82 if (fDisabled) return;
85 fEvent = InputEvent();
87 AliError("Could not retrieve event! Returning");
91 if (fEvent->InheritsFrom("AliESDEvent")) fIsESD = kTRUE;
94 TObject *obj = fEvent->FindListObject(fParticlesOutName);
95 if (obj) { // the output array is already present in the array!
96 AliError(Form("The output array %s is already present in the event! Task will be disabled.", fParticlesOutName.Data()));
100 else { // copy the array from the standard ESD/AOD collections, and filter if requested
102 fParticlesOut = new TClonesArray("AliAODMCParticle"); // the output will always be of AliAODMCParticle, regardless of the input
103 fParticlesOut->SetName(fParticlesOutName);
104 fEvent->AddObject(fParticlesOut);
106 fParticlesMapName = fParticlesOutName;
107 fParticlesMapName += "_Map";
109 if (fEvent->FindListObject(fParticlesMapName)) {
110 AliError(Form("The output array map %s is already present in the event! Task will be disabled.", fParticlesMapName.Data()));
115 fParticlesMap = new AliNamedArrayI(fParticlesMapName, 99999);
116 fEvent->AddObject(fParticlesMap);
120 fParticlesIn = static_cast<TClonesArray*>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
122 AliError("Could not retrieve AOD MC particles! Task will be disabled.");
126 TClass *cl = fParticlesIn->GetClass();
127 if (!cl->GetBaseClass("AliAODMCParticle")) {
128 AliError(Form("%s: Collection %s does not contain AliAODMCParticle! Task will be disabled.", GetName(), AliAODMCParticle::StdBranchName()));
138 AliError("Could not retrieve MC event! Returning");
146 if (fIsESD) ConvertMCParticles();
147 else CopyMCParticles();
150 //________________________________________________________________________
151 void AliEmcalMCTrackSelector::ConvertMCParticles()
153 // Convert MC particles in MC AOD particles.
155 // clear container (normally a null operation as the event should clean it already)
156 fParticlesOut->Delete();
158 // clear particles map
159 fParticlesMap->Clear();
161 const Int_t Nparticles = fMC->GetNumberOfTracks();
162 const Int_t nprim = fMC->GetNumberOfPrimaries();
164 if (fParticlesMap->GetSize() <= Nparticles) fParticlesMap->Set(Nparticles*2);
166 // loop over particles
167 for (Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {
169 fParticlesMap->AddAt(-1, iPart);
171 AliMCParticle* part = static_cast<AliMCParticle*>(fMC->GetTrack(iPart));
175 if (fEtaMax > 0. && TMath::Abs(part->Eta()) > fEtaMax) continue;
177 if (fRejectNK && (part->PdgCode() == 130 || part->PdgCode() == 2112)) continue;
179 if (fChargedMC && part->Charge() == 0) continue;
181 Int_t genIndex = part->GetGeneratorIndex();
182 if (fOnlyHIJING && genIndex != 0) continue;
184 Bool_t isPhysPrim = fMC->IsPhysicalPrimary(iPart);
185 if (fOnlyPhysPrim && !isPhysPrim) continue;
187 fParticlesMap->AddAt(nacc, iPart);
190 if (iPart < nprim) flag |= AliAODMCParticle::kPrimary;
191 if (isPhysPrim) flag |= AliAODMCParticle::kPhysicalPrim;
192 if (fMC->IsSecondaryFromWeakDecay(iPart)) flag |= AliAODMCParticle::kSecondaryFromWeakDecay;
193 if (fMC->IsSecondaryFromMaterial(iPart)) flag |= AliAODMCParticle::kSecondaryFromMaterial;
195 AliAODMCParticle *aodPart = new ((*fParticlesOut)[nacc]) AliAODMCParticle(part, iPart, flag);
196 aodPart->SetGeneratorIndex(genIndex);
197 aodPart->SetStatus(part->Particle()->GetStatusCode());
198 aodPart->SetMCProcessCode(part->Particle()->GetUniqueID());
204 //________________________________________________________________________
205 void AliEmcalMCTrackSelector::CopyMCParticles()
207 // Convert standard MC AOD particles in a new array, and filter if requested.
209 if (!fParticlesIn) return;
211 // clear container (normally a null operation as the event should clean it already)
212 fParticlesOut->Delete();
214 // clear particles map
215 fParticlesMap->Clear();
217 const Int_t Nparticles = fParticlesIn->GetEntriesFast();
219 if (fParticlesMap->GetSize() <= Nparticles) fParticlesMap->Set(Nparticles*2);
221 // loop over particles
222 for (Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {
224 AliAODMCParticle* part = static_cast<AliAODMCParticle*>(fParticlesIn->At(iPart));
226 fParticlesMap->AddAt(-1, iPart);
230 if (fEtaMax > 0. && TMath::Abs(part->Eta()) > fEtaMax) continue;
232 if (fRejectNK && (part->PdgCode() == 130 || part->PdgCode() == 2112)) continue;
234 if (fChargedMC && part->Charge() == 0) continue;
236 if (fOnlyHIJING && (part->GetGeneratorIndex() != 0)) continue;
238 if (fOnlyPhysPrim && !part->IsPhysicalPrimary()) continue;
240 fParticlesMap->AddAt(nacc, iPart);
242 AliAODMCParticle *newPart = new ((*fParticlesOut)[nacc]) AliAODMCParticle(*part);
243 newPart->SetGeneratorIndex(part->GetGeneratorIndex());