Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7876894
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
36 KB
Subscribers
None
View Options
diff --git a/Decay/WeakCurrents/OmegaPionSNDCurrent.cc b/Decay/WeakCurrents/OmegaPionSNDCurrent.cc
--- a/Decay/WeakCurrents/OmegaPionSNDCurrent.cc
+++ b/Decay/WeakCurrents/OmegaPionSNDCurrent.cc
@@ -1,354 +1,354 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OmegaPionSNDCurrent class.
//
#include "OmegaPionSNDCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig/Utilities/Kinematics.h"
using namespace Herwig;
OmegaPionSNDCurrent::OmegaPionSNDCurrent() {
// modes handled
addDecayMode(2,-1);
addDecayMode(1,-1);
addDecayMode(2,-2);
setInitialModes(3);
// amplitudes for the weights in the current
- amp_ = {1.,0.26,0.06};
- phase_ = {0.,168.,10.};
+ amp_ = {1.,0.175,0.014};
+ phase_ = {0.,124.,-63.};
// rho masses and widths
- rhoMasses_ = {0.77526*GeV,1.491*GeV,1.708*GeV};
- rhoWidths_ = {0.1491 *GeV,0.4 *GeV,0.25 *GeV};
+ rhoMasses_ = {0.77526*GeV,1.510*GeV,1.720*GeV};
+ rhoWidths_ = {0.1491 *GeV,0.44 *GeV,0.25 *GeV};
// coupling
- gRhoOmegaPi_ = 15.6/GeV;
+ gRhoOmegaPi_ = 15.9/GeV;
fRho_ = 4.9583;
}
IBPtr OmegaPionSNDCurrent::clone() const {
return new_ptr(*this);
}
IBPtr OmegaPionSNDCurrent::fullclone() const {
return new_ptr(*this);
}
void OmegaPionSNDCurrent::doinit() {
WeakCurrent::doinit();
assert(phase_.size()==amp_.size());
wgts_.clear();
Complex ii(0.,1.);
for(unsigned int ix=0;ix<amp_.size();++ix) {
double phi = phase_[ix]/180.*Constants::pi;
wgts_.push_back(amp_[ix]*(cos(phi)+ii*sin(phi)));
}
mpi_ = getParticleData(ParticleID::piplus)->mass();
}
void OmegaPionSNDCurrent::persistentOutput(PersistentOStream & os) const {
os << ounit(rhoMasses_,GeV) << ounit(rhoWidths_,GeV)
<< amp_ << phase_ << wgts_ << fRho_
<< ounit(gRhoOmegaPi_,1./GeV) << ounit(mpi_,GeV);
}
void OmegaPionSNDCurrent::persistentInput(PersistentIStream & is, int) {
is >> iunit(rhoMasses_,GeV) >> iunit(rhoWidths_,GeV)
>> amp_ >> phase_ >> wgts_ >> fRho_
>> iunit(gRhoOmegaPi_,1./GeV) >> iunit(mpi_,GeV);
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<OmegaPionSNDCurrent,WeakCurrent>
describeHerwigOmegaPionSNDCurrent("Herwig::OmegaPionSNDCurrent",
"HwWeakCurrents.so");
void OmegaPionSNDCurrent::Init() {
static ClassDocumentation<OmegaPionSNDCurrent> documentation
("The OmegaPionSNDCurrent class provides a current for omega pi"
" using the model of SND",
- "The current based on \\cite{Achasov:2013btb} for $\\omega\\pi$ was used.\n",
- "\\bibitem{Achasov:2013btb}\n"
+ "The current based on \\cite{Achasov:2016zvn} for $\\omega\\pi$ was used.\n",
+ "\\bibitem{Achasov:2016zvn}"
"M.~N.~Achasov {\\it et al.},\n"
- "%``Study of $e^+e^- \\to \\omega\\pi^0 \\to \\pi^0\\pi^0\\gamma$ in the energy range $1.05-2.00$ GeV with SND,''\n"
- "Phys.\\ Rev.\\ D {\\bf 88} (2013) no.5, 054013\n"
- "doi:10.1103/PhysRevD.88.054013\n"
- "[arXiv:1303.5198 [hep-ex]].\n"
- "%%CITATION = doi:10.1103/PhysRevD.88.054013;%%\n"
- "%50 citations counted in INSPIRE as of 22 Aug 2018\n");
+ "%``Updated measurement of the $e^+e^- \\to \\omega \\pi^0 \\to \\pi^0\\pi^0\\gamma$ cross section with the SND detector,''\n"
+ "Phys.\\ Rev.\\ D {\\bf 94} (2016) no.11, 112001\n"
+ "doi:10.1103/PhysRevD.94.112001\n"
+ "[arXiv:1610.00235 [hep-ex]].\n"
+ "%%CITATION = doi:10.1103/PhysRevD.94.112001;%%\n"
+ "%12 citations counted in INSPIRE as of 22 Aug 2018\n");
static ParVector<OmegaPionSNDCurrent,Energy> interfaceRhoMasses
("RhoMasses",
"The masses of the rho mesons",
&OmegaPionSNDCurrent::rhoMasses_, GeV, -1, 775.26*MeV,
0.5*GeV, 10.0*GeV,
false, false, Interface::limited);
static ParVector<OmegaPionSNDCurrent,Energy> interfaceRhoWidths
("RhoWidths",
"The widths of the rho mesons",
&OmegaPionSNDCurrent::rhoWidths_, GeV, -1, 0.1491*GeV,
0.5*GeV, 10.0*GeV,
false, false, Interface::limited);
static ParVector<OmegaPionSNDCurrent,double> interfaceAmplitudes
("Amplitudes",
"THe amplitudes for the different rho resonances",
&OmegaPionSNDCurrent::amp_, -1, 1.0, 0.0, 10.0,
false, false, Interface::limited);
static ParVector<OmegaPionSNDCurrent,double> interfacePhase
("Phase",
"The phases for the different rho resonances in degrees",
&OmegaPionSNDCurrent::phase_, -1, 0., 0.0, 360.,
false, false, Interface::limited);
static Parameter<OmegaPionSNDCurrent,double> interfacefRho
("fRho",
"The coupling of the photon and the rho meson",
&OmegaPionSNDCurrent::fRho_, 4.9583, 0.0, 100.0,
false, false, Interface::limited);
static Parameter<OmegaPionSNDCurrent,InvEnergy> interfacegRhoOmegaPi
("gRhoOmegaPi",
"The coupling rho-omega-pi",
&OmegaPionSNDCurrent::gRhoOmegaPi_, 1./GeV,
- 15.6/GeV, 0./GeV, 1000./GeV,
+ 15.9/GeV, 0./GeV, 1000./GeV,
false, false, Interface::limited);
}
// complete the construction of the decay mode for integration
bool OmegaPionSNDCurrent::createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
// check the charge
if((abs(icharge)!=3 && imode == 0) ||
( icharge!=0 && imode >= 1))
return false;
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal!=IsoSpin::IOne) return false;
}
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
if(imode!=1) return false;
break;
case IsoSpin::I3One:
if(imode>1 || icharge ==-3) return false;
break;
case IsoSpin::I3MinusOne:
if(imode>1 || icharge ==3) return false;
default:
return false;
}
}
// check that the mode is are kinematical allowed
Energy min(getParticleData(ParticleID::piplus)->mass()+
getParticleData(ParticleID::pi0 )->mass());
if(min>upp) return false;
// set up the integration channels;
vector<tPDPtr> rho;
if(icharge==-3)
rho = {getParticleData(-213),getParticleData(-100213),getParticleData(-30213)};
else if(icharge==0)
rho = {getParticleData( 113),getParticleData( 100113),getParticleData( 30113)};
else if(icharge==3)
rho = {getParticleData( 213),getParticleData( 100213),getParticleData( 30213)};
for(unsigned int ix=0;ix<3;++ix) {
if(resonance && resonance!=rho[ix]) continue;
mode->addChannel((PhaseSpaceChannel(phase),ires,rho[ix],
ires+1,iloc+1,ires+1,iloc+2));
}
// reset the masses and widths of the resonances if needed
for(unsigned int ix=0;ix<3;++ix) {
mode->resetIntermediate(rho[ix],rhoMasses_[ix],rhoWidths_[ix]);
}
return true;
}
// the particles produced by the current
tPDVector OmegaPionSNDCurrent::particles(int icharge, unsigned int imode,int,int) {
tPDVector extpart = {tPDPtr(),
getParticleData(ParticleID::omega)};
if(imode==0) {
if(icharge==3) extpart[0] = getParticleData(ParticleID::piplus );
else if(icharge==-3) extpart[0] = getParticleData(ParticleID::piminus);
}
else {
extpart[0] = getParticleData(ParticleID::pi0);
}
return extpart;
}
void OmegaPionSNDCurrent::constructSpinInfo(ParticleVector decay) const {
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix) {
temp[ix] = HelicityFunctions::polarizationVector(-decay[1]->momentum()
,ix,Helicity::outgoing);
}
ScalarWaveFunction::constructSpinInfo(decay[0],outgoing,true);
VectorWaveFunction::constructSpinInfo(temp,decay[1],
outgoing,true,true);
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
OmegaPionSNDCurrent::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) const {
int icharge = outgoing[0]->iCharge()+outgoing[1]->iCharge();
// check the charge
if((abs(icharge)!=3 && imode == 0) ||
( icharge!=0 && imode == 1))
return vector<LorentzPolarizationVectorE>();
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal!=IsoSpin::IOne) return vector<LorentzPolarizationVectorE>();
}
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
if(imode!=1) return vector<LorentzPolarizationVectorE>();
break;
case IsoSpin::I3One:
if(imode>1 || icharge ==-3) return vector<LorentzPolarizationVectorE>();
break;
case IsoSpin::I3MinusOne:
if(imode>1 || icharge ==3) return vector<LorentzPolarizationVectorE>();
default:
return vector<LorentzPolarizationVectorE>();
}
}
useMe();
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix)
temp[ix] = HelicityFunctions::polarizationVector(-momenta[1],ix,Helicity::outgoing);
// locate the particles
Lorentz5Momentum q(momenta[0]+momenta[1]);
// overall hadronic mass
q.rescaleMass();
scale=q.mass();
Energy2 q2(q.m2());
// compute the rho width
Energy2 mr2(sqr(rhoMasses_[0]));
Energy grho = rhoWidths_[0]*mr2/q2*pow((q2-4.*sqr(mpi_))/(mr2-4.*sqr(mpi_)),1.5);
Energy qw = Kinematics::pstarTwoBodyDecay(q.mass(),momenta[0].mass(),momenta[1].mass());
grho += pow<3,1>(qw)*sqr(gRhoOmegaPi_)/12./Constants::pi;
unsigned int imin=0, imax = wgts_.size();
if(ichan>0) {
imin = ichan;
imax = ichan+1;
}
if(resonance) {
switch(resonance->id()/1000) {
case 0:
imin = 0;
break;
case 100:
imin = 1;
break;
case 30 :
imin = 2;
break;
default:
assert(false);
}
imax=imin+1;
}
// compute the prefactor
complex<InvEnergy> pre = gRhoOmegaPi_/fRho_;
Complex bw(0.);
for(unsigned int ix=imin;ix<imax;++ix) {
Energy wid = ix==0 ? grho : rhoWidths_[ix];
Energy2 mR2 = sqr(rhoMasses_[ix]);
bw += mR2*wgts_[ix]/(mR2-q2-Complex(0.,1.)*q.mass()*wid);
}
pre *=bw;
vector<LorentzPolarizationVectorE> ret(3);
for(unsigned int ix=0;ix<3;++ix) {
ret[ix] = pre*Helicity::epsilon(q,temp[ix],momenta[1]);
}
return ret;
}
bool OmegaPionSNDCurrent::accept(vector<int> id) {
if(id.size()!=2){return false;}
unsigned int npiplus(0),npi0(0),nomega(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(abs(id[ix])==ParticleID::piplus) ++npiplus;
else if(id[ix]==ParticleID::omega) ++nomega;
else if(id[ix]==ParticleID::pi0) ++npi0;
}
return nomega==1 && (npiplus==1||npi0==1);
}
unsigned int OmegaPionSNDCurrent::decayMode(vector<int> id) {
int npip(0),npim(0),npi0(0),nomega(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::pi0) ++npi0;
else if(id[ix]==ParticleID::omega) ++nomega;
}
if((npip==1 || npim == 1) && nomega==1)
return 0;
else
return 1;
}
// output the information for the database
void OmegaPionSNDCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::OmegaPionSNDCurrent " << name()
<< " HwWeakCurrents.so\n";
for(unsigned int ix=0;ix<rhoMasses_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":RhoMasses " << ix
<< " " << rhoMasses_[ix]/GeV << "\n";
else output << "insert " << name() << ":RhoMasses " << ix
<< " " << rhoMasses_[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<rhoWidths_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":RhoWidths " << ix
<< " " << rhoWidths_[ix]/GeV << "\n";
else output << "insert " << name() << ":RhoWidths " << ix
<< " " << rhoWidths_[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<amp_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":Amplitudes " << ix
<< " " << amp_[ix] << "\n";
else output << "insert " << name() << ":Amplitudes " << ix
<< " " << amp_[ix] << "\n";
}
for(unsigned int ix=0;ix<phase_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":Phases " << ix
<< " " << phase_[ix] << "\n";
else output << "insert " << name() << ":Phases " << ix
<< " " << phase_[ix] << "\n";
}
output << "newdef " << name() << ":fRho " << fRho_ << "\n";
output << "newdef " << name() << ":gRhoOmegaPi " << gRhoOmegaPi_*GeV << "\n";
WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
}
diff --git a/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.cc b/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.cc
--- a/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.cc
+++ b/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.cc
@@ -1,419 +1,420 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the TwoPionPhotonSNDCurrent class.
//
#include "TwoPionPhotonSNDCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig/Utilities/Kinematics.h"
using namespace Herwig;
TwoPionPhotonSNDCurrent::TwoPionPhotonSNDCurrent() {
// modes handled
addDecayMode(2,-1);
addDecayMode(1,-1);
addDecayMode(2,-2);
setInitialModes(3);
// amplitudes for the weights in the current
- amp_ = {1.,0.26,0.06};
- phase_ = {0.,168.,10.};
+ amp_ = {1.,0.175,0.014};
+ phase_ = {0.,124.,-63.};
// rho masses and widths
- rhoMasses_ = {0.77526*GeV,1.491*GeV,1.708*GeV};
- rhoWidths_ = {0.1491 *GeV,0.4 *GeV,0.25 *GeV};
+ rhoMasses_ = {0.77526*GeV,1.510*GeV,1.720*GeV};
+ rhoWidths_ = {0.1491 *GeV,0.44 *GeV,0.25 *GeV};
// coupling
- gRhoOmegaPi_ = 15.6/GeV;
+ gRhoOmegaPi_ = 15.9/GeV;
+ fRho_ = 4.9583;
gGammaOmegaPi_ = 0.695821538653/GeV;
fRho_ = 4.9583;
// omega parameters
omegaMass_ = 782.65*MeV;
omegaWidth_ = 8.49 *MeV;
}
IBPtr TwoPionPhotonSNDCurrent::clone() const {
return new_ptr(*this);
}
IBPtr TwoPionPhotonSNDCurrent::fullclone() const {
return new_ptr(*this);
}
void TwoPionPhotonSNDCurrent::doinit() {
WeakCurrent::doinit();
assert(phase_.size()==amp_.size());
wgts_.clear();
Complex ii(0.,1.);
for(unsigned int ix=0;ix<amp_.size();++ix) {
double phi = phase_[ix]/180.*Constants::pi;
wgts_.push_back(amp_[ix]*(cos(phi)+ii*sin(phi)));
}
mpi_ = getParticleData(ParticleID::piplus)->mass();
}
void TwoPionPhotonSNDCurrent::persistentOutput(PersistentOStream & os) const {
os << ounit(rhoMasses_,GeV) << ounit(rhoWidths_,GeV)
<< amp_ << phase_ << wgts_ << fRho_
<< ounit(gRhoOmegaPi_,1./GeV) << ounit(gGammaOmegaPi_,1./GeV)
<< ounit(omegaMass_,GeV) << ounit(omegaWidth_,GeV) << ounit(mpi_,GeV);
}
void TwoPionPhotonSNDCurrent::persistentInput(PersistentIStream & is, int) {
is >> iunit(rhoMasses_,GeV) >> iunit(rhoWidths_,GeV)
>> amp_ >> phase_ >> wgts_ >> fRho_
>> iunit(gRhoOmegaPi_,1./GeV) >> iunit(gGammaOmegaPi_,1./GeV)
>> iunit(omegaMass_,GeV) >> iunit(omegaWidth_,GeV) >> iunit(mpi_,GeV);
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<TwoPionPhotonSNDCurrent,WeakCurrent>
describeHerwigTwoPionPhotonSNDCurrent("Herwig::TwoPionPhotonSNDCurrent",
"HwWeakCurrents.so");
void TwoPionPhotonSNDCurrent::Init() {
static ClassDocumentation<TwoPionPhotonSNDCurrent> documentation
("The TwoPionPhotonSNDCurrent class provides the weka current for"
"pi pi gamma using the model of SND",
- "The current based on \\cite{Achasov:2013btb} for $\\pi\\pi^0\\gamma$ was used.\n",
- "\\bibitem{Achasov:2013btb}\n"
+ "The current based on \\cite{Achasov:2016zvn} for $\\pi\\pi^0\\gamma$ was used.\n",
+ "\\bibitem{Achasov:2016zvn}"
"M.~N.~Achasov {\\it et al.},\n"
- "%``Study of $e^+e^- \\to \\omega\\pi^0 \\to \\pi^0\\pi^0\\gamma$ in the energy range $1.05-2.00$ GeV with SND,''\n"
- "Phys.\\ Rev.\\ D {\\bf 88} (2013) no.5, 054013\n"
- "doi:10.1103/PhysRevD.88.054013\n"
- "[arXiv:1303.5198 [hep-ex]].\n"
- "%%CITATION = doi:10.1103/PhysRevD.88.054013;%%\n"
- "%50 citations counted in INSPIRE as of 22 Aug 2018\n");
+ "%``Updated measurement of the $e^+e^- \\to \\omega \\pi^0 \\to \\pi^0\\pi^0\\gamma$ cross section with the SND detector,''\n"
+ "Phys.\\ Rev.\\ D {\\bf 94} (2016) no.11, 112001\n"
+ "doi:10.1103/PhysRevD.94.112001\n"
+ "[arXiv:1610.00235 [hep-ex]].\n"
+ "%%CITATION = doi:10.1103/PhysRevD.94.112001;%%\n"
+ "%12 citations counted in INSPIRE as of 22 Aug 2018\n");
static ParVector<TwoPionPhotonSNDCurrent,Energy> interfaceRhoMasses
("RhoMasses",
"The masses of the rho mesons",
&TwoPionPhotonSNDCurrent::rhoMasses_, GeV, -1, 775.26*MeV,
0.5*GeV, 10.0*GeV,
false, false, Interface::limited);
static ParVector<TwoPionPhotonSNDCurrent,Energy> interfaceRhoWidths
("RhoWidths",
"The widths of the rho mesons",
&TwoPionPhotonSNDCurrent::rhoWidths_, GeV, -1, 0.1491*GeV,
0.5*GeV, 10.0*GeV,
false, false, Interface::limited);
static ParVector<TwoPionPhotonSNDCurrent,double> interfaceAmplitudes
("Amplitudes",
"THe amplitudes for the different rho resonances",
&TwoPionPhotonSNDCurrent::amp_, -1, 1.0, 0.0, 10.0,
false, false, Interface::limited);
static ParVector<TwoPionPhotonSNDCurrent,double> interfacePhase
("Phase",
"The phases for the different rho resonances in degrees",
&TwoPionPhotonSNDCurrent::phase_, -1, 0., 0.0, 360.,
false, false, Interface::limited);
static Parameter<TwoPionPhotonSNDCurrent,double> interfacefRho
("fRho",
"The coupling of the photon and the rho meson",
&TwoPionPhotonSNDCurrent::fRho_, 4.9583, 0.0, 100.0,
false, false, Interface::limited);
static Parameter<TwoPionPhotonSNDCurrent,InvEnergy> interfacegRhoOmegaPi
("gRhoOmegaPi",
"The coupling rho-omega-pi",
&TwoPionPhotonSNDCurrent::gRhoOmegaPi_, 1./GeV,
- 15.6/GeV, 0./GeV, 1000./GeV,
+ 15.9/GeV, 0./GeV, 1000./GeV,
false, false, Interface::limited);
static Parameter<TwoPionPhotonSNDCurrent,InvEnergy> interfacegGammaOmegaPi
("gGammaOmegaPi",
"The coupling gamma-omega-pi",
&TwoPionPhotonSNDCurrent::gGammaOmegaPi_, 1./GeV,
0.695821538653/GeV, 0./GeV, 1000./GeV,
false, false, Interface::limited);
static Parameter<TwoPionPhotonSNDCurrent,Energy> interfaceOmegaMass
("OmegaMass",
"The mass of the omega meson",
&TwoPionPhotonSNDCurrent::omegaMass_, GeV, 0.78265*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<TwoPionPhotonSNDCurrent,Energy> interfaceOmegaWidth
("OmegaWidth",
"The width of the omega meson",
&TwoPionPhotonSNDCurrent::omegaWidth_, GeV, 8.49*MeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
}
// complete the construction of the decay mode for integration
bool TwoPionPhotonSNDCurrent::createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
// check the charge
if((abs(icharge)!=3 && imode == 0) ||
( icharge!=0 && imode >= 1))
return false;
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal!=IsoSpin::IOne) return false;
}
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
if(imode!=1) return false;
break;
case IsoSpin::I3One:
if(imode>1 || icharge ==-3) return false;
break;
case IsoSpin::I3MinusOne:
if(imode>1 || icharge ==3) return false;
default:
return false;
}
}
// check that the mode is are kinematical allowed
Energy min(getParticleData(ParticleID::piplus)->mass()+
getParticleData(ParticleID::pi0 )->mass());
if(min>upp) return false;
// set up the integration channels;
tPDPtr omega(getParticleData(ParticleID::omega));
vector<tPDPtr> rho;
if(icharge==-3)
rho = {getParticleData(-213),getParticleData(-100213),getParticleData(-30213)};
else if(icharge==0)
rho = {getParticleData( 113),getParticleData( 100113),getParticleData( 30113)};
else if(icharge==3)
rho = {getParticleData( 213),getParticleData( 100213),getParticleData( 30213)};
for(unsigned int ix=0;ix<3;++ix) {
if(resonance && resonance!=rho[ix]) continue;
mode->addChannel((PhaseSpaceChannel(phase),ires,rho[ix],
ires+1,omega,ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
// channel with the pions exchanged
if(icharge==0)
mode->addChannel((PhaseSpaceChannel(phase),ires,rho[ix],
ires+1,omega,ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
}
// reset the masses and widths of the resonances if needed
for(unsigned int ix=0;ix<3;++ix) {
mode->resetIntermediate(rho[ix],rhoMasses_[ix],rhoWidths_[ix]);
}
// set up the omega masses and widths
mode->resetIntermediate(omega,omegaMass_,omegaWidth_);
return true;
}
// the particles produced by the current
tPDVector TwoPionPhotonSNDCurrent::particles(int icharge, unsigned int imode,int,int) {
tPDVector extpart = {tPDPtr(),
getParticleData(ParticleID::pi0),
getParticleData(ParticleID::gamma)};
if(imode==0) {
if(icharge==3) extpart[0] = getParticleData(ParticleID::piplus );
else if(icharge==-3) extpart[0] = getParticleData(ParticleID::piminus);
}
else {
extpart[0] = getParticleData(ParticleID::pi0);
}
return extpart;
}
void TwoPionPhotonSNDCurrent::constructSpinInfo(ParticleVector decay) const {
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix) {
if(ix==1) ++ix;
temp[ix] = HelicityFunctions::polarizationVector(-decay[2]->momentum()
,ix,Helicity::outgoing);
}
for(unsigned int ix=0;ix<2;++ix)
ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true);
VectorWaveFunction::constructSpinInfo(temp,decay[2],
outgoing,true,true);
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
TwoPionPhotonSNDCurrent::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) const {
int icharge = outgoing[0]->iCharge()+outgoing[1]->iCharge()+outgoing[2]->iCharge();
// check the charge
if((abs(icharge)!=3 && imode == 0) ||
( icharge!=0 && imode == 1))
return vector<LorentzPolarizationVectorE>();
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal!=IsoSpin::IOne) return vector<LorentzPolarizationVectorE>();
}
// check I_3
if(i3!=IsoSpin::I3Unknown) {
switch(i3) {
case IsoSpin::I3Zero:
if(imode!=1) return vector<LorentzPolarizationVectorE>();
break;
case IsoSpin::I3One:
if(imode>1 || icharge ==-3) return vector<LorentzPolarizationVectorE>();
break;
case IsoSpin::I3MinusOne:
if(imode>1 || icharge ==3) return vector<LorentzPolarizationVectorE>();
default:
return vector<LorentzPolarizationVectorE>();
}
}
useMe();
// polarization vectors of the photon
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix) {
if(ix==1) ++ix;
temp[ix] = HelicityFunctions::polarizationVector(-momenta[2],ix,Helicity::outgoing);
}
// total momentum of the system
Lorentz5Momentum q(momenta[0]+momenta[1]+momenta[2]);
// overall hadronic mass
q.rescaleMass();
scale=q.mass();
Energy2 q2(q.m2());
unsigned int imin=0, imax = wgts_.size();
if(ichan>0) {
if(outgoing[0]!=outgoing[1])
imin = ichan;
else
imin = ichan/2;
imax = imin+1;
}
if(resonance) {
switch(resonance->id()/1000) {
case 0:
imin = 0;
break;
case 100:
imin = 1;
break;
case 30 :
imin = 2;
break;
default:
assert(false);
}
imax=imin+1;
}
vector<LorentzPolarizationVectorE> ret(3);
// need to include exchange of identical particles for the I_3=0 case
for(int iorder=0;iorder<2;++iorder) {
Lorentz5Momentum pout(momenta[2]);
if(outgoing[0]==outgoing[1]) {
if(ichan>=0&& ichan%2!=iorder) continue;
}
else if(iorder==1) continue;
// add pion momentum
if(iorder==0) pout += momenta[1];
else pout += momenta[0];
// mass of the omega
pout.rescaleMass();
Energy2 s2(pout.m2());
// compute the rho width
Energy2 mr2(sqr(rhoMasses_[0]));
Energy grho = rhoWidths_[0]*mr2/q2*pow(max(double((q2-4.*sqr(mpi_))/(mr2-4.*sqr(mpi_))),0.),1.5);
Energy qw = Kinematics::pstarTwoBodyDecay(q.mass(),pout.mass(),mpi_);
grho += pow<3,1>(qw)*sqr(gRhoOmegaPi_)/12./Constants::pi;
// compute the prefactor
complex<InvEnergy4> pre = gRhoOmegaPi_*gGammaOmegaPi_/fRho_*
Resonance::BreitWignerFW(s2,omegaMass_,omegaWidth_)/sqr(omegaMass_);
if(imode==0) pre *=sqrt(2.);
Complex bw(0.);
for(unsigned int ix=imin;ix<imax;++ix) {
Energy wid = ix==0 ? grho : rhoWidths_[ix];
Energy2 mR2 = sqr(rhoMasses_[ix]);
bw += mR2*wgts_[ix]/(mR2-q2-Complex(0.,1.)*q.mass()*wid);
}
pre *=bw;
for(unsigned int ix=0;ix<3;++ix) {
if(ix==1) continue;
LorentzVector<complex<Energy2> > v2 = Helicity::epsilon(pout,temp[ix],momenta[2]);
ret[ix] += pre*scale*Helicity::epsilon(q,v2,pout);
}
}
return ret;
}
bool TwoPionPhotonSNDCurrent::accept(vector<int> id) {
if(id.size()!=3){return false;}
unsigned int npiplus(0),npi0(0),ngamma(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(abs(id[ix])==ParticleID::piplus) ++npiplus;
else if(id[ix]==ParticleID::gamma) ++ngamma;
else if(id[ix]==ParticleID::pi0) ++npi0;
}
return (npiplus==1&&ngamma==1&&npi0==1) ||
(npi0==2&&ngamma==1);
}
unsigned int TwoPionPhotonSNDCurrent::decayMode(vector<int> id) {
int npip(0),npim(0),npi0(0),ngamma(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::pi0) ++npi0;
else if(id[ix]==ParticleID::gamma) ++ngamma;
}
if((npip==1 || npim == 1) && npi0==1 && ngamma==1)
return 0;
else
return 1;
}
// output the information for the database
void TwoPionPhotonSNDCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::TwoPionPhotonSNDCurrent " << name()
<< " HwWeakCurrents.so\n";
for(unsigned int ix=0;ix<rhoMasses_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":RhoMasses " << ix
<< " " << rhoMasses_[ix]/GeV << "\n";
else output << "insert " << name() << ":RhoMasses " << ix
<< " " << rhoMasses_[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<rhoWidths_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":RhoWidths " << ix
<< " " << rhoWidths_[ix]/GeV << "\n";
else output << "insert " << name() << ":RhoWidths " << ix
<< " " << rhoWidths_[ix]/GeV << "\n";
}
for(unsigned int ix=0;ix<amp_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":Amplitudes " << ix
<< " " << amp_[ix] << "\n";
else output << "insert " << name() << ":Amplitudes " << ix
<< " " << amp_[ix] << "\n";
}
for(unsigned int ix=0;ix<phase_.size();++ix) {
if(ix<3) output << "newdef " << name() << ":Phases " << ix
<< " " << phase_[ix] << "\n";
else output << "insert " << name() << ":Phases " << ix
<< " " << phase_[ix] << "\n";
}
output << "newdef " << name() << ":fRho " << fRho_ << "\n";
output << "newdef " << name() << ":gRhoOmegaPi " << gRhoOmegaPi_*GeV << "\n";
output << "newdef " << name() << ":gGammaOmegaPi " << gGammaOmegaPi_*GeV << "\n";
output << "newdef " << name() << ":OmegaMass " << omegaMass_/GeV << "\n";
output << "newdef " << name() << ":OmegaWidth " << omegaWidth_/GeV << "\n";
WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
}
diff --git a/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.h b/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.h
--- a/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.h
+++ b/Decay/WeakCurrents/TwoPionPhotonSNDCurrent.h
@@ -1,244 +1,243 @@
// -*- C++ -*-
#ifndef Herwig_TwoPionPhotonSNDCurrent_H
#define Herwig_TwoPionPhotonSNDCurrent_H
//
// This is the declaration of the TwoPionPhotonSNDCurrent class.
//
#include "WeakCurrent.h"
namespace Herwig {
using namespace ThePEG;
/**
* The TwoPionPhotonSNDCurrent class implements the decay current for \f$\pi^\pm\pi^0 \gamma\f$ via
* an intermediate \f$\omega\f$. It inherits from the <code>WeakCurrent</code>
* class and implements the hadronic current.
*
* The model is based on the one from Phys.Rev. D88 (2013) no.5, 054013.
*
* @see \ref TwoPionPhotonSNDCurrentInterfaces "The interfaces"
* defined for TwoPionPhotonSNDCurrent.
*/
class TwoPionPhotonSNDCurrent: public WeakCurrent {
public:
/**
* The default constructor.
*/
TwoPionPhotonSNDCurrent();
-
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 );
/**
* The particles produced by the current. This just returns the pseudoscalar
* meson.
* @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);
//@}
/**
* 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;
/**
* Construct the SpinInfo for the decay products
*/
virtual void constructSpinInfo(ParticleVector decay) const;
/**
* Accept the decay. Checks the meson 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 meson 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);
/**
* Output the setup information for the particle database
* @param os The stream to output the information to
* @param header Whether or not to output the information for MySQL
* @param create Whether or not to add a statement creating the object
*/
virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/** @name Clone Methods. */
//@{
/**
* Make a simple clone of this object.
* @return a pointer to the new object.
*/
virtual IBPtr clone() const;
/** Make a clone of this object, possibly modifying the cloned object
* to make it sane.
* @return a pointer to the new object.
*/
virtual IBPtr fullclone() const;
//@}
protected:
/**
* Initialize this object after the setup phase before saving an
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
TwoPionPhotonSNDCurrent & operator=(const TwoPionPhotonSNDCurrent &);
private :
/**
* Masses of the \f$\rho\f$ resonances
*/
vector<Energy> rhoMasses_;
/**
* Widths of the \f$\rho\f$ resonances
*/
vector<Energy> rhoWidths_;
/**
* Ampltitudes for the different rhos in the current
*/
vector<double> amp_;
/**
* Phases for the different rhos in the current
*/
vector<double> phase_;
/**
* Weights of the different rho resonances in the current
*/
vector<Complex> wgts_;
/**
* Coupling of the rho to the photon, \f$f_\rho\f$.
*/
double fRho_;
/**
* Coupling of the rho to the omega and a pion, \f$g_{\rho\omega\pi}\f$.
*/
InvEnergy gRhoOmegaPi_;
/**
* Coupling of the photon to the omega and a pion, \f$g_{\gamma\omega\pi}\f$.
*/
InvEnergy gGammaOmegaPi_;
/**
* The \f$\omega\f$ mass.
*/
Energy omegaMass_;
/**
* The \f$\omega\f$ width.
*/
Energy omegaWidth_;
/**
* The pion mass
*/
Energy mpi_;
};
}
#endif /* Herwig_TwoPionPhotonSNDCurrent_H */
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 2:30 PM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3804744
Default Alt Text
(36 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment