#include "AMEGIC++/Main/Helicity.H" #include "ATOOLS/Math/MyComplex.H" #include "ATOOLS/Math/Vector.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Org/Message.H" #include "AMEGIC++/Main/Pol_Info.H" #include "ATOOLS/Org/Run_Parameter.H" #include using namespace ATOOLS; using namespace AMEGIC; using namespace std; Helicity::Helicity(int Nin,int Nout,Flavour* fl,Pol_Info* pl) : m_flavours(Nin+Nout, kf_none), m_nPols(Nin+Nout), m_allowTrafo(true), m_needsTrafo(false), m_spos(-1) { int N=Nin+Nout; p_pol_types = new char[N+1]; p_angles = new double[N]; /* Store the informations. Look up massive polarized spinors. */ for(int i=0;i to a list // get the sign and the oppsite sign of the polarisation lambda = (heli/div) % m_nPols[flav]; int lambda2= 1-lambda; // obtain the corresponding helComb return heli + div*(lambda2 - lambda); } bool Helicity::IsContrib(int i,int* pm,int length) { if (!pm) return 1; for (int j=0;jMaxHel()) return 0; for (size_t i=0;i 0) { std::vector::const_iterator flNum(m_trafoList.begin()); for (int i=0; flNum != m_trafoList.end(); flNum++, ++i) { // initializing several phyiscal and non-physical values ATOOLS::Vec4D k0(BS->Getk0()); ATOOLS::Vec4D p(BS->Momentum(*flNum)); double mu(BS->Mu(*flNum).real()); double m(m_flavours[*flNum].Mass()); double antiSign; m_flavours[*flNum].IsAnti() ? antiSign = -1. : antiSign = 1.; /* Constructing the polarization vector s. */ double p3abs(ATOOLS::Vec3D(p).Abs()); ATOOLS::Vec4D s = Vec4D(p3abs, p[0]/p3abs*Vec3D(p))/m; // Determine the common scaling factor c. double denominator((p + antiSign*m*s)*k0); if (ATOOLS::IsZero(denominator)) { msg_Error()<<"Warning: Encountered a zero-denominator while trying to " <<"construct the matrices for the polarisation transformation."< S = BS->GetS(s, *flNum); Complex eta_s(csqrt(2. * s * k0)); Complex A( (k0 * p) / (k0 * s) ); m_trafoMatrices[i][0][0] = .5*c + (antiSign*c*0.25/m) * (m*m/A + A + S.first*S.second); m_trafoMatrices[i][0][1] = -0.5*antiSign*c*mu*eta_s*S.second/m; m_trafoMatrices[i][1][0] = -0.5*antiSign*c*mu*eta_s*S.first/m; m_trafoMatrices[i][1][1] = m_trafoMatrices[i][0][0]; } } } void Helicity::SpinorTransformation(std::vector& A) { if (UseTransformation()) { std::vector::const_iterator flav(m_trafoList.begin()); for(int i=0; flav != m_trafoList.end(); flav++, ++i) { std::vector Atemp(A); for (size_t helComb=0; helComb *Helis) { int mult(1); size_t num(0); for (size_t i=0; i < Helis->size(); ++i) { num += mult * (*Helis)[i]; mult *= m_nPols[i]; } return num; } int Helicity::GetPol(const int& flav, const int& hNumber) { /* Return the polarisation state of flavour "flav" in helicity combination "hNumber" */ return p_slist[hNumber].s[flav]; }