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

//#############################################################
//#                                                           #
//#             Class AliDielectronCF                         #
//#       Dielectron Correction Framework Manager             #
//#                                                           #
//#  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 <TNamed.h>
#include <TVectorDfwd.h>
#include <TBits.h>
#include "AliDielectronVarManager.h"

class AliAnalysisCuts;
class AliAnalysisFilter;
class AliCFContainer;
class AliDielectronPair;
class TObjArray;

class AliDielectronCF : public TNamed {
public:
  enum {kNmaxAddSteps=50};
  
  AliDielectronCF();
  AliDielectronCF(const char* name, const char* title);
  virtual ~AliDielectronCF();

  void SetStepForMCtruth(Bool_t steps=kTRUE)           { fStepForMCtruth=steps;           }
  Bool_t GetStepForMCtruth() const                     { return fStepForMCtruth;          }
  void SetStepForNoCutsMCmotherPid(Bool_t steps=kTRUE) { fStepForNoCutsMCmotherPid=steps; }
  void SetStepForAfterAllCuts(Bool_t steps=kTRUE)      { fStepForAfterAllCuts=steps;      }
  void SetStepForPreFilter(Bool_t steps=kTRUE)         { fStepForPreFilter=steps;         }
  void SetStepsForEachCut(Bool_t steps=kTRUE)          { fStepsForEachCut=steps;          }
  void SetStepsForCutsIncreasing(Bool_t steps=kTRUE)   { fStepsForCutsIncreasing=steps;   }
  void SetStepsForSignal(Bool_t steps=kTRUE)           { fStepsForSignal=steps;           }
  void SetStepsForBackground(Bool_t steps=kTRUE)       { fStepsForBackground=steps;       }
  void SetStepsForMCtruthOnly(Bool_t steps=kTRUE)      { fStepsForMCtruthOnly=steps;       }
  
  void SetPdgMother(Int_t pdg) { fPdgMother=pdg; }
  void SetSignalsMC(TObjArray* array)    {fSignalsMC = array;}
  
  void AddStepMask(UInt_t mask)                  { fStepMasks[fNStepMasks++]=mask; }
  
  void AddVariable(AliDielectronVarManager::ValueTypes type, Int_t nbins,
                   Double_t min, Double_t max, Bool_t leg=kFALSE, Bool_t log=kFALSE);
  void AddVariable(AliDielectronVarManager::ValueTypes type, const char* binLimitStr, Bool_t leg=kFALSE);
  void AddVariable(AliDielectronVarManager::ValueTypes type, TVectorD *binLimits, Bool_t leg=kFALSE);
  
  void InitialiseContainer(const AliAnalysisFilter& filter);

  Int_t GetNvarsPair()     const {return fNVars;}
  Int_t GetNvarsLeg()      const {return fNVarsLeg;}

  UInt_t GetVariablePair(UInt_t var) const {return (var>=(UInt_t)AliDielectronVarManager::kNMaxValues)? (UInt_t)AliDielectronVarManager::kNMaxValues+1:fVariables[var];}
  UInt_t GetVariableLeg(UInt_t var) const {return (var>=(UInt_t)AliDielectronVarManager::kNMaxValues)? (UInt_t)AliDielectronVarManager::kNMaxValues+1:fVariablesLeg[var];}

//   void Fill(UInt_t mask, const TObject *particle);
  void Fill(UInt_t mask, const AliDielectronPair *particle);
  void FillMC(const TObject *particle);
  void FillMC(Int_t label1, Int_t label2, Int_t nSignal);

  AliCFContainer* GetContainer() const { return fCfContainer; }
  
private:
  TBits     *fUsedVars;             // list of used variables

  UInt_t          fVariables[AliDielectronVarManager::kNMaxValues]; //configured variables
  UInt_t          fVariablesLeg[AliDielectronVarManager::kNMaxValues]; //configured variables for the legs
  
  Int_t           fNSteps;                     // number of selection steps
  
  Int_t           fNVars;                      // number of variables
  TObjArray      *fVarBinLimits;               // array of bin limits
  
  Int_t           fNVarsLeg;                   // number of variables for the legs
  TObjArray      *fVarBinLimitsLeg;            //  array of bin limits of the legs
  
  Int_t           fNCuts;                      // Number of cuts in the filter concerned

  Double_t        *fValues;                    //! Value array for filling the container
  Bool_t          *fIsMCTruth;                 //! Buffer array for MC truth information
  
  Bool_t fStepForMCtruth;               //create a step for the MC truth
  Bool_t fStepForNoCutsMCmotherPid;     //create a step for before cuts, but with MC truth of the mother
  Bool_t fStepForAfterAllCuts;          //create a step for before cuts, but with MC truth of the mother
  Bool_t fStepForPreFilter;             //create a step after PreFilter application
  Bool_t fStepsForEachCut;              //create steps for each cut?
  Bool_t fStepsForCutsIncreasing;       //create steps for increasing cut combinatons?
                                        //e.g. cut1&cut2, cut1&cut2&cut3 ...
  Bool_t fStepsForSignal;               //steps for pure signal
  Bool_t fStepsForBackground;           //steps for pure background
  Bool_t fStepsForMCtruthOnly;          //Switch off all pair steps, allow only MC truth Class
  
  UInt_t fStepMasks[kNmaxAddSteps];      //steps for additional cut combinatons
  UInt_t fNStepMasks;                    //number of configured step masks

  Int_t fPdgMother;                      //Pdg code of MCtruth validation
  TObjArray* fSignalsMC;                 //! array of MC signals to be studied
  AliCFContainer* fCfContainer;          //the CF container

  Bool_t fHasMC;                         //if MC info is available
  Int_t  fNAddSteps;                     //number of additional MC related steps per cut step

  TVectorD* MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax) const;
  TVectorD* MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax) const;
  
  AliDielectronCF(const AliDielectronCF &c);
  AliDielectronCF &operator=(const AliDielectronCF &c);
  
  ClassDef(AliDielectronCF,5)  //Dielectron Correction Framework handler
};

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