]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenBase/EvtAmplitudeSum.hh
New plots for trending injector efficiencies (Melinda)
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtAmplitudeSum.hh
1 /*******************************************************************************
2  * Project: BaBar detector at the SLAC PEP-II B-factory
3  * Package: EvtGenBase
4  *    File: $Id: EvtAmplitudeSum.hh,v 1.10 2009/02/18 03:31:37 ryd 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() {}
24   EvtAmplitudeSum(const EvtAmplitudeSum<T>& other)
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