ReneTest.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: ReneTest.cxx 20880 2007-11-19 11:23:41Z rdm $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 // $Id: ReneTest.cxx 20880 2007-11-19 11:23:41Z rdm $
00011 #ifdef _WIN32 
00012   #define _USE_MATH_DEFINES
00013 #endif
00014 #include "Minuit2/FunctionMinimum.h"
00015 #include "Minuit2/MnMigrad.h"
00016 #include "Minuit2/MnMinos.h"
00017 #include "Minuit2/MnUserParameters.h"
00018 #include "Minuit2/MnPrint.h"
00019 #include "Minuit2/FCNBase.h"
00020 #include "Minuit2/MnScan.h"
00021 #include "Minuit2/MnPlot.h"
00022 
00023 using namespace ROOT::Minuit2;
00024 
00025 class ReneFcn : public FCNBase {
00026 
00027 
00028 public:
00029 
00030   ReneFcn(const std::vector<double>& meas) : fMeasurements(meas) {}
00031 
00032   virtual ~ReneFcn() {}
00033 
00034   virtual double operator()(const std::vector<double>& par) const {
00035     double a = par[2];
00036     double b = par[1];
00037     double c = par[0];
00038     double p0 = par[3];
00039     double p1 = par[4];
00040     double p2 = par[5];
00041     double fval = 0.;
00042 //     double nbin = 3./double(fMeasurements.size());
00043     for(unsigned int i = 0; i < fMeasurements.size(); i++) {
00044       double ni = fMeasurements[i];
00045       if(ni < 1.e-10) continue;
00046 //       double xi = (i + 0.5)*nbin; //xi=0-3
00047 //       double xi = (i+0.5)/20.; //xi=0-3
00048 //       double xi = (i+0.5)/40.; //xi=0-3
00049       double xi = (i+1.)/40. - 1./80.; //xi=0-3
00050       double ei = ni;
00051 //       double nexp1 = a*xi*xi + b*xi + c;
00052 //       double nexp2 = 0.5*p0*p1/M_PI;
00053 //       double nexp3 = std::max(1.e-10, (xi-p2)*(xi-p2) + 0.25*p1*p1); 
00054 //       double nexp = nexp1 + nexp2/nexp3;
00055       double nexp = a*xi*xi + b*xi + c + (0.5*p0*p1/M_PI)/std::max(1.e-10, (xi-p2)*(xi-p2) + 0.25*p1*p1);
00056       fval += (ni-nexp)*(ni-nexp)/ei;
00057     }
00058     return fval;
00059   }
00060 
00061   virtual double Up() const {return 1.;}
00062 
00063 private:
00064   std::vector<double> fMeasurements;
00065 };
00066 
00067  
00068 /*
00069 extern "C" void fcnr_(int&, double[], double&, double[], int&);
00070 extern "C" void stand_() {}
00071 
00072 class ReneFcn : public FCNBase {
00073 
00074 public:
00075 
00076   ReneFcn(const std::vector<double>& meas) : fMeasurements(meas) {}
00077 
00078   virtual ~ReneFcn() {}
00079 
00080   virtual double operator()(const std::vector<double>& par) const {
00081     double mypar[6];
00082     for(std::vector<double>::const_iterator ipar = par.begin();
00083         ipar != par.end(); ipar++)
00084       mypar[ipar-par.begin()] = par[ipar-par.begin()];
00085     double fval = 0.;
00086     int iflag = 4;
00087     int npar = par.size();
00088     fcnr_(npar, 0,  fval, mypar, iflag);
00089     
00090     return fval;
00091   }
00092 
00093   virtual double Up() const {return 1.;}
00094 
00095 private:
00096   std::vector<double> fMeasurements;
00097 };
00098 
00099 */
00100 
00101 
00102 int main() {
00103   /*
00104   double tmp[60] = {6., 1.,10.,12., 6.,13.,23.,22.,15.,21.,
00105                     23.,26.,36.,25.,27.,35.,40.,44.,66.,81.,
00106                     75.,57.,48.,45.,46.,41.,35.,36.,53.,32.,
00107                     40.,37.,38.,31.,36.,44.,42.,37.,32.,32.,
00108                     43.,44.,35.,33.,33.,39.,29.,41.,32.,44.,
00109                     26.,39.,29.,35.,32.,21.,21.,15.,25.,15.};
00110   std::vector<double> measurements(tmp, tmp+60);
00111   */
00112   /*
00113   double tmp[120] = {2.,1.,1.,0.,1.,1.,0.,1.,3.,0.,0.,1.,0.,
00114                      1.,1.,0.,0.,1.,0.,0.,0.,0.,2.,1.,1.,2.,
00115                      2.,0.,2.,4.,2.,6.,2.,1.,4.,0.,3.,6.,16.,
00116                      30.,34.,18.,8.,2.,3.,4.,4.,5.,6.,3.,5.,
00117                      0.,1.,1.,7.,3.,2.,5.,1.,3.,5.,3.,2.,3.,
00118                      2.,2.,1.,1.,5.,2.,3.,7.,2.,7.,6.,5.,1.,
00119                      4.,5.,0.,6.,3.,4.,3.,3.,6.,8.,8.,3.,4.,
00120                      4.,8.,9.,7.,3.,4.,6.,2.,5.,10.,7.,6.,4.,
00121                      4.,7.,7.,5.,4.,12.,4.,6.,3.,7.,4.,3.,4.,
00122                      3,10.,8.,7.};  
00123   */
00124   double tmp[120] = {38.,36.,46.,52.,54.,52.,61.,52.,64.,77.,
00125                      60.,56.,78.,71.,81.,83.,89.,96.,118.,96.,
00126                      109.,111.,107.,107.,135.,156.,196.,137.,
00127                      160.,153.,185.,222.,251.,270.,329.,422.,
00128                      543.,832.,1390.,2835.,3462.,2030.,1130.,
00129                      657.,469.,411.,375.,295.,281.,281.,289.,
00130                      273.,297.,256.,274.,287.,280.,274.,286.,
00131                      279.,293.,314.,285.,322.,307.,313.,324.,
00132                      351.,314.,314.,301.,361.,332.,342.,338.,
00133                      396.,356.,344.,395.,416.,406.,411.,422.,
00134                      393.,393.,409.,455.,427.,448.,459.,403.,
00135                      441.,510.,501.,502.,482.,487.,506.,506.,
00136                      526.,517.,534.,509.,482.,591.,569.,518.,
00137                      609.,569.,598.,627.,617.,610.,662.,666.,
00138                      652.,671.,647.,650.,701.};
00139 
00140   std::vector<double> measurements(tmp, tmp+120);
00141                                                              
00142   ReneFcn fFCN(measurements);
00143 
00144   MnUserParameters upar;
00145   upar.Add("p0", 100., 10.);
00146   upar.Add("p1", 100., 10.);
00147   upar.Add("p2", 100., 10.);
00148   upar.Add("p3", 100., 10.);
00149   upar.Add("p4", 1., 0.3);
00150   upar.Add("p5", 1., 0.3);
00151   /*
00152 # ext. ||   Name    ||   type  ||   Value   ||  Error +/- 
00153 
00154    0   ||        p0 ||  free   ||     32.04 ||   9.611
00155    1   ||        p1 ||  free   ||     98.11 ||   29.43
00156    2   ||        p2 ||  free   ||     39.15 ||   11.75
00157    3   ||        p3 ||  free   ||     362.4 ||   108.7
00158    4   ||        p4 ||  free   ||   0.06707 || 0.02012
00159    5   ||        p5 ||  free   ||     1.006 ||  0.3019
00160 
00161   upar.Add(0, "p0", 32.04, 9.611);
00162   upar.Add(1, "p1", 98.11, 29.43);
00163   upar.Add(2, "p2", 39.15, 11.75);
00164   upar.Add(3, "p3", 362.4, 108.7);
00165   upar.Add(4, "p4", 0.06707, 0.02012);
00166   upar.Add(5, "p5", 1.006, 0.3019);
00167   */
00168 
00169   std::cout<<"initial parameters: "<<upar<<std::endl;
00170 
00171   std::cout<<"start migrad "<<std::endl;
00172   MnMigrad migrad(fFCN, upar);
00173   FunctionMinimum min = migrad();
00174   if(!min.IsValid()) {
00175     //try with higher strategy
00176     std::cout<<"FM is invalid, try with strategy = 2."<<std::endl;
00177     MnMigrad migrad2(fFCN, min.UserState(), MnStrategy(2));
00178     min = migrad2();
00179   } 
00180   std::cout<<"minimum: "<<min<<std::endl;
00181   /*
00182   std::cout<<"start Minos"<<std::endl;
00183   MnMinos Minos(migrad, min);
00184   AsymmetricError e0 = Minos(0);
00185   AsymmetricError e1 = Minos(1);
00186   AsymmetricError e2 = Minos(2);
00187   
00188   std::cout<<"par0: "<<e0.Value()<<" + "<<e0.Upper()<<e0.Lower()<<std::endl;
00189   std::cout<<"par1: "<<e1.Value()<<" + "<<e1.Upper()<<e1.Lower()<<std::endl;
00190   std::cout<<"par2: "<<e2.Value()<<" + "<<e2.Upper()<<e2.Lower()<<std::endl;
00191   */
00192 
00193   {
00194     std::vector<double> params(6, 1.);
00195     std::vector<double> Error(6, 1.);
00196     MnScan scan(fFCN, params, Error);
00197     std::cout<<"scan parameters: "<<scan.Parameters()<<std::endl;
00198     MnPlot plot;
00199     for(unsigned int i = 0; i < upar.VariableParameters(); i++) {
00200       std::vector<std::pair<double, double> > xy = scan.Scan(i);
00201 //       std::vector<std::pair<double, double> > xy = scan.scan(0);
00202       plot(xy);
00203     }
00204     std::cout<<scan.Parameters()<<std::endl;
00205   }
00206 
00207   {
00208     std::vector<double> params(6, 1.);
00209     std::vector<double> Error(6, 1.);
00210     MnScan scan(fFCN, params, Error);
00211     std::cout<<"scan parameters: "<<scan.Parameters()<<std::endl;
00212     FunctionMinimum min = scan();
00213 //     std::cout<<min<<std::endl;
00214     std::cout<<scan.Parameters()<<std::endl;
00215   }
00216 
00217   return 0;
00218 }
00219 

Generated on Tue Jul 5 14:37:13 2011 for ROOT_528-00b_version by  doxygen 1.5.1