]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG/EMCAL/AliEmcalPicoTrackMaker.cxx
expand particle map when needed
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalPicoTrackMaker.cxx
index b141614d5b68e81d47ecd85070550265e0b67e6b..e9123aa93c66956a66a2b63ba66f42b693fca507 100644 (file)
@@ -6,61 +6,70 @@
 
 #include <TClonesArray.h>
 #include <TRandom3.h>
-
 #include "AliAODEvent.h"
 #include "AliAODTrack.h"
 #include "AliAnalysisManager.h"
 #include "AliESDtrack.h"
 #include "AliESDtrackCuts.h"
+#include "AliEmcalPicoTrackMaker.h"
 #include "AliLog.h"
 #include "AliPicoTrack.h"
 #include "AliVTrack.h"
-#include "AliEmcalPicoTrackMaker.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(-0.9),
-  fMaxTrackEta(0.9),
+  fMinTrackEta(-10),
+  fMaxTrackEta(10),
   fMinTrackPhi(-10),
   fMaxTrackPhi(10),
   fTrackEfficiency(1),
+  fCopyMCFlag(kFALSE),
   fTracksIn(0),
-  fTracksOut(0)
+  fTracksOut(0),
+  fMCParticles(0),
+  fMCParticlesMap(0),
+  fInit(kFALSE)
 {
   // Constructor.
 
-  fAODfilterBits[0] = 0;
-  fAODfilterBits[1] = 0;
+  fAODfilterBits[0] = -1;
+  fAODfilterBits[1] = -1;
 }
 
 //________________________________________________________________________
 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) : 
   AliAnalysisTaskSE(name),
-  fESDtrackCuts(0),
   fTracksOutName("PicoTracks"),
   fTracksInName("tracks"),
+  fMCParticlesName("mcparticles"),
   fMinTrackPt(0),
   fMaxTrackPt(1000),
-  fMinTrackEta(-0.9),
-  fMaxTrackEta(0.9),
+  fMinTrackEta(-10),
+  fMaxTrackEta(10),
   fMinTrackPhi(-10),
   fMaxTrackPhi(10),
   fTrackEfficiency(1),
+  fCopyMCFlag(kFALSE),
   fTracksIn(0),
-  fTracksOut(0)
+  fTracksOut(0),
+  fMCParticles(0),
+  fMCParticlesMap(0),
+  fInit(kFALSE)
 {
   // Constructor.
 
-  fAODfilterBits[0] = 0;
-  fAODfilterBits[1] = 0;
+  fAODfilterBits[0] = -1;
+  fAODfilterBits[1] = -1;
   fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
 }
 
@@ -74,9 +83,6 @@ AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
 {
   // Create my user objects.
-
-  fTracksOut = new TClonesArray("AliPicoTrack");
-  fTracksOut->SetName(fTracksOutName);
 }
 
 //________________________________________________________________________
@@ -84,14 +90,7 @@ void AliEmcalPicoTrackMaker::UserExec(Option_t *)
 {
   // 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())); 
@@ -101,21 +100,38 @@ void AliEmcalPicoTrackMaker::UserExec(Option_t *)
       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));
+    }
 
-  // add tracks to event if not yet there
-  if (!(InputEvent()->FindListObject(fTracksOutName))) {
-    InputEvent()->AddObject(fTracksOut);
+    fInit = kTRUE;
   }
 
-  // clear container (normally a null operation as the event should clean it already)
-  fTracksOut->Clear();
+  fTracksOut->Delete();
 
-  // 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) {
@@ -132,45 +148,51 @@ void AliEmcalPicoTrackMaker::UserExec(Option_t *)
        track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
       continue;
 
-    Bool_t isEmc = kFALSE;
-    Int_t label = -1;
-    if (esdMode) {
-      if (fESDtrackCuts) {
-        AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
-        if (!fESDtrackCuts->AcceptTrack(esdtrack))
-          continue;
-      }
-      label = track->GetLabel();
-      isEmc = track->IsEMCAL();
-    } else {
-      AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
-      if (aodtrack->TestFilterBit(fAODfilterBits[0]))
-       label = 0;
-      else if (aodtrack->TestFilterBit(fAODfilterBits[1]))
-       label = 3;
-      else /*not a good track*/
-        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;
     }
 
-    /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
-                                                                     track->Eta(), 
-                                                                     track->Phi(), 
-                                                                     track->Charge(), 
-                                                                     label, 
-                                                                     track->GetTrackEtaOnEMCal(), 
-                                                                     track->GetTrackPhiOnEMCal(), 
-                                                                     isEmc);
+    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);
+      }
+    }
+
     ++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;
+}