removing commit, compile error
authorcbaumann <cbaumann@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Apr 2013 13:18:07 +0000 (13:18 +0000)
committercbaumann <cbaumann@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Apr 2013 13:18:07 +0000 (13:18 +0000)
PWGDQ/dielectron/AliAnalysisTaskDielectronFilter.cxx
PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.cxx [deleted file]
PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.h [deleted file]
PWGDQ/dielectron/AliDielectronBtoJPSItoEleCDFfitFCN.cxx
PWGDQ/dielectron/AliDielectronBtoJPSItoEleCDFfitFCN.h
PWGDQ/dielectron/AliDielectronHF.cxx
PWGDQ/dielectron/AliDielectronHF.h
PWGDQ/dielectron/AliDielectronPID.cxx
PWGDQ/dielectron/AliDielectronPID.h
PWGDQ/dielectron/AliDielectronVarManager.h

index 370e400..3cc9057 100644 (file)
@@ -325,8 +325,8 @@ void AliAnalysisTaskDielectronFilter::UserExec(Option_t *)
        nanoEv->GetHeader()->SetEventplane((static_cast<AliAODEvent*>(InputEvent()))->GetHeader()->GetEventplaneP());
        nanoEv->GetHeader()->ResetEventplanePointer(); 
        // set multiplicity
-       nanoEv->GetHeader()->SetRefMultiplicity((Int_t)values[AliDielectronVarManager::kNTrk]);
-       nanoEv->GetHeader()->SetRefMultiplicityPos((Int_t)values[AliDielectronVarManager::kNacc]);
+       //       nanoEv->GetHeader()->SetRefMultiplicity((Int_t)values[AliDielectronVarManager::kNTrk]);
+       //       nanoEv->GetHeader()->SetRefMultiplicityPos((Int_t)values[AliDielectronVarManager::kNacc]);
        //nanoEv->GetHeader()->SetRefMultiplicityNeg(values[AliDielectronVarManager::kMatchEffITSTPC]);
 
          for(int kj=0; kj<(fDielectron->GetTrackArray(0))->GetEntries(); kj++){
diff --git a/PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.cxx b/PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.cxx
deleted file mode 100644 (file)
index 84b6ac2..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/*************************************************************************
-* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
-*                                                                        *
-* Author: The ALICE Off-line Project.                                    *
-* Contributors are mentioned in the code where appropriate.              *
-*                                                                        *
-* Permission to use, copy, modify and distribute this software and its   *
-* documentation strictly for non-commercial purposes is hereby granted   *
-* without fee, provided that the above copyright notice appears in all   *
-* copies and that both the copyright notice and this permission notice   *
-* appear in the supporting documentation. The authors make no claims     *
-* about the suitability of this software for any purpose. It is          *
-* provided "as is" without express or implied warranty.                  *
-**************************************************************************/
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-//                        Analysis task for J/psi - hadron correlations  //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-#include <iostream>
-using namespace std;
-
-#include <TChain.h>
-#include <TH1D.h>
-
-#include <AliCFContainer.h>
-#include <AliInputEventHandler.h>
-#include <AliESDInputHandler.h>
-#include <AliAODInputHandler.h>
-#include <AliAnalysisManager.h>
-#include <AliVEvent.h>
-#include <AliTriggerAnalysis.h>
-#include <AliESDtrackCuts.h>
-
-#include "AliDielectron.h"
-#include "AliDielectronHistos.h"
-#include "AliDielectronCF.h"
-#include "AliDielectronMC.h"
-#include "AliAnalysisTaskMultiDielectron.h"
-
-#include "AliAnalysisTaskJpsiCorrelation.h"
-ClassImp(AliAnalysisTaskJpsiCorrelation)
-
-//_________________________________________________________________________________
-AliAnalysisTaskJpsiCorrelation::AliAnalysisTaskJpsiCorrelation() :
-  AliAnalysisTaskMultiDielectron(),
-  fTreesList(),
-  fESD(0x0),
-  fESDTrackCuts(0x0),
-  fIdxDielectron(0),
-  fNjpsiPerEvent(0),
-  fSign(0),
-  fJpsiM(0.0),
-  fJpsiPt(0.0),
-  fJpsiPhi(0.0),
-  fJpsiTheta(0.0),
-  fJpsiY(0.0),
-  fTrackPt(0.0),
-  fTrackPhi(0.0),
-  fTrackTheta(0.0),
-  fTrackEta(0.0),
-  fMultiDieleOutputs(0)
-{
-  //
-  // Constructor
-  //
-  cout << "AliAnalysisTaskJpsiCorrelation::AliAnalysisTaskJpsiCorrelation()" << endl;
-}
-
-//_________________________________________________________________________________
-AliAnalysisTaskJpsiCorrelation::AliAnalysisTaskJpsiCorrelation(const char *name) :
-  AliAnalysisTaskMultiDielectron(name),
-  fTreesList(),
-  fESD(0x0),
-  fESDTrackCuts(0x0),
-  fIdxDielectron(0),
-  fNjpsiPerEvent(0),
-  fSign(0),
-  fJpsiM(0.0),
-  fJpsiPt(0.0),
-  fJpsiPhi(0.0),
-  fJpsiTheta(0.0),
-  fJpsiY(0.0),
-  fTrackPt(0.0),
-  fTrackPhi(0.0),
-  fTrackTheta(0.0),
-  fTrackEta(0.0),
-  fMultiDieleOutputs(0)
-{
-  //
-  // Constructor
-  //
-  /*
-  // Done in the AliAnalysisTaskMultiDielectron(name) constructor
-  DefineInput(0,TChain::Class());
-  DefineOutput(1, TList::Class());
-  DefineOutput(2, TList::Class());
-  DefineOutput(3, TH1D::Class());
-  */
-  // Add other outputs here
-  fMultiDieleOutputs = GetNoutputs();  // number of output slots in the mother analysis task
-  DefineOutput(fMultiDieleOutputs, TList::Class());
-}
-
-
-//_________________________________________________________________________________
-void AliAnalysisTaskJpsiCorrelation::UserCreateOutputObjects()
-{
-  //
-  // Add all histogram manager histogram lists to the output TList
-  //
-  cout << "AliAnalysisTaskJpsiCorrelation::UserCreateOutputObjects()" << endl;
-  AliAnalysisTaskMultiDielectron::UserCreateOutputObjects();
-
-  if (!fTreesList.IsEmpty()) return; //already initialised
-  fTreesList.SetOwner();
-
-  TIter nextDie(&fListDielectron);
-  AliDielectron *die=0;
-  while ( (die=static_cast<AliDielectron*>(nextDie())) ){
-    TTree* tree=new TTree(die->GetName(), die->GetTitle());
-    tree->Branch("idxDielectron",&fIdxDielectron,"fIdxDielectron/I");
-    tree->Branch("nJpsiPerEvent",&fNjpsiPerEvent,"fNjpsiPerEvent/I");
-    tree->Branch("sign",&fSign,"fSign/I");
-    tree->Branch("jpsiM",&fJpsiM,"fJpsiM/D");
-    tree->Branch("jpsiPt",&fJpsiPt,"fJpsiPt/D");
-    tree->Branch("jpsiPhi",&fJpsiPhi,"fJpsiPhi/D");
-    tree->Branch("jpsiTheta",&fJpsiTheta,"fJpsiTheta/D");
-    tree->Branch("jpsiY",&fJpsiY,"fJpsiY/D");
-    tree->Branch("trackPt",&fTrackPt,"fTrackPt/D");
-    tree->Branch("trackPhi",&fTrackPhi,"fTrackPhi/D");
-    tree->Branch("trackTheta",&fTrackTheta,"fTrackTheta/D");
-    tree->Branch("trackEta",&fTrackEta,"fTrackEta/D");
-    fTreesList.Add(tree);
-  }
-  
-  /*
-  PostData(1, &fListHistos);
-  PostData(2, &fListCF);
-  PostData(3, fEventStat);
-  */
-  PostData(fMultiDieleOutputs, &fTreesList);
-}
-
-//_________________________________________________________________________________
-void AliAnalysisTaskJpsiCorrelation::UserExec(Option_t *option)
-{
-  //
-  // Main loop. Called for every event
-  //
-  //cout << "AliAnalysisTaskJpsiCorrelation::UserExec(Option_t *option)" << endl;
-  if(fTreesList.IsEmpty()) return;
-  AliAnalysisTaskMultiDielectron::UserExec(option);
-
-  //cout << "ndielectrons = " << fListDielectron.GetEntries() << endl;    
-
-  AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> 
-    (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-  if (!esdH) {
-    AliError("Could not get ESDInputHandler");
-    return;
-  } 
-
-  fESD = esdH->GetEvent();
-  
-  if (!fESD) {
-    AliError("fESD not available");
-    return;
-  }
-    
-  //Process event in all AliDielectron instances
-  TIter nextDie(&fListDielectron);
-  AliDielectron *die=0;
-  Int_t idie=0;
-  while ( (die=static_cast<AliDielectron*>(nextDie())) ){
-    //cout << "idie = " << idie << endl;
-    die->Process(fESD);
-    for(Int_t isign=0; isign<=2; ++isign) {
-      //cout << "isign = " << isign << endl;
-      Int_t nCandidates=0;
-      if(die->GetPairArray(isign))
-       nCandidates = die->GetPairArray(isign)->GetEntriesFast();
-      if(nCandidates<1) continue;
-      cout << "candidates = " << nCandidates << endl;
-      
-      fIdxDielectron = idie;
-      fSign = isign;
-      fNjpsiPerEvent = nCandidates;
-      
-      for(Int_t iCandidate=0; iCandidate<nCandidates; ++iCandidate) {
-        TIter nextPair(die->GetPairArray(isign));
-       AliDielectronPair* pair = NULL;
-       while ((pair = static_cast<AliDielectronPair*>(nextPair()))) {
-
-         fJpsiM     = pair->M();
-         fJpsiPt    = pair->Pt();
-         fJpsiPhi   = pair->Phi();
-         fJpsiTheta = pair->Theta();
-         fJpsiY     = pair->Y();
-         cout << "jpsiM = " << fJpsiM << endl;
-         cout << "jpsiPt = " << fJpsiPt << endl;
-         cout << "jpsiPhi = " << fJpsiPhi << endl;
-         cout << "jpsiTheta = " << fJpsiTheta << endl;
-         cout << "jpsiY = " << fJpsiY << endl;
-         
-         AliESDtrack* d1 = static_cast<AliESDtrack*>(pair->GetFirstDaughter());
-         AliESDtrack* d2 = static_cast<AliESDtrack*>(pair->GetSecondDaughter());
-         
-         for (Int_t idx = 0; idx < fESD->GetNumberOfTracks(); idx++) {
-           AliESDtrack* esdTrack = fESD->GetTrack(idx);
-           if(!esdTrack) continue;
-            if(esdTrack==d1) continue;
-            if(esdTrack==d2) continue;
-            if(!fESDTrackCuts->AcceptTrack(esdTrack)) continue;
-           
-           fTrackPt = esdTrack->Pt();
-           fTrackPhi = esdTrack->Phi();
-           fTrackTheta = esdTrack->Theta();
-           fTrackEta = esdTrack->Eta();
-
-           cout << "trackPt = " << fTrackPt << endl;
-           cout << "trackPhi = " << fTrackPhi << endl;
-           cout << "trackTheta = " << fTrackTheta << endl;
-           cout << "trackEta = " << fTrackEta << endl;
-
-           ((TTree*)fTreesList.At(idie))->Fill();
-         }
-       }
-      }
-    }
-    
-    ++idie;
-  }
-  
-  PostData(fMultiDieleOutputs, &fTreesList);
-}
-
-//_________________________________________________________________________________
-void AliAnalysisTaskJpsiCorrelation::FinishTaskOutput()
-{
-  //
-  // Finish function, called after all events 
-  //
-  cout << "AliAnalysisTaskJpsiCorrelation::FinishTaskOutput()" << endl;
-  AliAnalysisTaskMultiDielectron::FinishTaskOutput();
-}
diff --git a/PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.h b/PWGDQ/dielectron/AliAnalysisTaskJpsiCorrelation.h
deleted file mode 100644 (file)
index 9a7e6e8..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// author: I.Arsene, i.c.arsene@gsi.de
-// Analysis task for J/psi hadron angular correlations
-// Task to be updated 
-//
-#ifndef ALIANALYSISTASKJPSICORRELATION_H
-#define ALIANALYSISTASKJPSICORRELATION_H
-
-#include "TList.h"
-
-#include "AliAnalysisTaskMultiDielectron.h"
-
-class AliESDEvent;
-class AliESDtrackCuts;
-
-class AliAnalysisTaskJpsiCorrelation : public AliAnalysisTaskMultiDielectron {
-  
-public:
-  AliAnalysisTaskJpsiCorrelation();
-  AliAnalysisTaskJpsiCorrelation(const char *name);
-  virtual ~AliAnalysisTaskJpsiCorrelation(){  }
-
-  virtual void UserExec(Option_t *option);
-  virtual void UserCreateOutputObjects();
-  virtual void FinishTaskOutput();
-  
-  void SetESDCuts(AliESDtrackCuts* cuts)     {fESDTrackCuts    = cuts;}
-  
- private:
-  TList fTreesList;           //! list with the trees 
-  AliESDEvent     *fESD;      //! ESD object
-  AliESDtrackCuts *fESDTrackCuts;    //! ESD cuts      
-
-  Int_t fIdxDielectron;       //  dielectron index
-  Int_t fNjpsiPerEvent;       //  candidates per event
-  Int_t    fSign;             //  charge
-  Double_t fJpsiM;            //  candidate mass
-  Double_t fJpsiPt;           //  candidate transverse momentum
-  Double_t fJpsiPhi;          //  candidate azimuth
-  Double_t fJpsiTheta;        //  candidate polar angle
-  Double_t fJpsiY;            //  candidate rapidity
-  Double_t fTrackPt;          //  hadron pt
-  Double_t fTrackPhi;         //  hadron phi
-  Double_t fTrackTheta;       //  hadron theta
-  Double_t fTrackEta;         //  hadron eta
-
-  Int_t fMultiDieleOutputs;   //  number of outputs
-
-  AliAnalysisTaskJpsiCorrelation(const AliAnalysisTaskJpsiCorrelation &c);
-  AliAnalysisTaskJpsiCorrelation& operator= (const AliAnalysisTaskJpsiCorrelation &c);
-  
-  ClassDef(AliAnalysisTaskJpsiCorrelation, 1); //Analysis Task for J/psi - hadron correlations
-};
-#endif
index b10bde5..72ff24c 100644 (file)
@@ -245,7 +245,7 @@ void AliDielectronBtoJPSItoEleCDFfitFCN::PrintStatus()
        printf("\n");
 }
 //_________________________________________________________________________________________________
-void AliDielectronBtoJPSItoEleCDFfitFCN::SetResolutionConstants(Double_t* resolutionConst, Int_t type) 
+void AliDielectronBtoJPSItoEleCDFfitFCN::SetResolutionConstants(const Double_t* resolutionConst, Int_t type) 
 {
        //
        // Resolution function is parametrized as the sum of two gaussian
index 9b6ca88..4054f68 100644 (file)
@@ -75,6 +75,8 @@ class AliDielectronBtoJPSItoEleCDFfitFCN : public TNamed {
                 Bool_t GetCrystalBallParam()               const { return fCrystalBallParam; }\r
                TH1F * GetCsiMcHisto()                     const { return fhCsiMC; }\r
                 Double_t GetResWeight(Int_t iW)            const { return fWeightType[iW]; }\r
+               \r
+               Double_t* GetParameters()                         { return fParameters;}\r
 \r
                // return pointer to likelihood functions  \r
                TF1* GetCsiMC(Double_t xmin, Double_t xmax,Double_t normalization);\r
@@ -116,7 +118,7 @@ class AliDielectronBtoJPSItoEleCDFfitFCN : public TNamed {
                void SetIntegralMassBkg(Double_t integral) { fintmMassBkg = integral; }\r
                void SetCsiMC(const TH1F* MCtemplate) {fhCsiMC = (TH1F*)MCtemplate->Clone("fhCsiMC");}\r
 \r
-               void SetResolutionConstants(Double_t* resolutionConst, Int_t type);\r
+               void SetResolutionConstants(const Double_t* resolutionConst, Int_t type);\r
                void SetMassWndHigh(Double_t limit) { fMassWndHigh = TDatabasePDG::Instance()->GetParticle(443)->Mass() + limit ;}\r
                void SetMassWndLow(Double_t limit) { fMassWndLow = TDatabasePDG::Instance()->GetParticle(443)->Mass() - limit ;}\r
                void SetCrystalBallFunction(Bool_t okCB) {fCrystalBallParam = okCB;}\r
@@ -128,6 +130,11 @@ class AliDielectronBtoJPSItoEleCDFfitFCN : public TNamed {
 \r
                void PrintStatus();\r
 \r
+               Double_t EvaluateCDFInvMassSigDistr(Double_t m) const ;\r
+               Double_t EvaluateCDFInvMassBkgDistr(Double_t m) const;\r
+               Double_t ResolutionFunc(Double_t x, Int_t type) const;\r
+               Double_t EvaluateCDFDecayTimeBkgDistr(Double_t x, Int_t type) const ;\r
+\r
        private:  \r
                Double_t fParameters[45];        /*  par[0]  = weightRes;                \r
                                                     par[1]  = fPos;\r
@@ -199,13 +206,10 @@ class AliDielectronBtoJPSItoEleCDFfitFCN : public TNamed {
                Double_t EvaluateCDFfuncSignalPart(Double_t x, Double_t m, Int_t type) const ;      // Signal part \r
                Double_t EvaluateCDFDecayTimeSigDistr(Double_t x, Int_t type) const ;\r
                Double_t EvaluateCDFDecayTimeSigDistrFunc(const Double_t* x, const Double_t *par) const { return par[0]*EvaluateCDFDecayTimeSigDistr(x[0],(Int_t)par[1]);}\r
-               Double_t EvaluateCDFInvMassSigDistr(Double_t m) const ;\r
                 Double_t EvaluateCDFInvMassSigDistrFunc(const Double_t* x, const Double_t *par) const {return par[0]*EvaluateCDFInvMassSigDistr(x[0])/fintmMassSig;}\r
                Double_t EvaluateCDFfuncBkgPart(Double_t x,Double_t m,Int_t type) const ;          // Background part\r
-               Double_t EvaluateCDFDecayTimeBkgDistr(Double_t x, Int_t type) const ;\r
                Double_t EvaluateCDFDecayTimeBkgDistrFunc(const Double_t* x, const Double_t *par) const { return EvaluateCDFDecayTimeBkgDistr(x[0],(Int_t)par[1])*par[0];}\r
                 Double_t EvaluateCDFDecayTimeBkgDistrFuncAllTypes(const Double_t* x, const Double_t *par) const {return (fWeightType[2]*EvaluateCDFDecayTimeBkgDistr(x[0],2)+fWeightType[1]*EvaluateCDFDecayTimeBkgDistr(x[0],1)+fWeightType[0]*EvaluateCDFDecayTimeBkgDistr(x[0],0))*par[0];}\r
-               Double_t EvaluateCDFInvMassBkgDistr(Double_t m) const;\r
                 Double_t EvaluateCDFInvMassBkgDistrFunc(const Double_t* x, const Double_t *par) const {return par[0]*EvaluateCDFInvMassBkgDistr(x[0])/fintmMassBkg;} \r
                   \r
                 Double_t EvaluateCDFInvMassTotalDistr(const Double_t* x, const Double_t *par) const;\r
@@ -222,7 +226,6 @@ class AliDielectronBtoJPSItoEleCDFfitFCN : public TNamed {
                Double_t FunBkgPos(Double_t x, Int_t type) const ;\r
                Double_t FunBkgNeg(Double_t x, Int_t type) const ;\r
                Double_t FunBkgSym(Double_t x, Int_t type) const ;\r
-               Double_t ResolutionFunc(Double_t x, Int_t type) const;\r
                Double_t ResolutionFuncf(const Double_t* x, const Double_t *par) const { return ResolutionFunc(x[0],(Int_t)par[1])*par[0];}\r
                 Double_t ResolutionFuncAllTypes(const Double_t* x, const Double_t *par) const { return (fWeightType[2]*ResolutionFunc(x[0],2)+fWeightType[1]*ResolutionFunc(x[0],1)+fWeightType[0]*ResolutionFunc(x[0],0))*par[0]; }                 \r
  \r
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 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 530d21e..a7d3ed6 100644 (file)
@@ -63,6 +63,9 @@
 #include "AliDielectronPID.h"
 #include "AliDielectronHelper.h"
 
+#include "AliAnalysisManager.h"
+#include "AliVZEROEPSelectionTask.h"
+
 class AliVEvent;
 
 //________________________________________________________________
@@ -246,7 +249,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
@@ -302,7 +305,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)
@@ -434,7 +437,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
@@ -1435,8 +1438,8 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa
 
   }//if (mc->HasMC())
 
-  values[AliDielectronVarManager::kMomAsymDau1] = (values[AliDielectronVarManager::kP] != 0)? pair->GetFirstDaughter()->P()  / values[AliDielectronVarManager::kP]: 0;
-  values[AliDielectronVarManager::kMomAsymDau2] = (values[AliDielectronVarManager::kP] != 0)? pair->GetSecondDaughter()->P()  / values[AliDielectronVarManager::kP]: 0;
+  values[AliDielectronVarManager::kMomAsymDau1] = pair->GetFirstDaughter()->P()  / values[AliDielectronVarManager::kP];
+  values[AliDielectronVarManager::kMomAsymDau2] = pair->GetSecondDaughter()->P() / values[AliDielectronVarManager::kP];
 }
 
 inline void AliDielectronVarManager::FillVarKFParticle(const AliKFParticle *particle, Double_t * const values)
@@ -1572,40 +1575,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);
@@ -1617,9 +1600,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
@@ -1769,7 +1775,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)
 {
   //
@@ -1798,14 +1804,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);