40 #include "TLorentzRotation.h"
43 #include "spinUtils.hpp"
44 #include "dFunction.hpp"
49 using namespace boost;
53 bool isobarCanonicalAmplitude::_debug =
false;
56 isobarCanonicalAmplitude::isobarCanonicalAmplitude()
89 const TLorentzVector& beamLv =
_decay->productionVertex()->referenceLzVec();
90 const TLorentzVector& XLv =
_decay->XParticle()->lzVec();
91 const TLorentzRotation gjTrans =
gjTransform(beamLv, XLv);
92 for (
unsigned int i = 0;
i <
_decay->nmbDecayVertices(); ++
i) {
95 printDebug <<
"transforming outgoing particles of vertex " << *vertex
96 <<
" into " << vertex->parent()->name() <<
" Gottfried-Jackson RF" << endl;
97 vertex->transformOutParticles(gjTrans);
100 for (
unsigned int i = 1;
i <
_decay->nmbDecayVertices(); ++
i) {
103 printDebug <<
"transforming all child particles of vertex " << *vertex
104 <<
" into " << vertex->parent()->name() <<
" daughter RF" << endl;
106 const TVector3 rfBoost = -vertex->parent()->lzVec().BoostVector();
109 decayTopologyGraphType::edgeIterator iEd, iEdEnd;
110 for (tie(iEd, iEdEnd) = subGraph.edges(); iEd != iEdEnd; ++iEd) {
113 cout <<
" transforming " << part->name() <<
" into "
114 << vertex->parent()->name() <<
" RF" << endl;
115 part->transform(rfBoost);
124 const bool topVertex)
const
127 printDebug <<
"calculating two-body decay amplitude in canonical formalism "
128 <<
"for " << *vertex << endl;
131 const particlePtr& daughter1 = vertex->daughter1();
132 const particlePtr& daughter2 = vertex->daughter2();
135 const int s1 = daughter1->J();
136 const int m1 = daughter1->spinProj();
137 const int s2 = daughter2->J();
138 const int m2 = daughter2->spinProj();
139 const int S = vertex->S();
140 const int mS = m1 + m2;
141 const double ssClebsch = clebschGordanCoeff<double>(s1, m1, s2, m2, S, mS,
_debug);
146 const int L = vertex->L();
147 const double q = daughter1->lzVec().Vect().Mag();
148 const double bf = barrierFactor(L, q,
_debug);
151 const complex<double> bw = vertex->massDepAmplitude();
154 const double norm = sqrt(fourPi);
158 const int J = parent->J();
159 const int M = parent->spinProj();
160 const int P = parent->P();
161 const int refl = parent->reflectivity();
162 const double phi = daughter1->lzVec().Phi();
163 const double theta = daughter1->lzVec().Theta();
164 complex<double> amp = 0;
165 for (
int mL = -L; mL <= L; mL += 2) {
170 const int reflFactor = reflectivityFactor(J, P, M, refl);
172 if (reflFactor == +1)
175 LSClebsch = clebschGordanCoeff<double>(L, mL, S, mS, J, 0,
_debug);
177 LSClebsch = 1 / rpwa::sqrt(2)
178 * ( clebschGordanCoeff<double>(L, mL, S, mS, J, +
M,
_debug)
179 - reflFactor * clebschGordanCoeff<double>(L, mL, S, mS, J, -M,
_debug));
182 LSClebsch = clebschGordanCoeff<double>(L, mL, S, mS, J,
M,
_debug);
186 amp += LSClebsch * sphericalHarmonic<complex<double> >(L, mL, theta, phi,
_debug);
190 amp *= norm * ssClebsch * bf * bw;
193 printDebug <<
"two-body decay amplitude = " << maxPrecisionDouble(amp) << endl;