#include "AliLog.h"
#include "AliPicoTrack.h"
#include "AliVTrack.h"
+#include "AliAODMCParticle.h"
+#include "AliNamedArrayI.h"
ClassImp(AliEmcalPicoTrackMaker)
AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
fTracksOutName("PicoTracks"),
fTracksInName("tracks"),
+ fMCParticlesName("mcparticles"),
fMinTrackPt(0),
fMaxTrackPt(1000),
fMinTrackEta(-10),
fMinTrackPhi(-10),
fMaxTrackPhi(10),
fTrackEfficiency(1),
+ fCopyMCFlag(kFALSE),
fTracksIn(0),
- fTracksOut(0)
+ fTracksOut(0),
+ fMCParticles(0),
+ fMCParticlesMap(0),
+ fInit(kFALSE)
{
// Constructor.
AliAnalysisTaskSE(name),
fTracksOutName("PicoTracks"),
fTracksInName("tracks"),
+ fMCParticlesName("mcparticles"),
fMinTrackPt(0),
fMaxTrackPt(1000),
fMinTrackEta(-10),
fMinTrackPhi(-10),
fMaxTrackPhi(10),
fTrackEfficiency(1),
+ fCopyMCFlag(kFALSE),
fTracksIn(0),
- fTracksOut(0)
+ fTracksOut(0),
+ fMCParticles(0),
+ fMCParticlesMap(0),
+ fInit(kFALSE)
{
// Constructor.
void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
{
// Create my user objects.
-
- fTracksOut = new TClonesArray("AliPicoTrack");
- fTracksOut->SetName(fTracksOutName);
}
//________________________________________________________________________
{
// Main loop, called for each event.
- AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
- if (!am) {
- AliError("Manager zero, returning");
- return;
- }
-
- // retrieve tracks from input.
- if (!fTracksIn) {
+ if (!fInit) {
fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
if (!fTracksIn) {
AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data()));
AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data()));
return;
}
+
+ fTracksOut = new TClonesArray("AliPicoTrack");
+ fTracksOut->SetName(fTracksOutName);
+
+ // add tracks to event if not yet there
+ if (InputEvent()->FindListObject(fTracksOutName)) {
+ AliFatal(Form("Object %s already present in the event!",fTracksOutName.Data()));
+ }
+ else {
+ InputEvent()->AddObject(fTracksOut);
+ }
+
+ if (fCopyMCFlag) {
+ fMCParticles = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCParticlesName));
+ if (!fMCParticles) {
+ AliError(Form("Could not retrieve MC particles %s!", fMCParticlesName.Data()));
+ }
+ if (!fMCParticles->GetClass()->GetBaseClass("AliVParticle")) {
+ AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fMCParticlesName.Data()));
+ fMCParticles = 0;
+ }
+
+ TString mapName(fMCParticlesName);
+ mapName += "_Map";
+ fMCParticlesMap = dynamic_cast<AliNamedArrayI*>(InputEvent()->FindListObject(mapName));
+ }
+
+ fInit = kTRUE;
}
- // add tracks to event if not yet there
fTracksOut->Delete();
- if (!(InputEvent()->FindListObject(fTracksOutName))) {
- InputEvent()->AddObject(fTracksOut);
- }
// loop over tracks
const Int_t Ntracks = fTracksIn->GetEntriesFast();
isEmc = kTRUE;
AliPicoTrack *picotrack = new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(),
- track->Eta(),
- track->Phi(),
- track->Charge(),
- track->GetLabel(),
- AliPicoTrack::GetTrackType(track),
- track->GetTrackEtaOnEMCal(),
- track->GetTrackPhiOnEMCal(),
- track->GetTrackPtOnEMCal(),
- isEmc);
+ track->Eta(),
+ track->Phi(),
+ track->Charge(),
+ track->GetLabel(),
+ AliPicoTrack::GetTrackType(track),
+ track->GetTrackEtaOnEMCal(),
+ track->GetTrackPhiOnEMCal(),
+ track->GetTrackPtOnEMCal(),
+ isEmc);
picotrack->SetTrack(track);
+
+ if (fCopyMCFlag && track->GetLabel() != 0) {
+ AliVParticle *mcpart = GetMCParticle(TMath::Abs(track->GetLabel()));
+ if (mcpart) {
+ UInt_t mcFlag = mcpart->GetFlag();
+ picotrack->SetFlag(mcFlag);
+ Short_t genIndex = mcpart->GetGeneratorIndex();
+ picotrack->SetGeneratorIndex(genIndex);
+ }
+ }
+
++nacc;
}
}
+
+//________________________________________________________________________
+AliVParticle* AliEmcalPicoTrackMaker::GetMCParticle(Int_t label)
+{
+ if (!fMCParticles) return 0;
+ Int_t index = label;
+ if (fMCParticlesMap) index = fMCParticlesMap->At(label);
+ if (index < 0 || index >= fMCParticles->GetEntriesFast()) return 0;
+ AliVParticle *part = static_cast<AliVParticle*>(fMCParticles->At(index));
+ return part;
+}