41 FitConfig::FitConfig(
unsigned int npar) :
45 fUpdateAfterFit(true),
47 fSettings(std::vector<ParameterSettings>(npar) )
53 FitConfig::~FitConfig()
58 FitConfig::FitConfig(
const FitConfig &rhs) {
63 FitConfig & FitConfig::operator = (
const FitConfig &rhs) {
65 if (
this == &rhs)
return *
this;
67 fNormErrors = rhs.fNormErrors;
68 fParabErrors = rhs.fParabErrors;
69 fMinosErrors = rhs.fMinosErrors;
70 fUpdateAfterFit = rhs.fUpdateAfterFit;
71 fWeightCorr = rhs.fWeightCorr;
73 fSettings = rhs.fSettings;
74 fMinosParams = rhs.fMinosParams;
76 fMinimizerOpts = rhs.fMinimizerOpts;
81 void FitConfig::SetFromFitResult(
const FitResult &result) {
87 unsigned int npar = result.NPar();
88 if (fSettings.size() != npar) {
90 fSettings.resize(npar);
93 for (
unsigned int i = 0; i < npar; ++i) {
94 if (result.IsParameterFixed(i) )
95 fSettings[i].Set(result.ParName(i), result.Value(i) );
97 fSettings[i].Set( result.ParName(i), result.Value(i), result.Error(i) );
101 if (result.ParameterBounds(i,lower,upper) ) {
102 if (lower == -std::numeric_limits<double>::infinity()) fSettings[i].SetUpperLimit(upper);
103 else if (upper == std::numeric_limits<double>::infinity()) fSettings[i].SetLowerLimit(lower);
104 else fSettings[i].SetLimits(lower,upper);
108 if (result.HasMinosError(i) ) {
109 if (fMinosParams.size() == 0) {
111 fMinosParams.reserve(npar-i);
113 fMinosParams.push_back(i);
119 SetNormErrors( result.NormalizedErrors() );
123 const std::string & minname = result.MinimizerType();
124 size_t pos = minname.find(
" / ");
125 if (pos != std::string::npos) {
126 std::string minimType = minname.substr(0,pos);
127 std::string algoType = minname.substr(pos+3,minname.length() );
128 SetMinimizer(minimType.c_str(), algoType.c_str() );
131 SetMinimizer(minname.c_str());
136 void FitConfig::SetParamsSettings(
unsigned int npar,
const double *params,
const double * vstep ) {
140 fSettings = std::vector<ParameterSettings>(npar);
144 bool createNew =
false;
145 if (npar != fSettings.size() ) {
147 fSettings.reserve(npar);
151 const double * end = params+npar;
152 for (
const double * ipar = params; ipar != end; ++ipar) {
156 step = 0.3*std::fabs(val);
158 if (val == 0) step = 0.3;
164 fSettings.push_back( ParameterSettings(
"Par_" + ROOT::Math::Util::ToString(i), val, step ) );
166 fSettings[i].SetValue(val);
167 fSettings[i].SetStepSize(step);
174 ROOT::Math::Minimizer * FitConfig::CreateMinimizer() {
179 if (fMinimizerOpts.MinimizerType().empty())
180 fMinimizerOpts.SetMinimizerType(ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str());
181 if (fMinimizerOpts.MinimizerAlgorithm().empty())
182 fMinimizerOpts.SetMinimizerAlgorithm(ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo().c_str());
184 const std::string &minimType = fMinimizerOpts.MinimizerType();
185 const std::string & algoType = fMinimizerOpts.MinimizerAlgorithm();
187 std::string defaultMinim = ROOT::Math::MinimizerOptions::DefaultMinimizerType();
189 ROOT::Math::Minimizer * min = ROOT::Math::Factory::CreateMinimizer(minimType, algoType);
191 const std::string & minim_newDefault = ROOT::Math::MinimizerOptions::DefaultMinimizerType();
192 if (defaultMinim != minim_newDefault ) fMinimizerOpts.SetMinimizerType(minim_newDefault.c_str());
196 std::string minim2 =
"Minuit";
197 if (minimType ==
"Minuit") minim2 =
"Minuit2";
198 if (minimType != minim2 ) {
199 std::string msg =
"Could not create the " + minimType +
" minimizer. Try using the minimizer " + minim2;
200 MATH_WARN_MSG(
"FitConfig::CreateMinimizer",msg.c_str());
201 min = ROOT::Math::Factory::CreateMinimizer(minim2,
"Migrad");
203 MATH_ERROR_MSG(
"FitConfig::CreateMinimizer",
"Could not create the Minuit2 minimizer");
206 SetMinimizer( minim2.c_str(),
"Migrad");
209 std::string msg =
"Could not create the Minimizer " + minimType;
210 MATH_ERROR_MSG(
"FitConfig::CreateMinimizer",msg.c_str());
217 if (fMinimizerOpts.MaxFunctionCalls() == 0) {
218 unsigned int npar = fSettings.size();
219 int maxfcn = 1000 + 100*npar + 5*npar*npar;
220 fMinimizerOpts.SetMaxFunctionCalls(maxfcn);
225 min->SetPrintLevel( fMinimizerOpts.PrintLevel() );
226 min->SetMaxFunctionCalls( fMinimizerOpts.MaxFunctionCalls() );
227 min->SetMaxIterations( fMinimizerOpts.MaxIterations() );
228 min->SetTolerance( fMinimizerOpts.Tolerance() );
229 min->SetPrecision( fMinimizerOpts.Precision() );
230 min->SetValidError( fParabErrors );
231 min->SetStrategy( fMinimizerOpts.Strategy() );
232 min->SetErrorDef( fMinimizerOpts.ErrorDef() );
238 std::string FitConfig::MinimizerName()
const
241 std::string name = MinimizerType();
244 if ((name.find(
"Fumili") == std::string::npos) && (name.find(
"GSLMultiFit") == std::string::npos)) {
245 if (MinimizerAlgoType() !=
"")
246 name +=
" / " + MinimizerAlgoType();
251 void FitConfig::SetDefaultMinimizer(
const char * type,
const char *algo ) {
253 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(type, algo);
256 void FitConfig::SetMinimizerOptions(
const ROOT::Math::MinimizerOptions & minopt) {
258 fMinimizerOpts = minopt;
261 std::vector<double> FitConfig::ParamsValues()
const {
263 std::vector<double> params(NPar() );
264 for (
unsigned int i = 0; i < params.size(); ++i) {
265 params[i] = fSettings[i].Value();