#include "TPluginManager.h" #include "TSystem.h" #include "TROOT.h" #include "Minuit2/MnMatrix.h" #include "Minuit2/FunctionMinimum.h" #include "Minuit3Minimizer.h" #include "Minuit2/FunctionGradient.h" #include "RooRealVar.h" #include "RooGaussian.h" #include "RooExponential.h" #include "RooDataSet.h" #include "RooAddPdf.h" #include "RooMinimizer.h" #include "RooArgList.h" #include "RooArgSet.h" int main(){ RooRealVar mB("mB", "mB", 5100, 5400); mB.setBins(75); RooRealVar mean("mean", "mean", 5280, 5200, 5350); RooRealVar sigma("sigma", "sigma", 15, 0, 50); RooGaussian signal("signal", "signal", mB, mean, sigma); RooRealVar slope("slope", "slope", -1e-3, -1e-1, 0.); RooExponential background("background", "background", mB, slope); RooRealVar nSignal("nSignal", "nSignal", 50000, 0, 100000); RooRealVar nBackground("nBackground", "nBackground", 25000, 0, 100000); RooAddPdf model( "model", "model", RooArgList(signal, background), RooArgList(nSignal, nBackground) ); auto dataset = signal.generate(RooArgSet(mB), 50000); auto background_dataset = background.generate(RooArgSet(mB), 50000); dataset->append(*background_dataset); gSystem->Load("libMinuit3Minimizer"); // Use Minuit3 to get better logging for first derivatives TPluginManager *pm = gROOT->GetPluginManager(); pm->AddHandler("ROOT::Math::Minimizer", "Minuit2", "ROOT::Minuit2::Minuit3Minimizer", "Minuit2", "Minuit3Minimizer(const char *)"); auto nll = model.createNLL(*dataset, RooFit::Extended(1), RooFit::Offset(1)); RooMinimizer minimizer(*nll); minimizer.setMinimizerType("Minuit2"); minimizer.migrad(); const auto min2 = dynamic_cast(minimizer.fitter()->GetMinimizer()); const auto min3 = dynamic_cast(minimizer.fitter()->GetMinimizer()); if ( min3 == nullptr ){ std::cout << "Cannot cast to Minuit3" << std::endl; } if ( min2 != nullptr ){ std::cout << "It is an instantiation of Minuit2Minimizer!" << std::endl; } auto * handler = gROOT->GetPluginManager()->FindHandler("ROOT::Math::Minimizer","Minuit2"); auto * minuit = reinterpret_cast( handler->ExecPlugin(1,"Migrad") ); const auto minuit2 = dynamic_cast(minuit); const auto minuit3 = dynamic_cast(minuit); if ( minuit3 == nullptr ){ std::cout << "From PluginManager: Cannot cast to Minuit3" << std::endl; } if ( minuit2 != nullptr ){ std::cout << "From PluginManager: It is an instantiation of Minuit2Minimizer!" << std::endl; } return 0; }