Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFTauto3PiRCT.cc
Go to the documentation of this file.
1 ///
2 /// @file FFTauto3PiRCT.cc
3 /// @brief \f$ \tau^+ \rightarrow \bar\nu\pi^+\pi^+\pi^- \f$ form factors
4 /// see 1203.3955 and 1310.1053
5 ///
6 
7 //**** This file is a part of the HAMMER library
8 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
9 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
10 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
11 
12 // -*- C++ -*-
14 #include "Hammer/IndexLabels.hh"
15 #include "Hammer/Math/Constants.hh"
16 #include "Hammer/Particle.hh"
17 #include "Hammer/Tools/Pdg.hh"
19 #include <cmath>
20 #include <iostream>
21 
22 //From 1310.1053 and 1203.3955
23 
24 using namespace std;
25 using namespace complex_literals;
26 
27 namespace Hammer {
28 
29  namespace MD = MultiDimensional;
30 
31  FFTauto3PiRCT::FFTauto3PiRCT() {
32  // Create tensor rank and dimensions
33  vector<IndexType> dims = {3};
34  string name{"FFTauto3PiRCT"};
35  //Ordering is piminus then piplus as anti-tau parent has pdg < 0
36 
37  setPrefix("Tauto3Pi");
38  addProcessSignature(PID::ANTITAU, {PID::PIMINUS, PID::PIPLUS, PID::PIPLUS});
39  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_TAU3PI})});
40 
41  setSignatureIndex();
42  }
43 
44  void FFTauto3PiRCT::defineSettings() {
45  //_FFErrNames = ;
46  setPath(getFFErrPrefixGroup().get());
47  setUnits("GeV");
48 
49  //Fit parameters from 1310.1053 in GeV
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);//GeV^-1
55  addSetting<double>("MRho",0.7718);
56  addSetting<double>("MRhoP",1.35);
57 // addSetting<double>("GRho",0.149);
58  addSetting<double>("GRhoP",0.44);
59  addSetting<double>("MA",1.091);
60  addSetting<double>("GA",0.5); //PDG
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));
68 
69  initialized = true;
70  }
71 
72  void FFTauto3PiRCT::eval(const Particle&, const ParticleList& daughters,
73  const ParticleList&) {
74  // Momenta
75 // const FourMomentum& pTau = parent.momentum();
76  FourMomentum pPiPlus1;
77  FourMomentum pPiPlus2;
78  FourMomentum pPiMinus;
79  if(daughters[0].pdgId() == daughters[1].pdgId()){ // Ordered 211 211 -211
80  pPiPlus1 = daughters[0].momentum();
81  pPiPlus2 = daughters[1].momentum();
82  pPiMinus = daughters[2].momentum();
83  } else if (daughters[1].pdgId() == daughters[2].pdgId()){ // 211 -211 -211
84  pPiPlus1 = daughters[1].momentum();
85  pPiPlus2 = daughters[2].momentum();
86  pPiMinus = daughters[0].momentum();
87  }
88 
89 // const double Mt = pTau.mass();
90 // const double Mp = pPiMinus.mass();
91  //Follows 1203.3955 s1 and s2 convention
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();
96 
97  const double Mp = sqrt((s1 + s2 + s3 - Sqp)/3.);
98 
99  evalAtPSPoint({Sqp, s1, s2}, {Mp});
100 
101  }
102 
103  void FFTauto3PiRCT::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
104  Tensor& result = getTensor();
105  result.clearData();
106 
107  if(!initialized){
108  MSG_WARNING("Warning, Settings have not been defined!");
109  }
110 
111  double Mp = 0.;
112  double unitres = 1.;
113  if(masses.size() >= 1) {
114  Mp = masses[0];
115  unitres = _units;
116  }
117  else {
118  Mp = this->masses()[1];
119  }
120  double Sqp = point[0];
121  double s1 = point[1];
122  double s2 = point[2];
123  double s3 = Sqp + 3*Mp*Mp - s1 - s2;
124 
125  //Fit parameters in GeV
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"));
143 
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;
151 
152  //Widths
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;
158  //Following 0911.4436 and tauola code in f3pi rcht.f
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);
163 
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;//Placeholder. 1310.1053 uses a linear interpolation in s
167 
168  //Constituent BWs. Signs of imGamma terms follow tauola code funct_3pi.f and funct_rpt.f, different to 1203.3955, 1310.1053
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);
178 
179  //Constituent sigma exponentials
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));
184 
185  //Lambdas & H fn
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;
191 
192  //Pieces of structure functions. F1(q^2, s1, s2) <-> F2(q^2, s1, s2) wrt 1203.3955 (Using Z Phys C 56 661 (1992) convention for F1 and F2)
193  const double F1X = -2.*sqrt2/3.;
194  const double F2X = -2.*sqrt2/3.;
195 
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));
202 
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);
209 
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);
212 
213  //Coulomb correction
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);
218 
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. );
222 
223  //Set tensor elements
224  result.element({0}) = F1X + F1R + F1RR;
225  result.element({1}) = F2X + F2R + F2RR;
226  result.element({2}) = F4X + F4R;
227 
228  result*=(Vud/fPi)*sqrt(cf1*cf2*cf3);
229 
230  }
231 
232  unique_ptr<FormFactorBase> FFTauto3PiRCT::clone(const string& label) {
233  MAKE_CLONE(FFTauto3PiRCT, label);
234  }
235 
236 } // namespace Hammer
#define MSG_WARNING(x)
Definition: Logging.hh:366
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
std::complex< double > & element(const IndexList &indices={})
access an element given its indices
Definition: Tensor.cc:67
Tensor indices label definitions.
static constexpr double sqrt2
Definition: Constants.hh:26
form factors see 1203.3955 and 1310.1053
std::vector< Particle > ParticleList
Definition: Particle.fhh:20
Sparse tensor data container.
Particle class.
Definition: Particle.hh:30
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
void clearData()
sets all the elements to 0
Definition: Tensor.cc:229
Various numerical constants.
Hammer particle data class.
Hammer particle class.
#define MAKE_CLONE(OBJ, LABEL)
4-momentum class
Definition: FourMomentum.hh:30
static constexpr double pi
Definition: Constants.hh:21