Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7878205
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
123 KB
Subscribers
None
View Options
diff --git a/Decay/ResonanceHelpers.h b/Decay/ResonanceHelpers.h
--- a/Decay/ResonanceHelpers.h
+++ b/Decay/ResonanceHelpers.h
@@ -1,238 +1,241 @@
// -*- C++ -*-
//
// ResonanceHelpers.h is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2018 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef HERWIG_ResonanceHelpers_H
#define HERWIG_ResonanceHelpers_H
namespace Resonance {
/**
* The velocity squared
*/
inline double beta2(const Energy2 & s, const Energy & m1, const Energy & m2) {
return max(0.,(1.-sqr(m1+m2)/s)*(1.-sqr(m1-m2)/s));
}
/**
* The velocity
*/
inline double beta(const Energy2 & s, const Energy & m1, const Energy & m2) {
return sqrt(beta2(s,m1,m2));
}
/**
* The derivative of the function \f$\hat{H}(s)\f$ for the GS Breit-Wigner evaluated
* at the resonance mass
*/
inline double dHhatds(const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double v2 = beta2(sqr(mRes),m1,m2);
double v = sqrt(v2);
double r = (sqr(m1) + sqr(m2))/sqr(mRes);
return gamma/Constants::pi/mRes/v2*
((3.-2.*v2- 3.*r)*log((1.+v)/(1.-v)) + 2.*v*(1.- r/(1.-v2)));
}
/**
* The \f$\hat{H}(s)\f$ function for the GS Breit-Wigner
*/
inline Energy2 Hhat(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double vR = beta(sqr(mRes),m1,m2);
double v = beta( s ,m1,m2);
return gamma/mRes/Constants::pi*s*pow(v/vR,3)*log((1.+v)/(1.-v));
}
/**
* The \f$H(s)\f$ function for the GS Breit-Wigner (input the derivative term)
*/
inline Energy2 H(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2,
const double & dH, const Energy2 & Hres) {
if(s!=ZERO)
return Hhat(s,mRes,gamma,m1,m2) - Hres - (s-sqr(mRes))*dH;
else
return -2.*sqr(m1+m2)/Constants::pi*gamma/mRes/pow(beta(sqr(mRes),m1,m2),3) - Hres + sqr(mRes)*dH;
}
/**
* The \f$H(s)\f$ function for the GS Breit-Wigner (with calc of derivative term)
*/
inline Energy2 H(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double dH = dHhatds(mRes,gamma,m1,m2);
Energy2 Hres = Hhat(sqr(mRes),mRes,gamma,m1,m2);
return H(s,mRes,gamma,m1,m2,dH,Hres);
}
/**
* The \f$p\f$-wave runningwidth
*/
inline Energy gammaP(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double v2 = beta2(s,m1,m2);
if(v2<=0.) return ZERO;
double vR2 = beta2(sqr(mRes),m1,m2);
double rp = sqrt(v2/vR2);
return sqrt(s)/mRes*pow(rp,3)*gamma;
}
/**
* The \f$p\f$-wave runningwidth
*/
inline Energy gammaD(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double v2 = beta2(s,m1,m2);
if(v2<=0.) return ZERO;
double vR2 = beta2(sqr(mRes),m1,m2);
double rp = sqrt(v2/vR2);
return pow(sqrt(s)/mRes,3)*pow(rp,5)*gamma;
}
/**
* The \f$p\f$-wave runningwidth
*/
inline Energy gammaS(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
double v2 = beta2(s,m1,m2);
if(v2<=0.) return ZERO;
double vR2 = beta2(sqr(mRes),m1,m2);
double rp = sqrt(v2/vR2);
return mRes/sqrt(s)*rp*gamma;
}
/**
* The GS form of the Breit-Wigner distribution
*/
inline Complex BreitWignerGS(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2,
const Energy2 & H0, const double &dH, const Energy2 & Hres) {
Energy2 mR2=sqr(mRes);
return (mR2+H0)/(mR2-s+H(s,mRes,gamma,m1,m2,dH,Hres)-Complex(0.,1.)*sqrt(s)*gammaP(s,mRes,gamma,m1,m2));
}
/**
* The GS form of the Breit-Wigner distribution
*/
inline Complex BreitWignerGS(const Energy2 & s, const Energy & mRes,
const Energy & gamma,
const Energy & m1, const Energy & m2) {
double dH = dHhatds(mRes,gamma,m1,m2);
Energy2 Hres = Hhat(sqr(mRes),mRes,gamma,m1,m2);
Energy2 H0 = H(ZERO,mRes,gamma,m1,m2,dH,Hres);
return BreitWignerGS(s,mRes,gamma,m1,m2,H0,dH,Hres);
}
/**
* Standard \f$p\f$-wave Breit-Wigner
*/
inline Complex BreitWignerPWave(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
Energy2 mR2=sqr(mRes);
return mR2/(mR2-s-Complex(0.,1.)*sqrt(s)*gammaP(s,mRes,gamma,m1,m2));
}
/**
* Standard \f$s\f$-wave Breit-Wigner
*/
inline Complex BreitWignerSWave(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
Energy2 mR2=sqr(mRes);
return mR2/(mR2-s-Complex(0.,1.)*sqrt(s)*gammaS(s,mRes,gamma,m1,m2));
}
/**
* Standard \f$p\f$-wave Breit-Wigner
*/
inline Complex BreitWignerDWave(const Energy2 & s, const Energy & mRes, const Energy & gamma,
const Energy & m1, const Energy & m2) {
Energy2 mR2=sqr(mRes);
return mR2/(mR2-s-Complex(0.,1.)*sqrt(s)*gammaD(s,mRes,gamma,m1,m2));
}
/**
* Standard fixed width Breit-Wigner, no width in numerator
*/
inline Complex BreitWignerFW(const Energy2 & s, const Energy & mRes, const Energy & gamma) {
Energy2 mR2=sqr(mRes);
return mR2/(mR2-s-Complex(0.,1.)*mRes*gamma);
}
/**
* Standard fixed width Breit-Wigner, width in numerator
*/
inline Complex BreitWignerFW_GN(const Energy2 & s, const Energy & mRes, const Energy & gamma) {
Energy2 mR2=sqr(mRes);
complex<Energy2> fact = mR2 - Complex(0.,1.)*mRes*gamma;
return fact/(fact-s);
}
/**
* The \f$H\f$ function from 0512180
*/
Complex H(const Energy & mass, const Energy & width, const Energy2 & sp, const Energy2 & sm,
const Energy2 & s0, const Energy & mp, const Energy & m0) {
return
Resonance::BreitWignerPWave(sp,mass,width,mp,m0)+
Resonance::BreitWignerPWave(sm,mass,width,mp,m0)+
Resonance::BreitWignerPWave(s0,mass,width,mp,mp);
}
/**
* Sum over \f$p\f$-wave resonaces
*/
template<typename Value>
Complex F_rho(const Energy2 & s,
const vector<Value> weights,
const vector<Energy> & mass,
const vector<Energy> & width,
const Energy & m1, const Energy & m2) {
Value norm(0.);
Complex output;
for(unsigned int ix=0;ix<weights.size();++ix) {
norm += weights[ix];
output += weights[ix]*
BreitWignerPWave(s,mass[ix],width[ix],m1,m2);
}
return output/norm;
}
double ga1(const Energy2 &s) {
static const Energy mpi=0.13957*GeV;
- if(s>0.838968432668*GeV2) {
+ if(s<9.*sqr(mpi)) {
+ return 0.;
+ }
+ else if(s>0.838968432668*GeV2) {
double Q2 = s/GeV2;
return 1.623*Q2+10.38-9.32/Q2+0.65/sqr(Q2);
}
else {
double Q2 = (s-9.*sqr(mpi))/GeV2;
return 4.1*Q2*sqr(Q2)*(1.-3.3*Q2+5.8*sqr(Q2));
}
}
/**
* GS form of the \f$a_1\f$ Breit-Wigner
*/
Complex BreitWignera1(const Energy2 & s, const Energy & mRes,
const Energy & gamma) {
Energy2 mR2 = sqr(mRes);
return mR2/(mR2-s-Complex(0.,1)*gamma*mRes*ga1(s)/ga1(mR2));
}
/**
* Difference between two resonances
*/
complex<InvEnergy2> BreitWignerDiff(const Energy2 & s,
const Energy & mRes1, const Energy & gamma1,
const Energy & mRes2, const Energy & gamma2,
const Energy & m1, const Energy & m2) {
return
BreitWignerPWave(s,mRes1,gamma1,m1,m2)/sqr(mRes1)-
BreitWignerPWave(s,mRes2,gamma2,m1,m2)/sqr(mRes2);
}
}
#endif
diff --git a/Decay/WeakCurrents/OneKaonTwoPionCurrent.h b/Decay/WeakCurrents/OneKaonTwoPionCurrent.h
--- a/Decay/WeakCurrents/OneKaonTwoPionCurrent.h
+++ b/Decay/WeakCurrents/OneKaonTwoPionCurrent.h
@@ -1,401 +1,401 @@
// -*- C++ -*-
//
// OneKaonTwoPionCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2017 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef HERWIG_OneKaonTwoPionCurrent_H
#define HERWIG_OneKaonTwoPionCurrent_H
//
// This is the declaration of the OneKaonTwoPionCurrent class.
//
#include "WeakCurrent.h"
#include "Herwig/Decay/ResonanceHelpers.h"
#include <numeric>
namespace Herwig {
using namespace ThePEG;
/**
* The OneKaonTwoPionCurrent class implements the model of M. Finkemeier
* and E.~Mirkes, Z. Phys. C 69 (1996) 243 [arXiv:hep-ph/9503474],
* for the weak current for three mesons where at least one of the mesons is
* a kaon.
*
* \ingroup Decay
*
* This is the base class for the three meson decays of the weak current.
* It is designed so that the currents for the following modes can be implemented
* in classes inheriting from this
* - \f$ \pi^- \pi^- \pi^+ \f$, (imode=0)
* - \f$ \pi^0 \pi^0 \pi^- \f$, (imode=1)
* - \f$ K^- \pi^- K^+ \f$, (imode=2)
* - \f$ K^0 \pi^- \bar{K}^0\f$, (imode=3)
* - \f$ K^- \pi^0 K^0 \f$, (imode=4)
* - \f$ \pi^0 \pi^0 K^- \f$, (imode=5)
* - \f$ K^- \pi^- \pi^+ \f$, (imode=6)
* - \f$ \pi^- \bar{K}^0 \pi^0 \f$, (imode=7)
* - \f$ \pi^- \pi^0 \eta \f$, (imode=8)
*
* obviously there are other modes with three pseudoscalar mesons for the decay
* of the weak current but this model original came from \f$\tau\f$ decay where
* these are the only modes. However one case which is important is the inclusion
* of the mixing in the neutral kaon sector for which we include the additional
* currents
* - \f$ K^0_S \pi^- K^0_S\f$, (imode=9)
* - \f$ K^0_L \pi^- K^0_L\f$, (imode=10)
* - \f$ K^0_S \pi^- K^0_L\f$, (imode=11)
*
* In this case the current is given by
* \f[ J^\mu = \left(g^{\mu\nu}-\frac{q^\mu q^\nu}{q^2}\right)
* \left[F_1(p_2-p_3)^\mu +F_2(p_3-p_1)^\mu+F_3(p_1-p_2)^\mu\right]
* +q^\mu F_4
* +F_5\epsilon^{\mu\alpha\beta\gamma}p_1^\alpha p_2^\beta p_3^\gamma
* \f]
* where
* - \f$p_{1,2,3}\f$ are the momenta of the mesons in the order given above.
* - \f$F_1,F_2,F_3,F_4,F_5\f$ are the form factors which must be
* calculated in the calculateFormFactors member which should be implemented
* in classes inheriting from this.
*
* @see WeakCurrent.
*
* \author Peter Richardson
* @see \ref OneKaonTwoPionCurrentInterfaces "The interfaces"
* defined for OneKaonTwoPionCurrent.
*/
class OneKaonTwoPionCurrent: public WeakCurrent {
public:
/**
* The default constructor.
*/
OneKaonTwoPionCurrent();
/** @name Methods for the construction of the phase space integrator. */
//@{
/**
* Complete the construction of the decay mode for integration.classes inheriting
* from this one.
* This method is purely virtual and must be implemented in the classes inheriting
* from WeakCurrent.
* @param icharge The total charge of the outgoing particles in the current.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode in the current being asked for.
* @param mode The phase space mode for the integration
* @param iloc The location of the of the first particle from the current in
* the list of outgoing particles.
* @param ires The location of the first intermediate for the current.
* @param phase The prototype phase space channel for the integration.
* @param upp The maximum possible mass the particles in the current are
* allowed to have.
* @return Whether the current was sucessfully constructed.
*/
virtual bool createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp );
//@}
/**
* Hadronic current. This method is purely virtual and must be implemented in
* all classes inheriting from this one.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode
* @param ichan The phase-space channel the current is needed for.
* @param scale The invariant mass of the particles in the current.
* @param outgoing The particles produced in the decay
* @param momenta The momenta of the particles produced in the decay
* @param meopt Option for the calculation of the matrix element
* @return The current.
*/
virtual vector<LorentzPolarizationVectorE>
current(tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int imode, const int ichan,Energy & scale,
const tPDVector & outgoing,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption meopt) const;
/**
* Accept the decay. Checks the mesons against the list.
* @param id The id's of the particles in the current.
* @return Can this current have the external particles specified.
*/
virtual bool accept(vector<int> id);
/**
* Return the decay mode number for a given set of particles in the current.
* Checks the mesons against the list.
* @param id The id's of the particles in the current.
* @return The number of the mode
*/
virtual unsigned int decayMode(vector<int> id);
/**
* The particles produced by the current. This returns the mesons for the mode.
* @param icharge The total charge of the particles in the current.
* @param imode The mode for which the particles are being requested
* @param iq The PDG code for the quark
* @param ia The PDG code for the antiquark
* @return The external particles for the current.
*/
virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
/**
* Output the setup information for the particle database
* @param os The stream to output the information to
* @param header Whether or not to output the information for MySQL
* @param create Whether or not to add a statement creating the object
*/
virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/** @name Clone Methods. */
//@{
/**
* Make a simple clone of this object.
* @return a pointer to the new object.
*/
virtual IBPtr clone() const;
/** Make a clone of this object, possibly modifying the cloned object
* to make it sane.
* @return a pointer to the new object.
*/
virtual IBPtr fullclone() const;
//@}
protected:
/**
* Initialize this object after the setup phase before saving and
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
OneKaonTwoPionCurrent & operator=(const OneKaonTwoPionCurrent &);
private:
/**
* The \f$\rho\f$ lineshape for the axial-vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$\rho\f$ multiplet
*/
Complex Trho1(Energy2 q2,int ires) const {
if(ires>=int(_rho1wgts.size())) return 0.;
double norm = std::accumulate(_rho1wgts.begin(),_rho1wgts.end(),0.);
unsigned int imin=0,imax=_rho1wgts.size();
if(ires>0) {
imin=ires;
imax=imin+1;
}
Complex output(0.);
for(unsigned int ix=imin;ix<imax;++ix)
output+=_rho1wgts[ix]*
Resonance::BreitWignerPWave(q2,_rho1mass[ix],_rho1width[ix],_mpi,_mpi);
return output/norm;
}
/**
* The \f$K^*\f$ lineshape for the axial-vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$K^*\f$ multiplet
*/
Complex TKstar1(Energy2 q2,int ires) const {
if(ires>=int(_kstar1wgts.size())) return 0.;
double norm = std::accumulate(_kstar1wgts.begin(),_kstar1wgts.end(),0.);
unsigned int imin=0,imax=_kstar1wgts.size();
if(ires>0) {
imin=ires;
imax=imin+1;
}
Complex output(0.);
for(unsigned int ix=imin;ix<imax;++ix)
output+=_kstar1wgts[ix]*
Resonance::BreitWignerPWave(q2,_kstar1mass[ix],_kstar1width[ix],_mK,_mpi);
return output/norm;
}
/**
- * The \f$\rho\f$ lineshape for the vector terms
+ * The \f$K^*\f$ lineshape for the vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$K^*\f$ multiplet
*/
Complex TKstar2(Energy2 q2,int ires) const {
if(ires>=int(_kstar2wgts.size())) return 0.;
double norm = std::accumulate(_kstar2wgts.begin(),_kstar2wgts.end(),0.);
unsigned int imin=0,imax=_kstar2wgts.size();
if(ires>0) {
imin=ires;
imax=imin+1;
}
Complex output(0.);
for(unsigned int ix=imin;ix<imax;++ix)
output+=_kstar2wgts[ix]*
Resonance::BreitWignerPWave(q2,_kstar2mass[ix],_kstar2width[ix],_mK,_mpi);
return output/norm;
}
/**
* The \f$K_1\f$ line shape
* @param q2 The scale \f$q^2\f$ for the Breit-Wigner
* @param iopt Whether this is \f$K^*\pi\f$ or \f$\rho K\f$.
* @param ires the resonance
*/
Complex TK1(Energy2 q2,unsigned int iopt,int ires) const;
private:
/**
* Parameters for the \f$\rho\f$ in the axial-vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _rho1wgts;
/**
* Masses
*/
vector<Energy> _rho1mass;
/**
* Widths
*/
vector<Energy> _rho1width;
//@}
/**
* Parameters for the \f$K^*\f$ in the axial-vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _kstar1wgts;
/**
* Masses
*/
vector<Energy> _kstar1mass;
/**
* Widths
*/
vector<Energy> _kstar1width;
//@}
/**
* Parameters for the \f$K^*\f$ in the vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _kstar2wgts;
/**
* Masses
*/
vector<Energy> _kstar2mass;
/**
* Widths
*/
vector<Energy> _kstar2width;
//@}
/**
* Parameters for the three meson resonances
*/
//@{
/**
* The masses of the \f$aK1\f$ resonances.
*/
vector<Energy> _k1mass;
/**
* The widths of the \f$K_1\f$ resonances.
*/
vector<Energy> _k1width;
/**
* The weights for the different \f$K_1\f$ resonances for \f$K_1\to K^*\pi\f$
*/
vector<double> _k1wgta;
/**
* The weights for the different \f$K_1\f$ resonaces for \f$K_1\to\rho K\f$.
*/
vector<double> _k1wgtb;
//@}
/**
* The pion decay constant, \f$f_\pi\f$.
*/
Energy _fpi;
/**
* The pion mass
*/
Energy _mpi;
/**
* The kaon mass
*/
Energy _mK;
//@}
};
}
#endif /* HERWIG_OneKaonTwoPionCurrent_H */
diff --git a/Decay/WeakCurrents/TwoKaonOnePionCurrent.cc b/Decay/WeakCurrents/TwoKaonOnePionCurrent.cc
--- a/Decay/WeakCurrents/TwoKaonOnePionCurrent.cc
+++ b/Decay/WeakCurrents/TwoKaonOnePionCurrent.cc
@@ -1,1161 +1,988 @@
// -*- C++ -*-
//
// TwoKaonOnePionCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2017 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the TwoKaonOnePionCurrent class.
//
#include "TwoKaonOnePionCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/ParVector.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig/PDT/ThreeBodyAllOnCalculator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Helicity/epsilon.h"
using namespace Herwig;
DescribeClass<TwoKaonOnePionCurrent,WeakCurrent>
describeHerwigTwoKaonOnePionCurrent("Herwig::TwoKaonOnePionCurrent",
"HwWeakCurrents.so");
HERWIG_INTERPOLATOR_CLASSDESC(TwoKaonOnePionCurrent,Energy,Energy2)
IBPtr TwoKaonOnePionCurrent::clone() const {
return new_ptr(*this);
}
IBPtr TwoKaonOnePionCurrent::fullclone() const {
return new_ptr(*this);
}
TwoKaonOnePionCurrent::TwoKaonOnePionCurrent() {
// the quarks for the different modes
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
setInitialModes(7);
// rho parameters
// rho parameters for axial-vector pieces
- _rho1wgts.push_back( 1.0 ); _rho1wgts.push_back(-0.145);
- _rho1wgts.push_back(0.);
- _rho1mass.push_back(0.773*GeV);_rho1mass.push_back(1.370*GeV);
- _rho1mass.push_back(1.750*GeV);
- _rho1width.push_back(0.145*GeV);_rho1width.push_back(0.510*GeV);
- _rho1width.push_back(0.120*GeV);
+ _rho1wgts = {1.0,-0.145,0.};
+ _rho1mass = {0.773*GeV,1.370*GeV,1.750*GeV};
+ _rho1width = {0.145*GeV,0.510*GeV,0.120*GeV};
// rho parameters for vector pieces
- _rho2wgts.push_back( 1.0 ); _rho2wgts.push_back(-0.25 );
- _rho2wgts.push_back(-0.038);
- _rho2mass.push_back(0.773*GeV);_rho2mass.push_back(1.500*GeV);
- _rho2mass.push_back(1.750*GeV);
- _rho2width.push_back(0.145*GeV);_rho2width.push_back(0.220*GeV);
- _rho2width.push_back(0.120*GeV);
+ _rho2wgts = {1.0,-0.25,-0.038};
+ _rho2mass = {0.773*GeV,1.500*GeV,1.750*GeV};
+ _rho2width = {0.145*GeV,0.220*GeV,0.120*GeV};
// K* parameters
// K* parameters for the axial-vector pieces
- _kstar1wgts.push_back( 1.0 ); _kstar1wgts.push_back(-0.135);
- _kstar1wgts.push_back(0.);
- _kstar1mass.push_back(0.892*GeV);_kstar1mass.push_back(1.412*GeV);
- _kstar1mass.push_back(1.714*GeV);
- _kstar1width.push_back(0.050*GeV);_kstar1width.push_back(0.227*GeV);
- _kstar1width.push_back(0.323*GeV);
- // K* parameters for vector pieces
- _kstar2wgts.push_back( 1.0 ); _kstar2wgts.push_back(-0.25 );
- _kstar2wgts.push_back(-0.038);
- _kstar2mass.push_back(0.892*GeV);_kstar2mass.push_back(1.412*GeV);
- _kstar2mass.push_back(1.714*GeV);
- _kstar2width.push_back(0.050*GeV);_kstar2width.push_back(0.227*GeV);
- _kstar2width.push_back(0.323*GeV);
+ _kstar1wgts = {1.0,-0.135,0.};
+ _kstar1mass = {0.892*GeV,1.412*GeV,1.714*GeV};
+ _kstar1width = {0.050*GeV,0.227*GeV,0.323*GeV};
// a_1 parameters
_initializea1 = false;
_a1opt = true;
_a1mass = 1.251*GeV;
_a1width = 0.475*GeV;
_a1runwidth = {0*GeV, 0*GeV, 0*GeV, 0*GeV, 0*GeV,
0*GeV, 0*GeV, 0*GeV, 0*GeV, 0*GeV,
0*GeV, 0*GeV, 1.47729e-06*GeV, 1.19209e-05*GeV, 3.884e-05*GeV,
8.83255e-05*GeV, 0.00016561*GeV, 0.000275439*GeV, 0.000422332*GeV,
0.000610773*GeV, 0.000845357*GeV, 0.00113092*GeV, 0.00147264*GeV,
0.00187616*GeV, 0.0023477*GeV, 0.00289413*GeV, 0.00352315*GeV,
0.00424342*GeV, 0.0050647*GeV, 0.00599808*GeV, 0.00705616*GeV,
0.00825335*GeV, 0.0096062*GeV, 0.0111337*GeV, 0.0128579*GeV,
0.0148041*GeV, 0.017002*GeV, 0.0194858*GeV, 0.0222956*GeV,
0.0254781*GeV, 0.0290874*GeV, 0.0331862*GeV, 0.0378467*GeV,
0.0431501*GeV, 0.0491862*GeV, 0.0560496*GeV, 0.0638341*GeV,
0.0726215*GeV, 0.0824662*GeV, 0.0933765*GeV, 0.105297*GeV,
0.118103*GeV, 0.131602*GeV, 0.145564*GeV, 0.159749*GeV,
0.173938*GeV, 0.18795*GeV, 0.201649*GeV, 0.214943*GeV,
0.227773*GeV, 0.240109*GeV, 0.25194*GeV, 0.263268*GeV,
0.274104*GeV, 0.284466*GeV, 0.294372*GeV, 0.303845*GeV,
0.312905*GeV, 0.321576*GeV, 0.329878*GeV, 0.337832*GeV,
0.345456*GeV, 0.35277*GeV, 0.35979*GeV, 0.366532*GeV,
0.373012*GeV, 0.379243*GeV, 0.38524*GeV, 0.391014*GeV,
0.396577*GeV, 0.401939*GeV, 0.407111*GeV, 0.412102*GeV,
0.416923*GeV, 0.421577*GeV, 0.426078*GeV, 0.430427*GeV,
0.434636*GeV, 0.43871*GeV, 0.442654*GeV, 0.446475*GeV,
0.450177*GeV, 0.453765*GeV, 0.457245*GeV, 0.460621*GeV,
0.463899*GeV, 0.467077*GeV, 0.470164*GeV, 0.473162*GeV,
0.476076*GeV, 0.478909*GeV, 0.481658*GeV, 0.484333*GeV,
0.486934*GeV, 0.489465*GeV, 0.491926*GeV, 0.494321*GeV,
0.496651*GeV, 0.49892*GeV, 0.501128*GeV, 0.503277*GeV,
0.505371*GeV, 0.507409*GeV, 0.509395*GeV, 0.511328*GeV,
0.513212*GeV, 0.515047*GeV, 0.516846*GeV, 0.518624*GeV,
0.520285*GeV, 0.52194*GeV, 0.523553*GeV, 0.525124*GeV,
0.526646*GeV, 0.52814*GeV, 0.529638*GeV, 0.531016*GeV,
0.532401*GeV, 0.533751*GeV, 0.535069*GeV, 0.536354*GeV,
0.537608*GeV, 0.538831*GeV, 0.540039*GeV, 0.541194*GeV,
0.542327*GeV, 0.543438*GeV, 0.544522*GeV, 0.545582*GeV,
0.546616*GeV, 0.54764*GeV, 0.548615*GeV, 0.549581*GeV,
0.550525*GeV, 0.551449*GeV, 0.552351*GeV, 0.55324*GeV,
0.554101*GeV, 0.554944*GeV, 0.555772*GeV, 0.556583*GeV,
0.557373*GeV, 0.558155*GeV, 0.558917*GeV, 0.559664*GeV,
0.560396*GeV, 0.561114*GeV, 0.561849*GeV, 0.562508*GeV,
0.563186*GeV, 0.563851*GeV, 0.564503*GeV, 0.565145*GeV,
0.565774*GeV, 0.566394*GeV, 0.567001*GeV, 0.567595*GeV,
0.568182*GeV, 0.56876*GeV, 0.56933*GeV, 0.569886*GeV,
0.570433*GeV, 0.570976*GeV, 0.571504*GeV, 0.572027*GeV,
0.572542*GeV, 0.573114*GeV, 0.573548*GeV, 0.574108*GeV,
0.574524*GeV, 0.575002*GeV, 0.575473*GeV, 0.575937*GeV,
0.576394*GeV, 0.576845*GeV, 0.57729*GeV, 0.57773*GeV,
0.578173*GeV, 0.5786*GeV, 0.579013*GeV, 0.579431*GeV,
0.579834*GeV, 0.580246*GeV, 0.580649*GeV, 0.581045*GeV,
0.581437*GeV, 0.581827*GeV, 0.582208*GeV, 0.582586*GeV, 0.582959*GeV};
_a1runq2 = { 0*GeV2 , 0.0158678*GeV2, 0.0317356*GeV2, 0.0476034*GeV2, 0.0634712*GeV2,
0.079339*GeV2, 0.0952068*GeV2, 0.111075*GeV2, 0.126942*GeV2, 0.14281*GeV2,
0.158678*GeV2, 0.174546*GeV2, 0.190414*GeV2, 0.206281*GeV2, 0.222149*GeV2,
0.238017*GeV2, 0.253885*GeV2, 0.269753*GeV2, 0.285621*GeV2, 0.301488*GeV2,
0.317356*GeV2, 0.333224*GeV2, 0.349092*GeV2, 0.36496*GeV2, 0.380827*GeV2,
0.396695*GeV2, 0.412563*GeV2, 0.428431*GeV2, 0.444299*GeV2, 0.460166*GeV2,
0.476034*GeV2, 0.491902*GeV2, 0.50777*GeV2, 0.523638*GeV2, 0.539505*GeV2,
0.555373*GeV2, 0.571241*GeV2, 0.587109*GeV2, 0.602977*GeV2, 0.618844*GeV2,
0.634712*GeV2, 0.65058*GeV2, 0.666448*GeV2, 0.682316*GeV2, 0.698183*GeV2,
0.714051*GeV2, 0.729919*GeV2, 0.745787*GeV2, 0.761655*GeV2, 0.777523*GeV2,
0.79339*GeV2, 0.809258*GeV2, 0.825126*GeV2, 0.840994*GeV2, 0.856862*GeV2,
0.872729*GeV2, 0.888597*GeV2, 0.904465*GeV2, 0.920333*GeV2, 0.936201*GeV2,
0.952068*GeV2, 0.967936*GeV2, 0.983804*GeV2, 0.999672*GeV2, 1.01554*GeV2,
1.03141*GeV2, 1.04728*GeV2, 1.06314*GeV2, 1.07901*GeV2, 1.09488*GeV2,
1.11075*GeV2, 1.12661*GeV2, 1.14248*GeV2, 1.15835*GeV2, 1.17422*GeV2,
1.19009*GeV2, 1.20595*GeV2, 1.22182*GeV2, 1.23769*GeV2, 1.25356*GeV2,
1.26942*GeV2, 1.28529*GeV2, 1.30116*GeV2, 1.31703*GeV2, 1.3329*GeV2,
1.34876*GeV2, 1.36463*GeV2, 1.3805*GeV2, 1.39637*GeV2, 1.41223*GeV2,
1.4281*GeV2, 1.44397*GeV2, 1.45984*GeV2, 1.47571*GeV2, 1.49157*GeV2,
1.50744*GeV2, 1.52331*GeV2, 1.53918*GeV2, 1.55505*GeV2, 1.57091*GeV2,
1.58678*GeV2, 1.60265*GeV2, 1.61852*GeV2, 1.63438*GeV2, 1.65025*GeV2,
1.66612*GeV2, 1.68199*GeV2, 1.69786*GeV2, 1.71372*GeV2, 1.72959*GeV2,
1.74546*GeV2, 1.76133*GeV2, 1.77719*GeV2, 1.79306*GeV2, 1.80893*GeV2,
1.8248*GeV2, 1.84067*GeV2, 1.85653*GeV2, 1.8724*GeV2, 1.88827*GeV2,
1.90414*GeV2, 1.92*GeV2, 1.93587*GeV2, 1.95174*GeV2, 1.96761*GeV2,
1.98348*GeV2, 1.99934*GeV2, 2.01521*GeV2, 2.03108*GeV2, 2.04695*GeV2,
2.06281*GeV2, 2.07868*GeV2, 2.09455*GeV2, 2.11042*GeV2, 2.12629*GeV2,
2.14215*GeV2, 2.15802*GeV2, 2.17389*GeV2, 2.18976*GeV2, 2.20563*GeV2,
2.22149*GeV2, 2.23736*GeV2, 2.25323*GeV2, 2.2691*GeV2, 2.28496*GeV2,
2.30083*GeV2, 2.3167*GeV2, 2.33257*GeV2, 2.34844*GeV2, 2.3643*GeV2,
2.38017*GeV2, 2.39604*GeV2, 2.41191*GeV2, 2.42777*GeV2, 2.44364*GeV2,
2.45951*GeV2, 2.47538*GeV2, 2.49125*GeV2, 2.50711*GeV2, 2.52298*GeV2,
2.53885*GeV2, 2.55472*GeV2, 2.57058*GeV2, 2.58645*GeV2, 2.60232*GeV2,
2.61819*GeV2, 2.63406*GeV2, 2.64992*GeV2, 2.66579*GeV2, 2.68166*GeV2,
2.69753*GeV2, 2.71339*GeV2, 2.72926*GeV2, 2.74513*GeV2, 2.761*GeV2,
2.77687*GeV2, 2.79273*GeV2, 2.8086*GeV2, 2.82447*GeV2, 2.84034*GeV2,
2.85621*GeV2, 2.87207*GeV2, 2.88794*GeV2, 2.90381*GeV2, 2.91968*GeV2,
2.93554*GeV2, 2.95141*GeV2, 2.96728*GeV2, 2.98315*GeV2, 2.99902*GeV2,
3.01488*GeV2, 3.03075*GeV2, 3.04662*GeV2, 3.06249*GeV2, 3.07835*GeV2,
3.09422*GeV2, 3.11009*GeV2, 3.12596*GeV2, 3.14183*GeV2, 3.15769*GeV2};
// parameters for the T_omega function
- _epsomega=0.05;
+ _epsomega = 0.05;
_omegamass = 0.782*GeV;
_omegawidth = 0.00843*GeV;
_phimass = 1.020*GeV;
_phiwidth = 0.00443*GeV;
_omegaKstarwgt=1./sqrt(2.);
// the pion decay constant
- _fpi=130.7*MeV/sqrt(2.);
- _mpi=ZERO;
- _mK=ZERO;
- _maxmass=ZERO;
- _maxcalc=ZERO;
+ _fpi = 130.7*MeV/sqrt(2.);
+ _mpi = ZERO;
+ _mK = ZERO;
+ _maxmass = ZERO;
+ _maxcalc = ZERO;
}
void TwoKaonOnePionCurrent::persistentOutput(PersistentOStream & os) const {
os << _a1runinter
<< _rho1wgts << ounit(_rho1mass,GeV) << ounit(_rho1width,GeV)
<< _rho2wgts << ounit(_rho2mass,GeV) << ounit(_rho2width,GeV)
- << _kstar1wgts << ounit(_kstar1mass,GeV) << ounit(_kstar1width,GeV)
- << _kstar2wgts << ounit(_kstar2mass,GeV) << ounit(_kstar2width,GeV)
+ << _kstar1wgts << ounit(_kstar1mass,GeV) << ounit(_kstar1width,GeV)
<< ounit(_a1mass,GeV) << ounit(_a1width,GeV)
<< ounit(_a1runwidth,GeV) << ounit(_a1runq2,GeV2) << _epsomega
<< ounit(_omegamass,GeV) << ounit(_omegawidth,GeV)
<< ounit(_phimass,GeV) << ounit(_phiwidth,GeV) << _omegaKstarwgt
<< ounit(_fpi,GeV) << ounit(_mpi,GeV) << ounit(_mK,GeV)
<< _initializea1 << _a1opt
<< ounit(_maxmass,GeV) << ounit(_maxcalc,GeV);
}
void TwoKaonOnePionCurrent::persistentInput(PersistentIStream & is, int) {
is >> _a1runinter
>> _rho1wgts >> iunit(_rho1mass,GeV) >> iunit(_rho1width,GeV)
>> _rho2wgts >> iunit(_rho2mass,GeV) >> iunit(_rho2width,GeV)
- >> _kstar1wgts >> iunit(_kstar1mass,GeV) >> iunit(_kstar1width,GeV)
- >> _kstar2wgts >> iunit(_kstar2mass,GeV) >> iunit(_kstar2width,GeV)
+ >> _kstar1wgts >> iunit(_kstar1mass,GeV) >> iunit(_kstar1width,GeV)
>> iunit(_a1mass,GeV) >> iunit(_a1width,GeV)
>> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _epsomega
>> iunit(_omegamass,GeV) >> iunit(_omegawidth,GeV)
>> iunit(_phimass,GeV) >> iunit(_phiwidth,GeV) >> _omegaKstarwgt
>> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV)
>> _initializea1 >> _a1opt
>> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV);
}
void TwoKaonOnePionCurrent::Init() {
static ClassDocumentation<TwoKaonOnePionCurrent> documentation
("The TwoKaonOnePionCurrent class implements the model of "
"Z. Phys. C 69 (1996) 243 [arXiv:hep-ph/9503474]"
" for the weak current with three "
"mesons, at least one of which is a kaon",
"The TwoKaonOnePionCurrent class implements the model of "
"\\cite{Finkemeier:1995sr} for the weak current with three "
"mesons, at least one of which is a kaon.",
"\\bibitem{Finkemeier:1995sr}\n"
"M.~Finkemeier and E.~Mirkes,\n"
"Z.\\ Phys.\\ C {\\bf 69} (1996) 243 [arXiv:hep-ph/9503474].\n"
" %%CITATION = ZEPYA,C69,243;%%\n"
);
static Switch<TwoKaonOnePionCurrent,bool> interfaceInitializea1
("Initializea1",
"Initialise the calculation of the a_1 running width",
&TwoKaonOnePionCurrent::_initializea1, false, false, false);
static SwitchOption interfaceInitializea1Initialization
(interfaceInitializea1,
"Yes",
"Initialize the calculation",
true);
static SwitchOption interfaceInitializea1NoInitialization
(interfaceInitializea1,
"No",
"Use the default values",
false);
static Parameter<TwoKaonOnePionCurrent,Energy> interfaceA1Width
("A1Width",
"The a_1 width if using local values.",
&TwoKaonOnePionCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV,
false, false, false);
static Parameter<TwoKaonOnePionCurrent,Energy> interfaceA1Mass
("A1Mass",
"The a_1 mass if using local values.",
&TwoKaonOnePionCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV,
false, false, false);
static Parameter<TwoKaonOnePionCurrent,Energy> interfaceFPi
("FPi",
"The pion decay constant",
&TwoKaonOnePionCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceRhoAxialMasses
("RhoAxialMasses",
"The masses for the rho resonances if used local values",
&TwoKaonOnePionCurrent::_rho1mass, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceRhoAxialWidths
("RhoAxialWidths",
"The widths for the rho resonances if used local values",
&TwoKaonOnePionCurrent::_rho1width, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceRhoVectorMasses
("RhoVectorMasses",
"The masses for the rho resonances if used local values",
&TwoKaonOnePionCurrent::_rho2mass, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceRhoVectorWidths
("RhoVectorWidths",
"The widths for the rho resonances if used local values",
&TwoKaonOnePionCurrent::_rho2width, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceKstarAxialMasses
("KstarAxialMasses",
"The masses for the Kstar resonances if used local values",
&TwoKaonOnePionCurrent::_kstar1mass, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy> interfaceKstarAxialWidths
("KstarAxialWidths",
"The widths for the Kstar resonances if used local values",
&TwoKaonOnePionCurrent::_kstar1width, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
- static ParVector<TwoKaonOnePionCurrent,Energy> interfaceKstarVectorMasses
- ("KstarVectorMasses",
- "The masses for the Kstar resonances if used local values",
- &TwoKaonOnePionCurrent::_kstar2mass, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
- false, false, true);
-
- static ParVector<TwoKaonOnePionCurrent,Energy> interfaceKstarVectorWidths
- ("KstarVectorWidths",
- "The widths for the Kstar resonances if used local values",
- &TwoKaonOnePionCurrent::_kstar2width, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
- false, false, true);
-
static ParVector<TwoKaonOnePionCurrent,double> interfaceAxialRhoWeight
("AxialRhoWeight",
"The weights of the different rho resonances in the F1,2,3 form factor",
&TwoKaonOnePionCurrent::_rho1wgts,
0, 0, 0, -1000, 1000, false, false, true);
static ParVector<TwoKaonOnePionCurrent,double> interfaceAxialKStarWeight
("AxialKStarWeight",
"The weights of the different Kstar resonances in the F1,2,3 form factor",
&TwoKaonOnePionCurrent::_kstar1wgts,
0, 0, 0, -1000, 1000, false, false, true);
static ParVector<TwoKaonOnePionCurrent,double> interfaceVectorRhoWeight
("VectorRhoWeight",
"The weights of the different rho resonances in the F1,2,3 form factor",
&TwoKaonOnePionCurrent::_rho2wgts,
0, 0, 0, -1000, 1000, false, false, true);
- static ParVector<TwoKaonOnePionCurrent,double> interfaceVectorKStarWeight
- ("VectorKStarWeight",
- "The weights of the different Kstar resonances in the F1,2,3 form factor",
- &TwoKaonOnePionCurrent::_kstar2wgts,
- 0, 0, 0, -1000, 1000, false, false, true);
-
static Switch<TwoKaonOnePionCurrent,bool> interfacea1WidthOption
("a1WidthOption",
"Option for the treatment of the a1 width",
&TwoKaonOnePionCurrent::_a1opt, true, false, false);
static SwitchOption interfacea1WidthOptionLocal
(interfacea1WidthOption,
"Local",
"Use a calculation of the running width based on the parameters as"
" interpolation table.",
true);
static SwitchOption interfacea1WidthOptionParam
(interfacea1WidthOption,
"Kuhn",
"Use the parameterization of Kuhn and Santamaria for default parameters."
" This should only be used for testing vs TAUOLA",
false);
static ParVector<TwoKaonOnePionCurrent,Energy> interfacea1RunningWidth
("a1RunningWidth",
"The values of the a_1 width for interpolation to giving the running width.",
&TwoKaonOnePionCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionCurrent,Energy2> interfacea1RunningQ2
("a1RunningQ2",
"The values of the q^2 for interpolation to giving the running width.",
&TwoKaonOnePionCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2,
false, false, true);
static Parameter<TwoKaonOnePionCurrent,double> interfaceEpsOmega
("EpsOmega",
"The omega-phi mixing ",
&TwoKaonOnePionCurrent::_epsomega, 0.05, 0.0, 1.0,
false, false, Interface::limited);
static Parameter<TwoKaonOnePionCurrent,Energy> interfaceOmegaMass
("OmegaMass",
"The mass of the omega meson",
&TwoKaonOnePionCurrent::_omegamass, GeV, 0.782*GeV, ZERO, 10.0*GeV,
false, false, Interface::limited);
static Parameter<TwoKaonOnePionCurrent,Energy> interfaceOmegaWidth
("OmegaWidth",
"The width of the omega meson",
&TwoKaonOnePionCurrent::_omegawidth, GeV, 0.00843*GeV, ZERO, 10.0*GeV,
false, false, Interface::limited);
static Parameter<TwoKaonOnePionCurrent,Energy> interfacePhiMass
("PhiMass",
"The mass of the phi meson",
&TwoKaonOnePionCurrent::_phimass, GeV, 1.020*GeV, ZERO, 10.0*GeV,
false, false, Interface::limited);
static Parameter<TwoKaonOnePionCurrent,Energy> interfacePhiWidth
("PhiWidth",
"The width of the phi meson",
&TwoKaonOnePionCurrent::_phiwidth, GeV, 0.00443*GeV, ZERO, 10.0*GeV,
false, false, Interface::limited);
static Parameter<TwoKaonOnePionCurrent,double> interfaceOmegaKStarWeight
("OmegaKStarWeight",
"The relative weight of the omega-phi and K* terms",
&TwoKaonOnePionCurrent::_omegaKstarwgt, 1./sqrt(2.), 0.0, 100.0,
false, false, Interface::limited);
}
void TwoKaonOnePionCurrent::inita1Width(int iopt) {
if(iopt==-1) {
_maxcalc=_maxmass;
if(!_initializea1||_maxmass==ZERO) return;
// parameters for the table of values
Energy2 step(sqr(_maxmass)/199.);
// integrator to perform the integral
vector<double> inweights;inweights.push_back(0.5);inweights.push_back(0.5);
vector<int> intype;intype.push_back(2);intype.push_back(3);
Energy mrho(getParticleData(ParticleID::rhoplus)->mass()),
wrho(getParticleData(ParticleID::rhoplus)->width());
vector<Energy> inmass(2,mrho),inwidth(2,wrho);
vector<double> inpow(2,0.0);
ThreeBodyAllOnCalculator<TwoKaonOnePionCurrent>
widthgen(inweights,intype,inmass,inwidth,inpow,*this,0,_mpi,_mpi,_mpi);
// normalisation constant to give physical width if on shell
double a1const(_a1width/(widthgen.partialWidth(sqr(_a1mass))));
// loop to give the values
_a1runq2.clear();_a1runwidth.clear();
for(Energy2 moff2 = ZERO; moff2<=sqr(_maxmass); moff2+=step) {
_a1runwidth.push_back(widthgen.partialWidth(moff2)*a1const);
_a1runq2.push_back(moff2);
}
}
// set up the interpolator
else if(iopt==0) {
_a1runinter = make_InterpolatorPtr(_a1runwidth,_a1runq2,3);
}
}
// complete the construction of the decay mode for integration
bool TwoKaonOnePionCurrent::createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
+ // check the charge
if(abs(icharge)!=3) return false;
+ // check the total isospin
+ if(Itotal!=IsoSpin::IUnknown) {
+ if(Itotal!=IsoSpin::IOne) return false;
+ }
+ // check I_3
+ if(i3!=IsoSpin::I3Unknown) {
+ switch(i3) {
+ case IsoSpin::I3Zero:
+ if(imode<=1) return false;
+ break;
+ case IsoSpin::I3One:
+ if( imode>1 || icharge ==-3) return false;
+ break;
+ case IsoSpin::I3MinusOne:
+ if( imode>1 || icharge == 3) return false;
+ default:
+ return false;
+ }
+ }
+ // get the particles and check the mass
int iq(0),ia(0);
tPDVector extpart(particles(1,imode,iq,ia));
Energy min(ZERO);
for(unsigned int ix=0;ix<extpart.size();++ix) min+=extpart[ix]->massMin();
if(min>upp) return false;
// the particles we will use a lot
tPDPtr a1 = getParticleData(ParticleID::a_1minus);
- tPDPtr k1[2] = {getParticleData(ParticleID::K_1minus),
- getParticleData(ParticleID::Kstar_1minus)};
_maxmass=max(_maxmass,upp);
// the rho0 resonances
tPDPtr rho0[3] ={getParticleData( 113),getParticleData( 100113),
getParticleData( 30113)};
// the charged rho resonances
tPDPtr rhoc[3] ={getParticleData(-213),getParticleData(-100213),
getParticleData(-30213)};
// the K*0 resonances
tPDPtr Kstar0[3]={getParticleData( 313),getParticleData( 100313),
getParticleData( 30313)};
// the charged K* resonances
tPDPtr Kstarc[3]={getParticleData(-323),getParticleData(-100323),
getParticleData(-30323)};
if(icharge==3) {
a1 = a1->CC();
- k1[0] = k1[0]->CC();
- k1[1] = k1[1]->CC();
for(unsigned int ix=0;ix<3;++ix) {
if(rhoc[ix]) rhoc[ix]=rhoc[ix]->CC();
if(Kstar0[ix]) Kstar0[ix]=Kstar0[ix]->CC();
if(Kstarc[ix]) Kstarc[ix]=Kstarc[ix]->CC();
}
}
if(imode==0) {
// channels for K- pi- K+
for(unsigned int ix=0;ix<3;++ix) {
- if(Kstar0[ix]) {
+ if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstar0[ix],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
- }
- if(rho0[ix]) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,rho0[ix],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
}
for(unsigned int iy=0;iy<3;++iy) {
- if(!rhoc[ix]) continue;
- if(Kstar0[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstar0[iy],ires+1,iloc+1,
- ires+2,iloc+2,ires+2,iloc+3));
- }
+ if(resonance && resonance !=rhoc[ix]) continue;
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstar0[iy],ires+1,iloc+1,
+ ires+2,iloc+2,ires+2,iloc+3));
}
}
}
else if(imode==1) {
// channels for K0 pi- K0bar
for(unsigned int ix=0;ix<3;++ix) {
- if(Kstarc[ix]) {
+ if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
- }
- if(rho0[ix]) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,rho0[ix],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
}
for(unsigned int iy=0;iy<3;++iy) {
- if(!rhoc[ix]) continue;
- if(Kstarc[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+1,
- ires+2,iloc+2,ires+2,iloc+3));
- }
+ if(resonance && resonance !=rhoc[ix]) continue;
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+1,
+ ires+2,iloc+2,ires+2,iloc+3));
}
}
}
else if(imode==2) {
// channels for K- pi0 K0
for(unsigned int ix=0;ix<3;++ix) {
- if(Kstar0[ix]) {
+ if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstar0[ix],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
- }
- if(Kstarc[ix]) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+3,
ires+2,iloc+1,ires+2,iloc+2));
- }
- if(rhoc[ix]) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,rhoc[ix],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
}
for(unsigned int iy=0;iy<3;++iy) {
- if(!rhoc[ix]) continue;
- if(Kstar0[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstar0[iy],ires+1,iloc+1,
- ires+2,iloc+2,ires+2,iloc+3));
- }
- if(Kstarc[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+3,
- ires+2,iloc+1,ires+2,iloc+2));
- }
+ if(resonance && resonance !=rhoc[ix]) continue;
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstar0[iy],ires+1,iloc+1,
+ ires+2,iloc+2,ires+2,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+3,
+ ires+2,iloc+1,ires+2,iloc+2));
}
}
}
else if(imode==3||imode==4) {
// channels for K_S0 pi- K_S0 and K_L0 pi- K_L0
for(unsigned int ix=0;ix<3;++ix) {
- if(Kstarc[ix]) {
+ if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+3,
ires+2,iloc+1,ires+2,iloc+2));
}
for(unsigned int iy=0;iy<3;++iy) {
- if(!rhoc[ix]) continue;
- if(Kstarc[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+1,
- ires+2,iloc+2,ires+2,iloc+3));
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+3,
- ires+2,iloc+1,ires+2,iloc+2));
- }
+ if(resonance && resonance !=rhoc[ix]) continue;
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+1,
+ ires+2,iloc+2,ires+2,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[iy],ires+1,iloc+3,
+ ires+2,iloc+1,ires+2,iloc+2));
}
}
}
else if(imode==5) {
// channels for K_S0 pi- K_L0
for(unsigned int ix=0;ix<3;++ix) {
- if(Kstarc[ix]) {
+ if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,Kstarc[ix],ires+1,iloc+3,
ires+2,iloc+1,ires+2,iloc+2));
- }
- if(rho0[ix])
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,rho0[ix],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
+ }
for(unsigned int iy=0;iy<3;++iy) {
- if(!rhoc[ix]) continue;
- if(Kstarc[iy]) {
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[ix],ires+1,iloc+1,
- ires+2,iloc+2,ires+2,iloc+3));
- mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[ix],ires+1,iloc+3,
- ires+2,iloc+1,ires+2,iloc+2));
- }
+ if(resonance && resonance !=rhoc[ix]) continue;
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[ix],ires+1,iloc+1,
+ ires+2,iloc+2,ires+2,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,Kstarc[ix],ires+1,iloc+3,
+ ires+2,iloc+1,ires+2,iloc+2));
}
}
}
+ // update the integration parameters
for(unsigned int ix=0;ix<_rho1mass.size();++ix) {
mode->resetIntermediate(rhoc[ix],_rho1mass[ix],
_rho1width[ix]);
mode->resetIntermediate(rho0[ix],_rho1mass[ix],
_rho1width[ix]);
}
- // K star parameters in the base class
for(unsigned int ix=0;ix<_kstar1mass.size();++ix) {
mode->resetIntermediate(Kstarc[ix],_kstar1mass[ix],
_kstar1width[ix]);
mode->resetIntermediate(Kstar0[ix],_kstar1mass[ix],
_kstar1width[ix]);
}
return true;
}
void TwoKaonOnePionCurrent::dataBaseOutput(ofstream & os,
bool header,bool create) const {
if(header) os << "update decayers set parameters=\"";
if(create) os << "create Herwig::TwoKaonOnePionCurrent "
<< name() << " HwWeakCurrents.so\n";
for(unsigned int ix=0;ix<_rho1wgts.size();++ix) {
if(ix<3) {
os << "newdef " << name() << ":AxialRhoWeight " << ix
<< " " << _rho1wgts[ix] << "\n";
}
else {
os << "insert " << name() << ":AxialRhoWeight " << ix
<< " " << _rho1wgts[ix] << "\n";
}
}
for(unsigned int ix=0;ix<_kstar1wgts.size();++ix) {
if(ix<3) {
os << "newdef " << name() << ":AxialKStarWeight " << ix
<< " " << _kstar1wgts[ix] << "\n";}
else {
os << "insert " << name() << ":AxialKStarWeight " << ix
<< " " << _kstar1wgts[ix] << "\n";
}
}
for(unsigned int ix=0;ix<_rho2wgts.size();++ix) {
if(ix<3) {
os << "newdef " << name() << ":VectorRhoWeight " << ix
<< " " << _rho2wgts[ix] << "\n";
}
else {
os << "insert " << name() << ":VectorRhoWeight " << ix
<< " " << _rho2wgts[ix] << "\n";
}
}
- for(unsigned int ix=0;ix<_kstar2wgts.size();++ix) {
- if(ix<3) {
- os << "newdef " << name() << ":VectorKStarWeight " << ix
- << " " << _kstar2wgts[ix] << "\n";}
- else {
- os << "insert " << name() << ":VectorKStarWeight " << ix
- << " " << _kstar2wgts[ix] << "\n";
- }
- }
os << "newdef " << name() << ":OmegaKStarWeight " << _omegaKstarwgt << "\n";
os << "newdef " << name() << ":EpsOmega " << _epsomega << "\n";
os << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n";
os << "newdef " << name() << ":a1WidthOption " << _a1opt << "\n";
for(unsigned int ix=0;ix<_a1runwidth.size();++ix) {
os << "newdef " << name() << ":a1RunningWidth " << ix
<< " " << _a1runwidth[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_a1runq2.size();++ix) {
os << "newdef " << name() << ":a1RunningQ2 " << ix
<< " " << _a1runq2[ix]/GeV2 << "\n";
}
os << "newdef " << name() << ":A1Width " << _a1width/GeV << "\n";
os << "newdef " << name() << ":A1Mass " << _a1mass/GeV << "\n";
os << "newdef " << name() << ":OmegaWidth " << _omegawidth/GeV << "\n";
os << "newdef " << name() << ":OmegaMass " << _omegamass/GeV << "\n";
os << "newdef " << name() << ":PhiWidth " << _phiwidth/GeV << "\n";
os << "newdef " << name() << ":PhiMass " << _phimass/GeV << "\n";
os << "newdef " << name() << ":FPi " << _fpi/MeV << "\n";
for(unsigned int ix=0;ix<_rho1mass.size();++ix) {
if(ix<3) os << "newdef " << name() << ":RhoAxialMasses " << ix
<< " " << _rho1mass[ix]/GeV << "\n";
else os << "insert " << name() << ": RhoAxialMasses" << ix
<< " " << _rho1mass[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rho1width.size();++ix) {
if(ix<3) os << "newdef " << name() << ":RhoAxialWidths " << ix
<< " " << _rho1width[ix]/GeV << "\n";
else os << "insert " << name() << ":RhoAxialWidths " << ix
<< " " << _rho1width[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rho2mass.size();++ix) {
if(ix<3) os << "newdef " << name() << ":RhoVectorMasses " << ix
<< " " << _rho2mass[ix]/GeV << "\n";
else os << "insert " << name() << ": RhoVectorMasses" << ix
<< " " << _rho2mass[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rho2width.size();++ix) {
if(ix<3) os << "newdef " << name() << ":RhoVectorWidths " << ix
<< " " << _rho2width[ix]/GeV << "\n";
else os << "insert " << name() << ":RhoVectorWidths " << ix
<< " " << _rho2width[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_kstar1mass.size();++ix) {
if(ix<3) os << "newdef " << name() << ":KstarAxialMasses " << ix
<< " " << _kstar1mass[ix]/GeV << "\n";
else os << "insert " << name() << ": KstarAxialMasses" << ix
<< " " << _kstar1mass[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_kstar1width.size();++ix) {
if(ix<3) os << "newdef " << name() << ":KstarAxialWidths " << ix
<< " " << _kstar1width[ix]/GeV << "\n";
else os << "insert " << name() << ":KstarAxialWidths " << ix
<< " " << _kstar1width[ix]/GeV << "\n";
}
- for(unsigned int ix=0;ix<_kstar2mass.size();++ix) {
- if(ix<3) os << "newdef " << name() << ":KstarVectorMasses " << ix
- << " " << _kstar2mass[ix]/GeV << "\n";
- else os << "insert " << name() << ": KstarVectorMasses" << ix
- << " " << _kstar2mass[ix]/GeV << "\n";
- }
- for(unsigned int ix=0;ix<_kstar2width.size();++ix) {
- if(ix<3) os << "newdef " << name() << ":KstarVectorWidths " << ix
- << " " << _kstar2width[ix]/GeV << "\n";
- else os << "insert " << name() << ":KstarVectorWidths " << ix
- << " " << _kstar2width[ix]/GeV << "\n";
- }
WeakCurrent::dataBaseOutput(os,false,false);
if(header) os << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
}
void TwoKaonOnePionCurrent::doinit() {
WeakCurrent::doinit();
// masses for the running widths
_mpi = getParticleData(ParticleID::piplus)->mass();
_mK = getParticleData(ParticleID::K0) ->mass();
// initialise the a_1 running width calculation
inita1Width(-1);
inita1Width(0);
}
-TwoKaonOnePionCurrent::FormFactors
-TwoKaonOnePionCurrent::calculateFormFactors(const int ichan,const int imode,
- Energy2 q2,Energy2 s1,
- Energy2 s2,Energy2 s3) const {
- useMe();
- Complex F1, F2, F5;
- // calculate the K- pi - K+ factor
- if(imode==0) {
- Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.);
- if(ichan<0) {
- F1 = -a1fact*TKstar1(s1,-1);
- F2 = a1fact*Trho1(s2,-1);
- F5 = Trho2(q2,-1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
- }
- else if(ichan%5==0) F1 = -a1fact*TKstar1(s1, ichan/5);
- else if(ichan%5==1) F2 = a1fact*Trho1( s2,(ichan-1)/5);
- else if(ichan%5>=2) F5 = Trho2(q2,ichan/5)*TOmegaKStar(s1,s2,2*((ichan-2)%5))
- *sqrt(2.);
- }
- // calculate the K0 pi- K0bar
- else if(imode==1) {
- Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.);
- if(ichan<0) {
- F1 =-a1fact*TKstar1(s1,-1);
- F2 = a1fact*Trho1 (s2,-1);
- F5 =-Trho2(q2,-1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
- }
- else if(ichan%5==0) F1 = -a1fact*TKstar1(s1, ichan/5);
- else if(ichan%5==1) F2 = a1fact*Trho1 (s2,(ichan-1)/5);
- else if(ichan%5>=2) F5 = -Trho2(q2,ichan/5)*TOmegaKStar(s1,s2,2*((ichan-2)%5))
- *sqrt(2.);
- }
- // calculate the K- pi0 k0
- else if(imode==2) {
- Complex a1fact(a1BreitWigner(q2)/3.);
- if(ichan<0) {
- F1 = a1fact*( TKstar1(s1,-1)-TKstar1(s3,-1));
- F2 = -a1fact*(2.*Trho1(s2,-1)+TKstar1(s3,-1));
- F5 = Trho2(q2,-1)*(TKstar1(s3,-1)-TKstar1(s1,-1))/(1.+_omegaKstarwgt)/sqrt(2.);
- }
- else if(ichan%9==0) F1 = a1fact*TKstar1(s1,ichan/9)/3.;
- else if(ichan%9==1) {
- F1 = +a1fact*TKstar1(s3,(ichan-1)/9)/3.;
- F2 = -a1fact*TKstar1(s3,(ichan-1)/9)/3.;
- }
- else if(ichan%9==2) F2 = -a1fact*2.*Trho1(s2,(ichan-2)/9)/3.;
- else if(ichan%9<6) F5 =-Trho2(q2,ichan/9)*TKstar1(s1,(ichan-3)%9)
- /(1.+_omegaKstarwgt)/sqrt(2.);
- else F5 = Trho2(q2,ichan/9)*TKstar1(s3,(ichan-6)%9)
- /(1.+_omegaKstarwgt)/sqrt(2.);
- }
- // calculate the K_S0 pi- K_S0 or K_L0 pi- K_L0
- else if(imode==3||imode==4) {
- Complex a1fact(a1BreitWigner(q2)/6.);
- if(ichan<0) {
- F1 = a1fact*(TKstar1(s1,-1)+TKstar1(s3,-1));
- F2 = a1fact*TKstar1(s3,-1);
- F5 = 0.5*Trho2(q2,-1)*(TOmegaKStar(s1,s2,-1)-TOmegaKStar(s3,s2,-1));
- }
- else if(ichan%8==0) F1=a1fact*TKstar1(s1,ichan/8);
- else if(ichan%8==1) {
- F1 = a1fact*TKstar1(s3,ichan/8);
- F2 = a1fact*TKstar1(s3,ichan/8);
- }
- else if(ichan%8<5 ) F5 = -Trho2(q2,ichan/8)*TKstar1(s1,(ichan-2)%8)
- /(1.+_omegaKstarwgt)/2.;
- else F5 = Trho2(q2,ichan/8)*TKstar1(s3,(ichan-5)%8)
- /(1.+_omegaKstarwgt)/2.;
- }
- else if(imode==5) {
- Complex a1fact(a1BreitWigner(q2)/3./sqrt(2.));
- if(ichan<0) {
- F1 = -a1fact*(TKstar1(s1,-1)-TKstar1(s3,-1));
- F2 = a1fact*(2.*Trho1(s2,-1)+TKstar1(s3,-1));
- F5 = -Trho2(q2,-1)*(TOmegaKStar(s1,s2,-1)+TOmegaKStar(s3,s2,-1))/sqrt(2.);
- }
- else if(ichan%9==0) F1 =- a1fact*TKstar1(s1,ichan/9);
- else if(ichan%9==1) {
- F1 = a1fact*TKstar1(s3,ichan/9);
- F2 = a1fact*TKstar1(s3,ichan/9);
- }
- else if(ichan%9==2) F2 = 2.*a1fact*Trho1( s2,ichan/9);
- else if(ichan%9<6 ) F5 = -sqrt(0.5)*TKstar2(q2,ichan/9)*
- TOmegaKStar(s1,s2,2*((ichan-3)%9))/sqrt(2.);
- else F5 = -sqrt(0.5)*TKstar2(q2,ichan/9)*
- TOmegaKStar(s3,s2,2*((ichan-6)%9))/sqrt(2.);
- }
- return FormFactors(F1 / _fpi,
- F2 / _fpi,
- InvEnergy(),
- InvEnergy(),
- -F5 / sqr(Constants::twopi) / pow<3,1>(_fpi));
-}
-
void TwoKaonOnePionCurrent::doinitrun() {
// set up the running a_1 width
inita1Width(0);
WeakCurrent::doinitrun();
}
void TwoKaonOnePionCurrent::doupdate() {
WeakCurrent::doupdate();
// update running width if needed
if ( !touched() ) return;
if(_maxmass!=_maxcalc) inita1Width(-1);
}
double TwoKaonOnePionCurrent::
threeBodyMatrixElement(const int , const Energy2 q2,
const Energy2 s3, const Energy2 s2,
const Energy2 s1, const Energy ,
const Energy , const Energy ) const {
Energy2 mpi2(sqr(_mpi));
Complex propb(Trho1(s1,-1)),propa(Trho1(s2,-1));
// the matrix element
Energy2 output(ZERO);
// first resonance
output+= ((s1-4.*mpi2)+0.25*(s3-s2)*(s3-s2)/q2)*real(propb*conj(propb));
// second resonance
output+= ((s2-4.*mpi2)+0.25*(s3-s1)*(s3-s1)/q2)*real(propa*conj(propa));
// the interference term
output+= (0.5*q2-s3-0.5*mpi2+0.25*(s3-s2)*(s3-s1)/q2)*real(propa*conj(propb)+
propb*conj(propa));
return output / sqr(_rho1mass[0]);
}
-
-Complex TwoKaonOnePionCurrent::Trho1(Energy2 q2,int ires) const {
- Complex output(0.);
- double norm(0.);
- for(unsigned int ix=0,N=_rho1wgts.size();ix<N;++ix) norm+=_rho1wgts[ix];
- if(ires<0) {
- for(unsigned int ix=0,N=_rho1wgts.size();ix<N;++ix) {
- output+=_rho1wgts[ix]*BWrho1(q2,ix);
- }
- }
- else {
- unsigned int temp(ires);
- if(temp<_rho1wgts.size()) output=_rho1wgts[temp]*BWrho1(q2,temp);
- }
- return output/norm;
-}
-
-Complex TwoKaonOnePionCurrent::Trho2(Energy2 q2,int ires) const {
- Complex output(0.);
- double norm(0.);
- for(unsigned int ix=0,N=_rho2wgts.size();ix<N;++ix) norm+=_rho2wgts[ix];
- if(ires<0) {
- for(unsigned int ix=0,N=_rho2wgts.size();ix<N;++ix) {
- output+=_rho2wgts[ix]*BWrho2(q2,ix);
- }
- }
- else {
- unsigned int temp(ires);
- if(temp<_rho2wgts.size()) output=_rho2wgts[temp]*BWrho2(q2,temp);
- }
- return output/norm;
-}
-
-Complex TwoKaonOnePionCurrent::TKstar1(Energy2 q2,int ires) const {
- Complex output(0.);
- double norm(0.);
- for(unsigned int ix=0,N=_kstar1wgts.size();ix<N;++ix) norm+=_kstar1wgts[ix];
- if(ires<0) {
- for(unsigned int ix=0,N=_kstar1wgts.size();ix<N;++ix) {
- output+=_kstar1wgts[ix]*BWKstar1(q2,ix);
- }
- }
- else {
- unsigned int temp(ires);
- if(temp<_kstar1wgts.size()) output=_kstar1wgts[temp]*BWKstar1(q2,temp);
- }
- return output/norm;
-}
-
-Complex TwoKaonOnePionCurrent::TKstar2(Energy2 q2,int ires) const {
- Complex output(0.);
- double norm(0.);
- for(unsigned int ix=0,N=_kstar2wgts.size();ix<N;++ix) norm+=_kstar2wgts[ix];
- if(ires<0) {
- for(unsigned int ix=0,N=_kstar2wgts.size();ix<N;++ix) {
- output+=_kstar2wgts[ix]*BWKstar2(q2,ix);
- }
- }
- else {
- unsigned int temp(ires);
- if(temp<_kstar2wgts.size()) output=_kstar2wgts[temp]*BWKstar2(q2,temp);
- }
- return output/norm;
-}
-
-Complex TwoKaonOnePionCurrent::BWrho1(Energy2 q2, unsigned int ires) const {
- if(ires>=_rho1mass.size()) return 0.;
- Energy mass = _rho1mass [ires];
- Energy width = _rho1width[ires];
- Energy q=sqrt(q2);
- Energy pcm0 = Kinematics::pstarTwoBodyDecay(mass,_mpi,_mpi);
- Energy pcm = q<=2.*_mpi ? ZERO : Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi);
- double ratio = Math::powi(pcm/pcm0, 3);
- Energy gam(width*mass*ratio/q);
- return sqr(mass)/(sqr(mass)-q2-Complex(0.,1.)*mass*gam);
-}
-
-Complex TwoKaonOnePionCurrent::BWrho2(Energy2 q2, unsigned int ires) const {
- if(ires>=_rho2mass.size()) return 0.;
- Energy mass = _rho2mass [ires];
- Energy width = _rho2width[ires];
- Energy q=sqrt(q2);
- Energy pcm0 = Kinematics::pstarTwoBodyDecay(mass,_mpi,_mpi);
- Energy pcm = q<=2.*_mpi ? ZERO : Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi);
- double ratio(pcm/pcm0);ratio*=ratio*ratio;
- Energy gam(width*mass*ratio/q);
- return sqr(mass)/(sqr(mass)-q2-Complex(0.,1.)*mass*gam);
-}
-
-Complex TwoKaonOnePionCurrent::BWKstar1(Energy2 q2, unsigned int ires) const {
- if(ires>=_kstar1mass.size()) return 0.;
- Energy mass = _kstar1mass [ires];
- Energy width = _kstar1width[ires];
- Energy q=sqrt(q2);
- Energy pcm0 = Kinematics::pstarTwoBodyDecay(mass,_mK,_mpi);
- Energy pcm = q<=_mpi+_mK ? ZERO : Kinematics::pstarTwoBodyDecay(q,_mK,_mpi);
- double ratio(pcm/pcm0);ratio*=ratio*ratio;
- Energy gam(width*mass*ratio/q);
- return sqr(mass)/(sqr(mass)-q2-Complex(0.,1.)*mass*gam);
-}
-
-Complex TwoKaonOnePionCurrent::BWKstar2(Energy2 q2, unsigned int ires) const {
- if(ires>=_kstar2mass.size()) return 0.;
- Energy mass = _kstar2mass [ires];
- Energy width = _kstar2width[ires];
- Energy q=sqrt(q2);
- Energy pcm0 = Kinematics::pstarTwoBodyDecay(mass,_mK,_mpi);
- Energy pcm = q<=_mpi+_mK ? ZERO : Kinematics::pstarTwoBodyDecay(q,_mK,_mpi);
- double ratio(pcm/pcm0);ratio*=ratio*ratio;
- Energy gam(width*mass*ratio/q);
- return sqr(mass)/(sqr(mass)-q2-Complex(0.,1.)*mass*gam);
-}
-
-Complex TwoKaonOnePionCurrent::a1BreitWigner(Energy2 q2) const {
- Complex ii(0.,1.);
- Energy2 m2(_a1mass*_a1mass);
- Energy q(sqrt(q2));
- return m2/(m2-q2-ii*q*a1Width(q2));
-}
-
-Energy TwoKaonOnePionCurrent::a1Width(Energy2 q2) const {
- if(!_a1opt) return _a1mass*_a1width*g(q2)/g(_a1mass*_a1mass)/sqrt(q2);
- else return (*_a1runinter)(q2);
-}
-
-double TwoKaonOnePionCurrent::g(Energy2 q2) const {
- double output;
- if(q2<9.*_mpi*_mpi) {
- output=0.;
- }
- else if(q2<sqr(_rho1mass[0]+_mpi)) {
- double diff=(q2-9.*_mpi*_mpi)/GeV2;
-
- output=4.1*sqr(diff)*diff*(1.-3.3*diff+5.8*sqr(diff));
- }
- else {
- double ratio = q2/GeV2;
- output = ratio*(1.623+10.38/ratio-9.32/sqr(ratio)+0.65/(ratio*sqr(ratio)));
- }
- return output;
-}
Complex TwoKaonOnePionCurrent::Tomega(Energy2 q2, int ires) const {
double denom=(1.+_epsomega);
Complex num(0.);
if(ires<0) num=OmegaPhiBreitWigner(q2,0)+_epsomega*OmegaPhiBreitWigner(q2,1);
else if(ires==0) num=OmegaPhiBreitWigner(q2,0);
else num=OmegaPhiBreitWigner(q2,1);
return num/denom;
}
-Complex TwoKaonOnePionCurrent::OmegaPhiBreitWigner(Energy2 q2, unsigned int ires) const {
- Energy2 m2,mg;
- if(ires==0) {
- m2=sqr(_omegamass);
- mg=_omegamass*_omegawidth;
- }
- else {
- m2=sqr(_phimass);
- mg=_phimass*_phiwidth;
- }
- return (-m2+Complex(0.,1.)*mg)/(q2-m2+Complex(0.,1.)*mg);
-}
-
Complex TwoKaonOnePionCurrent::TOmegaKStar(Energy2 s1,Energy2 s2,int ires) const {
Complex output;
if(ires<0) output = _omegaKstarwgt*TKstar1(s1,-1)+Tomega(s2,-1);
else if(ires%2==0) output = _omegaKstarwgt*TKstar1(s1,ires/2);
else if(ires%2==1) output = Tomega(s2,ires/2);
return output/(1.+_omegaKstarwgt);
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
TwoKaonOnePionCurrent::current(tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int imode, const int ichan, Energy & scale,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption) const {
+ // check the isospin
+ if(Itotal!=IsoSpin::IUnknown && Itotal!=IsoSpin::IOne)
+ return vector<LorentzPolarizationVectorE>();
+ // check I_3
+ if(i3!=IsoSpin::I3Unknown) {
+ switch(i3) {
+ case IsoSpin::I3Zero:
+ return vector<LorentzPolarizationVectorE>();
+ break;
+ case IsoSpin::I3One: case IsoSpin::I3MinusOne:
+ break;
+ default:
+ return vector<LorentzPolarizationVectorE>();
+ }
+ }
+ // check the resonance
+ int ires1=-1;
+ if(resonance) {
+ switch(abs(resonance->id())/1000) {
+ case 0:
+ ires1=0; break;
+ case 100:
+ ires1=1; break;
+ case 30:
+ ires1=2; break;
+ case 10:
+ ires1=3; break;
+ default:
+ assert(false);
+ }
+ }
+ useMe();
// calculate q2,s1,s2,s3
Lorentz5Momentum q;
for(unsigned int ix=0;ix<momenta.size();++ix)
q+=momenta[ix];
q.rescaleMass();
scale=q.mass();
Energy2 q2=q.mass2();
Energy2 s1 = (momenta[1]+momenta[2]).m2();
Energy2 s2 = (momenta[0]+momenta[2]).m2();
Energy2 s3 = (momenta[0]+momenta[1]).m2();
- FormFactors F = calculateFormFactors(ichan,imode,q2,s1,s2,s3);
- //if(inpart.id()==ParticleID::tauplus){F.F5=conj(F.F5);}
+ // calculate the form factors
+ useMe();
+ Complex F1(0.), F2(0.), F5(0.);
+ Complex a1fact = ires1<0 || ires1==3 ? a1BreitWigner(q2) : 0.;
+ // calculate the K- pi - K+ factor
+ if(imode==0) {
+ a1fact *= sqrt(2.)/3.;
+ if(ichan<0) {
+ F1 = -a1fact*TKstar1(s1,-1);
+ F2 = a1fact*Trho1(s2,-1);
+ if(ires1<0)
+ F5 = Trho2(q2, -1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
+ else if(ires1<3)
+ F5 = Trho2(q2,ires1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
+ else
+ F5 = 0.;
+ }
+ else if(ichan%5==0) F1 = -a1fact*TKstar1(s1, ichan/5);
+ else if(ichan%5==1) F2 = a1fact*Trho1( s2,(ichan-1)/5);
+ else if(ichan%5>=2) F5 = Trho2(q2,ichan/5)*TOmegaKStar(s1,s2,2*((ichan-2)%5))
+ *sqrt(2.);
+ }
+ // calculate the K0 pi- K0bar
+ else if(imode==1) {
+ a1fact *= sqrt(2.)/3.;
+ if(ichan<0) {
+ F1 =-a1fact*TKstar1(s1,-1);
+ F2 = a1fact*Trho1 (s2,-1);
+ if(ires1<0)
+ F5 =-Trho2(q2, -1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
+ else if(ires1<3)
+ F5 =-Trho2(q2,ires1)*TOmegaKStar(s1,s2,-1)*sqrt(2.);
+ else
+ F5 = 0.;
+ }
+ else if(ichan%5==0) F1 = -a1fact*TKstar1(s1, ichan/5);
+ else if(ichan%5==1) F2 = a1fact*Trho1 (s2,(ichan-1)/5);
+ else if(ichan%5>=2) F5 = -Trho2(q2,ichan/5)*TOmegaKStar(s1,s2,2*((ichan-2)%5))
+ *sqrt(2.);
+ }
+ // calculate the K- pi0 k0
+ else if(imode==2) {
+ a1fact /= 3.;
+ if(ichan<0) {
+ F1 = a1fact*( TKstar1(s1,-1)-TKstar1(s3,-1));
+ F2 = -a1fact*(2.*Trho1(s2,-1)+TKstar1(s3,-1));
+ if(ires1<0)
+ F5 = Trho2(q2, -1)*(TKstar1(s3,-1)-TKstar1(s1,-1))/(1.+_omegaKstarwgt)/sqrt(2.);
+ else if(ires1<3)
+ F5 = Trho2(q2,ires1)*(TKstar1(s3,-1)-TKstar1(s1,-1))/(1.+_omegaKstarwgt)/sqrt(2.);
+ else
+ F5 = 0.;
+ }
+ else if(ichan%9==0) F1 = a1fact*TKstar1(s1,ichan/9)/3.;
+ else if(ichan%9==1) {
+ F1 = +a1fact*TKstar1(s3,(ichan-1)/9)/3.;
+ F2 = -a1fact*TKstar1(s3,(ichan-1)/9)/3.;
+ }
+ else if(ichan%9==2) F2 = -a1fact*2.*Trho1(s2,(ichan-2)/9)/3.;
+ else if(ichan%9<6) F5 =-Trho2(q2,ichan/9)*TKstar1(s1,(ichan-3)%9)
+ /(1.+_omegaKstarwgt)/sqrt(2.);
+ else F5 = Trho2(q2,ichan/9)*TKstar1(s3,(ichan-6)%9)
+ /(1.+_omegaKstarwgt)/sqrt(2.);
+ }
+ // calculate the K_S0 pi- K_S0 or K_L0 pi- K_L0
+ else if(imode==3||imode==4) {
+ a1fact /=6;
+ if(ichan<0) {
+ F1 = a1fact*(TKstar1(s1,-1)+TKstar1(s3,-1));
+ F2 = a1fact*TKstar1(s3,-1);
+ if(ires1<0)
+ F5 = 0.5*Trho2(q2, -1)*(TOmegaKStar(s1,s2,-1)-TOmegaKStar(s3,s2,-1));
+ else if(ires1<3)
+ F5 = 0.5*Trho2(q2,ires1)*(TOmegaKStar(s1,s2,-1)-TOmegaKStar(s3,s2,-1));
+ else
+ F5 = 0.;
+ }
+ else if(ichan%8==0) F1=a1fact*TKstar1(s1,ichan/8);
+ else if(ichan%8==1) {
+ F1 = a1fact*TKstar1(s3,ichan/8);
+ F2 = a1fact*TKstar1(s3,ichan/8);
+ }
+ else if(ichan%8<5 ) F5 = -Trho2(q2,ichan/8)*TKstar1(s1,(ichan-2)%8)
+ /(1.+_omegaKstarwgt)/2.;
+ else F5 = Trho2(q2,ichan/8)*TKstar1(s3,(ichan-5)%8)
+ /(1.+_omegaKstarwgt)/2.;
+ }
+ else if(imode==5) {
+ a1fact *= 1./3./sqrt(2.);
+ if(ichan<0) {
+ F1 = -a1fact*(TKstar1(s1,-1)-TKstar1(s3,-1));
+ F2 = a1fact*(2.*Trho1(s2,-1)+TKstar1(s3,-1));
+ if(ires1<0)
+ F5 = -Trho2(q2, -1)*(TOmegaKStar(s1,s2,-1)+TOmegaKStar(s3,s2,-1))/sqrt(2.);
+ else if(ires1<3)
+ F5 = -Trho2(q2,ires1)*(TOmegaKStar(s1,s2,-1)+TOmegaKStar(s3,s2,-1))/sqrt(2.);
+ else
+ F5 = 0.;
+ }
+ else if(ichan%9==0) F1 =- a1fact*TKstar1(s1,ichan/9);
+ else if(ichan%9==1) {
+ F1 = a1fact*TKstar1(s3,ichan/9);
+ F2 = a1fact*TKstar1(s3,ichan/9);
+ }
+ else if(ichan%9==2) F2 = 2.*a1fact*Trho1( s2,ichan/9);
+ else if(ichan%9<6 ) F5 = -sqrt(0.5)*Trho2(q2,ichan/9)*
+ TOmegaKStar(s1,s2,2*((ichan-3)%9))/sqrt(2.);
+ else F5 = -sqrt(0.5)*Trho2(q2,ichan/9)*
+ TOmegaKStar(s3,s2,2*((ichan-6)%9))/sqrt(2.);
+ }
// the first three form-factors
- LorentzPolarizationVector vect;
- vect = (F.F2-F.F1)*momenta[2]
- +(F.F1-F.F3)*momenta[1]
- +(F.F3-F.F2)*momenta[0];
+ LorentzPolarizationVectorE vect = (F2-F1)*momenta[2] + F1*momenta[1] - F2*momenta[0];
// multiply by the transverse projection operator
- complex<InvEnergy> dot=(vect*q)/q2;
+ Complex dot=(vect*q)/q2;
// scalar and parity violating terms
- vect += (F.F4-dot)*q;
- if(F.F5!=complex<InvEnergy3>())
- vect += Complex(0.,1.)*F.F5*Helicity::epsilon(momenta[0],
- momenta[1],
- momenta[2]);
+ vect -= dot*q;
+ if(F5!=0.)
+ vect -= Complex(0.,1.)*F5/sqr(Constants::twopi)/sqr(_fpi)*
+ Helicity::epsilon(momenta[0],momenta[1],momenta[2]);
// factor to get dimensions correct
- return vector<LorentzPolarizationVectorE>(1,q.mass()*vect);
+ return vector<LorentzPolarizationVectorE>(1,q.mass()/_fpi*vect);
}
bool TwoKaonOnePionCurrent::accept(vector<int> id) {
if(id.size()!=3) return false;
int npip(0),npim(0),nkp(0),nkm(0);
int npi0(0),nk0(0),nk0bar(0),nks(0),nkl(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
else if(id[ix]==ParticleID::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
if ( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) return true;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) return true;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) return true;
else if( nks==2 && (npip==1||npim==1) ) return true;
else if( nkl==2 && (npip==1||npim==1) ) return true;
else if( nks==1&&nkl==1 && (npip==1||npim==1) ) return true;
return false;
}
unsigned int TwoKaonOnePionCurrent::decayMode(vector<int> id) {
assert(id.size()==3);
int npip(0),npim(0),nkp(0),nkm(0),
npi0(0),nk0(0),nk0bar(0),neta(0),nks(0),nkl(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
else if(id[ix]==ParticleID::eta) ++neta;
else if(id[ix]==ParticleID::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
if ( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) return 0;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) return 1;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) return 2;
else if( nks==2 && (npip==1||npim==1) ) return 3;
else if( nkl==2 && (npip==1||npim==1) ) return 4;
else if( nks==1&&nkl==1 && (npip==1||npim==1) ) return 5;
assert(false);
}
tPDVector TwoKaonOnePionCurrent::particles(int icharge, unsigned int imode,int,int) {
tPDVector extpart(3);
if(imode==0) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kplus);
}
else if(imode==1) {
extpart[0]=getParticleData(ParticleID::K0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kbar0);
}
else if(imode==2) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::K0);
}
else if(imode==3) {
extpart[0]=getParticleData(ParticleID::K_S0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_S0);
}
else if(imode==4) {
extpart[0]=getParticleData(ParticleID::K_L0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_L0);
}
else if(imode==5) {
extpart[0]=getParticleData(ParticleID::K_S0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_L0);
}
// conjugate the particles if needed
if(icharge==3) {
for(unsigned int ix=0;ix<3;++ix) {
if(extpart[ix]->CC()) extpart[ix]=extpart[ix]->CC();
}
}
// return the answer
return extpart;
}
diff --git a/Decay/WeakCurrents/TwoKaonOnePionCurrent.h b/Decay/WeakCurrents/TwoKaonOnePionCurrent.h
--- a/Decay/WeakCurrents/TwoKaonOnePionCurrent.h
+++ b/Decay/WeakCurrents/TwoKaonOnePionCurrent.h
@@ -1,607 +1,536 @@
// -*- C++ -*-
//
// TwoKaonOnePionCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2017 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef HERWIG_TwoKaonOnePionCurrent_H
#define HERWIG_TwoKaonOnePionCurrent_H
//
// This is the declaration of the TwoKaonOnePionCurrent class.
//
#include "WeakCurrent.h"
namespace Herwig {
using namespace ThePEG;
/**
* The TwoKaonOnePionCurrent class implements the model of M. Finkemeier
* and E.~Mirkes, Z. Phys. C 69 (1996) 243 [arXiv:hep-ph/9503474],
* for the weak current for three mesons where at least one of the mesons is
* a kaon.
*
* \ingroup Decay
*
* This is the base class for the three meson decays of the weak current.
* It is designed so that the currents for the following modes can be implemented
* in classes inheriting from this
* - \f$ K^- \pi^- K^+ \f$, (imode=0)
* - \f$ K^0 \pi^- \bar{K}^0\f$, (imode=1)
* - \f$ K^- \pi^0 K^0 \f$, (imode=2)
* - \f$ \pi^0 \pi^0 K^- \f$, (imode=3)
* - \f$ K^- \pi^- \pi^+ \f$, (imode=4)
* - \f$ \pi^- \bar{K}^0 \pi^0 \f$, (imode=5)
* - \f$ \pi^- \pi^0 \eta \f$, (imode=6)
*
* obviously there are other modes with three pseudoscalar mesons for the decay
* of the weak current but this model original came from \f$\tau\f$ decay where
* these are the only modes. However one case which is important is the inclusion
* of the mixing in the neutral kaon sector for which we include the additional
* currents
* - \f$ K^0_S \pi^- K^0_S\f$, (imode=9)
* - \f$ K^0_L \pi^- K^0_L\f$, (imode=10)
* - \f$ K^0_S \pi^- K^0_L\f$, (imode=11)
*
* In this case the current is given by
* \f[ J^\mu = \left(g^{\mu\nu}-\frac{q^\mu q^\nu}{q^2}\right)
* \left[F_1(p_2-p_3)^\mu +F_2(p_3-p_1)^\mu+F_3(p_1-p_2)^\mu\right]
* +q^\mu F_4
* +F_5\epsilon^{\mu\alpha\beta\gamma}p_1^\alpha p_2^\beta p_3^\gamma
* \f]
* where
* - \f$p_{1,2,3}\f$ are the momenta of the mesons in the order given above.
* - \f$F_1,F_2,F_3,F_4,F_5\f$ are the form factors which must be
* calculated in the calculateFormFactors member which should be implemented
* in classes inheriting from this.
*
* @see WeakCurrent.
*
* \author Peter Richardson
* @see \ref TwoKaonOnePionCurrentInterfaces "The interfaces"
* defined for TwoKaonOnePionCurrent.
*/
class TwoKaonOnePionCurrent: public WeakCurrent {
public:
/**
* The default constructor.
*/
TwoKaonOnePionCurrent();
/** @name Methods for the construction of the phase space integrator. */
//@{
/**
* Complete the construction of the decay mode for integration.classes inheriting
* from this one.
* This method is purely virtual and must be implemented in the classes inheriting
* from WeakCurrent.
* @param icharge The total charge of the outgoing particles in the current.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode in the current being asked for.
* @param mode The phase space mode for the integration
* @param iloc The location of the of the first particle from the current in
* the list of outgoing particles.
* @param ires The location of the first intermediate for the current.
* @param phase The prototype phase space channel for the integration.
* @param upp The maximum possible mass the particles in the current are
* allowed to have.
* @return Whether the current was sucessfully constructed.
*/
virtual bool createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp );
//@}
/**
* Hadronic current. This method is purely virtual and must be implemented in
* all classes inheriting from this one.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode
* @param ichan The phase-space channel the current is needed for.
* @param scale The invariant mass of the particles in the current.
* @param outgoing The particles produced in the decay
* @param momenta The momenta of the particles produced in the decay
* @param meopt Option for the calculation of the matrix element
* @return The current.
*/
virtual vector<LorentzPolarizationVectorE>
current(tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int imode, const int ichan,Energy & scale,
const tPDVector & outgoing,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption meopt) const;
/**
* Accept the decay. Checks the mesons against the list.
* @param id The id's of the particles in the current.
* @return Can this current have the external particles specified.
*/
virtual bool accept(vector<int> id);
/**
* Return the decay mode number for a given set of particles in the current.
* Checks the mesons against the list.
* @param id The id's of the particles in the current.
* @return The number of the mode
*/
virtual unsigned int decayMode(vector<int> id);
/**
* The particles produced by the current. This returns the mesons for the mode.
* @param icharge The total charge of the particles in the current.
* @param imode The mode for which the particles are being requested
* @param iq The PDG code for the quark
* @param ia The PDG code for the antiquark
* @return The external particles for the current.
*/
virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
/**
* Output the setup information for the particle database
* @param os The stream to output the information to
* @param header Whether or not to output the information for MySQL
* @param create Whether or not to add a statement creating the object
*/
virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
/**
* the matrix element for the \f$a_1\f$ decay to calculate the running width
* @param imode The mode for which the matrix element is needed.
* @param q2 The mass of the decaying off-shell \f$a_1\f$, \f$q^2\f$.
* @param s3 The invariant mass squared of particles 1 and 2, \f$s_3=m^2_{12}\f$.
* @param s2 The invariant mass squared of particles 1 and 3, \f$s_2=m^2_{13}\f$.
* @param s1 The invariant mass squared of particles 2 and 3, \f$s_1=m^2_{23}\f$.
* @param m1 The mass of the first outgoing particle.
* @param m2 The mass of the second outgoing particle.
* @param m3 The mass of the third outgoing particle.
* @return The matrix element squared summed over spins.
*/
double threeBodyMatrixElement(const int imode, const Energy2 q2,
const Energy2 s3, const Energy2 s2,
const Energy2 s1, const Energy m1,
const Energy m2, const Energy m3) const;
-
-protected:
-
- /**
- * Helper class for form factors
- */
- struct FormFactors {
-
- /**
- * @param F1 The \f$F_1\f$ form factor
- */
- complex<InvEnergy> F1;
-
- /**
- * @param F2 The \f$F_2\f$ form factor
- */
- complex<InvEnergy> F2;
-
- /**
- * @param F3 The \f$F_3\f$ form factor
- */
- complex<InvEnergy> F3;
-
- /**
- * @param F4 The \f$F_4\f$ form factor
- */
- complex<InvEnergy> F4;
-
- /**
- * @param F5 The \f$F_5\f$ form factor
- */
- complex<InvEnergy3> F5;
-
- /**
- * Constructor
- * @param f1 The \f$F_1\f$ form factor
- * @param f2 The \f$F_2\f$ form factor
- * @param f3 The \f$F_3\f$ form factor
- * @param f4 The \f$F_4\f$ form factor
- * @param f5 The \f$F_5\f$ form factor
- */
- FormFactors(complex<InvEnergy> f1 = InvEnergy(),
- complex<InvEnergy> f2 = InvEnergy(),
- complex<InvEnergy> f3 = InvEnergy(),
- complex<InvEnergy> f4 = InvEnergy(),
- complex<InvEnergy3> f5 = InvEnergy3())
- : F1(f1), F2(f2), F3(f3), F4(f4), F5(f5) {}
- };
-
- /**
- * Calculate the form factor for the current. Implements the form factors
- * described above.
- * @param ichan The phase space channel
- * @param imode The mode
- * @param q2 The scale \f$q^2\f$ for the current.
- * @param s1 The invariant mass squared of particles 2 and 3, \f$s_1=m^2_{23}\f$.
- * @param s2 The invariant mass squared of particles 1 and 3, \f$s_2=m^2_{13}\f$.
- * @param s3 The invariant mass squared of particles 1 and 2, \f$s_3=m^2_{12}\f$.
- */
- virtual FormFactors calculateFormFactors(const int ichan,const int imode,
- Energy2 q2,Energy2 s1,Energy2 s2,Energy2 s3) const;
-
+
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/** @name Clone Methods. */
//@{
/**
* Make a simple clone of this object.
* @return a pointer to the new object.
*/
virtual IBPtr clone() const;
/** Make a clone of this object, possibly modifying the cloned object
* to make it sane.
* @return a pointer to the new object.
*/
virtual IBPtr fullclone() const;
//@}
protected:
/** @name Standard Interfaced functions. */
//@{
/**
* Initialize this object after the setup phase before saving and
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
/**
* Initialize this object to the begining of the run phase.
*/
virtual void doinitrun();
/**
* Check sanity of the object during the setup phase.
*/
virtual void doupdate();
//@}
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
TwoKaonOnePionCurrent & operator=(const TwoKaonOnePionCurrent &);
private:
/**
* The \f$\rho\f$ lineshape for the axial-vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$\rho\f$ multiplet
*/
- Complex Trho1(Energy2 q2,int ires) const;
+ Complex Trho1(Energy2 q2,int ires) const {
+ if(ires>=int(_rho1wgts.size())) return 0.;
+ double norm = std::accumulate(_rho1wgts.begin(),_rho1wgts.end(),0.);
+ unsigned int imin=0,imax=_rho1wgts.size();
+ if(ires>0) {
+ imin=ires;
+ imax=imin+1;
+ }
+ Complex output(0.);
+ for(unsigned int ix=imin;ix<imax;++ix)
+ output+=_rho1wgts[ix]*
+ Resonance::BreitWignerPWave(q2,_rho1mass[ix],_rho1width[ix],_mpi,_mpi);
+ return output/norm;
+ }
/**
* The \f$\rho\f$ lineshape for the vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$\rho\f$ multiplet
*/
- Complex Trho2(Energy2 q2,int ires) const;
+ Complex Trho2(Energy2 q2,int ires) const {
+ if(ires>=int(_rho2wgts.size())) return 0.;
+ double norm = std::accumulate(_rho2wgts.begin(),_rho2wgts.end(),0.);
+ unsigned int imin=0,imax=_rho2wgts.size();
+ if(ires>0) {
+ imin=ires;
+ imax=imin+1;
+ }
+ Complex output(0.);
+ for(unsigned int ix=imin;ix<imax;++ix)
+ output+=_rho2wgts[ix]*
+ Resonance::BreitWignerPWave(q2,_rho2mass[ix],_rho2width[ix],_mpi,_mpi);
+ return output/norm;
+ }
/**
* The \f$K^*\f$ lineshape for the axial-vector terms
* @param q2 The scale \f$q^2\f$ for the lineshape
* @param ires Which \f$K^*\f$ multiplet
*/
- Complex TKstar1(Energy2 q2,int ires) const;
-
- /**
- * The \f$\rho\f$ lineshape for the vector terms
- * @param q2 The scale \f$q^2\f$ for the lineshape
- * @param ires Which \f$K^*\f$ multiplet
- */
- Complex TKstar2(Energy2 q2,int ires) const;
-
- /**
- * The \f$\rho\f$ Breit-Wigner for the axial-vector terms
- * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
- * @param ires Which \f$\rho\f$ multiplet
- */
- Complex BWrho1(Energy2 q2, unsigned int ires) const;
-
- /**
- * The \f$\rho\f$ Breit-Wigner for the vector terms
- * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
- * @param ires Which \f$\rho\f$ multiplet
- */
- Complex BWrho2(Energy2 q2, unsigned int ires) const;
-
- /**
- * The \f$K^*\f$ Breit-Wigner for the axial-vector terms
- * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
- * @param ires Which \f$K^*\f$ multiplet
- */
- Complex BWKstar1(Energy2 q2, unsigned int ires) const;
-
- /**
- * The \f$K^*\f$ Breit-Wigner for the vector terms
- * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
- * @param ires Which \f$K^*\f$ multiplet
- */
- Complex BWKstar2(Energy2 q2, unsigned int ires) const;
+ Complex TKstar1(Energy2 q2,int ires) const {
+ if(ires>=int(_kstar1wgts.size())) return 0.;
+ double norm = std::accumulate(_kstar1wgts.begin(),_kstar1wgts.end(),0.);
+ unsigned int imin=0,imax=_kstar1wgts.size();
+ if(ires>0) {
+ imin=ires;
+ imax=imin+1;
+ }
+ Complex output(0.);
+ for(unsigned int ix=imin;ix<imax;++ix)
+ output+=_kstar1wgts[ix]*
+ Resonance::BreitWignerPWave(q2,_kstar1mass[ix],_kstar1width[ix],_mK,_mpi);
+ return output/norm;
+ }
/**
* \f$a_1\f$ Breit-Wigner
* @param q2 The scale \f$q^2\f$ for the Breit-Wigner
* @return The Breit-Wigner
*/
- Complex a1BreitWigner(Energy2 q2) const;
-
- /**
- * The \f$a_1\f$ running width
- * @param q2 The scale \f$q^2\f$ for the Breit-Wigner
- * @return The \f$a_1\f$ running width.
- */
- Energy a1Width(Energy2 q2) const;
-
- /**
- * The \f$g(Q^2)\f$ function of Kuhn and Santamaria
- */
- double g(Energy2 q2) const;
+ Complex a1BreitWigner(Energy2 q2) const {
+ Complex ii(0.,1.);
+ Energy2 m2(_a1mass*_a1mass);
+ Energy q(sqrt(q2));
+ Energy gamma = !_a1opt ?
+ _a1mass*_a1width*Resonance::ga1(q2)/Resonance::ga1(_a1mass*_a1mass)/sqrt(q2) : (*_a1runinter)(q2);
+ return m2/(m2-q2-ii*q*gamma);
+ }
/**
* Initialize the \f$a_1\f$ running width
* @param iopt Initialization option (-1 full calculation, 0 set up the interpolation)
*/
void inita1Width(int iopt);
/**
* The \f$T_\omega\f$ function
* @param q2 The scale
* @param ires the resonance
*/
Complex Tomega(Energy2 q2, int ires) const;
/**
* The \f$\omega\f$ and \f$\phi\f$ Breit-Wigner
* @param q2 The scale
* @param ires the resonance
*/
- Complex OmegaPhiBreitWigner(Energy2 q2, unsigned int ires) const;
+ Complex OmegaPhiBreitWigner(Energy2 q2, unsigned int ires) const {
+ Energy2 m2,mg;
+ if(ires==0) {
+ m2=sqr(_omegamass);
+ mg=_omegamass*_omegawidth;
+ }
+ else {
+ m2=sqr(_phimass);
+ mg=_phimass*_phiwidth;
+ }
+ return (-m2+Complex(0.,1.)*mg)/(q2-m2+Complex(0.,1.)*mg);
+ }
/**
* The \f$\omega-\phi\f$ \f$K^*\f$ form-factor for the \f$F_5\f$ form-factor
* @param s1 The scale \f$s_1\f$.
* @param s2 The scale \f$s_2\f$.
* @param ires Which resonances to use
* @return The mixed Breit-Wigner
*/
Complex TOmegaKStar(Energy2 s1,Energy2 s2,int ires) const;
private:
/**
* Parameters for the \f$\rho\f$ in the axial-vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _rho1wgts;
/**
* Masses
*/
vector<Energy> _rho1mass;
/**
* Widths
*/
vector<Energy> _rho1width;
//@}
/**
* Parameters for the \f$\rho\f$ in the vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _rho2wgts;
/**
* Masses
*/
vector<Energy> _rho2mass;
/**
* Widths
*/
vector<Energy> _rho2width;
//@}
/**
* Parameters for the \f$K^*\f$ in the axial-vector terms
*/
//@{
/**
* Weight for the different resonances
*/
vector<double> _kstar1wgts;
/**
* Masses
*/
vector<Energy> _kstar1mass;
/**
* Widths
*/
vector<Energy> _kstar1width;
//@}
/**
- * Parameters for the \f$K^*\f$ in the vector terms
- */
- //@{
- /**
- * Weight for the different resonances
- */
- vector<double> _kstar2wgts;
-
- /**
- * Masses
- */
- vector<Energy> _kstar2mass;
-
- /**
- * Widths
- */
- vector<Energy> _kstar2width;
- //@}
-
- /**
* Parameters for the three meson resonances
*/
//@{
/**
* The mass of the \f$a_1\f$ resonances.
*/
Energy _a1mass;
/**
* The width of the \f$a_1\f$ resonances.
*/
Energy _a1width;
/**
* The \f$a_1\f$ width for the running \f$a_1\f$ width calculation.
*/
vector<Energy> _a1runwidth;
/**
* The \f$q^2\f$ for the running \f$a_1\f$ width calculation.
*/
vector<Energy2> _a1runq2;
/**
* The interpolator for the running \f$a_1\f$ width calculation.
*/
Interpolator<Energy,Energy2>::Ptr _a1runinter;
//@}
/**
* Parameters for the \f$T_\omega\f$ function
*/
//@{
/**
* Mixing parameter
*/
double _epsomega;
/**
* Mass of the \f$\omega\f$
*/
Energy _omegamass;
/**
* Width of the \f$\omega\f$
*/
Energy _omegawidth;
/**
* Mass of the \f$\phi\f$
*/
Energy _phimass;
/**
* Width of the \f$\phi\f$
*/
Energy _phiwidth;
//@}
/**
* The relative weight of the \f$\omega-\phi\f$ and \f$K^*\f$ where needed.
*/
double _omegaKstarwgt;
/**
* The pion decay constant, \f$f_\pi\f$.
*/
Energy _fpi;
/**
* The pion mass
*/
Energy _mpi;
/**
* The kaon mass
*/
Energy _mK;
/**
* Initialization switches
*/
//@{
/**
* Initialize the running \f$a_1\f$ width.
*/
bool _initializea1;
/**
* Option for the \f$a_1\f$ width
*/
bool _a1opt;
//@}
/**
* The maximum mass of the hadronic system
*/
Energy _maxmass;
/**
* The maximum mass when the running width was calculated
*/
Energy _maxcalc;
};
}
#endif /* HERWIG_TwoKaonOnePionCurrent_H */
diff --git a/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc
--- a/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc
+++ b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc
@@ -1,754 +1,754 @@
// -*- C++ -*-
//
// TwoKaonOnePionDefaultCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2017 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the TwoKaonOnePionDefaultCurrent class.
//
#include "TwoKaonOnePionDefaultCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/ParVector.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig/PDT/ThreeBodyAllOnCalculator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Helicity/epsilon.h"
using namespace Herwig;
using namespace ThePEG;
DescribeClass<TwoKaonOnePionDefaultCurrent,WeakCurrent>
describeHerwigTwoKaonOnePionDefaultCurrent("Herwig::TwoKaonOnePionDefaultCurrent",
"HwWeakCurrents.so");
HERWIG_INTERPOLATOR_CLASSDESC(TwoKaonOnePionDefaultCurrent,Energy,Energy2)
TwoKaonOnePionDefaultCurrent::TwoKaonOnePionDefaultCurrent() {
// the quarks for the different modes
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
setInitialModes(3);
// the pion decay constant
_fpi=130.7*MeV/sqrt(2.);
_mpi = ZERO;
_mK = ZERO;
// set the initial weights for the resonances
// the rho weights
_rhoF123wgts = { 1.0,-0.145,0.};
_rhoF5wgts = {-26., 6.5,1.};
// the Kstar weights
_kstarF123wgts = {1.};
// relative rho/Kstar weights
_rhoKstarwgt=-0.2;
// local values of the a_1 parameters
_a1mass = 1.251*GeV;
_a1width = 0.599*GeV;
_a1opt=true;
// local values of the rho parameters
_rhoF123masses = {0.773*GeV,1.370*GeV,1.750*GeV};
_rhoF123widths = {0.145*GeV,0.510*GeV,0.120*GeV};
_rhoF5masses = {0.773*GeV,1.500*GeV,1.750*GeV};
_rhoF5widths = {0.145*GeV,0.220*GeV,0.120*GeV};
// local values for the Kstar parameters
_kstarF123masses = {0.8921*GeV};
_kstarF123widths = {0.0513*GeV};
// initialization of the a_1 running width
_initializea1=false;
double a1q2in[200]={0,15788.6,31577.3,47365.9,63154.6,78943.2,94731.9,110521,
126309,142098,157886,173675,189464,205252,221041,236830,
252618,268407,284196,299984,315773,331562,347350,363139,
378927,394716,410505,426293,442082,457871,473659,489448,
505237,521025,536814,552603,568391,584180,599969,615757,
631546,647334,663123,678912,694700,710489,726278,742066,
757855,773644,789432,805221,821010,836798,852587,868375,
884164,899953,915741,931530,947319,963107,978896,994685,
1.01047e+06,1.02626e+06,1.04205e+06,1.05784e+06,1.07363e+06,
1.08942e+06,1.10521e+06,1.12099e+06,1.13678e+06,1.15257e+06,
1.16836e+06,1.18415e+06,1.19994e+06,1.21573e+06,1.23151e+06,
1.2473e+06,1.26309e+06,1.27888e+06,1.29467e+06,1.31046e+06,
1.32625e+06,1.34203e+06,1.35782e+06,1.37361e+06,1.3894e+06,
1.40519e+06,1.42098e+06,1.43677e+06,1.45256e+06,1.46834e+06
,1.48413e+06,1.49992e+06,1.51571e+06,1.5315e+06,1.54729e+06,
1.56308e+06,1.57886e+06,1.59465e+06,1.61044e+06,1.62623e+06,
1.64202e+06,1.65781e+06,1.6736e+06,1.68939e+06,1.70517e+06,
1.72096e+06,1.73675e+06,1.75254e+06,1.76833e+06,1.78412e+06,
1.79991e+06,1.81569e+06,1.83148e+06,1.84727e+06,1.86306e+06,
1.87885e+06,1.89464e+06,1.91043e+06,1.92621e+06,1.942e+06,
1.95779e+06,1.97358e+06,1.98937e+06,2.00516e+06,2.02095e+06,
2.03674e+06,2.05252e+06,2.06831e+06,2.0841e+06,2.09989e+06,
2.11568e+06,2.13147e+06,2.14726e+06,2.16304e+06,2.17883e+06,
2.19462e+06,2.21041e+06,2.2262e+06,2.24199e+06,2.25778e+06,
2.27356e+06,2.28935e+06,2.30514e+06,2.32093e+06,2.33672e+06,
2.35251e+06,2.3683e+06,2.38409e+06,2.39987e+06,2.41566e+06,
2.43145e+06,2.44724e+06,2.46303e+06,2.47882e+06,2.49461e+06,
2.51039e+06,2.52618e+06,2.54197e+06,2.55776e+06,2.57355e+06,
2.58934e+06,2.60513e+06,2.62092e+06,2.6367e+06,2.65249e+06,
2.66828e+06,2.68407e+06,2.69986e+06,2.71565e+06,2.73144e+06,
2.74722e+06,2.76301e+06,2.7788e+06,2.79459e+06,2.81038e+06,
2.82617e+06,2.84196e+06,2.85774e+06,2.87353e+06,2.88932e+06,
2.90511e+06,2.9209e+06,2.93669e+06,2.95248e+06,2.96827e+06,
2.98405e+06,2.99984e+06,3.01563e+06,3.03142e+06,3.04721e+06,
3.063e+06,3.07879e+06,3.09457e+06,3.11036e+06,3.12615e+06,
3.14194e+06};
double a1widthin[200]={0,0,0,0,0,0,0,0,0,0,0,0,0.00153933,0.0136382,0.0457614,
0.105567,0.199612,0.333825,0.513831,0.745192,1.0336,1.38501,
1.80581,2.30295,2.88403,3.5575,4.33278,5.22045,6.23243,
7.38223,8.68521,10.1589,11.8234,13.7018,15.8206,18.2107,
20.9078,23.9533,27.3954,31.2905,35.7038,40.7106,46.3984,
52.8654,60.2207,68.581,78.0637,88.7754,100.794,114.145,
128.783,144.574,161.299,178.683,196.426,214.248,231.908,
249.221,266.059,282.336,298.006,313.048,327.46,341.254,
354.448,367.066,379.133,390.677,401.726,412.304,422.439,
432.155,441.474,450.419,459.01,467.267,475.207,482.847,
490.203,497.29,504.121,510.71,517.068,523.207,529.138,
534.869,540.411,545.776,550.961,556.663,560.851,565.566,
570.137,574.569,578.869,583.041,587.091,591.023,594.843,
598.553,602.16,605.664,609.072,612.396,615.626,618.754,
621.796,624.766,627.656,630.47,633.21,635.878,638.5,
641.006,643.471,645.873,648.213,650.493,652.715,654.88,
656.99,659.047,661.052,663.007,664.963,666.771,668.6,
670.351,672.075,673.828,675.397,676.996,678.567,680.083,
681.589,683.023,684.457,685.825,687.18,688.499,689.789,
691.058,692.284,693.501,694.667,695.82,696.947,698.05,
699.129,700.186,701.221,702.234,703.226,704.198,705.158,
706.085,707.001,707.899,708.78,709.644,710.474,711.334,
712.145,712.943,713.727,714.505,715.266,716.015,716.751,
717.474,718.183,718.88,719.645,720.243,720.91,721.565,
722.211,722.851,723.473,724.094,724.697,725.296,725.886,
726.468,727.041,727.608,728.166,728.718,729.262,729.808,
730.337,730.856,731.374,731.883,732.386,732.884,733.373,
733.859,734.339,734.813};
vector<double> tmp1(a1widthin,a1widthin+200);
_a1runwidth.clear();
std::transform(tmp1.begin(), tmp1.end(),
back_inserter(_a1runwidth),
[](double x){return x*MeV;});
vector<double> tmp2(a1q2in,a1q2in+200);
_a1runq2.clear();
std::transform(tmp2.begin(), tmp2.end(),
back_inserter(_a1runq2),
[](double x){return x*MeV2;});
_maxmass=ZERO;
_maxcalc=ZERO;
}
void TwoKaonOnePionDefaultCurrent::doinit() {
WeakCurrent::doinit();
// masses for the running widths
_mpi = getParticleData(ParticleID::piplus)->mass();
_mK = getParticleData(ParticleID::Kminus)->mass();
// initialise the a_1 running width calculation
inita1Width(-1);
}
void TwoKaonOnePionDefaultCurrent::persistentOutput(PersistentOStream & os) const {
os << _rhoF123wgts << _kstarF123wgts << _rhoF5wgts
<< _rhoKstarwgt << ounit(_a1runwidth,GeV)<< ounit(_a1runq2,GeV2)
<< _initializea1 << ounit(_a1mass,GeV)<< ounit(_a1width,GeV)
<< ounit(_fpi,GeV) << ounit(_mpi,GeV)<< ounit(_mK,GeV)
<< ounit(_rhoF123masses,GeV) << ounit(_rhoF5masses,GeV)
<< ounit(_rhoF123widths,GeV)
<< ounit(_rhoF5widths,GeV) << ounit(_kstarF123masses,GeV)
<< ounit(_kstarF123widths,GeV)
<< _a1opt << ounit(_maxmass,GeV) << ounit(_maxcalc,GeV) << _a1runinter;
}
void TwoKaonOnePionDefaultCurrent::persistentInput(PersistentIStream & is, int) {
is >> _rhoF123wgts >> _kstarF123wgts >> _rhoF5wgts
>> _rhoKstarwgt >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2)
>> _initializea1 >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV)
>> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV)
>> iunit(_rhoF123masses,GeV) >> iunit(_rhoF5masses,GeV)
>> iunit(_rhoF123widths,GeV)
>> iunit(_rhoF5widths,GeV) >> iunit(_kstarF123masses,GeV)
>> iunit(_kstarF123widths,GeV)
>> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter;
}
void TwoKaonOnePionDefaultCurrent::Init() {
static ClassDocumentation<TwoKaonOnePionDefaultCurrent> documentation
("The TwoKaonOnePionDefaultCurrent class is designed to implement "
"the three meson decays of the tau, ie pi- pi- pi+, pi0 pi0 pi-, "
"K- pi- K+, K0 pi- Kbar0, K- pi0 K0,pi0 pi0 K-, K- pi- pi+, "
"pi- Kbar0 pi0, pi- pi0 eta. It uses the same currents as those in TAUOLA.",
"The three meson decays of the tau, ie pi- pi- pi+, pi0 pi0 pi-, "
"K- pi- K+, K0 pi- Kbar0, K- pi0 K0,pi0 pi0 K-, K- pi- pi+, "
"and pi- Kbar0 pi0, pi- pi0 eta "
"use the same currents as \\cite{Jadach:1993hs,Kuhn:1990ad,Decker:1992kj}.",
"%\\cite{Jadach:1993hs}\n"
"\\bibitem{Jadach:1993hs}\n"
" S.~Jadach, Z.~Was, R.~Decker and J.~H.~Kuhn,\n"
" %``The Tau Decay Library Tauola: Version 2.4,''\n"
" Comput.\\ Phys.\\ Commun.\\ {\\bf 76}, 361 (1993).\n"
" %%CITATION = CPHCB,76,361;%%\n"
"%\\cite{Kuhn:1990ad}\n"
"\\bibitem{Kuhn:1990ad}\n"
" J.~H.~Kuhn and A.~Santamaria,\n"
" %``Tau decays to pions,''\n"
" Z.\\ Phys.\\ C {\\bf 48}, 445 (1990).\n"
" %%CITATION = ZEPYA,C48,445;%%\n"
"%\\cite{Decker:1992kj}\n"
"\\bibitem{Decker:1992kj}\n"
" R.~Decker, E.~Mirkes, R.~Sauer and Z.~Was,\n"
" %``Tau decays into three pseudoscalar mesons,''\n"
" Z.\\ Phys.\\ C {\\bf 58}, 445 (1993).\n"
" %%CITATION = ZEPYA,C58,445;%%\n"
);
static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF123RhoWgt
("F123RhoWeight",
"The weights of the different rho resonances in the F1,2,3 form factor",
&TwoKaonOnePionDefaultCurrent::_rhoF123wgts,
0, 0, 0, -1000, 1000, false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF123KstarWgt
("F123KstarWeight",
"The weights of the different Kstar resonances in the F1,2,3 form factor",
&TwoKaonOnePionDefaultCurrent::_kstarF123wgts,
0, 0, 0, -1000, 1000, false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF5RhoWgt
("F5RhoWeight",
"The weights of the different rho resonances in the F1,2,3 form factor",
&TwoKaonOnePionDefaultCurrent::_rhoF5wgts,
0, 0, 0, -1000, 1000, false, false, true);
static Parameter<TwoKaonOnePionDefaultCurrent,double> interfaceRhoKstarWgt
("RhoKstarWgt",
"The relative weights of the rho and K* in the F5 form factor",
&TwoKaonOnePionDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10.,
false, false, false);
static Switch<TwoKaonOnePionDefaultCurrent,bool> interfaceInitializea1
("Initializea1",
"Initialise the calculation of the a_1 running width",
&TwoKaonOnePionDefaultCurrent::_initializea1, false, false, false);
static SwitchOption interfaceInitializea1Initialization
(interfaceInitializea1,
"Yes",
"Initialize the calculation",
true);
static SwitchOption interfaceInitializea1NoInitialization
(interfaceInitializea1,
"No",
"Use the default values",
false);
static Switch<TwoKaonOnePionDefaultCurrent,bool> interfacea1WidthOption
("a1WidthOption",
"Option for the treatment of the a1 width",
&TwoKaonOnePionDefaultCurrent::_a1opt, true, false, false);
static SwitchOption interfacea1WidthOptionLocal
(interfacea1WidthOption,
"Local",
"Use a calculation of the running width based on the parameters as"
" interpolation table.",
true);
static SwitchOption interfacea1WidthOptionParam
(interfacea1WidthOption,
"Kuhn",
"Use the parameterization of Kuhn and Santamaria for default parameters."
" This should only be used for testing vs TAUOLA",
false);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacea1RunningWidth
("a1RunningWidth",
"The values of the a_1 width for interpolation to giving the running width.",
&TwoKaonOnePionDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy2> interfacea1RunningQ2
("a1RunningQ2",
"The values of the q^2 for interpolation to giving the running width.",
&TwoKaonOnePionDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2,
false, false, true);
static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceA1Width
("A1Width",
"The a_1 width if using local values.",
&TwoKaonOnePionDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV,
false, false, false);
static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceA1Mass
("A1Mass",
"The a_1 mass if using local values.",
&TwoKaonOnePionDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV,
false, false, false);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF123masses
("rhoF123masses",
"The masses for the rho resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF123widths
("rhoF123widths",
"The widths for the rho resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF5masses
("rhoF5masses",
"The masses for the rho resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF5widths
("rhoF5widths",
"The widths for the rho resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF123masses
("KstarF123masses",
"The masses for the Kstar resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF123widths
("KstarF123widths",
"The widths for the Kstar resonances if used local values",
&TwoKaonOnePionDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV,
false, false, true);
static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceFPi
("FPi",
"The pion decay constant",
&TwoKaonOnePionDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV,
false, false, true);
}
// complete the construction of the decay mode for integration
bool TwoKaonOnePionDefaultCurrent::createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
// check the charge
if(abs(icharge)!=3) return false;
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal!=IsoSpin::IOne) return false;
}
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
if(imode<=1) return false;
break;
case IsoSpin::I3One:
if( imode>1 || icharge ==-3) return false;
break;
case IsoSpin::I3MinusOne:
if( imode>1 || icharge == 3) return false;
default:
return false;
}
}
// get the particles and check the mass
int iq(0),ia(0);
tPDVector extpart(particles(1,imode,iq,ia));
Energy min(ZERO);
for(unsigned int ix=0;ix<extpart.size();++ix) min+=extpart[ix]->massMin();
if(min>upp) return false;
// the particles we will use a lot
tPDPtr a1=getParticleData(ParticleID::a_1minus);
if(icharge==3) a1=a1->CC();
_maxmass=max(_maxmass,upp);
// the rho0 resonances
tPDPtr rho0[3] = { getParticleData(113), getParticleData(100113), getParticleData(30113)};
tPDPtr rhoc[3] = {getParticleData(-213),getParticleData(-100213),getParticleData(-30213)};
tPDPtr Kstar0[3] = { getParticleData(313), getParticleData(100313), getParticleData(30313)};
tPDPtr Kstarc[3] = {getParticleData(-323),getParticleData(-100323),getParticleData(-30323)};
if(icharge==3) {
for(unsigned int ix=0;ix<3;++ix) {
rhoc [ix] = rhoc[ix]->CC();
Kstar0[ix] = Kstar0[ix]->CC();
Kstarc[ix] = Kstarc[ix]->CC();
}
}
if(imode==0) {
// channels for K- pi- K+
for(unsigned int ix=0;ix<3;++ix) {
if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstar0[ix],
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rho0[ix],
ires+2,iloc+1,ires+2,iloc+3));
}
for(unsigned int iy=0;iy<3;++iy) {
if(resonance && resonance !=rhoc[ix]) continue;
mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstar0[iy],
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+2,ires+1,rho0[iy],
ires+2,iloc+1,ires+2,iloc+3));
}
}
}
else if(imode==1) {
// channels for K0 pi- K0bar
for(unsigned int ix=0;ix<3;++ix) {
if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstarc[ix],
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rho0[ix],
ires+2,iloc+1,ires+2,iloc+3));
}
for(unsigned int iy=0;iy<3;++iy) {
if(resonance && resonance !=rhoc[ix]) continue;
mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstarc[iy],
ires+2,iloc+2,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+2,ires+1,rho0[iy],
ires+2,iloc+1,ires+2,iloc+3));
}
}
}
else if(imode==2) {
// channels for K- pi0 K0
for(unsigned int ix=0;ix<3;++ix) {
if(!resonance || resonance==a1) {
mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix],
ires+2,iloc+1,ires+2,iloc+3));
}
}
}
for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) {
mode->resetIntermediate(rhoc[ix],_rhoF123masses[ix],
_rhoF123widths[ix]);
mode->resetIntermediate(rho0[ix],_rhoF123masses[ix],
_rhoF123widths[ix]);
}
// K star parameters in the base class
for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) {
mode->resetIntermediate(Kstarc[ix],_kstarF123masses[ix],
_kstarF123widths[ix]);
mode->resetIntermediate(Kstar0[ix],_kstarF123masses[ix],
_kstarF123widths[ix]);
}
return true;
}
// initialisation of the a_1 width
// (iopt=-1 initialises, iopt=0 starts the interpolation)
void TwoKaonOnePionDefaultCurrent::inita1Width(int iopt) {
if(iopt==-1) {
_maxcalc=_maxmass;
if(!_initializea1||_maxmass==ZERO) return;
// parameters for the table of values
Energy2 step(sqr(_maxcalc)/199.);
// integrator to perform the integral
vector<double> inweights;inweights.push_back(0.5);inweights.push_back(0.5);
vector<int> intype;intype.push_back(2);intype.push_back(3);
Energy mrho(getParticleData(ParticleID::rhoplus)->mass()),
wrho(getParticleData(ParticleID::rhoplus)->width());
vector<Energy> inmass(2,mrho),inwidth(2,wrho);
vector<double> inpow(2,0.0);
ThreeBodyAllOnCalculator<TwoKaonOnePionDefaultCurrent>
widthgen(inweights,intype,inmass,inwidth,inpow,*this,0,_mpi,_mpi,_mpi);
// normalisation constant to give physical width if on shell
double a1const(_a1width/(widthgen.partialWidth(sqr(_a1mass))));
// loop to give the values
_a1runq2.clear(); _a1runwidth.clear();
for(Energy2 moff2(ZERO); moff2<=sqr(_maxcalc); moff2+=step) {
_a1runwidth.push_back(widthgen.partialWidth(moff2)*a1const);
_a1runq2.push_back(moff2);
}
}
// set up the interpolator
else if(iopt==0) {
_a1runinter = make_InterpolatorPtr(_a1runwidth,_a1runq2,3);
}
}
void TwoKaonOnePionDefaultCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::TwoKaonOnePionDefaultCurrent "
<< name() << " HwWeakCurrents.so\n";
for(unsigned int ix=0;ix<_rhoF123wgts.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":F123RhoWeight " << ix << " " << _rhoF123wgts[ix] << "\n";
}
for(unsigned int ix=0;ix<_kstarF123wgts.size();++ix) {
if(ix<1) output << "newdef ";
else output << "insert ";
output << name() << ":F123KstarWeight " << ix << " "
<< _kstarF123wgts[ix] << "\n";
}
for(unsigned int ix=0;ix<_rhoF5wgts.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":F5RhoWeight " << ix << " " << _rhoF5wgts[ix] << "\n";
}
output << "newdef " << name() << ":RhoKstarWgt " << _rhoKstarwgt << "\n";
output << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n";
output << "newdef " << name() << ":a1WidthOption " << _a1opt << "\n";
for(unsigned int ix=0;ix<_a1runwidth.size();++ix) {
output << "newdef " << name() << ":a1RunningWidth " << ix
<< " " << _a1runwidth[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_a1runq2.size();++ix) {
output << "newdef " << name() << ":a1RunningQ2 " << ix
<< " " << _a1runq2[ix]/GeV2 << "\n";
}
output << "newdef " << name() << ":A1Width " << _a1width/GeV << "\n";
output << "newdef " << name() << ":A1Mass " << _a1mass/GeV << "\n";
output << "newdef " << name() << ":FPi " << _fpi/MeV << "\n";
for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":rhoF123masses " << ix
<< " " << _rhoF123masses[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rhoF123widths.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":rhoF123widths " << ix << " "
<< _rhoF123widths[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rhoF5masses.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":rhoF5masses " << ix << " "
<< _rhoF5masses[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_rhoF5widths.size();++ix) {
if(ix<3) output << "newdef ";
else output << "insert ";
output << name() << ":rhoF5widths " << ix << " "
<< _rhoF5widths[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) {
if(ix<1) output << "newdef ";
else output << "insert ";
output << name() << ":KstarF123masses " << ix << " "
<< _kstarF123masses[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<_kstarF123widths.size();++ix) {
if(ix<1) output << "newdef ";
else output << "insert ";
output << name() << ":KstarF123widths " << ix << " "
<< _kstarF123widths[ix]/GeV << "\n";
}
WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
}
void TwoKaonOnePionDefaultCurrent::doinitrun() {
// set up the running a_1 width
inita1Width(0);
WeakCurrent::doinitrun();
}
void TwoKaonOnePionDefaultCurrent::doupdate() {
WeakCurrent::doupdate();
// update running width if needed
if ( !touched() ) return;
if(_maxmass!=_maxcalc) inita1Width(-1);
}
double TwoKaonOnePionDefaultCurrent::
threeBodyMatrixElement(const int , const Energy2 q2,
const Energy2 s3, const Energy2 s2,
const Energy2 s1, const Energy ,
const Energy , const Energy ) const {
Energy2 mpi2(sqr(_mpi));
Complex propb(BrhoF123(s1,-1)),propa(BrhoF123(s2,-1));
// the matrix element
Energy2 output(ZERO);
// first resonance
output += ((s1-4.*mpi2) + 0.25*(s3-s2)*(s3-s2)/q2) * real(propb*conj(propb));
// second resonance
output += ((s2-4.*mpi2) + 0.25*(s3-s1)*(s3-s1)/q2) * real(propa*conj(propa));
// the interference term
output += (0.5*q2-s3-0.5*mpi2+0.25*(s3-s2)*(s3-s1)/q2)*real(propa*conj(propb)+
propb*conj(propa));
return output/sqr(_rhoF123masses[0]);
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
TwoKaonOnePionDefaultCurrent::current(tcPDPtr resonance,
- IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
- const int imode, const int ichan, Energy & scale,
- const tPDVector & ,
- const vector<Lorentz5Momentum> & momenta,
- DecayIntegrator::MEOption) const {
+ IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
+ const int imode, const int ichan, Energy & scale,
+ const tPDVector & ,
+ const vector<Lorentz5Momentum> & momenta,
+ DecayIntegrator::MEOption) const {
// check the isospin
if(Itotal!=IsoSpin::IUnknown && Itotal!=IsoSpin::IOne)
return vector<LorentzPolarizationVectorE>();
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
return vector<LorentzPolarizationVectorE>();
break;
case IsoSpin::I3One: case IsoSpin::I3MinusOne:
break;
default:
return vector<LorentzPolarizationVectorE>();
}
}
// check the resonance
int ires1=-1;
if(resonance) {
switch(abs(resonance->id())/1000) {
case 0:
ires1=0; break;
case 100:
ires1=1; break;
case 30:
ires1=2; break;
case 10:
ires1=3; break;
default:
assert(false);
}
}
useMe();
// calculate q2,s1,s2,s3
Lorentz5Momentum q;
for(unsigned int ix=0;ix<momenta.size();++ix)
q+=momenta[ix];
q.rescaleMass();
scale=q.mass();
Energy2 q2=q.mass2();
Energy2 s1 = (momenta[1]+momenta[2]).m2();
Energy2 s2 = (momenta[0]+momenta[2]).m2();
Complex F1(0.), F2(0.), F5(0.);
Complex a1fact = ires1<0 || ires1==3 ? a1BreitWigner(q2) : 0.;
// calculate the K- pi - K+ factor
if(imode==0) {
a1fact *= sqrt(2.)/3.;
if(ichan<0) {
F1 =-a1fact*BKstarF123(s1,-1);
F2 = a1fact*BrhoF123(s2,-1);
if(ires1<0)
F5 = BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.);
else if(ires1<3)
F5 = BrhoF5(q2,ires1)*FKrho(s1,s2,-1)*sqrt(2.);
else
F5 = 0.;
}
else if(ichan%8==0) F1 =-a1fact*BKstarF123(s1,ichan/8);
else if(ichan%8==1) F2 = a1fact*BrhoF123(s2,(ichan-1)/8);
else if(ichan%8>=2) F5 = BrhoF5(q2,ichan/8)*FKrho(s1,s2,(ichan-2)%8)*sqrt(2.);
}
// calculate the K0 pi- K0bar
else if(imode==1) {
a1fact *= sqrt(2.)/3.;
if(ichan<0) {
F1 =-a1fact*BKstarF123(s1,-1);
F2 = a1fact*BrhoF123(s2,-1);
if(ires1<0)
F5 =-BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.);
else if(ires1<3)
F5 =-BrhoF5(q2,ires1)*FKrho(s1,s2,-1)*sqrt(2.);
else
F5 = 0.;
}
else if(ichan%8==0) F1 = -a1fact*BKstarF123(s1,ichan/8);
else if(ichan%8==1) F2 = a1fact*BrhoF123(s2,(ichan-1)/8);
else if(ichan%8>=2) F5 = -BrhoF5(q2,ichan/8)*FKrho(s1,s2,(ichan-2)%8)*sqrt(2.);
}
// calculate the K- pi0 k0
else if(imode==2) {
if(ichan<0) F2 =-a1fact*BrhoF123(s2,-1);
else F2 =-a1fact*BrhoF123(s2,ichan);
}
// the first three form-factors
LorentzPolarizationVectorE vect =
(F2-F1)*momenta[2] + F1*momenta[1] - F2*momenta[0];
// multiply by the transverse projection operator
Complex dot=(vect*q)/q2;
// scalar and parity violating terms
vect -= dot*q;
if(F5!=0.)
vect -= Complex(0.,1.)*F5/sqr(Constants::twopi)/sqr(_fpi)*
Helicity::epsilon(momenta[0],momenta[1],momenta[2]);
// factor to get dimensions correct
return vector<LorentzPolarizationVectorE>(1,q.mass()/_fpi*vect);
}
bool TwoKaonOnePionDefaultCurrent::accept(vector<int> id) {
int npip(0),npim(0),nkp(0),nkm(0);
int npi0(0),nk0(0),nk0bar(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
}
if ( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) return true;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) return true;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) return true;
return false;
}
unsigned int TwoKaonOnePionDefaultCurrent::decayMode(vector<int> id) {
int npip(0),npim(0),nkp(0),nkm(0);
int npi0(0),nk0(0),nk0bar(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
}
if ( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) return 0;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) return 1;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) return 2;
assert(false);
}
tPDVector TwoKaonOnePionDefaultCurrent::particles(int icharge, unsigned int imode,int,int) {
tPDVector extpart(3);
if(imode==0) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kplus);
}
else if(imode==1) {
extpart[0]=getParticleData(ParticleID::K0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kbar0);
}
else if(imode==2) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::K0);
}
// conjugate the particles if needed
if(icharge==3) {
for(unsigned int ix=0;ix<3;++ix) {
if(extpart[ix]->CC()) extpart[ix]=extpart[ix]->CC();
}
}
// return the answer
return extpart;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 5:20 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805369
Default Alt Text
(123 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment