#ifndef ROOT_TFractionFitter
#define ROOT_TFractionFitter
#ifndef ROOT_TVirtualFitter
# include "TVirtualFitter.h"
#endif
#ifndef ROOT_TObjArray
# include "TObjArray.h"
#endif
#ifndef ROOT_TFitResultPtr
#include "TFitResultPtr.h"
#endif
#include <vector>
class TH1;
namespace ROOT {
namespace Fit {
class Fitter;
}
}
class TFractionFitter: public TObject {
public:
TFractionFitter();
TFractionFitter(TH1* data, TObjArray *MCs, Option_t *option="");
virtual ~TFractionFitter();
ROOT::Fit::Fitter* GetFitter() const;
void ErrorAnalysis(Double_t UP);
void SetRangeX(Int_t low, Int_t high);
void ReleaseRangeX();
void SetRangeY(Int_t low, Int_t high);
void ReleaseRangeY();
void SetRangeZ(Int_t low, Int_t high);
void ReleaseRangeZ();
void ExcludeBin(Int_t bin);
void IncludeBin(Int_t bin);
void Constrain(Int_t parm, Double_t low, Double_t high);
void UnConstrain(Int_t parm);
void SetData(TH1 *data);
void SetMC(Int_t parm, TH1 *MC);
void SetWeight(Int_t parm, TH1* weight);
TFitResultPtr Fit();
void GetResult(Int_t parm, Double_t& value, Double_t& error) const;
TH1* GetPlot();
Double_t GetChisquare() const;
Int_t GetNDF() const;
Double_t GetProb() const;
TH1* GetMCPrediction(Int_t parm) const;
Double_t EvaluateFCN(const Double_t * par) {
Double_t f = 0;
ComputeFCN(f, par, 0);
return f;
}
private:
void CheckParNo(Int_t parm) const;
void CheckConsistency();
void FindPrediction(int bin, double& t_i, int& k_0, double& A_ki) const;
void ComputeFCN(Double_t& f, const Double_t* par, Int_t flag);
void GetRanges(Int_t& minX, Int_t& maxX, Int_t& minY, Int_t& maxY,
Int_t& minZ, Int_t& maxZ) const;
void ComputeChisquareLambda();
bool IsExcluded(Int_t bin) const;
protected:
Bool_t fFitDone;
Int_t fLowLimitX;
Int_t fHighLimitX;
Int_t fLowLimitY;
Int_t fHighLimitY;
Int_t fLowLimitZ;
Int_t fHighLimitZ;
std::vector<Int_t> fExcludedBins;
Int_t fNpfits;
Int_t fNDF;
Double_t fChisquare;
TObjArray fAji;
TH1* fData;
TObjArray fMCs;
TObjArray fWeights;
Double_t fIntegralData;
Double_t* fIntegralMCs;
Double_t* fFractions;
TH1* fPlot;
ROOT::Fit::Fitter *fFractionFitter;
Int_t fNpar;
ClassDef(TFractionFitter, 1)
};
void TFractionFitFCN(Int_t& npar, Double_t* gin, Double_t& f, Double_t* par, Int_t flag);
#endif // ROOT_TFractionFitter