25 using namespace complex_literals;
29 namespace MD = MultiDimensional;
31 FFTauto3PiRCT::FFTauto3PiRCT() {
33 vector<IndexType> dims = {3};
34 string name{
"FFTauto3PiRCT"};
37 setPrefix(
"Tauto3Pi");
38 addProcessSignature(PID::ANTITAU, {PID::PIMINUS, PID::PIPLUS, PID::PIPLUS});
44 void FFTauto3PiRCT::defineSettings() {
46 setPath(getFFErrPrefixGroup().
get());
50 addSetting<double>(
"alphaS",-8.);
51 addSetting<double>(
"betaS",9.);
52 addSetting<double>(
"gammaS",1.2);
53 addSetting<double>(
"deltaS",0.6);
54 addSetting<double>(
"RS",1.8);
55 addSetting<double>(
"MRho",0.7718);
56 addSetting<double>(
"MRhoP",1.35);
58 addSetting<double>(
"GRhoP",0.44);
59 addSetting<double>(
"MA",1.091);
60 addSetting<double>(
"GA",0.5);
61 addSetting<double>(
"MS",0.48);
62 addSetting<double>(
"GS",0.7);
63 addSetting<double>(
"fPi",0.0913);
64 addSetting<double>(
"FV",0.1686);
65 addSetting<double>(
"FA",0.131);
66 addSetting<double>(
"betaRhoP",-0.318);
67 addSetting<double>(
"Vud",sqrt(1-0.2257*0.2257));
79 if(daughters[0].pdgId() == daughters[1].pdgId()){
80 pPiPlus1 = daughters[0].momentum();
81 pPiPlus2 = daughters[1].momentum();
82 pPiMinus = daughters[2].momentum();
83 }
else if (daughters[1].pdgId() == daughters[2].pdgId()){
84 pPiPlus1 = daughters[1].momentum();
85 pPiPlus2 = daughters[2].momentum();
86 pPiMinus = daughters[0].momentum();
92 const double s1 = (pPiPlus2 + pPiMinus).mass2();
93 const double s2 = (pPiPlus1 + pPiMinus).mass2();
94 const double s3 = (pPiPlus1 + pPiPlus2).mass2();
95 const double Sqp = (pPiPlus1 + pPiPlus2 + pPiMinus).mass2();
97 const double Mp = sqrt((s1 + s2 + s3 - Sqp)/3.);
99 evalAtPSPoint({Sqp, s1, s2}, {Mp});
103 void FFTauto3PiRCT::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
104 Tensor& result = getTensor();
108 MSG_WARNING(
"Warning, Settings have not been defined!");
113 if(masses.size() >= 1) {
118 Mp = this->masses()[1];
120 double Sqp = point[0];
121 double s1 = point[1];
122 double s2 = point[2];
123 double s3 = Sqp + 3*Mp*Mp - s1 - s2;
126 const double alphaS = (*getSetting<double>(
"alphaS"));
127 const double betaS = (*getSetting<double>(
"betaS"));
128 const double gammaS = (*getSetting<double>(
"gammaS"));
129 const double deltaS = (*getSetting<double>(
"deltaS"));
130 const double RS = (*getSetting<double>(
"RS"))/(unitres);
131 const double MRho = unitres*(*getSetting<double>(
"MRho"));
132 const double MRhoP = unitres*(*getSetting<double>(
"MRhoP"));
133 const double GRhoP = unitres*(*getSetting<double>(
"GRhoP"));
134 const double MA = unitres*(*getSetting<double>(
"MA"));
135 const double GA = unitres*(*getSetting<double>(
"GA"));
136 const double MS = unitres*(*getSetting<double>(
"MS"));
137 const double GS = unitres*(*getSetting<double>(
"GS"));
138 const double fPi = unitres*(*getSetting<double>(
"fPi"));
139 const double FV = unitres*(*getSetting<double>(
"FV"));
140 const double FA = unitres*(*getSetting<double>(
"FA"));
141 const double betaRhoP = (*getSetting<double>(
"betaRhoP"));
142 const double Vud = (*getSetting<double>(
"Vud"));
144 const double Mp2 = Mp*Mp;
145 const double fPi2 = fPi*fPi;
146 const double MRho2 = MRho*MRho;
147 const double MRhoP2 = MRhoP*MRhoP;
148 const double MA2 = MA*MA;
149 const double MS2 = MS*MS;
150 const double GV = fPi2/FV;
153 const double sigmapi1 = sqrt(1 - 4*Mp2/s1);
154 const double sigmapi2 = sqrt(1 - 4*Mp2/s2);
155 const double sigmapi3 = sqrt(1 - 4*Mp2/s3);
156 const double MKaon = unitres*0.494;
157 const double MKaon2 = MKaon*MKaon;
159 const double GRho1 = MRho*s1/(96*
pi*fPi*fPi)*(pow(sigmapi1,3.) + 0.5*(1 - 4*MKaon2/s1 > 0. ? pow(1 - 4*MKaon2/s1, 1.5) : 0.));
160 const double GRho2 = MRho*s2/(96*
pi*fPi*fPi)*(pow(sigmapi2,3.) + 0.5*(1 - 4*MKaon2/s2 > 0. ? pow(1 - 4*MKaon2/s2, 1.5) : 0.));
161 const double GRhoP1 = GRhoP*MRhoP/sqrt(s1)*pow((s1 - 4*Mp2)/(MRhoP2 - 4*Mp2) ,1.5);
162 const double GRhoP2 = GRhoP*MRhoP/sqrt(s2)*pow((s2 - 4*Mp2)/(MRhoP2 - 4*Mp2) ,1.5);
164 const double GS1 = GS*sigmapi1/sqrt(1 - 4*Mp2/MS2);
165 const double GS2 = GS*sigmapi2/sqrt(1 - 4*Mp2/MS2);
166 const double GAq = GA;
169 const complex<double> BWRho1 = 1./(s1 - MRho2 + 1i*MRho*GRho1);
170 const complex<double> BWRho2 = 1./(s2 - MRho2 + 1i*MRho*GRho2);
171 const complex<double> BWRhoP1 = 1./(s1 - MRhoP2 + 1i*MRhoP*GRhoP1);
172 const complex<double> BWRhoP2 = 1./(s2 - MRhoP2 + 1i*MRhoP*GRhoP2);
173 const complex<double> BWRhoC1 = (BWRho1 + betaRhoP*BWRhoP1)/(1 + betaRhoP);
174 const complex<double> BWRhoC2 = (BWRho2 + betaRhoP*BWRhoP2)/(1 + betaRhoP);
175 const complex<double> BWS1 = 1./(MS2 - s1 - 1i*MS*GS1);
176 const complex<double> BWS2 = 1./(MS2 - s2 - 1i*MS*GS2);
177 const complex<double> BWA = 1./(Sqp - MA2 + 1i*MA*GAq);
180 const double Lambda1 = pow(Sqp-s1-Mp2,2.) - 4*s1*Mp2;
181 const double Lambda2 = pow(Sqp-s2-Mp2,2.) - 4*s2*Mp2;
182 const double FS1 = exp(-Lambda1*pow(RS,2.)/(8*Sqp));
183 const double FS2 = exp(-Lambda2*pow(RS,2.)/(8*Sqp));
186 const double Lp = fPi2/(2.*
sqrt2*FA*GV);
187 const double Lpp = -(1. - 2.*pow(GV,2.)/fPi2)*Lp;
188 const double Lz = (Lp + Lpp)/4.;
189 const double H1 = -Lz*Mp2/Sqp + Lp*s1/Sqp + Lpp;
190 const double H2 = -Lz*Mp2/Sqp + Lp*s2/Sqp + Lpp;
193 const double F1X = -2.*
sqrt2/3.;
194 const double F2X = -2.*
sqrt2/3.;
196 const complex<double> F1R = (3*s2*BWRhoC2 - (2*GV/FV - 1.)*( (2*Sqp - 2*s2 - s3)*BWRhoC2 + (s3-s2)*BWRhoC1 )
197 +(alphaS*FS2*BWS2 + betaS*FS1*BWS1)*MS2)
198 *(
sqrt2*FV*GV/(3*fPi2));
199 const complex<double> F2R = (3*s1*BWRhoC1 - (2*GV/FV - 1.)*( (2*Sqp - 2*s1 - s3)*BWRhoC1 + (s3-s1)*BWRhoC2 )
200 +(alphaS*FS1*BWS1 + betaS*FS2*BWS2)*MS2)
201 *(
sqrt2*FV*GV/(3*fPi2));
203 const complex<double> F1RR = (-(Lp + Lpp)*3*s2*BWRhoC2 + H2*(2*Sqp + s2 - s3)*BWRhoC2 + H1*(s3-s2)*BWRhoC1
204 +(gammaS*BWS2*FS2 + deltaS*BWS1*FS1)*MS2)
205 *(4*FA*GV/(3*fPi2)*Sqp*BWA);
206 const complex<double> F2RR = (-(Lp + Lpp)*3*s1*BWRhoC1 + H1*(2*Sqp + s1 - s3)*BWRhoC1 + H2*(s3-s1)*BWRhoC2
207 +(gammaS*BWS1*FS1 + deltaS*BWS2*FS2)*MS2)
208 *(4*FA*GV/(3*fPi2)*Sqp*BWA);
210 const double F4X = 2.*
sqrt2/3*Mp2/(2*Sqp*(Sqp-Mp2))*( 3*(s3-Mp2) - 3*Sqp);
211 const complex<double> F4R = -
sqrt2*pow(GV,2.)/fPi2*Mp2/(Sqp-Mp2)*( s1/Sqp*(s3-s2)*BWRhoC1 + s2/Sqp*(s3-s1)*BWRhoC2);
214 const double alphaQED = 1./137.036;
215 const double v01 = 2*sigmapi1/(1 + sigmapi1*sigmapi1);
216 const double v02 = 2*sigmapi2/(1 + sigmapi2*sigmapi2);
217 const double v03 = 2*sigmapi3/(1 + sigmapi3*sigmapi3);
219 const double cf1 = 2*
pi*alphaQED/v01/(1. - exp(-2*
pi*alphaQED/v01));
220 const double cf2 = 2*
pi*alphaQED/v02/(1. - exp(-2*
pi*alphaQED/v02));
221 const double cf3 = 2*
pi*alphaQED/v03/(exp(2*
pi*alphaQED/v03) - 1. );
224 result.
element({0}) = F1X + F1R + F1RR;
225 result.
element({1}) = F2X + F2R + F2RR;
226 result.
element({2}) = F4X + F4R;
228 result*=(Vud/fPi)*sqrt(cf1*cf2*cf3);
232 unique_ptr<FormFactorBase> FFTauto3PiRCT::clone(
const string& label) {
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
std::complex< double > & element(const IndexList &indices={})
access an element given its indices
Tensor indices label definitions.
static constexpr double sqrt2
form factors see 1203.3955 and 1310.1053
std::vector< Particle > ParticleList
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
void clearData()
sets all the elements to 0
Various numerical constants.
Hammer particle data class.
static constexpr double pi