Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7879162
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
15 KB
Subscribers
None
View Options
diff --git a/Decay/WeakCurrents/KKPiCurrent.cc b/Decay/WeakCurrents/KKPiCurrent.cc
--- a/Decay/WeakCurrents/KKPiCurrent.cc
+++ b/Decay/WeakCurrents/KKPiCurrent.cc
@@ -1,373 +1,380 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the KKPiCurrent class.
//
#include "KKPiCurrent.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/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/epsilon.h"
using namespace Herwig;
KKPiCurrent::KKPiCurrent() {
// masses for the isoscalar component
isoScalarMasses_ = {782.65*MeV,1019.461*MeV,1425*MeV,1680*MeV,1625*MeV,2188*MeV};
isoScalarWidths_ = { 8.49*MeV, 4.249*MeV, 215*MeV, 150*MeV, 315*MeV, 83*MeV};
// masses for the isovector component
isoVectorMasses_ = {775.26*MeV,1465*MeV,1720*MeV};
isoVectorWidths_ = {149.1 *MeV, 400*MeV, 250*MeV};
// amplitude and phases for the isoscalar
- isoScalarKStarAmp_ ={ZERO,ZERO,ZERO,11./GeV,ZERO,ZERO};
+ isoScalarKStarAmp_ ={ZERO,ZERO,ZERO,0.096/GeV,ZERO,ZERO};
isoScalarKStarPhase_={ 0., 0., 0., 0., 0., 0.};
// amplitudes and phase for the isovector component
- isoVectorKStarAmp_ ={ZERO,ZERO,4.5/GeV};
+ isoVectorKStarAmp_ ={ZERO,ZERO,0.04/GeV};
isoVectorKStarPhase_={0.,0.,Constants::pi};
// Coupling for the K* to Kpi
- gKStar_ = 5.38;
+ gKStar_ = 5.37392360229;
// mstar masses
- mKStarP_ = 895.5 *MeV;
- mKStar0_ = 895.55*MeV;
- wKStarP_ = 46.2 *MeV;
- wKStar0_ = 47.3 *MeV;
+ mKStarP_ = 895.6*MeV;
+ mKStar0_ = 895.6*MeV;
+ wKStarP_ = 47.0*MeV;
+ wKStar0_ = 47.0*MeV;
+ // modes
+ addDecayMode(3,-3);
+ addDecayMode(3,-3);
+ addDecayMode(3,-3);
+ addDecayMode(3,-3);
+ addDecayMode(3,-3);
+ addDecayMode(3,-3);
}
IBPtr KKPiCurrent::clone() const {
return new_ptr(*this);
}
IBPtr KKPiCurrent::fullclone() const {
return new_ptr(*this);
}
void KKPiCurrent::doinit() {
WeakCurrent::doinit();
static const Complex ii(0.,1.);
assert(isoScalarKStarAmp_.size()==isoScalarKStarPhase_.size());
for(unsigned int ix=0;ix<isoScalarKStarAmp_.size();++ix)
isoScalarKStarCoup_.push_back(isoScalarKStarAmp_[ix]*(cos(isoScalarKStarPhase_[ix])
+ii*sin(isoScalarKStarPhase_[ix])));
assert(isoVectorKStarAmp_.size()==isoVectorKStarPhase_.size());
for(unsigned int ix=0;ix<isoVectorKStarAmp_.size();++ix)
isoVectorKStarCoup_.push_back(isoVectorKStarAmp_[ix]*(cos(isoVectorKStarPhase_[ix])
+ii*sin(isoVectorKStarPhase_[ix])));
}
void KKPiCurrent::persistentOutput(PersistentOStream & os) const {
os << ounit(isoScalarMasses_,GeV) << ounit(isoScalarWidths_,GeV)
<< ounit(isoVectorMasses_,GeV) << ounit(isoVectorWidths_,GeV)
<< ounit(isoScalarKStarAmp_,1./GeV) << ounit(isoVectorKStarAmp_,1./GeV)
<< isoScalarKStarPhase_ << isoVectorKStarPhase_
<< ounit(isoScalarKStarCoup_,1./GeV) << ounit(isoVectorKStarCoup_,1./GeV)
<< gKStar_
<< ounit(mKStarP_,GeV) << ounit(mKStar0_,GeV)
<< ounit(wKStarP_,GeV) << ounit(wKStar0_,GeV);
}
void KKPiCurrent::persistentInput(PersistentIStream & is, int) {
is >> iunit(isoScalarMasses_,GeV) >> iunit(isoScalarWidths_,GeV)
>> iunit(isoVectorMasses_,GeV) >> iunit(isoVectorWidths_,GeV)
>> iunit(isoScalarKStarAmp_,1./GeV) >> iunit(isoVectorKStarAmp_,1./GeV)
>> isoScalarKStarPhase_ >> isoVectorKStarPhase_
>> iunit(isoScalarKStarCoup_,1./GeV) >> iunit(isoVectorKStarCoup_,1./GeV)
>> gKStar_
>> iunit(mKStarP_,GeV) >> iunit(mKStar0_,GeV)
>> iunit(wKStarP_,GeV) >> iunit(wKStar0_,GeV);
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<KKPiCurrent,WeakCurrent>
describeHerwigKKPiCurrent("Herwig::KKPiCurrent", "HwWeakCurrents.so");
void KKPiCurrent::Init() {
static ClassDocumentation<KKPiCurrent> documentation
("There is no documentation for the KKPiCurrent class");
}
// complete the construction of the decay mode for integration
bool KKPiCurrent::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(icharge!=0) return false;
if(imode>5) return false;
// check the total isospin
// if(Itotal!=IsoSpin::IUnknown) {
// if(Itotal==IsoSpin::IZero) {
// if(i3!=IsoSpin::I3Unknown) return false;
// }
// else if(Itotal==IsoSpin::IOne) {
// if(i3!=IsoSpin::I3Unknown&&
// i3!=IsoSpin::I3One) return false;
// }
// else
// return false;
// }
// get the external particles
tPDVector out = particles(0,imode,0,0);
// check the kinematics
Energy mout(ZERO);
for(unsigned int ix=0;ix<out.size();++ix)
mout += out[ix]->mass();
if(mout>upp) return false;
// resonances we need
tPDPtr resI1[3] = {getParticleData( 113),getParticleData(100113),getParticleData( 30113)};
tPDPtr resI0[6] = {getParticleData( 223),getParticleData( 333),
getParticleData(100223),getParticleData(100333),
- getParticleData( 30223),getParticleData( 30333)};
+ getParticleData( 30223)};
tPDPtr res[2];
if(imode==0) {
res[0] = getParticleData(ParticleID::Kstar0);
- res[0] = getParticleData(ParticleID::Kstarbar0);
+ res[1] = getParticleData(ParticleID::Kstarbar0);
}
else if(imode==1) {
res[0] = getParticleData(ParticleID::Kstarplus);
- res[0] = getParticleData(ParticleID::Kstarminus);
+ res[1] = getParticleData(ParticleID::Kstarminus);
}
else if(imode==2||imode==4) {
res[0] = getParticleData(ParticleID::Kstarplus);
- res[0] = getParticleData(ParticleID::Kstarbar0);
+ res[1] = getParticleData(ParticleID::Kstarbar0);
}
else if(imode==3||imode==5) {
res[0] = getParticleData(ParticleID::Kstarminus);
- res[0] = getParticleData(ParticleID::Kstar0);
+ res[1] = getParticleData(ParticleID::Kstar0);
}
- for(unsigned int ix=0;ix<6;++ix) {
+ for(unsigned int ix=0;ix<5;++ix) {
mode->addChannel((PhaseSpaceChannel(phase),ires,resI0[ix],ires+1,res[0],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,resI0[ix],ires+1,res[1],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
}
for(unsigned int ix=0;ix<3;++ix) {
mode->addChannel((PhaseSpaceChannel(phase),ires,resI1[ix],ires+1,res[0],ires+1,iloc+2,
ires+2,iloc+1,ires+2,iloc+3));
mode->addChannel((PhaseSpaceChannel(phase),ires,resI1[ix],ires+1,res[1],ires+1,iloc+1,
ires+2,iloc+2,ires+2,iloc+3));
}
return true;
}
// the particles produced by the current
tPDVector KKPiCurrent::particles(int icharge, unsigned int imode,
int,int) {
assert(icharge==0);
if(imode==0)
return {getParticleData(ParticleID::K_S0 ),getParticleData(ParticleID::K_L0 ),getParticleData(ParticleID::pi0)};
else if(imode==1)
return {getParticleData(ParticleID::Kplus),getParticleData(ParticleID::Kminus),getParticleData(ParticleID::pi0)};
else if(imode==2)
return {getParticleData(ParticleID::K_S0 ),getParticleData(ParticleID::Kminus),getParticleData(ParticleID::piplus)};
else if(imode==3)
return {getParticleData(ParticleID::K_S0 ),getParticleData(ParticleID::Kplus ),getParticleData(ParticleID::piminus)};
else if(imode==4)
return {getParticleData(ParticleID::K_L0 ),getParticleData(ParticleID::Kminus),getParticleData(ParticleID::piplus)};
else if(imode==5)
return {getParticleData(ParticleID::K_L0 ),getParticleData(ParticleID::Kplus ),getParticleData(ParticleID::piminus)};
else
assert(false);
}
// hadronic current
vector<LorentzPolarizationVectorE>
KKPiCurrent::current(tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int imode, const int ichan, Energy & scale,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption) const {
// check the total isospin
if(Itotal!=IsoSpin::IUnknown) {
if(Itotal==IsoSpin::IZero) {
if(i3!=IsoSpin::I3Unknown) return vector<LorentzPolarizationVectorE>();
}
else if(Itotal==IsoSpin::IOne) {
if(i3!=IsoSpin::I3Unknown&&
i3!=IsoSpin::I3Zero) return vector<LorentzPolarizationVectorE>();
}
else
return vector<LorentzPolarizationVectorE>();
}
useMe();
// calculate q2,s1,s2
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[0]+momenta[2]).m2();
Energy2 s2 = (momenta[1]+momenta[2]).m2();
// I=0 coefficient
complex<InvEnergy> A0(ZERO);
int ires=-1;
if(ichan>=0) ires=ichan/2;
if(Itotal==IsoSpin::IUnknown ||
Itotal==IsoSpin::IZero) {
if(ires>=0) {
- if(ires<int(isoScalarMasses_.size()))
+ if(ires<5)
A0 = isoScalarKStarCoup_[ires]*Resonance::BreitWignerFW(q2,isoScalarMasses_[ires],isoScalarWidths_[ires]);
}
else {
for(unsigned int ix=0;ix<isoScalarMasses_.size();++ix) {
A0 += isoScalarKStarCoup_[ix]*Resonance::BreitWignerFW(q2,isoScalarMasses_[ix],isoScalarWidths_[ix]);
}
}
}
- ires-=6;
+ ires-=5;
// I=1 coefficient
complex<InvEnergy> A1(ZERO);
if(Itotal==IsoSpin::IUnknown ||
Itotal==IsoSpin::IOne) {
if(ires>=0) {
if(ires<int(isoVectorMasses_.size()))
A1 = isoVectorKStarCoup_[ires]*Resonance::BreitWignerFW(q2,isoVectorMasses_[ires],isoVectorWidths_[ires]);
}
else {
for(unsigned int ix=0;ix<isoVectorMasses_.size();++ix) {
A1 += isoVectorKStarCoup_[ix]*Resonance::BreitWignerFW(q2,isoVectorMasses_[ix],isoVectorWidths_[ix]);
}
}
}
complex<InvEnergy3> amp(ZERO);
ires = -1;
if(ichan>=0) ires = ichan%2;
if(imode==0) {
complex<InvEnergy2> r1 = (ires<0||ires==0) ?
Resonance::BreitWignerPWave(s1,mKStar0_,wKStar0_,momenta[0].mass(),momenta[2].mass())/sqr(mKStar0_) : InvEnergy2();
complex<InvEnergy2> r2 = (ires<0||ires==1) ?
Resonance::BreitWignerPWave(s2,mKStar0_,wKStar0_,momenta[1].mass(),momenta[2].mass())/sqr(mKStar0_) : InvEnergy2();
amp = sqrt(1./6.)*(A0-A1)*(r1+r2);
}
else if(imode==1) {
complex<InvEnergy2> r1 = (ires<0||ires==0) ?
Resonance::BreitWignerPWave(s1,mKStarP_,wKStarP_,momenta[0].mass(),momenta[2].mass())/sqr(mKStarP_) : InvEnergy2();
complex<InvEnergy2> r2 = (ires<0||ires==1) ?
Resonance::BreitWignerPWave(s2,mKStarP_,wKStarP_,momenta[1].mass(),momenta[2].mass())/sqr(mKStarP_) : InvEnergy2();
amp = sqrt(1./6.)*(A0+A1)*(r1+r2);
}
else {
complex<InvEnergy2> r1 = (ires<0||ires==0) ?
Resonance::BreitWignerPWave(s1,mKStarP_,wKStarP_,momenta[0].mass(),momenta[2].mass())/sqr(mKStarP_) : InvEnergy2();
complex<InvEnergy2> r2 = (ires<0||ires==1) ?
Resonance::BreitWignerPWave(s2,mKStar0_,wKStar0_,momenta[1].mass(),momenta[2].mass())/sqr(mKStar0_) : InvEnergy2();
amp = sqrt(1./6.)*((A0+A1)*r1+(A0-A1)*r2);
}
amp *= 2.*gKStar_;
// the current
LorentzPolarizationVector vect = amp*Helicity::epsilon(momenta[0],momenta[1],momenta[2]);
// factor to get dimensions correct
return vector<LorentzPolarizationVectorE>(1,scale*vect);
}
bool KKPiCurrent::accept(vector<int> id) {
if(id.size()!=3) return false;
int npip(0),npim(0),nkp(0),nkm(0),
npi0(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::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
if ( (npi0==1 && (( nks==1&&nkl==1 ) ||
( nkp==1&&nkm==1 )) ) ||
( (nkl==1||nks==1) &&
( (nkm==1&&npip==1) || (nkp==1&&npim==1) ) ) ) return true;
return false;
}
// the decay mode
unsigned int KKPiCurrent::decayMode(vector<int> id) {
assert(id.size()==3);
int npip(0),npim(0),nkp(0),nkm(0),
npi0(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::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
if ( nks==1&&nkl==1&&npi0==1 ) return 0;
else if( nkp==1&&nkm==1&&npi0==1 ) return 1;
else if( nks==1&&nkm==1&&npip==1 ) return 2;
else if( nks==1&&nkp==1&&npim==1 ) return 3;
else if( nkl==1&&nkm==1&&npip==1 ) return 4;
else if( nkl==1&&nkp==1&&npim==1 ) return 5;
assert(false);
}
// output the information for the database
void KKPiCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::KKPiCurrent "
<< name() << " HwWeakCurrents.so\n";
// for(unsigned int ix=0;ix<rhoMasses_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":RhoMassesI0 " << ix << " " << rhoMasses_[ix]/GeV << "\n";
// }
// for(unsigned int ix=0;ix<rhoWidths_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":RhoWidthsI0 " << ix << " " << rhoWidths_[ix]/GeV << "\n";
// }
// for(unsigned int ix=0;ix<omegaMasses_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":OmegaMassesI0 " << ix << " " << omegaMasses_[ix]/GeV << "\n";
// }
// for(unsigned int ix=0;ix<omegaWidths_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":OmegaWidthsI0 " << ix << " " << omegaWidths_[ix]/GeV << "\n";
// }
// output << "newdef " << name() << ":PhiMass " << phiMass_/GeV << "\n";
// output << "newdef " << name() << ":PhiWidth " << phiWidth_/GeV << "\n";
// for(unsigned int ix=0;ix<coup_I0_.size();++ix) {
// if(ix<6) output << "newdef ";
// else output << "insert ";
// output << name() << ":CouplingsI0 " << ix << " " << coup_I0_[ix]*GeV*GeV2 << "\n";
// }
// for(unsigned int ix=0;ix<rhoMasses_I1_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":RhoMassesI1 " << ix << " " << rhoMasses_I1_[ix]/GeV << "\n";
// }
// for(unsigned int ix=0;ix<rhoWidths_I1_.size();++ix) {
// if(ix<3) output << "newdef ";
// else output << "insert ";
// output << name() << ":RhoWidthsI1 " << ix << " " << rhoWidths_I1_[ix]/GeV << "\n";
// }
// output << "newdef " << name() << ":OmegaMass " << omegaMass_I1_/GeV << "\n";
// output << "newdef " << name() << ":OmegaWidth " << omegaWidth_I1_/GeV << "\n";
// output << "newdef " << name() << ":sigma " << sigma_ << "\n";
// output << "newdef " << name() << ":GWPrefactor " << GW_pre_*GeV << "\n";
// output << "newdef " << name() << ":g_omega_pipi " << g_omega_pi_pi_ << "\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, 7:40 PM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805877
Default Alt Text
(15 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment