diff --git a/Decay/WeakCurrents/EtaPhiCurrent.cc b/Decay/WeakCurrents/EtaPhiCurrent.cc --- a/Decay/WeakCurrents/EtaPhiCurrent.cc +++ b/Decay/WeakCurrents/EtaPhiCurrent.cc @@ -1,267 +1,266 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the EtaPhiCurrent class. // #include "EtaPhiCurrent.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" using namespace Herwig; EtaPhiCurrent::EtaPhiCurrent() { addDecayMode(3,-3); setInitialModes(3); // Masses for the resonances - resMasses_ = {1.670*GeV}; + resMasses_ = {1.670*GeV,2.14*GeV}; // widths for the resonances - resWidths_ = {124*MeV}; + resWidths_ = {122*MeV,43.5*MeV}; // amplitudes - amp_ = {0.177/GeV}; + amp_ = {0.175/GeV,0.00409/GeV}; // phases - phase_ = {0.}; + phase_ = {0.,2.19}; } IBPtr EtaPhiCurrent::clone() const { return new_ptr(*this); } IBPtr EtaPhiCurrent::fullclone() const { return new_ptr(*this); } void EtaPhiCurrent::doinit() { WeakCurrent::doinit(); assert(phase_.size()==amp_.size()); couplings_.clear(); Complex ii(0.,1.); for(unsigned int ix=0;ix<amp_.size();++ix) { - double phi = phase_[ix]/180.*Constants::pi; - couplings_.push_back(amp_[ix]*(cos(phi)+ii*sin(phi))); + couplings_.push_back(amp_[ix]*(cos(phase_[ix])+ii*sin(phase_[ix]))); } } void EtaPhiCurrent::persistentOutput(PersistentOStream & os) const { os << ounit(resMasses_,GeV) << ounit(resWidths_,GeV) << ounit(amp_,1./GeV) << phase_ << ounit(couplings_,1./GeV); } void EtaPhiCurrent::persistentInput(PersistentIStream & is, int) { is >> iunit(resMasses_,GeV) >> iunit(resWidths_,GeV) >> iunit(amp_,1./GeV) >> phase_ >> iunit(couplings_,1./GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass<EtaPhiCurrent,WeakCurrent> describeHerwigEtaPhiCurrent("Herwig::EtaPhiCurrent", "HwWeakCurrents.so"); void EtaPhiCurrent::Init() { static ClassDocumentation<EtaPhiCurrent> documentation ("The EtaPhiCurrent class implements a current based" " on the model of SND for eta + phi " "The current based on the model of \\cite{Achasov:2018ygm}" " for eta and phi was used.", "\\bibitem{Achasov:2018ygm}\n" "M.~N.~Achasov {\\it et al.},\n" "%``Measurement of the $e^+e^−\\to\\eta K^+K^−$ Cross Section by Means of the SND Detector,''\n" "Phys.\\ Atom.\\ Nucl.\\ {\\bf 81} (2018) no.2, 205\n" " [Yad.\\ Fiz.\\ {\\bf 81} (2018) no.2, 195].\n" "doi:10.1134/S1063778818020023\n" "%%CITATION = doi:10.1134/S1063778818020023;%%\n"); static ParVector<EtaPhiCurrent,Energy> interfaceResonanceMasses ("ResonanceMasses", "The masses of the resonances for the form factor", &EtaPhiCurrent::resMasses_, GeV, 1, 1680*MeV, 0.5*GeV, 10.0*GeV, false, false, Interface::limited); static ParVector<EtaPhiCurrent,Energy> interfaceResonanceWidths ("ResonanceWidths", "The widths of the resonances for the form factor", &EtaPhiCurrent::resWidths_, GeV, 1, 150*MeV, 0.5*GeV, 10.0*GeV, false, false, Interface::limited); static ParVector<EtaPhiCurrent,InvEnergy> interfaceAmplitude ("Amplitude", "The amplitudes of the couplings", &EtaPhiCurrent::amp_, 0.00115/GeV, 1, 1./GeV, 0.0/GeV, 10/GeV, false, false, Interface::limited); static ParVector<EtaPhiCurrent,double> interfacePhase ("Phase", - "The phases of the couplings in degrees", - &EtaPhiCurrent::phase_, 1, 0., 0.0, 360.0, + "The phases of the couplings in radians", + &EtaPhiCurrent::phase_, 1, 0., 0.0, 2.*Constants::pi, false, false, Interface::limited); } // complete the construction of the decay mode for integration bool EtaPhiCurrent::createMode(int icharge, tcPDPtr resonance, IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3, 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(Itotal!=IsoSpin::IUnknown) { if(Itotal!=IsoSpin::IZero) return false; } // check I_3 if(i3!=IsoSpin::I3Unknown) { if(i3!=IsoSpin::I3Zero) return false; } // check that the mode is are kinematical allowed Energy min = getParticleData(ParticleID::eta)->mass()+ getParticleData(ParticleID::phi)->massMin(); if(min>upp) return false; // resonances for the intermediate channels tPDVector res = {getParticleData(100333)}; // set up the integration channels; for(unsigned int ix=0;ix<res.size();++ix) { if(resonance && resonance!=res[ix]) continue; mode->addChannel((PhaseSpaceChannel(phase),ires,res[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<res.size();++ix) { mode->resetIntermediate(res[ix],resMasses_[ix],resWidths_[ix]); } return true; } // the particles produced by the current tPDVector EtaPhiCurrent::particles(int icharge, unsigned int imode,int,int) { assert(icharge==0 && imode<=1); return {getParticleData(ParticleID::eta),getParticleData(ParticleID::phi)}; } void EtaPhiCurrent::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> EtaPhiCurrent::current(tcPDPtr resonance, IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3, const int, 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) return vector<LorentzPolarizationVectorE>(); } // check I_3 if(i3!=IsoSpin::I3Unknown) { if(i3!=IsoSpin::I3Zero) return vector<LorentzPolarizationVectorE>(); } useMe(); // polarization vectors of the photon vector<LorentzPolarizationVector> temp(3); for(unsigned int ix=0;ix<3;++ix) { temp[ix] = HelicityFunctions::polarizationVector(-momenta[1],ix,Helicity::outgoing); } // total momentum of the system Lorentz5Momentum q(momenta[0]+momenta[1]); // overall hadronic mass q.rescaleMass(); scale=q.mass(); Energy2 q2(q.m2()); unsigned int imin = 0; unsigned int imax = couplings_.size(); if(ichan>0) { imin = ichan; imax = imin+1; } if(resonance) { switch(abs(resonance->id())) { - case 100223: + case 100333: imin=0; break; default: assert(false); } imax=imin+1; } // compute the form factor complex<InvEnergy> formFactor(ZERO); // loop over the resonances for(unsigned int ix=imin;ix<imax;++ix) { Energy2 mR2(sqr(resMasses_[ix])); // compute the width Energy width = resWidths_[ix]; formFactor += couplings_[ix]*mR2/(mR2-q2-Complex(0.,1.)*q.mass()*width); } // calculate the current vector<LorentzPolarizationVectorE> ret(3); for(unsigned int ix=0;ix<3;++ix) { ret[ix] += formFactor*Helicity::epsilon(q,temp[ix],momenta[1]); } return ret; } bool EtaPhiCurrent::accept(vector<int> id) { if(id.size()!=2) return false; unsigned int neta(0),nphi(0); for(unsigned int ix=0;ix<id.size();++ix) { if(abs(id[ix])==ParticleID::eta) ++neta; else if(id[ix]==ParticleID::phi) ++nphi; } return nphi == 1 && neta==1; } unsigned int EtaPhiCurrent::decayMode(vector<int>) { return 0; } // output the information for the database void EtaPhiCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; if(create) output << "create Herwig::EtaPhiCurrent " << name() << " HwWeakCurrents.so\n"; for(unsigned int ix=0;ix<resMasses_.size();++ix) { if(ix<1) output << "newdef " << name() << ":ResonanceMasses " << ix << " " << resMasses_[ix]/GeV << "\n"; else output << "insert " << name() << ":ResonanceMasses " << ix << " " << resMasses_[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<resWidths_.size();++ix) { if(ix<1) output << "newdef " << name() << ":ResonanceWidths " << ix << " " << resWidths_[ix]/GeV << "\n"; else output << "insert " << name() << ":ResonanceWidths " << ix << " " << resWidths_[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<amp_.size();++ix) { if(ix<1) output << "newdef " << name() << ":Amplitude " << ix << " " << amp_[ix]*GeV << "\n"; else output << "insert " << name() << ":Amplitude " << ix << " " << amp_[ix]*GeV << "\n"; } for(unsigned int ix=0;ix<phase_.size();++ix) { if(ix<1) output << "newdef " << name() << ":Phase " << ix << " " << phase_[ix] << "\n"; else output << "insert " << name() << ":Phase " << ix << " " << phase_[ix] << "\n"; } WeakCurrent::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; }