From cc3106ff5e9d4ac61a1cfeb9dbab177e7beaf318 Mon Sep 17 00:00:00 2001 From: nemu Date: Tue, 12 Oct 2010 19:30:38 +0000 Subject: [PATCH] added FIX/RELEASE/RESTORE minuit2 command to the COMMAND block --- ChangeLog | 1 + src/classes/PFitter.cpp | 450 ++++++++++++++++++++++++++++++++-------- src/include/PFitter.h | 38 ++-- 3 files changed, 384 insertions(+), 105 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7f01ed7..874ae534 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ changes since 0.6.0 =================== +NEW added FIX/RELEASE/RESTORE minuit2 command to the COMMAND block NEW implemented more checks on the integrity of the msr-file NEW [MUSRGUI/MUSREDIT] msr2data default option flags in musredit_startup.xml NEW 'global fit' option for msr2data diff --git a/src/classes/PFitter.cpp b/src/classes/PFitter.cpp index d3aa4970..e93f5139 100644 --- a/src/classes/PFitter.cpp +++ b/src/classes/PFitter.cpp @@ -84,7 +84,6 @@ PFitter::PFitter(PMsrHandler *runInfo, PRunListCollection *runListCollection, Bo // init class variables fFitterFcn = 0; fFcnMin = 0; - fMnUserParamState = 0; fScanAll = true; fScanParameter[0] = 0; @@ -118,11 +117,6 @@ PFitter::~PFitter() fScanData.clear(); - if (fMnUserParamState) { - delete fMnUserParamState; - fMnUserParamState = 0; - } - if (fFcnMin) { delete fFcnMin; fFcnMin = 0; @@ -181,7 +175,7 @@ Bool_t PFitter::DoFit() // walk through the command list and execute them for (UInt_t i=0; iSetMsrParamPosErrorPresent(i, true); - } - } break; case PMN_PLOT: status = ExecutePlot(); break; + case PMN_RELEASE: + status = ExecuteRelease(fCmdList[i].second); + break; + case PMN_RESTORE: + status = ExecuteRestore(); + break; case PMN_SAVE: status = ExecuteSave(); break; @@ -274,30 +271,39 @@ Bool_t PFitter::CheckCommands() fIsValid = true; // walk through the msr-file COMMAND block + PIntPair cmd; PMsrLines::iterator it; + UInt_t cmdLineNo = 0; for (it = fCmdLines.begin(); it != fCmdLines.end(); ++it) { - it->fLine.ToUpper(); - if (it->fLine.Contains("COMMANDS")) { + if (it == fCmdLines.begin()) + cmdLineNo = 0; + else + cmdLineNo++; + if (it->fLine.Contains("COMMANDS", TString::kIgnoreCase)) { continue; - } else if (it->fLine.Contains("SET BATCH")) { // needed for backward compatibility + } else if (it->fLine.Contains("SET BATCH", TString::kIgnoreCase)) { // needed for backward compatibility continue; - } else if (it->fLine.Contains("END RETURN")) { // needed for backward compatibility + } else if (it->fLine.Contains("END RETURN", TString::kIgnoreCase)) { // needed for backward compatibility continue; - } else if (it->fLine.Contains("CHI_SQUARE")) { + } else if (it->fLine.Contains("CHI_SQUARE", TString::kIgnoreCase)) { fUseChi2 = true; - } else if (it->fLine.Contains("MAX_LIKELIHOOD")) { + } else if (it->fLine.Contains("MAX_LIKELIHOOD", TString::kIgnoreCase)) { fUseChi2 = false; - } else if (it->fLine.Contains("INTERACTIVE")) { - fCmdList.push_back(PMN_INTERACTIVE); - } else if (it->fLine.Contains("CONTOURS")) { - fCmdList.push_back(PMN_CONTOURS); + } else if (it->fLine.Contains("INTERACTIVE", TString::kIgnoreCase)) { + cmd.first = PMN_INTERACTIVE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("CONTOURS", TString::kIgnoreCase)) { + cmd.first = PMN_CONTOURS; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); // filter out possible parameters for scan TObjArray *tokens = 0; TObjString *ostr; TString str; UInt_t ival; - tokens = it->fLine.Tokenize(" \t"); + tokens = it->fLine.Tokenize(", \t"); for (Int_t i=0; iGetEntries(); i++) { ostr = dynamic_cast(tokens->At(i)); @@ -359,35 +365,161 @@ Bool_t PFitter::CheckCommands() delete tokens; tokens = 0; } - } else if (it->fLine.Contains("EIGEN")) { - fCmdList.push_back(PMN_EIGEN); - } else if (it->fLine.Contains("HESSE")) { + } else if (it->fLine.Contains("EIGEN", TString::kIgnoreCase)) { + cmd.first = PMN_EIGEN; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("FIX", TString::kIgnoreCase)) { + // check if the given set of parameters (number or names) is present + TObjArray *tokens = 0; + TObjString *ostr; + TString str; + UInt_t ival; + + tokens = it->fLine.Tokenize(", \t"); + + for (Int_t i=1; iGetEntries(); i++) { + ostr = dynamic_cast(tokens->At(i)); + str = ostr->GetString(); + + if (str.IsDigit()) { // token might be a parameter number + ival = str.Atoi(); + // check that ival is in the parameter list + if (ival > fParams.size()) { + cerr << endl << ">> PFitter::CheckCommands: **ERROR** in line " << it->fLineNo; + cerr << endl << ">> " << it->fLine.Data(); + cerr << endl << ">> Parameter " << ival << " is out of the Parameter Range [1," << fParams.size() << "]"; + cerr << endl; + fIsValid = false; + break; + } + } else { // token might be a parameter name + // check if token is present as parameter name + Bool_t found = false; + for (UInt_t j=0; j> PFitter::CheckCommands: **ERROR** in line " << it->fLineNo; + cerr << endl << ">> " << it->fLine.Data(); + cerr << endl << ">> Parameter '" << str.Data() << "' is NOT present as a parameter name"; + cerr << endl; + fIsValid = false; + break; + } + } + } + + if (tokens) { + delete tokens; + tokens = 0; + } + + // everything looks fine, feed the command list + cmd.first = PMN_FIX; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("HESSE", TString::kIgnoreCase)) { fIsScanOnly = false; - fCmdList.push_back(PMN_HESSE); - } else if (it->fLine.Contains("MACHINE_PRECISION")) { - fCmdList.push_back(PMN_MACHINE_PRECISION); - } else if (it->fLine.Contains("MIGRAD")) { + cmd.first = PMN_HESSE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("MACHINE_PRECISION", TString::kIgnoreCase)) { + cmd.first = PMN_MACHINE_PRECISION; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("MIGRAD", TString::kIgnoreCase)) { fIsScanOnly = false; - fCmdList.push_back(PMN_MIGRAD); - } else if (it->fLine.Contains("MINIMIZE")) { + cmd.first = PMN_MIGRAD; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("MINIMIZE", TString::kIgnoreCase)) { fIsScanOnly = false; - fCmdList.push_back(PMN_MINIMIZE); - } else if (it->fLine.Contains("MINOS")) { + cmd.first = PMN_MINIMIZE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("MINOS", TString::kIgnoreCase)) { fIsScanOnly = false; - fCmdList.push_back(PMN_MINOS); - } else if (it->fLine.Contains("MNPLOT")) { - fCmdList.push_back(PMN_PLOT); - } else if (it->fLine.Contains("SAVE")) { - fCmdList.push_back(PMN_SAVE); - } else if (it->fLine.Contains("SCAN")) { - fCmdList.push_back(PMN_SCAN); + cmd.first = PMN_MINOS; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("MNPLOT", TString::kIgnoreCase)) { + cmd.first = PMN_PLOT; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("RELEASE", TString::kIgnoreCase)) { + // check if the given set of parameters (number or names) is present + TObjArray *tokens = 0; + TObjString *ostr; + TString str; + UInt_t ival; + + tokens = it->fLine.Tokenize(", \t"); + + for (Int_t i=1; iGetEntries(); i++) { + ostr = dynamic_cast(tokens->At(i)); + str = ostr->GetString(); + + if (str.IsDigit()) { // token might be a parameter number + ival = str.Atoi(); + // check that ival is in the parameter list + if (ival > fParams.size()) { + cerr << endl << ">> PFitter::CheckCommands: **ERROR** in line " << it->fLineNo; + cerr << endl << ">> " << it->fLine.Data(); + cerr << endl << ">> Parameter " << ival << " is out of the Parameter Range [1," << fParams.size() << "]"; + cerr << endl; + fIsValid = false; + break; + } + } else { // token might be a parameter name + // check if token is present as parameter name + Bool_t found = false; + for (UInt_t j=0; j> PFitter::CheckCommands: **ERROR** in line " << it->fLineNo; + cerr << endl << ">> " << it->fLine.Data(); + cerr << endl << ">> Parameter '" << str.Data() << "' is NOT present as a parameter name"; + cerr << endl; + fIsValid = false; + break; + } + } + } + + if (tokens) { + delete tokens; + tokens = 0; + } + cmd.first = PMN_RELEASE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("RESTORE", TString::kIgnoreCase)) { + cmd.first = PMN_RESTORE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("SAVE", TString::kIgnoreCase)) { + cmd.first = PMN_SAVE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("SCAN", TString::kIgnoreCase)) { + cmd.first = PMN_SCAN; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); // filter out possible parameters for scan TObjArray *tokens = 0; TObjString *ostr; TString str; UInt_t ival; - tokens = it->fLine.Tokenize(" \t"); + tokens = it->fLine.Tokenize(", \t"); for (Int_t i=0; iGetEntries(); i++) { ostr = dynamic_cast(tokens->At(i)); @@ -476,9 +608,11 @@ Bool_t PFitter::CheckCommands() delete tokens; tokens = 0; } - } else if (it->fLine.Contains("SIMPLEX")) { - fCmdList.push_back(PMN_SIMPLEX); - } else if (it->fLine.Contains("STRATEGY")) { + } else if (it->fLine.Contains("SIMPLEX", TString::kIgnoreCase)) { + cmd.first = PMN_SIMPLEX; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("STRATEGY", TString::kIgnoreCase)) { TObjArray *tokens = 0; TObjString *ostr; TString str; @@ -506,12 +640,18 @@ Bool_t PFitter::CheckCommands() delete tokens; tokens = 0; } - } else if (it->fLine.Contains("USER_COVARIANCE")) { - fCmdList.push_back(PMN_USER_COVARIANCE); - } else if (it->fLine.Contains("USER_PARAM_STATE")) { - fCmdList.push_back(PMN_USER_PARAM_STATE); - } else if (it->fLine.Contains("PRINT")) { - fCmdList.push_back(PMN_PRINT); + } else if (it->fLine.Contains("USER_COVARIANCE", TString::kIgnoreCase)) { + cmd.first = PMN_USER_COVARIANCE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("USER_PARAM_STATE", TString::kIgnoreCase)) { + cmd.first = PMN_USER_PARAM_STATE; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); + } else if (it->fLine.Contains("PRINT", TString::kIgnoreCase)) { + cmd.first = PMN_PRINT; + cmd.second = cmdLineNo; + fCmdList.push_back(cmd); } else { // unkown command cerr << endl << ">> **FATAL ERROR**"; cerr << endl << ">> PFitter::CheckCommands(): In line " << it->fLineNo << " an unkown command is found:"; @@ -522,6 +662,35 @@ Bool_t PFitter::CheckCommands() } } + // Check that in case release/restore is present, that it is followed by a minimizer before minos is called. + // If this is not the case, place a warning + Bool_t fixFlag = false; + Bool_t releaseFlag = false; + Bool_t minimizerFlag = false; + for (it = fCmdLines.begin(); it != fCmdLines.end(); ++it) { + if (it->fLine.Contains("FIX", TString::kIgnoreCase)) + fixFlag = true; + else if (it->fLine.Contains("RELEASE", TString::kIgnoreCase) || + it->fLine.Contains("RESTORE", TString::kIgnoreCase)) + releaseFlag = true; + else if (it->fLine.Contains("MINIMIZE", TString::kIgnoreCase) || + it->fLine.Contains("MIGRAD", TString::kIgnoreCase) || + it->fLine.Contains("SIMPLEX", TString::kIgnoreCase)) { + if (releaseFlag) + minimizerFlag = true; + } else if (it->fLine.Contains("MINOS", TString::kIgnoreCase)) { + if (fixFlag && releaseFlag && !minimizerFlag) { + cerr << endl << ">> PFitter::CheckCommands(): **WARNING** RELEASE/RESTORE command present"; + cerr << endl << ">> without minimizer command (MINIMIZE/MIGRAD/SIMPLEX) between"; + cerr << endl << ">> RELEASE/RESTORE and MINOS. Behaviour might be different to the"; + cerr << endl << ">> expectation of the user ?!?" << endl; + } + fixFlag = false; + releaseFlag = false; + minimizerFlag = false; + } + } + return fIsValid; } @@ -607,6 +776,54 @@ Bool_t PFitter::ExecuteContours() return true; } +//-------------------------------------------------------------------------- +// ExecuteFix +//-------------------------------------------------------------------------- +/** + *

Fix parameter list given at lineNo of the command block. + * + * \param lineNo the line number of the command block + * + * return: true if done, otherwise returns false. + */ +Bool_t PFitter::ExecuteFix(UInt_t lineNo) +{ + TObjArray *tokens = 0; + TObjString *ostr; + TString str; + + tokens = fCmdLines[lineNo].fLine.Tokenize(", \t"); + + cout << ">> PFitter::ExecuteFix(): " << fCmdLines[lineNo].fLine.Data() << endl; + + // Check if there is already a function minimum, i.e. migrad, minimization, or simplex has been called previously. + // If so, update minuit2 user parameters + if (fFcnMin != 0) { + if (fFcnMin->IsValid()) { + fMnUserParams = fFcnMin->UserParameters(); + } + } + + for (Int_t i=1; iGetEntries(); i++) { + ostr = dynamic_cast(tokens->At(i)); + str = ostr->GetString(); + + if (str.IsDigit()) { // token is a parameter number + fMnUserParams.Fix(static_cast(str.Atoi())-1); + } else { // token is a parameter name + fMnUserParams.Fix(str.Data()); + } + } + + // clean up + if (tokens) { + delete tokens; + tokens = 0; + } + + return true; +} + //-------------------------------------------------------------------------- // ExecuteHesse //-------------------------------------------------------------------------- @@ -638,12 +855,6 @@ Bool_t PFitter::ExecuteHesse() return false; } - // keep the user parameter state - if (fMnUserParamState) { - delete fMnUserParamState; - } - fMnUserParamState = new ROOT::Minuit2::MnUserParameterState(mnState); - // fill parabolic errors for (UInt_t i=0; iSetMsrParamStep(i, mnState.Error(i)); @@ -665,10 +876,6 @@ Bool_t PFitter::ExecuteMigrad() { cout << ">> PFitter::ExecuteMigrad(): will call migrad ..." << endl; - // if already some minimization is done use the minuit2 output as input - if (fFcnMin) - fMnUserParams = fFcnMin->UserParameters(); - // create migrad object // strategy is by default = 'default' ROOT::Minuit2::MnMigrad migrad((*fFitterFcn), fMnUserParams, fStrategy); @@ -689,14 +896,13 @@ Bool_t PFitter::ExecuteMigrad() // keep FunctionMinimum object if (fFcnMin) { // fFcnMin exist hence clean up first delete fFcnMin; + fFcnMin = 0; } fFcnMin = new ROOT::Minuit2::FunctionMinimum(min); - // keep user parameter state - if (fMnUserParamState) { - delete fMnUserParamState; - } - fMnUserParamState = new ROOT::Minuit2::MnUserParameterState(min.UserState()); + // keep user parameters + if (fFcnMin) + fMnUserParams = fFcnMin->UserParameters(); // fill run info for (UInt_t i=0; iGetTotalNoOfFittedBins(); // subtract number of varied parameters from total no of fitted bins -> ndf for (UInt_t i=0; i> PFitter::ExecuteMinimize(): will call minimize ..." << endl; - // if already some minimization is done use the minuit2 output as input - if (fFcnMin) - fMnUserParams = fFcnMin->UserParameters(); - // create minimizer object // strategy is by default = 'default' ROOT::Minuit2::MnMinimize minimize((*fFitterFcn), fMnUserParams, fStrategy); @@ -746,10 +948,10 @@ Bool_t PFitter::ExecuteMinimize() // minimize // maxfcn is MINUIT2 Default maxfcn UInt_t maxfcn = numeric_limits::max(); -//cout << endl << "maxfcn=" << maxfcn << endl; + // tolerance = MINUIT2 Default tolerance Double_t tolerance = 0.1; - ROOT::Minuit2::FunctionMinimum min = minimize(maxfcn, tolerance); + ROOT::Minuit2::FunctionMinimum min = minimize(maxfcn, tolerance); if (!min.IsValid()) { cerr << endl << "**WARNING**: PFitter::ExecuteMinimize(): Fit did not converge, sorry ..."; cerr << endl; @@ -760,14 +962,13 @@ Bool_t PFitter::ExecuteMinimize() // keep FunctionMinimum object if (fFcnMin) { // fFcnMin exist hence clean up first delete fFcnMin; + fFcnMin = 0; } fFcnMin = new ROOT::Minuit2::FunctionMinimum(min); - // keep user parameter state - if (fMnUserParamState) { - delete fMnUserParamState; - } - fMnUserParamState = new ROOT::Minuit2::MnUserParameterState(min.UserState()); + // keep user parameters + if (fFcnMin) + fMnUserParams = fFcnMin->UserParameters(); // fill run info for (UInt_t i=0; iGetTotalNoOfFittedBins(); // subtract number of varied parameters from total no of fitted bins -> ndf for (UInt_t i=0; iParameterInUse(i) != 0)) { + // the 3rd condition is a variable fixed via the FIX command + if ((fMnUserParams.Error(i) != 0) && (fRunInfo->ParameterInUse(i) != 0) && (!fMnUserParams.Parameters().at(i).IsFixed())) { // 1-sigma MINOS errors ROOT::Minuit2::MinosError err = minos.Minos(i); @@ -837,10 +1039,19 @@ Bool_t PFitter::ExecuteMinos() // fill msr-file structure fRunInfo->SetMsrParamStep(i, err.Lower()); fRunInfo->SetMsrParamPosError(i, err.Upper()); + fRunInfo->SetMsrParamPosErrorPresent(i, true); } else { fRunInfo->SetMsrParamPosErrorPresent(i, false); } } + + if (fMnUserParams.Parameters().at(i).IsFixed()) { + cerr << endl << ">> PFitter::ExecuteMinos(): **WARNING** Parameter " << fMnUserParams.Name(i) << " (ParamNo " << i+1 << ") is fixed!"; + cerr << endl << ">> Will set STEP to zero, i.e. making it a constant parameter"; + cerr << endl; + fRunInfo->SetMsrParamStep(i, 0.0); + fRunInfo->SetMsrParamPosErrorPresent(i, false); + } } return true; @@ -864,6 +1075,66 @@ Bool_t PFitter::ExecutePlot() return true; } +//-------------------------------------------------------------------------- +// ExecuteRelease +//-------------------------------------------------------------------------- +/** + *

Release parameter list given at lineNo of the command block. + * + * \param lineNo the line number of the command block + * + * return: true if done, otherwise returns false. + */ +Bool_t PFitter::ExecuteRelease(UInt_t lineNo) +{ + TObjArray *tokens = 0; + TObjString *ostr; + TString str; + + tokens = fCmdLines[lineNo].fLine.Tokenize(", \t"); + + cout << ">> PFitter::ExecuteRelease(): " << fCmdLines[lineNo].fLine.Data() << endl; + + for (Int_t i=1; iGetEntries(); i++) { + ostr = dynamic_cast(tokens->At(i)); + str = ostr->GetString(); + + if (str.IsDigit()) { // token is a parameter number + fMnUserParams.Release(static_cast(str.Atoi())-1); + } else { // token is a parameter name + fMnUserParams.Release(str.Data()); + } + } + + // clean up + if (tokens) { + delete tokens; + tokens = 0; + } + + return true; +} + +//-------------------------------------------------------------------------- +// ExecuteRestore +//-------------------------------------------------------------------------- +/** + *

Release all fixed parameters + * + * return: true. + */ +Bool_t PFitter::ExecuteRestore() +{ + cout << "PFitter::ExecuteRestore(): release all fixed parameters (RESTORE) ..." << endl; + + for (UInt_t i=0; iError(i) << " "; + if (fParams[i].fStep != 0.0) + fout << fMnUserParams.Error(i) << " "; else fout << "---"; // write minos errors @@ -1059,7 +1330,7 @@ Bool_t PFitter::ExecuteSave() fout << endl << " No Global "; for (UInt_t i=0; iParameterInUse(i) > 0) { + if ((fParams[i].fStep != 0) && (fRunInfo->ParameterInUse(i) > 0) && (!fMnUserParams.Parameters().at(i).IsFixed())) { fout.setf(ios::left, ios::adjustfield); fout.width(9); fout << i+1; @@ -1171,10 +1442,6 @@ Bool_t PFitter::ExecuteSimplex() { cout << ">> PFitter::ExecuteSimplex(): will call simplex ..." << endl; - // if already some minimization is done use the minuit2 output as input - if (fFcnMin) - fMnUserParams = fFcnMin->UserParameters(); - // create minimizer object // strategy is by default = 'default' ROOT::Minuit2::MnSimplex simplex((*fFitterFcn), fMnUserParams, fStrategy); @@ -1195,9 +1462,14 @@ Bool_t PFitter::ExecuteSimplex() // keep FunctionMinimum object if (fFcnMin) { // fFcnMin exist hence clean up first delete fFcnMin; + fFcnMin = 0; } fFcnMin = new ROOT::Minuit2::FunctionMinimum(min); + // keep user parameters + if (fFcnMin) + fMnUserParams = fFcnMin->UserParameters(); + // fill run info for (UInt_t i=0; iSetMsrParamValue(i, min.UserState().Value(i)); @@ -1210,7 +1482,7 @@ Bool_t PFitter::ExecuteSimplex() UInt_t ndf = fFitterFcn->GetTotalNoOfFittedBins(); // subtract number of varied parameters from total no of fitted bins -> ndf for (UInt_t i=0; iInterface class to minuit2. @@ -84,13 +87,13 @@ class PFitter PMsrParamList fParams; ///< msr-file parameters - PMsrLines fCmdLines; ///< all the Minuit commands from the msr-file - PIntVector fCmdList; ///< command list + PMsrLines fCmdLines; ///< all the Minuit commands from the msr-file + PIntPairVector fCmdList; ///< command list, first=cmd, second=cmd line index PFitterFcn *fFitterFcn; ///< pointer to the fitter function object + ROOT::Minuit2::MnUserParameters fMnUserParams; ///< minuit2 input parameter list ROOT::Minuit2::FunctionMinimum *fFcnMin; ///< function minimum object - ROOT::Minuit2::MnUserParameterState *fMnUserParamState; ///< keeps the current user parameter state // minuit2 scan/contours command relate variables (see MnScan/MnContours in the minuit2 user manual) Bool_t fScanAll; ///< flag. false: single parameter scan, true: not implemented yet (see MnScan/MnContours in the minuit2 user manual) @@ -105,11 +108,14 @@ class PFitter Bool_t SetParameters(); Bool_t ExecuteContours(); + Bool_t ExecuteFix(UInt_t lineNo); Bool_t ExecuteHesse(); Bool_t ExecuteMigrad(); Bool_t ExecuteMinimize(); Bool_t ExecuteMinos(); Bool_t ExecutePlot(); + Bool_t ExecuteRelease(UInt_t lineNo); + Bool_t ExecuteRestore(); Bool_t ExecuteScan(); Bool_t ExecuteSave(); Bool_t ExecuteSimplex();