00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "GaussFcn.h"
00011 #include "GaussDataGen.h"
00012 #include "Minuit2/FunctionMinimum.h"
00013 #include "Minuit2/MnUserParameterState.h"
00014 #include "Minuit2/MnPrint.h"
00015 #include "Minuit2/MnMigrad.h"
00016 #include "Minuit2/MnMinos.h"
00017 #include "Minuit2/MnContours.h"
00018 #include "Minuit2/MnPlot.h"
00019 #include "Minuit2/MinosError.h"
00020 #include "Minuit2/ContoursError.h"
00021
00022 #include <iostream>
00023
00024 using namespace ROOT::Minuit2;
00025
00026 int main() {
00027
00028
00029 GaussDataGen gdg(100);
00030
00031 std::vector<double> pos = gdg.Positions();
00032 std::vector<double> meas = gdg.Measurements();
00033 std::vector<double> var = gdg.Variances();
00034
00035
00036 GaussFcn fFCN(meas, pos, var);
00037
00038
00039 double x = 0.;
00040 double x2 = 0.;
00041 double norm = 0.;
00042 double dx = pos[1]-pos[0];
00043 double area = 0.;
00044 for(unsigned int i = 0; i < meas.size(); i++) {
00045 norm += meas[i];
00046 x += (meas[i]*pos[i]);
00047 x2 += (meas[i]*pos[i]*pos[i]);
00048 area += dx*meas[i];
00049 }
00050 double mean = x/norm;
00051 double rms2 = x2/norm - mean*mean;
00052 double rms = rms2 > 0. ? sqrt(rms2) : 1.;
00053
00054 {
00055
00056
00057
00058
00059 std::vector<double> init_par;
00060 init_par.push_back(mean);
00061 init_par.push_back(rms);
00062 init_par.push_back(area);
00063
00064
00065 std::vector<double> init_err;
00066 init_err.push_back(0.1);
00067 init_err.push_back(0.1);
00068 init_err.push_back(0.1);
00069
00070
00071 VariableMetricMinimizer fMinimizer;
00072
00073
00074 FunctionMinimum min = fMinimizer.Minimize(fFCN, init_par, init_err);
00075
00076
00077 std::cout<<"minimum: "<<min<<std::endl;
00078 }
00079
00080 {
00081
00082
00083 MnUserParameters upar;
00084 upar.Add("mean", mean, 0.1);
00085 upar.Add("sigma", rms, 0.1);
00086 upar.Add("area", area, 0.1);
00087
00088
00089 MnMigrad migrad(fFCN, upar);
00090
00091
00092 FunctionMinimum min = migrad();
00093
00094
00095 std::cout<<"minimum: "<<min<<std::endl;
00096 }
00097
00098 {
00099
00100
00101
00102
00103 MnUserParameters upar;
00104 upar.Add("mean", mean, 0.1);
00105 upar.Add("sigma", rms, 0.1);
00106 upar.Add("area", area, 0.1);
00107
00108
00109 upar.SetLimits("mean", mean-0.01, mean+0.01);
00110
00111
00112 upar.SetLimits(1, rms-0.1, rms+0.1);
00113
00114
00115 MnMigrad migrad(fFCN, upar);
00116
00117
00118 migrad.Fix("mean");
00119
00120
00121 FunctionMinimum min = migrad();
00122
00123
00124 std::cout<<"minimum: "<<min<<std::endl;
00125
00126
00127 migrad.Release("mean");
00128
00129
00130 migrad.Fix(1);
00131
00132
00133 FunctionMinimum min1 = migrad();
00134
00135
00136 std::cout<<"minimum1: "<<min1<<std::endl;
00137
00138
00139 migrad.Release(1);
00140
00141
00142 FunctionMinimum min2 = migrad();
00143
00144
00145 std::cout<<"minimum2: "<<min2<<std::endl;
00146
00147
00148 migrad.RemoveLimits("mean");
00149 migrad.RemoveLimits("sigma");
00150
00151
00152 FunctionMinimum min3 = migrad();
00153
00154
00155 std::cout<<"minimum3: "<<min3<<std::endl;
00156 }
00157
00158 {
00159
00160 MnUserParameters upar;
00161 upar.Add("mean", mean, 0.1);
00162 upar.Add("sigma", rms-1., 0.1);
00163 upar.Add("area", area, 0.1);
00164
00165
00166 upar.SetLowerLimit("mean", mean-0.01);
00167
00168
00169 upar.SetUpperLimit("sigma", rms-0.5);
00170
00171
00172 MnMigrad migrad(fFCN, upar);
00173
00174
00175 FunctionMinimum min = migrad();
00176 std::cout<<"test Lower limit minimim= "<<min<<std::endl;
00177 }
00178
00179 {
00180
00181
00182
00183 MnUserParameters upar;
00184 upar.Add("mean", mean, 0.1);
00185 upar.Add("sigma", rms, 0.1);
00186 upar.Add("area", area, 0.1);
00187
00188
00189 MnMigrad migrad(fFCN, upar);
00190
00191
00192 FunctionMinimum min = migrad();
00193
00194
00195 MnMinos Minos(fFCN, min);
00196
00197 {
00198
00199 std::pair<double,double> e0 = Minos(0);
00200 std::pair<double,double> e1 = Minos(1);
00201 std::pair<double,double> e2 = Minos(2);
00202
00203
00204 std::cout<<"1-sigma Minos errors: "<<std::endl;
00205 std::cout<<"par0: "<<min.UserState().Value("mean")<<" "<<e0.first<<" "<<e0.second<<std::endl;
00206 std::cout<<"par1: "<<min.UserState().Value(1)<<" "<<e1.first<<" "<<e1.second<<std::endl;
00207 std::cout<<"par2: "<<min.UserState().Value("area")<<" "<<e2.first<<" "<<e2.second<<std::endl;
00208 }
00209
00210 {
00211
00212 fFCN.SetErrorDef(4.);
00213 MinosError e0 = Minos.Minos(0);
00214 MinosError e1 = Minos.Minos(1);
00215 MinosError e2 = Minos.Minos(2);
00216
00217
00218 std::cout<<"2-sigma Minos errors: "<<std::endl;
00219 std::cout<<e0<<std::endl;
00220 std::cout<<e1<<std::endl;
00221 std::cout<<e2<<std::endl;
00222 }
00223 }
00224
00225 {
00226
00227
00228
00229 MnUserParameters upar;
00230 upar.Add("mean", mean, 0.1);
00231 upar.Add("sigma", rms, 0.1);
00232 upar.Add("area", area, 0.1);
00233
00234 double meanLow = -50.03;
00235 double rmsUp = 1.55;
00236 std::cout << "sigma Limit: " << rmsUp << "\tmean limit: " << meanLow << std::endl;
00237
00238 upar.SetLowerLimit("mean", meanLow);
00239
00240 upar.SetUpperLimit("sigma", rmsUp);
00241
00242
00243 MnMigrad migrad(fFCN, upar);
00244
00245
00246 FunctionMinimum min = migrad();
00247
00248
00249 MnMinos Minos(fFCN, min);
00250
00251 {
00252
00253 fFCN.SetErrorDef(9.);
00254 std::pair<double,double> e0 = Minos(0);
00255 std::pair<double,double> e1 = Minos(1);
00256 std::pair<double,double> e2 = Minos(2);
00257
00258
00259
00260 std::cout<<"3-sigma Minos errors with limits: "<<std::endl;
00261 std::cout.precision(16);
00262 std::cout<<"par0: "<<min.UserState().Value("mean")<<" "<<e0.first<<" "<<e0.second<<std::endl;
00263 std::cout<<"par1: "<<min.UserState().Value(1)<<" "<<e1.first<<" "<<e1.second<<std::endl;
00264 std::cout<<"par2: "<<min.UserState().Value("area")<<" "<<e2.first<<" "<<e2.second<<std::endl;
00265
00266
00267 }
00268
00269 }
00270
00271 {
00272
00273
00274
00275 MnUserParameters upar;
00276 upar.Add("mean", mean, 0.1);
00277 upar.Add("sigma", rms, 0.1);
00278 upar.Add("area", area, 0.1);
00279
00280
00281 MnMigrad migrad(fFCN, upar);
00282
00283
00284 FunctionMinimum min = migrad();
00285
00286
00287 MnContours contours(fFCN, min);
00288
00289
00290
00291 fFCN.SetErrorDef(2.41);
00292 std::vector<std::pair<double,double> > cont = contours(0, 1, 20);
00293
00294
00295
00296 fFCN.SetErrorDef(5.99);
00297 ContoursError cont4 = contours.Contour(0, 1, 20);
00298
00299
00300 MnPlot plot;
00301 cont.insert(cont.end(), cont4().begin(), cont4().end());
00302 plot(min.UserState().Value("mean"), min.UserState().Value("sigma"), cont);
00303
00304
00305 std::cout<<cont4<<std::endl;
00306 }
00307
00308 return 0;
00309 }