StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
EvtAmplitudeSum.hh
1 /*******************************************************************************
2  * Project: BaBar detector at the SLAC PEP-II B-factory
3  * Package: EvtGenBase
4  * File: $Id: EvtAmplitudeSum.hh,v 1.1 2016/09/23 18:37:29 jwebb Exp $
5  * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
6  *
7  * Copyright (C) 2002 Caltech
8  *******************************************************************************/
9 
10 #ifndef EVT_AMPLITUDE_SUM_HH
11 #define EVT_AMPLITUDE_SUM_HH
12 
13 #include <stdio.h>
14 #include <assert.h>
15 #include <vector>
16 #include "EvtGenBase/EvtAmplitude.hh"
17 
18 template <class T>
19 class EvtAmplitudeSum : public EvtAmplitude<T> {
20 
21 public:
22 
23  EvtAmplitudeSum() {}
25  : EvtAmplitude<T>(other)
26  {
27  int i;
28  for(i=0;i<other.nTerms();i++) {
29 
30  EvtComplex c = other.c(i);
31  _c.push_back(c);
32  EvtAmplitude<T>* amp = other.getTerm(i);
33  assert(amp);
34  EvtAmplitude<T>* amp1 = amp->clone();
35  assert(amp1);
36  _term.push_back(amp1);
37  }
38  }
39 
40  virtual ~EvtAmplitudeSum()
41  {
42  for(size_t i=0;i<_term.size();i++) {
43 
44  delete _term[i];
45  }
46  }
47 
48  virtual EvtAmplitude<T>* clone() const
49  {
50  return new EvtAmplitudeSum<T>(*this);
51  }
52 
53 
54  void addTerm(EvtComplex c,const EvtAmplitude<T>& amp)
55  {
56  _c.push_back(c);
57  _term.push_back(amp.clone());
58  }
59 
60  void addOwnedTerm(EvtComplex c, EvtAmplitude<T>* amp)
61  {
62  assert(amp);
63  _c.push_back(c);
64  _term.push_back(amp);
65  }
66 
67  int nTerms() const { return _term.size(); } // number of terms
68 
69  void print() const {
70 
71  int N = nTerms();
72  printf("Amplitude has %d terms\n",N);
73  int i;
74  for(i=0;i<N;i++) {
75  printf("c%d = (%f,%f)\n",i,real(_c[i]),imag(_c[i]));
76  assert(_term[i]);
77  }
78  }
79 
80 
81  inline EvtComplex c(int i) const { return _c[i]; }
82  inline EvtAmplitude<T>* getTerm(int i) const { return _term[i]; }
83 
84 protected:
85 
86  virtual EvtComplex amplitude(const T& p) const
87  {
88  if(_term.size() == 0)
89  printf("Warning: amplitude sum has zero terms\n");
90 
91  EvtComplex value = 0.;
92 
93  for(size_t i=0;i<_term.size();i++) {
94  value+=_c[i]*_term[i]->evaluate(p);
95  }
96  return value;
97  }
98 
99 private:
100 
101  std::vector<EvtComplex> _c; // coefficients
102  std::vector<EvtAmplitude<T>*> _term; // pointers to amplitudes
103 };
104 
105 
106 #endif
107 
108