]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/JetTasks/AliAnalyseLeadingTrackUE.cxx
memory leak fixed
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliAnalyseLeadingTrackUE.cxx
index ac08e24a02a7b035e9b22afedcdfb7c8276e58e1..243df9f43a155dd4995a93c1cf29d7bf769b3699 100644 (file)
@@ -104,32 +104,67 @@ Bool_t AliAnalyseLeadingTrackUE::ApplyCuts(TObject* track)
 {
   
   // select track according to set of cuts
-  if (! fEsdTrackCuts->IsSelected(track) )return kFALSE;
-  if (!fEsdTrackCutsSPD->IsSelected(track) && fEsdTrackCutsSDD->IsSelected(track)) return kFALSE;
+  if (!fEsdTrackCuts->IsSelected(track) )return kFALSE;
+  if (fEsdTrackCutsSPD && fEsdTrackCutsSDD && !fEsdTrackCutsSPD->IsSelected(track) && fEsdTrackCutsSDD->IsSelected(track)) return kFALSE;
 
   return kTRUE;
 }
 
 
 //____________________________________________________________________
-void AliAnalyseLeadingTrackUE::DefineESDCuts(Int_t /*filterbit*/){
+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)
+  // Reproduces the cuts of the corresponding bit in the ESD->AOD filtering
+  // (see $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C)
+  
+  if (filterbit == -1)
+    filterbit = fFilterBit;
 
-   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);
+  if (filterbit == 128)
+  {
+    fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+    fEsdTrackCuts->SetMinNClustersTPC(70);
+  }
+  else if (filterbit == 256)
+  {
+    // syst study
+    fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+    fEsdTrackCuts->SetMinNClustersTPC(80);
+    fEsdTrackCuts->SetMaxChi2PerClusterTPC(3);
+    fEsdTrackCuts->SetMaxDCAToVertexZ(2.7);
+    fEsdTrackCuts->SetMaxDCAToVertexXY(1.9);
+  }
+  else if (filterbit == 512)
+  {
+    // syst study
+    fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+    fEsdTrackCuts->SetMinNClustersTPC(60);
+    fEsdTrackCuts->SetMaxChi2PerClusterTPC(5);
+    fEsdTrackCuts->SetMaxDCAToVertexZ(3.7);
+    fEsdTrackCuts->SetMaxDCAToVertexXY(2.9);
+  }
+  else if (filterbit == 1024)
+  {
+    fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
+    fEsdTrackCuts->SetMinNClustersTPC(-1);
+    fEsdTrackCuts->SetMinNCrossedRowsTPC(70);
+    fEsdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
+  }
+  else
+  {
+    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);
+  }
 }
 
-
 //____________________________________________________________________
 TObjArray*  AliAnalyseLeadingTrackUE::FindLeadingObjects(TObject *obj)
 {
@@ -171,6 +206,14 @@ TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject*
 
   Int_t nTracks = NParticles(obj);
   TObjArray* tracks = new TObjArray;
+  
+  // for TPC only tracks
+  Bool_t hasOwnership = kFALSE;
+  if ((fFilterBit == 128 || fFilterBit == 256 || fFilterBit == 512 || fFilterBit == 1024) && obj->InheritsFrom("AliESDEvent"))
+    hasOwnership = kTRUE;
+  
+  if (!arrayMC)
+    tracks->SetOwner(hasOwnership);
  
   // Loop over tracks or jets
   for (Int_t ipart=0; ipart<nTracks; ++ipart) {
@@ -179,12 +222,18 @@ TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject*
     
     if (useEtaPtCuts)
       if (TMath::Abs(part->Eta()) > fTrackEtaCut || part->Pt() < fTrackPtMin)
+      {
+       if (hasOwnership)
+         delete part;
         continue;
+      }
     
-    if (arrayMC && arrayMC->InheritsFrom("TClonesArray") && obj->InheritsFrom("AliAODEvent")) {
-      Int_t label = ((AliAODTrack*)part)->GetLabel();
+    if (arrayMC) {
+      Int_t label = part->GetLabel();
+      if (hasOwnership)
+       delete part;
       // re-define part as the matched MC particle
-      part = (AliAODMCParticle*)ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
+      part = ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
       if (!part)continue;
     }
     
@@ -353,7 +402,58 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
                 if (!isHadron) return 0;                                 
                }
        */
-
+       if (particleSpecies != -1) {
+                // find the primary mother
+                AliMCParticle* mother = (AliMCParticle*) part;
+//             Printf("");
+                while (!mcEvent->IsPhysicalPrimary(mother->GetLabel()))
+                {
+//               Printf("pdg = %d; mother = %d", mother->PdgCode(), mother->GetMother());
+                  if (mother->GetMother() < 0)
+                  {
+                    mother = 0;
+                    break;
+                  }
+                    
+                  mother = (AliMCParticle*) mcEvent->GetTrack(mother->GetMother());
+                  if (!mother)
+                    break;
+                }
+                
+                if (mother)
+                {
+                  Int_t pdgCode = mother->PdgCode();
+                  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 mother not found, accept particle only in case of particleSpecies == 3. To include it in all or no sample is no solution
+                  Printf("WARNING: No mother found for particle %d:", part->GetLabel());
+                  //part->Dump();
+                  //part->Print();
+  
+                  /*
+                  // this code prints the details of the mother that is missing in the AOD
+                  AliMCEventHandler* fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+  
+                  AliMCEvent* fMcEvent = fMcHandler->MCEvent();
+                  
+                  fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->Print();
+                  fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->GetMother(0))->Print();
+                  Printf("eta = %f", fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->GetMother(0))->Eta());
+                  */
+                  
+                  if (particleSpecies != 3)
+                    return 0;
+                }
+        }
   }else if (obj->InheritsFrom("AliAODEvent")){ // RECO AOD TRACKS
        AliAODEvent *aodEvent = static_cast<AliAODEvent*>(obj);
         part = aodEvent->GetTrack(ipart);
@@ -379,8 +479,32 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
        if (!( ApplyCuts(part)) )
         return 0; 
        
-       // only primary candidates (does not exist for ESD tracks??????)
-       //if ( ((AliAODTrack*)part)->IsPrimaryCandidate() )return 0;
+       if (fFilterBit == 128 || fFilterBit == 256 || fFilterBit == 512 || fFilterBit == 1024)
+       {
+         // create TPC only tracks constrained to the SPD vertex
+
+         const AliESDVertex *vtxSPD = esdEvent->GetPrimaryVertexSPD();
+
+         AliESDtrack* track = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent, ipart);
+         if(!track) return 0;
+    
+         if(track->Pt()>0.){
+           // only constrain tracks above threshold
+           AliExternalTrackParam exParam;
+           // take the B-feild from the ESD, no 3D fieldMap available at this point
+           Bool_t relate = kFALSE;
+           relate = track->RelateToVertexTPC(vtxSPD,esdEvent->GetMagneticField(),kVeryBig,&exParam);
+           if(!relate)
+           {
+//                 Printf("relating failed");
+             delete track;
+             return 0;
+           }
+           track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
+         }
+         
+         part = track;
+       }
        
        // eventually only hadrons
        //TO-DO
@@ -532,12 +656,9 @@ Bool_t  AliAnalyseLeadingTrackUE::TriggerSelection(const TObject* obj)
   if (!obj) // MC
     return kFALSE;
 
-  //Use AliPhysicsSelection to select good events
-  if( !obj->InheritsFrom("AliAODInputHandler") ) { // not needed for AOD input 
-       if (!(((AliInputEventHandler*)obj)->IsEventSelected()&AliVEvent::kMB))return kFALSE;
-        }                                
-
-  // TODO for AOD input trigger bit needs to be checked too (is stored in the AOD)
+  // Use AliPhysicsSelection to select good events, works for ESD and AOD
+  if (!(((AliInputEventHandler*)obj)->IsEventSelected()&(AliVEvent::kMB|AliVEvent::kUserDefined)))
+    return kFALSE;
 
   return kTRUE;
 }