+
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions include/goofit/fitting/FitManagerMinuit2.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <Minuit2/FunctionMinimum.h>
#include <Minuit2/MnScan.h>

#include <memory>

Expand Down Expand Up @@ -29,6 +30,8 @@ class FitManagerMinuit2 {
/// Get a pointer to the fcn
auto getFCN() -> FCN * { return &fcn_; }

ROOT::Minuit2::MnScan getMnScan();

/// Check to see if fit is valid
operator bool() const { return retval_ == FitErrors::Valid; }

Expand All @@ -41,11 +44,19 @@ class FitManagerMinuit2 {
/// Get the fitting verbosity
auto getVerbosity() const -> int { return verbosity; }

// Get the minos errors
std::vector<std::pair<double, double>> getMinosErrors() const { return minos_errors; }

// Run Minos error calculation
void setMinos(bool minos_flag = 1) { minos = minos_flag; }

private:
Params upar_;
FCN fcn_;
unsigned int maxfcn_{0};
FitErrors retval_{FitErrors::NotRun};
int verbosity{3};
std::vector<std::pair<double, double>> minos_errors;
bool minos{0};
};
} // namespace GooFit
3 changes: 3 additions & 0 deletions include/goofit/fitting/Params.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class Params : public Minuit2::MnUserParameters {

Params(PdfBase &pdf);

// Get vector of GooFit Variables.
std::vector<Variable> GetGooFitParams() const { return vars_; }

/// Read the values back into GooFit
void SetGooFitParams(const Minuit2::MnUserParameterState &input);

Expand Down
4 changes: 3 additions & 1 deletion python/Minuit2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ add_library(
MnPrint.cpp
MnUserCovariance.cpp
MnUserParameterState.cpp
MnUserParameters.cpp)
MnUserParameters.cpp
MnScan.cpp
MnMinos.cpp)

process_pybind_module(minuit2)
target_link_libraries(minuit2 PUBLIC ROOT::Minuit2)
Expand Down
45 changes: 45 additions & 0 deletions python/Minuit2/MnMinos.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include <pybind11/pybind11.h>

#include <pybind11/stl.h>

#include <Minuit2/FCNBase.h>
#include <Minuit2/MnMinos.h>
#include <Minuit2/MinosError.h>
#include <Minuit2/FunctionMinimum.h>
#include <Minuit2/MnUserParameters.h>

namespace py = pybind11;
using namespace pybind11::literals;

using namespace ROOT::Minuit2;

void init_MnMinos(py::module &m) {
py::class_<MinosError>(m, "MinosError")

.def_property_readonly("number", &MinosError::Parameter)
.def_property_readonly("lower", &MinosError::Lower)
.def_property_readonly("upper", &MinosError::Upper)
.def_property_readonly("is_valid", &MinosError::IsValid)
.def_property_readonly("lower_valid", &MinosError::LowerValid)
.def_property_readonly("upper_valid", &MinosError::UpperValid)
.def_property_readonly("at_lower_limit", &MinosError::AtLowerLimit)
.def_property_readonly("at_upper_limit", &MinosError::AtUpperLimit)
.def_property_readonly("at_lower_max_fcn", &MinosError::AtLowerMaxFcn)
.def_property_readonly("at_upper_max_fcn", &MinosError::AtUpperMaxFcn)
.def_property_readonly("lower_new_min", &MinosError::LowerNewMin)
.def_property_readonly("upper_new_min", &MinosError::UpperNewMin)
.def_property_readonly("nfcn", &MinosError::NFcn)
.def_property_readonly("min", &MinosError::Min)

;

py::class_<MnMinos>(m, "MnMinos")
.def(py::init<const FCNBase &, const FunctionMinimum &, unsigned int>(), "fcn"_a, "min"_a, "stra"_a = 1)
.def("__call__",
&MnMinos::operator(),
"Minimize the function, returns a function minimum",
"par"_a,
"maxfcn"_a = 0,
"tolerance"_a = 0.1);
;
}
17 changes: 17 additions & 0 deletions python/Minuit2/MnScan.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

#include <sstream>

#include <Minuit2/MnScan.h>
#include <Minuit2/MnPrint.h>

namespace py = pybind11;
using namespace pybind11::literals;

using namespace ROOT::Minuit2;

void init_MnScan(py::module &m) {
py::class_<MnScan>(m, "MnScan")
.def("Scan", &MnScan::Scan, "Scan parameter.", "par"_a, "maxsteps"_a = 41, "low"_a = 0, "high"_a = 0);
}
16 changes: 14 additions & 2 deletions python/goofit/FitManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,27 @@
#include <pybind11/iostream.h>
#include <pybind11/stl.h>

#include <Minuit2/MnUserParameters.h>
#include <Minuit2/FCNBase.h>

#include <goofit/PdfBase.h>
#include <goofit/PyProps.h>
#include <goofit/fitting/FitManagerMinuit2.h>
#include <goofit/fitting/Params.h>

#include <iostream>

using namespace GooFit;

void init_FitManager(py::module &m) {
py::class_<FCN>(m, "FCN");
py::class_<FCN, Minuit2::FCNBase>(m, "FCN").def(py::init<Params &>(), "params"_a);

py::class_<Params, Minuit2::MnUserParameters>(m, "Params")
.def(py::init<PdfBase &>(), "pdf"_a)
.def("SetGooFitParams", &Params::SetGooFitParams, "input"_a)
.def("size", &Params::size)
.def("make_minuit_vector", &Params::make_minuit_vector)

py::class_<Params>(m, "Params")
// clang-format off
ADD_PROP_WO(record, set_record, Params)
ADD_PROP_RO(recorded, get_recorded, Params)
Expand All @@ -24,7 +33,10 @@ void init_FitManager(py::module &m) {
py::class_<FitManagerMinuit2>(m, "FitManager")
.def(py::init<PdfBase *>())
.def("fit", &FitManagerMinuit2::fit, py::call_guard<py::scoped_ostream_redirect>())
.def("getMinosErrors", &FitManagerMinuit2::getMinosErrors)
.def("getMnScan", &FitManagerMinuit2::getMnScan)
.def("__int__", &FitManagerMinuit2::operator int)
.def("setMinos", &FitManagerMinuit2::setMinos)
.def("__bool__", &FitManagerMinuit2::operator bool) // Py3
.def("__nonzero__", &FitManagerMinuit2::operator bool) // Py2

Expand Down
35 changes: 35 additions & 0 deletions src/goofit/FitManagerMinuit2.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <goofit/fitting/FitManagerMinuit2.h>
#include <goofit/fitting/Params.h>

#include <goofit/Color.h>
#include <goofit/Version.h>
Expand All @@ -8,6 +9,8 @@
#include <Minuit2/MnPrint.h>
#include <Minuit2/MnUserParameterState.h>
#include <Minuit2/MnUserParameters.h>
#include <Minuit2/MnScan.h>
#include <Minuit2/MnMinos.h>

#include <CLI/Timer.hpp>

Expand All @@ -16,6 +19,8 @@
#else
#include <RVersion.h>
#endif
#include <iostream>
#include <vector>

namespace GooFit {

Expand Down Expand Up @@ -46,6 +51,30 @@ auto FitManagerMinuit2::fit() -> Minuit2::FunctionMinimum {
CLI::Timer avetimer{"Average time per call"};
Minuit2::FunctionMinimum min = migrad(maxfcn_);

if(minos) {
Minuit2::MnMinos minos{fcn_, min}; // Create MINOS errors
std::vector<Variable> variables = upar_.GetGooFitParams();
for(Variable &var : variables) {
if(var.IsFixed())
continue;
else {
minos_errors.push_back(minos(var.getFitterIndex()));
}
}
// output
int counter = 0;
std::cout << "1-sigma minos errors: " << std::endl;
for(Variable &var : variables) {
if(var.IsFixed())
continue;
else {
std::cout << var.getName() << ": " << minos_errors[counter].first << " " << minos_errors[counter].second
<< std::endl;
counter += 1;
}
}
}

// Print nice output
if(verbosity > 0) {
std::cout << GooFit::reset << (min.IsValid() ? GooFit::green : GooFit::red);
Expand Down Expand Up @@ -85,4 +114,10 @@ auto FitManagerMinuit2::fit() -> Minuit2::FunctionMinimum {
return min;
}

Minuit2::MnScan FitManagerMinuit2::getMnScan() {
Minuit2::MnScan mnscan{fcn_, upar_};

return mnscan;
}

} // namespace GooFit
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载