BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtAmplitudeSum.hh
Go to the documentation of this file.
1/*******************************************************************************
2 * Project: BaBar detector at the SLAC PEP-II B-factory
3 * Package: EvtGenBase
4 * File: $Id: EvtAmplitudeSum.hh,v 1.1.1.2 2007/10/26 05:03:14 pingrg 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 "EvtAmplitude.hh"
14#include <assert.h>
15#include <stdio.h>
16#include <vector>
17
18template <class T> class EvtAmplitudeSum : public EvtAmplitude<T> {
19
20public:
22 EvtAmplitudeSum( const EvtAmplitudeSum<T>& other ) : EvtAmplitude<T>( other ) {
23 int i;
24 for ( i = 0; i < other.nTerms(); i++ )
25 {
26
27 EvtComplex c = other.c( i );
28 _c.push_back( c );
29 EvtAmplitude<T>* amp = other.getTerm( i );
30 assert( amp );
31 EvtAmplitude<T>* amp1 = amp->clone();
32 assert( amp1 );
33 _term.push_back( amp1 );
34 }
35 }
36
37 virtual ~EvtAmplitudeSum() {
38 int i;
39 for ( i = 0; i < _term.size(); i++ ) { delete _term[i]; }
40 }
41
42 virtual EvtAmplitude<T>* clone() const { return new EvtAmplitudeSum<T>( *this ); }
43
44 void addTerm( EvtComplex c, const EvtAmplitude<T>& amp ) {
45 _c.push_back( c );
46 _term.push_back( amp.clone() );
47 }
48
50 assert( amp );
51 _c.push_back( c );
52 _term.push_back( amp );
53 }
54
55 int nTerms() const { return _term.size(); } // number of terms
56
57 void print() const {
58
59 int N = nTerms();
60 printf( "Amplitude has %d terms\n", N );
61 int i;
62 for ( i = 0; i < N; i++ )
63 {
64 printf( "c%d = (%f,%f)\n", i, real( _c[i] ), imag( _c[i] ) );
65 assert( _term[i] );
66 }
67 }
68
69 inline EvtComplex c( int i ) const { return _c[i]; }
70 inline EvtAmplitude<T>* getTerm( int i ) const { return _term[i]; }
71
72protected:
73 virtual EvtComplex amplitude( const T& p ) const {
74 if ( _term.size() == 0 ) printf( "Warning: amplitude sum has zero terms\n" );
75
76 EvtComplex value = 0.;
77 int i;
78 for ( i = 0; i < _term.size(); i++ ) { value += _c[i] * _term[i]->evaluate( p ); }
79 return value;
80 }
81
82private:
83 std::vector<EvtComplex> _c; // coefficients
84 std::vector<EvtAmplitude<T>*> _term; // pointers to amplitudes
85};
86
87#endif
double imag(const EvtComplex &c)
virtual EvtAmplitude< T > * clone() const
EvtAmplitude< T > * getTerm(int i) const
virtual ~EvtAmplitudeSum()
void addTerm(EvtComplex c, const EvtAmplitude< T > &amp)
void print() const
EvtAmplitudeSum(const EvtAmplitudeSum< T > &other)
void addOwnedTerm(EvtComplex c, EvtAmplitude< T > *amp)
virtual EvtComplex amplitude(const T &p) const
EvtComplex c(int i) const
virtual EvtAmplitude< T > * clone() const =0