#ifndef ALIHFESPECTRUM_H
#define ALIHFESPECTRUM_H
#ifndef ROOT_TNamed
#include <TNamed.h>
#endif
class TGraphErrors;
class TObject;
class TH1;
class TF1;
class TList;
class TObjArray;
class AliCFContainer;
class AliHFEcontainer;
class AliCFDataGrid;
class AliCFEffGrid;
class AliHFEspectrum : public TNamed{
public:
enum CFContainer_t{
kDataContainer = 0,
kBackgroundData = 1,
kMCContainerMC = 2,
kMCContainerESD = 3,
kMCContainerCharmMC = 4,
kMCWeightedContainerNonHFEESD =5,
kMCWeightedContainerConversionESD = 6,
kDataContainerV0 = 7
};
enum{
kElecBgSources = 6,
kBgLevels = 3,
kBgPtBins = 44,
kCentrality = 12
};
enum Chargetype_t{
kNegCharge = -1,
kPosCharge = 1,
kAllCharge = 0
};
AliHFEspectrum(const char* name);
~AliHFEspectrum();
Bool_t Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer=0x0, const AliHFEcontainer *bghfecontainer=0x0);
Bool_t Correct(Bool_t subtractcontamination=kTRUE);
Bool_t CorrectBeauty(Bool_t subtractcontamination=kTRUE);
AliCFDataGrid *SubtractBackground(Bool_t setBackground = kFALSE);
AliCFDataGrid *CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
AliCFDataGrid *CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
TList *Unfold(AliCFDataGrid* const bgsubpectrum = 0x0);
void UnfoldBG(AliCFDataGrid* const bgsubpectrum);
AliCFDataGrid *CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
TGraphErrors *Normalize(THnSparse * const spectrum,Int_t i = 0) const;
TGraphErrors *Normalize(AliCFDataGrid * const spectrum,Int_t i = 0) const;
TGraphErrors *NormalizeTH1N(TH1 *input,Int_t normalization) const;
void CorrectFromTheWidth(TH1D *h1) const;
void CorrectStatErr(AliCFDataGrid *backgroundGrid) const;
void SetCorrelation(THnSparseF * const correlation) {fCorrelation = correlation; };
void SetContainer(AliCFContainer *cont, AliHFEspectrum::CFContainer_t type);
void SetEfficiencyFunction(TF1 *efficiencyFunction) { fEfficiencyFunction = efficiencyFunction; };
void SetPbPbAnalysis(Bool_t isPbPb = kFALSE) { fBeamType=(Char_t) isPbPb; };
void SetEtaSyst(Bool_t etaSyst = kTRUE) { fEtaSyst = etaSyst; };
void SetParameterizedEff(AliCFContainer *container, AliCFContainer *containermb, AliCFContainer *containeresd, AliCFContainer *containeresdmb, Int_t *dimensions);
void SetNumberOfEvents(Int_t nEvents,Int_t i = 0) { fNEvents[i] = nEvents; };
void SetNumberOfMCEvents(Int_t nEvents) { fNMCEvents = nEvents; };
void SetNumberOfMC2Events(Int_t nEvents,Int_t i = 0) { fNMCbgEvents[i] = nEvents; };
void SetMCEffStep(Int_t step) { fStepMC = step; };
void SetMCTruthStep(Int_t step) { fStepTrue = step; };
void SetStepToCorrect(Int_t step) { fStepData = step; };
void SetStepBeforeCutsV0(Int_t step) { fStepBeforeCutsV0 = step; };
void SetStepAfterCutsV0(Int_t step) { fStepAfterCutsV0 = step; };
void SetNbDimensions(Int_t nbDimensions) { fNbDimensions = nbDimensions; };
void SetChargeChoosen(Chargetype_t chargechoosen) {fChargeChoosen = chargechoosen; };
void SetEtaRange(Double_t etamin, Double_t etamax) { fEtaRange[0] = etamin; fEtaRange[1] = etamax; fEtaSelected = kTRUE; }
void SetUnSetCorrelatedErrors(Bool_t unsetcorrelatederrors) {fUnSetCorrelatedErrors = unsetcorrelatederrors;};
void SetSmoothing(Bool_t setSmoothing) {fSetSmoothing = setSmoothing;};
void SetTestOneBinCentrality(Double_t centralitymin, Double_t centralitymax) { fTestCentralityLow = centralitymin; fTestCentralityHigh = centralitymax;}
void SetFillMoreCorrelationMatrix(Bool_t fillMoreCorrelationMatrix) { fFillMoreCorrelationMatrix = fillMoreCorrelationMatrix;}
void SetNCentralityBinAtTheEnd(Int_t nCentralityBinAtTheEnd) {fNCentralityBinAtTheEnd = nCentralityBinAtTheEnd; };
void SetLowHighBoundaryCentralityBinAtTheEnd(Int_t low, Int_t high, Int_t i) { fLowBoundaryCentralityBinAtTheEnd[i] = low; fHighBoundaryCentralityBinAtTheEnd[i] = high;};
void SetBeautyAnalysis() { fInclusiveSpectrum = kFALSE; };
void CallInputFileForBeauty2ndMethod();
void SetInputFileForBeauty2ndMethod(const char *filenameb = "BSpectrum2ndmethod.root"){fkBeauty2ndMethodfilename = filenameb; };
void SetBeautyAnalysis2ndMethod(Bool_t beauty2ndmethod) { fBeauty2ndMethod = beauty2ndmethod; }
void SetIPEffCombinedSamples(Bool_t ipEffCombinedSamples) { fIPEffCombinedSamples = ipEffCombinedSamples; }
void SetHadronEffbyIPcut(THnSparseF* hsHadronEffbyIPcut) { fHadronEffbyIPcut = hsHadronEffbyIPcut;};
void SetNonHFEsyst(Bool_t syst){ fNonHFEsyst = syst; };
void SetStepGuessedUnfolding(Int_t stepGuessedUnfolding) { fStepGuessedUnfolding = stepGuessedUnfolding; };
void SetNumberOfIteration(Int_t numberOfIteration) { fNumberOfIterations = numberOfIteration; };
void SetUnfoldingRandomIterations(Int_t niter) { fNRandomIter = niter; }
void SetDumpToFile(Bool_t dumpToFile) { fDumpToFile=dumpToFile; };
void SetDebugLevel(Int_t debugLevel, Bool_t writeToFile = kFALSE) { fDebugLevel = debugLevel; fWriteToFile = writeToFile; };
void SetUnfoldBG() { fUnfoldBG = kTRUE; };
AliCFDataGrid* GetRawBspectra2ndMethod();
AliCFDataGrid* GetCharmBackground();
AliCFDataGrid* GetConversionBackground();
AliCFDataGrid* GetNonHFEBackground();
THnSparse* GetCharmWeights();
THnSparse* GetBeautyIPEff(Bool_t isMCpt);
THnSparse* GetPIDxIPEff(Int_t source);
void CalculateNonHFEsyst(Int_t centrality = 0);
void EnableIPanaHadronBgSubtract() { fIPanaHadronBgSubtract = kTRUE; };
void EnableIPanaCharmBgSubtract() { fIPanaCharmBgSubtract = kTRUE; };
void EnableIPanaConversionBgSubtract() { fIPanaConversionBgSubtract = kTRUE; };
void EnableIPanaNonHFEBgSubtract() { fIPanaNonHFEBgSubtract = kTRUE; };
void EnableIPParameterizedEff() { fIPParameterizedEff = kTRUE; };
protected:
AliCFContainer *GetContainer(AliHFEspectrum::CFContainer_t contt);
AliCFContainer *GetSlicedContainer(AliCFContainer *cont, Int_t ndim, Int_t *dimensions,Int_t source=-1,Chargetype_t charge=kAllCharge,Int_t centralitylow=-1, Int_t centralityhigh=-1);
THnSparseF *GetSlicedCorrelation(THnSparseF *correlationmatrix,Int_t nDim, Int_t *dimensions,Int_t centralitylow=-1, Int_t centralityhigh=-1) const;
TObject* GetSpectrum(const AliCFContainer * const c, Int_t step);
TObject* GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0);
void AddTemporaryObject(TObject *cont);
void ClearObject(TObject *o);
TGraphErrors *NormalizeTH1(TH1 *input,Int_t i = 0) const;
private:
AliHFEspectrum(const AliHFEspectrum &);
AliHFEspectrum &operator=(const AliHFEspectrum &);
TObjArray *fCFContainers;
TList *fTemporaryObjects;
THnSparseF *fCorrelation;
AliCFDataGrid *fBackground;
TF1 *fEfficiencyFunction;
TF1 *fEfficiencyTOFPIDD[kCentrality];
TF1 *fEfficiencyesdTOFPIDD[kCentrality];
TF1 *fEfficiencyIPCharmD[kCentrality];
TF1 *fEfficiencyIPBeautyD[kCentrality];
TF1 *fEfficiencyIPBeautyesdD[kCentrality];
TF1 *fEfficiencyIPConversionD[kCentrality];
TF1 *fEfficiencyIPNonhfeD[kCentrality];
THnSparseF *fWeightCharm;
AliCFContainer *fConvSourceContainer[kElecBgSources][kBgLevels][kCentrality];
AliCFContainer *fNonHFESourceContainer[kElecBgSources][kBgLevels][kCentrality];
Bool_t fInclusiveSpectrum;
Bool_t fDumpToFile;
Bool_t fEtaSelected;
Bool_t fUnSetCorrelatedErrors;
Bool_t fSetSmoothing;
Bool_t fIPanaHadronBgSubtract;
Bool_t fIPanaCharmBgSubtract;
Bool_t fIPanaConversionBgSubtract;
Bool_t fIPanaNonHFEBgSubtract;
Bool_t fIPParameterizedEff;
Bool_t fNonHFEsyst;
Bool_t fBeauty2ndMethod;
Bool_t fIPEffCombinedSamples;
Int_t fNbDimensions;
Int_t fNEvents[20];
Int_t fNMCEvents;
Int_t fNMCbgEvents[20];
Int_t fStepMC;
Int_t fStepTrue;
Int_t fStepData;
Int_t fStepBeforeCutsV0;
Int_t fStepAfterCutsV0;
Int_t fStepGuessedUnfolding;
Int_t fNumberOfIterations;
Int_t fNRandomIter;
Chargetype_t fChargeChoosen;
Double_t fEtaRange[2];
Double_t fEtaRangeNorm[2];
Int_t fNCentralityBinAtTheEnd;
Int_t fLowBoundaryCentralityBinAtTheEnd[20];
Int_t fHighBoundaryCentralityBinAtTheEnd[20];
Int_t fTestCentralityLow;
Int_t fTestCentralityHigh;
Bool_t fFillMoreCorrelationMatrix;
THnSparseF *fHadronEffbyIPcut;
TH1D *fEfficiencyCharmSigD[kCentrality];
TH1D *fEfficiencyBeautySigD[kCentrality];
TH1D *fEfficiencyBeautySigesdD[kCentrality];
TH1D *fConversionEff[kCentrality];
TH1D *fNonHFEEff[kCentrality];
TH1D *fCharmEff[kCentrality];
TH1D *fBeautyEff[kCentrality];
TH1D *fConversionEffbgc;
TH1D *fNonHFEEffbgc;
TH1D *fBSpectrum2ndMethod;
const char *fkBeauty2ndMethodfilename;
Char_t fBeamType;
Bool_t fEtaSyst;
Int_t fDebugLevel;
Bool_t fWriteToFile;
Bool_t fUnfoldBG;
ClassDef(AliHFEspectrum, 1)
};
#endif