00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "Minuit2/ScanBuilder.h"
00011 #include "Minuit2/MnParameterScan.h"
00012 #include "Minuit2/FunctionMinimum.h"
00013 #include "Minuit2/MinimumSeed.h"
00014 #include "Minuit2/MinimumState.h"
00015 #include "Minuit2/MnFcn.h"
00016
00017 namespace ROOT {
00018
00019 namespace Minuit2 {
00020
00021
00022 FunctionMinimum ScanBuilder::Minimum(const MnFcn& mfcn, const GradientCalculator&, const MinimumSeed& seed, const MnStrategy&, unsigned int, double) const {
00023
00024
00025 MnAlgebraicVector x = seed.Parameters().Vec();
00026 MnUserParameterState upst(seed.State(), mfcn.Up(), seed.Trafo());
00027 MnParameterScan scan(mfcn.Fcn(), upst.Parameters(), seed.Fval());
00028 double amin = scan.Fval();
00029 unsigned int n = seed.Trafo().VariableParameters();
00030 MnAlgebraicVector dirin(n);
00031 for(unsigned int i = 0; i < n; i++) {
00032 unsigned int ext = seed.Trafo().ExtOfInt(i);
00033 scan(ext);
00034 if(scan.Fval() < amin) {
00035 amin = scan.Fval();
00036 x(i) = seed.Trafo().Ext2int(ext, scan.Parameters().Value(ext));
00037 }
00038 dirin(i) = sqrt(2.*mfcn.Up()*seed.Error().InvHessian()(i,i));
00039 }
00040
00041 MinimumParameters mp(x, dirin, amin);
00042 MinimumState st(mp, 0., mfcn.NumOfCalls());
00043
00044 return FunctionMinimum(seed, std::vector<MinimumState>(1, st), mfcn.Up());
00045 }
00046
00047 }
00048
00049 }