#ifndef ALIDIELECTRONCF_H
#define ALIDIELECTRONCF_H
#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 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;
UInt_t fVariables[AliDielectronVarManager::kNMaxValues];
UInt_t fVariablesLeg[AliDielectronVarManager::kNMaxValues];
Int_t fNSteps;
Int_t fNVars;
TObjArray *fVarBinLimits;
Int_t fNVarsLeg;
TObjArray *fVarBinLimitsLeg;
Int_t fNCuts;
Double_t *fValues;
Bool_t *fIsMCTruth;
Bool_t fStepForMCtruth;
Bool_t fStepForNoCutsMCmotherPid;
Bool_t fStepForAfterAllCuts;
Bool_t fStepForPreFilter;
Bool_t fStepsForEachCut;
Bool_t fStepsForCutsIncreasing;
Bool_t fStepsForSignal;
Bool_t fStepsForBackground;
Bool_t fStepsForMCtruthOnly;
UInt_t fStepMasks[kNmaxAddSteps];
UInt_t fNStepMasks;
Int_t fPdgMother;
TObjArray* fSignalsMC;
AliCFContainer* fCfContainer;
Bool_t fHasMC;
Int_t fNAddSteps;
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)
};
#endif