12 #ifndef EVT_PDF_SUM_HH
13 #define EVT_PDF_SUM_HH
18 #include "EvtGenBase/EvtPdf.hh"
32 void addTerm(
double c,
const EvtPdf<T>& pdf)
33 { assert(c >= 0.); _c.push_back(c); _term.push_back(pdf.clone()); }
35 void addOwnedTerm(
double c,
EvtPdf<T>* pdf)
36 { _c.push_back(c); _term.push_back(pdf); }
38 size_t nTerms()
const {
return _term.size(); }
40 inline double c(
int i)
const {
return _c[i]; }
41 inline EvtPdf<T>* getPdf(
int i)
const {
return _term[i]; }
48 virtual T randomPoint();
52 virtual double pdf(
const T& p)
const;
55 vector<EvtPdf<T>*> _term;
63 for(
size_t i = 0; i < other.nTerms(); i++) {
64 _c.push_back(other._c[i]);
65 _term.push_back(other._term[i]->clone());
72 for(
size_t i = 0; i < _c.size(); i++) {
82 for(
size_t i=0; i < _c.size(); i++) {
83 ret += _c[i] * _term[i]->evaluate(p);
96 for(
size_t i=0;i<nTerms();i++) {
97 itg += _c[i]*_term[i]->getItg();
106 for(
size_t i=0;i<nTerms();i++) itg += _c[i]*_term[i]->getItg(N);
120 if(!this->_itg.valueKnown()) this->_itg = compute_integral();
122 double max = this->_itg.value();
123 double rnd = EvtRandom::Flat(0,max);
127 for(i = 0; i < nTerms(); i++) {
128 double itg = _term[i]->getItg().value();
133 return _term[i]->randomPoint();