PaulTest3.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: PaulTest3.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 "GaussFcn2.h"
00011 #include "Minuit2/FunctionMinimum.h"
00012 #include "Minuit2/MnMigrad.h"
00013 #include "Minuit2/MnMinos.h"
00014 #include "Minuit2/MnUserParameterState.h"
00015 #include "Minuit2/MnPrint.h"
00016 
00017 #include <iostream>
00018 #include <fstream>
00019 
00020 
00021 #ifdef USE_SEALBASE
00022 #include "SealBase/Filename.h"
00023 #include "SealBase/ShellEnvironment.h"
00024 #endif
00025 
00026 using namespace ROOT::Minuit2;
00027 
00028 
00029 int main() {
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/paul3.txt").substitute (seal::ShellEnvironment ()));
00037   std::ifstream in(inputFile.Name() );
00038 #else
00039   std::ifstream in("paul3.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       //     xout<<x<<", ";
00057       //     yout<<y<<", ";
00058       //     eout<<err*err<<", ";
00059     }
00060     std::cout<<"size= "<<var.size()<<std::endl;
00061     std::cout<<"nmeas: "<<nmeas<<std::endl;
00062   }
00063 
00064   // create FCN function  
00065   GaussFcn2 fFCN(measurements, positions, var);
00066 
00067   std::vector<double> meas = fFCN.Measurements();
00068   std::vector<double> pos = fFCN.Positions();
00069 
00070   // create initial starting values for parameters
00071   double x = 0.;
00072   double x2 = 0.;
00073   double norm = 0.;
00074   double dx = pos[1]-pos[0];
00075   double area = 0.;
00076   for(unsigned int i = 0; i < meas.size(); i++) {
00077     norm += meas[i];
00078     x += (meas[i]*pos[i]);
00079     x2 += (meas[i]*pos[i]*pos[i]);
00080     area += dx*meas[i];
00081   }
00082   double mean = x/norm;
00083   double rms2 = x2/norm - mean*mean;
00084 
00085   std::cout<<"initial mean: "<<mean<<std::endl;
00086   std::cout<<"initial sigma: "<<sqrt(rms2)<<std::endl;
00087   std::cout<<"initial area: "<<area<<std::endl;
00088   std::vector<double> init_val(6);
00089 
00090   init_val[0] = mean;
00091   init_val[1] = sqrt(rms2);
00092   init_val[2] = area; 
00093   init_val[3] = mean;
00094   init_val[4] = sqrt(rms2);
00095   init_val[5] = area; 
00096 
00097 // ('Norm', 'Mean', 'Sigma')
00098 // (3286.919999999996, 8676.4053709004238, 3123.5358310131301)
00099 
00100 // (1343.311786775236, 10344.596646633145, 3457.8037717416009)
00101 // >>> gauss.Parameters()
00102 // (1802.4364028493396, 7090.3704658021443, 1162.144685781906)
00103 
00104   /*
00105   init_val[0] = 10000.;
00106   init_val[1] = 3000;
00107   init_val[2] = 1300; 
00108   init_val[3] = 7000;
00109   init_val[4] = 1000;
00110   init_val[5] = 1800; 
00111   */
00112   std::cout<<"initial fval: "<<fFCN(init_val)<<std::endl;
00113 
00114   MnUserParameters upar;
00115   upar.Add("mean1", mean, 10.);
00116   upar.Add("sig1", sqrt(rms2), 10.);
00117   upar.Add("area1", area, 10.);
00118   upar.Add("mean2", mean, 10.);
00119   upar.Add("sig2", sqrt(rms2), 10.);
00120   upar.Add("area2", area, 10.);
00121 
00122   MnMigrad migrad(fFCN, upar);
00123   std::cout<<"start migrad "<<std::endl;
00124   FunctionMinimum min = migrad();
00125   if(!min.IsValid()) {
00126     //try with higher strategy
00127     std::cout<<"FM is invalid, try with strategy = 2."<<std::endl;
00128     MnMigrad migrad2(fFCN, upar, 2);
00129     min = migrad2();
00130   }
00131   std::cout<<"minimum: "<<min<<std::endl;
00132   return 0;
00133 }

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