00001
00002
00003
00004
00005
00006
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
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
00058
00059 }
00060 std::cout<<"size= "<<var.size()<<std::endl;
00061 std::cout<<"nmeas: "<<nmeas<<std::endl;
00062 }
00063
00064
00065 GaussFcn2 fFCN(measurements, positions, var);
00066
00067 std::vector<double> meas = fFCN.Measurements();
00068 std::vector<double> pos = fFCN.Positions();
00069
00070
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
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
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
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 }