]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TEvtGen/EvtGenBase/EvtAmplitudeSum.hh
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtAmplitudeSum.hh
CommitLineData
da0e9ce3 1/*******************************************************************************
2 * Project: BaBar detector at the SLAC PEP-II B-factory
3 * Package: EvtGenBase
0ca57c2f 4 * File: $Id: EvtAmplitudeSum.hh,v 1.2 2009-03-16 16:42:46 robbep Exp $
da0e9ce3 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
18template <class T>
19class EvtAmplitudeSum : public EvtAmplitude<T> {
20
21public:
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
84protected:
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
99private:
100
101 std::vector<EvtComplex> _c; // coefficients
102 std::vector<EvtAmplitude<T>*> _term; // pointers to amplitudes
103};
104
105
106#endif
107
108