]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectronVarCuts.cxx
Merge remote-tracking branch 'origin/master' into flatdev
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronVarCuts.cxx
index 10f061f0c82e4c37b1024b04a36e5e41f187a415..eed9f188ef441a9c0f0d343e02b7cbe84d611a03 100644 (file)
@@ -28,6 +28,8 @@
 ///////////////////////////////////////////////////////////////////////////
 
 
+#include <TH1.h>
+
 #include "AliDielectronVarCuts.h"
 #include "AliDielectronMC.h"
 
@@ -36,6 +38,7 @@ ClassImp(AliDielectronVarCuts)
 
 AliDielectronVarCuts::AliDielectronVarCuts() :
   AliAnalysisCuts(),
+  fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
   fNActiveCuts(0),
   fActiveCutsMask(0),
   fSelectedCutsMask(0),
@@ -50,12 +53,14 @@ AliDielectronVarCuts::AliDielectronVarCuts() :
     fCutMin[i]=0;
     fCutMax[i]=0;
     fCutExclude[i]=kFALSE;
+    fUpperCut[i]=0x0;
   }
 }
 
 //________________________________________________________________________
 AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title) :
   AliAnalysisCuts(name,title),
+  fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
   fNActiveCuts(0),
   fActiveCutsMask(0),
   fSelectedCutsMask(0),
@@ -70,6 +75,7 @@ AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title)
     fCutMin[i]=0;
     fCutMax[i]=0;
     fCutExclude[i]=kFALSE;
+    fUpperCut[i]=0x0;
   }
 }
 
@@ -79,6 +85,7 @@ AliDielectronVarCuts::~AliDielectronVarCuts()
   //
   // Destructor
   //
+  if (fUsedVars) delete fUsedVars;
 }
 
 //________________________________________________________________________
@@ -93,7 +100,7 @@ Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
   SetSelected(kFALSE);
 
   if (!track) return kFALSE;
-  
+
   //If MC cut, get MC truth
   if (fCutOnMCtruth){
     AliVParticle *part=static_cast<AliVParticle*>(track);
@@ -103,14 +110,27 @@ Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
 
   //Fill values
   Double_t values[AliDielectronVarManager::kNMaxValues];
+  AliDielectronVarManager::SetFillMap(fUsedVars);
   AliDielectronVarManager::Fill(track,values);
-  
+
   for (Int_t iCut=0; iCut<fNActiveCuts; ++iCut){
     Int_t cut=fActiveCuts[iCut];
     SETBIT(fSelectedCutsMask,iCut);
-    if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
+    if ( !fUpperCut[iCut] && ((values[cut]<fCutMin[iCut]) || (values[cut]>fCutMax[iCut]))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
+    else if ( fUpperCut[iCut]) {
+      // use a TH1 inherited cut object
+      Float_t x=0.,y=0.,z=0.;
+      switch (fUpperCut[iCut]->GetDimension()) {
+      case 3: z=values[fUpperCut[iCut]->GetZaxis()->GetUniqueID()];
+      case 2: y=values[fUpperCut[iCut]->GetYaxis()->GetUniqueID()];
+      case 1: x=values[fUpperCut[iCut]->GetXaxis()->GetUniqueID()];
+      }
+      Int_t bin = fUpperCut[iCut]->FindBin(x,y,z);
+      if ( ((values[cut]<fCutMin[iCut]) || (values[cut]>fUpperCut[iCut]->GetBinContent(bin)))^fCutExclude[iCut] ) CLRBIT(fSelectedCutsMask,iCut);
+    }
+    if ( fCutType==kAll && !TESTBIT(fSelectedCutsMask,iCut) ) return kFALSE; // option to (minor) speed improvement
   }
-  
+
   Bool_t isSelected=(fSelectedCutsMask==fActiveCutsMask);
   if ( fCutType==kAny ) isSelected=(fSelectedCutsMask>0);
   SetSelected(isSelected);
@@ -133,6 +153,41 @@ void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Doub
   fCutExclude[fNActiveCuts]=excludeRange;
   SETBIT(fActiveCutsMask,fNActiveCuts);
   fActiveCuts[fNActiveCuts]=(UShort_t)type;
+  fUsedVars->SetBitNumber(type,kTRUE);
+  ++fNActiveCuts;
+}
+
+//________________________________________________________________________
+void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, TH1 * const max,  Bool_t excludeRange)
+{
+  //
+  // Set cut range and activate it
+  //
+  fCutMin[fNActiveCuts]=min;
+  fCutMax[fNActiveCuts]=0.0;
+  fCutExclude[fNActiveCuts]=excludeRange;
+  SETBIT(fActiveCutsMask,fNActiveCuts);
+  fActiveCuts[fNActiveCuts]=(UShort_t)type;
+  fUsedVars->SetBitNumber(type,kTRUE);
+  // cut dependencies
+  UInt_t var =0;
+  switch(max->GetDimension()) {
+  case 3:
+  case 2:
+    var=AliDielectronVarManager::GetValueType(max->GetZaxis()->GetName());
+    fUsedVars->SetBitNumber(var,kTRUE);
+    max->GetZaxis()->SetUniqueID(var);
+  case 1:
+    var=AliDielectronVarManager::GetValueType(max->GetYaxis()->GetName());
+    fUsedVars->SetBitNumber(var,kTRUE);
+    max->GetYaxis()->SetUniqueID(var);
+  /*case 1:*/
+    var=AliDielectronVarManager::GetValueType(max->GetXaxis()->GetName());
+    fUsedVars->SetBitNumber(var,kTRUE);
+    max->GetXaxis()->SetUniqueID(var);
+  }
+  fUpperCut[fNActiveCuts]=(TH1*)max->Clone("histCut");
+  fUpperCut[fNActiveCuts]->SetDirectory(0x0);
   ++fNActiveCuts;
 }