From 98b0df21c2fa9016eee0a3d5e7db71f91bd3d74c Mon Sep 17 00:00:00 2001 From: Jonas Rembser <jonas.rembser@cern.ch> Date: Sun, 6 Feb 2022 13:44:35 +0100 Subject: [PATCH] [RF] Remove any support for deprecated string fit options in RooFit The string-based fit options were deprecated for a long time (and officially in ROOT v6.26), and now is a good time to remove the support for this completely. This will give us more flexibility when refactoring the RooMinimizer to integrate new features like the batch mode, the new likelihood classes, or automatic differentiation. --- README/ReleaseNotes/v628/index.md | 2 + roofit/roofitcore/inc/RooAbsMCStudyModule.h | 5 - roofit/roofitcore/inc/RooAbsPdf.h | 1 - roofit/roofitcore/inc/RooGlobalFunc.h | 10 -- roofit/roofitcore/inc/RooMCStudy.h | 7 - roofit/roofitcore/inc/RooMinimizer.h | 3 - roofit/roofitcore/src/RooAbsPdf.cxx | 40 ------ roofit/roofitcore/src/RooAbsReal.cxx | 108 +++++--------- roofit/roofitcore/src/RooGlobalFunc.cxx | 20 --- roofit/roofitcore/src/RooMCStudy.cxx | 152 ++------------------ roofit/roofitcore/src/RooMinimizer.cxx | 34 ----- 11 files changed, 47 insertions(+), 335 deletions(-) diff --git a/README/ReleaseNotes/v628/index.md b/README/ReleaseNotes/v628/index.md index 09fb81cd98e..c6530d28c83 100644 --- a/README/ReleaseNotes/v628/index.md +++ b/README/ReleaseNotes/v628/index.md @@ -43,6 +43,8 @@ Please use their non-experimental counterparts `ROOT::TBufferMerger` and `ROOT:: - `ROOT::RVec::emplace()` has now been removed after deprecation; please use `ROOT::RVec::insert()` instead. - The deprecated function `ROOT::Detail::RDF::RActionImpl<Helper>::GetDataBlockCallback()` is removed; please use `GetSampleCallback()` instead. - The deprecated RooFit containers `RooHashTable`, `RooNameSet`, `RooSetPair`, and `RooList` are removed. Please use STL container classes instead, like `std::unordered_map`, `std::set`, and `std::vector`. +- The `RooFit::FitOptions(const char*)` command to steer [RooAbsPdf::fitTo()](https://root.cern.ch/doc/v628/classRooAbsPdf.html) with an option string was removed. This way of configuring the fit was deprecated since at least since ROOT 5.02. + Subsequently, the `RooMinimizer::fit(const char*)` function and the [RooMCStudy](https://root.cern.ch/doc/v628/classRooMCStudy.html) constructor that takes an option string was removed as well. ## Core Libraries diff --git a/roofit/roofitcore/inc/RooAbsMCStudyModule.h b/roofit/roofitcore/inc/RooAbsMCStudyModule.h index 665a760b980..259b2b5c2bb 100644 --- a/roofit/roofitcore/inc/RooAbsMCStudyModule.h +++ b/roofit/roofitcore/inc/RooAbsMCStudyModule.h @@ -150,11 +150,6 @@ protected: // Accessors for fit options, generator and MCstudy configuration flags - /// Return fit option string provided user - const char* fitOptions() { - return _mcs ? _mcs->_fitOptions.Data() : 0 ; - } - /// Return list of fit options provided by user RooLinkedList* fitOptList() { return _mcs ? &_mcs->_fitOptList : 0 ; diff --git a/roofit/roofitcore/inc/RooAbsPdf.h b/roofit/roofitcore/inc/RooAbsPdf.h index f38146be68c..4c134c2bd39 100644 --- a/roofit/roofitcore/inc/RooAbsPdf.h +++ b/roofit/roofitcore/inc/RooAbsPdf.h @@ -165,7 +165,6 @@ public: //RooAbsPdf::fitTo. struct MinimizerConfig { double recoverFromNaN = 10.; - std::string fitOpt = ""; int optConst = 2; int verbose = 0; int doSave = 0; diff --git a/roofit/roofitcore/inc/RooGlobalFunc.h b/roofit/roofitcore/inc/RooGlobalFunc.h index 09caa3e8f77..b16dfc99c10 100644 --- a/roofit/roofitcore/inc/RooGlobalFunc.h +++ b/roofit/roofitcore/inc/RooGlobalFunc.h @@ -47,12 +47,6 @@ class RooAbsCollection ; class TH1 ; class TTree ; -namespace RooFitLegacy { - -RooCmdArg FitOptions(const char* opts); - -} - /*! \namespace RooFit The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or other types of arguments). @@ -228,10 +222,6 @@ RooCmdArg IntegrateBins(double precision); // RooAbsPdf::fitTo arguments RooCmdArg PrefitDataFraction(Double_t data_ratio = 0.0) ; -RooCmdArg FitOptions(const char* opts) - R__DEPRECATED(6,28,"Please migrate to the RooCmdArg-based fit configuration" - " (or use RooFitLegacy::FitOptions(const char*) to silence this warning," - " but be warned that the RooFitLegacy function also gets removed in ROOT v6.28).") ; RooCmdArg Optimize(Int_t flag=2) ; //////////////////////////////////////////////////////////////////////////////// diff --git a/roofit/roofitcore/inc/RooMCStudy.h b/roofit/roofitcore/inc/RooMCStudy.h index 615ff8ffc9c..bbff68c0cb4 100644 --- a/roofit/roofitcore/inc/RooMCStudy.h +++ b/roofit/roofitcore/inc/RooMCStudy.h @@ -37,12 +37,6 @@ public: const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ; - RooMCStudy(const RooAbsPdf& genModel, const RooAbsPdf& fitModel, - const RooArgSet& dependents, const char* genOptions="", - const char* fitOptions="", const RooDataSet* genProtoData=0, - const RooArgSet& projDeps=RooArgSet()) R__DEPRECATED(6,28, - "please migrate to the other RooMCStudy constructor that doesn't use the deprecated string-based fit options."); - ~RooMCStudy() override ; // Method to add study modules @@ -133,7 +127,6 @@ protected: TList _fitResList ; // List of RooFitResult fit output objects RooDataSet* _genParData ; // List of of generated parameters of each sample RooDataSet* _fitParData ; // Data set of fit parameters of each sample - TString _fitOptions ; // Fit options string RooLinkedList _fitOptList ; // Fit option command list Bool_t _extendedGen ; // Add poisson term to number of events to generate? Bool_t _binGenData ; // Bin data between generating and fitting diff --git a/roofit/roofitcore/inc/RooMinimizer.h b/roofit/roofitcore/inc/RooMinimizer.h index 3361f76128b..f36f20bd660 100644 --- a/roofit/roofitcore/inc/RooMinimizer.h +++ b/roofit/roofitcore/inc/RooMinimizer.h @@ -74,9 +74,6 @@ public: void setMaxIterations(Int_t n) ; void setMaxFunctionCalls(Int_t n) ; - RooFitResult* fit(const char* options) R__DEPRECATED(6,28, - "using RooMinimizer::fit() with string-based options is deprecated. Please use RooAbsPdf::fitTo() instead."); - Int_t migrad() ; Int_t hesse() ; Int_t minos() ; diff --git a/roofit/roofitcore/src/RooAbsPdf.cxx b/roofit/roofitcore/src/RooAbsPdf.cxx index 8d179018d1f..c292089041a 100644 --- a/roofit/roofitcore/src/RooAbsPdf.cxx +++ b/roofit/roofitcore/src/RooAbsPdf.cxx @@ -1495,8 +1495,6 @@ int RooAbsPdf::calcSumW2CorrectedCovariance(RooMinimizer &minimizer, RooAbsReal /// this happens, try switching it off. /// <tr><td> `RecoverFromUndefinedRegions(double strength)` <td> When PDF is invalid (e.g. parameter in undefined region), try to direct minimiser away from that region. /// `strength` controls the magnitude of the penalty term. Leaving out this argument defaults to 10. Switch off with `strength = 0.`. -/// <tr><td> `FitOptions(const char* optStr)` <td> \deprecated Steer fit with classic options string (for backward compatibility). -/// \attention Use of this option excludes use of any of the new style steering options. /// /// <tr><td> `SumW2Error(Bool_t flag)` <td> Apply correction to errors and covariance matrix. /// This uses two covariance matrices, one with the weights, the other with squared weights, @@ -1607,35 +1605,6 @@ std::unique_ptr<RooFitResult> RooAbsPdf::minimizeNLL(RooAbsReal & nll, m.setPrintEvalErrors(cfg.numee); if (cfg.printLevel!=1) m.setPrintLevel(cfg.printLevel); if (cfg.optConst) m.optimizeConst(cfg.optConst); // Activate constant term optimization - - if (!cfg.fitOpt.empty()) { - - // Play fit options as historically defined - // (code copied from RooMinimizer::fit() instead of calling said function to avoid deprecation warning) - TString opts(cfg.fitOpt) ; - opts.ToLower() ; - - // Initial configuration - if (opts.Contains("v")) m.setVerbose(1) ; - if (opts.Contains("t")) m.setProfile(1) ; - if (opts.Contains("l")) m.setLogFile(Form("%s.log",nll.GetName())) ; - if (opts.Contains("c")) m.optimizeConst(1) ; - - // Fitting steps - if (opts.Contains("0")) m.setStrategy(0) ; - m.migrad() ; - if (opts.Contains("0")) m.setStrategy(1) ; - if (opts.Contains("h")||!opts.Contains("m")) m.hesse() ; - if (!opts.Contains("m")) m.minos() ; - - auto ret = (opts.Contains("r")) ? m.save() : 0 ; - - if (cfg.optConst) m.optimizeConst(0) ; - - return std::unique_ptr<RooFitResult>(ret); - - } - if (cfg.verbose) m.setVerbose(1); // Activate verbose options if (cfg.doTimer) m.setProfile(1); // Activate timer options if (cfg.strat!=1) m.setStrategy(cfg.strat); // Modify fit strategy @@ -1693,7 +1662,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList) pc.defineDouble("prefit", "Prefit",0,0); pc.defineDouble("RecoverFromUndefinedRegions", "RecoverFromUndefinedRegions",0,minimizerDefaults.recoverFromNaN); - pc.defineString("fitOpt","FitOptions",0,minimizerDefaults.fitOpt.c_str()) ; pc.defineInt("optConst","Optimize",0,minimizerDefaults.optConst) ; pc.defineInt("verbose","Verbose",0,minimizerDefaults.verbose) ; pc.defineInt("doSave","Save",0,minimizerDefaults.doSave) ; @@ -1712,13 +1680,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList) pc.defineString("mintype","Minimizer",0,minimizerDefaults.minType.c_str()) ; pc.defineString("minalg","Minimizer",1,minimizerDefaults.minAlg.c_str()) ; pc.defineObject("minosSet","Minos",0,minimizerDefaults.minosSet) ; - pc.defineMutex("FitOptions","Verbose") ; - pc.defineMutex("FitOptions","Save") ; - pc.defineMutex("FitOptions","Timer") ; - pc.defineMutex("FitOptions","Strategy") ; - pc.defineMutex("FitOptions","InitialHesse") ; - pc.defineMutex("FitOptions","Hesse") ; - pc.defineMutex("FitOptions","Minos") ; pc.defineMutex("Range","RangeWithName") ; pc.defineMutex("InitialHesse","Minimizer") ; @@ -1784,7 +1745,6 @@ RooFitResult* RooAbsPdf::fitTo(RooAbsData& data, const RooLinkedList& cmdList) MinimizerConfig cfg; cfg.recoverFromNaN = pc.getDouble("RecoverFromUndefinedRegions"); - cfg.fitOpt = pc.getString("fitOpt",0,true) ? pc.getString("fitOpt",0,true) : ""; cfg.optConst = optConst; cfg.verbose = pc.getInt("verbose"); cfg.doSave = pc.getInt("doSave"); diff --git a/roofit/roofitcore/src/RooAbsReal.cxx b/roofit/roofitcore/src/RooAbsReal.cxx index 5cf4d6285ca..f97ff9d272d 100644 --- a/roofit/roofitcore/src/RooAbsReal.cxx +++ b/roofit/roofitcore/src/RooAbsReal.cxx @@ -4377,8 +4377,6 @@ RooMultiGenFunction* RooAbsReal::iGenFunction(const RooArgSet& observables, cons /// <tr><td> `Minos(const RooArgSet& set)` <td> Only run MINOS on given subset of arguments /// <tr><td> `Save(Bool_t flag)` <td> Flac controls if RooFitResult object is produced and returned, off by default /// <tr><td> `Strategy(Int_t flag)` <td> Set Minuit strategy (0 through 2, default is 1) -/// <tr><td> `FitOptions(const char* optStr)` <td> Steer fit with classic options string (for backward compatibility). Use of this option -/// excludes use of any of the new style steering options. /// /// <tr><th> <th> Options to control informational output /// <tr><td> `Verbose(Bool_t flag)` <td> Flag controls if verbose output is printed (NLL, parameter changes during fit @@ -4503,8 +4501,6 @@ RooAbsReal* RooAbsReal::createChi2(RooDataHist& data, const RooLinkedList& cmdLi /// <tr><td> `Minos(const RooArgSet& set)` <td> Only run MINOS on given subset of arguments /// <tr><td> `Save(Bool_t flag)` <td> Flac controls if RooFitResult object is produced and returned, off by default /// <tr><td> `Strategy(Int_t flag)` <td> Set Minuit strategy (0 through 2, default is 1) -/// <tr><td> `FitOptions(const char* optStr)` <td> Steer fit with classic options string (for backward compatibility). Use of this option -/// excludes use of any of the new style steering options. /// /// <tr><th><th> Options to control informational output /// <tr><td> `Verbose(Bool_t flag)` <td> Flag controls if verbose output is printed (NLL, parameter changes during fit @@ -4626,8 +4622,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) // Select the pdf-specific commands RooCmdConfig pc(Form("RooAbsPdf::chi2FitDriver(%s)",GetName())) ; - pc.defineString("fitOpt","FitOptions",0,"") ; - pc.defineInt("optConst","Optimize",0,1) ; pc.defineInt("verbose","Verbose",0,0) ; pc.defineInt("doSave","Save",0,0) ; @@ -4644,14 +4638,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) pc.defineString("minalg","Minimizer",1,"minuit") ; pc.defineObject("minosSet","Minos",0,0) ; - pc.defineMutex("FitOptions","Verbose") ; - pc.defineMutex("FitOptions","Save") ; - pc.defineMutex("FitOptions","Timer") ; - pc.defineMutex("FitOptions","Strategy") ; - pc.defineMutex("FitOptions","InitialHesse") ; - pc.defineMutex("FitOptions","Hesse") ; - pc.defineMutex("FitOptions","Minos") ; - // Process and check varargs pc.process(cmdList) ; if (!pc.ok(kTRUE)) { @@ -4659,7 +4645,6 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) } // Decode command line arguments - const char* fitOpt = pc.getString("fitOpt",0,kTRUE) ; const char* minType = pc.getString("mintype","Minuit") ; const char* minAlg = pc.getString("minalg","minuit") ; Int_t optConst = pc.getInt("optConst") ; @@ -4695,72 +4680,47 @@ RooFitResult* RooAbsReal::chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) m.optimizeConst(optConst); } - if (fitOpt) { - - // Play fit options as historically defined - // (code copied from RooMinimizer::fit() instead of calling said function to avoid deprecation warning) - TString opts(fitOpt) ; - opts.ToLower() ; - - // Initial configuration - if (opts.Contains("v")) m.setVerbose(1) ; - if (opts.Contains("t")) m.setProfile(1) ; - if (opts.Contains("l")) m.setLogFile(Form("%s.log",fcn.GetName())) ; - if (opts.Contains("c")) m.optimizeConst(1) ; - - // Fitting steps - if (opts.Contains("0")) m.setStrategy(0) ; - m.migrad() ; - if (opts.Contains("0")) m.setStrategy(1) ; - if (opts.Contains("h")||!opts.Contains("m")) m.hesse() ; - if (!opts.Contains("m")) m.minos() ; - - ret = (opts.Contains("r")) ? m.save() : 0 ; - - } else { - - if (verbose) { - // Activate verbose options - m.setVerbose(1) ; - } - if (doTimer) { - // Activate timer options - m.setProfile(1) ; - } + if (verbose) { + // Activate verbose options + m.setVerbose(1) ; + } + if (doTimer) { + // Activate timer options + m.setProfile(1) ; + } - if (strat!=1) { - // Modify fit strategy - m.setStrategy(strat) ; - } + if (strat!=1) { + // Modify fit strategy + m.setStrategy(strat) ; + } - if (initHesse) { - // Initialize errors with hesse - m.hesse() ; - } + if (initHesse) { + // Initialize errors with hesse + m.hesse() ; + } - // Minimize using migrad - m.minimize(minType, minAlg) ; + // Minimize using migrad + m.minimize(minType, minAlg) ; - if (hesse) { - // Evaluate errors with Hesse - m.hesse() ; - } + if (hesse) { + // Evaluate errors with Hesse + m.hesse() ; + } - if (minos) { - // Evaluate errs with Minos - if (minosSet) { - m.minos(*minosSet) ; - } else { - m.minos() ; - } + if (minos) { + // Evaluate errs with Minos + if (minosSet) { + m.minos(*minosSet) ; + } else { + m.minos() ; } + } - // Optionally return fit result - if (doSave) { - string name = Form("fitresult_%s",fcn.GetName()) ; - string title = Form("Result of fit of %s ",GetName()) ; - ret = m.save(name.c_str(),title.c_str()) ; - } + // Optionally return fit result + if (doSave) { + string name = Form("fitresult_%s",fcn.GetName()) ; + string title = Form("Result of fit of %s ",GetName()) ; + ret = m.save(name.c_str(),title.c_str()) ; } // Cleanup diff --git a/roofit/roofitcore/src/RooGlobalFunc.cxx b/roofit/roofitcore/src/RooGlobalFunc.cxx index 263c9404f66..0f0582b7a75 100644 --- a/roofit/roofitcore/src/RooGlobalFunc.cxx +++ b/roofit/roofitcore/src/RooGlobalFunc.cxx @@ -217,22 +217,6 @@ namespace RooFit { // RooAbsPdf::fitTo arguments RooCmdArg PrefitDataFraction(Double_t data_ratio) { return RooCmdArg("Prefit",0,0,data_ratio,0,nullptr,nullptr,nullptr,nullptr) ; } - RooCmdArg FitOptions(const char* opts) { - oocoutW(static_cast<TObject*>(nullptr), Fitting) - << "RooFit::FitOptions(const char* opts) will be removed in ROOT v628!\n" - << "Please migrate to the RooCmdArg-based fit configuration.\n" - << "The former character flags map to RooFit command arguments as follows:\n" - << " 'h' : RooFit::Hesse()\n" - << " 'm' : RooFit::Minos()\n" - << " 'o' : RooFit::Optimize(1)\n" - << " 'r' : RooFit::Save()\n" - << " 't' : RooFit::Timer()\n" - << " 'v' : RooFit::Verbose()\n" - << " '0' : RooFit::Strategy(0)\n" - << "You can alternatively silence this warning by using RooFitLegacy::FitOptions(const char*),\n" - << "but this will get removed in ROOT v6.28 as well.\n"; - return RooFitLegacy::FitOptions(opts); - } RooCmdArg Optimize(Int_t flag) { return RooCmdArg("Optimize",flag,0,0,0,0,0,0,0) ; } RooCmdArg Verbose(Bool_t flag) { return RooCmdArg("Verbose",flag,0,0,0,0,0,0,0) ; } RooCmdArg Save(Bool_t flag) { return RooCmdArg("Save",flag,0,0,0,0,0,0,0) ; } @@ -408,10 +392,6 @@ namespace RooFit { } // End namespace RooFit -namespace RooFitLegacy { - RooCmdArg FitOptions(const char* opts) { return RooCmdArg("FitOptions",0,0,0,0,opts,0,0,0) ; } -} - namespace RooFitShortHand { RooConstVar& C(Double_t value) { return RooFit::RooConst(value) ; } diff --git a/roofit/roofitcore/src/RooMCStudy.cxx b/roofit/roofitcore/src/RooMCStudy.cxx index 1811f87fa35..0a9c28d7104 100644 --- a/roofit/roofitcore/src/RooMCStudy.cxx +++ b/roofit/roofitcore/src/RooMCStudy.cxx @@ -97,7 +97,6 @@ fitting the PDF to data and accumulating the fit statistics. <tr><td> FitModel(const RooAbsPdf&) <td> The PDF for fitting if it is different from the PDF for generating. <tr><td> ConditionalObservables(const RooArgSet& set) <td> The set of observables that the PDF should _not_ be normalized over <tr><td> Binned(Bool_t flag) <td> Bin the dataset before fitting it. Speeds up fitting of large data samples -<tr><td> FitOptions(const char*) <td> Classic fit options, provided for backward compatibility <tr><td> FitOptions(....) <td> Options to be used for fitting. All named arguments inside FitOptions() are passed to RooAbsPdf::fitTo(). `Save()` is especially interesting to be able to retrieve fit results of each run using fitResult(). <tr><td> Verbose(Bool_t flag) <td> Activate informational messages in event generation phase @@ -136,11 +135,7 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables, pc.defineInt("verboseGen","Verbose",0,0) ; pc.defineInt("extendedGen","Extended",0,0) ; pc.defineInt("binGenData","Binned",0,0) ; - pc.defineString("fitOpts","FitOptions",0,"") ; pc.defineInt("dummy","FitOptArgs",0,0) ; - pc.defineMutex("FitOptions","FitOptArgs") ; // can have either classic or new-style fit options - pc.defineMutex("Constrain","FitOptions") ; // constraints only work with new-style fit options - pc.defineMutex("ExternalConstraints","FitOptions") ; // constraints only work with new-style fit options // Process and check varargs pc.process(cmdList) ; @@ -236,7 +231,6 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables, _dependents.add(observables) ; _allDependents.add(_dependents) ; - _fitOptions = pc.getString("fitOpts") ; _canAddFitResults = kTRUE ; if (_extendedGen && _genProtoData && !_randProto) { @@ -311,112 +305,6 @@ RooMCStudy::RooMCStudy(const RooAbsPdf& model, const RooArgSet& observables, } -//////////////////////////////////////////////////////////////////////////////// -/// \deprecated PLEASE USE CONSTRUCTOR WITH NAMED ARGUMENTS. RETAINED FOR BACKWARD COMPATIBILY. -/// -/// Constructor with a generator and fit model. Both models may point -/// to the same object. The 'dependents' set of variables is generated -/// in the generator phase. The optional prototype dataset is passed to -/// the generator -/// -/// Available generator options -/// v - Verbose -/// e - Extended: use Poisson distribution for Nevts generated -/// -/// Available fit options -/// See RooAbsPdf::fitTo() -/// - -RooMCStudy::RooMCStudy(const RooAbsPdf& genModel, const RooAbsPdf& fitModel, - const RooArgSet& dependents, const char* genOptions, - const char* fitOptions, const RooDataSet* genProtoData, - const RooArgSet& projDeps) : - TNamed("mcstudy","mcstudy"), - _genModel((RooAbsPdf*)&genModel), - _genProtoData(genProtoData), - _projDeps(projDeps), - _constrPdf(0), - _constrGenContext(0), - _dependents(dependents), - _allDependents(dependents), - _fitModel((RooAbsPdf*)&fitModel), - _nllVar(0), - _ngenVar(0), - _genParData(0), - _fitOptions(fitOptions), - _canAddFitResults(kTRUE), - _perExptGenParams(0), - _silence(kFALSE) -{ - // Decode generator options - TString genOpt(genOptions) ; - genOpt.ToLower() ; - _verboseGen = genOpt.Contains("v") ; - _extendedGen = genOpt.Contains("e") ; - _binGenData = genOpt.Contains("b") ; - _randProto = genOpt.Contains("r") ; - - if (_extendedGen && genProtoData && !_randProto) { - oocoutE(_fitModel,Generation) << "RooMCStudy::RooMCStudy: WARNING Using generator option 'e' (Poisson distribution of #events) together " << endl - << " with a prototype dataset implies incomplete sampling or oversampling of proto data." << endl - << " Use option \"r\" to randomize prototype dataset order and thus to randomize" << endl - << " the set of over/undersampled prototype events for each generation cycle." << endl ; - } - - if (!_binGenData) { - _genContext = genModel.genContext(dependents,genProtoData,0,_verboseGen) ; - } else { - _genContext = 0 ; - } - _genParams = _genModel->getParameters(&_dependents) ; - _genSample = 0 ; - RooArgSet* tmp = genModel.getParameters(&dependents) ; - _genInitParams = (RooArgSet*) tmp->snapshot(kFALSE) ; - delete tmp ; - - // Store list of parameters and save initial values separately - _fitParams = fitModel.getParameters(&dependents) ; - _fitInitParams = (RooArgSet*) _fitParams->snapshot(kTRUE) ; - - _nExpGen = _extendedGen ? genModel.expectedEvents(&dependents) : 0 ; - - // Place holder for NLL - _nllVar = new RooRealVar("NLL","-log(Likelihood)",0) ; - - // Place holder for number of generated events - _ngenVar = new RooRealVar("ngen","number of generated events",0) ; - - // Create data set containing parameter values, errors and pulls - RooArgSet tmp2(*_fitParams) ; - tmp2.add(*_nllVar) ; - tmp2.add(*_ngenVar) ; - - // Mark all variable to store their errors in the dataset - tmp2.setAttribAll("StoreError",kTRUE) ; - tmp2.setAttribAll("StoreAsymError",kTRUE) ; - _fitParData = new RooDataSet("fitParData","Fit Parameters DataSet",tmp2) ; - tmp2.setAttribAll("StoreError",kFALSE) ; - tmp2.setAttribAll("StoreAsymError",kFALSE) ; - - // Append proto variables to allDependents - if (genProtoData) { - _allDependents.add(*genProtoData->get(),kTRUE) ; - } - - // Call module initializers - list<RooAbsMCStudyModule*>::iterator iter ; - for (iter=_modList.begin() ; iter!= _modList.end() ; ++iter) { - Bool_t ok = (*iter)->doInitializeInstance(*this) ; - if (!ok) { - oocoutE(_fitModel,Generation) << "RooMCStudy::ctor: removing study module " << (*iter)->GetName() << " from analysis chain because initialization failed" << endl ; - iter = _modList.erase(iter) ; - } - } - -} - - - //////////////////////////////////////////////////////////////////////////////// RooMCStudy::~RooMCStudy() @@ -747,12 +635,6 @@ void RooMCStudy::resetFitParams() RooFitResult* RooMCStudy::doFit(RooAbsData* genSample) { - // Fit model to data set - TString fitOpt2(_fitOptions) ; fitOpt2.Append("r") ; - if (_silence) { - fitOpt2.Append("b") ; - } - // Optionally bin dataset before fitting RooAbsData* data ; if (_binGenData) { @@ -763,27 +645,17 @@ RooFitResult* RooMCStudy::doFit(RooAbsData* genSample) data = genSample ; } - RooFitResult* fr ; - if (_fitOptList.GetSize()==0) { - if (_projDeps.getSize()>0) { - fr = (RooFitResult*) _fitModel->fitTo(*data,RooFit::ConditionalObservables(_projDeps),RooFitLegacy::FitOptions(fitOpt2)) ; - } else { - fr = (RooFitResult*) _fitModel->fitTo(*data,RooFitLegacy::FitOptions(fitOpt2)) ; - } - } else { - RooCmdArg save = RooFit::Save() ; - RooCmdArg condo = RooFit::ConditionalObservables(_projDeps) ; - RooCmdArg plevel = RooFit::PrintLevel(-1) ; - RooLinkedList fitOptList(_fitOptList) ; - fitOptList.Add(&save) ; - if (_projDeps.getSize()>0) { - fitOptList.Add(&condo) ; - } - if (_silence) { - fitOptList.Add(&plevel) ; - } - fr = (RooFitResult*) _fitModel->fitTo(*data,fitOptList) ; + RooCmdArg save = RooFit::Save() ; + RooCmdArg condo = RooFit::ConditionalObservables(_projDeps) ; + RooCmdArg plevel = RooFit::PrintLevel(_silence ? -1 : 1) ; + + RooLinkedList fitOptList(_fitOptList) ; + fitOptList.Add(&save) ; + if (!_projDeps.empty()) { + fitOptList.Add(&condo) ; } + fitOptList.Add(&plevel) ; + RooFitResult* fr = _fitModel->fitTo(*data,fitOptList) ; if (_binGenData) delete data ; @@ -852,8 +724,6 @@ Bool_t RooMCStudy::fitSample(RooAbsData* genSample) Bool_t userSaveRequest = kFALSE ; if (_fitOptList.GetSize()>0) { if (_fitOptList.FindObject("Save")) userSaveRequest = kTRUE ; - } else { - if (_fitOptions.Contains("r")) userSaveRequest = kTRUE ; } if (userSaveRequest) { @@ -898,7 +768,7 @@ Bool_t RooMCStudy::addFitResult(const RooFitResult& fr) } // Store fit result if requested by user - if (_fitOptions.Contains("r")) { + if (_fitOptList.FindObject("Save")) { _fitResList.Add((TObject*)&fr) ; } diff --git a/roofit/roofitcore/src/RooMinimizer.cxx b/roofit/roofitcore/src/RooMinimizer.cxx index d5a5dc4b0b3..3e82c68202a 100644 --- a/roofit/roofitcore/src/RooMinimizer.cxx +++ b/roofit/roofitcore/src/RooMinimizer.cxx @@ -303,40 +303,6 @@ const ROOT::Fit::Fitter* RooMinimizer::fitter() const } - -//////////////////////////////////////////////////////////////////////////////// -/// Parse traditional RooAbsPdf::fitTo driver options -/// -/// m - Run Migrad only -/// h - Run Hesse to estimate errors -/// v - Verbose mode -/// l - Log parameters after each Minuit steps to file -/// t - Activate profile timer -/// r - Save fit result -/// 0 - Run Migrad with strategy 0 - -RooFitResult* RooMinimizer::fit(const char* options) -{ - TString opts(options) ; - opts.ToLower() ; - - // Initial configuration - if (opts.Contains("v")) setVerbose(1) ; - if (opts.Contains("t")) setProfile(1) ; - if (opts.Contains("l")) setLogFile(Form("%s.log",_fcn->getFunctionName().c_str())) ; - if (opts.Contains("c")) optimizeConst(1) ; - - // Fitting steps - if (opts.Contains("0")) setStrategy(0) ; - migrad() ; - if (opts.Contains("0")) setStrategy(1) ; - if (opts.Contains("h")||!opts.Contains("m")) hesse() ; - if (!opts.Contains("m")) minos() ; - - return (opts.Contains("r")) ? save() : 0 ; -} - - bool RooMinimizer::fitFcn() const { bool ret; -- GitLab