herwig is hosted by Hepforge, IPPP Durham
Herwig  7.2.1
FivePionCurrent.h
1 // -*- C++ -*-
2 //
3 // FivePionCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator
4 // Copyright (C) 2002-2019 The Herwig Collaboration
5 //
6 // Herwig is licenced under version 3 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef HERWIG_FivePionCurrent_H
10 #define HERWIG_FivePionCurrent_H
11 //
12 // This is the declaration of the FivePionCurrent class.
13 //
14 
15 #include "WeakDecayCurrent.h"
16 #include "ThePEG/Helicity/epsilon.h"
17 
18 namespace Herwig {
19 
20 using namespace ThePEG;
21 
29 
30 public:
31 
36 
53  virtual bool createMode(int icharge,unsigned int imode,DecayPhaseSpaceModePtr mode,
54  unsigned int iloc,unsigned int ires,
55  DecayPhaseSpaceChannelPtr phase,Energy upp);
56 
65  virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
67 
78  virtual vector<LorentzPolarizationVectorE>
79  current(const int imode,const int ichan,Energy & scale,
80  const ParticleVector & decay, DecayIntegrator::MEOption meopt) const;
81 
87  virtual bool accept(vector<int> id);
88 
94  virtual unsigned int decayMode(vector<int> id);
95 
102  virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
103 
104 public:
105 
112  void persistentOutput(PersistentOStream & os) const;
113 
119  void persistentInput(PersistentIStream & is, int version);
121 
128  static void Init();
129 
130 protected:
131 
141  Complex rhoBreitWigner(Energy2 scale) const {
142  Energy2 m2=sqr(_rhomass);
143  return m2/(m2-scale-Complex(0.,1.)*_rhomass*_rhowidth);
144  }
145 
150  Complex a1BreitWigner(Energy2 scale) const {
151  Energy2 m2=sqr(_a1mass);
152  return m2/(m2-scale-Complex(0.,1.)*_a1mass*_a1width);
153  }
154 
159  Complex omegaBreitWigner(Energy2 scale) const {
160  Energy2 m2=sqr(_omegamass);
161  return m2/(m2-scale-Complex(0.,1.)*_omegamass*_omegawidth);
162  }
163 
168  Complex sigmaBreitWigner(Energy2 scale) const {
169  Energy2 m2=sqr(_sigmamass);
170  return m2/(m2-scale-Complex(0.,1.)*_sigmamass*_sigmawidth);
171  }
173 
190  rhoOmegaCurrent(unsigned int iopt,
191  const Lorentz5Momentum & Q,
192  const Lorentz5Momentum & q1,
193  const Lorentz5Momentum & q2,
194  const Lorentz5Momentum & q3,
195  const Lorentz5Momentum & q4,
196  const Lorentz5Momentum & q5) const {
197  // prefactor
198  complex<InvEnergy7> pre(_preomega*a1BreitWigner(Q.m2())*
199  omegaBreitWigner((q1+q2+q3).m2())*
200  rhoBreitWigner((q4+q5).m2()));
201  // omega piece
202  Complex omega(-1.);
203  if(_rhoomega) {
204  if(iopt==1) omega=rhoBreitWigner((q2+q3).m2());
205  else if(iopt==2) omega=rhoBreitWigner((q1+q3).m2());
206  else if(iopt==3) omega=rhoBreitWigner((q1+q2).m2());
207  else
208  omega=rhoBreitWigner((q2+q3).m2())+rhoBreitWigner((q1+q3).m2())+
209  rhoBreitWigner((q1+q2).m2());
210  }
211  LorentzVector<complex<Energy3> > omegacurrent(Helicity::epsilon(q1,q2,q3));
213  pre * omega * Helicity::epsilon(q4-q5,omegacurrent,Q);
214  return output;
215  }
216 
229  a1SigmaCurrent(unsigned int iopt,
230  const Lorentz5Momentum & Q,
231  const Lorentz5Momentum & q1,
232  const Lorentz5Momentum & q2,
233  const Lorentz5Momentum & q3,
234  const Lorentz5Momentum & q4,
235  const Lorentz5Momentum & q5) const {
236  Lorentz5Momentum pa1(q1+q2+q3);pa1.rescaleMass();
237  Energy2 ma12(pa1.m2());
238  complex<InvEnergy3> pre(_presigma*a1BreitWigner(Q.m2())*a1BreitWigner(ma12)*
239  sigmaBreitWigner((q4+q5).m2()));
240  Energy2 pdot[2]={q2*(q1-q3),q1*(q2-q3)};
242  {(pdot[0]/ma12*pa1-q1+q3)*rhoBreitWigner((q1+q3).m2()),
243  (pdot[1]/ma12*pa1-q2+q3)*rhoBreitWigner((q2+q3).m2())};
245  if(iopt==1) total = rho[0];
246  else if(iopt==2) total = rho[1];
247  else total = rho[0]+rho[1];
248  Complex qdot = total * Q / Q.m2();
250  cq = cq * qdot;
251  cq -= total;
252  return pre * cq;
253  }
255 
256 protected:
257 
264  virtual IBPtr clone() const {return new_ptr(*this);}
265 
270  virtual IBPtr fullclone() const {return new_ptr(*this);}
272 
273 protected:
274 
282  virtual void doinit();
284 
285 private:
286 
291  FivePionCurrent & operator=(const FivePionCurrent &) = delete;
292 
293 private:
294 
302  Energy _rhomass;
303 
307  Energy _a1mass;
308 
312  Energy _omegamass;
313 
317  Energy _sigmamass;
318 
322  Energy _rhowidth;
323 
327  Energy _a1width;
328 
332  Energy _omegawidth;
333 
337  Energy _sigmawidth;
339 
344 
348  bool _rhoomega;
349 
357  Energy2 _c;
358 
362  double _c0;
363 
367  InvEnergy _fomegarhopi;
368 
372  double _grhopipi;
373 
377  Energy _garhopi;
378 
382  Energy _faaf;
383 
387  Energy _ffpipi;
389 
397  InvEnergy7 _preomega;
398 
402  InvEnergy3 _presigma;
404 };
405 
406 }
407 
408 #endif /* HERWIG_FivePionCurrent_H */
Complex rhoBreitWigner(Energy2 scale) const
Methods to calculate the Breit-Wigner distributions for the various mesons.
The WeakDecayCurrent class is the base class for the hadronic currents produced in weak decays...
Here is the documentation of the FivePionCurrent class.
Complex a1BreitWigner(Energy2 scale) const
Breit-Wigner for the .
std::complex< double > Complex
bool _localparameters
use local values of the particle masses
Complex omegaBreitWigner(Energy2 scale) const
Breit-Wigner for the .
Energy _rhowidth
The width for the .
ThePEG::Ptr< InterfacedBase >::pointer IBPtr
double _c0
The parameter.
double _grhopipi
The parameter.
constexpr auto sqr(const T &x) -> decltype(x *x)
InvEnergy7 _preomega
Values cached to avoid unnessacary calculations.
LorentzVector< complex< InvEnergy2 > > a1SigmaCurrent(unsigned int iopt, const Lorentz5Momentum &Q, const Lorentz5Momentum &q1, const Lorentz5Momentum &q2, const Lorentz5Momentum &q3, const Lorentz5Momentum &q4, const Lorentz5Momentum &q5) const
The current.
Energy _omegamass
The mass of the for the current.
Energy _sigmawidth
The width.
Energy _a1mass
The mass of the for the current.
bool _rhoomega
Option for the treatment of Breit-Wigners in decay.
Energy2 _c
Normalisation parameters for the different currents.
virtual IBPtr clone() const
Make a simple clone of this object.
InvEnergy3 _presigma
Prefactor for the current.
MEOption
Enum for the matrix element option.
Energy _a1width
The width.
vector< tPDPtr > tPDVector
LorentzVector< complex< InvEnergy2 > > rhoOmegaCurrent(unsigned int iopt, const Lorentz5Momentum &Q, const Lorentz5Momentum &q1, const Lorentz5Momentum &q2, const Lorentz5Momentum &q3, const Lorentz5Momentum &q4, const Lorentz5Momentum &q5) const
Currents for the different channels.
Energy _garhopi
The parameter.
Energy _rhomass
The masses and widths of the intermediate particles.
virtual IBPtr fullclone() const
Make a clone of this object, possibly modifying the cloned object to make it sane.
Energy _ffpipi
The parameter.
Energy _sigmamass
The mass of the for the current.
Energy _omegawidth
The width.
Energy _faaf
The parameter.
InvEnergy _fomegarhopi
The parameter.
-*- C++ -*-
Value2 m2() const
vector< PPtr > ParticleVector
Complex sigmaBreitWigner(Energy2 scale) const
Breit-Wigner for the .