AmpGen 2.1
Loading...
Searching...
No Matches
FitFraction.h
Go to the documentation of this file.
1#ifndef AMPGEN_FITFRACTION_H
2#define AMPGEN_FITFRACTION_H
3
4#include <memory>
5#include <string>
6#include <vector>
7#include <algorithm>
8#include "AmpGen/Types.h"
11
12namespace AmpGen {
13 class EventType;
14 class Particle;
15
17 public:
18 FitFraction(const std::string &line);
19 FitFraction(const std::string &name, const double &frac, const double &err);
20 FitFraction() = default;
21
22 void setFracErr(const double &f, const double &e);
23 double val() const;
24 double err() const;
25 std::string name() const;
26
27 private:
28 std::string m_name;
29 double m_value;
30 double m_error;
31 };
32
33 bool operator<(const FitFraction &lhs, const FitFraction &rhs);
34 bool operator>(const FitFraction &lhs, const FitFraction &rhs);
35 bool operator==(const FitFraction &lhs, const FitFraction &rhs);
36 std::ostream &operator<<(std::ostream &os, const FitFraction &obj);
37
38 template <class pdf_type> struct FitFractionCalculator {
39 struct fcalc {
40 std::string name;
41 std::vector<size_t> i;
42 std::vector<size_t> j;
43 fcalc(const std::string &name, const std::vector<size_t> &i) : name(name), i(i), j(i) {};
44 fcalc(const std::string &name, const std::vector<size_t> &i, const std::vector<size_t> &j) : name(name), i(i), j(j) {};
45 };
46 pdf_type *pdf;
47 std::vector<fcalc> calculators;
48 std::vector<size_t> normSet;
50 template <class... ARGS> void emplace_back(ARGS &&...args) { calculators.emplace_back(args...); }
51
52 FitFractionCalculator(pdf_type *pdf, const std::vector<size_t> &normSet, const bool &recalculateIntegrals = false)
54 std::vector<double> operator()() {
56 pdf->prepare();
57 else
58 pdf->transferParameters();
59 std::vector<double> rv;
60 double sum = 0;
61 for(size_t i = 0; i != calculators.size(); ++i) {
62 auto v = getVal(i);
63 rv.push_back(v);
64 sum += v;
65 }
66 rv.push_back(sum);
67 return rv;
68 }
69 real_t norm() const {
70 complex_t sum = 0;
71 for(auto &i : normSet) {
72 for(auto &j : normSet) { sum += (*pdf)[i].coefficient * std::conj((*pdf)[j].coefficient) * (j >= i ? pdf->norm(i, j) : std::conj(pdf->norm(j, i))); }
73 }
74 return std::real(sum);
75 }
76 real_t getVal(const size_t &index, const bool &getImaginaryPart = false) const {
77 complex_t sum = 0;
78 for(auto &i : calculators[index].i) {
79 for(auto &j : calculators[index].j) {
80 sum += (*pdf)[i].coefficient * std::conj((*pdf)[j].coefficient) * (j >= i ? pdf->norm(i, j) : std::conj(pdf->norm(j, i)));
81 }
82 }
83 return (getImaginaryPart ? std::imag(sum) : std::real(sum)) / norm();
84 }
85 std::vector<FitFraction> operator()(const std::string &name, const LinearErrorPropagator &linProp) {
86 auto values = (*this)();
87 auto errors = linProp.getVectorError(*this, calculators.size() + 1);
88 std::vector<FitFraction> fractions;
89 for(size_t i = 0; i < calculators.size(); ++i) fractions.emplace_back(calculators[i].name, values[i], errors[i]);
90 std::sort(fractions.begin(), fractions.end());
91 std::reverse(fractions.begin(), fractions.end());
92 fractions.emplace_back("Sum_" + name, *values.rbegin(), *errors.rbegin());
93 return fractions;
94 }
95 };
96} // namespace AmpGen
97
98#endif
Deals with final state configuration of events, specifically dealing with the ordering of particles i...
Definition EventType.h:22
FitFraction(const std::string &name, const double &frac, const double &err)
std::string name() const
FitFraction(const std::string &line)
void setFracErr(const double &f, const double &e)
double val() const
double err() const
Propagates uncertainties on functors using either a MinuitParameterSet (thus assuming a diagonal cova...
std::vector< double > getVectorError(const std::function< std::vector< double >(void)> &fcn, size_t RANK) const
Describes a particle, its decay process and subsequent decay products, which are also Particles.
Definition Particle.h:103
double real_t
Definition Types.h:6
std::complex< real_t > complex_t
Definition Types.h:7
Expression operator<(const Expression &A, const Expression &B)
std::ostream & operator<<(std::ostream &os, const CompiledExpressionBase &expression)
Expression operator==(const Expression &A, const Expression &B)
Expression operator>(const Expression &A, const Expression &B)
fcalc(const std::string &name, const std::vector< size_t > &i, const std::vector< size_t > &j)
Definition FitFraction.h:44
fcalc(const std::string &name, const std::vector< size_t > &i)
Definition FitFraction.h:43
FitFractionCalculator(pdf_type *pdf, const std::vector< size_t > &normSet, const bool &recalculateIntegrals=false)
Definition FitFraction.h:52
void emplace_back(ARGS &&...args)
Definition FitFraction.h:50
std::vector< fcalc > calculators
Definition FitFraction.h:47
real_t getVal(const size_t &index, const bool &getImaginaryPart=false) const
Definition FitFraction.h:76
std::vector< size_t > normSet
Definition FitFraction.h:48
std::vector< double > operator()()
Definition FitFraction.h:54
std::vector< FitFraction > operator()(const std::string &name, const LinearErrorPropagator &linProp)
Definition FitFraction.h:85