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{
14 class EventType;
15 class Particle;
16
18 {
19 public:
20 FitFraction(const std::string& line);
21 FitFraction(const std::string& name, const double& frac, const double& err);
22 FitFraction() = default;
23
24 void setFracErr(const double& f, const double& e);
25 double val() const;
26 double err() const;
27 std::string name() const;
28
29 private:
30 std::string m_name;
31 double m_value;
32 double m_error;
33 };
34
35 bool operator <(const FitFraction& lhs, const FitFraction& rhs);
36 bool operator >(const FitFraction& lhs, const FitFraction& rhs);
37 bool operator ==(const FitFraction& lhs, const FitFraction& rhs);
38 std::ostream& operator<<(std::ostream& os, const FitFraction& obj);
39
40 template <class pdf_type>
42 struct fcalc {
43 std::string name;
44 std::vector<size_t> i;
45 std::vector<size_t> j;
46 fcalc(const std::string& name, const std::vector<size_t>& i) :
47 name(name), i(i), j(i) {};
48 fcalc(const std::string& name, const std::vector<size_t>& i, const std::vector<size_t>& j) :
49 name(name), i(i), j(j) {};
50 };
51 pdf_type* pdf;
52 std::vector<fcalc> calculators;
53 std::vector<size_t> normSet;
55 template <class... ARGS> void emplace_back( ARGS&&... args ){ calculators.emplace_back(args...); }
56
58 const std::vector<size_t>& normSet,
59 const bool& recalculateIntegrals=false) :
60 pdf(pdf),
63 std::vector<double> operator()()
64 {
65 if ( recalculateIntegrals ) pdf->prepare();
66 else pdf->transferParameters();
67 std::vector<double> rv;
68 double sum = 0;
69 for (size_t i = 0; i != calculators.size(); ++i){
70 auto v = getVal(i);
71 rv.push_back(v);
72 sum += v;
73 }
74 rv.push_back(sum);
75 return rv;
76 }
77 real_t norm() const {
78 complex_t sum = 0;
79 for ( auto& i : normSet ) {
80 for ( auto& j : normSet ) {
81 sum += (*pdf)[i].coefficient * std::conj( (*pdf)[j].coefficient ) * ( j >= i ? pdf->norm(i, j) : std::conj(pdf->norm(j,i)) );
82 }
83 }
84 return std::real(sum);
85 }
86 real_t getVal( const size_t& index, const bool& getImaginaryPart = false) const {
87 complex_t sum = 0;
88 for ( auto& i : calculators[index].i ) {
89 for ( auto& j : calculators[index].j ) {
90 sum += (*pdf)[i].coefficient * std::conj( (*pdf)[j].coefficient ) * ( j >= i ? pdf->norm(i, j) : std::conj(pdf->norm(j,i)) );
91 }
92 }
93 return (getImaginaryPart ? std::imag(sum) : std::real(sum) ) / norm();
94 }
95 std::vector<FitFraction> operator()(const std::string& name, const LinearErrorPropagator& linProp )
96 {
97 auto values = (*this)();
98 auto errors = linProp.getVectorError(*this,calculators.size()+1);
99 std::vector<FitFraction> fractions;
100 for(size_t i = 0; i < calculators.size(); ++i)
101 fractions.emplace_back(calculators[i].name, values[i],errors[i]);
102 std::sort(fractions.begin(), fractions.end());
103 std::reverse(fractions.begin(), fractions.end());
104 fractions.emplace_back("Sum_"+name, *values.rbegin(), *errors.rbegin() );
105 return fractions;
106 }
107 };
108} // namespace AmpGen
109
110#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:48
fcalc(const std::string &name, const std::vector< size_t > &i)
Definition FitFraction.h:46
FitFractionCalculator(pdf_type *pdf, const std::vector< size_t > &normSet, const bool &recalculateIntegrals=false)
Definition FitFraction.h:57
void emplace_back(ARGS &&... args)
Definition FitFraction.h:55
std::vector< fcalc > calculators
Definition FitFraction.h:52
real_t getVal(const size_t &index, const bool &getImaginaryPart=false) const
Definition FitFraction.h:86
std::vector< size_t > normSet
Definition FitFraction.h:53
std::vector< double > operator()()
Definition FitFraction.h:63
std::vector< FitFraction > operator()(const std::string &name, const LinearErrorPropagator &linProp)
Definition FitFraction.h:95