ROOT logo
#ifndef ALIDIELECTRONPID_H
#define ALIDIELECTRONPID_H

/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//#############################################################
//#                                                           # 
//#         Class AliDielectronPID                     #
//#                                                           #
//#  Authors:                                                 #
//#   Anton     Andronic, GSI / A.Andronic@gsi.de             #
//#   Ionut C.  Arsene,   GSI / I.C.Arsene@gsi.de             #
//#   Julian    Book,     Uni Ffm / Julian.Book@cern.ch       #
//#   Frederick Kramer,   Uni Ffm, / Frederick.Kramer@cern.ch #
//#   Magnus    Mager,    CERN / Magnus.Mager@cern.ch         #
//#   WooJin J. Park,     GSI / W.J.Park@gsi.de               #
//#   Jens      Wiechula, Uni HD / Jens.Wiechula@cern.ch      #
//#                                                           #
//#############################################################

#include <TBits.h>

#include <AliPID.h>
#include <AliAnalysisCuts.h>
#include <AliTRDPIDResponse.h>

class TF1;
class TList;
class AliVTrack;
class TGraph;
class THnBase;
class AliPIDResponse;
class AliDielectronVarManager;
class AliDielectronVarCuts;

class AliDielectronPID : public AliAnalysisCuts {
public:
  enum DetType {kITS, kTPC, kTRD, kTRDeleEff, kTRDeleEff2D, kTOF, kEMCAL};
  enum PIDbitType {kIgnore=0, kRequire, kIfAvailable};
  
  AliDielectronPID();
  AliDielectronPID(const char*name, const char* title);

  virtual ~AliDielectronPID();

  void AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp=-99999.,
              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, Double_t nSigmaLow, TF1 * const funUp,
              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, TF1 * const funLow, 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, TF1 * const funLow, TF1 * const funUp,
              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, 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, THnBase * 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 SetDefaults(Int_t def);

  Int_t GetNCuts() { return fNcuts;}
  //
  //Analysis cuts interface
  //const
  virtual Bool_t IsSelected(TObject* track);
  virtual Bool_t IsSelected(TList*   /* list */ ) {return kFALSE;}

  static void SetCorrGraph(TGraph * const gr) { fgFitCorr=gr; }
  static TGraph *GetCorrGraph()  { return fgFitCorr; }
  
  static void SetCorrVal(Double_t run);
  static Double_t GetCorrVal()   { return fgCorr; }
  static Double_t GetCorrValdEdx()   { return fgCorrdEdx; }
  
  static void SetCorrGraphdEdx(TGraph * const gr) { fgdEdxRunCorr=gr; }
  static TGraph *GetCorrGraphdEdx()  { return fgdEdxRunCorr; }

  static void SetEtaCorrFunction(TF1 *fun) {fgFunEtaCorr=fun;}
  static void SetCentroidCorrFunction(TH1 *fun) { fgFunCntrdCorr=fun; }
  static void SetWidthCorrFunction(TH1 *fun) { fgFunWdthCorr=fun; }
  static TF1* GetEtaCorrFunction() { return fgFunEtaCorr; }

  static Double_t GetEtaCorr(const AliVTrack *track);
  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); }

private:
  enum {kNmaxPID=30};

  TBits     *fUsedVars;            // list of used variables
  DetType  fDetType[kNmaxPID];    //detector type of nsigma cut
  AliPID::EParticleType fPartType[kNmaxPID]; //particle type
  Float_t  fNsigmaLow[kNmaxPID];  //lower nsigma bound
  Float_t  fNsigmaUp[kNmaxPID];   //upper nsigma bound
  Double_t fmin[kNmaxPID];        //lower cut limit
  Double_t fmax[kNmaxPID];        //upper cut limit
  Bool_t   fExclude[kNmaxPID];    //use as exclusion band
  TF1     *fFunUpperCut[kNmaxPID];//use function as upper cut
  TF1     *fFunLowerCut[kNmaxPID];//use function as lower cut
  UChar_t  fNcuts;                //number of cuts
  UChar_t  fRequirePIDbit[kNmaxPID]; //How to make use of the pid bit (see)
  UShort_t fActiveCuts[kNmaxPID]; // list of activated cuts
  Double_t fSigmaFunLow[kNmaxPID]; // lower bound for fFunSigma
  Double_t fSigmaFunUp[kNmaxPID];  // upper bound for fFunSigma
  TF1      *fFunSigma[kNmaxPID];   // use function as cut range
  AliDielectronVarCuts *fVarCuts[kNmaxPID]; // varcuts

  AliPIDResponse *fPIDResponse;   //! pid response object
  
  static TGraph *fgFitCorr;       //spline fit object to correct the nsigma deviation in the TPC electron band
  static Double_t fgCorr;         //!correction value for current run. Set if fgFitCorr is set and SetCorrVal(run)
                                  // was called
  static Double_t fgCorrdEdx;     //!dEdx correction value for current run. Set if fgFitCorr is set and SetCorrVal(run)
                                  // was called
  static TF1    *fgFunEtaCorr;    //function for eta correction of electron sigma
  static TH1    *fgFunCntrdCorr;  //function for correction of electron sigma (centroid)
  static TH1    *fgFunWdthCorr;   //function for correction of electron sigma (width)
  static TGraph *fgdEdxRunCorr;   //run by run correction for dEdx

  static Double_t GetPIDCorr(const AliVTrack *track, TH1 *hist);
  
  THnBase* fMapElectronCutLow[kNmaxPID];  //map for the electron lower cut in units of n-sigma widths 1 centered to zero
  Bool_t IsSelectedITS(AliVTrack * const part, Int_t icut);
  Bool_t IsSelectedTPC(AliVTrack * const part, Int_t icut, Double_t *values);
  Bool_t IsSelectedTRD(AliVTrack * const part, Int_t icut);
  Bool_t IsSelectedTRDeleEff(AliVTrack * const part, Int_t icut, AliTRDPIDResponse::ETRDPIDMethod PIDmethod=AliTRDPIDResponse::kLQ1D);
  Bool_t IsSelectedTOF(AliVTrack * const part, Int_t icut);
  Bool_t IsSelectedEMCAL(AliVTrack * const part, Int_t icut);

  AliDielectronPID(const AliDielectronPID &c);
  AliDielectronPID &operator=(const AliDielectronPID &c);

  ClassDef(AliDielectronPID,7)         // Dielectron PID
};

#endif
 AliDielectronPID.h:1
 AliDielectronPID.h:2
 AliDielectronPID.h:3
 AliDielectronPID.h:4
 AliDielectronPID.h:5
 AliDielectronPID.h:6
 AliDielectronPID.h:7
 AliDielectronPID.h:8
 AliDielectronPID.h:9
 AliDielectronPID.h:10
 AliDielectronPID.h:11
 AliDielectronPID.h:12
 AliDielectronPID.h:13
 AliDielectronPID.h:14
 AliDielectronPID.h:15
 AliDielectronPID.h:16
 AliDielectronPID.h:17
 AliDielectronPID.h:18
 AliDielectronPID.h:19
 AliDielectronPID.h:20
 AliDielectronPID.h:21
 AliDielectronPID.h:22
 AliDielectronPID.h:23
 AliDielectronPID.h:24
 AliDielectronPID.h:25
 AliDielectronPID.h:26
 AliDielectronPID.h:27
 AliDielectronPID.h:28
 AliDielectronPID.h:29
 AliDielectronPID.h:30
 AliDielectronPID.h:31
 AliDielectronPID.h:32
 AliDielectronPID.h:33
 AliDielectronPID.h:34
 AliDielectronPID.h:35
 AliDielectronPID.h:36
 AliDielectronPID.h:37
 AliDielectronPID.h:38
 AliDielectronPID.h:39
 AliDielectronPID.h:40
 AliDielectronPID.h:41
 AliDielectronPID.h:42
 AliDielectronPID.h:43
 AliDielectronPID.h:44
 AliDielectronPID.h:45
 AliDielectronPID.h:46
 AliDielectronPID.h:47
 AliDielectronPID.h:48
 AliDielectronPID.h:49
 AliDielectronPID.h:50
 AliDielectronPID.h:51
 AliDielectronPID.h:52
 AliDielectronPID.h:53
 AliDielectronPID.h:54
 AliDielectronPID.h:55
 AliDielectronPID.h:56
 AliDielectronPID.h:57
 AliDielectronPID.h:58
 AliDielectronPID.h:59
 AliDielectronPID.h:60
 AliDielectronPID.h:61
 AliDielectronPID.h:62
 AliDielectronPID.h:63
 AliDielectronPID.h:64
 AliDielectronPID.h:65
 AliDielectronPID.h:66
 AliDielectronPID.h:67
 AliDielectronPID.h:68
 AliDielectronPID.h:69
 AliDielectronPID.h:70
 AliDielectronPID.h:71
 AliDielectronPID.h:72
 AliDielectronPID.h:73
 AliDielectronPID.h:74
 AliDielectronPID.h:75
 AliDielectronPID.h:76
 AliDielectronPID.h:77
 AliDielectronPID.h:78
 AliDielectronPID.h:79
 AliDielectronPID.h:80
 AliDielectronPID.h:81
 AliDielectronPID.h:82
 AliDielectronPID.h:83
 AliDielectronPID.h:84
 AliDielectronPID.h:85
 AliDielectronPID.h:86
 AliDielectronPID.h:87
 AliDielectronPID.h:88
 AliDielectronPID.h:89
 AliDielectronPID.h:90
 AliDielectronPID.h:91
 AliDielectronPID.h:92
 AliDielectronPID.h:93
 AliDielectronPID.h:94
 AliDielectronPID.h:95
 AliDielectronPID.h:96
 AliDielectronPID.h:97
 AliDielectronPID.h:98
 AliDielectronPID.h:99
 AliDielectronPID.h:100
 AliDielectronPID.h:101
 AliDielectronPID.h:102
 AliDielectronPID.h:103
 AliDielectronPID.h:104
 AliDielectronPID.h:105
 AliDielectronPID.h:106
 AliDielectronPID.h:107
 AliDielectronPID.h:108
 AliDielectronPID.h:109
 AliDielectronPID.h:110
 AliDielectronPID.h:111
 AliDielectronPID.h:112
 AliDielectronPID.h:113
 AliDielectronPID.h:114
 AliDielectronPID.h:115
 AliDielectronPID.h:116
 AliDielectronPID.h:117
 AliDielectronPID.h:118
 AliDielectronPID.h:119
 AliDielectronPID.h:120
 AliDielectronPID.h:121
 AliDielectronPID.h:122
 AliDielectronPID.h:123
 AliDielectronPID.h:124
 AliDielectronPID.h:125
 AliDielectronPID.h:126
 AliDielectronPID.h:127
 AliDielectronPID.h:128
 AliDielectronPID.h:129
 AliDielectronPID.h:130
 AliDielectronPID.h:131
 AliDielectronPID.h:132
 AliDielectronPID.h:133
 AliDielectronPID.h:134
 AliDielectronPID.h:135
 AliDielectronPID.h:136
 AliDielectronPID.h:137
 AliDielectronPID.h:138
 AliDielectronPID.h:139
 AliDielectronPID.h:140
 AliDielectronPID.h:141
 AliDielectronPID.h:142
 AliDielectronPID.h:143
 AliDielectronPID.h:144
 AliDielectronPID.h:145
 AliDielectronPID.h:146
 AliDielectronPID.h:147