4 #ifndef _cic_AttenuationFit_h_
5 #define _cic_AttenuationFit_h_
7 #include <Minuit2/FCNBase.h>
8 #include <Minuit2/MnMinimize.h>
9 #include <Minuit2/MnHesse.h>
10 #include <Minuit2/FunctionMinimum.h>
11 #include <Minuit2/MnUserParameters.h>
16 namespace AttenuationFit {
18 typedef std::function<double(const double, const std::vector<double>&)>
Attenuation;
20 typedef std::function<double(double, double)>
SFunction;
32 const std::vector<double>& init,
33 const std::vector<double>& sigma)
35 if (name.size() != init.size() ||
36 name.size() != sigma.size())
37 throw std::runtime_error(
"size mismatch!");
39 ROOT::Minuit2::MnUserParameters pars;
40 for (
unsigned int i = 0, n = name.size(); i < n; ++i) {
41 pars.Add(name[i], init[i], sigma[i]);
46 ROOT::Minuit2::MnMinimize
m(*
this, pars, 0);
47 ROOT::Minuit2::FunctionMinimum fmin =
m();
48 ROOT::Minuit2::MnHesse hesse;
49 hesse(m.Fcnbase(), fmin);
51 if (!fmin.HasValidParameters())
52 return std::vector<double>();
53 std::vector<double>
result = fmin.UserParameters().Params();
54 result.push_back(fmin.Fval());
55 result.push_back(
fNdof);
59 double Up()
const override {
return 1; }
61 virtual double operator()(
const std::vector<double>& pars)
const override = 0;
63 double GetAttenuation(
const double sin2theta,
const std::vector<double>& pars)
const
90 const auto att = [
this, &pars](
const double sin2theta) {
114 const auto att = [
this, &pars](
const double sin2theta) {
117 return this->
fCIC->GetAndersonDarling(att,
fLnSCut);
138 const auto att = [
this, &pars](
const double sin2theta) {
162 const auto att = [
this, &pars](
const double sin2theta) {
173 template<
class CIC,
class Binning>
178 CICFitter<CIC>(cic, att, (cic.GetNBins() - 1)*lnSBinning.GetNBins()),
188 const auto att = [
this, &pars](
const double sin2theta) {
199 template<
class CIC,
class Binning>
204 CICFitter<CIC>(cic, att, lnSBinning.GetNBins()),
214 const auto att = [
this, &pars](
const double sin2theta) {
double GetAttenuation(const double sin2theta, const std::vector< double > &pars) const
double Up() const override
virtual double operator()(const std::vector< double > &pars) const override
virtual double operator()(const std::vector< double > &pars) const override
AndersonDarling2D(CIC &cic, const Attenuation &att, const Binning &lnSBinning)
virtual double operator()(const std::vector< double > &pars) const override
virtual double operator()(const std::vector< double > &pars) const override=0
std::function< double(double, double)> SFunction
virtual double operator()(const std::vector< double > &pars) const override
CICFitter & operator=(const CICFitter &)=delete
KS(CIC &cic, const Attenuation &att, const double lnSCut)
Chi2(CIC &cic, const Attenuation &att, const double lnSCut)
PoissonChi2(CIC &cic, const Attenuation &att, const double lnSCut)
std::vector< double > Minimize(const std::vector< std::string > &name, const std::vector< double > &init, const std::vector< double > &sigma)
PoissonChi22D(CIC &cic, const Attenuation &att, const Binning &lnSBinning)
virtual double operator()(const std::vector< double > &pars) const override
CICFitter(CIC &cic, const Attenuation &att, unsigned int ndof=1)
virtual double operator()(const std::vector< double > &pars) const override
AndersonDarling(CIC &cic, const Attenuation &att, const double lnSCut)
std::function< double(const double, const std::vector< double > &)> Attenuation