diff --git a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc b/Decay/WeakCurrents/EtaPiPiDefaultCurrent.cc copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc copy to Decay/WeakCurrents/EtaPiPiDefaultCurrent.cc --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc +++ b/Decay/WeakCurrents/EtaPiPiDefaultCurrent.cc @@ -1,1053 +1,1252 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator +// EtaPiPiDefaultCurrent.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 ThreeMesonDefaultCurrent class. +// functions of the EtaPiPiDefaultCurrent class. // -#include "ThreeMesonDefaultCurrent.h" +#include "EtaPiPiDefaultCurrent.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" using namespace Herwig; using namespace ThePEG; -DescribeClass<ThreeMesonDefaultCurrent,ThreeMesonCurrentBase> -describeHerwigThreeMesonDefaultCurrent("Herwig::ThreeMesonDefaultCurrent", - "HwWeakCurrents.so"); -HERWIG_INTERPOLATOR_CLASSDESC(ThreeMesonDefaultCurrent,Energy,Energy2) +DescribeClass<EtaPiPiDefaultCurrent,WeakCurrent> +describeHerwigEtaPiPiDefaultCurrent("Herwig::EtaPiPiDefaultCurrent", + "HwWeakCurrents.so"); +HERWIG_INTERPOLATOR_CLASSDESC(EtaPiPiDefaultCurrent,Energy,Energy2) -ThreeMesonDefaultCurrent::ThreeMesonDefaultCurrent() { +EtaPiPiDefaultCurrent::EtaPiPiDefaultCurrent() { + // the quarks for the different modes + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + setInitialModes(12); // 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.push_back(1.0);_rhoF123wgts.push_back(-0.145); _rhoF123wgts.push_back(0.); _rhoF5wgts.push_back(-26.);_rhoF5wgts.push_back(6.5); _rhoF5wgts.push_back(1.); // the Kstar weights _kstarF123wgts.push_back(1.); _kstarF5wgts.push_back(1.); // relative rho/Kstar weights _rhoKstarwgt=-0.2; // local values of the a_1 parameters _a1parameters=true;_a1mass=1.251*GeV;_a1width=0.599*GeV; _a1opt=true; // local values of the K_1 parameters _k1parameters=true;_k1mass=1.402*GeV,_k1width=0.174*GeV; // local values of the rho parameters _rhoparameters=true; _rhoF123masses.push_back(0.773*GeV);_rhoF123masses.push_back(1.370*GeV); _rhoF123masses.push_back(1.750*GeV); _rhoF123widths.push_back(0.145*GeV);_rhoF123widths.push_back(0.510*GeV); _rhoF123widths.push_back(0.120*GeV); _rhoF5masses.push_back(0.773*GeV);_rhoF5masses.push_back(1.500*GeV); _rhoF5masses.push_back(1.750*GeV); _rhoF5widths.push_back(0.145*GeV);_rhoF5widths.push_back(0.220*GeV); _rhoF5widths.push_back(0.120*GeV); // local values for the Kstar parameters _kstarparameters=true; _kstarF123masses.push_back(0.8921*GeV); _kstarF123widths.push_back(0.0513*GeV); _kstarF5masses.push_back(0.8921*GeV); _kstarF5widths.push_back(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*GeV;}); vector<double> tmp2(a1q2in,a1q2in+200); _a1runq2.clear(); std::transform(tmp2.begin(), tmp2.end(), back_inserter(_a1runq2), [](double x){return x*GeV2;}); _maxmass=ZERO; _maxcalc=ZERO; } -void ThreeMesonDefaultCurrent::doinit() { - ThreeMesonCurrentBase::doinit(); +void EtaPiPiDefaultCurrent::doinit() { + WeakCurrent::doinit(); // the particles we will use a lot tPDPtr a1(getParticleData(ParticleID::a_1minus)), k1(getParticleData(ParticleID::Kstar_1minus)),pi0(getParticleData(ParticleID::pi0)), piplus(getParticleData(ParticleID::piplus)), piminus(getParticleData(ParticleID::piminus)); // masses for the running widths _mpi=piplus->mass(); _mK=getParticleData(ParticleID::Kminus)->mass(); // the charged rho resonances tPDPtr rhoc[3]={getParticleData(-213),getParticleData(-100213), getParticleData(-30213)}; // the charged K* resonances tPDPtr Kstarc[3]={getParticleData(-323),getParticleData(-100323), getParticleData(-30323)}; if(!_a1parameters) { _a1mass=a1->mass(); _a1width=a1->width(); } // mass and width of the k_1 if(!_k1parameters) { _k1mass=k1->mass(); _k1width=k1->width(); } // initialise the a_1 running width calculation inita1Width(-1); // rho parameters in the base classs tcPDPtr temp; unsigned int ix; if(_rhoparameters&&_rhoF123masses.size()<3) { ix = _rhoF123masses.size(); _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } // K star parameters in the base class if(_kstarparameters&&_kstarF123masses.size()<3) { ix = _kstarF123masses.size(); _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } // rho parameters here if(_rhoparameters&&_rhoF5masses.size()<3) { ix = _rhoF5masses.size(); _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } // Kstar parameters here if(_kstarparameters&&_kstarF5widths.size()<3) { ix = _kstarF5masses.size(); _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } } -void ThreeMesonDefaultCurrent::persistentOutput(PersistentOStream & os) const { +void EtaPiPiDefaultCurrent::persistentOutput(PersistentOStream & os) const { os << _rhoF123wgts << _kstarF123wgts << _rhoF5wgts << _kstarF5wgts << _rhoKstarwgt << ounit(_a1runwidth,GeV)<< ounit(_a1runq2,GeV2) << _initializea1 << ounit(_a1mass,GeV)<< ounit(_a1width,GeV)<< ounit(_k1mass,GeV) << ounit(_k1width,GeV)<< ounit(_fpi,GeV) << ounit(_mpi,GeV)<< ounit(_mK,GeV) <<_rhoparameters << ounit(_rhoF123masses,GeV) << ounit(_rhoF5masses,GeV) << ounit(_rhoF123widths,GeV) << ounit(_rhoF5widths,GeV) << _kstarparameters << ounit(_kstarF123masses,GeV) <<ounit(_kstarF5masses,GeV) << ounit(_kstarF123widths,GeV) << ounit(_kstarF5widths,GeV) << _a1parameters << _k1parameters << _a1opt << ounit(_maxmass,GeV) << ounit(_maxcalc,GeV) << _a1runinter; } -void ThreeMesonDefaultCurrent::persistentInput(PersistentIStream & is, int) { +void EtaPiPiDefaultCurrent::persistentInput(PersistentIStream & is, int) { is >> _rhoF123wgts >> _kstarF123wgts >> _rhoF5wgts >> _kstarF5wgts >> _rhoKstarwgt >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _initializea1 >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV) >> iunit(_k1mass,GeV) >> iunit(_k1width,GeV) >> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV) >>_rhoparameters >> iunit(_rhoF123masses,GeV) >> iunit(_rhoF5masses,GeV) >> iunit(_rhoF123widths,GeV) >> iunit(_rhoF5widths,GeV) >> _kstarparameters >> iunit(_kstarF123masses,GeV) >>iunit(_kstarF5masses,GeV) >> iunit(_kstarF123widths,GeV) >> iunit(_kstarF5widths,GeV) >> _a1parameters >> _k1parameters >> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter; } -void ThreeMesonDefaultCurrent::Init() { +void EtaPiPiDefaultCurrent::Init() { - static ClassDocumentation<ThreeMesonDefaultCurrent> documentation - ("The ThreeMesonDefaultCurrent class is designed to implement " + static ClassDocumentation<EtaPiPiDefaultCurrent> documentation + ("The EtaPiPiDefaultCurrent 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<ThreeMesonDefaultCurrent,double> interfaceF123RhoWgt + static ParVector<EtaPiPiDefaultCurrent,double> interfaceF123RhoWgt ("F123RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF123wgts, + &EtaPiPiDefaultCurrent::_rhoF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF123KstarWgt + static ParVector<EtaPiPiDefaultCurrent,double> interfaceF123KstarWgt ("F123KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF123wgts, + &EtaPiPiDefaultCurrent::_kstarF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5RhoWgt + static ParVector<EtaPiPiDefaultCurrent,double> interfaceF5RhoWgt ("F5RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF5wgts, + &EtaPiPiDefaultCurrent::_rhoF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5KstarWgt + static ParVector<EtaPiPiDefaultCurrent,double> interfaceF5KstarWgt ("F5KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF5wgts, + &EtaPiPiDefaultCurrent::_kstarF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,double> interfaceRhoKstarWgt + static Parameter<EtaPiPiDefaultCurrent,double> interfaceRhoKstarWgt ("RhoKstarWgt", "The relative weights of the rho and K* in the F5 form factor", - &ThreeMesonDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., + &EtaPiPiDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., false, false, false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceInitializea1 + static Switch<EtaPiPiDefaultCurrent,bool> interfaceInitializea1 ("Initializea1", "Initialise the calculation of the a_1 running width", - &ThreeMesonDefaultCurrent::_initializea1, false, false, false); + &EtaPiPiDefaultCurrent::_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<ThreeMesonDefaultCurrent,bool> interfaceRhoParameters + static Switch<EtaPiPiDefaultCurrent,bool> interfaceRhoParameters ("RhoParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_rhoparameters, true, false, false); + &EtaPiPiDefaultCurrent::_rhoparameters, true, false, false); static SwitchOption interfaceRhoParameterstrue (interfaceRhoParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceRhoParametersParticleData (interfaceRhoParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceKstarParameters + static Switch<EtaPiPiDefaultCurrent,bool> interfaceKstarParameters ("KstarParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_kstarparameters, true, false, false); + &EtaPiPiDefaultCurrent::_kstarparameters, true, false, false); static SwitchOption interfaceKstarParameterstrue (interfaceKstarParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceKstarParametersParticleData (interfaceKstarParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1Parameters + static Switch<EtaPiPiDefaultCurrent,bool> interfacea1Parameters ("a1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_a1parameters, true, false, false); + &EtaPiPiDefaultCurrent::_a1parameters, true, false, false); static SwitchOption interfacea1Parameterstrue (interfacea1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfacea1ParametersParticleData (interfacea1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceK1Parameters + static Switch<EtaPiPiDefaultCurrent,bool> interfaceK1Parameters ("K1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_k1parameters, true, false, false); + &EtaPiPiDefaultCurrent::_k1parameters, true, false, false); static SwitchOption interfaceK1Parameterstrue (interfaceK1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceK1ParametersParticleData (interfaceK1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1WidthOption + static Switch<EtaPiPiDefaultCurrent,bool> interfacea1WidthOption ("a1WidthOption", "Option for the treatment of the a1 width", - &ThreeMesonDefaultCurrent::_a1opt, true, false, false); + &EtaPiPiDefaultCurrent::_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<ThreeMesonDefaultCurrent,Energy> interfacea1RunningWidth + static ParVector<EtaPiPiDefaultCurrent,Energy> interfacea1RunningWidth ("a1RunningWidth", "The values of the a_1 width for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy2> interfacea1RunningQ2 + static ParVector<EtaPiPiDefaultCurrent,Energy2> interfacea1RunningQ2 ("a1RunningQ2", "The values of the q^2 for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, + &EtaPiPiDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Width + static Parameter<EtaPiPiDefaultCurrent,Energy> interfaceA1Width ("A1Width", "The a_1 width if using local values.", - &ThreeMesonDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Mass + static Parameter<EtaPiPiDefaultCurrent,Energy> interfaceA1Mass ("A1Mass", "The a_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Width + static Parameter<EtaPiPiDefaultCurrent,Energy> interfaceK1Width ("K1Width", "The K_1 width if using local values.", - &ThreeMesonDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Mass + static Parameter<EtaPiPiDefaultCurrent,Energy> interfaceK1Mass ("K1Mass", "The K_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, false, false, false); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123masses + static ParVector<EtaPiPiDefaultCurrent,Energy> interfacerhoF123masses ("rhoF123masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123widths + static ParVector<EtaPiPiDefaultCurrent,Energy> interfacerhoF123widths ("rhoF123widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5masses + static ParVector<EtaPiPiDefaultCurrent,Energy> interfacerhoF5masses ("rhoF5masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5widths + static ParVector<EtaPiPiDefaultCurrent,Energy> interfacerhoF5widths ("rhoF5widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123masses + static ParVector<EtaPiPiDefaultCurrent,Energy> interfaceKstarF123masses ("KstarF123masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123widths + static ParVector<EtaPiPiDefaultCurrent,Energy> interfaceKstarF123widths ("KstarF123widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5masses + static ParVector<EtaPiPiDefaultCurrent,Energy> interfaceKstarF5masses ("KstarF5masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5widths + static ParVector<EtaPiPiDefaultCurrent,Energy> interfaceKstarF5widths ("KstarF5widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &EtaPiPiDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceFPi + static Parameter<EtaPiPiDefaultCurrent,Energy> interfaceFPi ("FPi", "The pion decay constant", - &ThreeMesonDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, + &EtaPiPiDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, false, false, true); } // modes handled by this class -bool ThreeMesonDefaultCurrent::acceptMode(int imode) const { +bool EtaPiPiDefaultCurrent::acceptMode(int imode) const { return imode>=0&&imode<=8; } // calculate the form-factors -ThreeMesonDefaultCurrent::FormFactors -ThreeMesonDefaultCurrent::calculateFormFactors(const int ichan, const int imode, +EtaPiPiDefaultCurrent::FormFactors +EtaPiPiDefaultCurrent::calculateFormFactors(const int ichan, const int imode, Energy2 q2, Energy2 s1, Energy2 s2, Energy2 s3) const { useMe(); Complex F1, F2, F3, F4, F5; F1 = F2 = F3 = F4 = F5 = 0.0; // calculate the pi- pi- pi+ factor if(imode==0) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1= a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the pi0 pi0 pi- factor else if(imode==1) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1 = a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the K- pi - K+ factor else if(imode==2) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 = BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==3) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 =-BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==4) { Complex a1fact(a1BreitWigner(q2)); if(ichan<0){F2 =-a1fact*BrhoF123(s2,-1);} else{F2 =-a1fact*BrhoF123(s2,ichan);} } // calculate the pi0 pi0 K- else if(imode==5) { Complex K1fact(K1BreitWigner(q2)/6.); if(ichan<0) { F1 = K1fact*BKstarF123(s1,-1); F2 =-K1fact*BKstarF123(s2,-1); } else if(ichan%2==0) F1 = K1fact*BKstarF123(s1,ichan/2); else F2 =-K1fact*BKstarF123(s2,(ichan-1)/2); } // calculate the K- pi- pi+ else if(imode==6) { Complex K1fact(K1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-K1fact*BrhoF123(s1,-1); F2 = K1fact*BKstarF123(s2,-1); F5 =-BKstarF123(q2,-1)*FKrho(s2,s1,-1)*sqrt(2.); } else if(ichan%8==0) F1 =-K1fact*BrhoF123(s1,ichan/8); else if(ichan%8==1) F2 = K1fact*BKstarF123(s2,(ichan-1)/8); else F5 = -BKstarF123(q2,ichan/8)*FKrho(s2,s1,(ichan-2)%8)*sqrt(2.); } // calculate the pi- K0bar pi0 else if(imode==7) { Complex K1fact(K1BreitWigner(q2)); if(ichan<0) { F2 =-K1fact*BrhoF123(s2,-1); F5 =-2.*BKstarF123(q2,-1)*FKrho(s1,s2,-1); } else if(ichan%7==0) F2 =-K1fact*BrhoF123(s2,ichan/7); else F5 =-2.*BKstarF123(q2,ichan/7)*FKrho(s1,s2,(ichan-1)%7); } // calculate the pi- pi0 eta else if(imode==8) { if(ichan<0) F5 = BrhoF5(q2, -1)*BrhoF123(s3, -1)*sqrt(2./3.); else F5 = BrhoF5(q2,ichan/3)*BrhoF123(s3,ichan%3)*sqrt(2./3.); } // multiply by the prefactors using Constants::twopi; return FormFactors(F1/_fpi, F2/_fpi, F3/_fpi, F4/_fpi, -F5/sqr(twopi)/pow<3,1>(_fpi) ); } // complete the construction of the decay mode for integration -bool ThreeMesonDefaultCurrent::createMode(int icharge, tcPDPtr resonance, +bool EtaPiPiDefaultCurrent::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 ) { int iq(0),ia(0); if(!acceptMode(imode)) return false; 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,k1; if(icharge==-3) { a1=getParticleData(ParticleID::a_1minus); k1=getParticleData(ParticleID::Kstar_1minus); } else if(icharge==3) { a1=getParticleData(ParticleID::a_1plus); k1=getParticleData(ParticleID::Kstar_1plus); } else { return false; } _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 pi- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rho0[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)); } } else if(imode==1) { // channels for pi0 pi0 pi- for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rhoc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==2) { // channels for K- pi- K+ for(unsigned int ix=0;ix<3;++ix) { if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstar0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==3) { // channels for K0 pi- K0bar for(unsigned int ix=0;ix<3;++ix) { if(Kstarc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstarc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstarc[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==4) { // channels for K- pi0 K0 for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==5) { // channels for pi0 pi0 K- for(unsigned int ix=0;ix<3;++ix) { if(!Kstarc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstarc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==6) { // channels for K- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(rho0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,rho0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstar0[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(rho0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,Kstar0[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==7) { // channels for pi- kbar0 pi0 for(unsigned int ix=0;ix<3;++ix) { if(rhoc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rhoc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,rhoc[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==8) { // channels for pi- pi0 eta for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; for(unsigned int iy=0;iy<3;++iy) { if(!rho0[iy]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } } } if(_rhoparameters) { if(imode!=8) { for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF123masses[ix], _rhoF123widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF123masses[ix], _rhoF123widths[ix]); } } else { for(unsigned int ix=0;ix<_rhoF5masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF5masses[ix], _rhoF5widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF5masses[ix], _rhoF5widths[ix]); } } } // K star parameters in the base class if(_kstarparameters) { for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) { if(Kstarc[ix]) mode->resetIntermediate(Kstarc[ix],_kstarF123masses[ix], _kstarF123widths[ix]); if(Kstar0[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 ThreeMesonDefaultCurrent::inita1Width(int iopt) { +void EtaPiPiDefaultCurrent::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<ThreeMesonDefaultCurrent> + ThreeBodyAllOnCalculator<EtaPiPiDefaultCurrent> 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 ThreeMesonDefaultCurrent::dataBaseOutput(ofstream & output,bool header, +void EtaPiPiDefaultCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; - if(create) output << "create Herwig::ThreeMesonDefaultCurrent " + if(create) output << "create Herwig::EtaPiPiDefaultCurrent " << 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"; } for(unsigned int ix=0;ix<_kstarF5wgts.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":F5KstarWeight " << ix << " " << _kstarF5wgts[ix] << "\n"; } output << "newdef " << name() << ":RhoKstarWgt " << _rhoKstarwgt << "\n"; output << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n"; output << "newdef " << name() << ":RhoParameters " << _rhoparameters << "\n"; output << "newdef " << name() << ":KstarParameters " << _kstarparameters << "\n"; output << "newdef " << name() << ":a1Parameters " << _a1parameters << "\n"; output << "newdef " << name() << ":K1Parameters " << _k1parameters << "\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() << ":K1Width " << _k1width/GeV << "\n"; output << "newdef " << name() << ":K1Mass " << _k1mass/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"; } for(unsigned int ix=0;ix<_kstarF5masses.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5masses " << ix << " " << _kstarF5masses[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<_kstarF5widths.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5widths " << ix << " " << _kstarF5widths[ix]/GeV << "\n"; } - ThreeMesonCurrentBase::dataBaseOutput(output,false,false); + WeakCurrent::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } -void ThreeMesonDefaultCurrent::doinitrun() { +void EtaPiPiDefaultCurrent::doinitrun() { // set up the running a_1 width inita1Width(0); - ThreeMesonCurrentBase::doinitrun(); + WeakCurrent::doinitrun(); } -void ThreeMesonDefaultCurrent::doupdate() { - ThreeMesonCurrentBase::doupdate(); +void EtaPiPiDefaultCurrent::doupdate() { + WeakCurrent::doupdate(); // update running width if needed if ( !touched() ) return; if(_maxmass!=_maxcalc) inita1Width(-1); } -Complex ThreeMesonDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, +Complex EtaPiPiDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, unsigned int ires) const { Energy q(sqrt(q2)),mass,width,mout[2]={_mpi,_mpi}; // get the mass and width of the requested resonance if(itype==0) { mass=_rhoF123masses[ires]; width=_rhoF123widths[ires]; } else if(itype==1) { mass=_rhoF5masses[ires]; width=_rhoF5widths[ires]; } else if(itype==2) { mass=_kstarF123masses[ires]; width=_kstarF123widths[ires]; } else if(itype==3) { mass=_kstarF5masses[ires]; width=_kstarF5widths[ires]; } else { return 0.; } // calculate the momenta for the running widths if(itype>1) mout[0]=_mK; Energy pcm0(Kinematics::pstarTwoBodyDecay(mass,mout[0],mout[1])); Energy pcm(ZERO); if(mout[0]+mout[1]<q){pcm=Kinematics::pstarTwoBodyDecay(q,mout[0],mout[1]);} double ratio = Math::Pow<3>(pcm/pcm0); Energy gamrun(width*mass*ratio/q); Complex ii(0.,1.); complex<Energy2> denom(q2-mass*mass+ii*mass*gamrun), numer(-mass*mass); return numer/denom; } -double ThreeMesonDefaultCurrent:: +double EtaPiPiDefaultCurrent:: 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> +EtaPiPiDefaultCurrent::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 { + // 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);} + // 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]; + // multiply by the transverse projection operator + complex<InvEnergy> 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]); + // factor to get dimensions correct + return vector<LorentzPolarizationVectorE>(1,q.mass()*vect); +} + +bool EtaPiPiDefaultCurrent::accept(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode==-1 ? false : acceptMode(imode); +} + +unsigned int EtaPiPiDefaultCurrent::decayMode(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode; +} + +tPDVector EtaPiPiDefaultCurrent::particles(int icharge, unsigned int imode,int,int) { + tPDVector extpart(3); + if(imode==0) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==1) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::piminus); + } + else if(imode==2) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kplus); + } + else if(imode==3) { + extpart[0]=getParticleData(ParticleID::K0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kbar0); + } + else if(imode==4) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::K0); + } + else if(imode==5) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::Kminus); + } + else if(imode==6) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==7) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::Kbar0); + extpart[2]=getParticleData(ParticleID::pi0); + } + else if(imode==8) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::eta); + } + else if(imode==9) { + extpart[0]=getParticleData(ParticleID::K_S0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_S0); + } + else if(imode==10) { + extpart[0]=getParticleData(ParticleID::K_L0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_L0); + } + else if(imode==11) { + 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/ThreeMesonDefaultCurrent.h b/Decay/WeakCurrents/EtaPiPiDefaultCurrent.h copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.h copy to Decay/WeakCurrents/EtaPiPiDefaultCurrent.h --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.h +++ b/Decay/WeakCurrents/EtaPiPiDefaultCurrent.h @@ -1,534 +1,632 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator +// EtaPiPiDefaultCurrent.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_ThreeMesonDefaultCurrent_H -#define HERWIG_ThreeMesonDefaultCurrent_H +#ifndef HERWIG_EtaPiPiDefaultCurrent_H +#define HERWIG_EtaPiPiDefaultCurrent_H // -// This is the declaration of the ThreeMesonDefaultCurrent class. +// This is the declaration of the EtaPiPiDefaultCurrent class. // -#include "ThreeMesonCurrentBase.h" +#include "WeakCurrent.h" #include "Herwig/Utilities/Interpolator.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/ResonanceHelpers.h" namespace Herwig { using namespace ThePEG; /** \ingroup Decay * - * The ThreeMesonDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), + * The EtaPiPiDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), * this paper uses the form from Z.Phys.C48:445 (1990) for the \f$a_1\f$ width and * is the default model in TAUOLA. * * The following three meson modes are implemented. * * - \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) * * using the currents from TAUOLA * * - * @see ThreeMesonCurrentBase, + * @see WeakCurrent, * @see WeakCurrent. * @see Defaulta1MatrixElement * */ -class ThreeMesonDefaultCurrent: public ThreeMesonCurrentBase { +class EtaPiPiDefaultCurrent: public WeakCurrent { /** * The matrix element for the running \f$a_1\f$ width is a friend to * keep some members private. */ friend class Defaulta1MatrixElement; public: /** * Default constructor */ - ThreeMesonDefaultCurrent(); + EtaPiPiDefaultCurrent(); + + /** + * 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); + +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); //@} /** * Standard Init function used to initialize the interfaces. */ static void Init(); public: /** @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 ); //@} /** * 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) {} + }; + protected: /** * Can the current handle a particular set of mesons. * As this current includes all the allowed modes this is always true. */ virtual bool acceptMode(int) const; /** * 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; protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const {return new_ptr(*this);} /** 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 {return new_ptr(*this);} //@} 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: /** * Private and non-existent assignment operator. */ - ThreeMesonDefaultCurrent & operator=(const ThreeMesonDefaultCurrent &); + EtaPiPiDefaultCurrent & operator=(const EtaPiPiDefaultCurrent &); private: /** * The \f$\rho\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { norm+=_rhoF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { output+=_rhoF123wgts[ix]*rhoKBreitWigner(q2,0,ix); } } else { unsigned int temp(ires); if(temp<_rhoF123wgts.size()&&temp<3) output=_rhoF123wgts[temp]*rhoKBreitWigner(q2,0,temp); else output=0.; } return output/norm; } /** * The \f$\rho\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { norm+=_rhoF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { output+=_rhoF5wgts[ix]*rhoKBreitWigner(q2,1,ix); } } else { unsigned int temp(ires); if(temp<_rhoF5wgts.size()&&temp<3) { output=_rhoF5wgts[temp]*rhoKBreitWigner(q2,1,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { norm+=_kstarF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { output+=_kstarF123wgts[ix]*rhoKBreitWigner(q2,2,ix); } } else { unsigned int temp(ires); if(temp<_kstarF123wgts.size()&&temp<3) { output=_kstarF123wgts[temp]*rhoKBreitWigner(q2,2,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { norm+=_kstarF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { output+=_kstarF5wgts[ix]*rhoKBreitWigner(q2,3,ix); } } else { unsigned int temp(ires); if(temp<_kstarF5wgts.size()&&temp<3) { output=_kstarF5wgts[ires]*rhoKBreitWigner(q2,3,temp); } } return output/norm; } /** * Mixed Breit Wigner for the \f$F_5\f$ form factor * @param si The scale \f$s_1\f$. * @param sj The scale \f$s_2\f$. * @param ires Which resonances to use * @return The mixed Breit-Wigner */ Complex FKrho(Energy2 si,Energy2 sj,int ires) const { Complex output; if(ires<0){output = _rhoKstarwgt*BKstarF123(si,-1)+BrhoF123(sj,-1);} else if(ires%2==0){output= _rhoKstarwgt*BKstarF123(si,ires/2);} else if(ires%2==1){output=BrhoF123(sj,ires/2);} output /=(1.+_rhoKstarwgt); return output; } /** * \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 { if(!_a1opt) return Resonance::BreitWignera1(q2,_a1mass,_a1width); Complex ii(0.,1.); Energy2 m2(_a1mass*_a1mass); Energy q(sqrt(q2)); Energy width = (*_a1runinter)(q2); return m2/(m2-q2-ii*q*width); } /** * The \f$K_1\f$ Breit-Wigner * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @return The Breit-Wigner */ Complex K1BreitWigner(Energy2 q2) const { Energy2 m2 = sqr(_k1mass); Complex ii(0.,1.); complex<Energy2> fact(m2 - ii*_k1mass*_k1width); return fact/(fact-q2); } /** * Initialize the \f$a_1\f$ running width * @param iopt Initialization option (-1 full calculation, 0 set up the interpolation) */ void inita1Width(int iopt); /** * Breit-Wigners for the \f$\rho\f$ and \f$K^*\f$. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner. * @param itype The type of Breit-Wigner, \e i.e. which masses and widths to use.x * @param ires Which multiplet to use. */ Complex rhoKBreitWigner(Energy2 q2,unsigned int itype,unsigned int ires) const; private: /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _rhoF123wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _kstarF123wgts; /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _rhoF5wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _kstarF5wgts; /** * The relative weight of the \f$\rho\f$ and \f$K^*\f$ where needed. */ double _rhoKstarwgt; /** * 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; /** * Initialize the running \f$a_1\f$ width. */ bool _initializea1; /** * The mass of the \f$a_1\f$ resonances. */ Energy _a1mass; /** * The width of the \f$a_1\f$ resonances. */ Energy _a1width; /** * The mass of the \f$aK1\f$ resonances. */ Energy _k1mass; /** * The width of the \f$K_1\f$ resonances. */ Energy _k1width; /** * The pion decay constant, \f$f_\pi\f$. */ Energy _fpi; /** * The pion mass */ Energy _mpi; /** * The kaon mass */ Energy _mK; /** * use local values of the \f$\rho\f$ masses and widths */ bool _rhoparameters; /** * The \f$\rho\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123masses; /** * The \f$\rho\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5masses; /** * The \f$\rho\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123widths; /** * The \f$\rho\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5widths; /** * use local values of the \f$K^*\f$ resonances masses and widths */ bool _kstarparameters; /** * The \f$K^*\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123masses; /** * The \f$K^*\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5masses; /** * The \f$K^*\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123widths; /** * The \f$K^*\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5widths; /** * Use local values of the \f$a_1\f$ parameters */ bool _a1parameters; /** * Use local values of the \f$K_1\f$ parameters */ bool _k1parameters; /** * 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 /* THEPEG_ThreeMesonDefaultCurrent_H */ +#endif /* HERWIG_EtaPiPiDefaultCurrent_H */ diff --git a/Decay/WeakCurrents/Makefile.am b/Decay/WeakCurrents/Makefile.am --- a/Decay/WeakCurrents/Makefile.am +++ b/Decay/WeakCurrents/Makefile.am @@ -1,48 +1,56 @@ BUILT_SOURCES = WeakCurrents__all.cc CLEANFILES = WeakCurrents__all.cc WeakCurrents__all.cc : $(DIR_H_FILES) $(DIR_CC_FILES) Makefile @echo "Concatenating .cc files into $@" @$(top_srcdir)/cat_with_cpplines $(DIR_CC_FILES) > $@ EXTRA_DIST = $(ALL_H_FILES) $(ALL_CC_FILES) DIR_H_FILES = $(addprefix $(srcdir)/,$(ALL_H_FILES)) ALL_H_FILES = \ FourPionNovosibirskCurrent.h \ ScalarMesonCurrent.h\ ThreeMesonCurrentBase.h \ ThreeMesonDefaultCurrent.h\ +ThreePionDefaultCurrent.h\ +OneKaonTwoPionDefaultCurrent.h \ +TwoKaonOnePionDefaultCurrent.h \ +EtaPiPiDefaultCurrent.h \ ThreePionCLEOCurrent.h\ TwoPionRhoCurrent.h\ KPiKStarCurrent.h\ TwoPionPhotonCurrent.h\ VectorMesonCurrent.h\ FivePionCurrent.h \ KPiCurrent.h\ KaonThreeMesonCurrent.h\ TwoPionCzyzCurrent.h\ TwoKaonCzyzCurrent.h\ ThreePionCzyzCurrent.h\ FourPionCzyzCurrent.h\ EtaPiPiCurrent.h DIR_CC_FILES = $(addprefix $(srcdir)/,$(ALL_CC_FILES)) ALL_CC_FILES = \ FourPionNovosibirskCurrent.cc \ ScalarMesonCurrent.cc \ ThreeMesonCurrentBase.cc \ ThreeMesonDefaultCurrent.cc \ +ThreePionDefaultCurrent.cc \ +OneKaonTwoPionDefaultCurrent.cc \ +TwoKaonOnePionDefaultCurrent.cc \ +EtaPiPiDefaultCurrent.cc \ ThreePionCLEOCurrent.cc \ TwoPionRhoCurrent.cc \ KPiKStarCurrent.cc \ TwoPionPhotonCurrent.cc \ VectorMesonCurrent.cc \ FivePionCurrent.cc \ KPiCurrent.cc \ KaonThreeMesonCurrent.cc \ TwoPionCzyzCurrent.cc \ TwoKaonCzyzCurrent.cc \ ThreePionCzyzCurrent.cc \ FourPionCzyzCurrent.cc\ EtaPiPiCurrent.cc diff --git a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc b/Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.cc copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc copy to Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.cc --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc +++ b/Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.cc @@ -1,1053 +1,1252 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator +// OneKaonTwoPionDefaultCurrent.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 ThreeMesonDefaultCurrent class. +// functions of the OneKaonTwoPionDefaultCurrent class. // -#include "ThreeMesonDefaultCurrent.h" +#include "OneKaonTwoPionDefaultCurrent.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" using namespace Herwig; using namespace ThePEG; -DescribeClass<ThreeMesonDefaultCurrent,ThreeMesonCurrentBase> -describeHerwigThreeMesonDefaultCurrent("Herwig::ThreeMesonDefaultCurrent", +DescribeClass<OneKaonTwoPionDefaultCurrent,WeakCurrent> +describeHerwigOneKaonTwoPionDefaultCurrent("Herwig::OneKaonTwoPionDefaultCurrent", "HwWeakCurrents.so"); -HERWIG_INTERPOLATOR_CLASSDESC(ThreeMesonDefaultCurrent,Energy,Energy2) +HERWIG_INTERPOLATOR_CLASSDESC(OneKaonTwoPionDefaultCurrent,Energy,Energy2) -ThreeMesonDefaultCurrent::ThreeMesonDefaultCurrent() { +OneKaonTwoPionDefaultCurrent::OneKaonTwoPionDefaultCurrent() { + // the quarks for the different modes + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + setInitialModes(12); // 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.push_back(1.0);_rhoF123wgts.push_back(-0.145); _rhoF123wgts.push_back(0.); _rhoF5wgts.push_back(-26.);_rhoF5wgts.push_back(6.5); _rhoF5wgts.push_back(1.); // the Kstar weights _kstarF123wgts.push_back(1.); _kstarF5wgts.push_back(1.); // relative rho/Kstar weights _rhoKstarwgt=-0.2; // local values of the a_1 parameters _a1parameters=true;_a1mass=1.251*GeV;_a1width=0.599*GeV; _a1opt=true; // local values of the K_1 parameters _k1parameters=true;_k1mass=1.402*GeV,_k1width=0.174*GeV; // local values of the rho parameters _rhoparameters=true; _rhoF123masses.push_back(0.773*GeV);_rhoF123masses.push_back(1.370*GeV); _rhoF123masses.push_back(1.750*GeV); _rhoF123widths.push_back(0.145*GeV);_rhoF123widths.push_back(0.510*GeV); _rhoF123widths.push_back(0.120*GeV); _rhoF5masses.push_back(0.773*GeV);_rhoF5masses.push_back(1.500*GeV); _rhoF5masses.push_back(1.750*GeV); _rhoF5widths.push_back(0.145*GeV);_rhoF5widths.push_back(0.220*GeV); _rhoF5widths.push_back(0.120*GeV); // local values for the Kstar parameters _kstarparameters=true; _kstarF123masses.push_back(0.8921*GeV); _kstarF123widths.push_back(0.0513*GeV); _kstarF5masses.push_back(0.8921*GeV); _kstarF5widths.push_back(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*GeV;}); vector<double> tmp2(a1q2in,a1q2in+200); _a1runq2.clear(); std::transform(tmp2.begin(), tmp2.end(), back_inserter(_a1runq2), [](double x){return x*GeV2;}); _maxmass=ZERO; _maxcalc=ZERO; } -void ThreeMesonDefaultCurrent::doinit() { - ThreeMesonCurrentBase::doinit(); +void OneKaonTwoPionDefaultCurrent::doinit() { + WeakCurrent::doinit(); // the particles we will use a lot tPDPtr a1(getParticleData(ParticleID::a_1minus)), k1(getParticleData(ParticleID::Kstar_1minus)),pi0(getParticleData(ParticleID::pi0)), piplus(getParticleData(ParticleID::piplus)), piminus(getParticleData(ParticleID::piminus)); // masses for the running widths _mpi=piplus->mass(); _mK=getParticleData(ParticleID::Kminus)->mass(); // the charged rho resonances tPDPtr rhoc[3]={getParticleData(-213),getParticleData(-100213), getParticleData(-30213)}; // the charged K* resonances tPDPtr Kstarc[3]={getParticleData(-323),getParticleData(-100323), getParticleData(-30323)}; if(!_a1parameters) { _a1mass=a1->mass(); _a1width=a1->width(); } // mass and width of the k_1 if(!_k1parameters) { _k1mass=k1->mass(); _k1width=k1->width(); } // initialise the a_1 running width calculation inita1Width(-1); // rho parameters in the base classs tcPDPtr temp; unsigned int ix; if(_rhoparameters&&_rhoF123masses.size()<3) { ix = _rhoF123masses.size(); _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } // K star parameters in the base class if(_kstarparameters&&_kstarF123masses.size()<3) { ix = _kstarF123masses.size(); _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } // rho parameters here if(_rhoparameters&&_rhoF5masses.size()<3) { ix = _rhoF5masses.size(); _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } // Kstar parameters here if(_kstarparameters&&_kstarF5widths.size()<3) { ix = _kstarF5masses.size(); _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } } -void ThreeMesonDefaultCurrent::persistentOutput(PersistentOStream & os) const { +void OneKaonTwoPionDefaultCurrent::persistentOutput(PersistentOStream & os) const { os << _rhoF123wgts << _kstarF123wgts << _rhoF5wgts << _kstarF5wgts << _rhoKstarwgt << ounit(_a1runwidth,GeV)<< ounit(_a1runq2,GeV2) << _initializea1 << ounit(_a1mass,GeV)<< ounit(_a1width,GeV)<< ounit(_k1mass,GeV) << ounit(_k1width,GeV)<< ounit(_fpi,GeV) << ounit(_mpi,GeV)<< ounit(_mK,GeV) <<_rhoparameters << ounit(_rhoF123masses,GeV) << ounit(_rhoF5masses,GeV) << ounit(_rhoF123widths,GeV) << ounit(_rhoF5widths,GeV) << _kstarparameters << ounit(_kstarF123masses,GeV) <<ounit(_kstarF5masses,GeV) << ounit(_kstarF123widths,GeV) << ounit(_kstarF5widths,GeV) << _a1parameters << _k1parameters << _a1opt << ounit(_maxmass,GeV) << ounit(_maxcalc,GeV) << _a1runinter; } -void ThreeMesonDefaultCurrent::persistentInput(PersistentIStream & is, int) { +void OneKaonTwoPionDefaultCurrent::persistentInput(PersistentIStream & is, int) { is >> _rhoF123wgts >> _kstarF123wgts >> _rhoF5wgts >> _kstarF5wgts >> _rhoKstarwgt >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _initializea1 >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV) >> iunit(_k1mass,GeV) >> iunit(_k1width,GeV) >> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV) >>_rhoparameters >> iunit(_rhoF123masses,GeV) >> iunit(_rhoF5masses,GeV) >> iunit(_rhoF123widths,GeV) >> iunit(_rhoF5widths,GeV) >> _kstarparameters >> iunit(_kstarF123masses,GeV) >>iunit(_kstarF5masses,GeV) >> iunit(_kstarF123widths,GeV) >> iunit(_kstarF5widths,GeV) >> _a1parameters >> _k1parameters >> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter; } -void ThreeMesonDefaultCurrent::Init() { +void OneKaonTwoPionDefaultCurrent::Init() { - static ClassDocumentation<ThreeMesonDefaultCurrent> documentation - ("The ThreeMesonDefaultCurrent class is designed to implement " + static ClassDocumentation<OneKaonTwoPionDefaultCurrent> documentation + ("The OneKaonTwoPionDefaultCurrent 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<ThreeMesonDefaultCurrent,double> interfaceF123RhoWgt + static ParVector<OneKaonTwoPionDefaultCurrent,double> interfaceF123RhoWgt ("F123RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF123wgts, + &OneKaonTwoPionDefaultCurrent::_rhoF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF123KstarWgt + static ParVector<OneKaonTwoPionDefaultCurrent,double> interfaceF123KstarWgt ("F123KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF123wgts, + &OneKaonTwoPionDefaultCurrent::_kstarF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5RhoWgt + static ParVector<OneKaonTwoPionDefaultCurrent,double> interfaceF5RhoWgt ("F5RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF5wgts, + &OneKaonTwoPionDefaultCurrent::_rhoF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5KstarWgt + static ParVector<OneKaonTwoPionDefaultCurrent,double> interfaceF5KstarWgt ("F5KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF5wgts, + &OneKaonTwoPionDefaultCurrent::_kstarF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,double> interfaceRhoKstarWgt + static Parameter<OneKaonTwoPionDefaultCurrent,double> interfaceRhoKstarWgt ("RhoKstarWgt", "The relative weights of the rho and K* in the F5 form factor", - &ThreeMesonDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., + &OneKaonTwoPionDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., false, false, false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceInitializea1 + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfaceInitializea1 ("Initializea1", "Initialise the calculation of the a_1 running width", - &ThreeMesonDefaultCurrent::_initializea1, false, false, false); + &OneKaonTwoPionDefaultCurrent::_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<ThreeMesonDefaultCurrent,bool> interfaceRhoParameters + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfaceRhoParameters ("RhoParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_rhoparameters, true, false, false); + &OneKaonTwoPionDefaultCurrent::_rhoparameters, true, false, false); static SwitchOption interfaceRhoParameterstrue (interfaceRhoParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceRhoParametersParticleData (interfaceRhoParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceKstarParameters + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfaceKstarParameters ("KstarParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_kstarparameters, true, false, false); + &OneKaonTwoPionDefaultCurrent::_kstarparameters, true, false, false); static SwitchOption interfaceKstarParameterstrue (interfaceKstarParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceKstarParametersParticleData (interfaceKstarParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1Parameters + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfacea1Parameters ("a1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_a1parameters, true, false, false); + &OneKaonTwoPionDefaultCurrent::_a1parameters, true, false, false); static SwitchOption interfacea1Parameterstrue (interfacea1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfacea1ParametersParticleData (interfacea1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceK1Parameters + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfaceK1Parameters ("K1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_k1parameters, true, false, false); + &OneKaonTwoPionDefaultCurrent::_k1parameters, true, false, false); static SwitchOption interfaceK1Parameterstrue (interfaceK1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceK1ParametersParticleData (interfaceK1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1WidthOption + static Switch<OneKaonTwoPionDefaultCurrent,bool> interfacea1WidthOption ("a1WidthOption", "Option for the treatment of the a1 width", - &ThreeMesonDefaultCurrent::_a1opt, true, false, false); + &OneKaonTwoPionDefaultCurrent::_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<ThreeMesonDefaultCurrent,Energy> interfacea1RunningWidth + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfacea1RunningWidth ("a1RunningWidth", "The values of the a_1 width for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy2> interfacea1RunningQ2 + static ParVector<OneKaonTwoPionDefaultCurrent,Energy2> interfacea1RunningQ2 ("a1RunningQ2", "The values of the q^2 for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, + &OneKaonTwoPionDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Width + static Parameter<OneKaonTwoPionDefaultCurrent,Energy> interfaceA1Width ("A1Width", "The a_1 width if using local values.", - &ThreeMesonDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Mass + static Parameter<OneKaonTwoPionDefaultCurrent,Energy> interfaceA1Mass ("A1Mass", "The a_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Width + static Parameter<OneKaonTwoPionDefaultCurrent,Energy> interfaceK1Width ("K1Width", "The K_1 width if using local values.", - &ThreeMesonDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Mass + static Parameter<OneKaonTwoPionDefaultCurrent,Energy> interfaceK1Mass ("K1Mass", "The K_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, false, false, false); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123masses + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfacerhoF123masses ("rhoF123masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123widths + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfacerhoF123widths ("rhoF123widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5masses + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfacerhoF5masses ("rhoF5masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5widths + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfacerhoF5widths ("rhoF5widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123masses + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfaceKstarF123masses ("KstarF123masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123widths + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfaceKstarF123widths ("KstarF123widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5masses + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfaceKstarF5masses ("KstarF5masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5widths + static ParVector<OneKaonTwoPionDefaultCurrent,Energy> interfaceKstarF5widths ("KstarF5widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &OneKaonTwoPionDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceFPi + static Parameter<OneKaonTwoPionDefaultCurrent,Energy> interfaceFPi ("FPi", "The pion decay constant", - &ThreeMesonDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, + &OneKaonTwoPionDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, false, false, true); } // modes handled by this class -bool ThreeMesonDefaultCurrent::acceptMode(int imode) const { +bool OneKaonTwoPionDefaultCurrent::acceptMode(int imode) const { return imode>=0&&imode<=8; } // calculate the form-factors -ThreeMesonDefaultCurrent::FormFactors -ThreeMesonDefaultCurrent::calculateFormFactors(const int ichan, const int imode, +OneKaonTwoPionDefaultCurrent::FormFactors +OneKaonTwoPionDefaultCurrent::calculateFormFactors(const int ichan, const int imode, Energy2 q2, Energy2 s1, Energy2 s2, Energy2 s3) const { useMe(); Complex F1, F2, F3, F4, F5; F1 = F2 = F3 = F4 = F5 = 0.0; // calculate the pi- pi- pi+ factor if(imode==0) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1= a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the pi0 pi0 pi- factor else if(imode==1) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1 = a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the K- pi - K+ factor else if(imode==2) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 = BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==3) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 =-BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==4) { Complex a1fact(a1BreitWigner(q2)); if(ichan<0){F2 =-a1fact*BrhoF123(s2,-1);} else{F2 =-a1fact*BrhoF123(s2,ichan);} } // calculate the pi0 pi0 K- else if(imode==5) { Complex K1fact(K1BreitWigner(q2)/6.); if(ichan<0) { F1 = K1fact*BKstarF123(s1,-1); F2 =-K1fact*BKstarF123(s2,-1); } else if(ichan%2==0) F1 = K1fact*BKstarF123(s1,ichan/2); else F2 =-K1fact*BKstarF123(s2,(ichan-1)/2); } // calculate the K- pi- pi+ else if(imode==6) { Complex K1fact(K1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-K1fact*BrhoF123(s1,-1); F2 = K1fact*BKstarF123(s2,-1); F5 =-BKstarF123(q2,-1)*FKrho(s2,s1,-1)*sqrt(2.); } else if(ichan%8==0) F1 =-K1fact*BrhoF123(s1,ichan/8); else if(ichan%8==1) F2 = K1fact*BKstarF123(s2,(ichan-1)/8); else F5 = -BKstarF123(q2,ichan/8)*FKrho(s2,s1,(ichan-2)%8)*sqrt(2.); } // calculate the pi- K0bar pi0 else if(imode==7) { Complex K1fact(K1BreitWigner(q2)); if(ichan<0) { F2 =-K1fact*BrhoF123(s2,-1); F5 =-2.*BKstarF123(q2,-1)*FKrho(s1,s2,-1); } else if(ichan%7==0) F2 =-K1fact*BrhoF123(s2,ichan/7); else F5 =-2.*BKstarF123(q2,ichan/7)*FKrho(s1,s2,(ichan-1)%7); } // calculate the pi- pi0 eta else if(imode==8) { if(ichan<0) F5 = BrhoF5(q2, -1)*BrhoF123(s3, -1)*sqrt(2./3.); else F5 = BrhoF5(q2,ichan/3)*BrhoF123(s3,ichan%3)*sqrt(2./3.); } // multiply by the prefactors using Constants::twopi; return FormFactors(F1/_fpi, F2/_fpi, F3/_fpi, F4/_fpi, -F5/sqr(twopi)/pow<3,1>(_fpi) ); } // complete the construction of the decay mode for integration -bool ThreeMesonDefaultCurrent::createMode(int icharge, tcPDPtr resonance, +bool OneKaonTwoPionDefaultCurrent::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 ) { int iq(0),ia(0); if(!acceptMode(imode)) return false; 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,k1; if(icharge==-3) { a1=getParticleData(ParticleID::a_1minus); k1=getParticleData(ParticleID::Kstar_1minus); } else if(icharge==3) { a1=getParticleData(ParticleID::a_1plus); k1=getParticleData(ParticleID::Kstar_1plus); } else { return false; } _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 pi- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rho0[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)); } } else if(imode==1) { // channels for pi0 pi0 pi- for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rhoc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==2) { // channels for K- pi- K+ for(unsigned int ix=0;ix<3;++ix) { if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstar0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==3) { // channels for K0 pi- K0bar for(unsigned int ix=0;ix<3;++ix) { if(Kstarc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstarc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstarc[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==4) { // channels for K- pi0 K0 for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==5) { // channels for pi0 pi0 K- for(unsigned int ix=0;ix<3;++ix) { if(!Kstarc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstarc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==6) { // channels for K- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(rho0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,rho0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstar0[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(rho0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,Kstar0[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==7) { // channels for pi- kbar0 pi0 for(unsigned int ix=0;ix<3;++ix) { if(rhoc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rhoc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,rhoc[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==8) { // channels for pi- pi0 eta for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; for(unsigned int iy=0;iy<3;++iy) { if(!rho0[iy]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } } } if(_rhoparameters) { if(imode!=8) { for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF123masses[ix], _rhoF123widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF123masses[ix], _rhoF123widths[ix]); } } else { for(unsigned int ix=0;ix<_rhoF5masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF5masses[ix], _rhoF5widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF5masses[ix], _rhoF5widths[ix]); } } } // K star parameters in the base class if(_kstarparameters) { for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) { if(Kstarc[ix]) mode->resetIntermediate(Kstarc[ix],_kstarF123masses[ix], _kstarF123widths[ix]); if(Kstar0[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 ThreeMesonDefaultCurrent::inita1Width(int iopt) { +void OneKaonTwoPionDefaultCurrent::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<ThreeMesonDefaultCurrent> + ThreeBodyAllOnCalculator<OneKaonTwoPionDefaultCurrent> 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 ThreeMesonDefaultCurrent::dataBaseOutput(ofstream & output,bool header, +void OneKaonTwoPionDefaultCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; - if(create) output << "create Herwig::ThreeMesonDefaultCurrent " + if(create) output << "create Herwig::OneKaonTwoPionDefaultCurrent " << 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"; } for(unsigned int ix=0;ix<_kstarF5wgts.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":F5KstarWeight " << ix << " " << _kstarF5wgts[ix] << "\n"; } output << "newdef " << name() << ":RhoKstarWgt " << _rhoKstarwgt << "\n"; output << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n"; output << "newdef " << name() << ":RhoParameters " << _rhoparameters << "\n"; output << "newdef " << name() << ":KstarParameters " << _kstarparameters << "\n"; output << "newdef " << name() << ":a1Parameters " << _a1parameters << "\n"; output << "newdef " << name() << ":K1Parameters " << _k1parameters << "\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() << ":K1Width " << _k1width/GeV << "\n"; output << "newdef " << name() << ":K1Mass " << _k1mass/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"; } for(unsigned int ix=0;ix<_kstarF5masses.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5masses " << ix << " " << _kstarF5masses[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<_kstarF5widths.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5widths " << ix << " " << _kstarF5widths[ix]/GeV << "\n"; } - ThreeMesonCurrentBase::dataBaseOutput(output,false,false); + WeakCurrent::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } -void ThreeMesonDefaultCurrent::doinitrun() { +void OneKaonTwoPionDefaultCurrent::doinitrun() { // set up the running a_1 width inita1Width(0); - ThreeMesonCurrentBase::doinitrun(); + WeakCurrent::doinitrun(); } -void ThreeMesonDefaultCurrent::doupdate() { - ThreeMesonCurrentBase::doupdate(); +void OneKaonTwoPionDefaultCurrent::doupdate() { + WeakCurrent::doupdate(); // update running width if needed if ( !touched() ) return; if(_maxmass!=_maxcalc) inita1Width(-1); } -Complex ThreeMesonDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, +Complex OneKaonTwoPionDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, unsigned int ires) const { Energy q(sqrt(q2)),mass,width,mout[2]={_mpi,_mpi}; // get the mass and width of the requested resonance if(itype==0) { mass=_rhoF123masses[ires]; width=_rhoF123widths[ires]; } else if(itype==1) { mass=_rhoF5masses[ires]; width=_rhoF5widths[ires]; } else if(itype==2) { mass=_kstarF123masses[ires]; width=_kstarF123widths[ires]; } else if(itype==3) { mass=_kstarF5masses[ires]; width=_kstarF5widths[ires]; } else { return 0.; } // calculate the momenta for the running widths if(itype>1) mout[0]=_mK; Energy pcm0(Kinematics::pstarTwoBodyDecay(mass,mout[0],mout[1])); Energy pcm(ZERO); if(mout[0]+mout[1]<q){pcm=Kinematics::pstarTwoBodyDecay(q,mout[0],mout[1]);} double ratio = Math::Pow<3>(pcm/pcm0); Energy gamrun(width*mass*ratio/q); Complex ii(0.,1.); complex<Energy2> denom(q2-mass*mass+ii*mass*gamrun), numer(-mass*mass); return numer/denom; } -double ThreeMesonDefaultCurrent:: +double OneKaonTwoPionDefaultCurrent:: 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> +OneKaonTwoPionDefaultCurrent::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 { + // 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);} + // 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]; + // multiply by the transverse projection operator + complex<InvEnergy> 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]); + // factor to get dimensions correct + return vector<LorentzPolarizationVectorE>(1,q.mass()*vect); +} + +bool OneKaonTwoPionDefaultCurrent::accept(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode==-1 ? false : acceptMode(imode); +} + +unsigned int OneKaonTwoPionDefaultCurrent::decayMode(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode; +} + +tPDVector OneKaonTwoPionDefaultCurrent::particles(int icharge, unsigned int imode,int,int) { + tPDVector extpart(3); + if(imode==0) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==1) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::piminus); + } + else if(imode==2) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kplus); + } + else if(imode==3) { + extpart[0]=getParticleData(ParticleID::K0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kbar0); + } + else if(imode==4) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::K0); + } + else if(imode==5) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::Kminus); + } + else if(imode==6) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==7) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::Kbar0); + extpart[2]=getParticleData(ParticleID::pi0); + } + else if(imode==8) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::eta); + } + else if(imode==9) { + extpart[0]=getParticleData(ParticleID::K_S0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_S0); + } + else if(imode==10) { + extpart[0]=getParticleData(ParticleID::K_L0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_L0); + } + else if(imode==11) { + 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/ThreeMesonDefaultCurrent.h b/Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.h copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.h copy to Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.h --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.h +++ b/Decay/WeakCurrents/OneKaonTwoPionDefaultCurrent.h @@ -1,534 +1,632 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator +// OneKaonTwoPionDefaultCurrent.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_ThreeMesonDefaultCurrent_H -#define HERWIG_ThreeMesonDefaultCurrent_H +#ifndef HERWIG_OneKaonTwoPionDefaultCurrent_H +#define HERWIG_OneKaonTwoPionDefaultCurrent_H // -// This is the declaration of the ThreeMesonDefaultCurrent class. +// This is the declaration of the OneKaonTwoPionDefaultCurrent class. // -#include "ThreeMesonCurrentBase.h" +#include "WeakCurrent.h" #include "Herwig/Utilities/Interpolator.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/ResonanceHelpers.h" namespace Herwig { using namespace ThePEG; /** \ingroup Decay * - * The ThreeMesonDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), + * The OneKaonTwoPionDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), * this paper uses the form from Z.Phys.C48:445 (1990) for the \f$a_1\f$ width and * is the default model in TAUOLA. * * The following three meson modes are implemented. * * - \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) * * using the currents from TAUOLA * * - * @see ThreeMesonCurrentBase, + * @see WeakCurrent, * @see WeakCurrent. * @see Defaulta1MatrixElement * */ -class ThreeMesonDefaultCurrent: public ThreeMesonCurrentBase { +class OneKaonTwoPionDefaultCurrent: public WeakCurrent { /** * The matrix element for the running \f$a_1\f$ width is a friend to * keep some members private. */ friend class Defaulta1MatrixElement; public: /** * Default constructor */ - ThreeMesonDefaultCurrent(); + OneKaonTwoPionDefaultCurrent(); + + /** + * 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); + +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); //@} /** * Standard Init function used to initialize the interfaces. */ static void Init(); public: /** @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 ); //@} /** * 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) {} + }; + protected: /** * Can the current handle a particular set of mesons. * As this current includes all the allowed modes this is always true. */ virtual bool acceptMode(int) const; /** * 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; protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const {return new_ptr(*this);} /** 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 {return new_ptr(*this);} //@} 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: /** * Private and non-existent assignment operator. */ - ThreeMesonDefaultCurrent & operator=(const ThreeMesonDefaultCurrent &); + OneKaonTwoPionDefaultCurrent & operator=(const OneKaonTwoPionDefaultCurrent &); private: /** * The \f$\rho\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { norm+=_rhoF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { output+=_rhoF123wgts[ix]*rhoKBreitWigner(q2,0,ix); } } else { unsigned int temp(ires); if(temp<_rhoF123wgts.size()&&temp<3) output=_rhoF123wgts[temp]*rhoKBreitWigner(q2,0,temp); else output=0.; } return output/norm; } /** * The \f$\rho\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { norm+=_rhoF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { output+=_rhoF5wgts[ix]*rhoKBreitWigner(q2,1,ix); } } else { unsigned int temp(ires); if(temp<_rhoF5wgts.size()&&temp<3) { output=_rhoF5wgts[temp]*rhoKBreitWigner(q2,1,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { norm+=_kstarF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { output+=_kstarF123wgts[ix]*rhoKBreitWigner(q2,2,ix); } } else { unsigned int temp(ires); if(temp<_kstarF123wgts.size()&&temp<3) { output=_kstarF123wgts[temp]*rhoKBreitWigner(q2,2,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { norm+=_kstarF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { output+=_kstarF5wgts[ix]*rhoKBreitWigner(q2,3,ix); } } else { unsigned int temp(ires); if(temp<_kstarF5wgts.size()&&temp<3) { output=_kstarF5wgts[ires]*rhoKBreitWigner(q2,3,temp); } } return output/norm; } /** * Mixed Breit Wigner for the \f$F_5\f$ form factor * @param si The scale \f$s_1\f$. * @param sj The scale \f$s_2\f$. * @param ires Which resonances to use * @return The mixed Breit-Wigner */ Complex FKrho(Energy2 si,Energy2 sj,int ires) const { Complex output; if(ires<0){output = _rhoKstarwgt*BKstarF123(si,-1)+BrhoF123(sj,-1);} else if(ires%2==0){output= _rhoKstarwgt*BKstarF123(si,ires/2);} else if(ires%2==1){output=BrhoF123(sj,ires/2);} output /=(1.+_rhoKstarwgt); return output; } /** * \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 { if(!_a1opt) return Resonance::BreitWignera1(q2,_a1mass,_a1width); Complex ii(0.,1.); Energy2 m2(_a1mass*_a1mass); Energy q(sqrt(q2)); Energy width = (*_a1runinter)(q2); return m2/(m2-q2-ii*q*width); } /** * The \f$K_1\f$ Breit-Wigner * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @return The Breit-Wigner */ Complex K1BreitWigner(Energy2 q2) const { Energy2 m2 = sqr(_k1mass); Complex ii(0.,1.); complex<Energy2> fact(m2 - ii*_k1mass*_k1width); return fact/(fact-q2); } /** * Initialize the \f$a_1\f$ running width * @param iopt Initialization option (-1 full calculation, 0 set up the interpolation) */ void inita1Width(int iopt); /** * Breit-Wigners for the \f$\rho\f$ and \f$K^*\f$. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner. * @param itype The type of Breit-Wigner, \e i.e. which masses and widths to use.x * @param ires Which multiplet to use. */ Complex rhoKBreitWigner(Energy2 q2,unsigned int itype,unsigned int ires) const; private: /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _rhoF123wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _kstarF123wgts; /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _rhoF5wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _kstarF5wgts; /** * The relative weight of the \f$\rho\f$ and \f$K^*\f$ where needed. */ double _rhoKstarwgt; /** * 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; /** * Initialize the running \f$a_1\f$ width. */ bool _initializea1; /** * The mass of the \f$a_1\f$ resonances. */ Energy _a1mass; /** * The width of the \f$a_1\f$ resonances. */ Energy _a1width; /** * The mass of the \f$aK1\f$ resonances. */ Energy _k1mass; /** * The width of the \f$K_1\f$ resonances. */ Energy _k1width; /** * The pion decay constant, \f$f_\pi\f$. */ Energy _fpi; /** * The pion mass */ Energy _mpi; /** * The kaon mass */ Energy _mK; /** * use local values of the \f$\rho\f$ masses and widths */ bool _rhoparameters; /** * The \f$\rho\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123masses; /** * The \f$\rho\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5masses; /** * The \f$\rho\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123widths; /** * The \f$\rho\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5widths; /** * use local values of the \f$K^*\f$ resonances masses and widths */ bool _kstarparameters; /** * The \f$K^*\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123masses; /** * The \f$K^*\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5masses; /** * The \f$K^*\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123widths; /** * The \f$K^*\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5widths; /** * Use local values of the \f$a_1\f$ parameters */ bool _a1parameters; /** * Use local values of the \f$K_1\f$ parameters */ bool _k1parameters; /** * 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 /* THEPEG_ThreeMesonDefaultCurrent_H */ +#endif /* HERWIG_OneKaonTwoPionDefaultCurrent_H */ diff --git a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc b/Decay/WeakCurrents/ThreePionDefaultCurrent.cc copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc copy to Decay/WeakCurrents/ThreePionDefaultCurrent.cc --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc +++ b/Decay/WeakCurrents/ThreePionDefaultCurrent.cc @@ -1,1053 +1,1252 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator +// ThreePionDefaultCurrent.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 ThreeMesonDefaultCurrent class. +// functions of the ThreePionDefaultCurrent class. // -#include "ThreeMesonDefaultCurrent.h" +#include "ThreePionDefaultCurrent.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" using namespace Herwig; using namespace ThePEG; -DescribeClass<ThreeMesonDefaultCurrent,ThreeMesonCurrentBase> -describeHerwigThreeMesonDefaultCurrent("Herwig::ThreeMesonDefaultCurrent", +DescribeClass<ThreePionDefaultCurrent,WeakCurrent> +describeHerwigThreePionDefaultCurrent("Herwig::ThreePionDefaultCurrent", "HwWeakCurrents.so"); -HERWIG_INTERPOLATOR_CLASSDESC(ThreeMesonDefaultCurrent,Energy,Energy2) +HERWIG_INTERPOLATOR_CLASSDESC(ThreePionDefaultCurrent,Energy,Energy2) -ThreeMesonDefaultCurrent::ThreeMesonDefaultCurrent() { +ThreePionDefaultCurrent::ThreePionDefaultCurrent() { + // the quarks for the different modes + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + setInitialModes(12); // 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.push_back(1.0);_rhoF123wgts.push_back(-0.145); _rhoF123wgts.push_back(0.); _rhoF5wgts.push_back(-26.);_rhoF5wgts.push_back(6.5); _rhoF5wgts.push_back(1.); // the Kstar weights _kstarF123wgts.push_back(1.); _kstarF5wgts.push_back(1.); // relative rho/Kstar weights _rhoKstarwgt=-0.2; // local values of the a_1 parameters _a1parameters=true;_a1mass=1.251*GeV;_a1width=0.599*GeV; _a1opt=true; // local values of the K_1 parameters _k1parameters=true;_k1mass=1.402*GeV,_k1width=0.174*GeV; // local values of the rho parameters _rhoparameters=true; _rhoF123masses.push_back(0.773*GeV);_rhoF123masses.push_back(1.370*GeV); _rhoF123masses.push_back(1.750*GeV); _rhoF123widths.push_back(0.145*GeV);_rhoF123widths.push_back(0.510*GeV); _rhoF123widths.push_back(0.120*GeV); _rhoF5masses.push_back(0.773*GeV);_rhoF5masses.push_back(1.500*GeV); _rhoF5masses.push_back(1.750*GeV); _rhoF5widths.push_back(0.145*GeV);_rhoF5widths.push_back(0.220*GeV); _rhoF5widths.push_back(0.120*GeV); // local values for the Kstar parameters _kstarparameters=true; _kstarF123masses.push_back(0.8921*GeV); _kstarF123widths.push_back(0.0513*GeV); _kstarF5masses.push_back(0.8921*GeV); _kstarF5widths.push_back(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*GeV;}); vector<double> tmp2(a1q2in,a1q2in+200); _a1runq2.clear(); std::transform(tmp2.begin(), tmp2.end(), back_inserter(_a1runq2), [](double x){return x*GeV2;}); _maxmass=ZERO; _maxcalc=ZERO; } -void ThreeMesonDefaultCurrent::doinit() { - ThreeMesonCurrentBase::doinit(); +void ThreePionDefaultCurrent::doinit() { + WeakCurrent::doinit(); // the particles we will use a lot tPDPtr a1(getParticleData(ParticleID::a_1minus)), k1(getParticleData(ParticleID::Kstar_1minus)),pi0(getParticleData(ParticleID::pi0)), piplus(getParticleData(ParticleID::piplus)), piminus(getParticleData(ParticleID::piminus)); // masses for the running widths _mpi=piplus->mass(); _mK=getParticleData(ParticleID::Kminus)->mass(); // the charged rho resonances tPDPtr rhoc[3]={getParticleData(-213),getParticleData(-100213), getParticleData(-30213)}; // the charged K* resonances tPDPtr Kstarc[3]={getParticleData(-323),getParticleData(-100323), getParticleData(-30323)}; if(!_a1parameters) { _a1mass=a1->mass(); _a1width=a1->width(); } // mass and width of the k_1 if(!_k1parameters) { _k1mass=k1->mass(); _k1width=k1->width(); } // initialise the a_1 running width calculation inita1Width(-1); // rho parameters in the base classs tcPDPtr temp; unsigned int ix; if(_rhoparameters&&_rhoF123masses.size()<3) { ix = _rhoF123masses.size(); _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } // K star parameters in the base class if(_kstarparameters&&_kstarF123masses.size()<3) { ix = _kstarF123masses.size(); _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } // rho parameters here if(_rhoparameters&&_rhoF5masses.size()<3) { ix = _rhoF5masses.size(); _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } // Kstar parameters here if(_kstarparameters&&_kstarF5widths.size()<3) { ix = _kstarF5masses.size(); _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } } -void ThreeMesonDefaultCurrent::persistentOutput(PersistentOStream & os) const { +void ThreePionDefaultCurrent::persistentOutput(PersistentOStream & os) const { os << _rhoF123wgts << _kstarF123wgts << _rhoF5wgts << _kstarF5wgts << _rhoKstarwgt << ounit(_a1runwidth,GeV)<< ounit(_a1runq2,GeV2) << _initializea1 << ounit(_a1mass,GeV)<< ounit(_a1width,GeV)<< ounit(_k1mass,GeV) << ounit(_k1width,GeV)<< ounit(_fpi,GeV) << ounit(_mpi,GeV)<< ounit(_mK,GeV) <<_rhoparameters << ounit(_rhoF123masses,GeV) << ounit(_rhoF5masses,GeV) << ounit(_rhoF123widths,GeV) << ounit(_rhoF5widths,GeV) << _kstarparameters << ounit(_kstarF123masses,GeV) <<ounit(_kstarF5masses,GeV) << ounit(_kstarF123widths,GeV) << ounit(_kstarF5widths,GeV) << _a1parameters << _k1parameters << _a1opt << ounit(_maxmass,GeV) << ounit(_maxcalc,GeV) << _a1runinter; } -void ThreeMesonDefaultCurrent::persistentInput(PersistentIStream & is, int) { +void ThreePionDefaultCurrent::persistentInput(PersistentIStream & is, int) { is >> _rhoF123wgts >> _kstarF123wgts >> _rhoF5wgts >> _kstarF5wgts >> _rhoKstarwgt >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _initializea1 >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV) >> iunit(_k1mass,GeV) >> iunit(_k1width,GeV) >> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV) >>_rhoparameters >> iunit(_rhoF123masses,GeV) >> iunit(_rhoF5masses,GeV) >> iunit(_rhoF123widths,GeV) >> iunit(_rhoF5widths,GeV) >> _kstarparameters >> iunit(_kstarF123masses,GeV) >>iunit(_kstarF5masses,GeV) >> iunit(_kstarF123widths,GeV) >> iunit(_kstarF5widths,GeV) >> _a1parameters >> _k1parameters >> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter; } -void ThreeMesonDefaultCurrent::Init() { +void ThreePionDefaultCurrent::Init() { - static ClassDocumentation<ThreeMesonDefaultCurrent> documentation - ("The ThreeMesonDefaultCurrent class is designed to implement " + static ClassDocumentation<ThreePionDefaultCurrent> documentation + ("The ThreePionDefaultCurrent 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<ThreeMesonDefaultCurrent,double> interfaceF123RhoWgt + static ParVector<ThreePionDefaultCurrent,double> interfaceF123RhoWgt ("F123RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF123wgts, + &ThreePionDefaultCurrent::_rhoF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF123KstarWgt + static ParVector<ThreePionDefaultCurrent,double> interfaceF123KstarWgt ("F123KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF123wgts, + &ThreePionDefaultCurrent::_kstarF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5RhoWgt + static ParVector<ThreePionDefaultCurrent,double> interfaceF5RhoWgt ("F5RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF5wgts, + &ThreePionDefaultCurrent::_rhoF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5KstarWgt + static ParVector<ThreePionDefaultCurrent,double> interfaceF5KstarWgt ("F5KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF5wgts, + &ThreePionDefaultCurrent::_kstarF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,double> interfaceRhoKstarWgt + static Parameter<ThreePionDefaultCurrent,double> interfaceRhoKstarWgt ("RhoKstarWgt", "The relative weights of the rho and K* in the F5 form factor", - &ThreeMesonDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., + &ThreePionDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., false, false, false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceInitializea1 + static Switch<ThreePionDefaultCurrent,bool> interfaceInitializea1 ("Initializea1", "Initialise the calculation of the a_1 running width", - &ThreeMesonDefaultCurrent::_initializea1, false, false, false); + &ThreePionDefaultCurrent::_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<ThreeMesonDefaultCurrent,bool> interfaceRhoParameters + static Switch<ThreePionDefaultCurrent,bool> interfaceRhoParameters ("RhoParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_rhoparameters, true, false, false); + &ThreePionDefaultCurrent::_rhoparameters, true, false, false); static SwitchOption interfaceRhoParameterstrue (interfaceRhoParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceRhoParametersParticleData (interfaceRhoParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceKstarParameters + static Switch<ThreePionDefaultCurrent,bool> interfaceKstarParameters ("KstarParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_kstarparameters, true, false, false); + &ThreePionDefaultCurrent::_kstarparameters, true, false, false); static SwitchOption interfaceKstarParameterstrue (interfaceKstarParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceKstarParametersParticleData (interfaceKstarParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1Parameters + static Switch<ThreePionDefaultCurrent,bool> interfacea1Parameters ("a1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_a1parameters, true, false, false); + &ThreePionDefaultCurrent::_a1parameters, true, false, false); static SwitchOption interfacea1Parameterstrue (interfacea1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfacea1ParametersParticleData (interfacea1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceK1Parameters + static Switch<ThreePionDefaultCurrent,bool> interfaceK1Parameters ("K1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_k1parameters, true, false, false); + &ThreePionDefaultCurrent::_k1parameters, true, false, false); static SwitchOption interfaceK1Parameterstrue (interfaceK1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceK1ParametersParticleData (interfaceK1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1WidthOption + static Switch<ThreePionDefaultCurrent,bool> interfacea1WidthOption ("a1WidthOption", "Option for the treatment of the a1 width", - &ThreeMesonDefaultCurrent::_a1opt, true, false, false); + &ThreePionDefaultCurrent::_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<ThreeMesonDefaultCurrent,Energy> interfacea1RunningWidth + static ParVector<ThreePionDefaultCurrent,Energy> interfacea1RunningWidth ("a1RunningWidth", "The values of the a_1 width for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy2> interfacea1RunningQ2 + static ParVector<ThreePionDefaultCurrent,Energy2> interfacea1RunningQ2 ("a1RunningQ2", "The values of the q^2 for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, + &ThreePionDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Width + static Parameter<ThreePionDefaultCurrent,Energy> interfaceA1Width ("A1Width", "The a_1 width if using local values.", - &ThreeMesonDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Mass + static Parameter<ThreePionDefaultCurrent,Energy> interfaceA1Mass ("A1Mass", "The a_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Width + static Parameter<ThreePionDefaultCurrent,Energy> interfaceK1Width ("K1Width", "The K_1 width if using local values.", - &ThreeMesonDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Mass + static Parameter<ThreePionDefaultCurrent,Energy> interfaceK1Mass ("K1Mass", "The K_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, false, false, false); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123masses + static ParVector<ThreePionDefaultCurrent,Energy> interfacerhoF123masses ("rhoF123masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123widths + static ParVector<ThreePionDefaultCurrent,Energy> interfacerhoF123widths ("rhoF123widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5masses + static ParVector<ThreePionDefaultCurrent,Energy> interfacerhoF5masses ("rhoF5masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5widths + static ParVector<ThreePionDefaultCurrent,Energy> interfacerhoF5widths ("rhoF5widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123masses + static ParVector<ThreePionDefaultCurrent,Energy> interfaceKstarF123masses ("KstarF123masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123widths + static ParVector<ThreePionDefaultCurrent,Energy> interfaceKstarF123widths ("KstarF123widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5masses + static ParVector<ThreePionDefaultCurrent,Energy> interfaceKstarF5masses ("KstarF5masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5widths + static ParVector<ThreePionDefaultCurrent,Energy> interfaceKstarF5widths ("KstarF5widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &ThreePionDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceFPi + static Parameter<ThreePionDefaultCurrent,Energy> interfaceFPi ("FPi", "The pion decay constant", - &ThreeMesonDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, + &ThreePionDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, false, false, true); } // modes handled by this class -bool ThreeMesonDefaultCurrent::acceptMode(int imode) const { +bool ThreePionDefaultCurrent::acceptMode(int imode) const { return imode>=0&&imode<=8; } // calculate the form-factors -ThreeMesonDefaultCurrent::FormFactors -ThreeMesonDefaultCurrent::calculateFormFactors(const int ichan, const int imode, +ThreePionDefaultCurrent::FormFactors +ThreePionDefaultCurrent::calculateFormFactors(const int ichan, const int imode, Energy2 q2, Energy2 s1, Energy2 s2, Energy2 s3) const { useMe(); Complex F1, F2, F3, F4, F5; F1 = F2 = F3 = F4 = F5 = 0.0; // calculate the pi- pi- pi+ factor if(imode==0) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1= a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the pi0 pi0 pi- factor else if(imode==1) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1 = a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the K- pi - K+ factor else if(imode==2) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 = BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==3) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 =-BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==4) { Complex a1fact(a1BreitWigner(q2)); if(ichan<0){F2 =-a1fact*BrhoF123(s2,-1);} else{F2 =-a1fact*BrhoF123(s2,ichan);} } // calculate the pi0 pi0 K- else if(imode==5) { Complex K1fact(K1BreitWigner(q2)/6.); if(ichan<0) { F1 = K1fact*BKstarF123(s1,-1); F2 =-K1fact*BKstarF123(s2,-1); } else if(ichan%2==0) F1 = K1fact*BKstarF123(s1,ichan/2); else F2 =-K1fact*BKstarF123(s2,(ichan-1)/2); } // calculate the K- pi- pi+ else if(imode==6) { Complex K1fact(K1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-K1fact*BrhoF123(s1,-1); F2 = K1fact*BKstarF123(s2,-1); F5 =-BKstarF123(q2,-1)*FKrho(s2,s1,-1)*sqrt(2.); } else if(ichan%8==0) F1 =-K1fact*BrhoF123(s1,ichan/8); else if(ichan%8==1) F2 = K1fact*BKstarF123(s2,(ichan-1)/8); else F5 = -BKstarF123(q2,ichan/8)*FKrho(s2,s1,(ichan-2)%8)*sqrt(2.); } // calculate the pi- K0bar pi0 else if(imode==7) { Complex K1fact(K1BreitWigner(q2)); if(ichan<0) { F2 =-K1fact*BrhoF123(s2,-1); F5 =-2.*BKstarF123(q2,-1)*FKrho(s1,s2,-1); } else if(ichan%7==0) F2 =-K1fact*BrhoF123(s2,ichan/7); else F5 =-2.*BKstarF123(q2,ichan/7)*FKrho(s1,s2,(ichan-1)%7); } // calculate the pi- pi0 eta else if(imode==8) { if(ichan<0) F5 = BrhoF5(q2, -1)*BrhoF123(s3, -1)*sqrt(2./3.); else F5 = BrhoF5(q2,ichan/3)*BrhoF123(s3,ichan%3)*sqrt(2./3.); } // multiply by the prefactors using Constants::twopi; return FormFactors(F1/_fpi, F2/_fpi, F3/_fpi, F4/_fpi, -F5/sqr(twopi)/pow<3,1>(_fpi) ); } // complete the construction of the decay mode for integration -bool ThreeMesonDefaultCurrent::createMode(int icharge, tcPDPtr resonance, +bool ThreePionDefaultCurrent::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 ) { int iq(0),ia(0); if(!acceptMode(imode)) return false; 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,k1; if(icharge==-3) { a1=getParticleData(ParticleID::a_1minus); k1=getParticleData(ParticleID::Kstar_1minus); } else if(icharge==3) { a1=getParticleData(ParticleID::a_1plus); k1=getParticleData(ParticleID::Kstar_1plus); } else { return false; } _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 pi- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rho0[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)); } } else if(imode==1) { // channels for pi0 pi0 pi- for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rhoc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==2) { // channels for K- pi- K+ for(unsigned int ix=0;ix<3;++ix) { if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstar0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==3) { // channels for K0 pi- K0bar for(unsigned int ix=0;ix<3;++ix) { if(Kstarc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstarc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstarc[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==4) { // channels for K- pi0 K0 for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==5) { // channels for pi0 pi0 K- for(unsigned int ix=0;ix<3;++ix) { if(!Kstarc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstarc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==6) { // channels for K- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(rho0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,rho0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstar0[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(rho0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,Kstar0[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==7) { // channels for pi- kbar0 pi0 for(unsigned int ix=0;ix<3;++ix) { if(rhoc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rhoc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,rhoc[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==8) { // channels for pi- pi0 eta for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; for(unsigned int iy=0;iy<3;++iy) { if(!rho0[iy]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } } } if(_rhoparameters) { if(imode!=8) { for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF123masses[ix], _rhoF123widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF123masses[ix], _rhoF123widths[ix]); } } else { for(unsigned int ix=0;ix<_rhoF5masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF5masses[ix], _rhoF5widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF5masses[ix], _rhoF5widths[ix]); } } } // K star parameters in the base class if(_kstarparameters) { for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) { if(Kstarc[ix]) mode->resetIntermediate(Kstarc[ix],_kstarF123masses[ix], _kstarF123widths[ix]); if(Kstar0[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 ThreeMesonDefaultCurrent::inita1Width(int iopt) { +void ThreePionDefaultCurrent::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<ThreeMesonDefaultCurrent> + ThreeBodyAllOnCalculator<ThreePionDefaultCurrent> 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 ThreeMesonDefaultCurrent::dataBaseOutput(ofstream & output,bool header, +void ThreePionDefaultCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; - if(create) output << "create Herwig::ThreeMesonDefaultCurrent " + if(create) output << "create Herwig::ThreePionDefaultCurrent " << 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"; } for(unsigned int ix=0;ix<_kstarF5wgts.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":F5KstarWeight " << ix << " " << _kstarF5wgts[ix] << "\n"; } output << "newdef " << name() << ":RhoKstarWgt " << _rhoKstarwgt << "\n"; output << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n"; output << "newdef " << name() << ":RhoParameters " << _rhoparameters << "\n"; output << "newdef " << name() << ":KstarParameters " << _kstarparameters << "\n"; output << "newdef " << name() << ":a1Parameters " << _a1parameters << "\n"; output << "newdef " << name() << ":K1Parameters " << _k1parameters << "\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() << ":K1Width " << _k1width/GeV << "\n"; output << "newdef " << name() << ":K1Mass " << _k1mass/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"; } for(unsigned int ix=0;ix<_kstarF5masses.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5masses " << ix << " " << _kstarF5masses[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<_kstarF5widths.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5widths " << ix << " " << _kstarF5widths[ix]/GeV << "\n"; } - ThreeMesonCurrentBase::dataBaseOutput(output,false,false); + WeakCurrent::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } -void ThreeMesonDefaultCurrent::doinitrun() { +void ThreePionDefaultCurrent::doinitrun() { // set up the running a_1 width inita1Width(0); - ThreeMesonCurrentBase::doinitrun(); + WeakCurrent::doinitrun(); } -void ThreeMesonDefaultCurrent::doupdate() { - ThreeMesonCurrentBase::doupdate(); +void ThreePionDefaultCurrent::doupdate() { + WeakCurrent::doupdate(); // update running width if needed if ( !touched() ) return; if(_maxmass!=_maxcalc) inita1Width(-1); } -Complex ThreeMesonDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, +Complex ThreePionDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, unsigned int ires) const { Energy q(sqrt(q2)),mass,width,mout[2]={_mpi,_mpi}; // get the mass and width of the requested resonance if(itype==0) { mass=_rhoF123masses[ires]; width=_rhoF123widths[ires]; } else if(itype==1) { mass=_rhoF5masses[ires]; width=_rhoF5widths[ires]; } else if(itype==2) { mass=_kstarF123masses[ires]; width=_kstarF123widths[ires]; } else if(itype==3) { mass=_kstarF5masses[ires]; width=_kstarF5widths[ires]; } else { return 0.; } // calculate the momenta for the running widths if(itype>1) mout[0]=_mK; Energy pcm0(Kinematics::pstarTwoBodyDecay(mass,mout[0],mout[1])); Energy pcm(ZERO); if(mout[0]+mout[1]<q){pcm=Kinematics::pstarTwoBodyDecay(q,mout[0],mout[1]);} double ratio = Math::Pow<3>(pcm/pcm0); Energy gamrun(width*mass*ratio/q); Complex ii(0.,1.); complex<Energy2> denom(q2-mass*mass+ii*mass*gamrun), numer(-mass*mass); return numer/denom; } -double ThreeMesonDefaultCurrent:: +double ThreePionDefaultCurrent:: 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> +ThreePionDefaultCurrent::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 { + // 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);} + // 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]; + // multiply by the transverse projection operator + complex<InvEnergy> 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]); + // factor to get dimensions correct + return vector<LorentzPolarizationVectorE>(1,q.mass()*vect); +} + +bool ThreePionDefaultCurrent::accept(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode==-1 ? false : acceptMode(imode); +} + +unsigned int ThreePionDefaultCurrent::decayMode(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode; +} + +tPDVector ThreePionDefaultCurrent::particles(int icharge, unsigned int imode,int,int) { + tPDVector extpart(3); + if(imode==0) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==1) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::piminus); + } + else if(imode==2) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kplus); + } + else if(imode==3) { + extpart[0]=getParticleData(ParticleID::K0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kbar0); + } + else if(imode==4) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::K0); + } + else if(imode==5) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::Kminus); + } + else if(imode==6) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==7) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::Kbar0); + extpart[2]=getParticleData(ParticleID::pi0); + } + else if(imode==8) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::eta); + } + else if(imode==9) { + extpart[0]=getParticleData(ParticleID::K_S0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_S0); + } + else if(imode==10) { + extpart[0]=getParticleData(ParticleID::K_L0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_L0); + } + else if(imode==11) { + 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/ThreeMesonDefaultCurrent.h b/Decay/WeakCurrents/ThreePionDefaultCurrent.h copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.h copy to Decay/WeakCurrents/ThreePionDefaultCurrent.h --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.h +++ b/Decay/WeakCurrents/ThreePionDefaultCurrent.h @@ -1,534 +1,632 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator +// ThreePionDefaultCurrent.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_ThreeMesonDefaultCurrent_H -#define HERWIG_ThreeMesonDefaultCurrent_H +#ifndef HERWIG_ThreePionDefaultCurrent_H +#define HERWIG_ThreePionDefaultCurrent_H // -// This is the declaration of the ThreeMesonDefaultCurrent class. +// This is the declaration of the ThreePionDefaultCurrent class. // -#include "ThreeMesonCurrentBase.h" +#include "WeakCurrent.h" #include "Herwig/Utilities/Interpolator.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/ResonanceHelpers.h" namespace Herwig { using namespace ThePEG; /** \ingroup Decay * - * The ThreeMesonDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), + * The ThreePionDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), * this paper uses the form from Z.Phys.C48:445 (1990) for the \f$a_1\f$ width and * is the default model in TAUOLA. * * The following three meson modes are implemented. * * - \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) * * using the currents from TAUOLA * * - * @see ThreeMesonCurrentBase, + * @see WeakCurrent, * @see WeakCurrent. * @see Defaulta1MatrixElement * */ -class ThreeMesonDefaultCurrent: public ThreeMesonCurrentBase { +class ThreePionDefaultCurrent: public WeakCurrent { /** * The matrix element for the running \f$a_1\f$ width is a friend to * keep some members private. */ friend class Defaulta1MatrixElement; public: /** * Default constructor */ - ThreeMesonDefaultCurrent(); + ThreePionDefaultCurrent(); + + /** + * 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); + +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); //@} /** * Standard Init function used to initialize the interfaces. */ static void Init(); public: /** @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 ); //@} /** * 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) {} + }; + protected: /** * Can the current handle a particular set of mesons. * As this current includes all the allowed modes this is always true. */ virtual bool acceptMode(int) const; /** * 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; protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const {return new_ptr(*this);} /** 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 {return new_ptr(*this);} //@} 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: /** * Private and non-existent assignment operator. */ - ThreeMesonDefaultCurrent & operator=(const ThreeMesonDefaultCurrent &); + ThreePionDefaultCurrent & operator=(const ThreePionDefaultCurrent &); private: /** * The \f$\rho\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { norm+=_rhoF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { output+=_rhoF123wgts[ix]*rhoKBreitWigner(q2,0,ix); } } else { unsigned int temp(ires); if(temp<_rhoF123wgts.size()&&temp<3) output=_rhoF123wgts[temp]*rhoKBreitWigner(q2,0,temp); else output=0.; } return output/norm; } /** * The \f$\rho\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { norm+=_rhoF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { output+=_rhoF5wgts[ix]*rhoKBreitWigner(q2,1,ix); } } else { unsigned int temp(ires); if(temp<_rhoF5wgts.size()&&temp<3) { output=_rhoF5wgts[temp]*rhoKBreitWigner(q2,1,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { norm+=_kstarF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { output+=_kstarF123wgts[ix]*rhoKBreitWigner(q2,2,ix); } } else { unsigned int temp(ires); if(temp<_kstarF123wgts.size()&&temp<3) { output=_kstarF123wgts[temp]*rhoKBreitWigner(q2,2,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { norm+=_kstarF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { output+=_kstarF5wgts[ix]*rhoKBreitWigner(q2,3,ix); } } else { unsigned int temp(ires); if(temp<_kstarF5wgts.size()&&temp<3) { output=_kstarF5wgts[ires]*rhoKBreitWigner(q2,3,temp); } } return output/norm; } /** * Mixed Breit Wigner for the \f$F_5\f$ form factor * @param si The scale \f$s_1\f$. * @param sj The scale \f$s_2\f$. * @param ires Which resonances to use * @return The mixed Breit-Wigner */ Complex FKrho(Energy2 si,Energy2 sj,int ires) const { Complex output; if(ires<0){output = _rhoKstarwgt*BKstarF123(si,-1)+BrhoF123(sj,-1);} else if(ires%2==0){output= _rhoKstarwgt*BKstarF123(si,ires/2);} else if(ires%2==1){output=BrhoF123(sj,ires/2);} output /=(1.+_rhoKstarwgt); return output; } /** * \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 { if(!_a1opt) return Resonance::BreitWignera1(q2,_a1mass,_a1width); Complex ii(0.,1.); Energy2 m2(_a1mass*_a1mass); Energy q(sqrt(q2)); Energy width = (*_a1runinter)(q2); return m2/(m2-q2-ii*q*width); } /** * The \f$K_1\f$ Breit-Wigner * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @return The Breit-Wigner */ Complex K1BreitWigner(Energy2 q2) const { Energy2 m2 = sqr(_k1mass); Complex ii(0.,1.); complex<Energy2> fact(m2 - ii*_k1mass*_k1width); return fact/(fact-q2); } /** * Initialize the \f$a_1\f$ running width * @param iopt Initialization option (-1 full calculation, 0 set up the interpolation) */ void inita1Width(int iopt); /** * Breit-Wigners for the \f$\rho\f$ and \f$K^*\f$. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner. * @param itype The type of Breit-Wigner, \e i.e. which masses and widths to use.x * @param ires Which multiplet to use. */ Complex rhoKBreitWigner(Energy2 q2,unsigned int itype,unsigned int ires) const; private: /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _rhoF123wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _kstarF123wgts; /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _rhoF5wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _kstarF5wgts; /** * The relative weight of the \f$\rho\f$ and \f$K^*\f$ where needed. */ double _rhoKstarwgt; /** * 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; /** * Initialize the running \f$a_1\f$ width. */ bool _initializea1; /** * The mass of the \f$a_1\f$ resonances. */ Energy _a1mass; /** * The width of the \f$a_1\f$ resonances. */ Energy _a1width; /** * The mass of the \f$aK1\f$ resonances. */ Energy _k1mass; /** * The width of the \f$K_1\f$ resonances. */ Energy _k1width; /** * The pion decay constant, \f$f_\pi\f$. */ Energy _fpi; /** * The pion mass */ Energy _mpi; /** * The kaon mass */ Energy _mK; /** * use local values of the \f$\rho\f$ masses and widths */ bool _rhoparameters; /** * The \f$\rho\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123masses; /** * The \f$\rho\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5masses; /** * The \f$\rho\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123widths; /** * The \f$\rho\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5widths; /** * use local values of the \f$K^*\f$ resonances masses and widths */ bool _kstarparameters; /** * The \f$K^*\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123masses; /** * The \f$K^*\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5masses; /** * The \f$K^*\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123widths; /** * The \f$K^*\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5widths; /** * Use local values of the \f$a_1\f$ parameters */ bool _a1parameters; /** * Use local values of the \f$K_1\f$ parameters */ bool _k1parameters; /** * 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 /* THEPEG_ThreeMesonDefaultCurrent_H */ +#endif /* HERWIG_ThreePionDefaultCurrent_H */ diff --git a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc copy to Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.cc +++ b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.cc @@ -1,1053 +1,1252 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator +// 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 ThreeMesonDefaultCurrent class. +// functions of the TwoKaonOnePionDefaultCurrent class. // -#include "ThreeMesonDefaultCurrent.h" +#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" using namespace Herwig; using namespace ThePEG; -DescribeClass<ThreeMesonDefaultCurrent,ThreeMesonCurrentBase> -describeHerwigThreeMesonDefaultCurrent("Herwig::ThreeMesonDefaultCurrent", - "HwWeakCurrents.so"); -HERWIG_INTERPOLATOR_CLASSDESC(ThreeMesonDefaultCurrent,Energy,Energy2) +DescribeClass<TwoKaonOnePionDefaultCurrent,WeakCurrent> +describeHerwigTwoKaonOnePionDefaultCurrent("Herwig::TwoKaonOnePionDefaultCurrent", + "HwWeakCurrents.so"); +HERWIG_INTERPOLATOR_CLASSDESC(TwoKaonOnePionDefaultCurrent,Energy,Energy2) -ThreeMesonDefaultCurrent::ThreeMesonDefaultCurrent() { +TwoKaonOnePionDefaultCurrent::TwoKaonOnePionDefaultCurrent() { + // the quarks for the different modes + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-3); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + addDecayMode(2,-1); + setInitialModes(12); // 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.push_back(1.0);_rhoF123wgts.push_back(-0.145); _rhoF123wgts.push_back(0.); _rhoF5wgts.push_back(-26.);_rhoF5wgts.push_back(6.5); _rhoF5wgts.push_back(1.); // the Kstar weights _kstarF123wgts.push_back(1.); _kstarF5wgts.push_back(1.); // relative rho/Kstar weights _rhoKstarwgt=-0.2; // local values of the a_1 parameters _a1parameters=true;_a1mass=1.251*GeV;_a1width=0.599*GeV; _a1opt=true; // local values of the K_1 parameters _k1parameters=true;_k1mass=1.402*GeV,_k1width=0.174*GeV; // local values of the rho parameters _rhoparameters=true; _rhoF123masses.push_back(0.773*GeV);_rhoF123masses.push_back(1.370*GeV); _rhoF123masses.push_back(1.750*GeV); _rhoF123widths.push_back(0.145*GeV);_rhoF123widths.push_back(0.510*GeV); _rhoF123widths.push_back(0.120*GeV); _rhoF5masses.push_back(0.773*GeV);_rhoF5masses.push_back(1.500*GeV); _rhoF5masses.push_back(1.750*GeV); _rhoF5widths.push_back(0.145*GeV);_rhoF5widths.push_back(0.220*GeV); _rhoF5widths.push_back(0.120*GeV); // local values for the Kstar parameters _kstarparameters=true; _kstarF123masses.push_back(0.8921*GeV); _kstarF123widths.push_back(0.0513*GeV); _kstarF5masses.push_back(0.8921*GeV); _kstarF5widths.push_back(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*GeV;}); vector<double> tmp2(a1q2in,a1q2in+200); _a1runq2.clear(); std::transform(tmp2.begin(), tmp2.end(), back_inserter(_a1runq2), [](double x){return x*GeV2;}); _maxmass=ZERO; _maxcalc=ZERO; } -void ThreeMesonDefaultCurrent::doinit() { - ThreeMesonCurrentBase::doinit(); +void TwoKaonOnePionDefaultCurrent::doinit() { + WeakCurrent::doinit(); // the particles we will use a lot tPDPtr a1(getParticleData(ParticleID::a_1minus)), k1(getParticleData(ParticleID::Kstar_1minus)),pi0(getParticleData(ParticleID::pi0)), piplus(getParticleData(ParticleID::piplus)), piminus(getParticleData(ParticleID::piminus)); // masses for the running widths _mpi=piplus->mass(); _mK=getParticleData(ParticleID::Kminus)->mass(); // the charged rho resonances tPDPtr rhoc[3]={getParticleData(-213),getParticleData(-100213), getParticleData(-30213)}; // the charged K* resonances tPDPtr Kstarc[3]={getParticleData(-323),getParticleData(-100323), getParticleData(-30323)}; if(!_a1parameters) { _a1mass=a1->mass(); _a1width=a1->width(); } // mass and width of the k_1 if(!_k1parameters) { _k1mass=k1->mass(); _k1width=k1->width(); } // initialise the a_1 running width calculation inita1Width(-1); // rho parameters in the base classs tcPDPtr temp; unsigned int ix; if(_rhoparameters&&_rhoF123masses.size()<3) { ix = _rhoF123masses.size(); _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF123masses.resize(3);_rhoF123widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF123masses[ix]=rhoc[ix]->mass(); _rhoF123widths[ix]=rhoc[ix]->width(); } } } // K star parameters in the base class if(_kstarparameters&&_kstarF123masses.size()<3) { ix = _kstarF123masses.size(); _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF123masses.resize(3);_kstarF123widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF123masses[ix]=Kstarc[ix]->mass(); _kstarF123widths[ix]=Kstarc[ix]->width(); } } } // rho parameters here if(_rhoparameters&&_rhoF5masses.size()<3) { ix = _rhoF5masses.size(); _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } else if(!_rhoparameters) { _rhoF5masses.resize(3);_rhoF5widths.resize(3); for(ix=0;ix<3;++ix) { if(rhoc[ix]) { _rhoF5masses[ix]=rhoc[ix]->mass(); _rhoF5widths[ix]=rhoc[ix]->width(); } } } // Kstar parameters here if(_kstarparameters&&_kstarF5widths.size()<3) { ix = _kstarF5masses.size(); _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } else if(!_kstarparameters) { _kstarF5masses.resize(3);_kstarF5widths.resize(3); for(ix=0;ix<3;++ix) { if(Kstarc[ix]) { _kstarF5masses[ix]=Kstarc[ix]->mass(); _kstarF5widths[ix]=Kstarc[ix]->width(); } } } } -void ThreeMesonDefaultCurrent::persistentOutput(PersistentOStream & os) const { +void TwoKaonOnePionDefaultCurrent::persistentOutput(PersistentOStream & os) const { os << _rhoF123wgts << _kstarF123wgts << _rhoF5wgts << _kstarF5wgts << _rhoKstarwgt << ounit(_a1runwidth,GeV)<< ounit(_a1runq2,GeV2) << _initializea1 << ounit(_a1mass,GeV)<< ounit(_a1width,GeV)<< ounit(_k1mass,GeV) << ounit(_k1width,GeV)<< ounit(_fpi,GeV) << ounit(_mpi,GeV)<< ounit(_mK,GeV) <<_rhoparameters << ounit(_rhoF123masses,GeV) << ounit(_rhoF5masses,GeV) << ounit(_rhoF123widths,GeV) << ounit(_rhoF5widths,GeV) << _kstarparameters << ounit(_kstarF123masses,GeV) <<ounit(_kstarF5masses,GeV) << ounit(_kstarF123widths,GeV) << ounit(_kstarF5widths,GeV) << _a1parameters << _k1parameters << _a1opt << ounit(_maxmass,GeV) << ounit(_maxcalc,GeV) << _a1runinter; } -void ThreeMesonDefaultCurrent::persistentInput(PersistentIStream & is, int) { +void TwoKaonOnePionDefaultCurrent::persistentInput(PersistentIStream & is, int) { is >> _rhoF123wgts >> _kstarF123wgts >> _rhoF5wgts >> _kstarF5wgts >> _rhoKstarwgt >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _initializea1 >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV) >> iunit(_k1mass,GeV) >> iunit(_k1width,GeV) >> iunit(_fpi,GeV) >> iunit(_mpi,GeV) >> iunit(_mK,GeV) >>_rhoparameters >> iunit(_rhoF123masses,GeV) >> iunit(_rhoF5masses,GeV) >> iunit(_rhoF123widths,GeV) >> iunit(_rhoF5widths,GeV) >> _kstarparameters >> iunit(_kstarF123masses,GeV) >>iunit(_kstarF5masses,GeV) >> iunit(_kstarF123widths,GeV) >> iunit(_kstarF5widths,GeV) >> _a1parameters >> _k1parameters >> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter; } -void ThreeMesonDefaultCurrent::Init() { +void TwoKaonOnePionDefaultCurrent::Init() { - static ClassDocumentation<ThreeMesonDefaultCurrent> documentation - ("The ThreeMesonDefaultCurrent class is designed to implement " + 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<ThreeMesonDefaultCurrent,double> interfaceF123RhoWgt + static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF123RhoWgt ("F123RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF123wgts, + &TwoKaonOnePionDefaultCurrent::_rhoF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF123KstarWgt + static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF123KstarWgt ("F123KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF123wgts, + &TwoKaonOnePionDefaultCurrent::_kstarF123wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5RhoWgt + static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF5RhoWgt ("F5RhoWeight", "The weights of the different rho resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_rhoF5wgts, + &TwoKaonOnePionDefaultCurrent::_rhoF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,double> interfaceF5KstarWgt + static ParVector<TwoKaonOnePionDefaultCurrent,double> interfaceF5KstarWgt ("F5KstarWeight", "The weights of the different Kstar resonances in the F1,2,3 form factor", - &ThreeMesonDefaultCurrent::_kstarF5wgts, + &TwoKaonOnePionDefaultCurrent::_kstarF5wgts, 0, 0, 0, -1000, 1000, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,double> interfaceRhoKstarWgt + static Parameter<TwoKaonOnePionDefaultCurrent,double> interfaceRhoKstarWgt ("RhoKstarWgt", "The relative weights of the rho and K* in the F5 form factor", - &ThreeMesonDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., + &TwoKaonOnePionDefaultCurrent::_rhoKstarwgt, -0.2, -10., 10., false, false, false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceInitializea1 + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfaceInitializea1 ("Initializea1", "Initialise the calculation of the a_1 running width", - &ThreeMesonDefaultCurrent::_initializea1, false, false, false); + &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<ThreeMesonDefaultCurrent,bool> interfaceRhoParameters + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfaceRhoParameters ("RhoParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_rhoparameters, true, false, false); + &TwoKaonOnePionDefaultCurrent::_rhoparameters, true, false, false); static SwitchOption interfaceRhoParameterstrue (interfaceRhoParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceRhoParametersParticleData (interfaceRhoParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceKstarParameters + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfaceKstarParameters ("KstarParameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_kstarparameters, true, false, false); + &TwoKaonOnePionDefaultCurrent::_kstarparameters, true, false, false); static SwitchOption interfaceKstarParameterstrue (interfaceKstarParameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceKstarParametersParticleData (interfaceKstarParameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1Parameters + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfacea1Parameters ("a1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_a1parameters, true, false, false); + &TwoKaonOnePionDefaultCurrent::_a1parameters, true, false, false); static SwitchOption interfacea1Parameterstrue (interfacea1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfacea1ParametersParticleData (interfacea1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfaceK1Parameters + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfaceK1Parameters ("K1Parameters", "Use local values of the rho meson masses and widths", - &ThreeMesonDefaultCurrent::_k1parameters, true, false, false); + &TwoKaonOnePionDefaultCurrent::_k1parameters, true, false, false); static SwitchOption interfaceK1Parameterstrue (interfaceK1Parameters, "Local", "Use local values of the parameters", true); static SwitchOption interfaceK1ParametersParticleData (interfaceK1Parameters, "ParticleData", "Use the masses and wdiths from the particle data objects", false); - static Switch<ThreeMesonDefaultCurrent,bool> interfacea1WidthOption + static Switch<TwoKaonOnePionDefaultCurrent,bool> interfacea1WidthOption ("a1WidthOption", "Option for the treatment of the a1 width", - &ThreeMesonDefaultCurrent::_a1opt, true, false, false); + &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<ThreeMesonDefaultCurrent,Energy> interfacea1RunningWidth + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacea1RunningWidth ("a1RunningWidth", "The values of the a_1 width for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_a1runwidth, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy2> interfacea1RunningQ2 + static ParVector<TwoKaonOnePionDefaultCurrent,Energy2> interfacea1RunningQ2 ("a1RunningQ2", "The values of the q^2 for interpolation to giving the running width.", - &ThreeMesonDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, + &TwoKaonOnePionDefaultCurrent::_a1runq2, GeV2, -1, 1.0*GeV2, ZERO, 10.0*GeV2, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Width + static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceA1Width ("A1Width", "The a_1 width if using local values.", - &ThreeMesonDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_a1width, GeV, 0.599*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceA1Mass + static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceA1Mass ("A1Mass", "The a_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_a1mass, GeV, 1.251*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Width + static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceK1Width ("K1Width", "The K_1 width if using local values.", - &ThreeMesonDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_k1width, GeV, 0.174*GeV, ZERO, 10.0*GeV, false, false, false); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceK1Mass + static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceK1Mass ("K1Mass", "The K_1 mass if using local values.", - &ThreeMesonDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_k1mass, GeV, 1.402*GeV, ZERO, 10.0*GeV, false, false, false); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123masses + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF123masses ("rhoF123masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_rhoF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF123widths + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF123widths ("rhoF123widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_rhoF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5masses + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF5masses ("rhoF5masses", "The masses for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_rhoF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfacerhoF5widths + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfacerhoF5widths ("rhoF5widths", "The widths for the rho resonances if used local values", - &ThreeMesonDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_rhoF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123masses + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF123masses ("KstarF123masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_kstarF123masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF123widths + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF123widths ("KstarF123widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_kstarF123widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5masses + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF5masses ("KstarF5masses", "The masses for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_kstarF5masses, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static ParVector<ThreeMesonDefaultCurrent,Energy> interfaceKstarF5widths + static ParVector<TwoKaonOnePionDefaultCurrent,Energy> interfaceKstarF5widths ("KstarF5widths", "The widths for the Kstar resonances if used local values", - &ThreeMesonDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, + &TwoKaonOnePionDefaultCurrent::_kstarF5widths, GeV, -1, 1.0*GeV, ZERO, 10.0*GeV, false, false, true); - static Parameter<ThreeMesonDefaultCurrent,Energy> interfaceFPi + static Parameter<TwoKaonOnePionDefaultCurrent,Energy> interfaceFPi ("FPi", "The pion decay constant", - &ThreeMesonDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, + &TwoKaonOnePionDefaultCurrent::_fpi, MeV, 92.4*MeV, ZERO, 200.0*MeV, false, false, true); } // modes handled by this class -bool ThreeMesonDefaultCurrent::acceptMode(int imode) const { +bool TwoKaonOnePionDefaultCurrent::acceptMode(int imode) const { return imode>=0&&imode<=8; } // calculate the form-factors -ThreeMesonDefaultCurrent::FormFactors -ThreeMesonDefaultCurrent::calculateFormFactors(const int ichan, const int imode, +TwoKaonOnePionDefaultCurrent::FormFactors +TwoKaonOnePionDefaultCurrent::calculateFormFactors(const int ichan, const int imode, Energy2 q2, Energy2 s1, Energy2 s2, Energy2 s3) const { useMe(); Complex F1, F2, F3, F4, F5; F1 = F2 = F3 = F4 = F5 = 0.0; // calculate the pi- pi- pi+ factor if(imode==0) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1= a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the pi0 pi0 pi- factor else if(imode==1) { Complex a1fact(a1BreitWigner(q2)*2./3.); if(ichan<0) { F1 = a1fact*BrhoF123(s1,-1); F2 =-a1fact*BrhoF123(s2,-1); } else if(ichan%2==0) F1 = a1fact*BrhoF123(s1, ichan/2); else if(ichan%2==1) F2 =-a1fact*BrhoF123(s2,(ichan-1)/2); } // calculate the K- pi - K+ factor else if(imode==2) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 = BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==3) { Complex a1fact(a1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-a1fact*BKstarF123(s1,-1); F2 = a1fact*BrhoF123(s2,-1); F5 =-BrhoF5(q2,-1)*FKrho(s1,s2,-1)*sqrt(2.); } 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==4) { Complex a1fact(a1BreitWigner(q2)); if(ichan<0){F2 =-a1fact*BrhoF123(s2,-1);} else{F2 =-a1fact*BrhoF123(s2,ichan);} } // calculate the pi0 pi0 K- else if(imode==5) { Complex K1fact(K1BreitWigner(q2)/6.); if(ichan<0) { F1 = K1fact*BKstarF123(s1,-1); F2 =-K1fact*BKstarF123(s2,-1); } else if(ichan%2==0) F1 = K1fact*BKstarF123(s1,ichan/2); else F2 =-K1fact*BKstarF123(s2,(ichan-1)/2); } // calculate the K- pi- pi+ else if(imode==6) { Complex K1fact(K1BreitWigner(q2)*sqrt(2.)/3.); if(ichan<0) { F1 =-K1fact*BrhoF123(s1,-1); F2 = K1fact*BKstarF123(s2,-1); F5 =-BKstarF123(q2,-1)*FKrho(s2,s1,-1)*sqrt(2.); } else if(ichan%8==0) F1 =-K1fact*BrhoF123(s1,ichan/8); else if(ichan%8==1) F2 = K1fact*BKstarF123(s2,(ichan-1)/8); else F5 = -BKstarF123(q2,ichan/8)*FKrho(s2,s1,(ichan-2)%8)*sqrt(2.); } // calculate the pi- K0bar pi0 else if(imode==7) { Complex K1fact(K1BreitWigner(q2)); if(ichan<0) { F2 =-K1fact*BrhoF123(s2,-1); F5 =-2.*BKstarF123(q2,-1)*FKrho(s1,s2,-1); } else if(ichan%7==0) F2 =-K1fact*BrhoF123(s2,ichan/7); else F5 =-2.*BKstarF123(q2,ichan/7)*FKrho(s1,s2,(ichan-1)%7); } // calculate the pi- pi0 eta else if(imode==8) { if(ichan<0) F5 = BrhoF5(q2, -1)*BrhoF123(s3, -1)*sqrt(2./3.); else F5 = BrhoF5(q2,ichan/3)*BrhoF123(s3,ichan%3)*sqrt(2./3.); } // multiply by the prefactors using Constants::twopi; return FormFactors(F1/_fpi, F2/_fpi, F3/_fpi, F4/_fpi, -F5/sqr(twopi)/pow<3,1>(_fpi) ); } // complete the construction of the decay mode for integration -bool ThreeMesonDefaultCurrent::createMode(int icharge, tcPDPtr resonance, +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 ) { int iq(0),ia(0); if(!acceptMode(imode)) return false; 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,k1; if(icharge==-3) { a1=getParticleData(ParticleID::a_1minus); k1=getParticleData(ParticleID::Kstar_1minus); } else if(icharge==3) { a1=getParticleData(ParticleID::a_1plus); k1=getParticleData(ParticleID::Kstar_1plus); } else { return false; } _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 pi- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rho0[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)); } } else if(imode==1) { // channels for pi0 pi0 pi- for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,rhoc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==2) { // channels for K- pi- K+ for(unsigned int ix=0;ix<3;++ix) { if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstar0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==3) { // channels for K0 pi- K0bar for(unsigned int ix=0;ix<3;++ix) { if(Kstarc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[ix]) { 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(!rhoc[ix]) continue; if(Kstarc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,Kstarc[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rho0[iy]) { 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==4) { // channels for K- pi0 K0 for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,a1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==5) { // channels for pi0 pi0 K- for(unsigned int ix=0;ix<3;++ix) { if(!Kstarc[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,Kstarc[ix], ires+2,iloc+2,ires+2,iloc+3)); mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstarc[ix], ires+2,iloc+1,ires+2,iloc+3)); } } else if(imode==6) { // channels for K- pi- pi+ for(unsigned int ix=0;ix<3;++ix) { if(rho0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+1,ires+1,rho0[ix], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,Kstar0[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(rho0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,Kstar0[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==7) { // channels for pi- kbar0 pi0 for(unsigned int ix=0;ix<3;++ix) { if(rhoc[ix]) { mode->addChannel((PhaseSpaceChannel(phase),ires,k1,ires+1,iloc+2,ires+1,rhoc[ix], ires+2,iloc+1,ires+2,iloc+3)); } for(unsigned int iy=0;iy<3;++iy) { if(!Kstarc[ix]) continue; if(Kstar0[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+1,ires+1,Kstar0[iy], ires+2,iloc+2,ires+2,iloc+3)); } if(rhoc[iy]) { mode->addChannel((PhaseSpaceChannel(phase),ires,Kstarc[ix],ires+1,iloc+2,ires+1,rhoc[iy], ires+2,iloc+1,ires+2,iloc+3)); } } } } else if(imode==8) { // channels for pi- pi0 eta for(unsigned int ix=0;ix<3;++ix) { if(!rhoc[ix]) continue; for(unsigned int iy=0;iy<3;++iy) { if(!rho0[iy]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,rhoc[ix],ires+1,iloc+1,ires+1,rho0[iy], ires+2,iloc+2,ires+2,iloc+3)); } } } if(_rhoparameters) { if(imode!=8) { for(unsigned int ix=0;ix<_rhoF123masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF123masses[ix], _rhoF123widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF123masses[ix], _rhoF123widths[ix]); } } else { for(unsigned int ix=0;ix<_rhoF5masses.size();++ix) { if(rhoc[ix]) mode->resetIntermediate(rhoc[ix],_rhoF5masses[ix], _rhoF5widths[ix]); if(rho0[ix]) mode->resetIntermediate(rho0[ix],_rhoF5masses[ix], _rhoF5widths[ix]); } } } // K star parameters in the base class if(_kstarparameters) { for(unsigned int ix=0;ix<_kstarF123masses.size();++ix) { if(Kstarc[ix]) mode->resetIntermediate(Kstarc[ix],_kstarF123masses[ix], _kstarF123widths[ix]); if(Kstar0[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 ThreeMesonDefaultCurrent::inita1Width(int iopt) { +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<ThreeMesonDefaultCurrent> + 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 ThreeMesonDefaultCurrent::dataBaseOutput(ofstream & output,bool header, +void TwoKaonOnePionDefaultCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; - if(create) output << "create Herwig::ThreeMesonDefaultCurrent " + 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"; } for(unsigned int ix=0;ix<_kstarF5wgts.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":F5KstarWeight " << ix << " " << _kstarF5wgts[ix] << "\n"; } output << "newdef " << name() << ":RhoKstarWgt " << _rhoKstarwgt << "\n"; output << "newdef " << name() << ":Initializea1 " << _initializea1 << "\n"; output << "newdef " << name() << ":RhoParameters " << _rhoparameters << "\n"; output << "newdef " << name() << ":KstarParameters " << _kstarparameters << "\n"; output << "newdef " << name() << ":a1Parameters " << _a1parameters << "\n"; output << "newdef " << name() << ":K1Parameters " << _k1parameters << "\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() << ":K1Width " << _k1width/GeV << "\n"; output << "newdef " << name() << ":K1Mass " << _k1mass/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"; } for(unsigned int ix=0;ix<_kstarF5masses.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5masses " << ix << " " << _kstarF5masses[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<_kstarF5widths.size();++ix) { if(ix<1) output << "newdef "; else output << "insert "; output << name() << ":KstarF5widths " << ix << " " << _kstarF5widths[ix]/GeV << "\n"; } - ThreeMesonCurrentBase::dataBaseOutput(output,false,false); + WeakCurrent::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } -void ThreeMesonDefaultCurrent::doinitrun() { +void TwoKaonOnePionDefaultCurrent::doinitrun() { // set up the running a_1 width inita1Width(0); - ThreeMesonCurrentBase::doinitrun(); + WeakCurrent::doinitrun(); } -void ThreeMesonDefaultCurrent::doupdate() { - ThreeMesonCurrentBase::doupdate(); +void TwoKaonOnePionDefaultCurrent::doupdate() { + WeakCurrent::doupdate(); // update running width if needed if ( !touched() ) return; if(_maxmass!=_maxcalc) inita1Width(-1); } -Complex ThreeMesonDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, +Complex TwoKaonOnePionDefaultCurrent::rhoKBreitWigner(Energy2 q2,unsigned int itype, unsigned int ires) const { Energy q(sqrt(q2)),mass,width,mout[2]={_mpi,_mpi}; // get the mass and width of the requested resonance if(itype==0) { mass=_rhoF123masses[ires]; width=_rhoF123widths[ires]; } else if(itype==1) { mass=_rhoF5masses[ires]; width=_rhoF5widths[ires]; } else if(itype==2) { mass=_kstarF123masses[ires]; width=_kstarF123widths[ires]; } else if(itype==3) { mass=_kstarF5masses[ires]; width=_kstarF5widths[ires]; } else { return 0.; } // calculate the momenta for the running widths if(itype>1) mout[0]=_mK; Energy pcm0(Kinematics::pstarTwoBodyDecay(mass,mout[0],mout[1])); Energy pcm(ZERO); if(mout[0]+mout[1]<q){pcm=Kinematics::pstarTwoBodyDecay(q,mout[0],mout[1]);} double ratio = Math::Pow<3>(pcm/pcm0); Energy gamrun(width*mass*ratio/q); Complex ii(0.,1.); complex<Energy2> denom(q2-mass*mass+ii*mass*gamrun), numer(-mass*mass); return numer/denom; } -double ThreeMesonDefaultCurrent:: +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 { + // 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);} + // 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]; + // multiply by the transverse projection operator + complex<InvEnergy> 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]); + // factor to get dimensions correct + return vector<LorentzPolarizationVectorE>(1,q.mass()*vect); +} + +bool TwoKaonOnePionDefaultCurrent::accept(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode==-1 ? false : acceptMode(imode); +} + +unsigned int TwoKaonOnePionDefaultCurrent::decayMode(vector<int> id) { + 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; + } + int imode(-1); + if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0; + else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1; + else if( (nkp==1&&nkm==1&&npip==1) || + (nkp==1&&nkm==1&&npim==1)) imode= 2; + else if( (nk0==1&&nk0bar==1&&npip==1) || + (nk0==1&&nk0bar==1&&npim==1)) imode= 3; + else if( (nkp==1&&nk0bar==1&&npi0==1) || + (nkm==1&&npi0==1&&nk0==1)) imode= 4; + else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5; + else if( (npip==1&&npim==1&&nkp==1) || + (nkm==1&&npim==1&&npip==1) ) imode= 6; + else if( (nk0==1&&npip==1&&npi0==1) || + (npim==1&&nk0bar==1&&npi0==1)) imode= 7; + else if( (npip==1&&npi0==1&&neta==1) || + (npim==1&&npi0==1&&neta==1)) imode= 8; + else if( nks==2 && (npip==1||npim==1) ) imode= 9; + else if( nkl==2 && (npip==1||npim==1) ) imode=10; + else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11; + return imode; +} + +tPDVector TwoKaonOnePionDefaultCurrent::particles(int icharge, unsigned int imode,int,int) { + tPDVector extpart(3); + if(imode==0) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==1) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::piminus); + } + else if(imode==2) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kplus); + } + else if(imode==3) { + extpart[0]=getParticleData(ParticleID::K0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::Kbar0); + } + else if(imode==4) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::K0); + } + else if(imode==5) { + extpart[0]=getParticleData(ParticleID::pi0); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::Kminus); + } + else if(imode==6) { + extpart[0]=getParticleData(ParticleID::Kminus); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::piplus); + } + else if(imode==7) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::Kbar0); + extpart[2]=getParticleData(ParticleID::pi0); + } + else if(imode==8) { + extpart[0]=getParticleData(ParticleID::piminus); + extpart[1]=getParticleData(ParticleID::pi0); + extpart[2]=getParticleData(ParticleID::eta); + } + else if(imode==9) { + extpart[0]=getParticleData(ParticleID::K_S0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_S0); + } + else if(imode==10) { + extpart[0]=getParticleData(ParticleID::K_L0); + extpart[1]=getParticleData(ParticleID::piminus); + extpart[2]=getParticleData(ParticleID::K_L0); + } + else if(imode==11) { + 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/ThreeMesonDefaultCurrent.h b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.h copy from Decay/WeakCurrents/ThreeMesonDefaultCurrent.h copy to Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.h --- a/Decay/WeakCurrents/ThreeMesonDefaultCurrent.h +++ b/Decay/WeakCurrents/TwoKaonOnePionDefaultCurrent.h @@ -1,534 +1,632 @@ // -*- C++ -*- // -// ThreeMesonDefaultCurrent.h is a part of Herwig - A multi-purpose Monte Carlo event generator +// TwoKaonOnePionDefaultCurrent.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_ThreeMesonDefaultCurrent_H -#define HERWIG_ThreeMesonDefaultCurrent_H +#ifndef HERWIG_TwoKaonOnePionDefaultCurrent_H +#define HERWIG_TwoKaonOnePionDefaultCurrent_H // -// This is the declaration of the ThreeMesonDefaultCurrent class. +// This is the declaration of the TwoKaonOnePionDefaultCurrent class. // -#include "ThreeMesonCurrentBase.h" +#include "WeakCurrent.h" #include "Herwig/Utilities/Interpolator.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/ResonanceHelpers.h" namespace Herwig { using namespace ThePEG; /** \ingroup Decay * - * The ThreeMesonDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), + * The TwoKaonOnePionDefaultCurrent class implements the currents from Z.Phys.C58:445 (1992), * this paper uses the form from Z.Phys.C48:445 (1990) for the \f$a_1\f$ width and * is the default model in TAUOLA. * * The following three meson modes are implemented. * * - \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) * * using the currents from TAUOLA * * - * @see ThreeMesonCurrentBase, + * @see WeakCurrent, * @see WeakCurrent. * @see Defaulta1MatrixElement * */ -class ThreeMesonDefaultCurrent: public ThreeMesonCurrentBase { +class TwoKaonOnePionDefaultCurrent: public WeakCurrent { /** * The matrix element for the running \f$a_1\f$ width is a friend to * keep some members private. */ friend class Defaulta1MatrixElement; public: /** * Default constructor */ - ThreeMesonDefaultCurrent(); + TwoKaonOnePionDefaultCurrent(); + + /** + * 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); + +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); //@} /** * Standard Init function used to initialize the interfaces. */ static void Init(); public: /** @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 ); //@} /** * 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) {} + }; + protected: /** * Can the current handle a particular set of mesons. * As this current includes all the allowed modes this is always true. */ virtual bool acceptMode(int) const; /** * 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; protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const {return new_ptr(*this);} /** 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 {return new_ptr(*this);} //@} 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: /** * Private and non-existent assignment operator. */ - ThreeMesonDefaultCurrent & operator=(const ThreeMesonDefaultCurrent &); + TwoKaonOnePionDefaultCurrent & operator=(const TwoKaonOnePionDefaultCurrent &); private: /** * The \f$\rho\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { norm+=_rhoF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF123wgts.size()));ix<N;++ix) { output+=_rhoF123wgts[ix]*rhoKBreitWigner(q2,0,ix); } } else { unsigned int temp(ires); if(temp<_rhoF123wgts.size()&&temp<3) output=_rhoF123wgts[temp]*rhoKBreitWigner(q2,0,temp); else output=0.; } return output/norm; } /** * The \f$\rho\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BrhoF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { norm+=_rhoF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_rhoF5wgts.size()));ix<N;++ix) { output+=_rhoF5wgts[ix]*rhoKBreitWigner(q2,1,ix); } } else { unsigned int temp(ires); if(temp<_rhoF5wgts.size()&&temp<3) { output=_rhoF5wgts[temp]*rhoKBreitWigner(q2,1,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_{1,2,3}\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF123(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { norm+=_kstarF123wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF123wgts.size()));ix<N;++ix) { output+=_kstarF123wgts[ix]*rhoKBreitWigner(q2,2,ix); } } else { unsigned int temp(ires); if(temp<_kstarF123wgts.size()&&temp<3) { output=_kstarF123wgts[temp]*rhoKBreitWigner(q2,2,temp); } } return output/norm; } /** * The \f$K^*\f$ Breit-Wigner for the \f$F_5\f$ form factors. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @param ires Which \f$\rho\f$ multiplet * @return The Breit-Wigner */ Complex BKstarF5(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { norm+=_kstarF5wgts[ix]; } if(ires<0) { for(unsigned int ix=0,N=min(3,int(_kstarF5wgts.size()));ix<N;++ix) { output+=_kstarF5wgts[ix]*rhoKBreitWigner(q2,3,ix); } } else { unsigned int temp(ires); if(temp<_kstarF5wgts.size()&&temp<3) { output=_kstarF5wgts[ires]*rhoKBreitWigner(q2,3,temp); } } return output/norm; } /** * Mixed Breit Wigner for the \f$F_5\f$ form factor * @param si The scale \f$s_1\f$. * @param sj The scale \f$s_2\f$. * @param ires Which resonances to use * @return The mixed Breit-Wigner */ Complex FKrho(Energy2 si,Energy2 sj,int ires) const { Complex output; if(ires<0){output = _rhoKstarwgt*BKstarF123(si,-1)+BrhoF123(sj,-1);} else if(ires%2==0){output= _rhoKstarwgt*BKstarF123(si,ires/2);} else if(ires%2==1){output=BrhoF123(sj,ires/2);} output /=(1.+_rhoKstarwgt); return output; } /** * \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 { if(!_a1opt) return Resonance::BreitWignera1(q2,_a1mass,_a1width); Complex ii(0.,1.); Energy2 m2(_a1mass*_a1mass); Energy q(sqrt(q2)); Energy width = (*_a1runinter)(q2); return m2/(m2-q2-ii*q*width); } /** * The \f$K_1\f$ Breit-Wigner * @param q2 The scale \f$q^2\f$ for the Breit-Wigner * @return The Breit-Wigner */ Complex K1BreitWigner(Energy2 q2) const { Energy2 m2 = sqr(_k1mass); Complex ii(0.,1.); complex<Energy2> fact(m2 - ii*_k1mass*_k1width); return fact/(fact-q2); } /** * Initialize the \f$a_1\f$ running width * @param iopt Initialization option (-1 full calculation, 0 set up the interpolation) */ void inita1Width(int iopt); /** * Breit-Wigners for the \f$\rho\f$ and \f$K^*\f$. * @param q2 The scale \f$q^2\f$ for the Breit-Wigner. * @param itype The type of Breit-Wigner, \e i.e. which masses and widths to use.x * @param ires Which multiplet to use. */ Complex rhoKBreitWigner(Energy2 q2,unsigned int itype,unsigned int ires) const; private: /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _rhoF123wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_{1,2,3}\f$ form factors. */ vector<double> _kstarF123wgts; /** * Parameters for the \f$\rho\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _rhoF5wgts; /** * Parameters for the \f$K^*\f$ Breit-Wigner in the * \f$F_5\f$ form factors. */ vector<double> _kstarF5wgts; /** * The relative weight of the \f$\rho\f$ and \f$K^*\f$ where needed. */ double _rhoKstarwgt; /** * 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; /** * Initialize the running \f$a_1\f$ width. */ bool _initializea1; /** * The mass of the \f$a_1\f$ resonances. */ Energy _a1mass; /** * The width of the \f$a_1\f$ resonances. */ Energy _a1width; /** * The mass of the \f$aK1\f$ resonances. */ Energy _k1mass; /** * The width of the \f$K_1\f$ resonances. */ Energy _k1width; /** * The pion decay constant, \f$f_\pi\f$. */ Energy _fpi; /** * The pion mass */ Energy _mpi; /** * The kaon mass */ Energy _mK; /** * use local values of the \f$\rho\f$ masses and widths */ bool _rhoparameters; /** * The \f$\rho\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123masses; /** * The \f$\rho\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5masses; /** * The \f$\rho\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _rhoF123widths; /** * The \f$\rho\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _rhoF5widths; /** * use local values of the \f$K^*\f$ resonances masses and widths */ bool _kstarparameters; /** * The \f$K^*\f$ masses for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123masses; /** * The \f$K^*\f$ masses for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5masses; /** * The \f$K^*\f$ widths for the \f$F_{1,2,3}\f$ form factors. */ vector<Energy> _kstarF123widths; /** * The \f$K^*\f$ widths for the \f$F_5\f$ form factors. */ vector<Energy> _kstarF5widths; /** * Use local values of the \f$a_1\f$ parameters */ bool _a1parameters; /** * Use local values of the \f$K_1\f$ parameters */ bool _k1parameters; /** * 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 /* THEPEG_ThreeMesonDefaultCurrent_H */ +#endif /* HERWIG_TwoKaonOnePionDefaultCurrent_H */