00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef ROOT_Fit_PoissonLikelihoodFCN
00014 #define ROOT_Fit_PoissonLikelihoodFCN
00015
00016 #ifndef ROOT_Math_FitMethodunction
00017 #include "Math/FitMethodFunction.h"
00018 #endif
00019
00020 #ifndef ROOT_Math_IParamFunction
00021 #include "Math/IParamFunction.h"
00022 #endif
00023
00024 #ifndef ROOT_Fit_BinData
00025 #include "Fit/BinData.h"
00026 #endif
00027
00028 #ifndef ROOT_Fit_FitUtil
00029 #include "Fit/FitUtil.h"
00030 #endif
00031
00032
00033
00034
00035
00036
00037
00038
00039 namespace ROOT {
00040
00041 namespace Fit {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 template<class FunType>
00053 class PoissonLikelihoodFCN : public ::ROOT::Math::BasicFitMethodFunction<FunType> {
00054
00055 public:
00056
00057
00058 typedef ::ROOT::Math::BasicFitMethodFunction<FunType> BaseObjFunction;
00059 typedef typename BaseObjFunction::BaseFunction BaseFunction;
00060
00061 typedef ::ROOT::Math::IParamMultiFunction IModelFunction;
00062
00063
00064
00065
00066
00067 PoissonLikelihoodFCN (const BinData & data, const IModelFunction & func) :
00068 BaseObjFunction(func.NPar(), data.Size() ),
00069 fData(data),
00070 fFunc(func),
00071 fNEffPoints(0),
00072 fGrad ( std::vector<double> ( func.NPar() ) )
00073 { }
00074
00075
00076
00077
00078
00079 ~PoissonLikelihoodFCN () {}
00080
00081 private:
00082
00083
00084
00085
00086
00087 PoissonLikelihoodFCN(const PoissonLikelihoodFCN &);
00088
00089
00090
00091
00092 PoissonLikelihoodFCN & operator = (const PoissonLikelihoodFCN &);
00093
00094 public:
00095
00096
00097 virtual BaseFunction * Clone() const { return new PoissonLikelihoodFCN(fData,fFunc); }
00098
00099
00100 virtual unsigned int NFitPoints() const { return fNEffPoints; }
00101
00102
00103 virtual double DataElement(const double * x, unsigned int i, double * g) const {
00104 if (i==0) this->UpdateNCalls();
00105 return FitUtil::EvaluatePoissonBinPdf(fFunc, fData, x, i, g);
00106 }
00107
00108
00109 virtual void Gradient(const double *x, double *g) const {
00110
00111 FitUtil::EvaluatePoissonLogLGradient(fFunc, fData, x, g );
00112 }
00113
00114
00115 virtual typename BaseObjFunction::Type_t Type() const { return BaseObjFunction::kLogLikelihood; }
00116
00117
00118 virtual const BinData & Data() const { return fData; }
00119
00120
00121 virtual const IModelFunction & ModelFunction() const { return fFunc; }
00122
00123
00124 protected:
00125
00126
00127 private:
00128
00129
00130
00131
00132 virtual double DoEval (const double * x) const {
00133 this->UpdateNCalls();
00134 return FitUtil::EvaluatePoissonLogL(fFunc, fData, x, fNEffPoints);
00135 }
00136
00137
00138 virtual double DoDerivative(const double * x, unsigned int icoord ) const {
00139 Gradient(x, &fGrad[0]);
00140 return fGrad[icoord];
00141 }
00142
00143
00144
00145
00146 const BinData & fData;
00147 const IModelFunction & fFunc;
00148
00149 mutable unsigned int fNEffPoints;
00150
00151 mutable std::vector<double> fGrad;
00152
00153 };
00154
00155
00156 typedef PoissonLikelihoodFCN<ROOT::Math::IMultiGenFunction> PoissonLLFunction;
00157 typedef PoissonLikelihoodFCN<ROOT::Math::IMultiGradFunction> PoissonLLGradFunction;
00158
00159
00160 }
00161
00162 }
00163
00164
00165 #endif