Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7877259
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Subscribers
None
View Options
diff --git a/Decay/WeakCurrents/OmegaPiPiCurrent.cc b/Decay/WeakCurrents/OmegaPiPiCurrent.cc
--- a/Decay/WeakCurrents/OmegaPiPiCurrent.cc
+++ b/Decay/WeakCurrents/OmegaPiPiCurrent.cc
@@ -1,314 +1,314 @@
-// -*- C++ -*-
++// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OmegaPiPiCurrent class.
//
#include "OmegaPiPiCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
using namespace Herwig;
OmegaPiPiCurrent::OmegaPiPiCurrent() {
- mRes_ = 1.67*GeV;
- wRes_ = 0.288*GeV;
- gRes_ = 0.469*GeV;
+ mRes_ = 1.69*GeV;
+ wRes_ = 0.285*GeV;
+ gRes_ = 1.63*GeV;
mSigma_ = 0.6*GeV;
wSigma_ = 1.0*GeV;
mf0_ = 0.98*GeV;
gSigma_ = 1.0 *GeV2;
- gf0_ = 0.85*GeV2;
+ gf0_ = 0.883*GeV2;
gPiPi_ = 0.165*GeV2;
gKK_ = 0.695*GeV2;
addDecayMode(1,-1);
addDecayMode(1,-1);
setInitialModes(2);
}
IBPtr OmegaPiPiCurrent::clone() const {
return new_ptr(*this);
}
IBPtr OmegaPiPiCurrent::fullclone() const {
return new_ptr(*this);
}
void OmegaPiPiCurrent::persistentOutput(PersistentOStream & os) const {
os << ounit(mRes_,GeV) << ounit(wRes_,GeV) << ounit(gRes_,GeV)
<< ounit(mSigma_,GeV) << ounit(wSigma_,GeV) << ounit(mf0_,GeV)
<< ounit(gPiPi_,GeV2) << ounit(gKK_,GeV2) << ounit(gSigma_,GeV2) << ounit(gf0_,GeV2);
}
void OmegaPiPiCurrent::persistentInput(PersistentIStream & is, int) {
is >> iunit(mRes_,GeV) >> iunit(wRes_,GeV) >> iunit(gRes_,GeV)
>> iunit(mSigma_,GeV) >> iunit(wSigma_,GeV) >> iunit(mf0_,GeV)
>> iunit(gPiPi_,GeV2) >> iunit(gKK_,GeV2) >> iunit(gSigma_,GeV2) >> iunit(gf0_,GeV2);
}
void OmegaPiPiCurrent::doinit() {
WeakCurrent::doinit();
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<OmegaPiPiCurrent,WeakCurrent>
describeHerwigOmegaPiPiCurrent("Herwig::OmegaPiPiCurrent", "HwWeakCurrents.so");
void OmegaPiPiCurrent::Init() {
static ClassDocumentation<OmegaPiPiCurrent> documentation
("The OmegaPiPiCurrent class provides the current for I=0 omega pi pi");
static Parameter<OmegaPiPiCurrent,Energy> interfacemRes
("mRes",
"The mass of the s-channel resonance",
&OmegaPiPiCurrent::mRes_, GeV, 1.62*GeV, 0.*GeV, 10.*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy> interfacewRes
("wRes",
"The width of the s-channel resonance",
&OmegaPiPiCurrent::wRes_, GeV, 0.288*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy> interfacegRes
("gRes",
"The coupling of the s-channel resonance",
&OmegaPiPiCurrent::gRes_, GeV, 2.83*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy> interfacemSigma
("mSigma",
"The mass of the Sigma",
&OmegaPiPiCurrent::mSigma_, GeV, 0.6*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy> interfacewSigma
("wSigma",
"The width of the Sigma",
&OmegaPiPiCurrent::wSigma_, GeV, 1.0*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy2> interfacegSigma
("gSigma",
"The coupling of the Sigma resonance",
&OmegaPiPiCurrent::gSigma_, GeV2, 1.0*GeV2, 0.0*GeV2, 10.0*GeV2,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy> interfacemf0
("mf0",
"The mass of the f_0(980)",
&OmegaPiPiCurrent::mf0_, GeV, 0.98*GeV, 0.0*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy2> interfacegf0
("gf0",
"The coupling of the f0(980) resonance",
&OmegaPiPiCurrent::gf0_, GeV2, 1.0*GeV2, 0.0*GeV2, 10.0*GeV2,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy2> interfacegPiPi
("gPiPi",
"The coupling of the f_0(980) to pipi",
&OmegaPiPiCurrent::gPiPi_, GeV2, 0.165*GeV2, 0.0*GeV2, 10.0*GeV2,
false, false, Interface::limited);
static Parameter<OmegaPiPiCurrent,Energy2> interfacegKK
("gKK",
"The coupling of the f_0(980) to KK",
&OmegaPiPiCurrent::gKK_, GeV2, 0.695*GeV2, 0.0*GeV2, 10.0*GeV2,
false, false, Interface::limited);
}
// complete the construction of the decay mode for integration
bool OmegaPiPiCurrent::createMode(int icharge, tcPDPtr resonance,
FlavourInfo flavour,
unsigned int, PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
// check the charge
if(icharge!=0) return false;
// check the total isospin
if(flavour.I!=IsoSpin::IUnknown && flavour.I!=IsoSpin::IZero) return false;
// check I_3
if(flavour.I3!=IsoSpin::I3Unknown && flavour.I3!=IsoSpin::I3Zero) return false;
// and other flavour
if(flavour.strange != Strangeness::Unknown and flavour.strange != Strangeness::Zero) return false;
if(flavour.charm != Charm::Unknown and flavour.charm != Charm::Zero ) return false;
if(flavour.bottom != Beauty::Unknown and flavour.bottom !=Beauty::Zero ) return false;
// check that the mode is are kinematical allowed
Energy min = getParticleData(ParticleID::omega)->massMin()+
2.*getParticleData(ParticleID::pi0)->mass();
if(min>upp) return false;
// resonances for the intermediate channels
tPDVector res = {getParticleData(30223)};
tPDVector res2 = {getParticleData(9000221),getParticleData(9010221)};
// set up the integration channels;
for(unsigned int ix=0;ix<res.size();++ix) {
if(resonance && resonance!=res[ix]) continue;
for(unsigned int iy=0;iy<res2.size();++iy) {
mode->addChannel((PhaseSpaceChannel(phase),ires,res[ix],
ires+1,iloc+1,ires+1,res2[iy],ires+2,iloc+2,ires+2,iloc+3));
}
}
return true;
}
// the particles produced by the current
tPDVector OmegaPiPiCurrent::particles(int icharge, unsigned int imode,int,int) {
assert(icharge==0 && imode<=1);
if(imode==0)
return {getParticleData(ParticleID::omega),
getParticleData(ParticleID::piplus),
getParticleData(ParticleID::piminus)};
else if(imode==1)
return {getParticleData(ParticleID::omega),
getParticleData(ParticleID::pi0),
getParticleData(ParticleID::pi0)};
else
assert(false);
}
void OmegaPiPiCurrent::constructSpinInfo(ParticleVector decay) const {
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix) {
temp[ix] = HelicityFunctions::polarizationVector(-decay[0]->momentum(),
ix,Helicity::outgoing);
}
VectorWaveFunction::constructSpinInfo(temp,decay[0],
outgoing,true,true);
for(unsigned int ix=1;ix<3;++ix)
ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true);
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
OmegaPiPiCurrent::current(tcPDPtr resonance,
FlavourInfo flavour,
const int, const int ichan, Energy & scale,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption) const {
// no isospin/flavour here
if(flavour.I!=IsoSpin::IUnknown && flavour.I!=IsoSpin::IZero) return vector<LorentzPolarizationVectorE>();
if(flavour.I3!=IsoSpin::I3Unknown && flavour.I3!=IsoSpin::I3Zero) return vector<LorentzPolarizationVectorE>();
if(flavour.strange != Strangeness::Unknown and flavour.strange != Strangeness::Zero) return vector<LorentzPolarizationVectorE>();
if(flavour.charm != Charm::Unknown and flavour.charm != Charm::Zero ) return vector<LorentzPolarizationVectorE>();
if(flavour.bottom != Beauty::Unknown and flavour.bottom !=Beauty::Zero ) return vector<LorentzPolarizationVectorE>();
if(resonance and resonance->id()!=30223) return vector<LorentzPolarizationVectorE>();
useMe();
// polarization vectors of the omega
vector<LorentzPolarizationVector> temp(3);
for(unsigned int ix=0;ix<3;++ix) {
temp[ix] = HelicityFunctions::polarizationVector(-momenta[0],ix,Helicity::outgoing);
}
// total momentum of the system
Lorentz5Momentum q(momenta[0]+momenta[1]+momenta[2]);
// overall hadronic mass
q.rescaleMass();
scale=q.mass();
Complex ii(0.,1.);
Energy2 q2(q.m2());
// resonance factor for s channel resonance
Energy2 mR2=sqr(mRes_);
complex<Energy> pre= mR2*gRes_/(q2-mR2 - ii*scale*wRes_);
//cerr << "pre factor " << scale/GeV << " " << q2/GeV2 << " " << pre/GeV << "\n";
// for(auto p : momenta) cerr << p/GeV << " " << p.m()/GeV << "\n";
// virtual mass energy for intermediate f0 channel
Energy2 s1 = (momenta[1]+momenta[2]).m2();
Energy sqrs1 = sqrt(s1);
//sigma meson
Energy2 mSigma2 = sqr(mSigma_);
Complex Sigma_form = gSigma_/(mSigma2 -s1 - ii*sqrs1*wSigma_);
// compute the form factor
Energy2 mf02 = sqr(mf0_);
Energy mPi = getParticleData(211)->mass();
Energy2 mPi2 = sqr(mPi);
complex<Energy2> mGamma = gPiPi_*sqrt(max(0.,1.-4.*mPi2/s1));
// cerr << "testing pi " << mGamma/GeV2 << " " << gPiPi_/GeV2 << " " << sqrt(max(0.,1.-4.*mPi2/s1))<< "\n";
Energy2 mKp2 = sqr(getParticleData(321)->mass());
double val = 1.-4.*mKp2/s1;
if(val>=0.) mGamma += 0.5*gKK_* sqrt( val);
else mGamma += 0.5*gKK_*ii*sqrt(-val);
Energy2 mK02 = sqr(getParticleData(311)->mass());
val = 1.-4.*mK02/s1;
if(val>=0.) mGamma += 0.5*gKK_* sqrt( val);
else mGamma += 0.5*gKK_*ii*sqrt(-val);
Complex f0_form = gf0_/(mf02-s1-Complex(0.,1.)*mGamma);
// cerr << "f0 pieces " << mGamma/GeV2 << "\n";
// cerr << "testing form factor " << s1/GeV2 << " " << f0_form << " " << Sigma_form << "\n";
complex<Energy> formFactor(ZERO);
if(ichan<0)
formFactor = (Sigma_form+f0_form)*pre;
else if(ichan==0)
formFactor = Sigma_form*pre;
else if(ichan==1)
formFactor = f0_form*pre;
// calculate the current
vector<LorentzPolarizationVectorE> ret(3);
for(unsigned int ix=0;ix<3;++ix) {
ret[ix] = formFactor*temp[ix];
}
return ret;
}
bool OmegaPiPiCurrent::accept(vector<int> id) {
if(id.size()!=3) return false;
unsigned int nomega(0),npip(0),npim(0),npi0(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(abs(id[ix])==ParticleID::piminus) ++npim;
if(abs(id[ix])==ParticleID::pi0 ) ++npi0;
if(abs(id[ix])==ParticleID::piplus ) ++npip;
else if(id[ix]==ParticleID::omega) ++nomega;
}
return nomega == 1 && (npi0==2 || (npip==1&&npim==1));
}
unsigned int OmegaPiPiCurrent::decayMode(vector<int> id) {
unsigned int npi0(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(abs(id[ix])==ParticleID::pi0 ) ++npi0;
}
return npi0==2 ? 1 : 0;
}
// output the information for the database
void OmegaPiPiCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::OmegaPiPiCurrent " << name()
<< " HwWeakCurrents.so\n";
output << "newdef " << name() << ":mRes " << " " << mRes_/GeV << "\n";
output << "newdef " << name() << ":wRes " << " " << wRes_/GeV << "\n";
output << "newdef " << name() << ":mSigma " << " " << mSigma_/GeV << "\n";
output << "newdef " << name() << ":wSigma " << " " << wSigma_/GeV << "\n";
output << "newdef " << name() << ":mf0 " << " " << mf0_/GeV << "\n";
output << "newdef " << name() << ":gRes " << " " << gRes_/GeV << "\n";
output << "newdef " << name() << ":gSigma " << " " << gSigma_/GeV2<< "\n";
output << "newdef " << name() << ":gf0 " << " " << gf0_/GeV2 << "\n";
output << "newdef " << name() << ":gPiPi " << " " << gPiPi_/GeV2 << "\n";
output << "newdef " << name() << ":gKK " << " " << gKK_/GeV2 << "\n";
WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 2:59 PM (1 d, 16 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3797476
Default Alt Text
(12 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment