00001
00002
00003
00004
00005
00006
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
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
00062 GaussFcn fFCN(measurements, positions, var);
00063
00064 std::vector<double> meas = fFCN.Measurements();
00065 std::vector<double> pos = fFCN.Positions();
00066
00067
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 }