00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "EvtGenBase/EvtPatches.hh"
00017
00018 #include "EvtGenBase/EvtMassAmp.hh"
00019
00020 EvtMassAmp::EvtMassAmp(const EvtPropBreitWignerRel& prop, const EvtTwoBodyVertex& vd)
00021 : EvtAmplitude<EvtPoint1D>()
00022 ,_prop(prop), _vd(vd), _vb(0)
00023 ,_useBirthFact(false), _useDeathFact(false)
00024 ,_useBirthFactFF(false), _useDeathFactFF(false)
00025 ,_fixUpMassForMax(false),_addfactor(0.)
00026 {}
00027
00028 EvtMassAmp::EvtMassAmp(const EvtMassAmp& other)
00029 : EvtAmplitude<EvtPoint1D>(other)
00030 ,_prop(other._prop), _vd(other._vd)
00031 ,_vb(other._vb ? new EvtTwoBodyVertex(*other._vb) : 0)
00032 ,_useBirthFact(other._useBirthFact)
00033 ,_useDeathFact(other._useDeathFact)
00034 ,_useBirthFactFF(other._useBirthFactFF)
00035 ,_useDeathFactFF(other._useDeathFactFF)
00036 ,_fixUpMassForMax(other._fixUpMassForMax)
00037 ,_addfactor(other._addfactor)
00038 {}
00039
00040
00041 EvtMassAmp::~EvtMassAmp()
00042 {
00043 if(_vb) delete _vb;
00044 }
00045
00046
00047 EvtComplex EvtMassAmp::amplitude(const EvtPoint1D& p) const
00048 {
00049
00050
00051 double m = p.value();
00052
00053
00054 if ( m< (_vd.mA()+_vd.mB()) ) return EvtComplex(0.,0.);
00055
00056 EvtTwoBodyKine vd(_vd.mA(),_vd.mB(),m);
00057
00058
00059
00060 EvtPropBreitWignerRel bw(_prop.m0(),_prop.g0()*_vd.widthFactor(vd));
00061 EvtComplex amp = bw.evaluate(m);
00062
00063
00064
00065
00066 if(_useBirthFact) {
00067
00068 assert(_vb);
00069 if ( (m+_vb->mB()) < _vb->mAB() ) {
00070 EvtTwoBodyKine vb(m,_vb->mB(),_vb->mAB());
00071 double phsp= _vb->phaseSpaceFactor(vb,EvtTwoBodyKine::AB);
00072 amp *= phsp;
00073
00074 if ( _fixUpMassForMax ) {
00075 amp *= sqrt((vb.p() / _vb->pD()));
00076 }
00077 if(_useBirthFactFF) {
00078
00079 assert(_vb);
00080 amp *= _vb->formFactor(vb);
00081 }
00082 }
00083 else{
00084 if ( _vb->L() != 0 ) amp=0.;
00085 }
00086 }
00087
00088
00089
00090
00091 if(_useDeathFact) {
00092 amp *= _vd.phaseSpaceFactor(vd,EvtTwoBodyKine::AB);
00093 if ( _fixUpMassForMax ) {
00094 amp *= sqrt((vd.p() / _vd.pD()));
00095 }
00096 }
00097 if(_useDeathFactFF) amp *= _vd.formFactor(vd);
00098
00099
00100
00101 if(fabs(_addfactor) > 0.00000001){
00102 assert(_vb);
00103 double phsp;
00104 if ( (m+_vb->mB()) < _vb->mAB() ) {
00105 EvtTwoBodyKine vb(m,_vb->mB(),_vb->mAB());
00106 phsp= vb.p(EvtTwoBodyKine::AB);
00107 } else{
00108 if ( _vb->L() != 0 ) phsp=0.;
00109 }
00110
00111 amp *= pow(phsp,_addfactor);
00112
00113 }
00114
00115 return amp;
00116 }
00117
00118
00119
00120
00121
00122