#ifndef ALIHFMASSFITTER_H
#define ALIHFMASSFITTER_H
#include <TNamed.h>
#include <TString.h>
class TF1;
class TNtuple;
class TFile;
class TList;
class TH1F;
class TVirtualPad;
class AliHFMassFitter : public TNamed {
public:
enum ETypeOfBkg{ kExpo=0, kLin=1, kPol2=2, kNoBk=3, kPow=4, kPowEx=5 };
enum ETypeOfSgn{ kGaus=0, k2Gaus=1 };
AliHFMassFitter();
AliHFMassFitter(const TH1F* histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin=1, Int_t fittypeb=kExpo, Int_t fittypes=kGaus);
virtual ~AliHFMassFitter();
AliHFMassFitter(const AliHFMassFitter &mfit);
AliHFMassFitter& operator=(const AliHFMassFitter &mfit);
void SetHisto(const TH1F *histoToFit);
void SetRangeFit(Double_t minvalue, Double_t maxvalue){fminMass=minvalue; fmaxMass=maxvalue; CheckRangeFit();}
void SetMinRangeFit(Double_t minvalue){fminMass=minvalue;printf("CheckRangeFit after SetMaxRangeFit is also set\n");}
void SetMaxRangeFit(Double_t maxvalue){fmaxMass=maxvalue;printf("CheckRangeFit after SetMinRangeFit is also set\n");}
void SetBinN(Int_t newbinN){fNbin=newbinN;}
void SetType(Int_t fittypeb, Int_t fittypes);
void SetReflectionSigmaFactor(Int_t constant) {ffactor=constant;}
void SetInitialGaussianMean(Double_t mean) {fMass=mean;}
void SetInitialGaussianSigma(Double_t sigma) {fSigmaSgn=sigma;}
void SetSideBands(Bool_t onlysidebands=kTRUE) {fSideBands=onlysidebands;}
void SetFixParam(Bool_t *fixpar){fFixPar=fixpar;}
void SetDefaultFixParam();
Bool_t SetFixThisParam(Int_t thispar,Bool_t fixpar);
void SetFixGaussianMean(Double_t mean=1.865,Bool_t fixpar=kTRUE){SetInitialGaussianMean(mean); SetFixThisParam(fNFinalPars-2,fixpar);}
void SetFixGaussianSigma(Double_t sigma=0.012, Bool_t fixpar=kTRUE){SetInitialGaussianSigma(sigma); SetFixThisParam(fNFinalPars-1,fixpar);}
TH1F* GetHistoClone() const;
void GetRangeFit(Double_t &minvalue, Double_t &maxvalue) const {minvalue=fminMass; maxvalue=fmaxMass;}
Double_t GetMinRangeFit()const {return fminMass;}
Double_t GetMaxRangeFit()const {return fmaxMass;}
Int_t GetBinN() const {return fNbin;}
void GetFitPars(Float_t* pars) const;
Int_t GetNFinalPars() const {return fNFinalPars;}
void GetTypeOfFit(Bool_t &background, Int_t &typeb) const {background = fWithBkg; typeb = ftypeOfFit4Bkg;}
Int_t GetReflectionSigmaFactor() const {return ffactor;}
Double_t GetMean() const {return fMass;}
Double_t GetMeanUncertainty() const {return fMassErr;}
Double_t GetSigma()const {return fSigmaSgn;}
Double_t GetSigmaUncertainty()const { return fSigmaSgnErr;}
Double_t GetRawYield()const {return fRawYield;}
Double_t GetRawYieldError()const {return fRawYieldErr;}
Double_t GetChiSquare() const;
Double_t GetReducedChiSquare() const;
void GetSideBandsBounds(Int_t& lb, Int_t& hb) const;
Bool_t* GetFixParam()const {return fFixPar;}
Bool_t GetFixThisParam(Int_t thispar)const;
TVirtualPad* GetPad(Double_t nsigma=3,Int_t writeFitInfo=1)const;
void PrintParTitles() const;
void InitNtuParam(TString ntuname="ntupar");
void FillNtuParam();
TNtuple* GetNtuParam() const {return fntuParam;}
TNtuple* NtuParamOneShot(TString ntuname="ntupar");
void WriteHisto(TString path="./") const;
void WriteNtuple(TString path="./") const;
void WriteCanvas(TString userIDstring="",TString path="./",Double_t nsigma=3,Int_t writeFitInfo=1,Bool_t draw=kFALSE) const;
void DrawHere(TVirtualPad* pd,Double_t nsigma=3,Int_t writeFitInfo=1) const;
void DrawFit(Double_t nsigma=3) const;
void Reset();
void IntS(Float_t *valuewitherror) const;
Double_t IntTot() const {return fhistoInvMass->Integral("width");}
void Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsignal) const;
void Signal(Double_t min,Double_t max,Double_t &signal,Double_t &errsignal) const;
void Background(Double_t nOfSigma,Double_t &background,Double_t &errbackground) const;
void Background(Double_t min,Double_t max,Double_t &background,Double_t &errbackground) const;
void Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const;
void Significance(Double_t min,Double_t max,Double_t &significance,Double_t &errsignificance) const;
Double_t FitFunction4MassDistr (Double_t* x, Double_t* par);
Double_t FitFunction4Sgn (Double_t* x, Double_t* par);
Double_t FitFunction4Bkg (Double_t* x, Double_t* par);
Bool_t MassFitter(Bool_t draw=kTRUE);
Bool_t RefitWithBkgOnly(Bool_t draw=kTRUE);
void RebinMass(Int_t bingroup=1);
TF1* GetBackgroundFullRangeFunc(){
return fhistoInvMass->GetFunction("funcbkgFullRange");
}
TF1* GetBackgroundRecalcFunc(){
return fhistoInvMass->GetFunction("funcbkgRecalc");
}
TF1* GetMassFunc(){
return fhistoInvMass->GetFunction("funcmass");
}
void SetUseLikelihoodFit(){fFitOption="L,";}
void SetUseLikelihoodWithWeightsFit(){fFitOption="WL,";}
void SetUseChi2Fit(){fFitOption="";}
private:
void PlotFit(TVirtualPad* pd,Double_t nsigma=3,Int_t writeFitInfo=1)const;
void ComputeParSize();
void ComputeNFinalPars();
Bool_t SideBandsBounds();
Bool_t CheckRangeFit();
void AddFunctionsToHisto();
TH1F* fhistoInvMass;
Double_t fminMass;
Double_t fmaxMass;
Int_t fminBinMass;
Int_t fmaxBinMass;
Int_t fNbin;
Int_t fParsSize;
Int_t fNFinalPars;
Float_t* fFitPars;
Bool_t fWithBkg;
Int_t ftypeOfFit4Bkg;
Int_t ftypeOfFit4Sgn;
Int_t ffactor;
TNtuple* fntuParam;
Double_t fMass;
Double_t fMassErr;
Double_t fSigmaSgn;
Double_t fSigmaSgnErr;
Double_t fRawYield;
Double_t fRawYieldErr;
Bool_t fSideBands;
Bool_t* fFixPar;
Int_t fSideBandl;
Int_t fSideBandr;
Int_t fcounter;
TString fFitOption;
TList* fContourGraph;
ClassDef(AliHFMassFitter,8);
};
#endif