#include "AliLog.h"
#include "AliPicoTrack.h"
#include "AliVTrack.h"
+#include "AliAODMCParticle.h"
+#include "AliNamedArrayI.h"
ClassImp(AliEmcalPicoTrackMaker)
//________________________________________________________________________
AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() :
AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
- fESDtrackCuts(0),
fTracksOutName("PicoTracks"),
fTracksInName("tracks"),
+ fMCParticlesName("mcparticles"),
fMinTrackPt(0),
fMaxTrackPt(1000),
fMinTrackEta(-10),
fMinTrackPhi(-10),
fMaxTrackPhi(10),
fTrackEfficiency(1),
- fIncludeNoITS(kTRUE),
- fUseNegativeLabels(kTRUE),
- fIsMC(kFALSE),
- fCutMaxFractionSharedTPCClusters(0.4),
+ fCopyMCFlag(kFALSE),
fTracksIn(0),
- fTracksOut(0)
+ fTracksOut(0),
+ fMCParticles(0),
+ fMCParticlesMap(0),
+ fInit(kFALSE)
{
// Constructor.
//________________________________________________________________________
AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) :
AliAnalysisTaskSE(name),
- fESDtrackCuts(0),
fTracksOutName("PicoTracks"),
fTracksInName("tracks"),
+ fMCParticlesName("mcparticles"),
fMinTrackPt(0),
fMaxTrackPt(1000),
fMinTrackEta(-10),
fMinTrackPhi(-10),
fMaxTrackPhi(10),
fTrackEfficiency(1),
- fIncludeNoITS(kTRUE),
- fUseNegativeLabels(kTRUE),
- fIsMC(kFALSE),
- fCutMaxFractionSharedTPCClusters(0.4),
+ 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);
- }
- // test if we are in ESD or AOD mode
- Bool_t esdMode = kTRUE;
- if (dynamic_cast<AliAODEvent*>(InputEvent())!=0)
- esdMode = kFALSE;
-
// loop over tracks
const Int_t Ntracks = fTracksIn->GetEntriesFast();
for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
continue;
- Bool_t isEmc = kFALSE;
- Int_t type = -1;
- if (esdMode) {
- AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
- if (fESDtrackCuts && !fESDtrackCuts->AcceptTrack(esdtrack))
- continue;
- type = 0;
- if (esdtrack->TestBit(BIT(27)) && !esdtrack->TestBit(BIT(28)))
- type = 1;
- else if (!esdtrack->TestBit(BIT(27)) && esdtrack->TestBit(BIT(28)))
- type = 2;
- if (!fIncludeNoITS && (type==2))
- continue;
- if (TMath::Abs(esdtrack->GetTrackEtaOnEMCal()) < 0.75 &&
- esdtrack->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
- esdtrack->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
- isEmc = kTRUE;
- } else {
- AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
- if (fAODfilterBits[0] < 0) {
- if (aodtrack->IsHybridGlobalConstrainedGlobal())
- type = 3;
- else /*not a good track*/
- continue;
- } else {
- if (aodtrack->TestFilterBit(fAODfilterBits[0])) {
- type = 0;
- } else if (aodtrack->TestFilterBit(fAODfilterBits[1])) {
- if ((aodtrack->GetStatus()&AliESDtrack::kITSrefit)==0) {
- if (fIncludeNoITS)
- type = 2;
- else
- continue;
- } else {
- type = 1;
- }
- }
- else {/*not a good track*/
- continue;
- }
- }
- if (fCutMaxFractionSharedTPCClusters > 0) {
- Double_t frac = Double_t(aodtrack->GetTPCnclsS()) / Double_t(aodtrack->GetTPCncls());
- if (frac > fCutMaxFractionSharedTPCClusters)
- continue;
- }
- if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 &&
- track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
- track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
- isEmc = kTRUE;
- }
-
if (fTrackEfficiency < 1) {
Double_t r = gRandom->Rndm();
if (fTrackEfficiency < r)
continue;
}
- Int_t label = 0;
- if (fIsMC) {
- if (fUseNegativeLabels)
- label = track->GetLabel();
- else
- label = TMath::Abs(track->GetLabel());
-
- if (label == 0)
- AliDebug(2,Form("Track %d with label==0", iTracks));
+ Bool_t isEmc = kFALSE;
+ if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 &&
+ track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
+ track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
+ 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);
+ 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);
+ }
}
- /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(),
- track->Eta(),
- track->Phi(),
- track->Charge(),
- label,
- type,
- track->GetTrackEtaOnEMCal(),
- track->GetTrackPhiOnEMCal(),
- track->GetTrackPtOnEMCal(),
- isEmc);
++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;
+}