diff --git a/Decay/FormFactors/CzyzNucleonFormFactor.cc b/Decay/FormFactors/CzyzNucleonFormFactor.cc --- a/Decay/FormFactors/CzyzNucleonFormFactor.cc +++ b/Decay/FormFactors/CzyzNucleonFormFactor.cc @@ -1,339 +1,342 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the CzyzNucleonFormFactor class. // #include "CzyzNucleonFormFactor.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 "Herwig/Decay/ResonanceHelpers.h" using namespace Herwig; CzyzNucleonFormFactor::CzyzNucleonFormFactor() { // masses and widths of rho resonances rhoMasses_ = {775.49*MeV, 1465*MeV, 1720*MeV, 2.12*GeV,2.32647*GeV}; rhoWidths_ = {149.10*MeV, 400*MeV, 250*MeV, 0.3 *GeV,0.4473 *GeV}; // masses and width of omega resonances omegaMasses_ = {782.65*MeV, 1425*MeV, 1670*MeV, 2.0707 *GeV, 2.34795 *GeV}; omegaWidths_ = {8.49 *MeV, 215*MeV, 315*MeV, 1.03535*GeV, 1.173975*GeV}; // c_1 couplings c1Re_ = {1.,-0.467,-0.177, 0.301}; c1Im_ = {0.,-0.385, 0.149, 0.264}; // c_2 couplings c2Re_ = {1., 0.0521, -0.00308,-0.348}; c2Im_ = {0.,-3.04, 2.38,-0.104}; // c_3 couplings c3Re_ = {1.,-7.88,10.2}; c3Im_ = {0., 5.67, -1.94}; // c_4 couplings c4Re_ = {1.,-0.832, 0.405}; c4Im_ = {0., 0.308,-0.25}; // Magnetic moments mup_ = 2.792847356; mun_ = -1.9130427; + // initialise a_ and b_ + a_ = mup_-mun_-1.; + b_ = -mup_-mun_+1.; // set up the form factors addFormFactor(2212,2212,2,2,2,1,1,1); addFormFactor(2112,2112,2,2,2,1,1,1); initialModes(numberOfFactors()); } IBPtr CzyzNucleonFormFactor::clone() const { return new_ptr(*this); } IBPtr CzyzNucleonFormFactor::fullclone() const { return new_ptr(*this); } void CzyzNucleonFormFactor::doinit() { BaryonFormFactor::doinit(); static const Complex ii(0.,1.); // calculate c_1 c1_.clear(); assert(c1Re_.size()==4 && c1Im_.size()==4); // c_1 1 -> 4 complex<Energy2> fact(ZERO); for(unsigned int ix=0;ix<4;++ix) { c1_.push_back(c1Re_[ix]+ii*c1Im_[ix]); fact += c1_[ix]*sqr(omegaMasses_[ix]); } c1_.push_back(-fact/sqr(omegaMasses_[4])); // calculate c_2 c2_.clear(); assert(c2Re_.size()==4 && c2Im_.size()==4); // c_2 1 -> 4 fact = ZERO; for(unsigned int ix=0;ix<4;++ix) { c2_.push_back(c2Re_[ix]+ii*c2Im_[ix]); fact += c2_[ix]*sqr(rhoMasses_[ix]); } c2_.push_back(-fact/sqr(rhoMasses_[4])); // calculate c_3 c3_.clear(); assert(c3Re_.size()==3 && c3Im_.size()==3); // c_3 1 -> 4 fact = ZERO; complex<Energy4> fact2(ZERO); for(unsigned int ix=0;ix<3;++ix) { c3_.push_back(c3Re_[ix]+ii*c3Im_[ix]); fact += c3_[ix]*sqr(omegaMasses_[ix]); fact2 += c3_[ix]*sqr(omegaMasses_[ix])* (sqr(omegaMasses_[ix])-sqr(omegaMasses_[4]) +ii*(omegaMasses_[4]*omegaWidths_[4]-omegaMasses_[ix]*omegaWidths_[ix])); } c3_.push_back(fact2/sqr(omegaMasses_[3])/ (sqr(omegaMasses_[4])-sqr(omegaMasses_[3]) +ii*(omegaMasses_[3]*omegaWidths_[3]-omegaMasses_[4]*omegaWidths_[4])) ); fact += c3_[3]*sqr(omegaMasses_[3]); c3_.push_back(-fact/sqr(omegaMasses_[4])); // c_4 1 -> 4 fact = ZERO; fact2 = ZERO; for(unsigned int ix=0;ix<3;++ix) { c4_.push_back(c4Re_[ix]+ii*c4Im_[ix]); fact += c4_[ix]*sqr(rhoMasses_[ix]); fact2 += c4_[ix]*sqr(rhoMasses_[ix])* (sqr(rhoMasses_[ix])-sqr(rhoMasses_[4]) +ii*(rhoMasses_[4]*rhoWidths_[4]-rhoMasses_[ix]*rhoWidths_[ix])); } c4_.push_back(fact2/sqr(rhoMasses_[3])/ (sqr(rhoMasses_[4])-sqr(rhoMasses_[3]) +ii*(rhoMasses_[3]*rhoWidths_[3]-rhoMasses_[4]*rhoWidths_[4])) ); fact += c4_[3]*sqr(rhoMasses_[3]); c4_.push_back(-fact/sqr(rhoMasses_[4])); // a and b parameters - a_ = mup_-mun_-1; + a_ = mup_-mun_-1.; b_ = -mup_-mun_+1.; } void CzyzNucleonFormFactor::persistentOutput(PersistentOStream & os) const { os << ounit(rhoMasses_,GeV) << ounit(rhoWidths_,GeV) << ounit(omegaMasses_,GeV) << ounit(omegaWidths_,GeV) << c1Re_ << c1Im_ << c2Re_ << c2Im_ << c3Re_ << c3Im_ << c4Re_ << c4Im_ << c1_ << c2_ << c3_ << c4_ << mup_ << mun_ << a_ << b_; } void CzyzNucleonFormFactor::persistentInput(PersistentIStream & is, int) { is >> iunit(rhoMasses_,GeV) >> iunit(rhoWidths_,GeV) >> iunit(omegaMasses_,GeV) >> iunit(omegaWidths_,GeV) >> c1Re_ >> c1Im_ >> c2Re_ >> c2Im_ >> c3Re_ >> c3Im_ >> c4Re_ >> c4Im_ >> c1_ >> c2_ >> c3_ >> c4_ >> mup_ >> mun_ >> a_ >> b_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass<CzyzNucleonFormFactor,BaryonFormFactor> describeHerwigCzyzNucleonFormFactor("Herwig::CzyzNucleonFormFactor", "HwFormFactors.so"); void CzyzNucleonFormFactor::Init() { static ClassDocumentation<CzyzNucleonFormFactor> documentation ("The CzyzNucleonFormFactor class implements the model of " "Phys.Rev. D90 (2014) no.11, 114021 for the nucleon form factor", "The nucleon form factor model of \\cite{Czyz:2014sha} was used", "\\bibitem{Czyz:2014sha}\n" "H.~Czyż, J.~H.~Kühn and S.~Tracz,\n" "%``Nucleon form factors and final state radiative corrections to $e^+e^- \\to p\\bar{p}γ$,''\n" "Phys.\\ Rev.\\ D {\\bf 90} (2014) no.11, 114021\n" "doi:10.1103/PhysRevD.90.114021\n" "[arXiv:1407.7995 [hep-ph]].\n" "%%CITATION = doi:10.1103/PhysRevD.90.114021;%%\n" "%5 citations counted in INSPIRE as of 25 Aug 2018\n"); - + static ParVector<CzyzNucleonFormFactor,Energy> interfaceRhoMasses ("RhoMasses", "The masses of the rho mesons for the form factor", &CzyzNucleonFormFactor::rhoMasses_, GeV, 5, 1.0*GeV, 0.0*GeV, 10.0*GeV, false, false, Interface::limited); - + static ParVector<CzyzNucleonFormFactor,Energy> interfaceRhoWidths ("RhoWidths", "The widths of the rho mesons for the form factor", &CzyzNucleonFormFactor::rhoWidths_, GeV, 5, 1.0*GeV, 0.0*GeV, 10.0*GeV, false, false, Interface::limited); - + static ParVector<CzyzNucleonFormFactor,Energy> interfaceOmegaMasses ("OmegaMasses", "The masses of the omega mesons for the form factor", &CzyzNucleonFormFactor::omegaMasses_, GeV, 5, 1.0*GeV, 0.0*GeV, 10.0*GeV, false, false, Interface::limited); - + static ParVector<CzyzNucleonFormFactor,Energy> interfaceOmegaWidths ("OmegaWidths", "The widths of the omega mesons for the form factor", &CzyzNucleonFormFactor::omegaWidths_, GeV, 5, 1.0*GeV, 0.0*GeV, 10.0*GeV, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec1Real ("c1Real", "The real part of the c_1 coupling", &CzyzNucleonFormFactor::c1Re_, 4, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec1Imag ("c1Imag", "The imaginary part of the c_1 coupling", &CzyzNucleonFormFactor::c1Im_, 4, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec2Real ("c2Real", "The real part of the c_2 coupling", &CzyzNucleonFormFactor::c2Re_, 4, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec2Imag ("c2Imag", "The imaginary part of the c_2 coupling", &CzyzNucleonFormFactor::c2Im_, 4, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec3Real ("c3Real", "The real part of the c_3 coupling", &CzyzNucleonFormFactor::c3Re_, 3, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec3Imag ("c3Imag", "The imaginary part of the c_3 coupling", &CzyzNucleonFormFactor::c3Im_, 3, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec4Real ("c4Real", "The real part of the c_4 coupling", &CzyzNucleonFormFactor::c4Re_, 3, 1., -100., 100.0, false, false, Interface::limited); static ParVector<CzyzNucleonFormFactor,double> interfacec4Imag ("c4Imag", "The imaginary part of the c_4 coupling", &CzyzNucleonFormFactor::c4Im_, 3, 1., -100., 100.0, false, false, Interface::limited); static Parameter<CzyzNucleonFormFactor,double> interfaceMuProton ("MuProton", "The proton magnetic moment", &CzyzNucleonFormFactor::mup_, 2.792, 0.0, 10.0, false, false, Interface::limited); static Parameter<CzyzNucleonFormFactor,double> interfaceMuNeutron ("MuNeutron", "The proton magnetic moment", &CzyzNucleonFormFactor::mun_, -1.913, 0.0, 10.0, false, false, Interface::limited); } void CzyzNucleonFormFactor:: SpinHalfSpinHalfFormFactor(Energy2 q2,int iloc, int id0,int id1,Energy,Energy, Complex & f1v,Complex & f2v,Complex & f3v, Complex & f1a,Complex & f2a,Complex & f3a, FlavourInfo flavour, Virtuality virt) { f1a = f2a = f3a = f1v = f2v = f3v = 0.; assert(abs(id0)==abs(id1)); if(iloc==0) assert(abs(id0)==2212); else assert(abs(id0)==2112); assert(virt==TimeLike); if(flavour.strange != Strangeness::Unknown and flavour.strange != Strangeness::Zero) return; if(flavour.charm != Charm::Unknown and flavour.charm != Charm::Zero ) return; if(flavour.bottom != Beauty::Unknown and flavour.bottom !=Beauty::Zero ) return; bool I0 = true, I1 = true; if(flavour.I!=IsoSpin::IUnknown) { if(flavour.I==IsoSpin::IZero) { I1=false; if(flavour.I3!=IsoSpin::I3Unknown and flavour.I3!=IsoSpin::I3Zero) return; } else if(flavour.I==IsoSpin::IOne) { I0=false; if(flavour.I3!=IsoSpin::I3Unknown and flavour.I3!=IsoSpin::I3Zero) return; } } if(flavour.I3!=IsoSpin::I3Unknown and flavour.I3!=IsoSpin::I3Zero) return; // calculate the form factors Complex F1S(0.),F1V(0.),F2S(0.),F2V(0.); Complex n1(0.),n2(0.),n3(0.),n4(0.); for(unsigned int ix=0;ix<5;++ix) { if(I0) { F1S += c1_[ix]*Resonance::BreitWignerFW(q2,omegaMasses_[ix],omegaWidths_[ix]); F2S += c3_[ix]*Resonance::BreitWignerFW(q2,omegaMasses_[ix],omegaWidths_[ix]); } if(I1) { F1V += c2_[ix]*Resonance::BreitWignerFW(q2, rhoMasses_[ix], rhoWidths_[ix]); F2V += c4_[ix]*Resonance::BreitWignerFW(q2, rhoMasses_[ix], rhoWidths_[ix]); } n1 += c1_[ix]; n2 += c2_[ix]; n3 += c3_[ix]; n4 += c4_[ix]; } F1S *= 0.5 /n1; F1V *= 0.5 /n2; F2S *= -0.5*b_/n3; F2V *= 0.5*a_/n4; if(iloc==0) { f1v = F1S + F1V; f2v = F2S + F2V; } else { f1v = F1S - F1V; f2v = F2S - F2V; } } void CzyzNucleonFormFactor:: dataBaseOutput(ofstream& output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; - if(create) output << "create Herwig::CzyzNucleonFormFactor " + if(create) output << "create Herwig::CzyzNucleonFormFactor " << name() << " \n"; for(unsigned int ix=0;ix<5;++ix) { output << "newdef " << name() << ":RhoMasses " << ix << " " << rhoMasses_[ix]/GeV << "\n"; output << "newdef " << name() << ":RhoWidths " << ix << " " << rhoWidths_[ix]/GeV << "\n"; output << "newdef " << name() << ":OmegaMasses " << ix << " " << omegaMasses_[ix]/GeV << "\n"; output << "newdef " << name() << ":OmegaWidths " << ix << " " << omegaWidths_[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<4;++ix) { output << "newdef " << name() << ":c1Real " << ix << " " << c1Re_[ix] << "\n"; output << "newdef " << name() << ":c1Imag " << ix << " " << c1Im_[ix] << "\n"; output << "newdef " << name() << ":c2Real " << ix << " " << c2Re_[ix] << "\n"; output << "newdef " << name() << ":c2Imag " << ix << " " << c2Im_[ix] << "\n"; } for(unsigned int ix=0;ix<3;++ix) { output << "newdef " << name() << ":c3Real " << ix << " " << c3Re_[ix] << "\n"; output << "newdef " << name() << ":c3Imag " << ix << " " << c3Im_[ix] << "\n"; output << "newdef " << name() << ":c4Real " << ix << " " << c4Re_[ix] << "\n"; output << "newdef " << name() << ":c4Imag " << ix << " " << c4Im_[ix] << "\n"; } output << "newdef " << name() << ":MuProton " << mup_ << "\n"; output << "newdef " << name() << ":MuNeutron " << mun_ << "\n"; BaryonFormFactor::dataBaseOutput(output,false,false); - if(header) output << "\n\" where BINARY ThePEGName=\"" + if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; }