diff --git a/Decay/WeakCurrents/KKPiCurrent.cc b/Decay/WeakCurrents/KKPiCurrent.cc --- a/Decay/WeakCurrents/KKPiCurrent.cc +++ b/Decay/WeakCurrents/KKPiCurrent.cc @@ -1,386 +1,387 @@ // -*- 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}; isoScalarMasses_ = {1019.461*MeV,1630*MeV,1960*MeV}; isoScalarWidths_ = { 4.249*MeV, 218*MeV, 267*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,0.096/GeV,ZERO,ZERO}; // isoScalarKStarPhase_={ 0., 0., 0., 0., 0., 0.}; isoScalarKStarAmp_ ={ZERO, 0.233/GeV, 0.0405/GeV}; isoScalarKStarPhase_={ 0., 1.1E-07, 5.19}; // amplitudes and phase for the isovector component // isoVectorKStarAmp_ ={ZERO,ZERO,0.04/GeV}; // isoVectorKStarPhase_={0.,0.,Constants::pi}; isoVectorKStarAmp_ ={-2.34/GeV, 0.594/GeV, -0.0179/GeV}; isoVectorKStarPhase_={0.,0.317, 2.57}; // Coupling for the K* to Kpi gKStar_ = 5.37392360229; // mstar masses 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) + for(unsigned int ix=0;ix<isoScalarKStarAmp_.size();++ix) { isoScalarKStarCoup_.push_back(isoScalarKStarAmp_[ix]*(cos(isoScalarKStarPhase_[ix]) - +ii*sin(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)}; tPDPtr res[2]; if(imode==0) { res[0] = getParticleData(ParticleID::Kstar0); res[1] = getParticleData(ParticleID::Kstarbar0); } else if(imode==1) { res[0] = getParticleData(ParticleID::Kstarplus); res[1] = getParticleData(ParticleID::Kstarminus); } else if(imode==2||imode==4) { res[0] = getParticleData(ParticleID::Kstarplus); res[1] = getParticleData(ParticleID::Kstarbar0); } else if(imode==3||imode==5) { res[0] = getParticleData(ParticleID::Kstarminus); res[1] = getParticleData(ParticleID::Kstar0); } 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<5) + if(ires<int(isoScalarMasses_.size())) 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-=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; }