]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/hfe/AliHFEextraCuts.cxx
Major update of the HFE package (comments inside the code
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEextraCuts.cxx
index 54f522aa9dc67a2137a157db5c560955791050f2..ed0e7c036e2e96c2b62a5bdacae9d7b199030bf2 100644 (file)
@@ -22,6 +22,7 @@
 // Authors:
 //   Markus Fasel <M.Fasel@gsi.de>
 //
+#include <TBits.h>
 #include <TClass.h>
 #include <TH1F.h>
 #include <TH2F.h>
 #include <TString.h>
 #include <TMath.h>
 
+#include "AliAODTrack.h"
+#include "AliAODPid.h"
+#include "AliESDEvent.h"
+#include "AliESDVertex.h"
 #include "AliESDtrack.h"
+#include "AliLog.h"
 #include "AliMCParticle.h"
+#include "AliVEvent.h"
+#include "AliVTrack.h"
+#include "AliVParticle.h"
+#include "AliVertexerTracks.h"
+#include "AliVVertex.h"
 
 #include "AliHFEextraCuts.h"
 
@@ -39,13 +50,16 @@ ClassImp(AliHFEextraCuts)
 //______________________________________________________
 AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
   AliCFCutBase(name, title),
+  fEvent(NULL),
   fCutCorrelation(0),
   fRequirements(0),
+  fTPCiter1(kFALSE),
+  fMinNClustersTPC(0),
   fClusterRatioTPC(0.),
   fMinTrackletsTRD(0),
   fPixelITS(0),
-  fCheck(kTRUE),
-  fQAlist(0x0),
+  fCheck(kFALSE),
+  fQAlist(0x0) ,
   fDebugLevel(0)
 {
   //
@@ -57,14 +71,17 @@ AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
 //______________________________________________________
 AliHFEextraCuts::AliHFEextraCuts(const AliHFEextraCuts &c):
   AliCFCutBase(c),
+  fEvent(c.fEvent),
   fCutCorrelation(c.fCutCorrelation),
   fRequirements(c.fRequirements),
+  fTPCiter1(c.fTPCiter1),
+  fMinNClustersTPC(c.fMinNClustersTPC),
   fClusterRatioTPC(c.fClusterRatioTPC),
   fMinTrackletsTRD(c.fMinTrackletsTRD),
   fPixelITS(c.fPixelITS),
   fCheck(c.fCheck),
   fQAlist(0x0),
-  fDebugLevel(c.fDebugLevel)
+  fDebugLevel(0)
 {
   //
   // Copy constructor
@@ -85,14 +102,16 @@ AliHFEextraCuts &AliHFEextraCuts::operator=(const AliHFEextraCuts &c){
   //
   if(this != &c){
     AliCFCutBase::operator=(c);
+    fEvent = c.fEvent;
     fCutCorrelation = c.fCutCorrelation;
     fRequirements = c.fRequirements;
+    fTPCiter1 = c.fTPCiter1;
     fClusterRatioTPC = c.fClusterRatioTPC;
+    fMinNClustersTPC = c.fMinNClustersTPC;
     fMinTrackletsTRD = c.fMinTrackletsTRD;
     fPixelITS = c.fPixelITS;
     fCheck = c.fCheck;
     fDebugLevel = c.fDebugLevel;
-
     memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
     if(IsQAOn()){
       fIsQAOn = kTRUE;
@@ -108,10 +127,25 @@ AliHFEextraCuts::~AliHFEextraCuts(){
   //
   // Destructor
   //
-  if(fQAlist){
-    fQAlist->Delete();
-    delete fQAlist;
+  if(fQAlist) delete fQAlist;
+}
+
+//______________________________________________________
+void AliHFEextraCuts::SetRecEventInfo(const TObject *event){
+  //
+  // Set Virtual event an make a copy
+  //
+  if (!event) {
+    AliError("Pointer to AliVEvent !");
+    return;
+  }
+  TString className(event->ClassName());
+  if (! (className.CompareTo("AliESDEvent")==0 || className.CompareTo("AliAODEvent")==0)) {
+    AliError("argument must point to an AliESDEvent or AliAODEvent !");
+    return ;
   }
+  fEvent = (AliVEvent*) event;
+
 }
 
 //______________________________________________________
@@ -119,34 +153,45 @@ Bool_t AliHFEextraCuts::IsSelected(TObject *o){
   //
   // Steering function for the track selection
   //
-  if(TString(o->IsA()->GetName()).CompareTo("AliESDtrack") == 0){
-    return CheckESDCuts(dynamic_cast<AliESDtrack *>(o));
+  TString type = o->IsA()->GetName();
+  AliDebug(2, Form("Object type %s", type.Data()));
+  if(!type.CompareTo("AliESDtrack") || !type.CompareTo("AliAODTrack")){
+    return CheckRecCuts(dynamic_cast<AliVTrack *>(o));
   }
-  return CheckMCCuts(dynamic_cast<AliMCParticle *>(o));
+  return CheckMCCuts(dynamic_cast<AliVParticle *>(o));
 }
 
 //______________________________________________________
-Bool_t AliHFEextraCuts::CheckESDCuts(AliESDtrack *track){
+Bool_t AliHFEextraCuts::CheckRecCuts(AliVTrack *track){
   //
   // Checks cuts on reconstructed tracks
   // returns true if track is selected
   // QA histograms are filled before track selection and for
   // selected tracks after track selection
   //
+  AliDebug(1, "Called");
   ULong64_t survivedCut = 0;   // Bitmap for cuts which are passed by the track, later to be compared with fRequirements
-  if(IsQAOn()) FillQAhistosESD(track, kBeforeCuts);
+  if(IsQAOn()) FillQAhistosRec(track, kBeforeCuts);
   // Apply cuts
   Float_t impactR, impactZ, ratioTPC;
-  track->GetImpactParameters(impactR, impactZ);
+  Double_t hfeimpactR, hfeimpactnsigmaR;
+  Double_t hfeimpactRcut, hfeimpactnsigmaRcut;
+  GetImpactParameters(track, impactR, impactZ);
+  if(TESTBIT(fRequirements, kMinHFEImpactParamR) || TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
+    // Protection for PbPb
+    GetHFEImpactParameterCuts(track, hfeimpactRcut, hfeimpactnsigmaRcut);
+    GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
+  }
+  UInt_t nTPCf = GetTPCfindableClusters(track, fTPCiter1), nclsTPC = GetTPCncls(track, fTPCiter1);
   // printf("Check TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
-  ratioTPC = track->GetTPCNclsF() > 0. ? static_cast<Float_t>(track->GetTPCNcls())/static_cast<Float_t>(track->GetTPCNclsF()) : 1.;
+  ratioTPC = nTPCf > 0. ? static_cast<Float_t>(nclsTPC)/static_cast<Float_t>(nTPCf) : 1.;
   UChar_t trdTracklets;
-  trdTracklets = track->GetTRDntrackletsPID();
+  trdTracklets = GetTRDnTrackletsPID(track);
   UChar_t itsPixel = track->GetITSClusterMap();
-  Int_t det, status1, status2;
-  Float_t xloc, zloc;
-  track->GetITSModuleIndexInfo(0, det, status1, xloc, zloc);
-  track->GetITSModuleIndexInfo(1, det, status2, xloc, zloc);
+  Int_t status1 = GetITSstatus(track, 0);
+  Int_t status2 = GetITSstatus(track, 1);
+  Bool_t statusL0 = CheckITSstatus(status1);
+  Bool_t statusL1 = CheckITSstatus(status2);
   if(TESTBIT(fRequirements, kMinImpactParamR)){
     // cut on min. Impact Parameter in Radial direction
     if(TMath::Abs(impactR) >= fImpactParamCut[0]) SETBIT(survivedCut, kMinImpactParamR);
@@ -163,103 +208,86 @@ Bool_t AliHFEextraCuts::CheckESDCuts(AliESDtrack *track){
     // cut on max. Impact Parameter in Z direction
     if(TMath::Abs(impactZ) <= fImpactParamCut[3]) SETBIT(survivedCut, kMaxImpactParamZ);
   }
+  if(TESTBIT(fRequirements, kMinHFEImpactParamR)){
+    // cut on min. HFE Impact Parameter in Radial direction
+    if(TMath::Abs(hfeimpactR) >= hfeimpactRcut) SETBIT(survivedCut, kMinHFEImpactParamR);
+  }
+  if(TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
+    // cut on max. HFE Impact Parameter n sigma in Radial direction
+    if(TMath::Abs(hfeimpactnsigmaR) >= hfeimpactnsigmaRcut) SETBIT(survivedCut, kMinHFEImpactParamNsigmaR);
+  }
   if(TESTBIT(fRequirements, kClusterRatioTPC)){
     // cut on min ratio of found TPC clusters vs findable TPC clusters
     if(ratioTPC >= fClusterRatioTPC) SETBIT(survivedCut, kClusterRatioTPC);
   }
   if(TESTBIT(fRequirements, kMinTrackletsTRD)){
     // cut on minimum number of TRD tracklets
-    if(fDebugLevel > 0){
-      printf("Min TRD cut: [%d|%d]\n", fMinTrackletsTRD, trdTracklets);
-    }
+    AliDebug(1, Form("Min TRD cut: [%d|%d]\n", fMinTrackletsTRD, trdTracklets));
     if(trdTracklets >= fMinTrackletsTRD) SETBIT(survivedCut, kMinTrackletsTRD);
   }
+  if(TESTBIT(fRequirements, kMinNClustersTPC)){
+    // cut on minimum number of TRD tracklets
+    AliDebug(1, Form("Min TPC cut: [%d|%d]\n", fMinNClustersTPC, nclsTPC));
+    if(nclsTPC >= fMinNClustersTPC) SETBIT(survivedCut, kMinNClustersTPC);
+  }
   if(TESTBIT(fRequirements, kPixelITS)){
     // cut on ITS pixel layers
-    if(fDebugLevel > 0){
-      printf("ITS cluster Map: ");
-      PrintBitMap(itsPixel);
-    }
+    AliDebug(1, "ITS cluster Map: ");
+    //PrintBitMap(itsPixel);
     switch(fPixelITS){
-      case kFirst: 
-       if(!TESTBIT(itsPixel, 0)) {
-         if(fCheck){
-           if(!CheckITSstatus(status1)) {
-             SETBIT(survivedCut, kPixelITS);
-           }
-         }
-       }
-       else {
-         SETBIT(survivedCut, kPixelITS);
-       }
+      case kFirst:
+        AliDebug(2, "First");
+             if(TESTBIT(itsPixel, 0)) 
+               SETBIT(survivedCut, kPixelITS);
+        else
+               if(fCheck && !statusL0)
+                 SETBIT(survivedCut, kPixelITS);
                    break;
       case kSecond: 
-       if(!TESTBIT(itsPixel, 1)) {
-         if(fCheck) {
-           if(!CheckITSstatus(status2)) {
-             SETBIT(survivedCut, kPixelITS);
-           }
-         }
-       }
-       else { 
-         SETBIT(survivedCut, kPixelITS);
-       }
+        AliDebug(2, "Second");
+             if(TESTBIT(itsPixel, 1))
+               SETBIT(survivedCut, kPixelITS);
+        else
+               if(fCheck && !statusL1)
+                 SETBIT(survivedCut, kPixelITS);
                    break;
       case kBoth: 
-       if(!(TESTBIT(track->GetITSClusterMap(),0))) {
-         if(fCheck) {  
-           if(!CheckITSstatus(status1)) {
-             if(!(TESTBIT(track->GetITSClusterMap(),1))) {
-               if(!CheckITSstatus(status2)) {
-                 SETBIT(survivedCut, kPixelITS);
-               }
-             }
-             else SETBIT(survivedCut, kPixelITS);
-           }
-         }
-       }
-       else {
-         
-         if(!(TESTBIT(track->GetITSClusterMap(),1))) {
-           if(fCheck) {
-             if(!CheckITSstatus(status2)) {
-               SETBIT(survivedCut, kPixelITS);
-             }
-           }
-         }
-         else SETBIT(survivedCut, kPixelITS);
-       
-       }
-                  break;
+        AliDebug(2, "Both");
+             if(TESTBIT(itsPixel,0) && TESTBIT(itsPixel,1))
+                     SETBIT(survivedCut, kPixelITS);
+             else
+          if(fCheck && !(statusL0 && statusL1)) 
+                       SETBIT(survivedCut, kPixelITS);
+             break;
       case kAny: 
-       if((!TESTBIT(itsPixel, 0)) && (!TESTBIT(itsPixel, 1))){
-         if(fCheck){
-           if(!CheckITSstatus(status1) || (!CheckITSstatus(status2))) {
-             SETBIT(survivedCut, kPixelITS);
-           }
-         }
-       }
-       else { 
-         SETBIT(survivedCut, kPixelITS);
-       }
+        AliDebug(2, "Any");
+             if(TESTBIT(itsPixel, 0) || TESTBIT(itsPixel, 1))
+               SETBIT(survivedCut, kPixelITS);
+        else
+               if(fCheck && !(statusL0 || statusL1))
+                   SETBIT(survivedCut, kPixelITS);
                    break;
-      default: break;
+      default: 
+        AliDebug(2, "None");
+        break;
     }
-    if(fDebugLevel > 0)printf("Survived Cut: %s\n", TESTBIT(survivedCut, kPixelITS) ? "YES" : "NO");
+    AliDebug(1, Form("Survived Cut: %s\n", TESTBIT(survivedCut, kPixelITS) ? "YES" : "NO"));
   }
   if(fRequirements == survivedCut){
     //
     // Track selected
     //
-    if(IsQAOn()) FillQAhistosESD(track, kAfterCuts);
+    AliDebug(2, "Track Survived cuts\n");
+    if(IsQAOn()) FillQAhistosRec(track, kAfterCuts);
     return kTRUE;
   }
+  AliDebug(2, "Track cut");
   if(IsQAOn()) FillCutCorrelation(survivedCut);
   return kFALSE;
 }
 
 //______________________________________________________
-Bool_t AliHFEextraCuts::CheckMCCuts(AliMCParticle */*track*/) const {
+Bool_t AliHFEextraCuts::CheckMCCuts(AliVParticle */*track*/) const {
   //
   // Checks cuts on Monte Carlo tracks
   // returns true if track is selected
@@ -270,22 +298,25 @@ Bool_t AliHFEextraCuts::CheckMCCuts(AliMCParticle */*track*/) const {
 }
 
 //______________________________________________________
-void AliHFEextraCuts::FillQAhistosESD(AliESDtrack *track, UInt_t when){
+void AliHFEextraCuts::FillQAhistosRec(AliVTrack *track, UInt_t when){
   //
   // Fill the QA histograms for ESD tracks
   // Function can be called before cuts or after cut application (second argument)
   //
-  TList *container = dynamic_cast<TList *>(fQAlist->At(when));
+  const Int_t kNhistos = 6;
   Float_t impactR, impactZ;
-  track->GetImpactParameters(impactR, impactZ);
-  (dynamic_cast<TH1F *>(container->At(0)))->Fill(impactR);
-  (dynamic_cast<TH1F *>(container->At(1)))->Fill(impactZ);
+  GetImpactParameters(track, impactR, impactZ);
+  Int_t nTPCf = GetTPCfindableClusters(track, fTPCiter1), nclsTPC = GetTPCncls(track, fTPCiter1);
+  (dynamic_cast<TH1F *>(fQAlist->At(0 + when * kNhistos)))->Fill(impactR);
+  (dynamic_cast<TH1F *>(fQAlist->At(1 + when * kNhistos)))->Fill(impactZ);
   // printf("TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
-  (dynamic_cast<TH1F *>(container->At(2)))->Fill(track->GetTPCNclsF() > 0. ? static_cast<Float_t>(track->GetTPCNcls())/static_cast<Float_t>(track->GetTPCNclsF()) : 1.);
-  (dynamic_cast<TH1F *>(container->At(3)))->Fill(track->GetTRDntrackletsPID());
+  (dynamic_cast<TH1F *>(fQAlist->At(2 + when * kNhistos)))->Fill(nTPCf > 0. ? static_cast<Float_t>(nclsTPC)/static_cast<Float_t>(nTPCf) : 1.);
+  (dynamic_cast<TH1F *>(fQAlist->At(3 + when * kNhistos)))->Fill(GetTRDnTrackletsPID(track));
+  (dynamic_cast<TH1F *>(fQAlist->At(4 + when * kNhistos)))->Fill(nclsTPC);
   UChar_t itsPixel = track->GetITSClusterMap();
-  TH1 *pixelHist = dynamic_cast<TH1F *>(container->At(4));
-  Int_t firstEntry = pixelHist->GetXaxis()->GetFirst();
+  TH1 *pixelHist = dynamic_cast<TH1F *>(fQAlist->At(5 + when * kNhistos));
+  //Int_t firstEntry = pixelHist->GetXaxis()->GetFirst();
+  Double_t firstEntry = 0.5;
   if(!((itsPixel & BIT(0)) || (itsPixel & BIT(1))))
     pixelHist->Fill(firstEntry + 3);
   else{
@@ -315,13 +346,14 @@ void AliHFEextraCuts::FillCutCorrelation(ULong64_t survivedCut){
   //
   // Fill cut correlation histograms for tracks that didn't pass cuts
   //
-  TH2 *correlation = dynamic_cast<TH2F *>(fQAlist->At(2));
+  const Int_t kNhistos = 6;
+  TH2 *correlation = dynamic_cast<TH2F *>(fQAlist->At(2 * kNhistos));
   for(Int_t icut = 0; icut < kNcuts; icut++){
     if(!TESTBIT(fRequirements, icut)) continue;
     for(Int_t jcut = icut; jcut < kNcuts; jcut++){
       if(!TESTBIT(fRequirements, jcut)) continue;
       if(TESTBIT(survivedCut, icut) && TESTBIT(survivedCut, jcut))
-       correlation->Fill(icut, jcut);
+             correlation->Fill(icut, jcut);
     }
   }
 }
@@ -335,30 +367,36 @@ void AliHFEextraCuts::AddQAHistograms(TList *qaList){
   // Additionally a histogram with the cut correlation is created and stored
   // in the top directory
   //
-  TList *histos[2];
+
+  const Int_t kNhistos = 6;
   TH1 *histo1D = 0x0;
   TH2 *histo2D = 0x0;
-  histos[0] = new TList();
-  histos[0]->SetName("BeforeCut");
-  histos[0]->SetOwner();
-  histos[1] = new TList();
-  histos[1]->SetName("AfterCut");
-  histos[1]->SetOwner();
   TString cutstr[2] = {"before", "after"};
+
+  if(!fQAlist) fQAlist = new TList;  // for internal representation, not owner
   for(Int_t icond = 0; icond < 2; icond++){
-    histos[icond]->AddAt((histo1D = new TH1F(Form("impactParamR%s", cutstr[icond].Data()), "Radial Impact Parameter", 100, 0, 10)), 0);
+    qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamR%s",GetName(),cutstr[icond].Data()), "Radial Impact Parameter", 100, 0, 10)), 0 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 0 + icond * kNhistos);
     histo1D->GetXaxis()->SetTitle("Impact Parameter");
     histo1D->GetYaxis()->SetTitle("Number of Tracks");
-    histos[icond]->AddAt((histo1D = new TH1F(Form("impactParamZ%s", cutstr[icond].Data()), "Z Impact Parameter", 200, 0, 20)), 1);
+    qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamZ%s",GetName(),cutstr[icond].Data()), "Z Impact Parameter", 200, 0, 20)), 1 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 1 + icond * kNhistos);
     histo1D->GetXaxis()->SetTitle("Impact Parameter");
     histo1D->GetYaxis()->SetTitle("Number of Tracks");
-    histos[icond]->AddAt((histo1D = new TH1F(Form("tpcClr%s", cutstr[icond].Data()), "Cluster Ratio TPC", 10, 0, 1)), 2);
+    qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClr%s",GetName(),cutstr[icond].Data()), "Cluster Ratio TPC", 10, 0, 1)), 2 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 2 + icond * kNhistos);
     histo1D->GetXaxis()->SetTitle("Cluster Ratio TPC");
     histo1D->GetYaxis()->SetTitle("Number of Tracks");
-    histos[icond]->AddAt((histo1D = new TH1F(Form("trdTracklets%s", cutstr[icond].Data()), "Number of TRD tracklets", 7, 0, 7)), 3);
+    qaList->AddAt((histo1D = new TH1F(Form("%s_trdTracklets%s",GetName(),cutstr[icond].Data()), "Number of TRD tracklets", 7, 0, 7)), 3 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 3 + icond * kNhistos);
     histo1D->GetXaxis()->SetTitle("Number of TRD Tracklets");
     histo1D->GetYaxis()->SetTitle("Number of Tracks");
-    histos[icond]->AddAt((histo1D = new TH1F(Form("itsPixel%s", cutstr[icond].Data()), "ITS Pixel Hits", 6, 0, 6)), 4);
+    qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClusters%s",GetName(),cutstr[icond].Data()), "Number of TPC clusters", 161, 0, 160)), 4 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 4 + icond * kNhistos);
+    histo1D->GetXaxis()->SetTitle("Number of TPC clusters");
+    histo1D->GetYaxis()->SetTitle("Number of Tracks");
+    qaList->AddAt((histo1D = new TH1F(Form("%s_itsPixel%s",GetName(),cutstr[icond].Data()), "ITS Pixel Hits", 6, 0, 6)), 5 + icond * kNhistos);
+    fQAlist->AddAt(histo1D, 5 + icond * kNhistos);
     histo1D->GetXaxis()->SetTitle("ITS Pixel");
     histo1D->GetYaxis()->SetTitle("Number of Tracks");
     Int_t first = histo1D->GetXaxis()->GetFirst();
@@ -366,20 +404,15 @@ void AliHFEextraCuts::AddQAHistograms(TList *qaList){
     for(Int_t ilabel = 0; ilabel < 6; ilabel++)
       histo1D->GetXaxis()->SetBinLabel(first + ilabel, binNames[ilabel].Data());
   }
-  fQAlist = new TList();
-  fQAlist->SetOwner();
-  fQAlist->SetName("HFelectronExtraCuts");
-  fQAlist->AddAt(histos[0], 0);
-  fQAlist->AddAt(histos[1], 1);
   // Add cut correlation
-  fQAlist->AddAt((histo2D = new TH2F("cutcorrellation", "Cut Correlation", kNcuts, 0, kNcuts - 1, kNcuts, 0, kNcuts -1)), 2);
-  TString labels[kNcuts] = {"MinImpactParamR", "MaxImpactParamR", "MinImpactParamZ", "MaxImpactParamZ", "ClusterRatioTPC", "MinTrackletsTRD", "ITSpixel"};
+  qaList->AddAt((histo2D = new TH2F(Form("%s_cutcorrelation",GetName()), "Cut Correlation", kNcuts, 0, kNcuts - 1, kNcuts, 0, kNcuts -1)), 2 * kNhistos);
+  fQAlist->AddAt(histo2D, 2 * kNhistos);
+  TString labels[kNcuts] = {"MinImpactParamR", "MaxImpactParamR", "MinImpactParamZ", "MaxImpactParamZ", "ClusterRatioTPC", "MinTrackletsTRD", "ITSpixel", "kMinHFEImpactParamR", "kMinHFEImpactParamNsigmaR", "TPC Number of clusters"};
   Int_t firstx = histo2D->GetXaxis()->GetFirst(), firsty = histo2D->GetYaxis()->GetFirst();
   for(Int_t icut = 0; icut < kNcuts; icut++){
     histo2D->GetXaxis()->SetBinLabel(firstx + icut, labels[icut].Data());
     histo2D->GetYaxis()->SetBinLabel(firsty + icut, labels[icut].Data());
   }
-  qaList->AddLast(fQAlist);
 }
 
 //______________________________________________________
@@ -403,3 +436,166 @@ Bool_t AliHFEextraCuts::CheckITSstatus(Int_t itsStatus) const {
   }
   return status;
 }
+
+//______________________________________________________
+Int_t AliHFEextraCuts::GetTRDnTrackletsPID(AliVTrack *track){
+       //
+       // Get Number of TRD tracklets
+       //
+       Int_t nTracklets = 0;
+       if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
+               AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+               nTracklets = esdtrack->GetTRDntrackletsPID();
+       } else if(!TString(track->IsA()->GetName()).CompareTo("AliAODTrack")){
+               AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
+               AliAODPid *pidobject = aodtrack->GetDetPid();
+               // this is normally NOT the way to do this, but due to limitation in the
+               // AOD track it is not possible in a different way
+               if(pidobject){
+                       Float_t *trdmom = pidobject->GetTRDmomentum();
+                       for(Int_t ily = 0; ily < 6; ily++){
+                               if(trdmom[ily] > -1) nTracklets++;
+                       }
+               } else nTracklets = 6;  // No Cut possible
+       }
+       return nTracklets;
+}
+
+//______________________________________________________
+Int_t AliHFEextraCuts::GetITSstatus(AliVTrack *track, Int_t layer){
+       //
+       // Check ITS layer status
+       //
+       Int_t status = 0;
+       if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
+               Int_t det;
+               Float_t xloc, zloc;
+               AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+               esdtrack->GetITSModuleIndexInfo(layer, det, status, xloc, zloc);
+       }
+       return status;
+}
+
+//______________________________________________________
+Int_t AliHFEextraCuts::GetTPCfindableClusters(AliVTrack *track, Bool_t iter1){
+       //
+       // Get Number of findable clusters in the TPC
+       //
+  AliDebug(1, Form("Using TPC clusters from iteration 1: %s", iter1 ? "Yes" : "No"));
+       Int_t nClusters = 159; // in case no Information available consider all clusters findable
+       if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
+    AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+               nClusters = esdtrack->GetTPCNclsF();
+  }
+       return nClusters;
+}
+
+//______________________________________________________
+Int_t AliHFEextraCuts::GetTPCncls(AliVTrack *track, Bool_t iter1){
+       //
+       // Get Number of findable clusters in the TPC
+       //
+  AliDebug(1, Form("Using TPC clusters from iteration 1: %s", iter1 ? "Yes" : "No"));
+       Int_t nClusters = 0; // in case no Information available consider all clusters findable
+       TString type = track->IsA()->GetName();
+       if(!type.CompareTo("AliESDtrack")){
+    AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+    if(iter1)
+                 nClusters = esdtrack->GetTPCNclsIter1();
+    else
+                 nClusters = esdtrack->GetTPCNcls();
+  }
+       else if(!type.CompareTo("AliAODTrack")){
+               AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
+               const TBits &tpcmap = aodtrack->GetTPCClusterMap();
+               for(UInt_t ibit = 0; ibit < tpcmap.GetNbits(); ibit++)
+                       if(tpcmap.TestBitNumber(ibit)) nClusters++;
+
+       }
+       return nClusters;
+}
+
+//______________________________________________________
+void AliHFEextraCuts::GetImpactParameters(AliVTrack *track, Float_t &radial, Float_t &z){
+       //
+       // Get impact parameter
+       //
+       TString type = track->IsA()->GetName();
+       if(!type.CompareTo("AliESDtrack")){
+               AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+               esdtrack->GetImpactParameters(radial, z);
+       }
+       else if(!type.CompareTo("AliAODTrack")){
+               AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
+               Double_t xyz[3];
+               aodtrack->XYZAtDCA(xyz);
+               z = xyz[2];
+               radial = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]+xyz[1]);
+       }
+}
+
+//______________________________________________________
+void AliHFEextraCuts::GetHFEImpactParameters(AliVTrack *track, Double_t &dcaxy, Double_t &dcansigmaxy){
+       //
+       // Get HFE impact parameter (with recalculated primary vertex)
+       //
+       dcaxy=0;
+       dcansigmaxy=0;
+  if(!fEvent){
+    AliDebug(1, "No Input event available\n");
+    return;
+  }
+  const Double_t kBeampiperadius=3.;
+  TString type = track->IsA()->GetName();
+  Double_t dca[2]={-999.,-999.};
+  Double_t cov[3]={-999.,-999.,-999.};
+
+  // recalculate primary vertex
+  AliVertexerTracks vertexer(fEvent->GetMagneticField());
+  vertexer.SetITSMode();
+  vertexer.SetMinClusters(4);
+       Int_t skipped[2];
+  skipped[0] = track->GetID();
+  vertexer.SetSkipTracks(1,skipped);
+  AliVVertex *vtxESDSkip = vertexer.FindPrimaryVertex(fEvent);
+  vertexer.SetSkipTracks(1,skipped);
+  if(vtxESDSkip->GetNContributors()<2) return;
+
+  // Getting the DCA
+  // Propagation always done on a working copy to not disturb the track params of the original track
+  AliESDtrack *esdtrack = NULL;
+  if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
+    // Case ESD track: take copy constructor
+    esdtrack = new AliESDtrack(*dynamic_cast<AliESDtrack *>(track));
+  } else {
+    // Case AOD track: take different constructor
+    esdtrack = new AliESDtrack(track);
+  }
+  if(esdtrack->PropagateToDCA(vtxESDSkip, fEvent->GetMagneticField(), kBeampiperadius, dca, cov)){
+    // protection
+    dcaxy = dca[0];
+    if(cov[0]) dcansigmaxy = dcaxy/TMath::Sqrt(cov[0]);
+    if(!cov[0]) dcansigmaxy = -99.;
+  }
+  delete esdtrack;
+  delete vtxESDSkip;
+}
+
+
+//______________________________________________________
+void AliHFEextraCuts::GetHFEImpactParameterCuts(AliVTrack *track, Double_t &hfeimpactRcut, Double_t &hfeimpactnsigmaRcut){
+       //
+       // Get HFE impact parameter cut(pt dependent)
+       //
+  
+        TString type = track->IsA()->GetName();
+        if(!type.CompareTo("AliESDtrack")){
+        AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
+
+        Double_t pt = esdtrack->Pt();  
+        //hfeimpactRcut=0.0064+0.078*exp(-0.56*pt);  // used Carlo's old parameter 
+        hfeimpactRcut=0.011+0.077*exp(-0.65*pt); // used Carlo's new parameter
+        hfeimpactnsigmaRcut=3; // 3 sigma trail cut
+  }
+}
+