00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #ifndef ROOT_TFumiliChi2FCN_H_
00011 #define ROOT_TFumiliChi2FCN_H_
00012 
00013 #include "Minuit2/FumiliFCNBase.h"
00014 
00015 
00016 class TF1;
00017 class TVirtualFitter;
00018 
00019 class TChi2FitData;
00020 
00021 
00022 
00023 
00024 
00025 
00026 class TFumiliFCN : public ROOT::Minuit2::FumiliFCNBase {
00027 
00028 public: 
00029 
00030 
00031   typedef TF1 ModelFunction;
00032   typedef TChi2FitData FumiliFitData; 
00033   
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042   TFumiliFCN( const TVirtualFitter & fitter, double up = 1., int strategy = 1, bool sipEmptyBins = true);  
00043 
00044 
00045 
00046 
00047 
00048   virtual ~TFumiliFCN();
00049 
00050  
00051 
00052 
00053 
00054   virtual double operator()(const std::vector<double>&) const = 0; 
00055 
00056 
00057 
00058 
00059 
00060   void EvaluateAll( const std::vector<double> & );  
00061 
00062 
00063 
00064 
00065   double Up() const { return fUp; }
00066 
00067   void SetErrorDef (double up) { fUp = up; }
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075   void Initialize(unsigned int npar);
00076 
00077 
00078 protected: 
00079   
00080   
00081   void Calculate_gradient_and_hessian(const std::vector<double> & p);
00082 
00083   void Calculate_numerical_gradient( const std::vector<double> & x, double f0);
00084 
00085  void Calculate_numerical_gradient_of_integral( const std::vector<double> & x1,  const std::vector<double> & x2, double f0);
00086 
00087   
00088   
00089   virtual void Calculate_element(int i, const FumiliFitData & points, double fval, double & chi2, std::vector<double> & grad,   std::vector<double> & hess ) = 0;
00090 
00091 protected: 
00092 
00093   double fUp; 
00094   FumiliFitData * fData; 
00095   ModelFunction * fFunc; 
00096   
00097 
00098 
00099 
00100   
00101   std::vector<double>  fParamCache; 
00102   std::vector<double>  fFunctionGradient; 
00103 
00104   int fStrategy;
00105 };
00106 
00107 
00108 class TFumiliChi2FCN : public TFumiliFCN {
00109 
00110   public: 
00111 
00112 
00113 
00114 
00115 
00116 
00117   TFumiliChi2FCN( const TVirtualFitter & fitter, int strategy = 1) : 
00118     TFumiliFCN(fitter, 1.0, strategy, true) {}
00119 
00120   virtual ~TFumiliChi2FCN() {}
00121 
00122 
00123 
00124 
00125 
00126   double operator()(const std::vector<double>&) const; 
00127 
00128 protected: 
00129 
00130   virtual void Calculate_element(int i, const TChi2FitData & points, double fval, double & chi2, std::vector<double> & grad, std::vector<double> & hess );
00131   
00132 };
00133 
00134 
00135 
00136 
00137  
00138 
00139 class TFumiliBinLikelihoodFCN : public TFumiliFCN {
00140 
00141   public: 
00142 
00143 
00144 
00145 
00146 
00147 
00148   TFumiliBinLikelihoodFCN( const TVirtualFitter & fitter, int strategy = 1)  : 
00149     TFumiliFCN(fitter, 1.0, strategy, false) {}
00150 
00151 
00152   virtual ~TFumiliBinLikelihoodFCN() {}
00153 
00154 
00155 
00156 
00157   double operator()(const std::vector<double>&) const; 
00158 
00159 
00160 
00161 
00162   double Chi2 ( const std::vector<double>&) const; 
00163 
00164 protected: 
00165 
00166   virtual void Calculate_element(int i, const TChi2FitData & points, double fval, double & chi2, std::vector<double> & grad,   std::vector<double> & hess );
00167 
00168 };
00169 
00170 
00171 
00172 
00173  
00174 class TFumiliUnbinLikelihoodFCN : public TFumiliFCN {
00175 
00176   public: 
00177 
00178 
00179 
00180 
00181 
00182 
00183   TFumiliUnbinLikelihoodFCN( const TVirtualFitter & fitter, int strategy = 1) : 
00184     TFumiliFCN(fitter, 0.5, strategy, false) {}
00185 
00186   virtual ~TFumiliUnbinLikelihoodFCN() {}
00187 
00188 
00189 
00190 
00191   double operator()(const std::vector<double>&) const; 
00192 
00193 protected: 
00194 
00195   virtual void Calculate_element(int i, const TChi2FitData & points, double fval, double & chi2, std::vector<double> & grad,   std::vector<double> & hess );
00196 
00197 };
00198 
00199 #endif