40 #include "TLorentzRotation.h"
43 #include "spinUtils.hpp"
44 #include "dFunction.hpp"
49 using namespace boost;
53 bool isobarHelicityAmplitude::_debug =
false;
56 isobarHelicityAmplitude::isobarHelicityAmplitude()
73 TLorentzVector daughter = daughterLv;
74 const TVector3 zAxisParent(0, 0, 1);
75 const TVector3 yHfAxis = zAxisParent.Cross(daughter.Vect());
78 rot1.RotateZ(piHalf - yHfAxis.Phi());
79 rot1.RotateX(yHfAxis.Theta() - piHalf);
83 rot2.RotateY(-signum(daughter.X()) * daughter.Theta());
88 hfTransform.Boost(-daughter.BoostVector());
102 _decay->calcIsobarLzVec();
107 _decay->calcIsobarLzVec();
112 const TLorentzVector& beamLv =
_decay->productionVertex()->referenceLzVec();
113 const TLorentzVector& XLv =
_decay->XParticle()->lzVec();
114 const TLorentzRotation gjTrans =
gjTransform(beamLv, XLv);
115 for (
unsigned int i = 0;
i <
_decay->nmbDecayVertices(); ++
i) {
118 printDebug <<
"transforming outgoing particles of vertex " << *vertex
119 <<
" into " << vertex->parent()->name() <<
" Gottfried-Jackson RF" << endl;
120 vertex->transformOutParticles(gjTrans);
123 for (
unsigned int i = 1;
i <
_decay->nmbDecayVertices(); ++
i) {
126 printDebug <<
"transforming all child particles of vertex " << *vertex
127 <<
" into " << vertex->parent()->name() <<
" helicity RF" << endl;
128 const TLorentzRotation hfTrans =
hfTransform(vertex->parent()->lzVec());
131 decayTopologyGraphType::edgeIterator iEd, iEdEnd;
132 for (tie(iEd, iEdEnd) = subGraph.edges(); iEd != iEdEnd; ++iEd) {
135 cout <<
" transforming " << part->name() <<
" into "
136 << vertex->parent()->name() <<
" helicity RF" << endl;
137 part->transform(hfTrans);
146 const bool topVertex)
const
149 printDebug <<
"calculating two-body decay amplitude in helicity formalism for "
153 const particlePtr& daughter1 = vertex->daughter1();
154 const particlePtr& daughter2 = vertex->daughter2();
157 const int L = vertex->L();
158 const int S = vertex->S();
159 const int J = parent->J();
160 const int lambda1 = daughter1->spinProj();
161 const int lambda2 = daughter2->spinProj();
162 const int lambda = lambda1 - lambda2;
163 const double lsClebsch = clebschGordanCoeff<double>(L, 0, S,
lambda, J,
lambda,
_debug);
168 const int s1 = daughter1->J();
169 const int s2 = daughter2->J();
170 const double ssClebsch = clebschGordanCoeff<double>(s1, lambda1, s2, -lambda2, S,
lambda,
_debug);
175 const int Lambda = parent->spinProj();
176 const int P = parent->P();
177 const int refl = parent->reflectivity();
178 const double phi = daughter1->lzVec().Phi();
179 const double theta = daughter1->lzVec().Theta();
180 complex<double> DFunc;
182 DFunc = DFunctionReflConj<complex<double> >(J,
Lambda,
lambda, P, refl, phi, theta, 0,
_debug);
187 const double q = daughter1->lzVec().Vect().Mag();
188 const double bf = barrierFactor(L, q,
_debug);
191 const complex<double> bw = vertex->massDepAmplitude();
194 const double norm = angMomNormFactor(L,
_debug);
197 complex<double> amp = norm * DFunc * lsClebsch * ssClebsch * bf * bw;
200 printDebug <<
"two-body decay amplitude = " << maxPrecisionDouble(amp) << endl;