10 #include <TClonesArray.h> 12 #include "AliAnalysisManager.h" 13 #include "AliVEvent.h" 14 #include "AliMCEvent.h" 15 #include "AliAODMCParticle.h" 16 #include "AliMCParticle.h" 27 fParticlesOutName("MCParticlesSelected"),
33 fParticlesMapName(""),
49 fParticlesOutName(
"MCParticlesSelected"),
55 fParticlesMapName(
""),
90 AliError(
"Could not retrieve event! Returning");
99 AliError(Form(
"The output array %s is already present in the event! Task will be disabled.",
fParticlesOutName.Data()));
113 AliError(Form(
"The output array map %s is already present in the event! Task will be disabled.",
fParticlesMapName.Data()));
123 fParticlesIn =
static_cast<TClonesArray*
>(InputEvent()->FindListObject(AliAODMCParticle::StdBranchName()));
125 AliError(
"Could not retrieve AOD MC particles! Task will be disabled.");
130 if (!cl->GetBaseClass(
"AliAODMCParticle")) {
131 AliError(Form(
"%s: Collection %s does not contain AliAODMCParticle! Task will be disabled.", GetName(), AliAODMCParticle::StdBranchName()));
141 AliError(
"Could not retrieve MC event! Returning");
161 const Int_t Nparticles = mcEvent->GetNumberOfTracks();
166 if (partMap->GetSize() <= Nparticles) partMap->Set(Nparticles*2);
169 const Int_t nprim = mcEvent->GetNumberOfPrimaries();
171 AliDebugStream(3) <<
"Number of particles: " << Nparticles << std::endl;
174 for (
Int_t iPart = 0, nacc = 0; iPart < Nparticles; iPart++) {
176 if (partMap) partMap->AddAt(-1, iPart);
178 AliMCParticle*
part =
static_cast<AliMCParticle*
>(mcEvent->GetTrack(iPart));
182 Bool_t isPhysPrim = mcEvent->IsPhysicalPrimary(iPart);
186 if (isPhysPrim) flag |= AliAODMCParticle::kPhysicalPrim;
190 AliDebugStream(3) <<
"Particle " << iPart <<
": pt = " << part->Pt() <<
", PDG = " << part->PdgCode() <<
191 ", mother " << part->GetMother() <<
193 ", kPhysicalPrim? " <<
Bool_t((flag & AliAODMCParticle::kPhysicalPrim) != 0) <<
196 ", nacc = " << nacc <<
197 ", iPart = " << iPart <<
200 AliAODMCParticle *aodPart =
new ((*partOut)[nacc]) AliAODMCParticle(part, iPart, flag);
201 aodPart->SetGeneratorIndex(part->GetGeneratorIndex());
202 aodPart->SetStatus(part->Particle()->GetStatusCode());
203 aodPart->SetMCProcessCode(part->Particle()->GetUniqueID());
207 if (partMap) partMap->AddAt(nacc, iPart);
222 const Int_t Nparticles = partIn->GetEntriesFast();
227 if (partMap->GetSize() <= Nparticles) partMap->Set(Nparticles*2);
230 AliDebug(2, Form(
"Total number of particles = %d", Nparticles));
235 for (
Int_t iPart = 0; iPart < Nparticles; iPart++) {
236 if (partMap) partMap->AddAt(-1, iPart);
238 AliAODMCParticle*
part =
static_cast<AliAODMCParticle*
>(partIn->At(iPart));
242 if (partMap) partMap->AddAt(nacc, iPart);
244 AliAODMCParticle *newPart =
new ((*partOut)[nacc]) AliAODMCParticle(*part);
245 newPart->SetGeneratorIndex(part->GetGeneratorIndex());
256 if (!part)
return kFALSE;
258 Int_t partPdgCode = TMath::Abs(part->PdgCode());
260 if (
fOnlyHIJING && (part->GetGeneratorIndex() != 0))
return kFALSE;
262 if (
fEtaMax > 0. && TMath::Abs(part->Eta()) >
fEtaMax)
return kFALSE;
264 if (
fRejectNK && (partPdgCode == 130 || partPdgCode == 2112))
return kFALSE;
266 if (
fChargedMC && part->Charge() == 0)
return kFALSE;
268 if (
fOnlyPhysPrim && !part->IsPhysicalPrimary())
return kFALSE;
279 ::Error(
"AddTaskMCTrackSelector",
"No analysis manager to connect to.");
284 if (!mgr->GetInputEventHandler()) {
285 ::Error(
"AddTaskMCTrackSelector",
"This task requires an input event handler");
290 TString name(
"AliEmcalMCTrackSelector_");
303 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();
304 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
TString part
use mixed event to constrain combinatorial background
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
virtual Bool_t AcceptParticle(AliAODMCParticle *part) const