DemoGaussSim.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: DemoGaussSim.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 #include "GaussFcn.h"
00011 #include "GaussDataGen.h"
00012 #include "Minuit2/FunctionMinimum.h"
00013 #include "Minuit2/MnUserParameterState.h"
00014 #include "Minuit2/MnPrint.h"
00015 #include "Minuit2/MnMigrad.h"
00016 #include "Minuit2/MnMinos.h"
00017 #include "Minuit2/MnContours.h"
00018 #include "Minuit2/MnPlot.h"
00019 #include "Minuit2/MinosError.h"
00020 #include "Minuit2/ContoursError.h"
00021 
00022 #include <iostream>
00023 
00024 using namespace ROOT::Minuit2;
00025 
00026 int main() {
00027 
00028   // generate the data (100 data points)
00029   GaussDataGen gdg(100);
00030 
00031   std::vector<double> pos = gdg.Positions();
00032   std::vector<double> meas = gdg.Measurements();
00033   std::vector<double> var = gdg.Variances();
00034    
00035   // create FCN function  
00036   GaussFcn fFCN(meas, pos, var);
00037 
00038   // create initial starting values for parameters
00039   double x = 0.;
00040   double x2 = 0.;
00041   double norm = 0.;
00042   double dx = pos[1]-pos[0];
00043   double area = 0.;
00044   for(unsigned int i = 0; i < meas.size(); i++) {
00045     norm += meas[i];
00046     x += (meas[i]*pos[i]);
00047     x2 += (meas[i]*pos[i]*pos[i]);
00048     area += dx*meas[i];
00049   }
00050   double mean = x/norm;
00051   double rms2 = x2/norm - mean*mean;
00052   double rms = rms2 > 0. ? sqrt(rms2) : 1.;
00053 
00054   {
00055     // demonstrate minimal required interface for minimization
00056     // create Minuit parameters without names
00057 
00058     // starting values for parameters
00059     std::vector<double> init_par; 
00060     init_par.push_back(mean); 
00061     init_par.push_back(rms); 
00062     init_par.push_back(area);
00063 
00064     // starting values for initial uncertainties
00065     std::vector<double> init_err; 
00066     init_err.push_back(0.1); 
00067     init_err.push_back(0.1); 
00068     init_err.push_back(0.1);
00069     
00070     // create minimizer (default constructor)
00071     VariableMetricMinimizer fMinimizer;
00072     
00073     // Minimize
00074     FunctionMinimum min = fMinimizer.Minimize(fFCN, init_par, init_err);
00075 
00076     // output
00077     std::cout<<"minimum: "<<min<<std::endl;
00078   }
00079 
00080   {
00081     // demonstrate standard minimization using MIGRAD
00082     // create Minuit parameters with names
00083     MnUserParameters upar;
00084     upar.Add("mean", mean, 0.1);
00085     upar.Add("sigma", rms, 0.1);
00086     upar.Add("area", area, 0.1);
00087 
00088     // create MIGRAD minimizer
00089     MnMigrad migrad(fFCN, upar);
00090 
00091     // Minimize
00092     FunctionMinimum min = migrad();
00093 
00094     // output
00095     std::cout<<"minimum: "<<min<<std::endl;
00096   }
00097 
00098   {
00099     // demonstrate full interaction with parameters over subsequent 
00100     // minimizations
00101 
00102     // create Minuit parameters with names
00103     MnUserParameters upar;
00104     upar.Add("mean", mean, 0.1);
00105     upar.Add("sigma", rms, 0.1);
00106     upar.Add("area", area, 0.1);
00107 
00108     // access Parameter by Name to set limits...
00109     upar.SetLimits("mean", mean-0.01, mean+0.01);
00110 
00111     // ... or access Parameter by Index
00112     upar.SetLimits(1, rms-0.1, rms+0.1);
00113     
00114     // create Migrad minimizer
00115     MnMigrad migrad(fFCN, upar);
00116 
00117     // Fix a Parameter...
00118     migrad.Fix("mean");
00119 
00120     // ... and Minimize
00121     FunctionMinimum min = migrad();
00122 
00123     // output
00124     std::cout<<"minimum: "<<min<<std::endl;
00125 
00126     // Release a Parameter...
00127     migrad.Release("mean");
00128 
00129     // ... and Fix another one
00130     migrad.Fix(1);
00131 
00132     // and Minimize again
00133     FunctionMinimum min1 = migrad();
00134  
00135     // output
00136     std::cout<<"minimum1: "<<min1<<std::endl;
00137 
00138     // Release the Parameter...
00139     migrad.Release(1);
00140 
00141     // ... and Minimize with all three parameters (still with limits!)
00142     FunctionMinimum min2 = migrad();
00143     
00144     // output
00145     std::cout<<"minimum2: "<<min2<<std::endl;
00146 
00147     // remove all limits on parameters...
00148     migrad.RemoveLimits("mean");
00149     migrad.RemoveLimits("sigma");
00150 
00151     // ... and Minimize again with all three parameters (now without limits!)
00152     FunctionMinimum min3 = migrad();
00153 
00154     // output
00155     std::cout<<"minimum3: "<<min3<<std::endl;
00156   }
00157 
00158   {
00159     // test single sided limits
00160     MnUserParameters upar;
00161     upar.Add("mean", mean, 0.1);
00162     upar.Add("sigma", rms-1., 0.1);
00163     upar.Add("area", area, 0.1);
00164 
00165     // test Lower limits
00166     upar.SetLowerLimit("mean", mean-0.01);
00167 
00168     // test Upper limits
00169     upar.SetUpperLimit("sigma", rms-0.5);
00170 
00171     // create MIGRAD minimizer
00172     MnMigrad migrad(fFCN, upar);
00173 
00174     // ... and Minimize
00175     FunctionMinimum min = migrad();
00176     std::cout<<"test Lower limit minimim= "<<min<<std::endl;
00177   }
00178 
00179   {
00180     // demonstrate MINOS Error analysis
00181 
00182     // create Minuit parameters with names
00183     MnUserParameters upar;
00184     upar.Add("mean", mean, 0.1);
00185     upar.Add("sigma", rms, 0.1);
00186     upar.Add("area", area, 0.1);
00187 
00188     // create Migrad minimizer
00189     MnMigrad migrad(fFCN, upar);
00190 
00191     // Minimize
00192     FunctionMinimum min = migrad();
00193 
00194     // create MINOS Error factory
00195     MnMinos Minos(fFCN, min);
00196 
00197     {
00198       // 1-sigma MINOS errors (minimal interface)
00199       std::pair<double,double> e0 = Minos(0);
00200       std::pair<double,double> e1 = Minos(1);
00201       std::pair<double,double> e2 = Minos(2);
00202       
00203       // output
00204       std::cout<<"1-sigma Minos errors: "<<std::endl;
00205       std::cout<<"par0: "<<min.UserState().Value("mean")<<" "<<e0.first<<" "<<e0.second<<std::endl;
00206       std::cout<<"par1: "<<min.UserState().Value(1)<<" "<<e1.first<<" "<<e1.second<<std::endl;
00207       std::cout<<"par2: "<<min.UserState().Value("area")<<" "<<e2.first<<" "<<e2.second<<std::endl;
00208     }
00209 
00210     {
00211       // 2-sigma MINOS errors (rich interface)
00212       fFCN.SetErrorDef(4.);
00213       MinosError e0 = Minos.Minos(0);
00214       MinosError e1 = Minos.Minos(1);
00215       MinosError e2 = Minos.Minos(2);
00216       
00217       // output
00218       std::cout<<"2-sigma Minos errors: "<<std::endl;
00219       std::cout<<e0<<std::endl;
00220       std::cout<<e1<<std::endl;
00221       std::cout<<e2<<std::endl;
00222     }
00223   }
00224 
00225   {
00226     // demostrate MINOS Error analysis with limits
00227 
00228     // create Minuit parameters with names
00229     MnUserParameters upar;
00230     upar.Add("mean", mean, 0.1);
00231     upar.Add("sigma", rms, 0.1);
00232     upar.Add("area", area, 0.1);
00233 
00234     double meanLow = -50.03;
00235     double rmsUp = 1.55;
00236     std::cout << "sigma Limit: " << rmsUp << "\tmean limit: " << meanLow << std::endl;
00237     // test Lower limits
00238     upar.SetLowerLimit("mean", meanLow);
00239     // test Upper limits
00240     upar.SetUpperLimit("sigma", rmsUp);
00241 
00242     // create Migrad minimizer
00243     MnMigrad migrad(fFCN, upar);
00244 
00245     // Minimize
00246     FunctionMinimum min = migrad();
00247 
00248     // create MINOS Error factory
00249     MnMinos Minos(fFCN, min);
00250 
00251     {
00252       // 3-sigma MINOS errors (minimal interface)
00253       fFCN.SetErrorDef(9.);
00254       std::pair<double,double> e0 = Minos(0);
00255       std::pair<double,double> e1 = Minos(1);
00256       std::pair<double,double> e2 = Minos(2);
00257 
00258       
00259       // output
00260       std::cout<<"3-sigma Minos errors with limits: "<<std::endl;
00261       std::cout.precision(16);
00262       std::cout<<"par0: "<<min.UserState().Value("mean")<<" "<<e0.first<<" "<<e0.second<<std::endl;
00263       std::cout<<"par1: "<<min.UserState().Value(1)<<" "<<e1.first<<" "<<e1.second<<std::endl;
00264       std::cout<<"par2: "<<min.UserState().Value("area")<<" "<<e2.first<<" "<<e2.second<<std::endl;
00265 
00266 
00267     }
00268 
00269   }
00270 
00271   {
00272     // demonstrate how to use the CONTOURs
00273 
00274     // create Minuit parameters with names
00275     MnUserParameters upar;
00276     upar.Add("mean", mean, 0.1);
00277     upar.Add("sigma", rms, 0.1);
00278     upar.Add("area", area, 0.1);
00279 
00280     // create Migrad minimizer
00281     MnMigrad migrad(fFCN, upar);
00282 
00283     // Minimize
00284     FunctionMinimum min = migrad();
00285 
00286     // create contours factory with FCN and Minimum
00287     MnContours contours(fFCN, min);
00288   
00289     //70% confidence level for 2 parameters Contour around the Minimum
00290     // (minimal interface)
00291     fFCN.SetErrorDef(2.41);
00292     std::vector<std::pair<double,double> > cont = contours(0, 1, 20);
00293 
00294     //95% confidence level for 2 parameters Contour
00295     // (rich interface)
00296     fFCN.SetErrorDef(5.99);
00297     ContoursError cont4 = contours.Contour(0, 1, 20);
00298     
00299     // plot the contours
00300     MnPlot plot;
00301     cont.insert(cont.end(), cont4().begin(), cont4().end());
00302     plot(min.UserState().Value("mean"), min.UserState().Value("sigma"), cont);
00303 
00304     // print out one Contour
00305     std::cout<<cont4<<std::endl;
00306   }
00307 
00308   return 0;
00309 }

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