13 #ifndef ROOT_Fit_Chi2FCN
14 #define ROOT_Fit_Chi2FCN
48 template<
class DerivFunType,
class ModelFunType = ROOT::Math::IParamMultiFunction>
49 class Chi2FCN :
public BasicFCN<DerivFunType, ModelFunType, BinData> {
53 typedef typename ModelFunType::BackendType T;
54 typedef BasicFCN<DerivFunType, ModelFunType, BinData> BaseFCN;
56 typedef ::ROOT::Math::BasicFitMethodFunction<DerivFunType> BaseObjFunction;
57 typedef typename BaseObjFunction::BaseFunction BaseFunction;
60 typedef ::ROOT::Math::IParamMultiFunctionTempl<T> IModelFunction;
61 typedef typename BaseObjFunction::Type_t Type_t;
66 Chi2FCN (
const std::shared_ptr<BinData> & data,
const std::shared_ptr<IModelFunction> & func, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial) :
69 fGrad ( std::vector<double> ( func->NPar() ) ),
70 fExecutionPolicy(executionPolicy)
77 Chi2FCN (
const BinData & data,
const IModelFunction & func, const ::ROOT::Fit::ExecutionPolicy &executionPolicy = ::ROOT::Fit::ExecutionPolicy::kSerial) :
78 BaseFCN(std::shared_ptr<BinData>(const_cast<BinData*>(&data), DummyDeleter<BinData>()), std::shared_ptr<IModelFunction>(dynamic_cast<IModelFunction*>(func.Clone() ) ) ),
80 fGrad ( std::vector<double> ( func.NPar() ) ),
81 fExecutionPolicy(executionPolicy)
87 virtual ~Chi2FCN () {}
91 Chi2FCN(
const Chi2FCN & f) :
92 BaseFCN(f.DataPtr(), f.ModelFunctionPtr() ),
93 fNEffPoints( f.fNEffPoints ),
95 fExecutionPolicy(f.fExecutionPolicy)
101 Chi2FCN & operator = (
const Chi2FCN & rhs) {
102 SetData(rhs.DataPtr() );
103 SetModelFunction(rhs.ModelFunctionPtr() );
104 fNEffPoints = rhs.fNEffPoints;
111 virtual BaseFunction * Clone()
const {
112 return new Chi2FCN(*
this);
117 using BaseObjFunction::operator();
121 virtual double DataElement(
const double *x,
unsigned int i,
double *g)
const {
122 if (i==0) this->UpdateNCalls();
123 return FitUtil::Evaluate<T>::EvalChi2Residual(BaseFCN::ModelFunction(), BaseFCN::Data(), x, i, g);
127 virtual void Gradient(
const double *x,
double *g)
const {
129 FitUtil::Evaluate<T>::EvalChi2Gradient(BaseFCN::ModelFunction(), BaseFCN::Data(), x, g, fNEffPoints,
134 virtual typename BaseObjFunction::Type_t Type()
const {
return BaseObjFunction::kLeastSquare; }
140 virtual void SetNFitPoints(
unsigned int n)
const { fNEffPoints = n; }
147 virtual double DoEval (
const double * x)
const {
148 this->UpdateNCalls();
149 if (BaseFCN::Data().HaveCoordErrors() || BaseFCN::Data().HaveAsymErrors())
150 return FitUtil::Evaluate<T>::EvalChi2Effective(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints);
152 return FitUtil::Evaluate<T>::EvalChi2(BaseFCN::ModelFunction(), BaseFCN::Data(), x, fNEffPoints, fExecutionPolicy);
156 virtual double DoDerivative(
const double * x,
unsigned int icoord )
const {
157 Gradient(x, fGrad.data());
158 return fGrad[icoord];
162 mutable unsigned int fNEffPoints;
164 mutable std::vector<double> fGrad;
165 ::ROOT::Fit::ExecutionPolicy fExecutionPolicy;
170 typedef Chi2FCN<ROOT::Math::IMultiGenFunction,ROOT::Math::IParamMultiFunction> Chi2Function;
171 typedef Chi2FCN<ROOT::Math::IMultiGradFunction, ROOT::Math::IParamMultiFunction> Chi2GradFunction;