Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

EvtPdfSum< T > Class Template Reference

#include <EvtPdfSum.hh>

Inheritance diagram for EvtPdfSum< T >:

EvtPdf< T > List of all members.

Public Member Functions

EvtPredGen< EvtPdfGen< T >,
EvtPdfPred< T > > 
accRejGen (const EvtPdf< T > &pc, int nMax, double factor=1.)
void addOwnedTerm (double c, EvtPdf< T > *pdf)
void addTerm (double c, const EvtPdf< T > &pdf)
double c (int i) const
virtual EvtPdf< T > * clone () const
virtual EvtValError compute_integral (int N) const
virtual EvtValError compute_integral () const
EvtValError compute_mc_integral (const EvtPdf< T > &pc, int N)
double evaluate (const T &p) const
 EvtPdfSum (const EvtPdfSum< T > &other)
 EvtPdfSum ()
EvtValError findGenEff (const EvtPdf< T > &pc, int N, int nFindMax)
EvtPdfMax< T > findMax (const EvtPdf< T > &pc, int N)
EvtValError getItg (int N) const
EvtValError getItg () const
EvtPdf< T > * getPdf (int i) const
int nTerms () const
virtual T randomPoint ()
void setItg (EvtValError itg)
virtual ~EvtPdfSum ()

Protected Member Functions

virtual double pdf (const T &p) const

Protected Attributes

vector< double > _c
EvtValError _itg
vector< EvtPdf< T > * > _term

template<class T>
class EvtPdfSum< T >


Constructor & Destructor Documentation

template<class T>
EvtPdfSum< T >::EvtPdfSum  )  [inline]
 

00024 {}

template<class T>
EvtPdfSum< T >::EvtPdfSum const EvtPdfSum< T > &  other  ) 
 

00062   : EvtPdf<T>(other)
00063 {
00064   int i;
00065   for(i = 0; i < other.nTerms(); i++) {
00066     _c.push_back(other._c[i]);
00067     _term.push_back(other._term[i]->clone());
00068   }
00069 }

template<class T>
EvtPdfSum< T >::~EvtPdfSum  )  [virtual]
 

00073 {
00074   int i;
00075   for(i = 0; i < _c.size(); i++) delete _term[i];
00076 }


Member Function Documentation

template<class T>
EvtPredGen< EvtPdfGen< T >, EvtPdfPred< T > > EvtPdf< T >::accRejGen const EvtPdf< T > &  pc,
int  nMax,
double  factor = 1.
[inherited]
 

00302 {
00303   EvtPdfGen<T> gen(pc);
00304   EvtPdfDiv<T> pdfdiv(*this,pc);
00305   EvtPdfPred<T> pred(pdfdiv);
00306   pred.compute_max(iter(gen,nMax),iter(gen),factor);
00307   return EvtPredGen<EvtPdfGen<T>,EvtPdfPred<T> >(gen,pred);
00308 }

template<class T>
void EvtPdfSum< T >::addOwnedTerm double  c,
EvtPdf< T > *  pdf
[inline]
 

00036   { _c.push_back(c); _term.push_back(pdf); }

template<class T>
void EvtPdfSum< T >::addTerm double  c,
const EvtPdf< T > &  pdf
[inline]
 

00033   { assert(c >= 0.); _c.push_back(c); _term.push_back(pdf.clone()); }

template<class T>
double EvtPdfSum< T >::c int  i  )  const [inline]
 

00040 { return _c[i]; }

template<class T>
virtual EvtPdf<T>* EvtPdfSum< T >::clone  )  const [inline, virtual]
 

Implements EvtPdf< T >.

00027 { return new EvtPdfSum(*this); }

template<class T>
EvtValError EvtPdfSum< T >::compute_integral int  N  )  const [virtual]
 

Reimplemented from EvtPdf< T >.

00103 {
00104   int i;
00105   EvtValError itg(0.0,0.0);
00106   for(i=0;i<nTerms();i++) itg += _c[i]*_term[i]->getItg(N);
00107   return itg;
00108 }

template<class T>
EvtValError EvtPdfSum< T >::compute_integral  )  const [virtual]
 

Reimplemented from EvtPdf< T >.

00094 {
00095   int i;
00096   EvtValError itg(0.0,0.0);
00097   for(i=0;i<nTerms();i++) itg += _c[i]*_term[i]->getItg();
00098   return itg;
00099 }

template<class T>
EvtValError EvtPdf< T >::compute_mc_integral const EvtPdf< T > &  pc,
int  N
[inherited]
 

00254 {
00255   assert(N > 0);
00256 
00257   EvtValError otherItg = pc.getItg();
00258   EvtPdfDiv<T> pdfdiv(*this,pc);
00259   EvtPdfUnary<T> unary(pdfdiv);  
00260   
00261   EvtPdfGen<T> gen(pc);    
00262   EvtStreamInputIterator<T> begin = iter(gen,N);
00263   EvtStreamInputIterator<T> end;
00264 
00265   double sum = 0.;
00266   double sum2 = 0.;
00267   while(!(begin == end)) {
00268     
00269     double value = pdfdiv.evaluate(*begin++);
00270     sum += value;
00271     sum2 += value*value;
00272   }
00273   
00274   EvtValError x;
00275   if(N > 0) {
00276     double av = sum/((double) N);
00277     if(N > 1) {
00278       double dev2 = (sum2 - av*av*N)/((double) (N - 1));
00279       // Due to numerical precision dev2 may sometimes be negative
00280       if(dev2 < 0.) dev2 = 0.;
00281       double error = sqrt(dev2/((double) N));
00282       x = EvtValError(av,error);
00283     }
00284     else x = EvtValError(av);
00285   }
00286   _itg = x * pc.getItg();
00287   return _itg;
00288 }

template<class T>
double EvtPdf< T >::evaluate const T &  p  )  const [inline, inherited]
 

00065                                     { 
00066     if(p.isValid()) return pdf(p); 
00067     else return 0.;
00068   }

template<class T>
EvtValError EvtPdf< T >::findGenEff const EvtPdf< T > &  pc,
int  N,
int  nFindMax
[inherited]
 

00242 {
00243   assert(N > 0 || nFindMax > 0);
00244   EvtPredGen<EvtPdfGen<T>,EvtPdfPred<T> > gen = accRejGen(pc,nFindMax);
00245   int i;
00246   for(i=0;i<N;i++) gen();
00247   double eff = double(gen.getPassed())/double(gen.getTried());
00248   double err = sqrt(double(gen.getPassed()))/double(gen.getTried());
00249   return EvtValError(eff,err);
00250 }

template<class T>
EvtPdfMax< T > EvtPdf< T >::findMax const EvtPdf< T > &  pc,
int  N
[inherited]
 

00231 {
00232   EvtPdfPred<T> pred(*this);
00233   EvtPdfGen<T> gen(pc);
00234   pred.compute_max(iter(gen,N),iter(gen));
00235   EvtPdfMax<T> p = pred.getMax();
00236   return p;
00237 }

template<class T>
EvtValError EvtPdf< T >::getItg int  N  )  const [inline, inherited]
 

00087                                   {
00088     if(!_itg.valueKnown()) _itg = compute_integral(N);
00089     return _itg;
00090   }

template<class T>
EvtValError EvtPdf< T >::getItg  )  const [inline, inherited]
 

00083                              {
00084     if(!_itg.valueKnown()) _itg = compute_integral();
00085     return _itg;
00086   }

template<class T>
EvtPdf<T>* EvtPdfSum< T >::getPdf int  i  )  const [inline]
 

00041 { return _term[i]; }

template<class T>
int EvtPdfSum< T >::nTerms  )  const [inline]
 

00038 { return _term.size(); }  // number of terms

template<class T>
double EvtPdfSum< T >::pdf const T &  p  )  const [protected, virtual]
 

Implements EvtPdf< T >.

00081 {
00082   double ret = 0.;
00083   unsigned i;
00084   for(i=0; i < _c.size(); i++) ret += _c[i] * _term[i]->evaluate(p);
00085   return ret;
00086 }

template<class T>
T EvtPdfSum< T >::randomPoint  )  [virtual]
 

Reimplemented from EvtPdf< T >.

00119 {
00120   if(!_itg.valueKnown()) _itg = compute_integral();      
00121   
00122   double max = _itg.value();
00123   double rnd = EvtRandom::Flat(0,max);
00124   
00125   double sum = 0.;
00126   int i;
00127   for(i = 0; i < nTerms(); i++) {
00128     double itg = _term[i]->getItg().value();
00129     sum += _c[i] * itg;
00130     if(sum > rnd) break;
00131   }
00132   
00133   return _term[i]->randomPoint(); 
00134 }

template<class T>
void EvtPdf< T >::setItg EvtValError  itg  )  [inline, inherited]
 

00081 {_itg = itg; }


Member Data Documentation

template<class T>
vector<double> EvtPdfSum< T >::_c [protected]
 

template<class T>
EvtValError EvtPdfSum< T >::_itg [mutable, protected]
 

Reimplemented from EvtPdf< T >.

template<class T>
vector<EvtPdf<T>*> EvtPdfSum< T >::_term [protected]
 


The documentation for this class was generated from the following file:
Generated on Wed Feb 2 16:08:18 2011 for BOSS6.5.5 by  doxygen 1.3.9.1