File indexing completed on 2024-04-06 12:24:18
0001 #ifndef PhysicsTools_Utilities_CombinedChiSquaredLikelihood_h
0002 #define PhysicsTools_Utilities_CombinedChiSquaredLikelihood_h
0003 #include "PhysicsTools/Utilities/interface/RootMinuitResultPrinter.h"
0004 #include "PhysicsTools/Utilities/interface/RootMinuitFuncEvaluator.h"
0005
0006 namespace fit {
0007 template <typename ChiSquared, typename Likelihood>
0008 class CombinedChiSquaredLikelihood {
0009 public:
0010 CombinedChiSquaredLikelihood() {}
0011 CombinedChiSquaredLikelihood(const ChiSquared& chi2, const Likelihood& like) : chi2_(chi2), like_(like) {}
0012
0013 double operator()() const { return -2 * like_() + chi2_(); }
0014 ChiSquared& chi2() { return chi2_; }
0015 const ChiSquared& chi2() const { return chi2_; }
0016 Likelihood& like() { return like_; }
0017 const Likelihood& like() const { return like_; }
0018 size_t numberOfBins() const { return chi2_.numberOfBins(); }
0019
0020 private:
0021 ChiSquared chi2_;
0022 Likelihood like_;
0023 };
0024
0025 template <typename ChiSquared, typename Likelihood>
0026 struct RootMinuitResultPrinter<CombinedChiSquaredLikelihood<ChiSquared, Likelihood> > {
0027 static void print(double amin,
0028 unsigned int numberOfFreeParameters,
0029 const CombinedChiSquaredLikelihood<ChiSquared, Likelihood>& f) {
0030 unsigned int ndof = f.numberOfBins() - numberOfFreeParameters;
0031 std::cout << "-2 log(maximum-likelihood) = " << amin << ", n.d.o.f = " << ndof
0032 << ", free parameters = " << numberOfFreeParameters << std::endl;
0033 std::cout << "chi-2 contibution: " << f.chi2()() << "(n. bins: " << f.chi2().numberOfBins() << ")" << std::endl
0034 << "likelihood contriution: " << -2. * f.like()() << std::endl;
0035 }
0036 };
0037
0038 }
0039
0040 #endif