8 #include <TClonesArray.h>
10 #include "AliAnalysisManager.h"
11 #include "AliVEvent.h"
12 #include "AliMCEvent.h"
13 #include "AliAODMCParticle.h"
14 #include "AliMCParticle.h"
25 fParticlesOutName("MCParticlesSelected"),
31 fParticlesMapName(""),
47 fParticlesOutName(
"MCParticlesSelected"),
53 fParticlesMapName(
""),
88 AliError(
"Could not retrieve event! Returning");
97 AliError(Form(
"The output array %s is already present in the event! Task will be disabled.",
fParticlesOutName.Data()));
111 AliError(Form(
"The output array map %s is already present in the event! Task will be disabled.",
fParticlesMapName.Data()));
121 fParticlesIn =
static_cast<TClonesArray*
>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
123 AliError(
"Could not retrieve AOD MC particles! Task will be disabled.");
128 if (!cl->GetBaseClass(
"AliAODMCParticle")) {
129 AliError(Form(
"%s: Collection %s does not contain AliAODMCParticle! Task will be disabled.", GetName(), AliAODMCParticle::StdBranchName()));
139 AliError(
"Could not retrieve MC event! Returning");
159 const Int_t Nparticles = mcEvent->GetNumberOfTracks();
164 if (partMap->GetSize() <= Nparticles) partMap->Set(Nparticles*2);
167 const Int_t nprim = mcEvent->GetNumberOfPrimaries();
170 for (
Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {
172 if (partMap) partMap->AddAt(-1, iPart);
174 AliMCParticle* part =
static_cast<AliMCParticle*
>(mcEvent->GetTrack(iPart));
178 Bool_t isPhysPrim = mcEvent->IsPhysicalPrimary(iPart);
181 if (iPart < nprim) flag |= AliAODMCParticle::kPrimary;
182 if (isPhysPrim) flag |= AliAODMCParticle::kPhysicalPrim;
183 if (mcEvent->IsSecondaryFromWeakDecay(iPart)) flag |= AliAODMCParticle::kSecondaryFromWeakDecay;
184 if (mcEvent->IsSecondaryFromMaterial(iPart)) flag |= AliAODMCParticle::kSecondaryFromMaterial;
186 AliAODMCParticle *aodPart =
new ((*partOut)[nacc]) AliAODMCParticle(part, iPart, flag);
187 aodPart->SetGeneratorIndex(part->GetGeneratorIndex());
188 aodPart->SetStatus(part->Particle()->GetStatusCode());
189 aodPart->SetMCProcessCode(part->Particle()->GetUniqueID());
193 if (partMap) partMap->AddAt(nacc, iPart);
208 const Int_t Nparticles = partIn->GetEntriesFast();
213 if (partMap->GetSize() <= Nparticles) partMap->Set(Nparticles*2);
216 AliDebug(2, Form(
"Total number of particles = %d", Nparticles));
221 for (
Int_t iPart = 0; iPart < Nparticles; iPart++) {
222 if (partMap) partMap->AddAt(-1, iPart);
224 AliAODMCParticle* part =
static_cast<AliAODMCParticle*
>(partIn->At(iPart));
228 if (partMap) partMap->AddAt(nacc, iPart);
230 AliAODMCParticle *newPart =
new ((*partOut)[nacc]) AliAODMCParticle(*part);
231 newPart->SetGeneratorIndex(part->GetGeneratorIndex());
242 if (!part)
return kFALSE;
244 Int_t partPdgCode = TMath::Abs(part->PdgCode());
246 if (
fOnlyHIJING && (part->GetGeneratorIndex() != 0))
return kFALSE;
248 if (
fEtaMax > 0. && TMath::Abs(part->Eta()) >
fEtaMax)
return kFALSE;
250 if (
fRejectNK && (partPdgCode == 130 || partPdgCode == 2112))
return kFALSE;
252 if (
fChargedMC && part->Charge() == 0)
return kFALSE;
254 if (
fOnlyPhysPrim && !part->IsPhysicalPrimary())
return kFALSE;
265 ::Error(
"AddTaskMCTrackSelector",
"No analysis manager to connect to.");
270 if (!mgr->GetInputEventHandler()) {
271 ::Error(
"AddTaskMCTrackSelector",
"This task requires an input event handler");
276 TString name(
"AliEmcalMCTrackSelector_");
289 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();
290 mgr->ConnectInput (eTask, 0, cinput1 );
void ConvertMCParticles(AliMCEvent *mcEvent, TClonesArray *partOut, AliNamedArrayI *partMap=0)
TClonesArray * fParticlesOut
particle array in (AOD)
Bool_t fIsESD
MC event (ESD)
void UserExec(Option_t *option)
Bool_t fDisabled
ESD or AOD analysis.
TString fParticlesMapName
void SetParticlesOutName(const char *name)
AliNamedArrayI * fParticlesMap
particle array out
AliEmcalMCTrackSelector()
void CopyMCParticles(TClonesArray *partIn, TClonesArray *partOut, AliNamedArrayI *partMap=0)
void UserCreateOutputObjects()
void SetOnlyPhysPrim(Bool_t s)
void Clear(Option_t *option="")
AliVEvent * fEvent
particle index/label
void SetEtaMax(Double_t e)
void SetRejectNK(Bool_t r=kTRUE)
virtual ~AliEmcalMCTrackSelector()
TString fParticlesOutName
void SetChargedMC(Bool_t c=kTRUE)
static AliEmcalMCTrackSelector * AddTaskMCTrackSelector(TString outname="mcparticles", Bool_t nk=kFALSE, Bool_t ch=kFALSE, Double_t etamax=1, Bool_t physPrim=kTRUE)
Bool_t fInit
name of the particle map
TClonesArray * fParticlesIn
true = task initialized
ClassImp(AliEmcalMCTrackSelector) AliEmcalMCTrackSelector
virtual Bool_t AcceptParticle(AliAODMCParticle *part) const