-reavert committs by Christoph
authorjbook <jbook@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 29 Apr 2013 10:32:45 +0000 (10:32 +0000)
committerjbook <jbook@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 29 Apr 2013 10:32:45 +0000 (10:32 +0000)
PWGDQ/dielectron/AliDielectronHF.cxx
PWGDQ/dielectron/AliDielectronHF.h
PWGDQ/dielectron/AliDielectronHFhelper.cxx
PWGDQ/dielectron/AliDielectronPID.cxx
PWGDQ/dielectron/AliDielectronPID.h
PWGDQ/dielectron/AliDielectronVarManager.h

index a4715a4..9187a75 100644 (file)
@@ -27,9 +27,18 @@ Detailed description
 
 #include <TVectorD.h>
 #include <TH1.h>
+#include <TH1F.h>
+#include <TH2.h>
+#include <TH3.h>
+#include <TProfile.h>
+#include <TProfile2D.h>
+#include <TProfile3D.h>
 #include <TAxis.h>
-#include <AliVParticle.h>
+#include <TString.h>
+#include <TObjString.h>
+#include <TObjArray.h>
 
+#include <AliVParticle.h>
 #include <AliLog.h>
 
 #include "AliDielectron.h"
@@ -51,7 +60,7 @@ AliDielectronHF::AliDielectronHF() :
   fAxes(kMaxCuts),
   fHasMC(kFALSE),
   fStepGenerated(kFALSE),
-  fRefObj(0x0)
+  fRefObj(1)
 {
   //
   // Default Constructor
@@ -62,6 +71,7 @@ AliDielectronHF::AliDielectronHF() :
     fBinType[i]=kStdBin;
   }
   fAxes.SetOwner(kTRUE);
+  fRefObj.SetOwner(kTRUE);
 }
 
 //______________________________________________
@@ -73,7 +83,7 @@ AliDielectronHF::AliDielectronHF(const char* name, const char* title) :
   fAxes(kMaxCuts),
   fHasMC(kFALSE),
   fStepGenerated(kFALSE),
-  fRefObj(0x0)
+  fRefObj(1)
 {
   //
   // Named Constructor
@@ -84,6 +94,7 @@ AliDielectronHF::AliDielectronHF(const char* name, const char* title) :
     fBinType[i]=kStdBin;
   }
   fAxes.SetOwner(kTRUE);
+  fRefObj.SetOwner(kTRUE);
 }
 
 //______________________________________________
@@ -95,24 +106,144 @@ AliDielectronHF::~AliDielectronHF()
   fAxes.Delete();
 }
 
-//________________________________________________________________
-void AliDielectronHF::SetRefHist(TH1 *obj, UInt_t vars[4])
+//_____________________________________________________________________________
+void AliDielectronHF::UserProfile(const char* histClass, UInt_t valTypeP,
+                                     const TVectorD * const binsX,
+                                     UInt_t valTypeX, TString option)
 {
   //
-  // store reference object and its varaibles
+  // Histogram creation 1D case with arbitraty binning X
+  // the TVectorD is assumed to be surplus after the creation and will be deleted!!!
   //
 
-  //  UInt_t val[2]={AliDielectronVarManager::kM,AliDielectronVarManager::kPt};
-  AliDielectronHistos::StoreVariables(obj,vars);
-  AliDielectronHistos::AdaptNameTitle(obj,"Pair");
-  obj->SetName("");
-  fRefObj     = obj;
+  TH1 *hist=0x0;
+  if(valTypeP==999)
+    hist=new TH1F("","",binsX->GetNrows()-1,binsX->GetMatrixArray());
+  else {
+    TString opt=""; Double_t pmin=0., pmax=0.;
+    if(!option.IsNull()) {
+      TObjArray *arr=option.Tokenize(";");
+      arr->SetOwner();
+      opt=((TObjString*)arr->At(0))->GetString();
+      if(arr->GetEntriesFast()>1) pmin=(((TObjString*)arr->At(1))->GetString()).Atof();
+      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());
+    //      printf(" name %s PROFILE options: pmin %.1f pmax %.1f err %s \n",name,((TProfile*)hist)->GetYmin(),((TProfile*)hist)->GetYmax(),((TProfile*)hist)->GetErrorOption() );
+  }
+
+  // store variales in axes
+  UInt_t valType[4] = {0};
+  valType[0]=valTypeX;     valType[1]=valTypeP;
+  AliDielectronHistos::StoreVariables(hist, valType);
 
+  // adapt the name and title of the histogram in case they are empty
+  AliDielectronHistos::AdaptNameTitle(hist, histClass);
+  hist->SetName(Form("HF_%s",hist->GetName()));
+
+  fRefObj.AddLast(hist);
+  delete binsX;
+}
+
+//_____________________________________________________________________________
+void AliDielectronHF::UserProfile(const char* histClass, UInt_t valTypeP,
+                                     const TVectorD * const binsX, const TVectorD * const binsY,
+                                     UInt_t valTypeX, UInt_t valTypeY, TString option)
+{
+  //
+  // Histogram creation 2D case with arbitraty binning X and Y
+  // the TVectorD is assumed to be surplus after the creation and will be deleted!!!
+  //
+
+  TH1 *hist=0x0;
+  if(valTypeP==999) {
+    hist=new TH2F("","",
+                 binsX->GetNrows()-1,binsX->GetMatrixArray(),
+                 binsY->GetNrows()-1,binsY->GetMatrixArray()); 
+  }
+  else  {
+    TString opt=""; Double_t pmin=0., pmax=0.;
+    if(!option.IsNull()) {
+      TObjArray *arr=option.Tokenize(";");
+      arr->SetOwner();
+      opt=((TObjString*)arr->At(0))->GetString();
+      if(arr->GetEntriesFast()>1) pmin=(((TObjString*)arr->At(1))->GetString()).Atof();
+      if(arr->GetEntriesFast()>2) pmax=(((TObjString*)arr->At(2))->GetString()).Atof();
+      delete arr;
+    }
+    hist=new TProfile2D("","",
+                       binsX->GetNrows()-1,binsX->GetMatrixArray(),
+                       binsY->GetNrows()-1,binsY->GetMatrixArray());
+    ((TProfile2D*)hist)->BuildOptions(pmin,pmax,opt.Data());
+  }
+
+  // store variales in axes
+  UInt_t valType[4] = {0};
+  valType[0]=valTypeX;     valType[1]=valTypeY; valType[3]=valTypeP;
+  AliDielectronHistos::StoreVariables(hist, valType);
+
+  // adapt the name and title of the histogram in case they are empty
+  AliDielectronHistos::AdaptNameTitle(hist, histClass);
+  hist->SetName(Form("HF_%s",hist->GetName()));
+
+  fRefObj.AddLast(hist);
+  delete binsX;
+  delete binsY;
+}
+
+//_____________________________________________________________________________
+void AliDielectronHF::UserProfile(const char* histClass, UInt_t valTypeP,
+                                     const TVectorD * const binsX, const TVectorD * const binsY, const TVectorD * const binsZ,
+                                     UInt_t valTypeX, UInt_t valTypeY, UInt_t valTypeZ, TString option)
+{
+  //
+  // Histogram creation 3D case with arbitraty binning X, Y, Z
+  // the TVectorD is assumed to be surplus after the creation and will be deleted!!!
+  //
+  TH1 *hist=0x0;
+  if(valTypeP==999) {
+    hist=new TH3F("","",
+                 binsX->GetNrows()-1,binsX->GetMatrixArray(),
+                 binsY->GetNrows()-1,binsY->GetMatrixArray(),
+                 binsZ->GetNrows()-1,binsZ->GetMatrixArray());
+  }
+  else {
+    TString opt=""; Double_t pmin=0., pmax=0.;
+    if(!option.IsNull()) {
+      TObjArray *arr=option.Tokenize(";");
+      arr->SetOwner();
+      opt=((TObjString*)arr->At(0))->GetString();
+      if(arr->GetEntriesFast()>1) pmin=(((TObjString*)arr->At(1))->GetString()).Atof();
+      if(arr->GetEntriesFast()>2) pmax=(((TObjString*)arr->At(2))->GetString()).Atof();
+      delete arr;
+    }
+    hist=new TProfile3D("","",
+                       binsX->GetNrows()-1,binsX->GetMatrixArray(),
+                       binsY->GetNrows()-1,binsY->GetMatrixArray(),
+                       binsZ->GetNrows()-1,binsZ->GetMatrixArray());
+    ((TProfile3D*)hist)->BuildOptions(pmin,pmax,opt.Data());
+  }
+
+  // store variales in axes
+  UInt_t valType[4] = {0};
+  valType[0]=valTypeX;     valType[1]=valTypeY;     valType[2]=valTypeZ;     valType[3]=valTypeP;
+  AliDielectronHistos::StoreVariables(hist, valType);
+
+  // adapt the name and title of the histogram in case they are empty
+  AliDielectronHistos::AdaptNameTitle(hist, histClass);
+  hist->SetName(Form("HF_%s",hist->GetName()));
+
+  fRefObj.AddLast(hist);
+  delete binsX;
+  delete binsY;
+  delete binsZ;
 }
 
 //________________________________________________________________
 void AliDielectronHF::AddCutVariable(AliDielectronVarManager::ValueTypes type,
-                                             Int_t nbins, Double_t min, Double_t max, Bool_t log, Bool_t leg, EBinType btype)
+                                    Int_t nbins, Double_t min, Double_t max, Bool_t log, Bool_t leg, EBinType btype)
 {
   //
   // Add a variable to the mixing handler
@@ -215,9 +346,9 @@ void AliDielectronHF::Fill(Int_t label1, Int_t label2, Int_t nSignal)
 //          AliDielectronVarManager::GetValueName(fVarCuts[i]),
 //          valuesLeg1[fVarCuts[i]], valuesLeg2[fVarCuts[i]], valuesPair[fVarCuts[i]]); 
 //     }
-    Fill(nSignal, valuesPair,  valuesLeg1, valuesLeg2);
+    Fill(nSignal+fSignalsMC->GetEntries(), valuesPair,  valuesLeg1, valuesLeg2);
   }
-  // on OS at the moment
+  // only OS at the moment
   // else if(part1->Charge()>0)
   //   valuesPair[AliDielectronVarManager::kPairType]=0;
   // else
@@ -321,11 +452,12 @@ void AliDielectronHF::Fill(Int_t Index, Double_t * const valuesPair, Double_t *
     if(!selected) continue;
 
     // fill the object with Pair and event values (TODO: this needs to be changed)
-    TH1 *tmp=static_cast<TH1*>(histArr->At(ihist));
+    TObjArray *tmp = (TObjArray*) histArr->At(ihist);
     TString title = tmp->GetName();
     AliDebug(10,title.Data());
-
-    AliDielectronHistos::FillValues(tmp, valuesPair);
+    for(Int_t i=0; i<tmp->GetEntriesFast(); i++) {
+      AliDielectronHistos::FillValues(tmp->At(i), valuesPair);
+    }
     //    AliDebug(10,Form("Fill var %d %s value %f in %s \n",fVar,AliDielectronVarManager::GetValueName(fVar),valuesPair[fVar],tmp->GetName()));
   } //end of hist loop
 
@@ -360,8 +492,8 @@ void AliDielectronHF::Init()
 
   //  printf("fRefObj %p \n",fRefObj);
   for(Int_t ihist=0; ihist<size; ihist++) {
-    histArr->AddAt(fRefObj->Clone(""), ihist);
-    //histArr->AddAt(fRefObj->Clone(Form("h%04d",ihist)), ihist);
+    histArr->AddAt(fRefObj.Clone(""), ihist);
+    //histArr->AddAt(fRefObj.Clone(Form("h%04d",ihist)), ihist);
   }
 
   // loop over all cut variables
@@ -389,9 +521,10 @@ void AliDielectronHF::Init()
        break;
       }
 
-      TH1 *tmp=static_cast<TH1*>(histArr->At(ihist));
+      TObjArray *tmp= (TObjArray*) histArr->At(ihist);
       TString title = tmp->GetName();
-      if(ivar!=0)           title+=":";
+      if(!ivar)             title ="";
+      if( ivar)             title+=":";
       if(fVarCutType[ivar]) title+="Leg";
       title+=AliDielectronVarManager::GetValueName(fVarCuts[ivar]);
       title+=Form("#%.2f#%.2f",lowEdge,upEdge);
index 9f49a49..f8c49a7 100644 (file)
@@ -40,8 +40,34 @@ public:
   void SetSignalsMC(TObjArray* array)    {fSignalsMC = array;}
   void SetStepForMCGenerated(Bool_t switcher=kTRUE)    {fStepGenerated = switcher;}
   void SetPairTypes(EPairType ptype=kOSonly) { fPairType=ptype; }
-  void SetRefHist(TH1 *obj, UInt_t vars[4]);
 
+  // functions to add 1-dimensional objects
+  void UserProfile(const char* histClass, UInt_t valTypeP,
+                  const TVectorD * const binsX, UInt_t valTypeX, TString option="");
+  void UserHistogram(const char* histClass,
+                    const TVectorD * const binsX, UInt_t valTypeX)
+  { UserProfile(histClass,999,binsX,valTypeX); }
+
+  // functions to add 2-dimensional objects
+  void UserProfile(const char* histClass, UInt_t valTypeP,
+                  const TVectorD * const binsX, const TVectorD * const binsY,
+                  UInt_t valTypeX, UInt_t valTypeY, TString option="");
+  void UserHistogram(const char* histClass,
+                     const TVectorD * const binsX, const TVectorD * const binsY,
+                    UInt_t valTypeX, UInt_t valTypeY)
+  { UserProfile(histClass,999,binsX,binsY,valTypeX,valTypeY); }
+
+  // functions to add 3-dimensional objects
+  void UserProfile(const char* histClass, UInt_t valTypeP,
+                  const TVectorD * const binsX, const TVectorD * const binsY, const TVectorD * const binsZ,
+                  UInt_t valTypeX, UInt_t valTypeY, UInt_t valTypeZ, TString option="");
+  void UserHistogram(const char* histClass,
+                     const TVectorD * const binsX, const TVectorD * const binsY, const TVectorD * const binsZ,
+                     UInt_t valTypeX, UInt_t valTypeY, UInt_t valTypeZ)
+  { UserProfile(histClass,999,binsX,binsY,binsZ,valTypeX,valTypeY,valTypeZ); }
+
+
+  // functions to define the grid
   void AddCutVariable(AliDielectronVarManager::ValueTypes type, Int_t nbins,
                      Double_t min, Double_t max, Bool_t log=kFALSE, Bool_t leg=kFALSE, EBinType btype=kStdBin);
   void AddCutVariable(AliDielectronVarManager::ValueTypes type, 
@@ -72,13 +98,13 @@ private:
   Bool_t    fHasMC;
   Bool_t    fStepGenerated;         // switcher for generated particles
 
-  TH1       *fRefObj;               // reference object
+  TObjArray fRefObj;               // reference object
 
   AliDielectronHF(const AliDielectronHF &c);
   AliDielectronHF &operator=(const AliDielectronHF &c);
 
   
-  ClassDef(AliDielectronHF,2)         // Dielectron HF
+  ClassDef(AliDielectronHF,3)         // Dielectron HF
 };
 
 
index 3ba8ea3..8094d0f 100644 (file)
@@ -317,9 +317,9 @@ TH1* AliDielectronHFhelper::FindHistograms(TObjArray *histos)
            histos->AddAt(0x0,i);
          }
          if(bFndBin && !(binmin == min && binmax == max)) {
-             histos->AddAt(0x0,i);
-             AliDebug(10,Form(" removed, within range min %.2f,%.2f  max %.2f,%.2f",binmin,min,binmax,max));
-           }
+           histos->AddAt(0x0,i);
+           AliDebug(10,Form(" removed, within range min %.2f,%.2f  max %.2f,%.2f",binmin,min,binmax,max));
+         }
          // clean up
          if(limits) delete limits;
 
index e367e10..0253771 100644 (file)
@@ -28,8 +28,6 @@ Detailed description
 #include <TMath.h>
 #include <TF1.h>
 #include <TGraph.h>
-#include <TH2D.h>
-#include <TH3D.h>
 
 #include <AliVTrack.h>
 #include <AliVCluster.h>
@@ -59,9 +57,7 @@ TGraph *AliDielectronPID::fgdEdxRunCorr=0x0;
 AliDielectronPID::AliDielectronPID() :
   AliAnalysisCuts(),
   fNcuts(0),
-  fPIDResponse(0x0),
-  fElectronCentroidCentEta(0x0),
-  fElectronWidthCentEta(0x0)
+  fPIDResponse(0x0)
 {
   //
   // Default Constructor
@@ -82,8 +78,6 @@ AliDielectronPID::AliDielectronPID() :
     fSigmaFunUp[icut]=0;
     fFunSigma[icut]=0x0;
     fVarCuts[icut]=0x0;
-    fHistElectronCutLow[icut]=0x0;
-    fHistElectronCutUp[icut]=0x0;
   }
 }
 
@@ -91,9 +85,7 @@ AliDielectronPID::AliDielectronPID() :
 AliDielectronPID::AliDielectronPID(const char* name, const char* title) :
   AliAnalysisCuts(name, title),
   fNcuts(0),
-  fPIDResponse(0x0),
-  fElectronCentroidCentEta(0x0),
-  fElectronWidthCentEta(0x0)
+  fPIDResponse(0x0)
 {
   //
   // Named Constructor
@@ -114,8 +106,6 @@ AliDielectronPID::AliDielectronPID(const char* name, const char* title) :
     fSigmaFunUp[icut]=0;
     fFunSigma[icut]=0x0;
     fVarCuts[icut]=0x0;
-    fHistElectronCutLow[icut]=0x0;
-    fHistElectronCutUp[icut]=0x0;
   }
 }
 
@@ -234,39 +224,6 @@ void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t
 }
 
 //______________________________________________
-void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, Double_t nSigmaUp,
-                              Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
-                              UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
-{
-  //                                                                                    
-  // cut using a TH3D(Pin,centrality,eta) as a lower cut
-  // 
-  if(histLow==0x0){
-    AliError("A valid histogram is required for the lower cut. Not adding the cut!");
-    return;
-  }
-  fHistElectronCutLow[fNcuts]=histLow;
-  AddCut(det,type,0.,nSigmaUp,min,max,exclude,pidBitType,var);
-}
-
-//______________________________________________                                                                                    
-void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, TH3D * const histUp,
-                              Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
-                              UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
-{
-  //
-  // cut using a TH3D(Pin,centrality,eta) as lower and upper cut
-  //
-  if ( (histUp==0x0) || (histLow==0x0) ){
-    AliError("A valid histogram is required for upper and lower cut. Not adding the cut!");
-    return;
-  }
-  fHistElectronCutUp[fNcuts]=histUp;
-  fHistElectronCutLow[fNcuts]=histLow;
-  AddCut(det,type,0.,0.,min,max,exclude,pidBitType,var);
-}
-
-//______________________________________________
 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
                               AliDielectronVarCuts *var, Bool_t exclude/*=kFALSE*/,
                               UInt_t pidBitType/*=AliDielectronPID::kRequire*/)
@@ -339,7 +296,7 @@ Bool_t AliDielectronPID::IsSelected(TObject* track)
     Double_t min=fmin[icut];
     Double_t max=fmax[icut];
     Double_t val=values[fActiveCuts[icut]];
-    
+
     // test var range. In case min==max do not cut
     if ( fVarCuts[icut] ) {
       if ( !fVarCuts[icut]->IsSelected(part) ) continue;
@@ -436,75 +393,20 @@ Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut)
   if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
 
   Double_t mom=part->GetTPCmomentum();
-  Double_t centroid=0.0;
-  Double_t width=1.0;
-  Double_t eta = 0.0;
-  Double_t centrality = 0.0;
-
+  
   Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasTPC(part, fPartType[icut]);
 
   if (fPartType[icut]==AliPID::kElectron){
     numberOfSigmas-=fgCorr;
     numberOfSigmas-=GetCntrdCorr(part);
     numberOfSigmas/=GetWdthCorr(part);
-
-    // recalculate the number of sigmas from the electron assuption using the electron centroid and width maps
-    if(fElectronCentroidCentEta || fElectronWidthCentEta) {
-      eta=part->Eta();
-      centrality = AliDielectronVarManager::GetCurrentEvent()->GetCentrality()->GetCentralityPercentile("V0M");
-      if(fElectronCentroidCentEta) {
-        Int_t centBin = fElectronCentroidCentEta->GetXaxis()->FindBin(centrality);
-        Int_t etaBin = fElectronCentroidCentEta->GetYaxis()->FindBin(eta);
-        if(centBin>=1 && centBin<=fElectronCentroidCentEta->GetXaxis()->GetNbins() &&
-           etaBin>=1 && etaBin<=fElectronCentroidCentEta->GetYaxis()->GetNbins())
-          centroid = fElectronCentroidCentEta->GetBinContent(fElectronCentroidCentEta->GetXaxis()->FindBin(centrality),
-                                                             fElectronCentroidCentEta->GetYaxis()->FindBin(eta));
-      }
-      if(fElectronWidthCentEta) {
-        Int_t centBin =fElectronWidthCentEta->GetXaxis()->FindBin(centrality);
-        Int_t etaBin = fElectronWidthCentEta->GetYaxis()->FindBin(eta);
-        if(centBin>=1 && centBin<=fElectronWidthCentEta->GetXaxis()->GetNbins() &&
-           etaBin>=1 && etaBin<=fElectronWidthCentEta->GetYaxis()->GetNbins())
-          width = fElectronWidthCentEta->GetBinContent(fElectronWidthCentEta->GetXaxis()->FindBin(centrality),
-                                                       fElectronWidthCentEta->GetYaxis()->FindBin(eta));
-      }
-    }
-    if(width<0.01) width = 1.0;
-    numberOfSigmas = (numberOfSigmas-centroid)/width;
   }
-
+  
   // test if we are supposed to use a function for the cut
   if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom);
   if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom);
-
-  // if electron selection 3D maps are loaded, then find the corresponding cuts based on momentum, eta and centrality
-  Double_t lowElectronCut = fNsigmaLow[icut];
-  Double_t upElectronCut = fNsigmaUp[icut];
-  if((fPartType[icut]==AliPID::kElectron) && (fHistElectronCutLow[icut] || fHistElectronCutUp[icut])) {
-    eta=part->Eta();
-    centrality = AliDielectronVarManager::GetCurrentEvent()->GetCentrality()->GetCentralityPercentile("V0M");
-  }
-  if((fPartType[icut]==AliPID::kElectron) && fHistElectronCutLow[icut]) {
-    Int_t pbin = fHistElectronCutLow[icut]->GetZaxis()->FindBin(mom);
-    Int_t centBin = fHistElectronCutLow[icut]->GetXaxis()->FindBin(centrality);
-    Int_t etaBin = fHistElectronCutLow[icut]->GetYaxis()->FindBin(eta);
-    // apply this cut only in the range covered in the histogram range
-    if(pbin!=0    && pbin!=(fHistElectronCutLow[icut]->GetZaxis()->GetNbins()+1)             &&
-       centBin!=0 && centBin!=(fHistElectronCutLow[icut]->GetXaxis()->GetNbins()+1) &&
-       etaBin!=0  && etaBin!=(fHistElectronCutLow[icut]->GetYaxis()->GetNbins()+1))
-      lowElectronCut = fHistElectronCutLow[icut]->GetBinContent(centBin, etaBin, pbin);
-  }
-  if((fPartType[icut]==AliPID::kElectron) && fHistElectronCutUp[icut]) {
-    Int_t pbin = fHistElectronCutUp[icut]->GetZaxis()->FindBin(mom);
-    Int_t centBin = fHistElectronCutUp[icut]->GetXaxis()->FindBin(centrality);
-    Int_t etaBin = fHistElectronCutUp[icut]->GetYaxis()->FindBin(eta);
-    // apply this cut only in the p range existing in the histogram range
-    if(pbin!=0    && pbin!=(fHistElectronCutUp[icut]->GetZaxis()->GetNbins()+1)             &&
-       centBin!=0 && centBin!=(fHistElectronCutUp[icut]->GetXaxis()->GetNbins()+1) &&
-       etaBin!=0  && etaBin!=(fHistElectronCutUp[icut]->GetYaxis()->GetNbins()+1))
-      upElectronCut = fHistElectronCutUp[icut]->GetBinContent(centBin, etaBin, pbin);
-  }
-  Bool_t selected=((numberOfSigmas>=lowElectronCut)&&(numberOfSigmas<=upElectronCut))^fExclude[icut];
+  
+  Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
   return selected;
 }
 
@@ -693,8 +595,8 @@ void AliDielectronPID::SetDefaults(Int_t def){
   else if (def==13) {
     // TPC electron inclusion
     // TOF electron inclusion if available
-    AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
-    AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
+    AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
+    AddCut(kTPC,AliPID::kElectron,10.);
   }
   else if (def==14) {
     // TRD 1D 90% elec eff, 4-6 tracklets
@@ -702,8 +604,8 @@ void AliDielectronPID::SetDefaults(Int_t def){
     // TOF electron inclusion if available
     AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5,6.,kFALSE,
           AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
-    AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
-    AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
+    AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
+    AddCut(kTPC,AliPID::kElectron,10.);
   }
   else if (def==15) {
     // TRD 1D 90% elec eff, 4-6 tracklets, chi2 < 2
@@ -713,8 +615,14 @@ void AliDielectronPID::SetDefaults(Int_t def){
           AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
     AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,0.,2.,kFALSE,
           AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDchi2);
-    AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
-    AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
+    AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
+    AddCut(kTPC,AliPID::kElectron,10.);
+  }
+  else if (def==16) {
+    // TPC electron inclusion
+    // TOF electron inclusion if available
+    AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
+    AddCut(kTPC,AliPID::kElectron,-3.5,+3.5);
   }
 
 }
index bbbf951..8a6bb0f 100644 (file)
@@ -27,8 +27,6 @@ class TF1;
 class TList;
 class AliVTrack;
 class TGraph;
-class TH2D;
-class TH3D;
 class AliPIDResponse;
 class AliDielectronVarManager;
 class AliDielectronVarCuts;
@@ -61,12 +59,6 @@ public:
   void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp, Double_t min, Double_t max, Bool_t exclude, UInt_t pidBitType,              TF1 * const funSigma);
   void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
              AliDielectronVarCuts *varcuts, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire );
-  void AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, Double_t nSigmaUp,
-              Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
-              Int_t var=-1);
-  void AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, TH3D * const histUp,
-              Double_t min=0, Double_t max=0, Bool_t exclude=kFALSE, UInt_t pidBitType=AliDielectronPID::kRequire,
-              Int_t var=-1);
   
   void SetDefaults(Int_t def);
 
@@ -97,9 +89,6 @@ public:
   static Double_t GetCntrdCorr(const AliVTrack *track) { return (fgFunCntrdCorr ? GetPIDCorr(track,fgFunCntrdCorr) : 0.0); }
   static Double_t GetWdthCorr(const AliVTrack *track)  { return (fgFunWdthCorr  ? GetPIDCorr(track,fgFunWdthCorr)  : 1.0); }
 
-  void SetElectronNsigmaCentroidMap(TH2D * const centEtaMap) {fElectronCentroidCentEta = centEtaMap;}
-  void SetElectronNsigmaWidthMap(TH2D * const centEtaMap) {fElectronWidthCentEta = centEtaMap;}
-
 private:
   enum {kNmaxPID=30};
 
@@ -133,12 +122,7 @@ private:
   static TGraph *fgdEdxRunCorr;   //run by run correction for dEdx
 
   static Double_t GetPIDCorr(const AliVTrack *track, TF1 *fun);
-
-  TH2D* fElectronCentroidCentEta; //centrality-eta dependence of the electron centroids
-  TH2D* fElectronWidthCentEta;    //centrality-eta dependence of the electron widths
-  TH3D* fHistElectronCutLow[kNmaxPID];  //centrality-eta-pin map for the electron lower cut in units of n-sigma widths centered to zero
-  TH3D* fHistElectronCutUp[kNmaxPID];  //centrality-eta-pin map for the electron lower cut in units of n-sigma widths centered to zero  
-
+  
   Bool_t IsSelectedITS(AliVTrack * const part, Int_t icut);
   Bool_t IsSelectedTPC(AliVTrack * const part, Int_t icut);
   Bool_t IsSelectedTRD(AliVTrack * const part, Int_t icut);
index e6abbfe..9d89a58 100644 (file)
@@ -63,6 +63,9 @@
 #include "AliDielectronPID.h"
 #include "AliDielectronHelper.h"
 
+#include "AliAnalysisManager.h"
+#include "AliVZEROEPSelectionTask.h"
+
 class AliVEvent;
 
 //________________________________________________________________
@@ -250,7 +253,7 @@ public:
     kPhiMaxPt,               // phi angle of the track with maximum pt
     kMaxPt,                  // track with maximum pt
 
-    //// v0 reaction plane quantities from AliEPSelectionTaks
+    //// v0 reaction plane quantities from AliEPSelectionTaks, angles interval [-pi,+pi]
     kv0ArpH2,                // VZERO-A reaction plane of the Q vector for 2nd harmonic
     kv0CrpH2,                //         reaction plane
     kv0ACrpH2,               // VZERO-AC reaction plane of the Q vector for 2nd harmonic
@@ -306,7 +309,7 @@ public:
     kV0ATPCDiffH2,             // V0A-TPC reaction plane difference for 2nd harmonic
     kV0CTPCDiffH2,             // V0C-TPC reaction plane difference for 2nd harmonic
     kV0AV0CDiffH2,             // V0A-V0C reaction plane difference for 2nd harmonic
-    // TPC reaction plane quantities
+    // TPC reaction plane quantities, angle interval [0,+pi]
     kTPCxH2,                  // TPC x-component of the Q vector for 2nd harmonic (corrected)
     kTPCyH2,                  // TPC y-component of the Q vector for 2nd harmonic (corrected)
     kTPCmagH2,                // TPC reaction plane the Q vectors magnitude for 2nd harmonic (corrected)
@@ -438,7 +441,7 @@ private:
   
   static AliPIDResponse  *fgPIDResponse;        // PID response object
   static AliVEvent       *fgEvent;              // current event pointer
-  static AliEventplane   *fgTPCEventPlane;      // current event plane pointer
+  static AliEventplane   *fgTPCEventPlane;      // current event tpc plane pointer
   static AliKFVertex     *fgKFVertex;           // kf vertex
   static TProfile        *fgMultEstimatorAvg[4][9];  // multiplicity estimator averages (4 periods x 9 estimators)
   static Double_t         fgTRDpidEffCentRanges[10][4];   // centrality ranges for the TRD pid efficiency histograms
@@ -1585,40 +1588,20 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl
   // event plane quantities from the AliEPSelectionTask
   for(Int_t ivar=AliDielectronVarManager::kv0ArpH2; ivar<=kv0C0v0C3DiffH2;   ivar++) values[ivar] = 0.0; // v0  variables
   for(Int_t ivar=AliDielectronVarManager::kTPCxH2;  ivar<=kTPCsub12DiffH2uc; ivar++) values[ivar] = 0.0; // tpc variables
-  AliEventplane ep2;
-  // VZERO
-  Double_t qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0ACrpH2]  = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event,10, 2, qx, qy));
-  values[AliDielectronVarManager::kv0ACxH2]   = qx;
-  values[AliDielectronVarManager::kv0ACyH2]   = qy;
-  values[AliDielectronVarManager::kv0ACmagH2] = TMath::Sqrt(qx*qx+qy*qy);
-  qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0ArpH2]   = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 8, 2, qx, qy));
-  values[AliDielectronVarManager::kv0AxH2]    = qx;
-  values[AliDielectronVarManager::kv0AyH2]    = qy;
-  values[AliDielectronVarManager::kv0AmagH2] = TMath::Sqrt(qx*qx+qy*qy);
-  qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0CrpH2]   = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 9, 2, qx, qy));
-  values[AliDielectronVarManager::kv0CxH2]    = qx;
-  values[AliDielectronVarManager::kv0CyH2]    = qy;
-  values[AliDielectronVarManager::kv0CmagH2] = TMath::Sqrt(qx*qx+qy*qy);
-  qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0C0rpH2]  = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy)); qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0C3rpH2]  = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy)); qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0A0rpH2]  = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy)); qx = 0, qy = 0;
-  values[AliDielectronVarManager::kv0A3rpH2]  = TVector2::Phi_mpi_pi(ep2.CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy)); qx = 0, qy = 0;
-
-  // TPC event plane quantities (uncorrected)  
+
+  // ep angle interval [todo, fill]
   AliEventplane *ep = const_cast<AliVEvent*>(event)->GetEventplane();
   if(ep) {
+
+    // TPC event plane quantities (uncorrected)
     TVector2 *qstd  = ep->GetQVector();  // This is the "standard" Q-Vector for TPC
     TVector2 *qsub1 = ep->GetQsub1();    // random subevent plane
     TVector2 *qsub2 = ep->GetQsub2();
     if(qstd && qsub1 && qsub2) {
-      values[AliDielectronVarManager::kTPCxH2uc]   = qstd->X();
-      values[AliDielectronVarManager::kTPCyH2uc]   = qstd->Y();
-      values[AliDielectronVarManager::kTPCmagH2uc] = qstd->Mod();
-      values[AliDielectronVarManager::kTPCrpH2uc]  = ((TMath::Abs(qstd->X())>1.0e-10) ? TMath::ATan2(qstd->Y(),qstd->X())/2.0 : 0.0);
+      values[AliDielectronVarManager::kTPCxH2uc]       = qstd->X();
+      values[AliDielectronVarManager::kTPCyH2uc]       = qstd->Y();
+      values[AliDielectronVarManager::kTPCmagH2uc]     = qstd->Mod();
+      values[AliDielectronVarManager::kTPCrpH2uc]      = ((TMath::Abs(qstd->X())>1.0e-10) ? TMath::ATan2(qstd->Y(),qstd->X())/2.0 : 0.0);
       values[AliDielectronVarManager::kTPCsub1xH2uc]   = qsub1->X();
       values[AliDielectronVarManager::kTPCsub1yH2uc]   = qsub1->Y();
       values[AliDielectronVarManager::kTPCsub1rpH2uc]  = ((TMath::Abs(qsub1->X())>1.0e-10) ? TMath::ATan2(qsub1->Y(),qsub1->X())/2.0 : 0.0);
@@ -1630,9 +1613,32 @@ inline void AliDielectronVarManager::FillVarVEvent(const AliVEvent *event, Doubl
                                                                           values[AliDielectronVarManager::kTPCsub2rpH2uc]) );
     }
 
-    // TPC event plane quantities (corrected)
-    if(fgTPCEventPlane) 
-      FillVarTPCEventPlane(fgTPCEventPlane, values);
+    // VZERO event plane
+    TVector2 qvec;
+    Double_t qx = 0, qy = 0;
+    ep->CalculateVZEROEventPlane(event,10, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0ACrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0ACxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0ACyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod();
+    ep->CalculateVZEROEventPlane(event, 8, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0ArpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0AxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0AyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod();
+    ep->CalculateVZEROEventPlane(event, 9, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0CrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0CxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0CyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod();
+    ep->CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0C0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep->CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0C3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep->CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0A0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep->CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0A3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
   } //if: eventplane
 
   // ESD VZERO information
@@ -1782,7 +1788,7 @@ inline void AliDielectronVarManager::FillVarESDEvent(const AliESDEvent *event, D
     AliDielectronHelper::GetNaccTrckltsCorrected(event,Double_t(nTrITSSA16),values[AliDielectronVarManager::kZvPrim],8);
  
 }
-  
+
 inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, Double_t * const values)
 {
   //
@@ -1811,14 +1817,49 @@ inline void AliDielectronVarManager::FillVarAODEvent(const AliAODEvent *event, D
   // nanoAODs (w/o AliEventPlane branch) should have the tpc event plane angle stored in the header
   if(!header->GetEventplaneP()) {
 
-    values[AliDielectronVarManager::kNTrk] = header->GetRefMultiplicity();    // overwritten datamembers in "our" nanoAODs
-    values[AliDielectronVarManager::kNacc] = header->GetRefMultiplicityPos(); // overwritten datamembers in "our" nanoAODs
+    //    values[AliDielectronVarManager::kNTrk] = header->GetRefMultiplicity();    // overwritten datamembers in "our" nanoAODs
+    //    values[AliDielectronVarManager::kNacc] = header->GetRefMultiplicityPos(); // overwritten datamembers in "our" nanoAODs
 
+    TVector2 qvec;
     // TPC
-    values[AliDielectronVarManager::kTPCrpH2uc]  = header->GetEventplane();
-    values[AliDielectronVarManager::kTPCmagH2uc] = header->GetEventplaneMag();
-    values[AliDielectronVarManager::kTPCxH2uc]   = TMath::Cos(header->GetEventplane())*header->GetEventplaneMag();
-    values[AliDielectronVarManager::kTPCyH2uc]   = TMath::Sin(header->GetEventplane())*header->GetEventplaneMag();
+    qvec.Set(header->GetEventplaneQx(), header->GetEventplaneQy());
+    values[AliDielectronVarManager::kTPCxH2uc]   = qvec.X();
+    values[AliDielectronVarManager::kTPCyH2uc]   = qvec.Y();
+    values[AliDielectronVarManager::kTPCmagH2uc] = qvec.Mod();
+    values[AliDielectronVarManager::kTPCrpH2uc]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+
+    // VZERO
+    AliEventplane ep2;
+    // get event plane corrections from the VZERO EP selection task
+    AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
+    AliVZEROEPSelectionTask *eptask = dynamic_cast<AliVZEROEPSelectionTask *>(man->GetTask("AliVZEROEPSelectionTask"));
+    if(eptask) eptask->SetEventplaneParams(&ep2,centralityF);
+    else printf("no VZERO event plane selection task added! \n");
+
+    Double_t qx = 0, qy = 0;
+    ep2.CalculateVZEROEventPlane(event,10, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0ACrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0ACxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0ACyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0ACmagH2] = qvec.Mod();
+    ep2.CalculateVZEROEventPlane(event, 8, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0ArpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0AxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0AyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0AmagH2] = qvec.Mod();
+    ep2.CalculateVZEROEventPlane(event, 9, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0CrpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    values[AliDielectronVarManager::kv0CxH2]   = qvec.X();
+    values[AliDielectronVarManager::kv0CyH2]   = qvec.Y();
+    values[AliDielectronVarManager::kv0CmagH2] = qvec.Mod();
+    ep2.CalculateVZEROEventPlane(event, 0, 0, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0C0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep2.CalculateVZEROEventPlane(event, 3, 3, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0C3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep2.CalculateVZEROEventPlane(event, 4, 4, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0A0rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
+    ep2.CalculateVZEROEventPlane(event, 7, 7, 2, qx, qy);    qvec.Set(qx,qy);
+    values[AliDielectronVarManager::kv0A3rpH2]  = ((TMath::Abs(qvec.X())>1.0e-10) ? TMath::ATan2(qvec.Y(),qvec.X())/2.0 : 0.0);
   }
 
   const AliAODVertex *vtxtpc = GetVertex(event, AliAODVertex::kMainTPC);