PaulTest2.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: PaulTest2.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 "Minuit2/FunctionMinimum.h"
00012 #include "Minuit2/MnMigrad.h"
00013 #include "Minuit2/MnMinos.h"
00014 #include "Minuit2/MnPrint.h"
00015 
00016 #include <iostream>
00017 #include <fstream>
00018 
00019 
00020 #ifdef USE_SEALBASE
00021 #include "SealBase/Filename.h"
00022 #include "SealBase/ShellEnvironment.h"
00023 #endif
00024 
00025 using namespace ROOT::Minuit2;
00026 
00027 
00028 int main() {
00029 
00030   std::vector<double> positions;
00031   std::vector<double> measurements;
00032   std::vector<double> var;
00033   double nmeas = 0;
00034 
00035 #ifdef USE_SEALBASE
00036   seal::Filename   inputFile (seal::Filename ("$SEAL/src/MathLibs/Minuit/tests/MnSim/paul2.txt").substitute (seal::ShellEnvironment ()));
00037   std::ifstream in(inputFile.Name() );
00038 #else
00039   std::ifstream in("paul2.txt");
00040 #endif
00041   if (!in) {
00042     std::cerr << "Error opening input data file" << std::endl;
00043     return 1; 
00044   }
00045 
00046 
00047   // read input data
00048   {
00049     double x = 0., y = 0., width = 0., err = 0., un1 = 0., un2 = 0.;
00050     while(in>>x>>y>>width>>err>>un1>>un2) {
00051       if(err < 1.e-8) continue;
00052       positions.push_back(x);
00053       measurements.push_back(y);
00054       var.push_back(err*err);
00055       nmeas += y;
00056     }
00057     std::cout<<"size= "<<var.size()<<std::endl;
00058     assert(var.size() > 0);
00059     std::cout<<"nmeas: "<<nmeas<<std::endl;
00060   }
00061 
00062   // create FCN function  
00063   GaussFcn fFCN(measurements, positions, var);
00064 
00065   std::vector<double> meas = fFCN.Measurements();
00066   std::vector<double> pos = fFCN.Positions();
00067 
00068   // create initial starting values for parameters
00069   double x = 0.;
00070   double x2 = 0.;
00071   double norm = 0.;
00072   double area = 0.;
00073   double dx = pos[1]-pos[0];
00074   for(unsigned int i = 0; i < meas.size(); i++) {
00075     norm += meas[i];
00076     x += (meas[i]*pos[i]);
00077     x2 += (meas[i]*pos[i]*pos[i]);
00078     area += dx*meas[i];
00079   }
00080   double mean = x/norm;
00081   double rms2 = x2/norm - mean*mean;
00082 
00083   std::cout<<"initial mean: "<<mean<<std::endl;
00084   std::cout<<"initial sigma: "<<sqrt(rms2)<<std::endl;
00085   std::cout<<"initial area: "<<area<<std::endl;
00086   std::vector<double> init_val(3);
00087   init_val[0] = mean;
00088   init_val[1] = sqrt(rms2);
00089   init_val[2] = area; 
00090   std::cout<<"initial fval: "<<fFCN(init_val)<<std::endl;
00091   
00092   MnUserParameters upar;
00093   upar.Add("mean", mean, 1.);
00094   upar.Add("sigma", sqrt(rms2), 1.);
00095   upar.Add("area", area, 10.);
00096 
00097   MnMigrad migrad(fFCN, upar);
00098   std::cout<<"start migrad "<<std::endl;
00099   FunctionMinimum min = migrad();
00100   std::cout<<"minimum: "<<min<<std::endl;
00101 
00102   std::cout<<"start Minos"<<std::endl;
00103   MnMinos Minos(fFCN, min);
00104   std::pair<double,double> e0 = Minos(0);
00105   std::pair<double,double> e1 = Minos(1);
00106   std::pair<double,double> e2 = Minos(2);
00107   
00108   std::cout<<"par0: "<<min.UserState().Value("mean")<<" "<<e0.first<<" "<<e0.second<<std::endl;
00109   std::cout<<"par1: "<<min.UserState().Value(1)<<" "<<e1.first<<" "<<e1.second<<std::endl;
00110   std::cout<<"par2: "<<min.UserState().Value(2)<<" "<<e2.first<<" "<<e2.second<<std::endl;
00111 
00112   return 0;
00113 }

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