]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/hfe/AliHFEcuts.cxx
check the leading particle in the cone, apply the isolation cone condition just on...
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEcuts.cxx
index 8274e951f503b07da531b596e46257e9d4142ee3..53b39eae53e7f44d0dda4da60083f1f9219a4299 100644 (file)
@@ -58,7 +58,6 @@
 #include "AliCFAcceptanceCuts.h"
 #include "AliCFCutBase.h"
 #include "AliCFEventGenCuts.h"
-#include "AliCFEventRecCuts.h"
 #include "AliCFManager.h"
 #include "AliCFParticleGenCuts.h"
 #include "AliCFTrackIsPrimaryCuts.h"
@@ -66,6 +65,8 @@
 #include "AliCFTrackQualityCuts.h"
 #include "AliESDtrack.h"
 #include "AliHFEextraEventCuts.h"
+#include "AliMCEvent.h"
+#include "AliVEvent.h"
 
 #include "AliHFEcuts.h"
 
@@ -111,24 +112,42 @@ const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
 AliHFEcuts::AliHFEcuts():
   TNamed(),
   fRequirements(0),
-  fTPCclusterDef(AliHFEextraCuts::kFound),
-  fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
+  fTPCclusterDef(0),
+  fTPCratioDef(0),
   fMinClustersTPC(0),
+  fMinClustersTPCPID(0),
   fMinClustersITS(0),
   fMinTrackletsTRD(0),
+  fMaxChi2TRD(-1.),
   fCutITSPixel(0),
   fCheckITSLayerStatus(kTRUE),
+  fCutITSDrift(0),
   fMaxChi2clusterITS(-1.),
   fMaxChi2clusterTPC(0.),
   fMinClusterRatioTPC(0.),
   fVertexRangeZ(20.),
+  fTRDtrackletsExact(kFALSE),
   fTOFPIDStep(kFALSE),
+  fMatchTOFLabel(kFALSE),
   fTOFMISMATCHStep(kFALSE),
   fTPCPIDCLEANUPStep(kFALSE),
+  fITSpatternCut(kFALSE),
   fUseMixedVertex(kTRUE),
+  fUseSPDVertex(kFALSE),
+  fUseCorrelationVertex(kFALSE),
+  fSPDVtxResolution(kFALSE), 
+  fPApileupCut(kFALSE),
   fIsIPSigmacut(kFALSE),
+  fIsIPcharge(kFALSE),
+  fIsIPOpp(kFALSE),
   fFractionOfSharedTPCClusters(-1.0),
   fMaxImpactParameterRpar(kFALSE),
+  fAdditionalStatusRequirement(0),
+  fTOFsignaldx(-1.0),
+  fTOFsignaldz(-1.0),
+  fAODFilterBit(-1),
+  fRejectKinkDaughters(kTRUE),
+  fRejectKinkMothers(kTRUE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -137,35 +156,55 @@ AliHFEcuts::AliHFEcuts():
   // Dummy Constructor
   //
   memset(fProdVtx, 0, sizeof(Double_t) * 4);
+  memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
   memset(fPtRange, 0, sizeof(Double_t) * 2);
   memset(fIPCutParams, 0, sizeof(Float_t) * 4);
   memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
-
+  fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
+  fPhiRange[0] = -1.; fPhiRange[1] = -1.;
 }
 
 //__________________________________________________________________
 AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   TNamed(name, title),
   fRequirements(0),
-  fTPCclusterDef(AliHFEextraCuts::kFound),
-  fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
+  fTPCclusterDef(0),
+  fTPCratioDef(0),
   fMinClustersTPC(0),
+  fMinClustersTPCPID(0),
   fMinClustersITS(0),
   fMinTrackletsTRD(0),
+  fMaxChi2TRD(-1.),
   fCutITSPixel(0),
   fCheckITSLayerStatus(kTRUE),
+  fCutITSDrift(0),
   fMaxChi2clusterITS(-1.),
   fMaxChi2clusterTPC(0.),
   fMinClusterRatioTPC(0.),
   fVertexRangeZ(20.),
+  fTRDtrackletsExact(kFALSE),
   fTOFPIDStep(kFALSE),
+  fMatchTOFLabel(kFALSE),
   fTOFMISMATCHStep(kFALSE),
   fTPCPIDCLEANUPStep(kFALSE),
+  fITSpatternCut(kFALSE),
   fUseMixedVertex(kTRUE),
+  fUseSPDVertex(kFALSE),
+  fUseCorrelationVertex(kFALSE),
+  fSPDVtxResolution(kFALSE),
+  fPApileupCut(kFALSE),
   fIsIPSigmacut(kFALSE),
+  fIsIPcharge(kFALSE),
+  fIsIPOpp(kFALSE),
   fFractionOfSharedTPCClusters(-1.0),
   fMaxImpactParameterRpar(kFALSE),
+  fAdditionalStatusRequirement(0),
+  fTOFsignaldx(-1.0),
+  fTOFsignaldz(-1.0),
+  fAODFilterBit(-1),
+  fRejectKinkDaughters(kTRUE),
+  fRejectKinkMothers(kTRUE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -174,10 +213,13 @@ AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   // Default Constructor
   //
   memset(fProdVtx, 0, sizeof(Double_t) * 4);
+  memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
   memset(fPtRange, 0, sizeof(Double_t) * 2);
   memset(fIPCutParams, 0, sizeof(Float_t) * 4);
   memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
+  fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
+  fPhiRange[0] = -1.; fPhiRange[1] = -1.;
 }
 
 //__________________________________________________________________
@@ -187,21 +229,39 @@ AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
   fTPCclusterDef(c.fTPCclusterDef),
   fTPCratioDef(c.fTPCratioDef),
   fMinClustersTPC(0),
+  fMinClustersTPCPID(0),
   fMinClustersITS(0),
   fMinTrackletsTRD(0),
+  fMaxChi2TRD(-1.),
   fCutITSPixel(0),
   fCheckITSLayerStatus(0),
+  fCutITSDrift(0),
   fMaxChi2clusterITS(-1.),
   fMaxChi2clusterTPC(0),
   fMinClusterRatioTPC(0),
   fVertexRangeZ(20.),
+  fTRDtrackletsExact(kFALSE),
   fTOFPIDStep(kFALSE),
+  fMatchTOFLabel(kFALSE),
   fTOFMISMATCHStep(kFALSE),
   fTPCPIDCLEANUPStep(kFALSE),
+  fITSpatternCut(c.fITSpatternCut),
   fUseMixedVertex(kTRUE),
+  fUseSPDVertex(kFALSE),
+  fUseCorrelationVertex(c.fUseCorrelationVertex),
+  fSPDVtxResolution(c.fSPDVtxResolution),
+  fPApileupCut(c.fPApileupCut),
   fIsIPSigmacut(kFALSE),
+  fIsIPcharge(kFALSE),
+  fIsIPOpp(kFALSE),
   fFractionOfSharedTPCClusters(-1.0),
   fMaxImpactParameterRpar(kFALSE),
+  fAdditionalStatusRequirement(0),
+  fTOFsignaldx(-1.0),
+  fTOFsignaldz(-1.0),
+  fAODFilterBit(-1),
+  fRejectKinkDaughters(c.fRejectKinkDaughters),
+  fRejectKinkMothers(c.fRejectKinkMothers),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -232,28 +292,48 @@ void AliHFEcuts::Copy(TObject &c) const {
   target.fTPCclusterDef = fTPCclusterDef;
   target.fTPCratioDef = fTPCratioDef;
   target.fMinClustersTPC = fMinClustersTPC;
+  target.fMinClustersTPCPID = fMinClustersTPCPID;
   target.fMinClustersITS = fMinClustersITS;
   target.fMinTrackletsTRD = fMinTrackletsTRD;
+  target.fMaxChi2TRD  = fMaxChi2TRD;
   target.fCutITSPixel = fCutITSPixel;
   target.fCheckITSLayerStatus = fCheckITSLayerStatus;
+  target.fCutITSDrift = fCutITSDrift;
   target.fMaxChi2clusterITS = fMaxChi2clusterITS;
   target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
   target.fMinClusterRatioTPC = fMinClusterRatioTPC;
   target.fVertexRangeZ = fVertexRangeZ;
+  target.fTRDtrackletsExact = fTRDtrackletsExact;
   target.fTOFPIDStep = fTOFPIDStep;
+  target.fMatchTOFLabel = fMatchTOFLabel;
   target.fTOFMISMATCHStep = fTOFMISMATCHStep;
   target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
   target.fUseMixedVertex = fUseMixedVertex;
+  target.fUseSPDVertex = fUseSPDVertex;
+  target.fUseCorrelationVertex = fUseCorrelationVertex;
+  target.fSPDVtxResolution = fSPDVtxResolution;
+  target.fPApileupCut = fPApileupCut;
   target.fIsIPSigmacut = fIsIPSigmacut;
+  target.fIsIPcharge = fIsIPcharge;
+  target.fIsIPOpp = fIsIPOpp;
   target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
   target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
+  target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
+  target.fTOFsignaldx = fTOFsignaldx;
+  target.fTOFsignaldz = fTOFsignaldz;
+  target.fAODFilterBit = fAODFilterBit;
+  target.fRejectKinkDaughters = fRejectKinkDaughters;
+  target.fRejectKinkMothers = fRejectKinkMothers;
   target.fDebugLevel = 0;
 
   memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
+  memcpy(target.fProdVtxZ, fProdVtxZ, sizeof(Double_t) * 2);
   memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
   memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
   memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
   memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
+  memcpy(target.fEtaRange, fEtaRange, sizeof(Double_t) * 2);
+  memcpy(target.fPhiRange, fPhiRange, sizeof(Double_t) * 2);
 
   // Copy cut List
   if(target.fCutList){
@@ -347,7 +427,9 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
     TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
     if(genCuts){
       AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
-      if(myGenCut) myGenCut->SetAODMC(kTRUE);
+      if(myGenCut) {
+       myGenCut->SetAODMC(kTRUE);
+      }
     }
   }
 
@@ -394,9 +476,23 @@ void AliHFEcuts::Initialize(){
   SetHFElectronITSCuts();
   SetHFElectronTOFCuts();
   SetHFElectronTPCCuts();
-  SetHFElectronTRDCuts();
+  SetHFElectronTRDCuts();  
   SetHFElectronDcaCuts();
 
+  // Publish to the cuts which analysis type they are (ESD Analysis by default)
+  if(IsAOD()){
+    //printf("Initialize AOD\n");
+    //AliInfo("Setting AOD Analysis");
+    TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
+    if(genCuts){
+      AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
+      if(myGenCut) {
+       myGenCut->SetAODMC(kTRUE);
+       //printf("Set AOD MC\n");
+      }
+    }
+  }
+
   // Connect the event cuts
   SetEventCutList(kEventStepGenerated);
   SetEventCutList(kEventStepReconstructed);
@@ -424,29 +520,20 @@ void AliHFEcuts::SetEventCutList(Int_t istep){
     arr->AddLast(evGenCuts);
   } else {
 
-    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);
-    }
-  }
+    AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+    evRecCuts->SetRequireVtxCuts(kTRUE);
+    if(fUseSPDVertex) evRecCuts->SetUseSPDVertex();
+    if(fUseMixedVertex) evRecCuts->SetUseMixedVertex();
+    if(fUseCorrelationVertex) evRecCuts->SetCheckCorrelationSPDVtx();
+    if(fSPDVtxResolution) evRecCuts->SetCheckSPDResolution();
+    if(fPApileupCut) evRecCuts->SetpAPileupCut();
+    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);
 }
 
@@ -456,7 +543,7 @@ void AliHFEcuts::SetParticleGenCutList(){
   // Initialize Particle Cuts for Monte Carlo Tracks
   // Production Vertex Radius: < 3cm
   // Particle Species: Electrons
-  // Eta: < 0.8
+  // Eta: < 0.8 (fEtaRange)
   //
   
   TObjArray *mcCuts = new TObjArray;
@@ -470,10 +557,18 @@ void AliHFEcuts::SetParticleGenCutList(){
     genCuts->SetRequireIsPrimary();
   }
   if(IsRequireProdVertex()){
-    AliDebug(3, Form("Vertex Range: fProdVtx[0] %f, fProdVtx[1] %f, fProdVtx[2] %f, fProdVtx[3] %f", fProdVtx[0], fProdVtx[1], fProdVtx[2], fProdVtx[3]));
+    AliDebug(3, Form("Vertex Range: fProdVtx[0] %f, fProdVtx[1] %f, fProdVtx[2] %f, fProdVtx[3] %f, fProdVtxZ[0] %f, fProdVtx[1] %f", fProdVtx[0], fProdVtx[1], fProdVtx[2], fProdVtx[3], fProdVtxZ[0], fProdVtxZ[1]));
+    //if(!IsAOD()) {
     genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
     genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
+    genCuts->SetProdVtxRangeZ(fProdVtxZ[0], fProdVtxZ[1]);
     genCuts->SetProdVtxRange2D(kTRUE);  // Use ellipse
+    //}
+    //else {
+      // (ONLY PROVISOIRE FOR MC AOD)
+    // genCuts->SetProdVtxRangeX(-TMath::Abs(fProdVtx[1]), TMath::Abs(fProdVtx[1]));
+    // genCuts->SetProdVtxRangeY(-TMath::Abs(fProdVtx[3]), TMath::Abs(fProdVtx[3]));
+    //}
   }
   genCuts->SetRequirePdgCode(11, kTRUE);
   if(IsQAOn()) genCuts->SetQAOn(fHistQA);
@@ -485,7 +580,9 @@ void AliHFEcuts::SetParticleGenCutList(){
   if(IsRequireKineMCCuts()) {  
     AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
     kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
-    kineMCcuts->SetEtaRange(-0.8, 0.8);
+    //kineMCcuts->SetEtaRange(-0.8, 0.8);
+    kineMCcuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
+    if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineMCcuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
     if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
     mcCuts->AddLast(kineMCcuts);
   }
@@ -538,25 +635,37 @@ void AliHFEcuts::SetRecKineITSTPCCutList(){
   //  Momentum Range: 100MeV - 20GeV
   //  Eta: < 0.9 (TRD-TOF acceptance)
   //
+  const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
   AliDebug(2, "Called\n");
   AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
-  trackQuality->SetMinNClusterITS(fMinClustersITS);
+  //trackQuality->SetMinNClusterITS(fMinClustersITS);
   trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
   if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
-  trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
+  Long_t statusRequirement;
+  if(fAdditionalStatusRequirement)
+    statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
+  else
+    statusRequirement = kStatusSelectionDefault;
+  trackQuality->SetStatus(statusRequirement);
   //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2); 
 
-  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
   hfecuts->SetDebugLevel(fDebugLevel);
-
+  hfecuts->SetMinNbITScls(fMinClustersITS);
   // Set the cut in the TPC number of clusters
-  hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
-  hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
+  hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
+  hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
+  hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
   if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters); 
+  if(fITSpatternCut) hfecuts->SetITSpatternCut();
+  if(fAODFilterBit > -1) hfecuts->SetAODFilterBit(fAODFilterBit);
   
   AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
+  //printf("Setting max. pt to %f\n", fPtRange[1]);
   kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
-  kineCuts->SetEtaRange(-0.8, 0.8);
+  //kineCuts->SetEtaRange(-0.8, 0.8);
+  kineCuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
+  if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineCuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
   
   if(IsQAOn()){
     trackQuality->SetQAOn(fHistQA);
@@ -583,29 +692,36 @@ void AliHFEcuts::SetRecPrimaryCutList(){
   //
   AliDebug(2, "Called\n");
   AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
-  if(IsRequireDCAToVertex()){
+  //if(IsRequireDCAToVertex()){
     //primaryCut->SetDCAToVertex2D(kTRUE);
-    primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
-    primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
-  }
+    //primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
+    //primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
+  //}
   if(IsRequireSigmaToVertex()){
     primaryCut->SetRequireSigmaToVertex(kTRUE);
     if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
     if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
     if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
   }
-  primaryCut->SetAcceptKinkDaughters(kFALSE);
+  //primaryCut->SetAcceptKinkDaughters(kFALSE);
   if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
   
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
   hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
+  if(fRejectKinkDaughters) hfecuts->SetRejectKinkDaughter();
+  if(fRejectKinkMothers) hfecuts->SetRejectKinkMother();
+  if(IsRequireDCAToVertex()){
+    hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
+    hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
+  }
 
   TObjArray *primCuts = new TObjArray;
   primCuts->SetName("fPartPrimCuts");
-  primCuts->AddLast(primaryCut);
-  if(fMaxImpactParameterRpar){
-    primCuts->AddLast(hfecuts);
-  }
+  // needed for AOD...
+  if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
+  //if(fMaxImpactParameterRpar){
+  primCuts->AddLast(hfecuts);
+  //}
   fCutList->AddLast(primCuts);
 }
 
@@ -620,6 +736,9 @@ void AliHFEcuts::SetHFElectronITSCuts(){
     hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
     hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
   }
+  if(IsRequireITSdrift()){
+    hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
+  }
   
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
@@ -639,6 +758,8 @@ void AliHFEcuts::SetHFElectronTOFCuts(){
   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(fMatchTOFLabel) hfecuts->SetMatchTOFLabel(kTRUE);
+  if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
   
@@ -654,7 +775,7 @@ void AliHFEcuts::SetHFElectronTPCCuts(){
   // Special Cuts introduced by the HFElectron Group: TPC
   //
   AliDebug(2, "Called\n");
-  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group on TPC PID");
+  AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
   if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
@@ -673,7 +794,10 @@ void AliHFEcuts::SetHFElectronTRDCuts(){
   //
   AliDebug(2, "Called\n");
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
-  if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
+  if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
+  if(fMaxChi2TRD >= 0)
+    hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
+  
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
   
@@ -690,7 +814,7 @@ void AliHFEcuts::SetHFElectronDcaCuts(){
   //
   AliDebug(2, "Called\n");
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
-  hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut);
+  hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPcharge,fIsIPOpp);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
 
@@ -736,3 +860,35 @@ Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
   }
   return status;
 }
+
+//__________________________________________________________________
+void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
+  //
+  // Publish reconstructed event to the cuts
+  //
+  TIter cutsteps(fCutList);
+  TObjArray *cutstep;
+  AliCFCutBase *cut;
+  while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
+    TIter cutIter(cutstep);
+    while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
+      cut->SetRecEventInfo(ev);
+    }
+  }
+}
+
+//__________________________________________________________________
+void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
+  //
+  // Publish reconstructed event to the cuts
+  //
+  TIter cutsteps(fCutList);
+  TObjArray *cutstep;
+  AliCFCutBase *cut;
+  while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
+    TIter cutIter(cutstep);
+    while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
+      cut->SetMCEventInfo(ev);
+    }
+  }
+}