00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "GaussDataGen.h"
00011 #include "GaussianModelFunction.h"
00012 #include "Minuit2/MnFumiliMinimize.h"
00013 #include "Minuit2/FumiliStandardChi2FCN.h"
00014 #include "Minuit2/FunctionMinimum.h"
00015 #include "Minuit2/MnUserParameterState.h"
00016 #include "Minuit2/MnPrint.h"
00017 #include "Minuit2/MnMigrad.h"
00018
00019 #include <iostream>
00020
00021 using namespace ROOT::Minuit2;
00022
00023 int main() {
00024
00025
00026 GaussDataGen gdg(100);
00027
00028 std::vector<double> pos = gdg.Positions();
00029 std::vector<double> meas = gdg.Measurements();
00030 std::vector<double> var = gdg.Variances();
00031
00032
00033
00034
00035 double x = 0.;
00036 double x2 = 0.;
00037 double norm = 0.;
00038 double dx = pos[1]-pos[0];
00039 double area = 0.;
00040 for(unsigned int i = 0; i < meas.size(); i++) {
00041 norm += meas[i];
00042 x += (meas[i]*pos[i]);
00043 x2 += (meas[i]*pos[i]*pos[i]);
00044 area += dx*meas[i];
00045 }
00046 double mean = x/norm;
00047 double rms2 = x2/norm - mean*mean;
00048 double rms = rms2 > 0. ? sqrt(rms2) : 1.;
00049
00050
00051
00052 MnUserParameters upar;
00053 upar.Add("mean", mean, 0.1);
00054 upar.Add("sigma", rms, 0.1);
00055 upar.Add("area", area, 0.1);
00056
00057
00058
00059
00060 GaussianModelFunction modelFunction;
00061 FumiliStandardChi2FCN fFCN(modelFunction, meas, pos, var);
00062
00063 {
00064
00065 std::cout << "Minimize using FUMILI : \n" << std::endl;
00066 MnFumiliMinimize fumili(fFCN, upar);
00067
00068
00069
00070 FunctionMinimum min = fumili();
00071
00072
00073 std::cout<<"minimum: "<<min<<std::endl;
00074 }
00075
00076 {
00077
00078 std::cout << "Minimize using MIGRAD : \n" << std::endl;
00079 MnMigrad migrad(fFCN, upar);
00080
00081
00082 FunctionMinimum min = migrad();
00083
00084
00085 std::cout<<"minimum: "<<min<<std::endl;
00086 }
00087
00088
00089 return 0;
00090 }