]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/JetTasks/AliAnalyseLeadingTrackUE.cxx
removed a relic debug hack in previous commit
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliAnalyseLeadingTrackUE.cxx
index 9379da918efb36544719f2772d92f18d4bf88842..17fd454c2f25ae7ef4372cbd94c0f38f2dd319c2 100644 (file)
@@ -69,7 +69,10 @@ AliAnalyseLeadingTrackUE::AliAnalyseLeadingTrackUE() :
   fDebug(0),
   fFilterBit(16),
   fOnlyHadrons(kFALSE),
-  fTrackEtaCut(0.8)
+  fTrackEtaCut(0.8),
+  fEsdTrackCuts(0x0), 
+  fEsdTrackCutsSPD(0x0), 
+  fEsdTrackCutsSDD(0x0) 
 {
   // constructor
 }
@@ -93,45 +96,34 @@ AliAnalyseLeadingTrackUE::~AliAnalyseLeadingTrackUE()
 
 
 //____________________________________________________________________
-Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track, Int_t filterbit)
+Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track)
 {
-  // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
-  // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
-
-  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts();
-  switch (filterbit){
-   /*case 16:
-   // tighter cuts on primary particles for high pT tracks
-   // needed as input for jetfinder 
-   esdTrackCuts->SetMinNClustersTPC(50);
-   esdTrackCuts->SetMaxChi2PerClusterTPC(3.5);
-   esdTrackCuts->SetRequireTPCRefit(kTRUE);
-   esdTrackCuts->SetMaxDCAToVertexXY(2.4);
-   esdTrackCuts->SetMaxDCAToVertexZ(3.2);
-   esdTrackCuts->SetDCAToVertex2D(kTRUE);
-   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
-   esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
-   esdTrackCuts->SetRequireITSRefit(kTRUE); // additional cut 
-   break;
-   */
-
-   case 16:
-   esdTrackCuts->GetStandardITSTPCTrackCuts2009(kTRUE);
-   break;
-
-   default:
-   if (fDebug > 1) AliFatal("Set of cuts not defined");
-   break;
-   }
   
   // select track according to set of cuts
-  if (! esdTrackCuts->IsSelected(track) )return kFALSE;
-  
+  if (! fEsdTrackCuts->IsSelected(track) )return kFALSE;
+  if (!fEsdTrackCutsSPD->IsSelected(track) && fEsdTrackCutsSDD->IsSelected(track)) return kFALSE;
+
   return kTRUE;
 }
 
 
+//____________________________________________________________________
+void AliAnalyseLeadingTrackUE::DefineESDCuts(Int_t /*filterbit*/){
+  
+   // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+   // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
 
+   fEsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
+   fEsdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
+   // Add SPD requirement 
+   fEsdTrackCutsSPD = new AliESDtrackCuts("SPD", "Require 1 cluster in SPD");
+   fEsdTrackCutsSPD->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+   // Add SDD requirement 
+   fEsdTrackCutsSDD = new AliESDtrackCuts("SDD", "Require 1 cluster in first layer SDD");
+   fEsdTrackCutsSDD->SetClusterRequirementITS(AliESDtrackCuts::kSDD,AliESDtrackCuts::kFirst);
+}
 
 
 //____________________________________________________________________
@@ -166,6 +158,34 @@ TObjArray*  AliAnalyseLeadingTrackUE::FindLeadingObjects(TObject *obj)
   }
 
 
+//-------------------------------------------------------------------
+TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject* arrayMC, Bool_t onlyprimaries, Int_t particleSpecies)
+{
+  // Returns an array of particles that pass the cuts, if arrayMC is given each reconstructed particle is replaced by its corresponding MC particles, depending on the parameter onlyprimaries only for primaries 
+  // particleSpecies: -1 all particles are returned
+  //                  0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
+
+  Int_t nTracks = NParticles(obj);
+  TObjArray* tracks = new TObjArray;
+  // Loop over tracks or jets
+  for (Int_t ipart=0; ipart<nTracks; ++ipart) {
+    AliVParticle* part = ParticleWithCuts( obj, ipart, onlyprimaries, particleSpecies );
+    if (!part) continue;
+    
+    if (arrayMC && arrayMC->InheritsFrom("TClonesArray") && obj->InheritsFrom("AliAODEvent")) {
+      Int_t label = ((AliAODTrack*)part)->GetLabel();
+      // re-define part as the matched MC particle
+      part = (AliAODMCParticle*)ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
+      if (!part)continue;
+    }
+    
+    tracks->Add(part);
+  }
+
+  return tracks;
+}
+
 //-------------------------------------------------------------------
 TObjArray* AliAnalyseLeadingTrackUE::GetMinMaxRegion(TList *transv1, TList *transv2)
 {
@@ -221,6 +241,9 @@ Int_t  AliAnalyseLeadingTrackUE::NParticles(TObject* obj)
   }else if (obj->InheritsFrom("AliESDEvent")){  // RECO ESD tracks
        AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(obj);
         nTracks = esdEvent->GetNumberOfTracks();
+  }else if (obj->InheritsFrom("AliMCEvent")){  // RECO ESD tracks
+       AliMCEvent *mcEvent = dynamic_cast<AliMCEvent*>(obj);
+        nTracks = mcEvent->GetNumberOfTracks();
   }else {
        if (fDebug > 1) AliFatal(" Analysis type not defined !!! ");
        return 0;
@@ -231,9 +254,11 @@ Int_t  AliAnalyseLeadingTrackUE::NParticles(TObject* obj)
 
 
 //-------------------------------------------------------------------
-AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries)
+AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ipart, Bool_t onlyprimaries, Int_t particleSpecies)
 {
   // Returns track or MC particle at position "ipart" if passes selection criteria
+  // particleSpecies: -1 all particles are returned
+  //                  0 (pions) 1 (kaons) 2 (protons) 3 (others) particles
   AliVParticle *part=0;
   
   if (obj->InheritsFrom("TClonesArray")){ // AOD-MC PARTICLE
@@ -250,6 +275,35 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
                                  TMath::Abs(pdgCode)==321;    // Kaon
                 if (!isHadron) return 0;                                 
                }
+        if (particleSpecies != -1) {
+                // find the primary mother
+                AliVParticle* mother = part;
+                while (!((AliAODMCParticle*)mother)->IsPhysicalPrimary())
+                {
+                  if (((AliAODMCParticle*)mother)->GetMother() < 0)
+                  {
+                    mother = 0;
+                    break;
+                  }
+                    
+                  mother = (AliVParticle*) arrayMC->At(((AliAODMCParticle*)mother)->GetMother());
+                  if (!mother)
+                    break;
+                }
+                
+                if (mother)
+                {
+                  Int_t pdgCode = ((AliAODMCParticle*)mother)->GetPdgCode();
+                  if (particleSpecies == 0 && TMath::Abs(pdgCode)!=211)
+                          return 0;
+                  if (particleSpecies == 1 && TMath::Abs(pdgCode)!=321)
+                          return 0;
+                  if (particleSpecies == 2 && TMath::Abs(pdgCode)!=2212)
+                          return 0;
+                  if (particleSpecies == 3 && (TMath::Abs(pdgCode)==211 || TMath::Abs(pdgCode)==321 || TMath::Abs(pdgCode)==2212))
+                          return 0;
+                }
+        }
   
   }else if (obj->InheritsFrom("TObjArray")){ // list of AliVParticle
        TObjArray *array = dynamic_cast<TObjArray*>(obj);
@@ -293,7 +347,7 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
         part = esdEvent->GetTrack(ipart);
        if (!part)return 0;
        // track selection cuts
-       if (!( ApplyCuts(part, fFilterBit)) )return 0; 
+       if (!( ApplyCuts(part)) )return 0; 
        
        // only primary candidates (does not exist for ESD tracks??????)
        //if ( ((AliAODTrack*)part)->IsPrimaryCandidate() )return 0;
@@ -379,6 +433,8 @@ TObjArray*  AliAnalyseLeadingTrackUE::SortRegions(const AliVParticle* leading, T
   TList *transverse2 = new TList();
   
   TObjArray *regionParticles = new TObjArray;
+  regionParticles->SetOwner(kTRUE);
+  
   regionParticles->AddLast(toward);
   regionParticles->AddLast(away);
   regionParticles->AddLast(transverse1);
@@ -409,7 +465,7 @@ TObjArray*  AliAnalyseLeadingTrackUE::SortRegions(const AliVParticle* leading, T
        if (TMath::Abs(leadVect.DeltaPhi(partVect)) > k120rad ) region = -2;  //backward
        
        // skip leading particle 
-       if (leading == part)
+        if (leading == part)
          continue;
        
        if (!region)continue;
@@ -449,6 +505,8 @@ Bool_t  AliAnalyseLeadingTrackUE::TriggerSelection(const TObject* obj)
        if (!(((AliInputEventHandler*)obj)->IsEventSelected()&AliVEvent::kMB))return kFALSE;
         }                                
 
+  // TODO for AOD input trigger bit needs to be checked too (is stored in the AOD)
+
   return kTRUE;
 
 }