]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliESDtrackCuts.cxx
QA MC analysis, fill photon and electron histograms only when such particles did...
[u/mrichter/AliRoot.git] / ANALYSIS / AliESDtrackCuts.cxx
index 4c458e4361a30c6007bd8f6f1c75934503c88a97..db1922e38b37fba08fffdabd1a2e7c1af53047cd 100644 (file)
@@ -73,10 +73,13 @@ const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "n crossed rows TPC",
  "n crossed rows / n findable clusters",
  "missing ITS points",
- "#Chi^{2} TPC constrained vs. global"
+ "#Chi^{2} TPC constrained vs. global",
+ "require TOF out",
+ "TOF Distance cut"
 };
 
 AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
+Char_t AliESDtrackCuts::fgBeamTypeFlag = -1;
 
 //____________________________________________________________________
 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
@@ -84,6 +87,8 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fCutMinNClusterITS(0),
   fCutMinNCrossedRowsTPC(0),
   fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
+  f1CutMinNClustersTPCPtDep(0x0),
+  fCutMaxPtDepNClustersTPC(0),
   fCutMaxChi2PerClusterTPC(0),
   fCutMaxChi2PerClusterITS(0),
   fCutMaxChi2TPCConstrainedVsGlobal(0),
@@ -133,6 +138,9 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fEtaMax(0),
   fRapMin(0),
   fRapMax(0),
+  fCutRequireTOFout(kFALSE),
+  fFlagCutTOFdistance(kFALSE),
+  fCutTOFdistance(3.),
   fHistogramsOn(0),
   ffDTheoretical(0),
   fhCutStatistics(0),         
@@ -192,6 +200,8 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fCutMinNClusterITS(0),
   fCutMinNCrossedRowsTPC(0),
   fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
+  f1CutMinNClustersTPCPtDep(0x0),
+  fCutMaxPtDepNClustersTPC(0),
   fCutMaxChi2PerClusterTPC(0),
   fCutMaxChi2PerClusterITS(0),
   fCutMaxChi2TPCConstrainedVsGlobal(0),
@@ -241,9 +251,12 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fEtaMax(0),
   fRapMin(0),
   fRapMax(0),
+  fCutRequireTOFout(kFALSE),
+  fFlagCutTOFdistance(kFALSE),
+  fCutTOFdistance(3.),
   fHistogramsOn(0),
-  ffDTheoretical(0),                                
-  fhCutStatistics(0),         
+  ffDTheoretical(0),
+  fhCutStatistics(0),
   fhCutCorrelation(0)
 {
   //
@@ -316,6 +329,8 @@ AliESDtrackCuts::~AliESDtrackCuts()
       delete fhPt[i];
     if (fhEta[i])
       delete fhEta[i];
+    if (fhTOFdistance[i])
+      delete fhTOFdistance[i];
   }
 
   if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
@@ -334,7 +349,11 @@ AliESDtrackCuts::~AliESDtrackCuts()
   if (fhCutStatistics)
     delete fhCutStatistics;             
   if (fhCutCorrelation)
-    delete fhCutCorrelation;            
+    delete fhCutCorrelation;    
+
+  if(f1CutMinNClustersTPCPtDep)
+    delete f1CutMinNClustersTPCPtDep;
+        
 }
 
 void AliESDtrackCuts::Init()
@@ -448,6 +467,7 @@ void AliESDtrackCuts::Init()
     
     fhPt[i] = 0;
     fhEta[i] = 0;
+    fhTOFdistance[i] = 0;
   }
   ffDTheoretical = 0;
 
@@ -481,7 +501,10 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutMinNClusterITS = fCutMinNClusterITS;
   target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
   target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
-
+  if(f1CutMinNClustersTPCPtDep){
+    target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
+  }
+  target.fCutMaxPtDepNClustersTPC =   fCutMaxPtDepNClustersTPC;
 
   target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
   target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
@@ -545,6 +568,10 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fRapMin = fRapMin;
   target.fRapMax = fRapMax;
 
+  target.fFlagCutTOFdistance = fFlagCutTOFdistance;
+  target.fCutTOFdistance = fCutTOFdistance;
+  target.fCutRequireTOFout = fCutRequireTOFout;
+
   target.fHistogramsOn = fHistogramsOn;
 
   for (Int_t i=0; i<2; ++i)
@@ -581,6 +608,7 @@ void AliESDtrackCuts::Copy(TObject &c) const
     
     if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
     if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
+    if (fhTOFdistance[i]) target.fhTOFdistance[i] = (TH2F*) fhTOFdistance[i]->Clone();
   }
   if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
 
@@ -654,6 +682,7 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
 
       fhPt[i]                ->Add(entry->fhPt[i]); 
       fhEta[i]               ->Add(entry->fhEta[i]); 
+      fhTOFdistance[i]       ->Add(entry->fhTOFdistance[i]); 
     }      
 
     fhCutStatistics  ->Add(entry->fhCutStatistics);        
@@ -664,6 +693,19 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
   return count+1;
 }
 
+void AliESDtrackCuts::SetMinNClustersTPCPtDep(TFormula *f1, Float_t ptmax) 
+{
+  //
+  // Sets the pT dependent NClustersTPC cut
+  //
+
+  if(f1){ 
+    delete f1CutMinNClustersTPCPtDep;
+    f1CutMinNClustersTPCPtDep = (TFormula*)f1->Clone("f1CutMinNClustersTPCPtDep"); 
+  }
+  fCutMaxPtDepNClustersTPC=ptmax; 
+}
+
 //____________________________________________________________________
 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
 {
@@ -706,12 +748,58 @@ AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrima
   if(selPrimaries) {
     // 7*(0.0050+0.0060/pt^0.9)
     esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
+    esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
   }
   esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
   esdTrackCuts->SetDCAToVertex2D(kFALSE);
   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
   //esdTrackCuts->SetEtaRange(-0.8,+0.8);
   
+  esdTrackCuts->SetMaxChi2PerClusterITS(36);
+  
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries, Int_t clusterCut)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2011 data  
+  // if clusterCut = 1, the cut on the number of clusters is replaced by
+  // a cut on the number of crossed rows and on the ration crossed
+  // rows/findable clusters
+
+  AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+
+  // TPC  
+  if(clusterCut == 0)  esdTrackCuts->SetMinNClustersTPC(50);
+  else if (clusterCut == 1) {
+    esdTrackCuts->SetMinNCrossedRowsTPC(70);
+    esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
+  }
+  else {
+    AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
+    esdTrackCuts->SetMinNClustersTPC(50);
+  }
+  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+  esdTrackCuts->SetRequireTPCRefit(kTRUE);
+  // ITS
+  esdTrackCuts->SetRequireITSRefit(kTRUE);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  if(selPrimaries) {
+    // 7*(0.0015+0.0050/pt^1.1)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
+    esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
+  }
+  esdTrackCuts->SetMaxDCAToVertexZ(2);
+  esdTrackCuts->SetDCAToVertex2D(kFALSE);
+  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
+  
+  esdTrackCuts->SetMaxChi2PerClusterITS(36);
+
   return esdTrackCuts;
 }
 
@@ -747,18 +835,17 @@ AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrima
   if(selPrimaries) {
     // 7*(0.0026+0.0050/pt^1.01)
     esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
+    esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
   }
   esdTrackCuts->SetMaxDCAToVertexZ(2);
   esdTrackCuts->SetDCAToVertex2D(kFALSE);
   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
   
+  esdTrackCuts->SetMaxChi2PerClusterITS(36);
+
   return esdTrackCuts;
 }
 
-//____________________________________________________________________
-
-
-
 //____________________________________________________________________
 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
 {
@@ -967,7 +1054,7 @@ void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
 }
 
 //____________________________________________________________________
-Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEvent* esdEvent
+Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack) 
 {
   // 
   // figure out if the tracks survives all the track cuts defined
@@ -1006,6 +1093,15 @@ Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEve
   else {
     nClustersTPC = esdTrack->GetTPCclusters(0);
   }
+
+  //Pt dependent NClusters Cut
+  if(f1CutMinNClustersTPCPtDep) {
+    if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
+      fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(esdTrack->Pt());
+    else
+      fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(fCutMaxPtDepNClustersTPC);
+  }
+
   Float_t nCrossedRowsTPC = esdTrack->GetTPCCrossedRows();
   Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
   if (esdTrack->GetTPCNclsF()>0) {
@@ -1192,6 +1288,41 @@ Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEve
   }
   if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
   
+  //kTOFout
+  if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
+    cuts[40]=kTRUE;
+
+  // TOF signal Dz cut
+  Float_t dxTOF = esdTrack->GetTOFsignalDx();
+  Float_t dzTOF = esdTrack->GetTOFsignalDz();
+  if (fFlagCutTOFdistance && (esdTrack->GetStatus() & AliESDtrack::kTOFout) == AliESDtrack::kTOFout){ // applying the TOF distance cut only if requested, and only on tracks that reached the TOF and where associated with a TOF hit 
+         if (fgBeamTypeFlag < 0) {  // the check on the beam type was not done yet
+                 const AliESDEvent* event = esdTrack->GetESDEvent();
+                 if (event){
+                         TString beamTypeESD = event->GetBeamType();
+                         AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
+                         if (beamTypeESD.CompareTo("A-A",TString::kIgnoreCase) == 0){ // we are in PbPb collisions --> fgBeamTypeFlag will be set to 1, to apply the cut on TOF signal Dz
+                                 fgBeamTypeFlag = 1;
+                         }
+                         else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
+                                 fgBeamTypeFlag = 0;
+                         }                               
+                 }
+                 else{
+                         AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
+                 }
+         }
+
+         if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
+                 Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
+                 AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
+                 if (radiusTOF > fCutTOFdistance){
+                         AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
+                         cuts[41] = kTRUE;
+                 }
+         }
+  }
+  
   Bool_t cut=kFALSE;
   for (Int_t i=0; i<kNCuts; i++) 
     if (cuts[i]) {cut = kTRUE;}
@@ -1221,8 +1352,10 @@ Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEve
     // max chi2 TPC constrained vs global track only if track passed the other cut
     if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
     {
+      const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
+      
       if (!esdEvent)
-       AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not provided.");
+       AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
       
       // get vertex
       const AliESDVertex* vertex = 0;
@@ -1245,7 +1378,7 @@ Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEve
       }
     }
   }
-  
+
   //########################################################################
   // filling histograms
   if (fHistogramsOn) {
@@ -1301,6 +1434,7 @@ Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack, const AliESDEve
 
       fhPt[id]->Fill(pt);
       fhEta[id]->Fill(eta);
+      fhTOFdistance[id]->Fill(dxTOF, dzTOF);
 
       Float_t bRes[2];
       bRes[0] = TMath::Sqrt(bCov[0]);
@@ -1404,7 +1538,7 @@ TObjArray* AliESDtrackCuts::GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTP
       if (!tpcTrack)
         continue;
 
-      if (AcceptTrack(tpcTrack, esd)) {
+      if (AcceptTrack(tpcTrack)) {
         acceptedTracks->Add(tpcTrack);
       }
       else
@@ -1413,7 +1547,7 @@ TObjArray* AliESDtrackCuts::GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTP
     else
     {
       AliESDtrack* track = esd->GetTrack(iTrack);
-      if(AcceptTrack(track, esd))
+      if(AcceptTrack(track))
         acceptedTracks->Add(track);
     }
   } 
@@ -1433,7 +1567,7 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
   // loop over esd tracks
   for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
     AliESDtrack* track = esd->GetTrack(iTrack);
-    if (AcceptTrack(track, esd))
+    if (AcceptTrack(track))
       count++;
   }
 
@@ -1505,6 +1639,7 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
 
     fhPt[i]                  = new TH1F("pt"     ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
     fhEta[i]                 = new TH1F("eta"     ,"#eta distribution;#eta",40,-2.0,2.0);
+    fhTOFdistance[i]         = new TH2F("TOFdistance"     ,"TOF distance;dx (cm};dz (cm)", 150, -15, 15, 150, -15, 15);
     
     fhNClustersITS[i]->SetTitle("n ITS clusters");
     fhNClustersTPC[i]->SetTitle("n TPC clusters");
@@ -1626,6 +1761,7 @@ Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
 
     fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
     fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
+    fhTOFdistance[i] = dynamic_cast<TH2F*> (gDirectory->Get("TOFdistance"));
 
     gDirectory->cd("../");
   }
@@ -1699,6 +1835,7 @@ void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
 
     fhPt[i]                  ->Write();
     fhEta[i]                 ->Write();
+    fhTOFdistance[i]         ->Write();
     
     gDirectory->cd("../");
   }
@@ -2203,3 +2340,15 @@ Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstT
 
   return multiplicityEstimate;
 }
+
+//____________________________________________________________________
+void AliESDtrackCuts::SetRequireStandardTOFmatchCuts(){
+
+       // setting the TOF cuts flags (kTOFout = TOF matching distance) to true, to include the selection on the standard TOF matching 
+
+       SetRequireTOFout(kTRUE);
+       SetFlagCutTOFdistance(kTRUE);
+       SetCutTOFdistance(3.);
+
+}
+