]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/hfe/AliHFEcuts.cxx
Update of the HFE package
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEcuts.cxx
index 96cc2506522d75c005cdf279750220519c980fd7..beb95138dee0db0d061cbaee52518758893ba8d0 100644 (file)
 #include "AliCFTrackKineCuts.h"
 #include "AliCFTrackQualityCuts.h"
 #include "AliESDtrack.h"
+#include "AliHFEextraEventCuts.h"
 
 #include "AliHFEcuts.h"
 
 ClassImp(AliHFEcuts)
 
+const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
+  "MCGenerated",
+  "MCGeneratedZOutNoPileUpCentralityFine",
+  "MCGeneratedEventCut",
+  "MCInAcceptance"
+};
+
+const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
+  "NoCuts",
+  "RecKineITSTPC",
+  "Primary",
+  "HFEITS",
+  "HFETOF",
+  "HFETRD"
+};
+
+const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
+  "HFEDCA"
+};
+
+const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
+  "HFESecvtx"
+};
+
+const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
+  "EventStepGenerated",
+  "EventStepRecNoCut",
+  "EventStepRecNoPileUp",
+  "EventStepZRange",
+  "EventStepReconstructed"
+};
+
+const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
+
 //__________________________________________________________________
 AliHFEcuts::AliHFEcuts():
   TNamed(),
   fRequirements(0),
+  fTPCclusterDef(AliHFEextraCuts::kFound),
+  fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
   fMinClustersTPC(0),
+  fMinClustersITS(0),
   fMinTrackletsTRD(0),
   fCutITSPixel(0),
   fCheckITSLayerStatus(kTRUE),
   fMaxChi2clusterTPC(0.),
   fMinClusterRatioTPC(0.),
   fSigmaToVtx(0.),
+  fVertexRangeZ(20.),
+  fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
+  fFractionOfSharedTPCClusters(-1.0),
+  fMaxImpactParameterRpar(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -94,13 +139,23 @@ AliHFEcuts::AliHFEcuts():
 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   TNamed(name, title),
   fRequirements(0),
+  fTPCclusterDef(AliHFEextraCuts::kFound),
+  fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
   fMinClustersTPC(0),
+  fMinClustersITS(0),
   fMinTrackletsTRD(0),
   fCutITSPixel(0),
   fCheckITSLayerStatus(kTRUE),
   fMaxChi2clusterTPC(0.),
   fMinClusterRatioTPC(0.),
   fSigmaToVtx(0.),
+  fVertexRangeZ(20.),
+  fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
+  fFractionOfSharedTPCClusters(-1.0),
+  fMaxImpactParameterRpar(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -111,19 +166,30 @@ AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   memset(fProdVtx, 0, sizeof(Double_t) * 4);
   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
   memset(fPtRange, 0, sizeof(Double_t) * 2);
+  memset(fIPCutParams, 0, sizeof(Float_t) * 4);
 }
 
 //__________________________________________________________________
 AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
   TNamed(c),
   fRequirements(c.fRequirements),
+  fTPCclusterDef(c.fTPCclusterDef),
+  fTPCratioDef(c.fTPCratioDef),
   fMinClustersTPC(0),
+  fMinClustersITS(0),
   fMinTrackletsTRD(0),
   fCutITSPixel(0),
   fCheckITSLayerStatus(0),
   fMaxChi2clusterTPC(0),
   fMinClusterRatioTPC(0),
   fSigmaToVtx(0),
+  fVertexRangeZ(20.),
+  fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
+  fFractionOfSharedTPCClusters(-1.0),
+  fMaxImpactParameterRpar(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -151,18 +217,29 @@ void AliHFEcuts::Copy(TObject &c) const {
   AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
 
   target.fRequirements = fRequirements;
+  target.fTPCclusterDef = fTPCclusterDef;
+  target.fTPCratioDef = fTPCratioDef;
   target.fMinClustersTPC = fMinClustersTPC;
+  target.fMinClustersITS = fMinClustersITS;
   target.fMinTrackletsTRD = fMinTrackletsTRD;
   target.fCutITSPixel = fCutITSPixel;
   target.fCheckITSLayerStatus = fCheckITSLayerStatus;
   target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
   target.fMinClusterRatioTPC = fMinClusterRatioTPC;
   target.fSigmaToVtx = fSigmaToVtx;
+  target.fVertexRangeZ = fVertexRangeZ;
+  target.fTOFPIDStep = fTOFPIDStep;
+  target.fTOFMISMATCHStep = fTOFMISMATCHStep;
+  target.fUseMixedVertex = fUseMixedVertex;
+  target.fIsIPSigmacut = fIsIPSigmacut;
+  target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
+  target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
   target.fDebugLevel = 0;
 
   memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
   memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
   memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
+  memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
 
   // Copy cut List
   if(target.fCutList){
@@ -171,18 +248,16 @@ void AliHFEcuts::Copy(TObject &c) const {
   }
   if(fCutList){
     target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
-    target.fCutList->SetOwner();
+    if(target.fCutList) target.fCutList->SetOwner(); // Coverity
   }
   if(target.fHistQA){
-    target.fHistQA->Clear();
     delete target.fHistQA;
-    target.fHistQA = NULL;
   }
   if(fHistQA){
     // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
     target.fHistQA = new TList;
     target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
-    fHistQA->SetOwner(kFALSE);
+    fHistQA->SetOwner(kTRUE);
     TIter cit(target.fCutList);
     TObjArray *clist = NULL;
     AliCFCutBase *co = NULL;
@@ -203,8 +278,7 @@ AliHFEcuts::~AliHFEcuts(){
     delete fCutList;
   }
   fCutList = 0x0;
-  if(fHistQA) fHistQA->Clear();
-  delete fHistQA;
+  if(fHistQA) delete fHistQA;
 }
 
 //__________________________________________________________________
@@ -214,6 +288,8 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
   // Publishes the cuts to the correction framework manager
   //
   AliDebug(2, "Called");
+  const Int_t kMCOffset = kNcutStepsMCTrack;
+  const Int_t kRecOffset = kNcutStepsRecTrack;
   if(fCutList)
     fCutList->Delete();
   else{
@@ -223,7 +299,7 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
   if(IsQAOn()){
     fHistQA = new TList;
     fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
-    fHistQA->SetOwner(kFALSE);
+    fHistQA->SetOwner(kTRUE);
   }
  
   // Call all the setters for the cuts
@@ -232,7 +308,9 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
   SetRecKineITSTPCCutList();
   SetRecPrimaryCutList();
   SetHFElectronITSCuts();
+  SetHFElectronTOFCuts();
   SetHFElectronTRDCuts();
+  SetHFElectronDcaCuts();
 
   // Publish to the cuts which analysis type they are (ESD Analysis by default)
   if(IsAOD()){
@@ -251,12 +329,16 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
   cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
   
   // Connect the particle cuts
+  // 1st MC
   cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
   cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
-  cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
-  cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
-  cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
-  cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
+  // 2nd Reco
+  cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
+  cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
+  cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
+  cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
+  cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
+  cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
 
 }
 
@@ -280,7 +362,14 @@ void AliHFEcuts::Initialize(){
   SetRecKineITSTPCCutList();
   SetRecPrimaryCutList();
   SetHFElectronITSCuts();
+  SetHFElectronTOFCuts();
   SetHFElectronTRDCuts();
+  SetHFElectronDcaCuts();
+
+  // Connect the event cuts
+  SetEventCutList(kEventStepGenerated);
+  SetEventCutList(kEventStepReconstructed);
+
 
 }
 
@@ -293,25 +382,39 @@ void AliHFEcuts::SetEventCutList(Int_t istep){
   TObjArray *arr = new TObjArray;
   if(istep == kEventStepGenerated){
     AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
-    evGenCuts->SetNTracksCut(1);
+    //evGenCuts->SetNTracksCut(1);
     evGenCuts->SetRequireVtxCuts(kTRUE);
-    evGenCuts->SetVertexXCut(-1, 1);
-    evGenCuts->SetVertexYCut(-1, 1);
-    evGenCuts->SetVertexZCut(-10, 10);
+    //evGenCuts->SetVertexXCut(-1, 1);
+    //evGenCuts->SetVertexYCut(-1, 1);
+    evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+    if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
 
     arr->SetName("fEvGenCuts");
     arr->AddLast(evGenCuts);
   } else {
-    AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
-    evRecCuts->SetNTracksCut(1);
-    evRecCuts->SetRequireVtxCuts(kTRUE);
-    evRecCuts->SetVertexXCut(-1, 1);
-    evRecCuts->SetVertexYCut(-1, 1);
-    evRecCuts->SetVertexZCut(-30, 30);
-
 
-    arr->SetName("fEvRecCuts");
-    arr->AddLast(evRecCuts);
+    if(!fUseMixedVertex) {
+      AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+      //evRecCuts->SetNTracksCut(1);
+      evRecCuts->SetRequireVtxCuts(kTRUE);
+      //evRecCuts->SetVertexXCut(-1, 1);
+      //evRecCuts->SetVertexYCut(-1, 1);
+      //evRecCuts->SetVertexZCut(-30, 30);
+      evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+      evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+      if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+      arr->SetName("fEvRecCuts");
+      arr->AddLast(evRecCuts);
+    } else {
+      AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+      evRecCuts->SetRequireVtxCuts(kTRUE);
+      evRecCuts->SetUseMixedVertex();
+      evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+      //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+      if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+      arr->SetName("fEvRecCuts");
+      arr->AddLast(evRecCuts);
+    }
   }
   fCutList->AddLast(arr);
 }
@@ -320,9 +423,9 @@ void AliHFEcuts::SetEventCutList(Int_t istep){
 void AliHFEcuts::SetParticleGenCutList(){
   //
   // Initialize Particle Cuts for Monte Carlo Tracks
-  // Production Vertex: < 1cm (Beampipe)
+  // Production Vertex Radius: < 3cm
   // Particle Species: Electrons
-  // Eta: < 0.9 (TRD-TOF acceptance)
+  // Eta: < 0.8
   //
   
   TObjArray *mcCuts = new TObjArray;
@@ -406,15 +509,18 @@ void AliHFEcuts::SetRecKineITSTPCCutList(){
   //
   AliDebug(2, "Called\n");
   AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
-  trackQuality->SetMinNClusterITS(4);
-  trackQuality->SetMinNClusterTPC(fMinClustersTPC);
+  trackQuality->SetMinNClusterITS(fMinClustersITS);
   trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
   trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
-  trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2); 
+  //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2); 
 
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
-  if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
   hfecuts->SetDebugLevel(fDebugLevel);
+
+  // Set the cut in the TPC number of clusters
+  hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
+  hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
+  if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters); 
   
   AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
   kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
@@ -457,9 +563,15 @@ void AliHFEcuts::SetRecPrimaryCutList(){
   primaryCut->SetAcceptKinkDaughters(kFALSE);
   if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
   
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
+  hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
+
   TObjArray *primCuts = new TObjArray;
   primCuts->SetName("fPartPrimCuts");
   primCuts->AddLast(primaryCut);
+  if(fMaxImpactParameterRpar){
+    primCuts->AddLast(hfecuts);
+  }
   fCutList->AddLast(primCuts);
 }
 
@@ -484,13 +596,31 @@ void AliHFEcuts::SetHFElectronITSCuts(){
   fCutList->AddLast(hfeCuts);
 }
 
+//__________________________________________________________________
+void AliHFEcuts::SetHFElectronTOFCuts(){
+  //
+  // Special Cuts introduced by the HFElectron Group: TRD
+  //
+  AliDebug(2, "Called\n");
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
+  if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
+  if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
+  if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
+  hfecuts->SetDebugLevel(fDebugLevel);
+  
+  TObjArray *hfeCuts = new TObjArray;
+  hfeCuts->SetName("fPartHFECutsTOF");
+  hfeCuts->AddLast(hfecuts);
+  fCutList->AddLast(hfeCuts);
+}
+
 //__________________________________________________________________
 void AliHFEcuts::SetHFElectronTRDCuts(){
   //
   // Special Cuts introduced by the HFElectron Group: TRD
   //
   AliDebug(2, "Called\n");
-  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
   if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
@@ -502,20 +632,55 @@ void AliHFEcuts::SetHFElectronTRDCuts(){
 }
 
 //__________________________________________________________________
-Bool_t AliHFEcuts::CheckParticleCuts(CutStep_t step, TObject *o){
+void AliHFEcuts::SetHFElectronDcaCuts(){
+  //
+  // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
+  //
+  AliDebug(2, "Called\n");
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
+  hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut);
+  if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
+  hfecuts->SetDebugLevel(fDebugLevel);
+
+  TObjArray *hfeCuts = new TObjArray;
+  hfeCuts->SetName("fPartHFECutsDca");
+  hfeCuts->AddLast(hfecuts);
+  fCutList->AddLast(hfeCuts);
+}
+
+//__________________________________________________________________
+Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
   //
   // Checks the cuts without using the correction framework manager
   // 
   AliDebug(2, "Called\n");
-  TString stepnames[kNcutStepsTrack] = {"fPartGenCuts","fPartSignal","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTRD","fPartHFEPid"};
+  TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
+  AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
  TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
   if(!cuts) return kTRUE;
-  TIterator *it = cuts->MakeIterator();
+  TIter it(cuts);
+  AliCFCutBase *mycut;
+  Bool_t status = kTRUE;
+  while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
+    status &= mycut->IsSelected(o);
+  }
+  return status;
+}
+
+
+//__________________________________________________________________
+Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
+  //
+  // Checks the cuts without using the correction framework manager
+  // 
+  AliDebug(2, "Called\n");
+  TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
+  if(!cuts) return kTRUE;
+  TIter it(cuts);
   AliCFCutBase *mycut;
   Bool_t status = kTRUE;
-  while((mycut = dynamic_cast<AliCFCutBase *>(it->Next()))){
+  while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
     status &= mycut->IsSelected(o);
   }
-  delete it;
   return status;
 }