00001 /******************************************************************************* 00002 * Project: BaBar detector at the SLAC PEP-II B-factory 00003 * Package: EvtGenBase 00004 * File: $Id: EvtAmplitudeSum.hh,v 1.1.1.2 2007/10/26 05:03:14 pingrg Exp $ 00005 * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002 00006 * 00007 * Copyright (C) 2002 Caltech 00008 *******************************************************************************/ 00009 00010 #ifndef EVT_AMPLITUDE_SUM_HH 00011 #define EVT_AMPLITUDE_SUM_HH 00012 00013 #include <stdio.h> 00014 #include <assert.h> 00015 #include <vector> 00016 #include "EvtGenBase/EvtAmplitude.hh" 00017 00018 template <class T> 00019 class EvtAmplitudeSum : public EvtAmplitude<T> { 00020 00021 public: 00022 00023 EvtAmplitudeSum() {} 00024 EvtAmplitudeSum(const EvtAmplitudeSum<T>& other) 00025 : EvtAmplitude<T>(other) 00026 { 00027 int i; 00028 for(i=0;i<other.nTerms();i++) { 00029 00030 EvtComplex c = other.c(i); 00031 _c.push_back(c); 00032 EvtAmplitude<T>* amp = other.getTerm(i); 00033 assert(amp); 00034 EvtAmplitude<T>* amp1 = amp->clone(); 00035 assert(amp1); 00036 _term.push_back(amp1); 00037 } 00038 } 00039 00040 virtual ~EvtAmplitudeSum() 00041 { 00042 int i; 00043 for(i=0;i<_term.size();i++) { 00044 00045 delete _term[i]; 00046 } 00047 } 00048 00049 virtual EvtAmplitude<T>* clone() const 00050 { 00051 return new EvtAmplitudeSum<T>(*this); 00052 } 00053 00054 00055 void addTerm(EvtComplex c,const EvtAmplitude<T>& amp) 00056 { 00057 _c.push_back(c); 00058 _term.push_back(amp.clone()); 00059 } 00060 00061 void addOwnedTerm(EvtComplex c, EvtAmplitude<T>* amp) 00062 { 00063 assert(amp); 00064 _c.push_back(c); 00065 _term.push_back(amp); 00066 } 00067 00068 int nTerms() const { return _term.size(); } // number of terms 00069 00070 void print() const { 00071 00072 int N = nTerms(); 00073 printf("Amplitude has %d terms\n",N); 00074 int i; 00075 for(i=0;i<N;i++) { 00076 printf("c%d = (%f,%f)\n",i,real(_c[i]),imag(_c[i])); 00077 assert(_term[i]); 00078 } 00079 } 00080 00081 00082 inline EvtComplex c(int i) const { return _c[i]; } 00083 inline EvtAmplitude<T>* getTerm(int i) const { return _term[i]; } 00084 00085 protected: 00086 00087 virtual EvtComplex amplitude(const T& p) const 00088 { 00089 if(_term.size() == 0) 00090 printf("Warning: amplitude sum has zero terms\n"); 00091 00092 EvtComplex value = 0.; 00093 int i; 00094 for(i=0;i<_term.size();i++) { 00095 00096 value+=_c[i]*_term[i]->evaluate(p); 00097 } 00098 return value; 00099 } 00100 00101 private: 00102 00103 std::vector<EvtComplex> _c; // coefficients 00104 std::vector<EvtAmplitude<T>*> _term; // pointers to amplitudes 00105 }; 00106 00107 00108 #endif 00109 00110