]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/vertexingHF/AliRDHFCuts.cxx
Bug fix (Francesco)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliRDHFCuts.cxx
index 942ad3f3b851be127c41a8db428d33a55dc2bcad..c50e946c8b0ff58326ef4e6e39a6dd459e1c0f29 100644 (file)
@@ -1,4 +1,3 @@
-
 /**************************************************************************
  * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
@@ -54,7 +53,14 @@ fnVarsForOpt(0),
 fVarsForOpt(0),
 fGlobalIndex(1),
 fCutsRD(0),
-fIsUpperCut(0)
+fIsUpperCut(0),
+fUsePID(kFALSE),
+fPidHF(0),
+fWhyRejection(0),
+fRemoveDaughtersFromPrimary(kFALSE),
+fOptPileup(0),
+fMinContrPileup(3),
+fMinDzPileup(0.6)
 {
   //
   // Default Constructor
@@ -78,7 +84,14 @@ AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
   fVarsForOpt(0),
   fGlobalIndex(source.fGlobalIndex),
   fCutsRD(0),
-  fIsUpperCut(0)
+  fIsUpperCut(0),
+  fUsePID(source.fUsePID),
+  fPidHF(0),
+  fWhyRejection(source.fWhyRejection),
+  fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
+  fOptPileup(source.fOptPileup),
+  fMinContrPileup(source.fMinContrPileup),
+  fMinDzPileup(source.fMinDzPileup)  
 {
   //
   // Copy constructor
@@ -89,6 +102,7 @@ AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
   if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
   if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
   if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
+  if(source.fPidHF) SetPidHF(source.fPidHF);
   PrintAll();
 
 }
@@ -111,6 +125,13 @@ AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
   fnVars=source.fnVars;
   fGlobalIndex=source.fGlobalIndex;
   fnVarsForOpt=source.fnVarsForOpt;
+  fUsePID=source.fUsePID;
+  SetPidHF(source.GetPidHF());
+  fWhyRejection=source.fWhyRejection;
+  fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
+  fOptPileup=source.fOptPileup;
+  fMinContrPileup=source.fMinContrPileup;
+  fMinDzPileup=source.fMinDzPileup;
 
   if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
   if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
@@ -134,17 +155,24 @@ AliRDHFCuts::~AliRDHFCuts() {
     fCutsRD=0;
   }
   if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
-
+  if(fPidHF){ 
+    delete fPidHF;
+    fPidHF=0;
+  }
 }
 //---------------------------------------------------------------------------
-Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) const {
+Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
   //
   // Event selection
   // 
   //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
 
+  fWhyRejection=0;
+
   // multiplicity cuts no implemented yet
 
+
+
   const AliVVertex *vertex = event->GetPrimaryVertex();
 
   if(!vertex) return kFALSE;
@@ -155,6 +183,20 @@ Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) const {
 
   if(vertex->GetNContributors()<fMinVtxContr) return kFALSE; 
 
+  // switch to settings for 1-pad cls in TPC
+  if(fPidHF) {
+    if(event->GetRunNumber()>121693) fPidHF->SetOnePad(kTRUE);
+  }
+
+  if(fOptPileup==kRejectPileupEvent){
+    Int_t cutc=(Int_t)fMinContrPileup;
+    Double_t cutz=(Double_t)fMinDzPileup;
+    if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
+      fWhyRejection=1;
+      return kFALSE;
+    }
+  }
+
   return kTRUE;
 }
 //---------------------------------------------------------------------------
@@ -165,12 +207,11 @@ Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
   if(!fTrackCuts) return kTRUE;
 
   Int_t ndaughters = d->GetNDaughters();
-  AliESDtrack* esdTrack=0;
   AliAODVertex *vAOD = d->GetPrimaryVtx();
   Double_t pos[3],cov[6];
   vAOD->GetXYZ(pos);
   vAOD->GetCovarianceMatrix(cov);
-  const AliESDVertex *vESD = new AliESDVertex(pos,cov,100.,100);
+  const AliESDVertex vESD(pos,cov,100.,100);
 
   Bool_t retval=kTRUE;
 
@@ -179,19 +220,35 @@ Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
     if(!dgTrack) retval = kFALSE;
     //printf("charge %d\n",dgTrack->Charge());
     if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
-    // convert to ESD track here
-    esdTrack=new AliESDtrack(dgTrack);
-    // needed to calculate the impact parameters
-    esdTrack->RelateToVertex(vESD,0.,3.); 
-    if(!fTrackCuts->IsSelected(esdTrack)) retval = kFALSE;
-    delete esdTrack; esdTrack=0;
-  }
 
-  delete vESD; vESD=0;
+    if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
+  }
 
   return retval;
 }
 //---------------------------------------------------------------------------
+Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
+  //
+  // Convert to ESDtrack, relate to vertex and check cuts
+  //
+  if(!cuts) return kTRUE;
+
+  Bool_t retval=kTRUE;
+
+  // convert to ESD track here
+  AliESDtrack esdTrack(track);
+  // needed to calculate the impact parameters
+  esdTrack.RelateToVertex(primary,0.,3.); 
+  if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
+  if(fOptPileup==kRejectTracksFromPileupVertex){
+    // to be implemented
+    // we need either to have here the AOD Event, 
+    // or to have the pileup vertex object
+  }
+  return retval; 
+}
+//---------------------------------------------------------------------------
 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
   // Set the pt bins
 
@@ -208,7 +265,7 @@ void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
 
   fnPtBinLimits = nPtBinLimits;
   SetGlobalIndex();
-  cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
+  //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
   fPtBinLimits = new Float_t[fnPtBinLimits];
   for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
 
@@ -221,7 +278,7 @@ void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
   if(fVarNames) {
     delete [] fVarNames;
     fVarNames = NULL;
-    printf("Changing the variable names\n");
+    //printf("Changing the variable names\n");
   }
   if(nVars!=fnVars){
     printf("Wrong number of variables: it has to be %d\n",fnVars);
@@ -244,7 +301,7 @@ void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
   if(fVarsForOpt) {
     delete [] fVarsForOpt;
     fVarsForOpt = NULL;
-    printf("Changing the variables for cut optimization\n");
+    //printf("Changing the variables for cut optimization\n");
   }
   
   if(nVars==0){//!=fnVars) {
@@ -315,6 +372,14 @@ void AliRDHFCuts::PrintAll() const {
   //
   // print all cuts values
   // 
+
+  printf("Minimum vtx type %d\n",fMinVtxType);
+  printf("Minimum vtx contr %d\n",fMinVtxContr);
+  printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
+  printf("Min SPD mult %d\n",fMinSPDMultiplicity);
+  printf("Use PID %d\n",(Int_t)fUsePID);
+  printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
+
   if(fVarNames){
     cout<<"Array of variables"<<endl;
     for(Int_t iv=0;iv<fnVars;iv++){
@@ -405,7 +470,7 @@ Int_t AliRDHFCuts::PtBin(Double_t pt) const {
   //
   //give the pt bin where the pt lies.
   //
-  Int_t ptbin=0;
+  Int_t ptbin=-1;
   for (Int_t i=0;i<fnPtBins;i++){
     if(pt<fPtBinLimits[i+1]) {
       ptbin=i;
@@ -414,3 +479,92 @@ Int_t AliRDHFCuts::PtBin(Double_t pt) const {
   }
   return ptbin;
 }
+//-------------------------------------------------------------------
+Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
+  // 
+  // Give the value of cut set for the variable iVar and the pt bin iPtBin
+  //
+  if(!fCutsRD){
+    cout<<"Cuts not iniziaisez yet"<<endl;
+    return 0;
+  }
+  return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
+}
+//-------------------------------------------------------------------
+Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
+  //
+  // Compare two cuts objects
+  //
+
+  Bool_t areEqual=kTRUE;
+
+  if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d  %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
+
+  if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d  %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
+
+  if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) {   printf("Max vtx red chi2 %f  %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
+
+  if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) {  printf("Min SPD mult %d\n  %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
+
+  if(fUsePID!=obj->fUsePID) { printf("Use PID %d  %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
+
+  if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d  %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
+  if(fTrackCuts){
+    if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d  %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
+
+    if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d  %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
+
+    if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f  %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
+
+    if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d  %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;}
+  }
+
+  if(fCutsRD) {
+   for(Int_t iv=0;iv<fnVars;iv++) {
+     for(Int_t ib=0;ib<fnPtBins;ib++) {
+       if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
+        cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"   "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
+        areEqual=kFALSE;
+       }
+     }
+   }
+  }
+
+  return areEqual;
+}
+//---------------------------------------------------------------------------
+void AliRDHFCuts::MakeTable() const {
+  //
+  // print cuts values in table format
+  // 
+
+       TString ptString = "pT range";
+       if(fVarNames && fPtBinLimits && fCutsRD){
+               TString firstLine(Form("*       %-15s",ptString.Data()));
+               for (Int_t ivar=0; ivar<fnVars; ivar++){
+                       firstLine+=Form("*    %-15s  ",fVarNames[ivar].Data());
+                       if (ivar == fnVars){
+                               firstLine+="*\n";
+                       }
+               }
+               Printf("%s",firstLine.Data());
+               
+               for (Int_t ipt=0; ipt<fnPtBins; ipt++){
+                       TString line;
+                       if (ipt==fnPtBins-1){
+                               line=Form("*  %5.1f < pt < inf    ",fPtBinLimits[ipt]);
+                       }
+                       else{
+                               line=Form("*  %5.1f < pt < %4.1f   ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
+                       }
+                       for (Int_t ivar=0; ivar<fnVars; ivar++){
+                               line+=Form("*     %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
+                       }
+                       Printf("%s",line.Data());
+               }
+
+       }
+
+
+  return;
+}