PaulTest.cxx

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

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