-leg values and sparse for HF -new var cuts
authorjbook <jbook>
Tue, 13 May 2014 12:35:55 +0000 (14:35 +0200)
committerjbook <jbook@cern.ch>
Tue, 13 May 2014 12:35:55 +0000 (14:35 +0200)
PWGDQ/dielectron/AliDielectronHF.cxx
PWGDQ/dielectron/AliDielectronHF.h
PWGDQ/dielectron/AliDielectronVarCuts.cxx
PWGDQ/dielectron/AliDielectronVarCuts.h

index 42536c1..86c225b 100644 (file)
@@ -33,6 +33,7 @@ Detailed description
 #include <TProfile.h>
 #include <TProfile2D.h>
 #include <TProfile3D.h>
+#include <THnSparse.h>
 #include <TAxis.h>
 #include <TString.h>
 #include <TObjString.h>
@@ -58,6 +59,7 @@ AliDielectronHF::AliDielectronHF() :
   fArrPairType(),
   fPairType(kSeOnlyOS),
   fSignalsMC(0x0),
+  fVarCutType(new TBits(kMaxCuts)),
   fAxes(kMaxCuts),
   fHasMC(kFALSE),
   fStepGenerated(kFALSE),
@@ -68,7 +70,7 @@ AliDielectronHF::AliDielectronHF() :
   //
   for (Int_t i=0; i<kMaxCuts; ++i){
     fVarCuts[i]=0;
-    fVarCutType[i]=0;
+    //    fVarCutType[i]=0;
     fBinType[i]=kStdBin;
   }
   fAxes.SetOwner(kTRUE);
@@ -83,6 +85,7 @@ AliDielectronHF::AliDielectronHF(const char* name, const char* title) :
   fArrPairType(),
   fPairType(kSeOnlyOS),
   fSignalsMC(0x0),
+  fVarCutType(new TBits(kMaxCuts)),
   fAxes(kMaxCuts),
   fHasMC(kFALSE),
   fStepGenerated(kFALSE),
@@ -93,7 +96,7 @@ AliDielectronHF::AliDielectronHF(const char* name, const char* title) :
   //
   for (Int_t i=0; i<kMaxCuts; ++i){
     fVarCuts[i]=0;
-    fVarCutType[i]=0;
+    //    fVarCutType[i]=0;
     fBinType[i]=kStdBin;
   }
   fAxes.SetOwner(kTRUE);
@@ -107,7 +110,8 @@ AliDielectronHF::~AliDielectronHF()
   //
   // Default Destructor
   //
-  if(fUsedVars) delete fUsedVars;
+  if(fUsedVars)   delete fUsedVars;
+  if(fVarCutType) delete fVarCutType;
   fAxes.Delete();
   fRefObj.Delete();
   fArrPairType.Delete();
@@ -136,8 +140,7 @@ void AliDielectronHF::UserProfile(const char* histClass, UInt_t valTypeP,
       if(arr->GetEntriesFast()>2) pmax=(((TObjString*)arr->At(2))->GetString()).Atof();
       delete arr;
     }
-    hist=new TProfile("","",binsX->GetNrows()-1,binsX->GetMatrixArray());
-    ((TProfile*)hist)->BuildOptions(pmin,pmax,opt.Data());
+    hist=new TProfile("","",binsX->GetNrows()-1,binsX->GetMatrixArray(),pmin,pmax,opt.Data());
     //      printf(" name %s PROFILE options: pmin %.1f pmax %.1f err %s \n",name,((TProfile*)hist)->GetYmin(),((TProfile*)hist)->GetYmax(),((TProfile*)hist)->GetErrorOption() );
   }
 
@@ -260,6 +263,48 @@ void AliDielectronHF::UserProfile(const char* histClass, UInt_t valTypeP,
   delete binsZ;
 }
 
+//_____________________________________________________________________________
+void AliDielectronHF::UserSparse(const char* histClass, Int_t ndim, TObjArray *limits, UInt_t *vars, UInt_t valTypeW)
+{
+  //
+  // THnSparse creation with non-linear binning
+  //
+
+  THnSparseF *hist=0;
+  Int_t bins[ndim];
+  // get number of bins
+  for(Int_t idim=0 ;idim<ndim; idim++) {
+    TVectorD *vec = (TVectorD*) limits->At(idim);
+    bins[idim]=vec->GetNrows()-1;
+  }
+
+  hist=new THnSparseF("",histClass, ndim, bins, 0x0, 0x0);
+
+  // set binning
+  for(Int_t idim=0 ;idim<ndim; idim++) {
+    TVectorD *vec = (TVectorD*) limits->At(idim);
+    hist->SetBinEdges(idim,vec->GetMatrixArray());
+  }
+
+  // store variales in axes
+  AliDielectronHistos::StoreVariables(hist, vars);
+  hist->SetUniqueID(valTypeW); // store weighting variable
+
+  // store which variables are used
+  for(Int_t i=0; i<20; i++)   fUsedVars->SetBitNumber(vars[i],kTRUE);
+  fUsedVars->SetBitNumber(valTypeW,kTRUE);
+
+  // adapt the name and title of the histogram in case they are empty
+  TString name;
+  for(Int_t iv=0; iv < ndim; iv++) name+=Form("%s_",AliDielectronVarManager::GetValueName(vars[iv]));
+  name.Resize(name.Length()-1);
+  hist->SetName(Form("HF_%s",name.Data()));
+
+  fRefObj.AddLast(hist);
+  delete limits;
+  
+}
+
 //________________________________________________________________
 void AliDielectronHF::AddCutVariable(AliDielectronVarManager::ValueTypes type,
                                     Int_t nbins, Double_t min, Double_t max, Bool_t log, Bool_t leg, EBinType btype)
@@ -278,7 +323,8 @@ void AliDielectronHF::AddCutVariable(AliDielectronVarManager::ValueTypes type,
 
   Int_t size=fAxes.GetEntriesFast();
   fVarCuts[size]=(UShort_t)type;
-  fVarCutType[size]=leg;
+  //  fVarCutType[size]=leg;
+  fVarCutType->SetBitNumber(size,leg);
   fAxes.Add(binLimits->Clone());
   fBinType[size]=btype;
   fUsedVars->SetBitNumber(type,kTRUE);
@@ -300,7 +346,8 @@ void AliDielectronHF::AddCutVariable(AliDielectronVarManager::ValueTypes type,
   
   Int_t size=fAxes.GetEntriesFast();
   fVarCuts[size]=(UShort_t)type;
-  fVarCutType[size]=leg;
+  //  fVarCutType[size]=leg;
+  fVarCutType->SetBitNumber(size,leg);
   fAxes.Add(binLimits);
   fBinType[size]=btype;
   fUsedVars->SetBitNumber(type,kTRUE);
@@ -322,7 +369,8 @@ void AliDielectronHF::AddCutVariable(AliDielectronVarManager::ValueTypes type,
   
   Int_t size=fAxes.GetEntriesFast();
   fVarCuts[size]=(UShort_t)type;
-  fVarCutType[size]=leg;
+  //  fVarCutType[size]=leg;
+  fVarCutType->SetBitNumber(size,leg);
   fAxes.Add(binLimits);
   fBinType[size]=btype;
   fUsedVars->SetBitNumber(type,kTRUE);
@@ -394,9 +442,9 @@ void AliDielectronHF::Fill(Int_t pairIndex, const AliDielectronPair *particle)
 
   // get leg variables (TODO: do not fill for the moment since leg cuts are not opened)
   Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues]={0};
-  //AliDielectronVarManager::Fill(particle->GetFirstDaughter(),valuesLeg1);
+  if(fVarCutType->CountBits())  AliDielectronVarManager::Fill(particle->GetFirstDaughter(),valuesLeg1);
   Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues]={0};
-  //AliDielectronVarManager::Fill(particle->GetSecondDaughter(),valuesLeg2);
+  if(fVarCutType->CountBits())  AliDielectronVarManager::Fill(particle->GetSecondDaughter(),valuesLeg2);
 
   // fill
 
@@ -462,7 +510,7 @@ void AliDielectronHF::Fill(Int_t index, Double_t * const valuesPair, Double_t *
       }
 
       // leg variable
-      if(fVarCutType[ivar]) {
+      if(fVarCutType->TestBitNumber(ivar)) {
        if( (valuesLeg1[fVarCuts[ivar]] < lowEdge || valuesLeg1[fVarCuts[ivar]] >= upEdge) ||
            (valuesLeg2[fVarCuts[ivar]] < lowEdge || valuesLeg2[fVarCuts[ivar]] >= upEdge) ) {
          selected=kFALSE;
@@ -559,7 +607,7 @@ void AliDielectronHF::Init()
       TString title = tmp->GetName();
       if(!ivar)             title ="";
       if( ivar)             title+=":";
-      if(fVarCutType[ivar]) title+="Leg";
+      if(fVarCutType->TestBitNumber(ivar)) title+="Leg";
       title+=AliDielectronVarManager::GetValueName(fVarCuts[ivar]);
       title+=Form("#%.2f#%.2f",lowEdge,upEdge);
       tmp->SetName(title.Data());
index 218198d..235dc7a 100644 (file)
@@ -16,6 +16,7 @@
 #include <TNamed.h>
 #include <TObjArray.h>
 #include <TBits.h>
+#include <THnBase.h>
 
 #include "AliDielectronVarManager.h"
 #include "AliDielectronHistos.h"
@@ -75,6 +76,10 @@ public:
                      UInt_t valTypeX, UInt_t valTypeY, UInt_t valTypeZ, UInt_t valTypeW=AliDielectronHistos::kNoWeights)
   { UserProfile(histClass,AliDielectronHistos::kNoProfile,binsX,binsY,binsZ,valTypeX,valTypeY,valTypeZ,"",valTypeW); }
 
+  // functions to add multidimensional stuff
+  void UserSparse(const char* histClass,
+                 Int_t ndim, TObjArray *limits, UInt_t *vars, UInt_t valTypeW=AliDielectronHistos::kNoWeights);
+
 
   // functions to define the grid
   void AddCutVariable(AliDielectronVarManager::ValueTypes type, Int_t nbins,
@@ -102,7 +107,8 @@ private:
   TObjArray* fSignalsMC;            //! array of MC signals to be studied
 
   UShort_t  fVarCuts[kMaxCuts];     // cut variables
-  Bool_t    fVarCutType[kMaxCuts];  // array to store leg booleans
+  TBits     *fVarCutType;           // array to store leg booleans
+  //  Bool_t    fVarCutType[kMaxCuts];  // array to store leg booleans
   TObjArray fAxes;                  // Axis descriptions of the cut binning
   UShort_t  fBinType[kMaxCuts];     // binning type of the axes
   
@@ -115,7 +121,7 @@ private:
   AliDielectronHF &operator=(const AliDielectronHF &c);
 
   
-  ClassDef(AliDielectronHF,4)         // Dielectron HF
+  ClassDef(AliDielectronHF,5)         // Dielectron HF
 };
 
 
index b2f6550..eed9f18 100644 (file)
@@ -28,6 +28,8 @@
 ///////////////////////////////////////////////////////////////////////////
 
 
+#include <TH1.h>
+
 #include "AliDielectronVarCuts.h"
 #include "AliDielectronMC.h"
 
@@ -51,6 +53,7 @@ AliDielectronVarCuts::AliDielectronVarCuts() :
     fCutMin[i]=0;
     fCutMax[i]=0;
     fCutExclude[i]=kFALSE;
+    fUpperCut[i]=0x0;
   }
 }
 
@@ -72,6 +75,7 @@ AliDielectronVarCuts::AliDielectronVarCuts(const char* name, const char* title)
     fCutMin[i]=0;
     fCutMax[i]=0;
     fCutExclude[i]=kFALSE;
+    fUpperCut[i]=0x0;
   }
 }
 
@@ -96,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);
@@ -108,14 +112,25 @@ Bool_t AliDielectronVarCuts::IsSelected(TObject* track)
   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);
@@ -143,6 +158,40 @@ void AliDielectronVarCuts::AddCut(AliDielectronVarManager::ValueTypes type, Doub
 }
 
 //________________________________________________________________________
+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;
+}
+
+//________________________________________________________________________
 void AliDielectronVarCuts::Print(const Option_t* /*option*/) const
 {
   //
index dc6b2d3..7aead44 100644 (file)
@@ -27,6 +27,7 @@
 #include <AliAnalysisCuts.h>
 #include "AliDielectronVarManager.h"
 
+class TH1;
 class AliDielectronVarCuts : public AliAnalysisCuts {
 public:
   // Whether all cut criteria have to be fulfilled of just any
@@ -38,6 +39,7 @@ public:
   //TODO: make copy constructor and assignment operator public
   void AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t excludeRange=kFALSE);
   void AddCut(AliDielectronVarManager::ValueTypes type, Double_t value, Bool_t excludeRange=kFALSE);
+  void AddCut(AliDielectronVarManager::ValueTypes type, Double_t min, TH1 * const max,  Bool_t excludeRange=kFALSE);
   
   // setters
   void    SetCutOnMCtruth(Bool_t mc=kTRUE) { fCutOnMCtruth=mc; }
@@ -80,11 +82,12 @@ public:
   Double_t fCutMin[AliDielectronVarManager::kNMaxValues];           // minimum values for the cuts
   Double_t fCutMax[AliDielectronVarManager::kNMaxValues];           // maximum values for the cuts
   Bool_t fCutExclude[AliDielectronVarManager::kNMaxValues];         // inverse cut logic?
+  TH1    *fUpperCut[AliDielectronVarManager::kNMaxValues];          // use object as upper cut
 
   AliDielectronVarCuts(const AliDielectronVarCuts &c);
   AliDielectronVarCuts &operator=(const AliDielectronVarCuts &c);
   
-  ClassDef(AliDielectronVarCuts,3)         //Cut class providing cuts to all infomation available for the AliVParticle interface
+  ClassDef(AliDielectronVarCuts,4)         //Cut class providing cuts to all infomation available for the AliVParticle interface
 };