diff --git a/Decay/Baryon/BaryonFactorizedDecayer.cc b/Decay/Baryon/BaryonFactorizedDecayer.cc --- a/Decay/Baryon/BaryonFactorizedDecayer.cc +++ b/Decay/Baryon/BaryonFactorizedDecayer.cc @@ -1,804 +1,804 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the BaryonFactorizedDecayer class. // #include "BaryonFactorizedDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/RSSpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/RSSpinorBarWaveFunction.h" #include "Herwig/Decay/DecayVertex.h" #include "ThePEG/Helicity/FermionSpinInfo.h" #include "ThePEG/Helicity/RSFermionSpinInfo.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; BaryonFactorizedDecayer::BaryonFactorizedDecayer() { // default values taken from PRD56, 2799 _a1c= 1.1; _a2c=-0.5; _a1b= 1.0; _a2b= 0.28; // intermediates generateIntermediates(true); } void BaryonFactorizedDecayer::doinitrun() { _current->initrun(); _form->initrun(); DecayIntegrator::doinitrun(); _weights.clear();_wgtloc.clear();_wgtmax.clear(); unsigned int ix,iy; for(ix=0;ixmaxWeight()); _wgtloc.push_back(_weights.size()); for(iy=0;iynumberChannels();++iy) _weights.push_back(mode(ix)->channelWeight(iy)); } } void BaryonFactorizedDecayer::doinit() { DecayIntegrator::doinit(); // get the CKM matrix elements unsigned int ix,iy,iz,iform,icurr; // get the CKM matrix (unsquared for interference) Complex ckmmat[3][3]; vector< vector > CKM(_theCKM->getUnsquaredMatrix(SM().families())); for(ix=0;ix<3;++ix){for(iy=0;iy<3;++iy){ckmmat[ix][iy]=CKM[ix][iy];}} // make sure the current and form factor got initialised _current->init(); _form->init(); // find all the possible modes vector tformmap,tcurrmap; vector inquark,outquark,currq,curra; vector particles; tPDVector extpart,extpartb,ptemp; Energy min,minb; int iq,ia,spect1,spect2,inq,outq,id0,id1,Wcharge,ispin,ospin; for(iform=0;iform<_form->numberOfFactors();++iform) { // particles from the form factor extpart.resize(2); _form->particleID (iform,id0,id1); _form->formFactorInfo(iform,ispin,ospin,spect1,spect2,inq,outq); // particles from the form factor extpart[0]=getParticleData(id0); extpart[1]=getParticleData(id1); // the charge of the decay products Wcharge = extpart[0]->iCharge()-extpart[1]->iCharge(); // max mass for the particles in the current min = extpart[0]->massMax()-extpart[1]->massMin(); for(icurr=0;icurr<_current->numberOfModes();++icurr) { extpart.resize(2); // get the particles from the current _current->decayModeInfo(icurr,iq,ia); ptemp=_current->particles(Wcharge,icurr,iq,ia); minb=ZERO; for(iz=0;izmassMin();} // valid mode if(extpart.size()>2&&minb0&&inq%2!=iq%2)|| (inq<0&&abs(inq)%2!=abs(ia)%2))))) { tformmap.push_back(iform);tcurrmap.push_back(icurr); particles.push_back(extpart); inquark.push_back(inq);outquark.push_back(outq); currq.push_back(iq);curra.push_back(ia); } // if the meson is neutral try the CC mode if(Wcharge==0&&iq!=-ia&&((inq>0&&inq%2!=iq%2)|| (inq<0&&abs(inq)%2!=abs(ia)%2))) { extpart.resize(2); ptemp=_current->particles(Wcharge,icurr,-ia,-iq); minb=ZERO; for(iz=0;izmassMin();} if(extpart.size()>2&&minb modecc; vector modeloc,ttform,ttcurr; vector tCKM; Complex ckm; bool done; DecayPhaseSpaceModePtr mode; DecayPhaseSpaceChannelPtr channel; vector::iterator start,end; double maxweight; vector channelwgts; _formmap.clear(); _currentmap.clear(); // loop over the modes and find the dupliciates for(ix=0;ix 3 && !modeloc.empty() ) {break;} // create the mode and set the particles as for the first instance mode=new_ptr(DecayPhaseSpaceMode(particles[ix],this)); channel = new_ptr(DecayPhaseSpaceChannel(mode)); channel->addIntermediate(particles[ix][0],0,0.0,1,-1); min = particles[ix][0]->massMax()-particles[ix][1]->massMin(); Wcharge = particles[ix][0]->iCharge()-particles[ix][1]->iCharge(); done=_current->createMode(Wcharge,tcurrmap[ix],mode,2,1,channel,min); if(!done){throw InitException() << "Failed to construct mode in " << "BaryonFactorizedDecayer::doinit()." << Exception::abortnow;} // set the parameters for the additional modes ttform.clear();ttcurr.clear(); ttform.push_back(tformmap[ix]);ttcurr.push_back(tcurrmap[ix]); for(iy=0;iyparticleID(ttform[iy],id0,id1); Wcharge = getParticleData(id0)->iCharge()-getParticleData(id1)->iCharge(); ckm=1.; if(Wcharge!=0) { ckm=1.; if(abs(iq)%2==0){ckm *= conj(ckmmat[abs(iq)/2-1][(abs(ia)-1)/2]);} else{ckm *= conj(ckmmat[abs(ia)/2-1][(abs(iq)-1)/2]);} if(abs(inq)%2==0){ckm *= ckmmat[abs(inq)/2-1][(abs(outq)-1)/2];} else{ckm *= ckmmat[abs(outq)/2-1][(abs(inq)-1)/2];} if(abs(inq)==5){ckm*=_a1b;} else{ckm*=_a1c;} } else { ckm=1.; if(inq>0) { if(abs(inq)%2==0){ckm *= ckmmat[abs(inq)/2-1][(abs(iq)-1)/2];} else{ckm *= ckmmat[abs(iq)/2-1][(abs(inq)-1)/2];} if(abs(outq)%2==0) {ckm *= conj(ckmmat[abs(outq)/2-1][(abs(ia)-1)/2]);} else{ckm *= conj(ckmmat[abs(ia)/2-1][(abs(outq)-1)/2]);} } else { if(abs(inq)%2==0){ckm *= ckmmat[abs(inq)/2-1][(abs(ia)-1)/2];} else{ckm *= ckmmat[abs(ia)/2-1][(abs(inq)-1)/2];} if(abs(outq)%2==0) {ckm *= conj(ckmmat[abs(outq)/2-1][(abs(iq)-1)/2]);} else{ckm *= conj(ckmmat[abs(iq)/2-1][(abs(outq)-1)/2]);} } if(abs(inq)==5){ckm*=_a2b;} else{ckm*=_a2c;} } if((abs(inq)%2==0&&inq<0)||(abs(inq)%2!=0&&inq>0)){ckm=conj(ckm);} tCKM.push_back(ckm); } // add the parameters for the mode to the list _currentmap.push_back(ttcurr);_formmap.push_back(ttform); _factCKM.push_back(tCKM); // add the mode to the list if(_wgtmax.size()>numberModes()){maxweight=_wgtmax[numberModes()];} else{maxweight=0.;} // the weights for the channel if(_wgtloc.size()>numberModes()&& _wgtloc[numberModes()]+mode->numberChannels()<=_weights.size()) { start=_weights.begin()+_wgtloc[numberModes()]; end = start+mode->numberChannels(); channelwgts=vector(start,end); } else {channelwgts.resize(mode->numberChannels(),1./(mode->numberChannels()));} // don't need channels for two body decays if(particles[ix].size()==3) { channelwgts.clear(); mode=new_ptr(DecayPhaseSpaceMode(particles[ix],this)); } addMode(mode,maxweight,channelwgts); // resize the duplicate modes to remove them for(iy=0;iyid()),ibaryon,foundb,id0,id1; vector idall,idother; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ; pit!=pend;++pit){idall.push_back((**pit).id());} // loop over the particles in the form factor do { _form->particleID(iform,id0,id1); ibaryon=0; if(id0==idin){ibaryon=id1;} else if(id0==-idin){ibaryon=-id1;} if(ibaryon!=0) { foundb=false; idother.clear(); for(ix=0;ixaccept(idother);} } ++iform; } while(!allowed&&iform<_form->numberOfFactors()); return allowed; } int BaryonFactorizedDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { unsigned int ix,iy; int idin(parent->id()),ibaryon,foundb,id0,id1,icurr(-1),iform(0); vector idall,idother; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ; pit!=pend;++pit){idall.push_back((**pit).id());} // loop over the particles in the form factor do { _form->particleID(iform,id0,id1); ibaryon=0; if(id0==idin){ibaryon=id1;} else if(id0==-idin){ibaryon=-id1;} ++iform; foundb=false; idother.clear(); for(ix=0;ixdecayMode(idother);} } while(icurr<0&&iformnumberOfFactors())); // now find the mode int imode=-1; ix=0; --iform; do { for(iy=0;iy<_currentmap[ix].size();++iy) {if(int(_currentmap[ix][iy])==icurr&&int(_formmap[ix][iy])==iform){imode=ix;}} ++ix; } while(imode<0&&ix> _current >> _form >> _a1b >> _a2b >>_a1c >>_a2c >> _currentmap >> _formmap >> _factCKM >> _wgtloc >> _wgtmax >> _weights >> _theCKM; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigBaryonFactorizedDecayer("Herwig::BaryonFactorizedDecayer", "HwBaryonDecay.so"); void BaryonFactorizedDecayer::Init() { static ClassDocumentation documentation ("The BaryonFactorizedDecayer class combines the baryon form factor and a" " weak current to perform a decay in the naive factorization approximation."); static Reference interfaceWeakCurrent ("Current", "The reference for the decay current to be used.", &BaryonFactorizedDecayer::_current, false, false, true, false, false); static ParVector interfaceWeightLocation ("WeightLocation", "The locations of the weights for a given channel in the vector", &BaryonFactorizedDecayer::_wgtloc, 0, 0, 0, 0, 10000, false, false, true); static ParVector interfaceWeightMax ("MaximumWeight", "The maximum weight for a given channel.", &BaryonFactorizedDecayer::_wgtmax, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceWeights ("Weights", "The weights for the integration.", &BaryonFactorizedDecayer::_weights, 0, 0, 0, 0., 1., false, false, true); static Reference interfaceFormFactor ("FormFactor", "The form-factor", &BaryonFactorizedDecayer::_form, true, true, true, false, false); static Parameter interfacea1Bottom ("a1Bottom", "The factorization paramter a_1 for decays of bottom baryons", &BaryonFactorizedDecayer::_a1b, 1., -10.0, 10.0, false, false, true); static Parameter interfacea2Bottom ("a2Bottom", "The factorization paramter a_2 for decays of bottom baryons", &BaryonFactorizedDecayer::_a2b, 0.28, -10.0, 10.0, false, false, true); static Parameter interfacea1Charm ("a1Charm", "The factorization paramter a_1 for decays of charm baryons", &BaryonFactorizedDecayer::_a1c, 1.1, -10.0, 10.0, false, false, true); static Parameter interfacea2Charm ("a2Charm", "The factorization paramter a_2 for decays of charm baryons", &BaryonFactorizedDecayer::_a2c, -0.5, -10.0, 10.0, false, false, true); static Reference interfaceCKM ("CKM", "Reference to the Standard Model object", &BaryonFactorizedDecayer::_theCKM, false, false, true, false); } double BaryonFactorizedDecayer::me2(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { double me(0.); assert(inpart.dataPtr()->iSpin()==2); if(decay[0]->dataPtr()->iSpin()==2) me=halfHalf(ichan,inpart,decay,meopt); else if(decay[0]->dataPtr()->iSpin()==4) me=halfThreeHalf(ichan,inpart,decay,meopt); else assert(false); return me; } // matrix element for a 1/2 -> 1/2 decay double BaryonFactorizedDecayer::halfHalf(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { Energy scale; // extract the spins of the particles vector spin; for(unsigned ix=0;ixdataPtr()->iSpin()); if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1Half,spin))); if(meopt==Initialize) { // spinors and rho if(inpart.id()>0) SpinorWaveFunction ::calculateWaveFunctions(_inHalf,_rho, const_ptr_cast(&inpart), incoming); else SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,_rho, const_ptr_cast(&inpart), incoming); } // setup spin info when needed if(meopt==Terminate) { // for the decaying particle if(inpart.id()>0) { SpinorWaveFunction:: constructSpinInfo(_inHalf,const_ptr_cast(&inpart),incoming,true); SpinorBarWaveFunction::constructSpinInfo(_inHalfBar,decay[0],outgoing,true); } else { SpinorBarWaveFunction:: constructSpinInfo(_inHalfBar,const_ptr_cast(&inpart),incoming,true); SpinorWaveFunction::constructSpinInfo(_inHalf,decay[0],outgoing,true); } ParticleVector::const_iterator start = decay.begin()+1, end = decay.end(); ParticleVector hadpart(start,end); _current->current(_currentmap[imode()][0], ichan,scale,hadpart,meopt); return 0.; } ME()->zero(); // spinors for the decay product if(inpart.id()>0) { SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,decay[0],outgoing); } else { SpinorWaveFunction ::calculateWaveFunctions(_inHalf,decay[0],outgoing); } // get the information on the form-factor int id0(inpart.id()),id1(decay[0]->id()); // work out the value of q and calculate the form factors Lorentz5Momentum q(inpart.momentum()-decay[0]->momentum());q.rescaleMass(); Energy m0(inpart.mass()),m1(decay[0]->mass()); Energy2 q2(q.mass2()); Lorentz5Momentum sum(inpart.momentum()+decay[0]->momentum()); // calculate the baryon part of the current for the decay vector baryon; Complex f1v,f2v,f3v,f1a,f2a,f3a; baryon.resize(4); Complex left,right; ParticleVector::const_iterator start,end; ParticleVector hadpart; vector hadron; double pre(0.); unsigned int mhel,ix,iy,lhel; vector constants,ihel; int itemp; unsigned int ibar; for(unsigned int mode=0;mode<_formmap[imode()].size();++mode) { // calculate the form factor piece _form->SpinHalfSpinHalfFormFactor(q2,_formmap[imode()][mode],id0,id1,m0,m1, f1v,f2v,f3v,f1a,f2a,f3a); left = f1v-f1a-f2v-double((m0-m1)/(m0+m1))*f2a; right = f1v+f1a-f2v+double((m0-m1)/(m0+m1))*f2a; for(ix=0;ix<2;++ix) { for(iy=0;iy<2;++iy) { LorentzPolarizationVectorE vtemp = _inHalf[ix].generalCurrent(_inHalfBar[iy],left,right); complex vspin=_inHalf[ix].scalar(_inHalfBar[iy]); complex aspin=_inHalf[ix].pseudoScalar(_inHalfBar[iy]); // the momentum like pieces if(inpart.id()>0) { vtemp+= (f2v*vspin+f2a*aspin)/(m0+m1)*sum; vtemp+= (f3v*vspin+f3a*aspin)/(m0+m1)*q; } else { vtemp+= (f2v*vspin-f2a*aspin)/(m0+m1)*sum; vtemp+= (f3v*vspin-f3a*aspin)/(m0+m1)*q; } if(inpart.id()>0){baryon[2*ix+iy]=vtemp;} else{baryon[2*iy+ix]=vtemp;} } } // construct the weak current start=decay.begin()+1; end =decay.end(); hadpart = ParticleVector(start,end); hadron=_current->current(_currentmap[imode()][mode], ichan,scale,hadpart,meopt); pre=pow(inpart.mass()/scale,int(hadpart.size()-2));pre*=pre; constants.resize(decay.size()+1);ihel.resize(decay.size()+1); itemp=1;ibar=0; for(int iz=int(decay.size()-1);iz>=0;--iz) { if(abs(decay[iz]->id())!=id1) { itemp *= decay[iz]->data().iSpin(); constants[iz]=itemp; } else ibar=iz; constants[decay.size()]=1; constants[ibar]=constants[ibar+1]; } for(mhel=0;mhel0;--ix) { if(ix-1!=ibar){ihel[ix]=(lhel%constants[ix-1])/constants[ix];}} - (*ME())(ihel) += hadron[lhel].dot(baryon[mhel])* - _factCKM[imode()][mode]*SM().fermiConstant(); + (*ME())(ihel) += Complex(hadron[lhel].dot(baryon[mhel])* + _factCKM[imode()][mode]*SM().fermiConstant()); } } } // return the answer return 0.5*pre*(ME()->contract(_rho)).real(); } // matrix element for a 1/2 -> 3/2 decay double BaryonFactorizedDecayer::halfThreeHalf(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { // spins Energy scale; vector spin(decay.size()); for(unsigned int ix=0;ixdata().iSpin(); if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1Half,spin))); // spinors etc for the decaying particle if(meopt==Initialize) { // spinors and rho if(inpart.id()>0) SpinorWaveFunction ::calculateWaveFunctions(_inHalf,_rho, const_ptr_cast(&inpart), incoming); else SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,_rho, const_ptr_cast(&inpart), incoming); } // setup spin info when needed if(meopt==Terminate) { // for the decaying particle if(inpart.id()>0) { SpinorWaveFunction:: constructSpinInfo(_inHalf,const_ptr_cast(&inpart),incoming,true); RSSpinorBarWaveFunction::constructSpinInfo(_inThreeHalfBar, decay[0],outgoing,true); } else { SpinorBarWaveFunction:: constructSpinInfo(_inHalfBar,const_ptr_cast(&inpart),incoming,true); RSSpinorWaveFunction::constructSpinInfo(_inThreeHalf, decay[0],outgoing,true); } ParticleVector::const_iterator start = decay.begin()+1, end = decay.end(); ParticleVector hadpart(start,end); _current->current(_currentmap[imode()][0], ichan,scale,hadpart,meopt); return 0.; } ME()->zero(); // spinors for the decay product LorentzPolarizationVector in=UnitRemoval::InvE*inpart.momentum(); if(inpart.id()>0) { RSSpinorBarWaveFunction:: calculateWaveFunctions(_inThreeHalfBar,decay[0],outgoing); _inHalfBar.resize(_inThreeHalfBar.size()); for(unsigned int ix=0;ix<_inThreeHalfBar.size();++ix) _inHalfBar[ix] = _inThreeHalfBar[ix].dot(in); } else { RSSpinorWaveFunction:: calculateWaveFunctions(_inThreeHalf,decay[0],outgoing); _inHalf.resize(_inThreeHalf.size()); for(unsigned int ix=0;ix<_inThreeHalf.size();++ix) _inHalf[ix] = _inThreeHalf[ix].dot(in); } // get the information on the form-factor int id0(inpart.id()),id1(decay[0]->id()); // work out the value of q and calculate the form factors Lorentz5Momentum q(inpart.momentum()-decay[0]->momentum());q.rescaleMass(); Energy m0(inpart.mass()),m1(decay[0]->mass()); Energy2 q2(q.mass2()); Lorentz5Momentum sum(inpart.momentum()+decay[0]->momentum()); LorentzPolarizationVectorE baryon[4][2]; Complex f1v,f2v,f3v,f4v,f1a,f2a,f3a,f4a; LorentzPolarizationVector vtemp; complex lS1,lS2,rS1,rS2; Complex left,right; complex lV,rV; InvEnergy ms(1./(m0+m1)); InvEnergy2 ms2(ms*ms); unsigned int ix,iy,ixa,iya; ParticleVector::const_iterator start,end; ParticleVector hadpart; vector hadron; double pre(0.); vector constants,ihel; int itemp; unsigned int ibar; for(unsigned int mode=0;mode<_formmap[imode()].size();++mode) { // calculate the form factors _form->SpinHalfSpinThreeHalfFormFactor(q2,_formmap[imode()][mode],id0,id1,m0,m1, f1v,f2v,f3v,f4v,f1a,f2a,f3a,f4a); if(inpart.id()>0) { left = f1a-f1v; right = f1a+f1v; lS1 = ms2*(f3a-f4a-f3v+f4v); rS1 = ms2*(f3a-f4a+f3v-f4v); lS2 = ms2*(f4a-f4v); rS2 = ms2*(f4a+f4v); lV = ms*(f2a-f2v); rV = ms*(f2a+f2v); } else { left = conj(f1a+f1v); right = conj(f1a-f1v); lS1 = ms2*conj(f3a-f4a+f3v-f4v); rS1 = ms2*conj(f3a-f4a-f3v+f4v); lS2 = ms2*conj(f4a-f4v); rS2 = ms2*conj(f4a+f4v); lV = ms *conj(f2a-f2v); rV = ms *conj(f2a+f2v); } // construct the vectors for the decay Complex scalar1,scalar2; complex lfact,rfact; LorentzPolarizationVectorE tvec; LorentzPolarizationVector svec; for(iya=0;iya<4;++iya) { for(ixa=0;ixa<2;++ixa) { if(decay[0]->id()>0){ix=iya;iy=ixa;} else{ix=ixa;iy=iya;} // scalar like terms lfact = _inHalf[iy].leftScalar( _inHalfBar[ix]); rfact = _inHalf[iy].rightScalar(_inHalfBar[ix]); - scalar1 = (lS1*lfact+rS1*rfact)*UnitRemoval::E; - scalar2 = (lS2*lfact+rS2*rfact)*UnitRemoval::E; + scalar1 = Complex((lS1*lfact+rS1*rfact)*UnitRemoval::E); + scalar2 = Complex((lS2*lfact+rS2*rfact)*UnitRemoval::E); svec = _inHalf[iy].generalCurrent(_inHalfBar[ix],lV/ms,rV/ms)*ms; if(inpart.id()>0) { tvec=_inThreeHalfBar[ix].generalCurrent(_inHalf[iy],left,right); } else { tvec=_inThreeHalf[iy].generalCurrent(_inHalfBar[ix],left,right); } baryon[iya][ixa] = tvec+svec*UnitRemoval::E +scalar1*decay[0]->momentum()+scalar2*inpart.momentum(); } } start=decay.begin()+1; end =decay.end(); hadpart=ParticleVector(start,end); hadron=_current->current(_currentmap[imode()][mode], ichan,scale,hadpart,meopt); // prefactor pre = pow(inpart.mass()/scale,int(hadpart.size()-2));pre*=pre; // work out the mapping for the hadron vector constants.resize(decay.size()+1);ihel.resize(decay.size()+1); itemp=1;ibar=0; for(int ix=int(decay.size()-1);ix>=0;--ix) { if(abs(decay[ix]->id())!=id1) { itemp*=decay[ix]->data().iSpin(); constants[ix]=itemp; } else{ibar=ix;} } constants[decay.size()]=1; constants[ibar]=constants[ibar+1]; for(iya=0;iya<4;++iya) { ihel[1]=iya; for(ixa=0;ixa<2;++ixa) { ihel[0]=ixa; for(unsigned int lhel=0;lhel0;--ix) {if(ix-1!=ibar){ihel[ix]=(lhel%constants[ix-1])/constants[ix];}} - (*ME())(ihel) += hadron[lhel].dot(baryon[iya][ixa])* - _factCKM[imode()][mode]*SM().fermiConstant(); + (*ME())(ihel) += Complex(hadron[lhel].dot(baryon[iya][ixa])* + _factCKM[imode()][mode]*SM().fermiConstant()); } } } } // return the answer return 0.5*pre*(ME()->contract(_rho)).real(); } void BaryonFactorizedDecayer::findModes(unsigned int imode, vector & particles, vector & loc, vector & cc) { unsigned int ix,iy,nfound,iz; // resize the vectors loc.clear();cc.clear(); // get the id's for the mode vector id,idbar; int idtemp; bool found; for(ix=0;ixid()); if(particles[imode][ix]->CC()){idbar.push_back(particles[imode][ix]->CC()->id());} else{idbar.push_back(id[ix]);} } vector done(id.size(),false); // loop over the modes for(ix=0;ixid()==id[0]&&particles[ix].size()==id.size()) { nfound=1; for(iy=0;iyid(); iz=1;found=false; do{if(idtemp==id[iz]&&!done[iz]){done[iz]=true;found=true;}++iz;} while(izid()==idbar[0]&&particles[ix].size()==idbar.size()) { nfound=1; for(iy=0;iyid(); iz=1;found=false; do{if(idtemp==idbar[iz]&&!done[iz]){done[iz]=true;found=true;}++iz;} while(izname() << " \n"; for(ix=0;ix<_wgtloc.size();++ix) {output << "insert " << name() << ":WeightLocation " << ix << " " << _wgtloc[ix] << "\n";} for(ix=0;ix<_wgtmax.size();++ix) {output << "insert " << name() << ":MaximumWeight " << ix << " " << _wgtmax[ix] << "\n";} for(ix=0;ix<_weights.size();++ix) {output << "insert " << name() << ":Weights " << ix << " " << _weights[ix] << "\n";} _current->dataBaseOutput(output,false,true); output << "newdef " << name() << ":Current " << _current->name() << " \n"; _form->dataBaseOutput(output,false,true); output << "newdef " << name() << ":FormFactor " << _form->name() << " \n"; if(header){output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl;} } diff --git a/Decay/Baryon/SemiLeptonicBaryonDecayer.cc b/Decay/Baryon/SemiLeptonicBaryonDecayer.cc --- a/Decay/Baryon/SemiLeptonicBaryonDecayer.cc +++ b/Decay/Baryon/SemiLeptonicBaryonDecayer.cc @@ -1,489 +1,489 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the SemiLeptonicBaryonDecayer class. // #include "SemiLeptonicBaryonDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/RSSpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/RSSpinorBarWaveFunction.h" #include "ThePEG/Helicity/LorentzPolarizationVector.h" #include "ThePEG/Helicity/FermionSpinInfo.h" #include "ThePEG/Helicity/RSFermionSpinInfo.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; SemiLeptonicBaryonDecayer::SemiLeptonicBaryonDecayer() { // intermediates generateIntermediates(true); } void SemiLeptonicBaryonDecayer::doinitrun() { _current->initrun(); _form->initrun(); DecayIntegrator::doinitrun(); if(initialize()) { _maxwgt.clear(); for(unsigned int ix=0;ixmaxWeight()); } } void SemiLeptonicBaryonDecayer::doinit() { DecayIntegrator::doinit(); // make sure the current got initialised _current->init(); // and the form factors _form->init(); // the channels tPDVector extpart,ptemp; _modemap.clear(); double maxweight; vector channelwgts(1,1.); int id0(0),id1(0),Wcharge(0),inspin,spect1,spect2,inquark,outquark,outspin; Energy min; DecayPhaseSpaceModePtr mode; DecayPhaseSpaceChannelPtr channel; int iq(0),ia(0); for(unsigned int ix=0;ix<_form->numberOfFactors();++ix) { // get the external particles for this mode extpart.resize(2); _form->particleID(ix,id0,id1); _form->formFactorInfo(ix,inspin,outspin,spect1,spect2,inquark,outquark); extpart[0]=getParticleData(id0); extpart[1]=getParticleData(id1); Wcharge =(extpart[0]->iCharge()-extpart[1]->iCharge()); min = extpart[0]->mass()+extpart[0]->widthUpCut() -extpart[1]->mass()+extpart[1]->widthLoCut(); _modemap.push_back(numberModes()); for(unsigned int iy=0;iy<_current->numberOfModes();++iy) { extpart.resize(2); ptemp=_current->particles(Wcharge,iy,iq,ia); for(unsigned int iz=0;izaddIntermediate(extpart[0],0,0.0,-1,1); bool done=_current->createMode(Wcharge,iy,mode,2,1,channel,min); if(done&&abs(Wcharge)==3&&inspin==2&&(outspin==2||outspin==4)) { // the maximum weight maxweight = _maxwgt.size()>numberModes() ? _maxwgt[numberModes()] : 2.; channelwgts.resize(mode->numberChannels(),1./(mode->numberChannels())); addMode(mode,maxweight,channelwgts); } } } } bool SemiLeptonicBaryonDecayer::accept(tcPDPtr parent, const tPDVector & children) const { // find the non-lepton int ibar(0),idtemp,idin(parent->id()); vector idother; bool dummy; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)>16) ibar=idtemp; else idother.push_back(idtemp); } // check that the form factor exists if(_form->formFactorNumber(idin,ibar,dummy)<0) return false; // and the current return _current->accept(idother); } int SemiLeptonicBaryonDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { // find the ids of the particles for the decay current tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); int idtemp,ibar(0),idin(parent->id()); vector idother; cc=false; for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)>16) ibar=idtemp; else idother.push_back(idtemp); } return _modemap[_form->formFactorNumber(idin,ibar,cc)] +_current->decayMode(idother); } void SemiLeptonicBaryonDecayer::persistentOutput(PersistentOStream & os) const { os << _current << _form << _maxwgt << _modemap; } void SemiLeptonicBaryonDecayer::persistentInput(PersistentIStream & is, int) { is >> _current >> _form >> _maxwgt >> _modemap; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSemiLeptonicBaryonDecayer("Herwig::SemiLeptonicBaryonDecayer", "HwBaryonDecay.so"); void SemiLeptonicBaryonDecayer::Init() { static ClassDocumentation documentation ("The SemiLeptonicBaryonDecayer class is designed for" " the semi-leptonic decay of the baryons."); static Reference interfaceCurrent ("Current", "The current for the leptons produced in the decay.", &SemiLeptonicBaryonDecayer::_current, true, true, true, false, false); static Reference interfaceFormFactor ("FormFactor", "The form factor", &SemiLeptonicBaryonDecayer::_form, true, true, true, false, false); static ParVector interfaceMaximumWeight ("MaximumWeight", "The maximum weights for the decays", &SemiLeptonicBaryonDecayer::_maxwgt, 0, 0, 0, 0, 10000, false, false, true); } // combine the currents and form-factors to give the matrix element double SemiLeptonicBaryonDecayer::me2(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { assert(inpart.dataPtr()->iSpin()==2); double me(0.); if(decay[0]->dataPtr()->iSpin()==2) me = halfHalf(ichan,inpart,decay,meopt); else if(decay[0]->dataPtr()->iSpin()==4) me=halfThreeHalf(ichan,inpart,decay,meopt); else assert(false); return me; } // matrix element for a 1/2 -> 1/2 semi-leptonic decay double SemiLeptonicBaryonDecayer::halfHalf(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { // extract the leptons ParticleVector leptons; leptons.push_back(decay[decay.size()-2]); leptons.push_back(decay[decay.size()-1]); int mode((abs(decay[1]->id())-11)/12); Energy scale; // spinors etc for the decaying particle if(meopt==Initialize) { // spinors and rho if(inpart.id()>0) SpinorWaveFunction ::calculateWaveFunctions(_inHalf,_rho, const_ptr_cast(&inpart), incoming); else SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,_rho, const_ptr_cast(&inpart), incoming); // work out the mapping for the lepton vector _constants.resize(decay.size()+1); _ispin.resize(decay.size()); int itemp(1); _ibar=0; for(int ix=int(decay.size()-1);ix>=0;--ix) { _ispin[ix]=decay[ix]->data().iSpin(); if(abs(decay[ix]->id())<=16) { itemp*=_ispin[ix]; _constants[ix]=itemp; } else _ibar=ix; } _constants[decay.size()]=1; _constants[_ibar]=_constants[_ibar+1]; } if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1Half,_ispin))); // setup spin info when needed if(meopt==Terminate) { // for the decaying particle if(inpart.id()>0) { SpinorWaveFunction:: constructSpinInfo(_inHalf,const_ptr_cast(&inpart),incoming,true); SpinorBarWaveFunction::constructSpinInfo(_inHalfBar,decay[0],outgoing,true); } else { SpinorBarWaveFunction:: constructSpinInfo(_inHalfBar,const_ptr_cast(&inpart),incoming,true); SpinorWaveFunction::constructSpinInfo(_inHalf,decay[0],outgoing,true); } _current->current(mode,ichan,scale,leptons,meopt); return 0.; } // spinors for the decay product if(inpart.id()>0) { SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,decay[0],outgoing); } else { SpinorWaveFunction ::calculateWaveFunctions(_inHalf,decay[0],outgoing); } // get the information on the form-factor int spinin(0),spinout(0),spect1,spect2,inquark,outquark; int id0(inpart.id()),id1(decay[0]->id()); bool cc; int iloc(_form->formFactorNumber(id0,id1,cc)); _form->formFactorInfo(iloc,spinin,spinout,spect1,spect2,inquark,outquark); // work out the value of q and calculate the form factors Lorentz5Momentum q(inpart.momentum()-decay[0]->momentum()); q.rescaleMass(); Energy m0(inpart.mass()),m1(decay[0]->mass()); Energy2 q2(q.mass2()); Lorentz5Momentum sum(inpart.momentum()+decay[0]->momentum()); // calculate the form factors Complex f1v,f2v,f3v,f1a,f2a,f3a; _form->SpinHalfSpinHalfFormFactor(q2,iloc,id0,id1,m0,m1, f1v,f2v,f3v,f1a,f2a,f3a); // calculate the hadronic current for the decay vector hadron(4); Complex left =f1v-f1a-f2v-double((m0-m1)/(m0+m1))*f2a; Complex right =f1v+f1a-f2v+double((m0-m1)/(m0+m1))*f2a; LorentzPolarizationVectorE vtemp; for(unsigned int ix=0;ix<2;++ix) { for(unsigned int iy=0;iy<2;++iy) { vtemp = _inHalf[ix].generalCurrent(_inHalfBar[iy],left,right); complex vspin = _inHalf[ix].scalar(_inHalfBar[iy]); complex aspin = _inHalf[ix].pseudoScalar(_inHalfBar[iy]); // the momentum like pieces if(inpart.id()>0) { vtemp+= (f2v*vspin+f2a*aspin)/(m0+m1)*sum; vtemp+= (f3v*vspin+f3a*aspin)/(m0+m1)*q; } else { vtemp-= (f2v*vspin-f2a*aspin)/(m0+m1)*sum; vtemp+= (f3v*vspin-f3a*aspin)/(m0+m1)*q; } if(inpart.id()>0) hadron[2*ix+iy]=vtemp; else hadron[2*iy+ix]=vtemp; } } // construct the lepton current vector lepton(_current->current(mode,ichan,scale,leptons,meopt)); // matrix element vector ihel(decay.size()+1); unsigned int mhel,ix,lhel; for(mhel=0;mhel0;--ix) { if(ix-1!=_ibar) ihel[ix]=(lhel%_constants[ix-1])/_constants[ix]; } - (*ME())(ihel)= lepton[lhel].dot(hadron[mhel])*SM().fermiConstant(); + (*ME())(ihel) = Complex(lepton[lhel].dot(hadron[mhel])*SM().fermiConstant()); } } // ckm factor double ckm(1.); if(inquark<=6) { if(inquark%2==0) ckm = SM().CKM(inquark/2-1,(abs(outquark)-1)/2); else ckm = SM().CKM(abs(outquark)/2-1,(inquark-1)/2); } // return the answer return 0.5*(ME()->contract(_rho)).real()*ckm; } // matrix element for a 1/2 -> 3/2 semi-leptonic decay double SemiLeptonicBaryonDecayer::halfThreeHalf(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { // extract the leptons ParticleVector leptons; leptons.push_back(decay[decay.size()-2]); leptons.push_back(decay[decay.size()-1]); int mode((abs(decay[1]->id())-11)/12); Energy scale; // spinors etc for the decaying particle if(meopt==Initialize) { // spinors and rho if(inpart.id()>0) SpinorWaveFunction ::calculateWaveFunctions(_inHalf,_rho, const_ptr_cast(&inpart), incoming); else SpinorBarWaveFunction::calculateWaveFunctions(_inHalfBar,_rho, const_ptr_cast(&inpart), incoming); // work out the mapping for the lepton vector _constants.resize(decay.size()+1); _ispin.resize(decay.size()); int itemp(1); _ibar=0; for(int ix=int(decay.size()-1);ix>=0;--ix) { _ispin[ix]=decay[ix]->data().iSpin(); if(abs(decay[ix]->id())<=16) { itemp*=_ispin[ix]; _constants[ix]=itemp; } else _ibar=ix; } _constants[decay.size()]=1; _constants[_ibar]=_constants[_ibar+1]; } if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1Half,_ispin))); // setup spin info when needed if(meopt==Terminate) { // for the decaying particle if(inpart.id()>0) { SpinorWaveFunction:: constructSpinInfo(_inHalf,const_ptr_cast(&inpart),incoming,true); RSSpinorBarWaveFunction::constructSpinInfo(_inThreeHalfBar, decay[0],outgoing,true); } else { SpinorBarWaveFunction:: constructSpinInfo(_inHalfBar,const_ptr_cast(&inpart),incoming,true); RSSpinorWaveFunction::constructSpinInfo(_inThreeHalf, decay[0],outgoing,true); } _current->current(mode,ichan,scale,leptons,meopt); return 0.; } // spinors for the decay product LorentzPolarizationVector in=UnitRemoval::InvE*inpart.momentum(); if(inpart.id()>0) { RSSpinorBarWaveFunction:: calculateWaveFunctions(_inThreeHalfBar,decay[0],outgoing); _inHalfBar.resize(_inThreeHalfBar.size()); for(unsigned int ix=0;ix<_inThreeHalfBar.size();++ix) _inHalfBar[ix] = _inThreeHalfBar[ix].dot(in); } else { RSSpinorWaveFunction:: calculateWaveFunctions(_inThreeHalf,decay[0],outgoing); _inHalf.resize(_inThreeHalf.size()); for(unsigned int ix=0;ix<_inThreeHalf.size();++ix) _inHalf[ix] = _inThreeHalf[ix].dot(in); } // get the information on the form-factor int spinin(0),spinout(0),inquark,outquark,spect1,spect2; int id0(inpart.id()),id1(decay[0]->id()); bool cc; int iloc(_form->formFactorNumber(id0,id1,cc)); _form->formFactorInfo(iloc,spinin,spinout,spect1,spect2,inquark,outquark); // work out the value of q and calculate the form factors Lorentz5Momentum q(inpart.momentum()-decay[0]->momentum());q.rescaleMass(); Energy m0(inpart.mass()),m1(decay[0]->mass()); Energy2 q2(q.mass2()); Lorentz5Momentum sum(inpart.momentum()+decay[0]->momentum()); // calculate the form factors Complex f1v,f2v,f3v,f4v,f1a,f2a,f3a,f4a; _form->SpinHalfSpinThreeHalfFormFactor(q2,iloc,id0,id1,m0,m1, f1v,f2v,f3v,f4v,f1a,f2a,f3a,f4a); LorentzPolarizationVector vtemp; complex lS1,lS2,rS1,rS2; complex lV,rV; Complex left,right; InvEnergy ms(1./(m0+m1)); InvEnergy2 ms2(ms*ms); if(inpart.id()>0) { left = f1a-f1v; right = f1a+f1v; lS1 = ms2*(f3a-f4a-f3v+f4v); rS1 = ms2*(f3a-f4a+f3v-f4v); lS2 = ms2*(f4a-f4v); rS2 = ms2*(f4a+f4v); lV = ms*(f2a-f2v); rV = ms*(f2a+f2v); } else { left = conj(f1a+f1v); right = conj(f1a-f1v); lS1 = ms2*conj(f3a-f4a+f3v-f4v); rS1 = ms2*conj(f3a-f4a-f3v+f4v); lS2 = ms2*conj(f4a-f4v); rS2 = ms2*conj(f4a+f4v); lV = ms *conj(f2a-f2v); rV = ms *conj(f2a+f2v); } // calculate the hadronic current for the decay LorentzPolarizationVectorE hadron[4][2]; // construct the vectors for the decay Complex scalar1,scalar2; complex lfact,rfact; LorentzPolarizationVectorE tvec; LorentzPolarizationVector svec; for(unsigned int iya=0;iya<4;++iya) { for(unsigned int ixa=0;ixa<2;++ixa) { unsigned int ix=iya,iy=ixa; if(decay[0]->id()<0) swap(ix,iy); // scalar like terms lfact = _inHalf[iy].leftScalar(_inHalfBar[ix]); rfact = _inHalf[iy].rightScalar(_inHalfBar[ix]); - scalar1 = (lS1*lfact+rS1*rfact)*UnitRemoval::E; - scalar2 = (lS2*lfact+rS2*rfact)*UnitRemoval::E; + scalar1 = Complex((lS1*lfact+rS1*rfact)*UnitRemoval::E); + scalar2 = Complex((lS2*lfact+rS2*rfact)*UnitRemoval::E); svec = _inHalf[iy].generalCurrent(_inHalfBar[ix],lV/ms,rV/ms)*ms; if(inpart.id()>0) tvec=_inThreeHalfBar[ix].generalCurrent(_inHalf[iy],left,right); else tvec=_inThreeHalf[iy].generalCurrent(_inHalfBar[ix],left,right); hadron[iya][ixa] = tvec+svec*UnitRemoval::E+scalar1*decay[0]->momentum() +scalar2*inpart.momentum(); } } // construct the lepton current vector lepton(_current->current(mode,ichan,scale,leptons,meopt)); vector ihel(decay.size()+1); for(unsigned int iya=0;iya<4;++iya) { ihel[1]=iya; for(unsigned int ixa=0;ixa<2;++ixa) { ihel[0]=ixa; for(unsigned int lhel=0;lhelcontract(_rho)).real()*ckm; } // output the setup information for the particle database void SemiLeptonicBaryonDecayer::dataBaseOutput(ofstream & output,bool header) const { if(header) output << "update decayers set parameters=\""; DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_maxwgt.size();++ix) { output << "insert " << name() << ":MaximumWeight " << ix << " " << _maxwgt[ix] << " \n"; } _current->dataBaseOutput(output,false,true); output << "newdef " << name() << ":Current " << _current->name() << " \n"; _form->dataBaseOutput(output,false,true); output << "newdef " << name() << ":FormFactor " << _form->name() << " \n"; if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/EvtGen/EvtGenInterface.h b/Decay/EvtGen/EvtGenInterface.h --- a/Decay/EvtGen/EvtGenInterface.h +++ b/Decay/EvtGen/EvtGenInterface.h @@ -1,486 +1,486 @@ // -*- C++ -*- #ifndef Herwig_EvtGenInterface_H #define Herwig_EvtGenInterface_H // // This is the declaration of the EvtGenInterface class. // #include "EvtGenInterface.fh" #include "ThePEG/Interface/Interfaced.h" #include "ThePEG/Vectors/Lorentz5Vector.h" #include "ThePEG/Helicity/ScalarSpinInfo.h" #include "ThePEG/Helicity/FermionSpinInfo.h" #include "ThePEG/Helicity/VectorSpinInfo.h" #include "ThePEG/Helicity/RSFermionSpinInfo.h" #include "ThePEG/Helicity/TensorSpinInfo.h" #include "ThePEG/EventRecord/Particle.h" #include "EvtGenRandom.h" #include "EvtGen/EvtGen.hh" #include "EvtGenBase/EvtParticle.hh" #include "EvtGenBase/EvtSpinDensity.hh" #include "EvtGenBase/EvtVector4R.hh" #include "EvtGenBase/EvtVector4C.hh" #include "EvtGenBase/EvtTensor4C.hh" #include "EvtGenBase/EvtDiracSpinor.hh" #include "EvtGenBase/EvtRaritaSchwinger.hh" #include "EvtGenBase/EvtDecayAmp.hh" namespace Herwig { using namespace ThePEG; /** * The EvtGenInterface class is the main class for the use of the EvtGen decay * package with Herwig. * * @see \ref EvtGenInterfaceInterfaces "The interfaces" * defined for EvtGenInterface. */ class EvtGenInterface: public Interfaced { public: /** @name Standard constructors and destructors. */ //@{ /** * The default constructor. */ EvtGenInterface(); /** * The copy constructor (explicit as cannot copy streams) */ EvtGenInterface(const EvtGenInterface &); /** * The destructor. */ virtual ~EvtGenInterface(); //@} public: /** * Use EvtGen to perform a decay * @param parent The decaying particle * @param dm The decaymode * @return The decay products */ ParticleVector decay(const Particle &parent, bool recursive, const DecayMode & dm) const; public: /** @name Functions used by the persistent I/O system. */ //@{ /** * Function used to write out object persistently. * @param os the persistent output stream written to. */ void persistentOutput(PersistentOStream & os) const; /** * Function used to read in object persistently. * @param is the persistent input stream read from. * @param version the version number of the object when written. */ void persistentInput(PersistentIStream & is, int version); //@} /** * The standard Init function used to initialize the interfaces. * Called exactly once for each class by the class description system * before the main function starts or * when this class is dynamically loaded. */ static void Init(); protected: /** @name Functions to convert between EvtGen and Herwig classes */ //@{ /** * Convert a particle to an EvtGen particle. * @param part The particle to be converted. */ EvtParticle *EvtGenParticle(const Particle & part) const; /** * Return the decay products of an EvtGen particle in as ThePEG particles * @param evtpart The EvtGen particle */ ParticleVector decayProducts(EvtParticle* evtpart, bool boost=true) const; /** * Convert a Lorentz5Momentum to a real EvtGen 4-vector * @param mom The momentum to be converted */ EvtVector4R EvtGenMomentum(const Lorentz5Momentum & mom) const { return EvtVector4R(mom.t()/GeV,mom.x()/GeV,mom.y()/GeV,mom.z()/GeV); } /** * Convert a PDG code from ThePEG into an EvtGen particle id * @param id The PDG code * @param exception Whether or not to throw an Exception if fails */ EvtId EvtGenID(int id,bool exception=true) const; /** * Convert a LorentzSpinor to an EvtGen one. The spinor is converted to the * EvtGen Dirac representation/ * @param sp The LorentzSpinor */ EvtDiracSpinor EvtGenSpinor(const LorentzSpinor & sp) const { InvSqrtEnergy norm(sqrt(0.5)/sqrt(GeV)); EvtDiracSpinor output; output.set(EvtGenComplex(-norm*( sp.s1()+sp.s3())), EvtGenComplex(-norm*( sp.s2()+sp.s4())), EvtGenComplex(-norm*(-sp.s1()+sp.s3())), EvtGenComplex(-norm*(-sp.s2()+sp.s4()))); return output; } /** * Convert a LorentzPolarizationVector to a complex EvtGen 4-vector * @param eps The polarization vector to be converted */ EvtVector4C EvtGenPolarization(const LorentzPolarizationVector & eps) const { return EvtVector4C(EvtGenComplex(eps.t()),EvtGenComplex(eps.x()), EvtGenComplex(eps.y()),EvtGenComplex(eps.z())); } /** * Convert our Rarita-Schwinger spinor to the EvtGen one * @param sp Our RS Spinor */ EvtRaritaSchwinger EvtGenRSSpinor(const LorentzRSSpinor & sp) const { InvSqrtEnergy norm(sqrt(0.5)/sqrt(GeV)); complex out[4][4]; for(unsigned int ix=0;ix<4;++ix) { - out[ix][0] =-norm*( sp(ix,0)+sp(ix,2)); - out[ix][1] =-norm*( sp(ix,1)+sp(ix,3)); - out[ix][2] =-norm*(-sp(ix,0)+sp(ix,2)); - out[ix][3] =-norm*(-sp(ix,1)+sp(ix,3)); + out[ix][0] = -Complex(norm*( sp(ix,0)+sp(ix,2))); + out[ix][1] = -Complex(norm*( sp(ix,1)+sp(ix,3))); + out[ix][2] = -Complex(norm*(-sp(ix,0)+sp(ix,2))); + out[ix][3] = -Complex(norm*(-sp(ix,1)+sp(ix,3))); } EvtRaritaSchwinger output; unsigned int ix,iy; // remember we have vec,spin and evtgen spin,vec for(ix=0;ix<4;++ix) { for(iy=0;iy<4;++iy) output.set(ix,iy,EvtGenComplex(out[iy][ix])); } return output; } /** * Convert our tensor to the EvtGen one. * @param ten Our tensor */ EvtTensor4C EvtGenTensor(const LorentzTensor & ten) const { EvtTensor4C output; unsigned int ix,iy; for(ix=0;ix<4;++ix){ for(iy=0;iy<4;++iy) output.set(ix,iy,EvtGenComplex(ten(ix,iy))); } return output; } /** * Convert a spin density matrix to an EvtGen spin density matrix. * @param rho The spin density matrix to be converted. */ EvtSpinDensity EvtGenSpinDensity(const RhoDMatrix & rho) const { EvtSpinDensity rhoout; unsigned int ix,iy,ispin(rho.iSpin()); rhoout.setDim(ispin); for(ix=0;ixset5Momentum(ThePEGMomentum(part->getP4(),part->mass())); if(spin) ThePEGSpin(output,part); // make the daughters ParticleVector daug(decayProducts(part,spin)); for(unsigned int ix=0;ixaddChild(daug[ix]); return output; } /** * Set the SpinInfo for a ThePEG particle using an EvtGen particle * @param pegpart ThePEG particle. * @param evtpart The EvtGen particle. */ void ThePEGSpin(PPtr pegpart,EvtParticle *evtpart) const; /** * Convert an EvtGen EvtId to a PDG code in our conventions * @param id The EvtGen ID. * @param exception Whether or not to throw an Exception if fails */ int ThePEGID(EvtId id,bool exception=true) const; /** * Convert from EvtGen momentum to Lorentz5Momentum * @param mom The EvtGen 4-momentum * @param mass The mass */ Lorentz5Momentum ThePEGMomentum(const EvtVector4R & mom,double mass) const { return Lorentz5Momentum(mom.get(1)*GeV,mom.get(2)*GeV, mom.get(3)*GeV,mom.get(0)*GeV,mass*GeV); } /** * Convert from EvtGen complex to ours */ Complex ThePEGComplex(EvtComplex c) const { return Complex(real(c),imag(c)); } /** * Convert a spin density to a ThePEG one from an EvtGen one * @param rho The spin density matrix to be converted * @param id The PDG code of the particle to get special cases right. */ RhoDMatrix ThePEGSpinDensity(const EvtSpinDensity & rho, int id) const; /** * Convert an EvtDiracSpinor a LorentzSpinor. This spinor is converted to * the default Dirac matrix representation used by ThePEG. * @param sp The EvtDiracSpinor */ LorentzSpinor ThePEGSpinor(const EvtDiracSpinor & sp) const { SqrtEnergy norm(sqrt(0.5)*sqrt(GeV)); vector > evtSpin(4); for(unsigned int ix=0;ix<4;++ix) evtSpin[ix] = -norm*ThePEGComplex(sp.get_spinor(ix)); return LorentzSpinor(evtSpin[0]-evtSpin[2],evtSpin[1]-evtSpin[3], evtSpin[0]+evtSpin[2],evtSpin[1]+evtSpin[3]); } /** * Convert an EvtGen complex 4-vector to a LorentzPolarizationVector * @param eps The complex 4-vector to be converted. */ LorentzPolarizationVector ThePEGPolarization(const EvtVector4C & eps) const { return LorentzPolarizationVector(conj(ThePEGComplex(eps.get(1))), conj(ThePEGComplex(eps.get(2))), conj(ThePEGComplex(eps.get(3))), conj(ThePEGComplex(eps.get(0)))); } /** * Convert an EvtGen Rarita-Schwinger spinor to ours * @param sp The EvtGen RS spinor. */ LorentzRSSpinor ThePEGRSSpinor(const EvtRaritaSchwinger & sp) const { complex evtSpin[4][4]; SqrtEnergy norm(sqrt(0.5)*sqrt(GeV)); // normalisation and swap vec,spin order for(unsigned int ix=0;ix<4;++ix) { for(unsigned int iy=0;iy<4;++iy) evtSpin[ix][iy]=-norm*ThePEGComplex(sp.get(iy,ix)); } LorentzRSSpinor output; for(unsigned int ix=0;ix<4;++ix) { output(ix,0) = evtSpin[ix][0] - evtSpin[ix][2]; output(ix,1) = evtSpin[ix][1] - evtSpin[ix][3]; output(ix,2) = evtSpin[ix][0] + evtSpin[ix][2]; output(ix,3) = evtSpin[ix][1] + evtSpin[ix][3]; } // output.changeRep(Helicity::defaultDRep); return output; } /** * Convert an EvtGen tensor to ThePEG * @param ten The EvtGen tensor */ LorentzTensor ThePEGTensor(const EvtTensor4C & ten) const { LorentzTensor output; unsigned int ix,iy; for(ix=0;ix<4;++ix) { for(iy=0;iy<4;++iy)output(ix,iy)=conj(ThePEGComplex(ten.get(ix,iy))); } return output; } //@} /** * Check the conversion of particles between Herwig and EvtGen */ void checkConversion() const; /** * Output the EvtGen decay modes for a given particle * @param id The PDG code of the particle to output */ void outputEvtGenDecays(long id) const; /** * Find the location in the EvtGen list of decay channels for * a given decay mode. */ int EvtGenChannel(const DecayMode &dm) const; /** * Check the particle has SpinInfo and if not create it * @param part The particle */ tSpinPtr getSpinInfo(const Particle &part) const { // return spin info if exists if(part.spinInfo()) { return dynamic_ptr_cast(const_ptr_cast(&part)->spinInfo()); } // otherwise make it tPPtr ptemp(const_ptr_cast(&part)); PDT::Spin spin(part.dataPtr()->iSpin()); SpinPtr pspin; if(spin==PDT::Spin0) pspin=new_ptr(ScalarSpinInfo(part.momentum(),true)); else if(spin==PDT::Spin1Half) pspin=new_ptr(FermionSpinInfo(part.momentum(),true)); else if(spin==PDT::Spin1) pspin=new_ptr(VectorSpinInfo(part.momentum(),true)); else if(spin==PDT::Spin3Half) pspin=new_ptr(RSFermionSpinInfo(part.momentum(),true)); else if(spin==PDT::Spin2) pspin=new_ptr(TensorSpinInfo(part.momentum(),true)); else throw Exception() << "Can't create spinInfo for decaying particle in " << "EvtGen::checkSpinInfo for spin " << spin << "particle " << Exception::eventerror; ptemp->spinInfo(pspin); return pspin; } /** * Construct the DecayVertex for Herwig using the information from * EvtGen * @param parent The decaying particle * @param products The outgoing particles * @param damp Pointer to the EvtGen decayer */ void constructVertex(const Particle & parent,ParticleVector products, EvtDecayAmp* damp) const; protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const; /** Make a clone of this object, possibly modifying the cloned object * to make it sane. * @return a pointer to the new object. */ virtual IBPtr fullclone() const; //@} protected: /** @name Standard Interfaced functions. */ //@{ /** * Initialize this object. Called in the run phase just before * a run begins. */ virtual void doinitrun(); /** * Finalize this object. Called in the run phase just after a * run has ended. Used eg. to write out statistics. */ virtual void dofinish(); //@} private: /** * The assignment operator is private and must never be called. * In fact, it should not even be implemented. */ EvtGenInterface & operator=(const EvtGenInterface &); private: /** * Names of the various EvtGen parameter files */ //@{ /** * The name of the file containing the decays */ string decayName_; /** * The name of the file containing the particle data */ string pdtName_; /** * Names of addition user specified decays */ vector userDecays_; //@} /** * Whether or not to redirect cout and cerr when EvtGen is running */ bool reDirect_; /** * Check the conversion of the particles */ bool checkConv_; /** * Particles for which to output the EvtGen decays */ vector convID_; /** * Location of the PYTHIA8 data directory */ string p8Data_; private: /** * Pointer to the random number generator for EvtGen */ EvtRandomEngine * evtrnd_; /** * Main EvtGen object */ EvtGen * evtgen_; /** * File to output the log info to */ mutable ofstream logFile_; }; } #endif /* Herwig_EvtGenInterface_H */ diff --git a/Decay/FormFactors/BallZwickyVectorFormFactor.cc b/Decay/FormFactors/BallZwickyVectorFormFactor.cc --- a/Decay/FormFactors/BallZwickyVectorFormFactor.cc +++ b/Decay/FormFactors/BallZwickyVectorFormFactor.cc @@ -1,675 +1,675 @@ // -*- C++ -*- // // BallZwickyVectorFormFactor.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the BallZwickyVectorFormFactor class. // #include "BallZwickyVectorFormFactor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/ParticleData.h" using namespace Herwig; BallZwickyVectorFormFactor::BallZwickyVectorFormFactor() : _Vr1(9), _Vr2(9), _A0r1(9), _A0r2(9), _A1r1(9), _A1r2(9), _A2r1(9), _A2r2(9), _T1r1(9), _T1r2(9), _T2r1(9), _T2r2(9), _T3r1(9), _T3r2(9), _VmR2(9), _Vmfit2(9), _A0mR2(9), _A0mfit2(9), _A1mR2(9), _A1mfit2(9), _A2mR2(9), _A2mfit2(9), _T1mR2(9), _T1mfit2(9), _T2mR2(9), _T2mfit2(9), _T3mR2(9), _T3mfit2(9) { double ort(1./sqrt(2.)); // parameters for the different form-factors // B to rho addFormFactor(-521, 113,1,-2,5,2); addFormFactor(-511, 113,1,-2,5,1); addFormFactor(-511, 213,1,-2,5,2); addFormFactor(-521, 213,1,-2,5,1); for(unsigned int ix=0;ix<4;++ix) { _Vr1[ix] = 1.045 ; _Vr2[ix] = -0.721; _VmR2[ix] = sqr(5.32)*GeV2; _Vmfit2[ix] = 38.34*GeV2; _A0r1[ix] = 1.527 ; _A0r2[ix] = -1.220; _A0mR2[ix] = sqr(5.28)*GeV2; _A0mfit2[ix] = 33.36*GeV2; _A1r1[ix] = 0.240 ; _A1r2[ix] = 0.; _A1mR2[ix] = -1.0*GeV2 ; _A1mfit2[ix] = 37.51*GeV2; _A2r1[ix] = 0.009 ; _A2r2[ix] = 0.212; _A2mR2[ix] = -1.0*GeV2 ; _A2mfit2[ix] = 40.82*GeV2; _T1r1[ix] = 0.897 ; _T1r2[ix] = -0.629; _T1mR2[ix] = sqr(5.32)*GeV2; _T1mfit2[ix] = 38.04*GeV2; _T2r1[ix] = 0.267 ; _T2r2[ix] = 0.; _T2mR2[ix] = -1.0*GeV2 ; _T2mfit2[ix] = 38.59*GeV2; _T3r1[ix] = 0.022 ; _T3r2[ix] = 0.245; _T3mR2[ix] = -1.0*GeV2 ; _T3mfit2[ix] = 40.88*GeV2; } for(unsigned int ix=0;ix<2;++ix) { double fact = ix==0 ? ort : -ort; _Vr1[ix] *= fact; _Vr2[ix] *= fact; _A0r1[ix] *= fact; _A0r2[ix] *= fact; _A1r1[ix] *= fact; _A1r2[ix] *= fact; _A2r1[ix] *= fact; _A2r2[ix] *= fact; _T1r1[ix] *= fact; _T1r2[ix] *= fact; _T2r1[ix] *= fact; _T2r2[ix] *= fact; _T3r1[ix] *= fact; _T3r2[ix] *= fact; } // parameters for the B to K form-factors addFormFactor(-521,-323,1,-2,5,3); addFormFactor(-511,-313,1,-2,5,3); for(unsigned int ix=4;ix<6;++ix) { _Vr1[ix] = 0.923 ; _Vr2[ix] = -0.511; _VmR2[ix] = sqr(5.32)*GeV2; _Vmfit2[ix] = 49.40*GeV2; _A0r1[ix] = 1.364 ; _A0r2[ix] = -0.990; _A0mR2[ix] = sqr(5.28)*GeV2; _A0mfit2[ix] = 36.78*GeV2; _A1r1[ix] = 0.290 ; _A1r2[ix] = 0.0; _A1mR2[ix] = -1.0*GeV2 ; _A1mfit2[ix] = 40.38*GeV2; _A2r1[ix] = -0.084 ; _A2r2[ix] = 0.342; _A2mR2[ix] = -1.0*GeV2 ; _A2mfit2[ix] = 52.00*GeV2; _T1r1[ix] = 0.823 ; _T1r2[ix] = -0.491; _T1mR2[ix] = sqr(5.32)*GeV2; _T1mfit2[ix] = 46.31*GeV2; _T2r1[ix] = 0.333 ; _T2r2[ix] = 0.; _T2mR2[ix] = -1.0*GeV2 ; _T2mfit2[ix] = 41.41*GeV2; _T3r1[ix] = -0.036 ; _T3r2[ix] = 0.369; _T3mR2[ix] = -1.0*GeV2 ; _T3mfit2[ix] = 48.10*GeV2; } // B to omega addFormFactor(-521,223,1,-2,5,2); _Vr1[6] = 1.006*ort ; _Vr2[6] = -0.713*ort; _VmR2[6] = 5.32*5.32*GeV2; _Vmfit2[6] = 37.45*GeV2; _A0r1[6] = 1.321*ort ; _A0r2[6] = -1.040*ort; _A0mR2[6] = 5.28*5.28*GeV2; _A0mfit2[6] = 34.47*GeV2; _A1r1[6] = 0.217*ort ; _A1r2[6] = 0.; _A1mR2[6] = -1.0*GeV2 ; _A1mfit2[6] = 37.01*GeV2; _A2r1[6] = 0.006*ort ; _A2r2[6] = 0.192*ort; _A2mR2[6] = -1.0*GeV2 ; _A2mfit2[6] = 41.24*GeV2; _T1r1[6] = 0.865*ort ; _T1r2[6] = -0.622*ort; _T1mR2[6] = 5.32*5.32*GeV2; _T1mfit2[6] = 37.19*GeV2; _T2r1[6] = 0.242*ort ; _T2r2[6] = 0.; _T2mR2[6] = -1.0*GeV2 ; _T2mfit2[6] = 37.95*GeV2; _T3r1[6] = 0.023*ort ; _T3r2[6] = 0.219*ort; _T3mR2[6] = -1.0*GeV2 ; _T3mfit2[6] = 40.87*GeV2; // B_s to K* addFormFactor(-531,323,1,-3,5,2); _Vr1[7] = 2.351 ; _Vr2[7] = -2.039; _VmR2[7] = sqr(5.42)*GeV2; _Vmfit2[7] = 33.10*GeV2; _A0r1[7] = 2.813 ; _A0r2[7] = -2.450; _A0mR2[7] = sqr(5.37)*GeV2; _A0mfit2[7] = 31.58*GeV2; _A1r1[7] = 0.231 ; _A1r2[7] = 0.; _A1mR2[7] = -1.0*GeV2 ; _A1mfit2[7] = 32.94*GeV2; _A2r1[7] = -0.011 ; _A2r2[7] = 0.192; _A2mR2[7] = -1.0*GeV2 ; _A2mfit2[7] = 40.14*GeV2; _T1r1[7] = 2.047 ; _T1r2[7] = -1.787; _T1mR2[7] = sqr(5.42)*GeV2; _T1mfit2[7] = 32.83*GeV2; _T2r1[7] = 0.260 ; _T2r2[7] = 0.; _T2mR2[7] = -1.0*GeV2 ; _T2mfit2[7] = 33.01*GeV2; _T3r1[7] = 0.043 ; _T3r2[7] = 0.217; _T3mR2[7] = -1.0*GeV2 ; _T3mfit2[7] = 39.38*GeV2; // B_s to phi addFormFactor(-531,333,1,-3,5,3); _Vr1[8] = 1.484 ; _Vr2[8] = -1.049; _VmR2[8] = sqr(5.42)*GeV2; _Vmfit2[8] = 39.52*GeV2; _A0r1[8] = 3.310 ; _A0r2[8] = -2.835; _A0mR2[8] = sqr(5.37)*GeV2; _A0mfit2[8] = 31.57*GeV2; _A1r1[8] = 0.308 ; _A1r2[8] = 0.; _A1mR2[8] = -1.0*GeV2 ; _A1mfit2[8] = 36.54*GeV2; _A2r1[8] = -0.054 ; _A2r2[8] = 0.288; _A2mR2[8] = -1.0*GeV2 ; _A2mfit2[8] = 48.94*GeV2; _T1r1[8] = 1.303 ; _T1r2[8] = -0.954; _T1mR2[8] = sqr(5.42)*GeV2; _T1mfit2[8] = 38.28*GeV2; _T2r1[8] = 0.349 ; _T2r2[8] = 0.; _T2mR2[8] = -1.0*GeV2 ; _T2mfit2[8] = 37.21*GeV2; _T3r1[8] = 0.027 ; _T3r2[8] = 0.322; _T3mR2[8] = -1.0*GeV2 ; _T3mfit2[8] = 45.56*GeV2; initialModes(numberOfFactors()); // cut-off parameter _cutoff=0.01*GeV2; } void BallZwickyVectorFormFactor::doinit() { ScalarFormFactor::doinit(); unsigned int isize(numberOfFactors()); if(isize!=_Vr1.size()||isize!=_Vr2.size()||isize!=_A0r1.size()||isize!=_A0r2.size()|| isize!=_A1r1.size()||isize!=_A1r2.size()||isize!=_A2r1.size()||isize!=_A2r2.size()|| isize!=_T1r1.size()||isize!=_T1r2.size()||isize!=_T2r1.size()||isize!=_T2r2.size()|| isize!=_T3r1.size()||isize!=_T3r2.size()||isize!=_VmR2.size()|| isize!=_Vmfit2.size()||isize!=_A0mR2.size()||isize!=_A0mfit2.size()|| isize!=_A1mR2.size()||isize!=_A1mfit2.size()||isize!=_A2mR2.size()|| isize!=_A2mfit2.size()||isize!=_T1mR2.size()||isize!=_T1mfit2.size()|| isize!=_T2mR2.size()||isize!=_T2mfit2.size()||isize!=_T3mR2.size()|| isize!=_T3mfit2.size()) throw InitException() << "Inconsistent parameters in " << "BallZwickyScalarFormFactor::doinit()" << Exception::abortnow; // output some graphs to check the answers // int id0,id1; // unsigned int iz; // Energy m0,m1; // Energy2 q2,step(14./100.*GeV2); // tcPDPtr in,out; // Complex A0,A1,A2,V; // ofstream output("Ball.top"); // for(unsigned int ix=0;ixmass(); // out= getParticleData(id1); // m1=out->mass(); // output << "new frame " << endl; // output << "newdef font duplex" << endl; // output << "title top \"" << in->PDGName() << " to " << out->PDGName() // << " vector form factors \"" << endl; // output << "newdef limits x 0 14. y 0 1" << endl; // double rt(sqrt(2.)); // for(iz=0;iz<4;++iz) { // q2=ZERO; // for( ;q2<14.*GeV2+step;q2+=step) { // ScalarVectorFormFactor(q2,ix,id0,id1,m0,m1,A0,A1,A2,V); // if(id1==113||id1==223) { // if((abs(id0)%100)/10==1) { // A0*=-rt; // A1*=-rt; // A2*=-rt; // V *=-rt; // } // else { // A0*=rt; // A1*=rt; // A2*=rt; // V*=rt; // } // } // if(iz==0) output << q2/GeV2 << " " << A0.real() << endl; // else if(iz==1) output << q2/GeV2 << " " << A1.real() << endl; // else if(iz==2) output << q2/GeV2 << " " << A2.real() << endl; // else if(iz==3) output << q2/GeV2 << " " << V.real() << endl; // } // if(iz==0) output << "join red" << endl; // else if(iz==1) output << "join blue" << endl; // else if(iz==2) output << "join green" << endl; // else if(iz==3) output << "join yellow" << endl; // } // output << "new frame " << endl; // output << "newdef font duplex" << endl; // output << "title top \"" << in->PDGName() << " to " << out->PDGName() // << " penguin form factors\" " << endl; // output << "newdef limits x 0 14. y 0 1" << endl; // for(iz=0;iz<3;++iz) { // q2=ZERO; // for( ;q2<14.*GeV2+step;q2+=step) { // ScalarVectorSigmaFormFactor(q2,ix,id0,id1,m0,m1,A0,A1,A2); // if(id1==113||id1==223) { // if((abs(id0)%100)/10==1) { // A0*=-rt; // A1*=-rt; // A2*=-rt; // } // else { // A0*=rt; // A1*=rt; // A2*=rt; // } // } // if(iz==0) output << q2/GeV2 << " " << A0.real() << endl; // else if(iz==1) output << q2/GeV2 << " " << A1.real() << endl; // else if(iz==2) output << q2/GeV2 << " " << A2.real() << endl; // } // if(iz==0){output << "join red" << endl;} // else if(iz==1){output << "join blue" << endl;} // else if(iz==2){output << "join green" << endl;} // } // } } void BallZwickyVectorFormFactor::persistentOutput(PersistentOStream & os) const { os << _Vr1 << _Vr2 << _A0r1 << _A0r2 << _A1r1 << _A1r2 << _A2r1 << _A2r2 << _T1r1 << _T1r2 << _T2r1 << _T2r2 << _T3r1 << _T3r2 << ounit(_VmR2,GeV2) << ounit(_Vmfit2,GeV2) << ounit(_A0mR2,GeV2) << ounit(_A0mfit2,GeV2) << ounit(_A1mR2,GeV2) << ounit(_A1mfit2,GeV2) << ounit(_A2mR2,GeV2) << ounit(_A2mfit2,GeV2) << ounit(_T1mR2,GeV2) << ounit(_T1mfit2,GeV2) << ounit(_T2mR2,GeV2) << ounit(_T2mfit2,GeV2) << ounit(_T3mR2,GeV2) << ounit(_T3mfit2,GeV2) << ounit(_cutoff,GeV2); } void BallZwickyVectorFormFactor::persistentInput(PersistentIStream & is, int) { is >> _Vr1 >> _Vr2 >> _A0r1 >> _A0r2 >> _A1r1 >> _A1r2 >> _A2r1 >> _A2r2 >> _T1r1 >> _T1r2 >> _T2r1 >> _T2r2 >> _T3r1 >> _T3r2 >> iunit(_VmR2,GeV2) >> iunit(_Vmfit2,GeV2) >> iunit(_A0mR2 ,GeV2) >> iunit(_A0mfit2,GeV2) >> iunit(_A1mR2,GeV2) >> iunit(_A1mfit2,GeV2) >> iunit(_A2mR2,GeV2) >> iunit(_A2mfit2,GeV2) >> iunit(_T1mR2,GeV2) >> iunit(_T1mfit2,GeV2) >> iunit(_T2mR2,GeV2) >> iunit(_T2mfit2,GeV2) >> iunit(_T3mR2,GeV2) >> iunit(_T3mfit2,GeV2) >> iunit(_cutoff,GeV2); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigBallZwickyVectorFormFactor("Herwig::BallZwickyVectorFormFactor", "HwFormFactors.so"); void BallZwickyVectorFormFactor::Init() { static ClassDocumentation documentation ("The BallZwickyVectorFormFactor class implements the vector form" " factors of hep-ph/0412079 for the form-factor for the decay of a B-meson to a" " light pseudoscalar meson", "The form factors of \\cite{Ball:2004rg} for $B_{d,s}\\to\\rho,\\omega,K^*,\\phi$" " were used.", "\\bibitem{Ball:2004rg} P.~Ball and R.~Zwicky, \n" "Phys.\\ Rev.\\ D {\\bf 71} (2005) 014029 [arXiv:hep-ph/0412079].\n" "%%CITATION = PHRVA,D71,014029;%%\n"); static ParVector interfaceVr_1 ("Vr_1", "The r_1 coefficient for the V form-factor", &BallZwickyVectorFormFactor::_Vr1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceVr_2 ("Vr_2", "The r_2 coefficient for the V form-factor", &BallZwickyVectorFormFactor::_Vr2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA0r_1 ("A0r_1", "The r_1 coefficient for the A_0 form-factor", &BallZwickyVectorFormFactor::_A0r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA0r_2 ("A0r_2", "The r_2 coefficient for the A_0 form-factor", &BallZwickyVectorFormFactor::_A0r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA1r_1 ("A1r_1", "The r_1 coefficient for the A_1 form-factor", &BallZwickyVectorFormFactor::_A1r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA1r_2 ("A1r_2", "The r_2 coefficient for the A_1 form-factor", &BallZwickyVectorFormFactor::_A1r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA2r_1 ("A2r_1", "The r_1 coefficient for the A_2 form-factor", &BallZwickyVectorFormFactor::_A2r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceA2r_2 ("A2r_2", "The r_2 coefficient for the A_2 form-factor", &BallZwickyVectorFormFactor::_A2r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT1r_1 ("T1r_1", "The r_1 coefficient for the T_1 form-factor", &BallZwickyVectorFormFactor::_T1r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT1r_2 ("T1r_2", "The r_2 coefficient for the T_1 form-factor", &BallZwickyVectorFormFactor::_T1r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT2r_1 ("T2r_1", "The r_1 coefficient for the T_2 form-factor", &BallZwickyVectorFormFactor::_T2r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT2r_2 ("T2r_2", "The r_2 coefficient for the T_2 form-factor", &BallZwickyVectorFormFactor::_T2r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT3r_1 ("T3r_1", "The r_1 coefficient for the T_3 form-factor", &BallZwickyVectorFormFactor::_T3r1, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceT3r_2 ("T3r_2", "The r_2 coefficient for the T_3 form-factor", &BallZwickyVectorFormFactor::_T3r2, 0, 0, 0, -10., 10., false, false, true); static ParVector interfaceVmR2 ("VmR2", "The value of m_R^2 for the V form-factor", &BallZwickyVectorFormFactor::_VmR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceVmfit2 ("Vmfit2", "The value of m_fit^2 for the V form-factor", &BallZwickyVectorFormFactor::_Vmfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA0mR2 ("A0mR2", "The value of m_R^2 for the A_0 form-factor", &BallZwickyVectorFormFactor::_A0mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA0mfit2 ("A0mfit2", "The value of m_fit^2 for the A_0 form-factor", &BallZwickyVectorFormFactor::_A0mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA1mR2 ("A1mR2", "The value of m_R^2 for the A_1 form-factor", &BallZwickyVectorFormFactor::_A1mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA1mfit2 ("A1mfit2", "The value of m_fit^2 for the A_1 form-factor", &BallZwickyVectorFormFactor::_A1mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA2mR2 ("A2mR2", "The value of m_R^2 for the A_2 form-factor", &BallZwickyVectorFormFactor::_A2mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceA2mfit2 ("A2mfit2", "The value of m_fit^2 for the A_2 form-factor", &BallZwickyVectorFormFactor::_A2mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT1mR2 ("T1mR2", "The value of m_R^2 for the T_1 form-factor", &BallZwickyVectorFormFactor::_T1mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT1mfit2 ("T1mfit2", "The value of m_fit^2 for the T_1 form-factor", &BallZwickyVectorFormFactor::_T1mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT2mR2 ("T2mR2", "The value of m_R^2 for the T_2 form-factor", &BallZwickyVectorFormFactor::_T2mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT2mfit2 ("T2mfit2", "The value of m_fit^2 for the T_2 form-factor", &BallZwickyVectorFormFactor::_T2mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT3mR2 ("T3mR2", "The value of m_R^2 for the T_3 form-factor", &BallZwickyVectorFormFactor::_T3mR2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static ParVector interfaceT3mfit2 ("T3mfit2", "The value of m_fit^2 for the T_3 form-factor", &BallZwickyVectorFormFactor::_T3mfit2, GeV2, -1, 25.*GeV2, -2.*GeV2, 100.*GeV2, false, false, true); static Parameter interfaceCutOff ("CutOff", "Parameter controlling the value of q^2 where we switch from the fit " "to a small q^2 expansion for numerical stability.", &BallZwickyVectorFormFactor::_cutoff, GeV2, 2.0*GeV2, ZERO, 10.0*GeV2, false, false, true); } // form-factor for scalar to vector void BallZwickyVectorFormFactor::ScalarVectorFormFactor(Energy2 q2,unsigned int mode, int,int,Energy, Energy, Complex & A0,Complex & A1, Complex & A2,Complex & V) const { useMe(); // the form-factors // A_0 if(_A0mR2[mode]_cutoff) { if(_T3mR2[mode]::pointer BaryonThreeQuarkModelFormFactorPtr; BaryonCMatrixElement(BaryonThreeQuarkModelFormFactorPtr in, Energy m0, Energy m1, int type, int mass, int id0,int id1) { _formFactor=in; _m0=m0; _m1=m1; _type=type; _mass=mass; _id0=id0; _id1=id1; } // calculate the integrand Energy operator() (double x) const { return _formFactor->widthIntegrand(x,_m0,_m1,_type,_mass,_id0,_id1); } /** Argument type for GaussianIntegrator */ typedef double ArgType; /** Return type for GaussianIntegrator */ typedef Energy ValType; private: // private variables BaryonThreeQuarkModelFormFactorPtr _formFactor; Energy _m0,_m1; int _type,_mass; int _id0,_id1; }; } BaryonThreeQuarkModelFormFactor::BaryonThreeQuarkModelFormFactor() : _initialize(false), _order(50),_mlight(420*MeV),_mstrange(570*MeV), _LambdaQ(2.5*GeV),_Lambdaqq(0.71*GeV),_Lambdasq(850*MeV),_Lambdass(1.0*GeV) { // modes handled by this form factor // lambda_b addFormFactor(5122,4122,2,2,1,2,5,4); // xi_b addFormFactor(5232,4232,2,2,2,3,5,4); addFormFactor(5132,4132,2,2,1,3,5,4); // sigma_b addFormFactor(5112,4112,2,2,1,1,5,4); addFormFactor(5212,4212,2,2,2,1,5,4); addFormFactor(5222,4222,2,2,2,2,5,4); // omega_b addFormFactor(5332,4332,2,2,3,3,5,4); // sigma_b-> sigma_c* addFormFactor(5112,4114,2,4,1,1,5,4); addFormFactor(5212,4214,2,4,2,1,5,4); addFormFactor(5222,4224,2,4,2,2,5,4); // omega_b -> omega_c* addFormFactor(5332,4334,2,4,3,3,5,4); // set the inital number of form factors initialModes(numberOfFactors()); } void BaryonThreeQuarkModelFormFactor::doinit() { BaryonFormFactor::doinit(); // initialization in needed if(_initialize) { GaussianIntegrator integrator; _C0.clear();_C1.clear();_C2.clear(); double pre(0.),root(2.*sqrt(6.)); double gamma1(1),gamma2(1),gamma3(sqrt(acos(-1.))); unsigned int ix,iy; for(iy=0;iy<2;++iy) { _mu2 = iy==0 ? sqr(_mlight /_LambdaQ) : sqr(_mstrange/_LambdaQ); for(ix=0;ix<=_order;++ix) { if(ix>0) gamma1*=ix; if(ix%2==1) { gamma2*=(ix+1)/2.0; gamma3*=ix/2.0; } if(ix%2==0) pre=pow(root,double(ix))/12.*gamma2/gamma1; else pre=pow(root,double(ix))/12.*gamma3/gamma1; // for the xi_0 function _a=_mu2;_b=2.;_N=ix; _C0.push_back(pre*integrator.value(*this,0.,1.)); // for the xi_1 function _a=_mu2;_b=1.; _C1.push_back(pre*integrator.value(*this,0.,1.)); // for the xi_2 function _a=0.; _b=0.; _C2.push_back(pre*integrator.value(*this,0.,1.)); } } generator()->log() << "Checking results of BaryonThreeQuarkModelFormFactor" << "vs results from the original paper\n"; // first matrix element Energy m0=getParticleData(5122)->mass(); Energy m1=getParticleData(4122)->mass(); double omegamax=0.5*(m0*m0+m1*m1)/m0/m1; BaryonCMatrixElement int1(this,m0,m1,1,0,5122,4122); Energy width = integrator.value(int1,1.,omegamax); generator()->log() << "Lambda_b0->Lambda_c+ decay" << width/6.582119E-22/MeV << "\n"; // second matrix element m0=getParticleData(5222)->mass(); m1=getParticleData(4222)->mass(); omegamax=0.5*(m0*m0+m1*m1)/m0/m1; int1 = BaryonCMatrixElement(this,m0,m1,2,0,5222,4222); width = integrator.value(int1,1.,omegamax); generator()->log() << "Sigma_b+->Sigma_c++ decay" << width/6.582119E-22/MeV << "\n"; // third matrix element m0=getParticleData(5232)->mass(); m1=getParticleData(4232)->mass(); omegamax=0.5*(m0*m0+m1*m1)/m0/m1; int1 = BaryonCMatrixElement(this,m0,m1,1,1,5232,4232); width = integrator.value(int1,1.,omegamax); generator()->log() << "Xi_b0->Xi_c+ decay" << width/6.582119E-22/MeV << "\n"; // fourth matrix element m0=getParticleData(5332)->mass(); m1=getParticleData(4332)->mass(); omegamax=0.5*(m0*m0+m1*m1)/m0/m1; int1 = BaryonCMatrixElement(this,m0,m1,2,2,5332,4332); width = integrator.value(int1,1.,omegamax); generator()->log() << "Omega_b-->Omega_c0 decay" << width/6.582119E-22/MeV << "\n"; // fifth matrix element m0=getParticleData(5222)->mass(); m1=getParticleData(4224)->mass(); omegamax=0.5*(m0*m0+m1*m1)/m0/m1; int1 = BaryonCMatrixElement(this,m0,m1,3,0,5222,4224); width = integrator.value(int1,1.,omegamax); generator()->log() << "Sigma_vb+->Sigma_c*++ decay" << width/6.582119E-22/MeV << "\n"; // fourth matrix element m0=getParticleData(5332)->mass(); m1=getParticleData(4334)->mass(); omegamax=0.5*(m0*m0+m1*m1)/m0/m1; int1 = BaryonCMatrixElement(this,m0,m1,3,2,5332,4334); width = integrator.value(int1,1.,omegamax); generator()->log() << "Omega_b-->Omega_c*0 decay" << width/6.582119E-22/MeV << "\n"; // output some plots for testing double lambdabar = -999.999; ofstream output("ThreeQuark.top"); output << "newdef font duplex" << endl; output << "title top \"Figure 3 from paper \"" << endl; output << "newdef limits x 1 1.44 y 0.5 1" << endl; for(unsigned int ix=0;ix<5;++ix) { double omegamin(1.),omegamax(1.44), step((omegamax-omegamin)/100.),omega(1.),xi; unsigned int ioff(0); if(ix==0){lambdabar=600*MeV/_LambdaQ;} else if(ix==1){lambdabar=650*MeV/_LambdaQ;} else if(ix==2){lambdabar=710*MeV/_LambdaQ;} else if(ix==3){lambdabar=750*MeV/_LambdaQ;} else if(ix==4){lambdabar=800*MeV/_LambdaQ;} for(;omega phi(phiFunction(omega)); double power(1.),numer(0.),denom(0.); for(unsigned int iy=0;iy<=_order;++iy) { numer+=phi[iy]*power*_C0[iy+ioff]; denom+=power*_C0[iy+ioff]; power*=lambdabar; } xi=numer/denom; output << omega << " " << xi << endl; } if(ix==0){output << "join red" << endl;} else if(ix==1){output << "join green" << endl;} else if(ix==2){output << "join blue" << endl;} else if(ix==3){output << "join cyan" << endl;} else if(ix==4){output << "join magenta" << endl;} } output << "new frame " << endl; output << "newdef font duplex" << endl; output << "title top \"Figure 6 from paper \"" << endl; output << "newdef limits x 1 1.4 y 0.5 1" << endl; for(unsigned int ix=0;ix<5;++ix) { double omegamin(1.),omegamax(1.45),step((omegamax-omegamin)/100.),omega(1.); unsigned int ioff(0); if(ix==0){lambdabar=600*MeV/_LambdaQ;} else if(ix==1){lambdabar=650*MeV/_LambdaQ;} else if(ix==2){lambdabar=710*MeV/_LambdaQ;} else if(ix==3){lambdabar=750*MeV/_LambdaQ;} else if(ix==4){lambdabar=800*MeV/_LambdaQ;} for(;omega phi(phiFunction(omega)); double power(1.),numer[2]={0.,0.},denom(0.); for(unsigned int iy=0;iy<=_order;++iy) { numer[0]+=phi[iy]*power*_C1[iy+ioff]; denom+=power*_C1[iy+ioff]; numer[1]+=power*_C2[iy+ioff]*(phi[iy]-phi[iy+2]); power*=lambdabar; } numer[1]/=(omega-1.); double xi1(numer[0]/denom); output << omega << " " << xi1 << endl; } if(ix==0){output << "join red" << endl;} else if(ix==1){output << "join green" << endl;} else if(ix==2){output << "join blue" << endl;} else if(ix==3){output << "join cyan" << endl;} else if(ix==4){output << "join magenta" << endl;} } output << "new frame " << endl; output << "newdef font duplex" << endl; output << "title top \"Figure 7 from paper \"" << endl; output << "newdef limits x 1 1.33 y 0.4 1" << endl; for(unsigned int ix=0;ix<5;++ix) { double omegamin(1.),omegamax(1.45),step((omegamax-omegamin)/100.),omega(1.); unsigned int ioff(_order+1); if(ix==0){lambdabar=800*MeV/_LambdaQ;} else if(ix==1){lambdabar=900*MeV/_LambdaQ;} else if(ix==2){lambdabar=1000*MeV/_LambdaQ;} else if(ix==3){lambdabar=1050*MeV/_LambdaQ;} else if(ix==4){lambdabar=1100*MeV/_LambdaQ;} for(;omega phi(phiFunction(omega)); double power(1.),numer[2]={0.,0.},denom(0.); for(unsigned int iy=0;iy<=_order;++iy) { numer[0]+=phi[iy]*power*_C1[iy+ioff]; denom+=power*_C1[iy+ioff]; numer[1]+=power*_C2[iy+ioff]*(phi[iy]-phi[iy+2]); power*=lambdabar; } numer[1]/=(omega-1.); double xi1(numer[0]/denom); output << omega << " " << xi1 << endl; } if(ix==0){output << "join red" << endl;} else if(ix==1){output << "join green" << endl;} else if(ix==2){output << "join blue" << endl;} else if(ix==3){output << "join cyan" << endl;} else if(ix==4){output << "join magenta" << endl;} } } } void BaryonThreeQuarkModelFormFactor::persistentOutput(PersistentOStream & os) const { os << _initialize << _order << ounit(_mlight,MeV) << ounit(_mstrange,MeV) << ounit(_LambdaQ,MeV) << ounit(_Lambdaqq,MeV) << ounit(_Lambdasq,MeV) << ounit(_Lambdass,MeV) << _C0 << _C1 << _C2;} void BaryonThreeQuarkModelFormFactor::persistentInput(PersistentIStream & is, int) { is >> _initialize >> _order >> iunit(_mlight,MeV) >> iunit(_mstrange,MeV) >> iunit(_LambdaQ,MeV) >> iunit(_Lambdaqq,MeV) >> iunit(_Lambdasq,MeV) >> iunit(_Lambdass,MeV) >> _C0 >> _C1 >> _C2;} // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigBaryonThreeQuarkModelFormFactor("Herwig::BaryonThreeQuarkModelFormFactor", "HwFormFactors.so"); void BaryonThreeQuarkModelFormFactor::Init() { static ClassDocumentation documentation ("The BaryonThreeQuarkModelFormFactor class implements" " the form-factors for semi-leptonic decay of baryon containing a" " heavy quark from PRD56, 348.", "The form factors from \\cite{Ivanov:1996fj} were used.", "%\\cite{Ivanov:1996fj}\n" "\\bibitem{Ivanov:1996fj}\n" " M.~A.~Ivanov, V.~E.~Lyubovitskij, J.~G.~Korner and P.~Kroll,\n" " ``Heavy baryon transitions in a relativistic three-quark model,''\n" " Phys.\\ Rev.\\ D {\\bf 56} (1997) 348\n" " [arXiv:hep-ph/9612463].\n" " %%CITATION = PHRVA,D56,348;%%\n" ); static Parameter interfaceOrder ("Order", "The order of terms to include in the series expansion of the form-factor.", &BaryonThreeQuarkModelFormFactor::_order, 10, 0, 1000, false, false, true); static Parameter interfaceLightMass ("LightMass", "The mass of the light quark", &BaryonThreeQuarkModelFormFactor::_mlight, GeV, .42*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfaceStrangeMass ("StrangeMass", "The mass of the strange quark", &BaryonThreeQuarkModelFormFactor::_mstrange, GeV, .57*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfaceLambdaQ ("LambdaQ", "Heavy Baryon Size Parameter", &BaryonThreeQuarkModelFormFactor::_LambdaQ, GeV, 2.5*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceLambdaqq ("Lambdaqq", "The size parameter for light quarks", &BaryonThreeQuarkModelFormFactor::_Lambdaqq, GeV, 0.71*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfaceLambdasq ("Lambdasq", "The size parameter for one strange quark", &BaryonThreeQuarkModelFormFactor::_Lambdasq, GeV, 0.85*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfaceLambdass ("Lambdass", "The size parameter with two strange quarks.", &BaryonThreeQuarkModelFormFactor::_Lambdass, GeV, 1.0*GeV, ZERO, 2.0*GeV, false, false, true); static ParVector interfaceC0 ("C0", "The coefficient of the expansion for xi_0.", &BaryonThreeQuarkModelFormFactor::_C0, 0, 0, 0, -1E20, 1E20, false, false, true); static ParVector interfaceC1 ("C1", "The coefficient of the expansion for xi_1.", &BaryonThreeQuarkModelFormFactor::_C1, 0, 0, 0, -1E20, 1E20, false, false, true); static ParVector interfaceC2 ("C2", "The coefficient of the expansion for xi_2.", &BaryonThreeQuarkModelFormFactor::_C2, 0, 0, 0, -1E20, 1E20, false, false, true); static Switch interfaceInitialize ("Initialize", "Initialize the coefficient for the expansion of the form-factor", &BaryonThreeQuarkModelFormFactor::_initialize, false, false, false); static SwitchOption interfaceInitializeInitialize (interfaceInitialize, "Yes", "Perform the initialize", true); static SwitchOption interfaceInitializeNoInitialize (interfaceInitialize, "No", "No initialization", false); } void BaryonThreeQuarkModelFormFactor:: SpinHalfSpinHalfFormFactor(Energy2 q2,int,int id0,int id1,Energy m0,Energy m1, Complex & f1v,Complex & f2v,Complex & f3v, Complex & f1a,Complex & f2a,Complex & f3a) { useMe(); // this model is based on heavy quark theory // therefore most of the factors are zero Complex g1v(0.),g1a(0.),g2v(0.),g2a(0.),g3a(0.),g3v(0.); // work out which light quark constant to use double lambdabar;unsigned int ioff(0); if(abs(id1)==4332) { lambdabar=_Lambdass/_LambdaQ; ioff=_order+1; } else if(abs(id1)==4232||abs(id1)==4132) { lambdabar=_Lambdasq/_LambdaQ; ioff=_order+1; } else { lambdabar=_Lambdaqq/_LambdaQ; } // the omega value double omega = 0.5/m0/m1*(m0*m0+m1*m1-q2); // calculate the form factor // the phi functions vector phi(phiFunction(omega)); // use the xi0 functions if(abs(id0)==5122||abs(id0)==5232||abs(id0)==5132) { double power(1.),numer(0.),denom(0.); for(unsigned int ix=0;ix<=_order;++ix) { numer+=phi[ix]*power*_C0[ix+ioff]; denom+=power*_C0[ix+ioff]; power*=lambdabar; } g1v=numer/denom; g1a=g1v; } else { double power(1.),numer[2]={0.,0.},denom(0.); for(unsigned int ix=0;ix<=_order;++ix) { numer[0]+=phi[ix]*power*_C1[ix+ioff]; denom+=power*_C1[ix+ioff]; numer[1]+=power*_C2[ix+ioff]*(phi[ix]-phi[ix+2]); power*=lambdabar; } numer[1]/=(omega-1.); double xi1(numer[0]/denom),xi2(numer[1]/denom); // the couplings in the velocity form g1v = -(omega*xi1-(sqr(omega)-1.)*xi2)/3.; g1a = g1v; g2v = 2./3.*(xi1-(omega-1.)*xi2); g3v = g2v; g2a = 2./3.*(xi1-(omega+1.)*xi2); g3a =-g2a; } // convert to our form f1v = g1v+Complex(0.5*(m0+m1)*(g2v/m0+g3v/m1)); f1a =-g1a+Complex(0.5*(m0-m1)*(g2a/m0+g3a/m1)); - f2v = 0.5*(m0+m1)*( g2v/m0+g3v/m1); - f3v = 0.5*(m0+m1)*( g2v/m0-g3v/m1); - f2a =-0.5*(m0+m1)*( g2a/m0+g3a/m1); - f3a = 0.5*(m0+m1)*(-g2a/m0+g3a/m1); + f2v = Complex(0.5*(m0+m1)*( g2v/m0+g3v/m1)); + f3v = Complex(0.5*(m0+m1)*( g2v/m0-g3v/m1)); + f2a =-Complex(0.5*(m0+m1)*( g2a/m0+g3a/m1)); + f3a = Complex(0.5*(m0+m1)*(-g2a/m0+g3a/m1)); } void BaryonThreeQuarkModelFormFactor:: SpinHalfSpinThreeHalfFormFactor(Energy2 q2,int,int,int id1,Energy m0, Energy m1, Complex & f1v,Complex & f2v, Complex & f3v,Complex & f4v,Complex & f1a, Complex & f2a,Complex & f3a,Complex & f4a ) { useMe(); // work out which light quark constant to use double lambdabar;unsigned int ioff(0); if(abs(id1)==4334) { lambdabar=_Lambdass/_LambdaQ; ioff=_order+1; } else if(abs(id1)==4234||abs(id1)==4134||abs(id1)==3324) { lambdabar=_Lambdasq/_LambdaQ; ioff=_order+1; } else { lambdabar=_Lambdaqq/_LambdaQ; } // the omega value double omega=0.5/m0/m1*(m0*m0+m1*m1-q2); // calculate the form factor // the phi functions vector phi=phiFunction(omega); double power(1.),numer[2]={0.,0.},denom(0.); for(unsigned int ix=0;ix<=_order;++ix) { numer[0]+=phi[ix]*power*_C1[ix+ioff]; denom+=power*_C1[ix+ioff]; numer[1]+=power*_C2[ix+ioff]*(phi[ix]-phi[ix+2]); power*=lambdabar; } numer[1]/=(omega-1.); double xi1=numer[0]/denom; double xi2=numer[1]/denom; // couplings in the velocity form Complex g1v,g2v,g3v,g4v,g1a,g2a,g3a,g4a; double orr(1./sqrt(3.)); Energy msum(m0+m1); Energy2 msum2(msum*msum); g1v = 2.*orr*xi1; g1a = -g1v; g2v = orr*(xi1-(omega-1)*xi2); g2a = orr*(xi1-(omega+1)*xi2); g3v = 0.; g3a = 0.; g4v = -2.*orr*xi2; g4a = -g4v; // convert to our form f1v = g1v; f1a =-g1a; f2v = g2v*msum/m0; f2a =-g2a*msum/m0; - f3v = msum2/m0*(g3v/m0+g4v/m1); - f3a =-msum2/m0*(g3a/m0+g4a/m1); - f4v = msum2/m0/m0*g3v; - f4a =-msum2/m0/m0*g3a; + f3v = Complex(msum2/m0*(g3v/m0+g4v/m1)); + f3a =-Complex(msum2/m0*(g3a/m0+g4a/m1)); + f4v = Complex(msum2/m0/m0*g3v); + f4a =-Complex(msum2/m0/m0*g3a); } void BaryonThreeQuarkModelFormFactor::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header) output << "update decayers set parameters=\""; if(create) output << "create Herwig::BaryonThreeQuarkModelFormFactor " << name() << " \n"; output << "newdef " << name() << ":Order " << _order << " \n"; output << "newdef " << name() << ":LightMass " << _mlight/GeV << " \n"; output << "newdef " << name() << ":StrangeMass " << _mstrange/GeV << " \n"; output << "newdef " << name() << ":LambdaQ " << _LambdaQ/GeV << " \n"; output << "newdef " << name() << ":Lambdaqq " << _Lambdaqq/GeV << " \n"; output << "newdef " << name() << ":Lambdasq " << _Lambdasq/GeV << " \n"; output << "newdef " << name() << ":Lambdass " << _Lambdass/GeV << " \n"; // the number of terms to include in the sum for the form-factors for(unsigned int ix=0;ix<_C0.size();++ix) output << "insert " << name() << ":C0 " << ix << " " << _C0[ix] << " \n"; for(unsigned int ix=0;ix<_C1.size();++ix) output << "insert " << name() << ":C1 " << ix << " " << _C1[ix] << " \n"; for(unsigned int ix=0;ix<_C2.size();++ix) output << "insert " << name() << ":C2 " << ix << " " << _C2[ix] << " \n"; BaryonFormFactor::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } double BaryonThreeQuarkModelFormFactor::operator ()(double x) const { // convert the integration variable double y=(1.-x)/x; double output =exp(-24.*_mu2*y)*y; // the integrals double I,Im2; SN(y,_N,Im2,I); double Nfact=0.5*_N+1.0; output *= (_a+Nfact/24./(1.+y))*I+1./12./(1.+y)*(_b-Nfact)*Im2; return output; } void BaryonThreeQuarkModelFormFactor::SN(double y, int N, double & SNm2, double & SN) const { // special cases for the low lying values if(N==0) { double root=sqrt((1.+y)*(3.+y)); SN = 0.5/y*sqrt((1.+y)/(3.+y))*log((root+y)/(root-y)); SNm2 = 0.5/(y+3.)*(SN+(1.+y)/(3.+4.*y)); } else if(N==1) { SN = sqrt(1.+y)/y*asin(y/sqrt(1.+y)/sqrt(3.+y)); SNm2 = 1./(3.+y)*sqrt((1.+y)/(3.+4.*y)); } else if(N==2) { double root=sqrt((1.+y)*(3.+y)); SN = 1.; SNm2 = 0.5/y*sqrt((1.+y)/(3.+y))*log((root+y)/(root-y)); } // the general case else { int ix; double root; if(N%2==0) { SN=1.; ix=2; root=1.; } else { SN = sqrt(1.+y)/y*asin(y/sqrt(1.+y)/sqrt(3.+y)); ix=1; root=sqrt((1.+y)/(3.+4.*y)); } do { SNm2=SN; ix+=2; root*=(3.+4.*y)/(1.+y); SN=1.0/(ix-1.0)*(root+(ix-2.0)*(y+3.)*SNm2); } while(ix BaryonThreeQuarkModelFormFactor::phiFunction(double omega) { vector output; double root(sqrt(omega*omega-1.)); output.push_back(1./root*log(omega+root)); if(omega<1.00001) output.back()=1.; if(_order>0) output.push_back(2./(omega+1.)); if(_order<2) return output; for(unsigned int ix=2;ix<=_order+2;++ix) { output.push_back(2./ix/(omega+1.)*(1.+(ix-1)*output[ix-2])); } return output; } Energy BaryonThreeQuarkModelFormFactor::widthIntegrand(double omega,Energy m0, Energy m1, int type, int ,int id0, int id1) { // prefactors double omegamax=0.5*(m0*m0+m1*m1)/m0/m1; double pi=acos(-1.); InvEnergy kw=sqr(generator()->standardModel()->fermiConstant()) /8./pi/pi/pi*m1*m1*m1/6.*(omegamax-omega)*sqrt(omega*omega-1.); Energy2 q2 = sqr(m0)+sqr(m1)-2.*m0*m1*omega; if(type<=2) { Complex f1v,f2v,f3v,f1a,f2a,f3a; SpinHalfSpinHalfFormFactor(q2,0,id0,id1,m0,m1,f1v,f2v,f3v,f1a,f2a,f3a); Complex left =f1v-f1a-f2v-double((m0-m1)/(m0+m1))*f2a; Complex right =f1v+f1a-f2v+double((m0-m1)/(m0+m1))*f2a; double g1v = 0.5*( left+right).real(); double g2v = m0*(f2v+f3v).real()/(m0+m1); double g3v = m1*(f2v-f3v).real()/(m0+m1); double g1a = -0.5*(+right-left).real(); double g2a = -m0*(f2a+f3a).real()/(m0+m1); double g3a = -m1*(f2a-f3a).real()/(m0+m1); Energy Hpp = -2.*sqrt(m0*m1*(omega-1.))*g1v+2.*sqrt(m0*m1*(omega+1))*g1a; Energy Hmm = -2.*sqrt(m0*m1*(omega-1.))*g1v-2.*sqrt(m0*m1*(omega+1))*g1a; Energy Hp0 = (sqrt(2.*m0*m1*(omega-1))*((m0+m1)*g1v+m1*(omega+1)*g2v+m0*(omega+1)*g3v)- sqrt(2.*m0*m1*(omega+1))*((m0-m1)*g1a-m1*(omega-1)*g2a-m0*(omega-1)*g3a))/sqrt(q2); Energy Hm0 = (sqrt(2.*m0*m1*(omega-1))*((m0+m1)*g1v+m1*(omega+1)*g2v+m0*(omega+1)*g3v)+ sqrt(2.*m0*m1*(omega+1))*((m0-m1)*g1a-m1*(omega-1)*g2a-m0*(omega-1)*g3a))/sqrt(q2); return kw*sqr(0.04)*(sqr(Hpp)+sqr(Hmm)+sqr(Hp0)+sqr(Hm0)); } else { Complex f1v,f2v,f3v,f4v,f1a,f2a,f3a,f4a; double g1v,g2v,g3v,g4v,g1a,g2a,g3a,g4a; SpinHalfSpinThreeHalfFormFactor(q2,0,id0,id1,m0,m1, f1v,f2v,f3v,f4v, f1a,f2a,f3a,f4a); g1v = f1v.real(); g1a = -f1a.real(); g2v = m0/(m0+m1)*f2v.real(); g2a =-m0/(m0+m1)*f2a.real(); g3v = sqr(m0/(m0+m1))*f4v.real(); g3a =-sqr(m0/(m0+m1))*f4a.real(); g4v = m0*m1/sqr(m0+m1)*(f3v.real()-f4v.real()); g4a =-m0*m1/sqr(m0+m1)*(f3a.real()-f4a.real()); Energy HppC = +sqrt(2./3.)*sqrt(m0*m1*(omega-1))*(g1v-2.*(omega+1)*g2v) -sqrt(2./3.)*sqrt(m0*m1*(omega+1))*(g1a-2.*(omega-1)*g2a); Energy HmmC = -sqrt(2./3.)*sqrt(m0*m1*(omega-1))*(g1v-2.*(omega+1)*g2v) -sqrt(2./3.)*sqrt(m0*m1*(omega+1))*(g1a-2.*(omega-1)*g2a); Energy HppbC = -sqrt(2.*m0*m1*(omega-1))*g1v -sqrt(2.*m0*m1*(omega+1))*g1a; Energy HmmbC = sqrt(2.*m0*m1*(omega-1))*g1v -sqrt(2.*m0*m1*(omega+1))*g1a; Energy Hp0C = ( -2./sqrt(3.)*sqrt(m0*m1*(omega-1))* ((m0*omega-m1)*g1v-(m0-m1)*(omega+1)*g2v+m1*(sqr(omega)-1)*g3v+m0*(sqr(omega)-1)*g4v) -2./sqrt(3.)*sqrt(m0*m1*(omega+1))* ((m0*omega-m1)*g1a+(m0+m1)*(omega-1)*g2a+m1*(sqr(omega)-1)*g3a+m0*(sqr(omega)-1)*g4a))/sqrt(q2); Energy Hm0C = ( +2./sqrt(3.)*sqrt(m0*m1*(omega-1))* ((m0*omega-m1)*g1v-(m0-m1)*(omega+1)*g2v+m1*(sqr(omega)-1)*g3v+m0*(sqr(omega)-1)*g4v) -2./sqrt(3.)*sqrt(m0*m1*(omega+1))* ((m0*omega-m1)*g1a+(m0+m1)*(omega-1)*g2a+m1*(sqr(omega)-1)*g3a+m0*(sqr(omega)-1)*g4a))/sqrt(q2); return kw*sqr(0.04)*(sqr(HppC)+sqr(HmmC)+sqr(HppbC)+sqr(HmmbC)+sqr(Hp0C)+sqr(Hm0C)); } } diff --git a/Decay/FormFactors/ISGW2FormFactor.cc b/Decay/FormFactors/ISGW2FormFactor.cc --- a/Decay/FormFactors/ISGW2FormFactor.cc +++ b/Decay/FormFactors/ISGW2FormFactor.cc @@ -1,1215 +1,1215 @@ // -*- C++ -*- // // ISGW2FormFactor.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ISGW2FormFactor class. // #include "ISGW2FormFactor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" using namespace Herwig; ISGW2FormFactor::ISGW2FormFactor() { // include the a(omega) piece (off by default) _includeaW = false; // values of a_S at matching scale _alphamuQM=0.6; // the quark masses _mdown = 0.33*GeV; _mup = 0.33*GeV; _mstrange = 0.55*GeV; _mcharm = 1.82*GeV; _mbottom = 5.20*GeV; // 1 1S0 parameters // the wavefunction parameters _beta1S0ud = 0.41*GeV; _beta1S0us = 0.44*GeV; _beta1S0ss = 0.53*GeV; _beta1S0cu = 0.45*GeV; _beta1S0cs = 0.56*GeV; _beta1S0ub = 0.43*GeV; _beta1S0sb = 0.54*GeV; _beta1S0cc = 0.88*GeV; _beta1S0bc = 0.92*GeV; // 1 3S1 parameters // the wavefunction parameters _beta3S1ud = 0.30*GeV; _beta3S1us = 0.33*GeV; _beta3S1ss = 0.37*GeV; _beta3S1cu = 0.38*GeV; _beta3S1cs = 0.44*GeV; _beta3S1ub = 0.40*GeV; _beta3S1sb = 0.49*GeV; _beta3S1cc = 0.62*GeV; _beta3S1bc = 0.75*GeV; // 1P parameters // the wavefunction parameters _beta1Pud = 0.28*GeV; _beta1Pus = 0.30*GeV; _beta1Pss = 0.33*GeV; _beta1Pcu = 0.33*GeV; _beta1Pcs = 0.38*GeV; _beta1Pub = 0.35*GeV; _beta1Psb = 0.41*GeV; _beta1Pcc = 0.52*GeV; _beta1Pbc = 0.60*GeV; // relativistic correction factors _CfDrho = 0.889; _CfDKstar = 0.928; _CfDsKstar = 0.873; _CfDsphi = 0.911; _CfBrho = 0.905; _CfBDstar = 0.989; _CfBsKstar = 0.892; _CfBsDstar = 0.984; _CfBcDstar = 0.868; _CfBcpsi = 0.967; _CfBcBsstar = 1.0; _CfBcBstar = 1.0; // eta-eta' mixing angle _thetaeta = -Constants::pi/9.; // B_c to d cbar addFormFactor(-541,-411 ,0,-4, 5, 1); addFormFactor(-541,-413 ,1,-4, 5, 1); addFormFactor(-541,-415 ,2,-4, 5, 1); addFormFactor(-541, 10413,1,-2, 5, 1); addFormFactor(-541,-20413,1,-4, 5, 1); addFormFactor(-541, 10411,0, 4, 5, 1); // B_c to u cbar addFormFactor(-541,-421 ,0,-4, 5, 2); addFormFactor(-541,-423 ,1,-4, 5, 2); addFormFactor(-541,-425 ,2,-4, 5, 2); addFormFactor(-541,-10423,1,-4, 5, 2); addFormFactor(-541,-20423,1,-4, 5, 2); addFormFactor(-541,-10421,0,-4, 5, 2); // B_c to s cbar addFormFactor(-541,-431 ,0,-4, 5, 3); addFormFactor(-541,-433 ,1,-4, 5, 3); addFormFactor(-541,-435 ,2,-4, 5, 3); addFormFactor(-541,-10433,1,-4, 5, 3); addFormFactor(-541,-20433,1,-4, 5, 3); addFormFactor(-541,-10431,0, 4, 5, 3); // B_c decays to c cbar addFormFactor(-541, 441 ,0,-4, 5, 4); addFormFactor(-541, 443 ,1,-4, 5, 4); addFormFactor(-541, 445 ,2,-4, 5, 4); addFormFactor(-541, 10443,1,-4, 5, 4); addFormFactor(-541, 20443,1,-4, 5, 4); addFormFactor(-541, 10441,0, 4, 5, 4); // B_c to b dbar addFormFactor( 541, 511 ,0, 5,-4,-1); addFormFactor( 541, 513 ,1, 5,-4,-1); addFormFactor( 541, 515 ,2, 5,-4,-1); addFormFactor( 541, 10513,1, 5,-4,-1); addFormFactor( 541, 20513,1, 5,-4,-1); addFormFactor( 541, 10511,0, 5,-4,-1); // B_c to b ubar addFormFactor( 541, 521 ,0, 5,-4,-2); addFormFactor( 541, 523 ,1, 5,-4,-2); addFormFactor( 541, 525 ,2, 5,-4,-2); addFormFactor( 541, 10523,1, 5,-4,-2); addFormFactor( 541, 20523,1, 5,-4,-2); addFormFactor( 541, 10521,0, 5,-4,-2); // B_c decays to s bbar addFormFactor( 541, 531 ,0, 5,-4,-3); addFormFactor( 541, 533 ,1, 5,-4,-3); addFormFactor( 541, 535 ,2, 5,-4,-3); addFormFactor( 541, 10533,1, 5,-4,-3); addFormFactor( 541, 20533,1, 5,-4,-3); addFormFactor( 541, 10531,0, 5,-4,-3); // B_s to d sbar addFormFactor(-531, 311 ,0, 3,-5,-1); addFormFactor(-531, 313 ,1, 3,-5,-1); addFormFactor(-531, 315 ,2, 3,-5,-1); addFormFactor(-531, 10313,1, 3,-5,-1); addFormFactor(-531, 20313,1, 3,-5,-1); addFormFactor(-531, 10311,0, 3,-5,-1); // B_s to u sbar addFormFactor(-531, 321 ,0, 3,-5,-2); addFormFactor(-531, 323 ,1, 3,-5,-2); addFormFactor(-531, 325 ,2, 3,-5,-2); addFormFactor(-531, 10323,1, 3,-5,-2); addFormFactor(-531, 20323,1, 3,-5,-2); addFormFactor(-531, 10321,0, 3,-5,-2); // B_s to s sbar addFormFactor(-531, 221 ,0, 3,-5,-3); addFormFactor(-531, 331 ,0, 3,-5,-3); addFormFactor(-531, 333 ,1, 3,-5,-3); addFormFactor(-531, 335 ,2, 3,-5,-3); addFormFactor(-531, 10333,1, 3,-5,-3); addFormFactor(-531, 20333,1, 3,-5,-3); addFormFactor(-531, 10331,0, 3,-5,-3); // B_s decays to c sbar addFormFactor(-531, 431 ,0, 3,-5,-4); addFormFactor(-531, 433 ,1, 3,-5,-4); addFormFactor(-531, 435 ,2, 3,-5,-4); addFormFactor(-531, 10433,1, 3,-5,-4); addFormFactor(-531, 20433,1, 3,-5,-4); addFormFactor(-531, 10431,0, 3,-5,-4); // B_u decays to d ubar addFormFactor(-521,-211 ,0,-2, 5, 1); addFormFactor(-521,-213 ,1,-2, 5, 1); addFormFactor(-521,-215 ,2,-2, 5, 1); addFormFactor(-521,-10213,1,-2, 5, 1); addFormFactor(-521,-20213,1,-2, 5, 1); addFormFactor(-521,-10211,0,-2, 5, 1); // B_u to uu (I=0) addFormFactor(-521, 221 ,0,-2, 5, 2); addFormFactor(-521, 331 ,0,-2, 5, 2); addFormFactor(-521, 223 ,1,-2, 5, 2); addFormFactor(-521, 225 ,2,-2, 5, 2); addFormFactor(-521, 10223,1,-2, 5, 2); addFormFactor(-521, 20223,1,-2, 5, 2); addFormFactor(-521, 10221,0,-2, 5, 2); // B_u to uu (I=1) addFormFactor(-521, 111 ,0,-2, 5, 2); addFormFactor(-521, 113 ,1,-2, 5, 2); addFormFactor(-521, 115 ,2,-2, 5, 2); addFormFactor(-521, 10113,1,-2, 5, 2); addFormFactor(-521, 20113,1,-2, 5, 2); addFormFactor(-521, 10111,0,-2, 5, 2); // B_u decays to s ubar addFormFactor(-521,-321 ,0,-2, 5, 3); addFormFactor(-521,-323 ,1,-2, 5, 3); addFormFactor(-521,-325 ,2,-2, 5, 3); addFormFactor(-521,-10323,1,-2, 5, 3); addFormFactor(-521,-20323,1,-2, 5, 3); addFormFactor(-521,-10321,0,-2, 5, 3); // B_u decays to c ubar addFormFactor(-521, 421 ,0,-2, 5, 4); addFormFactor(-521, 423 ,1,-2, 5, 4); addFormFactor(-521, 425 ,2,-2, 5, 4); addFormFactor(-521, 10423,1,-2, 5, 4); addFormFactor(-521, 20423,1,-2, 5, 4); addFormFactor(-521, 10421,0,-2, 5, 4); // B_d decays to d dbar (I=0) addFormFactor(-511, 221 ,0, 1,-5,-1); addFormFactor(-511, 331 ,0, 1,-5,-1); addFormFactor(-511, 223 ,1, 1,-5,-1); addFormFactor(-511, 225 ,2, 1,-5,-1); addFormFactor(-511, 10223,1, 1,-5,-1); addFormFactor(-511, 20223,1, 1,-5,-1); addFormFactor(-511, 10221,0, 1,-5,-1); // B_d decays to d dbar (I=1) addFormFactor(-511, 111 ,0, 1,-5,-1); addFormFactor(-511, 113 ,1, 1,-5,-1); addFormFactor(-511, 115 ,2, 1,-5,-1); addFormFactor(-511, 10113,1, 1,-5,-1); addFormFactor(-511, 20113,1, 1,-5,-1); addFormFactor(-511, 10111,0, 1,-5,-1); // B_d decays to u dbar addFormFactor(-511, 211 ,0, 1,-5,-2); addFormFactor(-511, 213 ,1, 1,-5,-2); addFormFactor(-511, 215 ,2, 1,-5,-2); addFormFactor(-511, 10213,1, 1,-5,-2); addFormFactor(-511, 20213,1, 1,-5,-2); addFormFactor(-511, 10211,0, 1,-5,-2); // B_d decays to s dbar addFormFactor(-511, 311 ,0, 1,-5,-3); addFormFactor(-511, 313 ,1, 1,-5,-3); addFormFactor(-511, 315 ,2, 1,-5,-3); addFormFactor(-511, 10313,1, 1,-5,-3); addFormFactor(-511, 20313,1, 1,-5,-3); addFormFactor(-511, 10311,0, 1,-5,-3); // B_d decays to c dbar addFormFactor(-511, 411 ,0, 1,-5,-4); addFormFactor(-511, 413 ,1, 1,-5,-4); addFormFactor(-511, 415 ,2, 1,-5,-4); addFormFactor(-511, 10413,1, 1,-5,-4); addFormFactor(-511, 20413,1, 1,-5,-4); addFormFactor(-511, 10411,0, 1,-5,-4); // D_s to d sbar addFormFactor( 431, 311,0,-3, 4, 1); addFormFactor( 431, 313,1,-3, 4, 1); addFormFactor( 431, 315,2,-3, 4, 1); addFormFactor( 431, 10313,1,-3, 4, 1); addFormFactor( 431, 20313,1,-3, 4, 1); addFormFactor( 431, 10311,0,-3, 4, 1); // D_s to u sbar addFormFactor( 431, 321,0,-3, 4, 2); addFormFactor( 431, 323,1,-3, 4, 2); addFormFactor( 431, 325,2,-3, 4, 2); addFormFactor( 431, 10323,1,-3, 4, 2); addFormFactor( 431, 20323,1,-3, 4, 2); addFormFactor( 431, 10321,0,-3, 4, 2); // D_s to s sbar addFormFactor( 431, 221 ,0,-3, 4, 3); addFormFactor( 431, 331 ,0,-3, 4, 3); addFormFactor( 431, 333 ,1,-3, 4, 3); addFormFactor( 431, 335 ,2,-3, 4, 3); addFormFactor( 431, 10333,1,-3, 4, 3); addFormFactor( 431, 20333,1,-3, 4, 3); addFormFactor( 431, 10331,0,-3, 4, 3); // D0 to d ubar addFormFactor( 421,-211 ,0,-2, 4, 1); addFormFactor( 421,-213 ,1,-2, 4, 1); addFormFactor( 421,-215 ,2,-2, 4, 1); addFormFactor( 421,-10213,1,-2, 4, 1); addFormFactor( 421,-20213,1,-2, 4, 1); addFormFactor( 421,-10211,0,-2, 4, 1); // D0 to u ubar (I=1) addFormFactor( 421, 111 ,0,-2, 4, 2); addFormFactor( 421, 113 ,1,-2, 4, 2); addFormFactor( 421, 115 ,2,-2, 4, 2); addFormFactor( 421, 10113,1,-2, 4, 2); addFormFactor( 421, 20113,1,-2, 4, 2); addFormFactor( 421, 10111,0,-2, 4, 2); // D0 to u ubar (I=0) addFormFactor( 421, 221 ,0,-2, 4, 2); addFormFactor( 421, 331 ,0,-2, 4, 2); addFormFactor( 421, 223 ,1,-2, 4, 2); addFormFactor( 421, 225 ,2,-2, 4, 2); addFormFactor( 421, 10223,1,-2, 4, 2); addFormFactor( 421, 20223,1,-2, 4, 2); addFormFactor( 421, 10221,0,-2, 4, 2); // D0 to s ubar addFormFactor( 421,-321 ,0,-2, 4, 3); addFormFactor( 421,-323 ,1,-2, 4, 3); addFormFactor( 421,-325 ,2,-2, 4, 3); addFormFactor( 421,-10323,1,-2, 4, 3); addFormFactor( 421,-20323,1,-2, 4, 3); addFormFactor( 421,-10321,0,-2, 4, 3); // D+ to d dbar I=0 addFormFactor( 411, 221 ,0,-1, 4, 1); addFormFactor( 411, 331 ,0,-1, 4, 1); addFormFactor( 411, 223 ,1,-1, 4, 1); addFormFactor( 411, 225 ,2,-1, 4, 1); addFormFactor( 411, 10223,1,-1, 4, 1); addFormFactor( 411, 20223,1,-1, 4, 1); addFormFactor( 411, 10221,0,-1, 4, 1); // D+ to d dbar I=1 addFormFactor( 411, 111 ,0,-1, 4, 1); addFormFactor( 411, 113 ,1,-1, 4, 1); addFormFactor( 411, 115 ,2,-1, 4, 1); addFormFactor( 411, 10113,1,-1, 4, 1); addFormFactor( 411, 20113,1,-1, 4, 1); addFormFactor( 411, 10111,0,-1, 4, 1); // D+ to u dbar addFormFactor( 411, 211 ,0,-1, 4, 2); addFormFactor( 411, 213 ,1,-1, 4, 2); addFormFactor( 411, 215 ,2,-1, 4, 2); addFormFactor( 411, 10213,1,-1, 4, 2); addFormFactor( 411, 20213,1,-1, 4, 2); addFormFactor( 411, 10211,0,-1, 4, 2); // D+ to s dbar addFormFactor( 411,-311 ,0,-1, 4, 3); addFormFactor( 411,-313 ,1,-1, 4, 3); addFormFactor( 411,-315 ,2,-1, 4, 3); addFormFactor( 411,-10313,1,-1, 4, 3); addFormFactor( 411,-20313,1,-1, 4, 3); addFormFactor( 411,-10311,0,-1, 4, 3); // set the initial number of modes initialModes(numberOfFactors()); } void ISGW2FormFactor::doinit() { ScalarFormFactor::doinit(); // set up the quark masses _mquark.resize(5); _mquark[0]=_mdown; _mquark[1]=_mup; _mquark[2]=_mstrange; _mquark[3]=_mcharm; _mquark[4]=_mbottom; // value of alpha_S at the quark masses _alphaQ.resize(5); for(unsigned int ix=0;ix<5;++ix) { _alphaQ[ix]=alphaS(_mquark[ix],sqr(_mquark[ix])); } _beta1S0.resize(5,vector(5)); _mass1S0.resize(5,vector(5)); _beta3S1.resize(5,vector(5)); _beta1P .resize(5,vector(5)); _massPoh.resize(5,vector(5)); _massPth.resize(5,vector(5)); // set up the beta values _beta1S0[0][0] = _beta1S0ud;_beta3S1[0][0] = _beta3S1ud;_beta1P[0][0] = _beta1Pud; _beta1S0[1][0] = _beta1S0ud;_beta3S1[1][0] = _beta3S1ud;_beta1P[1][0] = _beta1Pud; _beta1S0[2][0] = _beta1S0us;_beta3S1[2][0] = _beta3S1us;_beta1P[2][0] = _beta1Pus; _beta1S0[3][0] = _beta1S0cu;_beta3S1[3][0] = _beta3S1cu;_beta1P[3][0] = _beta1Pcu; _beta1S0[4][0] = _beta1S0ub;_beta3S1[4][0] = _beta3S1ub;_beta1P[4][0] = _beta1Pub; _beta1S0[0][1] = _beta1S0ud;_beta3S1[0][1] = _beta3S1ud;_beta1P[0][1] = _beta1Pud; _beta1S0[1][1] = _beta1S0ud;_beta3S1[1][1] = _beta3S1ud;_beta1P[1][1] = _beta1Pud; _beta1S0[2][1] = _beta1S0us;_beta3S1[2][1] = _beta3S1us;_beta1P[2][1] = _beta1Pus; _beta1S0[3][1] = _beta1S0cu;_beta3S1[3][1] = _beta3S1cu;_beta1P[3][1] = _beta1Pcu; _beta1S0[4][1] = _beta1S0ub;_beta3S1[4][1] = _beta3S1ub;_beta1P[4][1] = _beta1Pub; _beta1S0[0][2] = _beta1S0us;_beta3S1[0][2] = _beta3S1us;_beta1P[0][2] = _beta1Pus; _beta1S0[1][2] = _beta1S0us;_beta3S1[1][2] = _beta3S1us;_beta1P[1][2] = _beta1Pus; _beta1S0[2][2] = _beta1S0ss;_beta3S1[2][2] = _beta3S1ss;_beta1P[2][2] = _beta1Pss; _beta1S0[3][2] = _beta1S0cs;_beta3S1[3][2] = _beta3S1cs;_beta1P[3][2] = _beta1Pcs; _beta1S0[4][2] = _beta1S0sb;_beta3S1[4][2] = _beta3S1sb;_beta1P[4][2] = _beta1Psb; _beta1S0[0][3] = _beta1S0cu;_beta3S1[0][3] = _beta3S1cu;_beta1P[0][3] = _beta1Pcu; _beta1S0[1][3] = _beta1S0cu;_beta3S1[1][3] = _beta3S1cu;_beta1P[1][3] = _beta1Pcu; _beta1S0[2][3] = _beta1S0cs;_beta3S1[2][3] = _beta3S1cs;_beta1P[2][3] = _beta1Pcs; _beta1S0[3][3] = _beta1S0cc;_beta3S1[3][3] = _beta3S1cc;_beta1P[3][3] = _beta1Pcc; _beta1S0[4][3] = _beta1S0bc;_beta3S1[4][3] = _beta3S1bc;_beta1P[4][3] = _beta1Pbc; _beta1S0[0][4] = _beta1S0ub;_beta3S1[0][4] = _beta3S1ub;_beta1P[0][4] = _beta1Pub; _beta1S0[1][4] = _beta1S0ub;_beta3S1[1][4] = _beta3S1ub;_beta1P[1][4] = _beta1Pub; _beta1S0[2][4] = _beta1S0sb;_beta3S1[2][4] = _beta3S1sb;_beta1P[2][4] = _beta1Psb; _beta1S0[3][4] = _beta1S0bc;_beta3S1[3][4] = _beta3S1bc;_beta1P[3][4] = _beta1Pbc; _beta1S0[4][4] = ZERO ;_beta3S1[4][4] = ZERO ;_beta1P[4][4] = ZERO ; // set up the values of mbar // get the particle data objects tcPDPtr p1S0[5][5],p3S1[5][5]; p1S0[0][0] = getParticleData(111); p3S1[0][0] = getParticleData(113); p1S0[1][0] = getParticleData(211); p3S1[1][0] = getParticleData(213); p1S0[2][0] = getParticleData(311); p3S1[2][0] = getParticleData(313); p1S0[3][0] = getParticleData(411); p3S1[3][0] = getParticleData(413); p1S0[4][0] = getParticleData(511); p3S1[4][0] = getParticleData(513); p1S0[0][1] = getParticleData(211); p3S1[0][1] = getParticleData(213); p1S0[1][1] = getParticleData(111); p3S1[1][1] = getParticleData(113); p1S0[2][1] = getParticleData(321); p3S1[2][1] = getParticleData(323); p1S0[3][1] = getParticleData(421); p3S1[3][1] = getParticleData(423); p1S0[4][1] = getParticleData(521); p3S1[4][1] = getParticleData(523); p1S0[0][2] = getParticleData(311); p3S1[0][2] = getParticleData(313); p1S0[1][2] = getParticleData(321); p3S1[1][2] = getParticleData(323); p1S0[2][2] = getParticleData(331); p3S1[2][2] = getParticleData(333); p1S0[3][2] = getParticleData(431); p3S1[3][2] = getParticleData(433); p1S0[4][2] = getParticleData(531); p3S1[4][2] = getParticleData(533); p1S0[0][3] = getParticleData(411); p3S1[0][3] = getParticleData(413); p1S0[1][3] = getParticleData(421); p3S1[1][3] = getParticleData(423); p1S0[2][3] = getParticleData(431); p3S1[2][3] = getParticleData(433); p1S0[3][3] = getParticleData(441); p3S1[3][3] = getParticleData(443); p1S0[4][3] = getParticleData(541); p3S1[4][3] = getParticleData(543); p1S0[0][4] = getParticleData(511); p3S1[0][4] = getParticleData(513); p1S0[1][4] = getParticleData(521); p3S1[1][4] = getParticleData(523); p1S0[2][4] = getParticleData(531); p3S1[2][4] = getParticleData(533); p1S0[3][4] = getParticleData(541); p3S1[3][4] = getParticleData(543); p1S0[4][4] = getParticleData(551); p3S1[4][4] = getParticleData(553); tcPDPtr p3P0[5][5],p3P1[5][5],p3P2[5][5],p1P1[5][5]; p3P0[0][0] = getParticleData(10111); p3P1[0][0] = getParticleData(20113); p3P0[1][0] = getParticleData(10211); p3P1[1][0] = getParticleData(20213); p3P0[2][0] = getParticleData(10311); p3P1[2][0] = getParticleData(20313); p3P0[3][0] = getParticleData(10411); p3P1[3][0] = getParticleData(20413); p3P0[4][0] = getParticleData(10511); p3P1[4][0] = getParticleData(20513); p3P0[0][1] = getParticleData(10211); p3P1[0][1] = getParticleData(20213); p3P0[1][1] = getParticleData(10111); p3P1[1][1] = getParticleData(20113); p3P0[2][1] = getParticleData(10321); p3P1[2][1] = getParticleData(20323); p3P0[3][1] = getParticleData(10421); p3P1[3][1] = getParticleData(20423); p3P0[4][1] = getParticleData(10521); p3P1[4][1] = getParticleData(20523); p3P0[0][2] = getParticleData(10311); p3P1[0][2] = getParticleData(20313); p3P0[1][2] = getParticleData(10321); p3P1[1][2] = getParticleData(20323); p3P0[2][2] = getParticleData(10331); p3P1[2][2] = getParticleData(20333); p3P0[3][2] = getParticleData(10431); p3P1[3][2] = getParticleData(20433); p3P0[4][2] = getParticleData(10531); p3P1[4][2] = getParticleData(20533); p3P0[0][3] = getParticleData(10411); p3P1[0][3] = getParticleData(20413); p3P0[1][3] = getParticleData(10421); p3P1[1][3] = getParticleData(20423); p3P0[2][3] = getParticleData(10431); p3P1[2][3] = getParticleData(20433); p3P0[3][3] = getParticleData(10441); p3P1[3][3] = getParticleData(20443); p3P0[4][3] = getParticleData(10541); p3P1[4][3] = getParticleData(20543); p3P0[0][4] = getParticleData(10511); p3P1[0][4] = getParticleData(20513); p3P0[1][4] = getParticleData(10521); p3P1[1][4] = getParticleData(20523); p3P0[2][4] = getParticleData(10531); p3P1[2][4] = getParticleData(20533); p3P0[3][4] = getParticleData(10541); p3P1[3][4] = getParticleData(20543); p3P0[4][4] = getParticleData(10551); p3P1[4][4] = getParticleData(20553); p1P1[0][0]=getParticleData(10113); p3P2[0][0]=getParticleData(115); p1P1[1][0]=getParticleData(10213); p3P2[1][0]=getParticleData(215); p1P1[2][0]=getParticleData(10313); p3P2[2][0]=getParticleData(315); p1P1[3][0]=getParticleData(10413); p3P2[3][0]=getParticleData(415); p1P1[4][0]=getParticleData(10513); p3P2[4][0]=getParticleData(515); p1P1[0][1]=getParticleData(10213); p3P2[0][1]=getParticleData(215); p1P1[1][1]=getParticleData(10113); p3P2[1][1]=getParticleData(115); p1P1[2][1]=getParticleData(10323); p3P2[2][1]=getParticleData(325); p1P1[3][1]=getParticleData(10423); p3P2[3][1]=getParticleData(425); p1P1[4][1]=getParticleData(10523); p3P2[4][1]=getParticleData(525); p1P1[0][2]=getParticleData(10313); p3P2[0][2]=getParticleData(315); p1P1[1][2]=getParticleData(10323); p3P2[1][2]=getParticleData(325); p1P1[2][2]=getParticleData(10333); p3P2[2][2]=getParticleData(335); p1P1[3][2]=getParticleData(10433); p3P2[3][2]=getParticleData(435); p1P1[4][2]=getParticleData(10533); p3P2[4][2]=getParticleData(535); p1P1[0][3]=getParticleData(10413); p3P2[0][3]=getParticleData(415); p1P1[1][3]=getParticleData(10423); p3P2[1][3]=getParticleData(425); p1P1[2][3]=getParticleData(10433); p3P2[2][3]=getParticleData(435); p1P1[3][3]=getParticleData(10443); p3P2[3][3]=getParticleData(445); p1P1[4][3]=getParticleData(10543); p3P2[4][3]=getParticleData(545); p1P1[0][4]=getParticleData(10513); p3P2[0][4]=getParticleData(515); p1P1[1][4]=getParticleData(10523); p3P2[1][4]=getParticleData(525); p1P1[2][4]=getParticleData(10533); p3P2[2][4]=getParticleData(535); p1P1[3][4]=getParticleData(10543); p3P2[3][4]=getParticleData(545); p1P1[4][4]=getParticleData(10553); p3P2[4][4]=getParticleData(555); // calculate the masses for(unsigned int ix=0;ix<5;++ix) { for(unsigned int iy=0;iy<5;++iy) { Energy m1S0,m3S1,m3P0,m3P1,m3P2,m1P1; if(!p1S0[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 1S0 " << ix << " " << iy << " setting mass to zero\n"; m1S0 = ZERO; } else { m1S0 = p1S0[ix][iy]->mass(); } if(!p3S1[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 3S1 " << ix << " " << iy << " setting mass to zero\n"; m3S1 = ZERO; } else { m3S1 = p3S1[ix][iy]->mass(); } if(!p3P0[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 3P0 " << ix << " " << iy << " setting mass to zero\n"; m3P0 = ZERO; } else { m3P0 = p3P0[ix][iy]->mass(); } if(!p3P1[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 3P1 " << ix << " " << iy << " setting mass to zero\n"; m3P1 = ZERO; } else { m3P1 = p3P1[ix][iy]->mass(); } if(!p3P2[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 3P2 " << ix << " " << iy << " setting mass to zero\n"; m3P2 = ZERO; } else { m3P2 = p3P2[ix][iy]->mass(); } if(!p1P1[ix][iy]) { generator()->log() << "Error in ISGW2FormFactor::doinit don't have " << "ParticleData object for 1P1 " << ix << " " << iy << " setting mass to zero\n"; m1P1 = ZERO; } else { m1P1 = p1P1[ix][iy]->mass(); } // 1S0 _mass1S0[ix][iy] = 0.75 *m3S1+0.25 *m1S0; // 1p 1/2 _massPoh[ix][iy] = 0.75 *m3P1+0.25 *m3P0; // 1p 3/2 _massPth[ix][iy] = 0.625*m3P2+0.375*m1P1; } } for(unsigned int ix=0;ix<3;++ix) { for(unsigned int iy=0;iy<3;++iy) { Energy mtemp = (4.*_massPoh[ix][iy]+8.*_massPth[ix][iy])/12.; _massPoh[ix][iy]=mtemp; _massPth[ix][iy]=mtemp; } } } void ISGW2FormFactor::persistentOutput(PersistentOStream & os) const { os << ounit(_mdown,GeV) << ounit(_mup,GeV) << ounit(_mstrange,GeV) << ounit(_mcharm,GeV) << ounit(_mbottom,GeV) << ounit(_beta1S0ud,GeV) << ounit(_beta1S0us,GeV) << ounit(_beta1S0ss,GeV) << ounit(_beta1S0cu,GeV) << ounit(_beta1S0cs,GeV) << ounit(_beta1S0ub,GeV) << ounit(_beta1S0sb,GeV) << ounit(_beta1S0cc,GeV) << ounit(_beta1S0bc,GeV) << ounit(_beta3S1ud,GeV) << ounit(_beta3S1us,GeV) << ounit(_beta3S1ss,GeV) << ounit(_beta3S1cu,GeV) << ounit(_beta3S1cs,GeV) << ounit(_beta3S1ub,GeV) << ounit(_beta3S1sb,GeV) << ounit(_beta3S1cc,GeV) << ounit(_beta3S1bc,GeV) << ounit(_beta1Pud ,GeV) << ounit(_beta1Pus ,GeV) << ounit(_beta1Pss ,GeV) << ounit(_beta1Pcu ,GeV) << ounit(_beta1Pcs ,GeV) << ounit(_beta1Pub ,GeV) << ounit(_beta1Psb ,GeV) << ounit(_beta1Pcc ,GeV) << ounit(_beta1Pbc ,GeV) << _alphamuQM << _CfDrho << _CfDKstar << _CfDsKstar << _CfDsphi << _CfBrho << _CfBDstar << _CfBsKstar << _CfBsDstar << _CfBcDstar << _CfBcpsi << _CfBcBsstar << _CfBcBstar << _thetaeta << ounit(_mquark,GeV) << _alphaQ << ounit(_beta1S0,GeV) << ounit(_mass1S0,GeV) << ounit(_beta3S1,GeV) << ounit(_beta1P,GeV) << ounit(_massPoh,GeV) << ounit(_massPth,GeV) << _includeaW; } void ISGW2FormFactor::persistentInput(PersistentIStream & is, int) { is >> iunit(_mdown,GeV) >> iunit(_mup,GeV) >> iunit(_mstrange,GeV) >> iunit(_mcharm,GeV) >> iunit(_mbottom,GeV) >> iunit(_beta1S0ud,GeV) >> iunit(_beta1S0us,GeV) >> iunit(_beta1S0ss,GeV) >> iunit(_beta1S0cu,GeV) >> iunit(_beta1S0cs,GeV) >> iunit(_beta1S0ub,GeV) >> iunit(_beta1S0sb,GeV) >> iunit(_beta1S0cc,GeV) >> iunit(_beta1S0bc,GeV) >> iunit(_beta3S1ud,GeV) >> iunit(_beta3S1us,GeV) >> iunit(_beta3S1ss,GeV) >> iunit(_beta3S1cu,GeV) >> iunit(_beta3S1cs,GeV) >> iunit(_beta3S1ub,GeV) >> iunit(_beta3S1sb,GeV) >> iunit(_beta3S1cc,GeV) >> iunit(_beta3S1bc,GeV) >> iunit(_beta1Pud ,GeV) >> iunit(_beta1Pus ,GeV) >> iunit(_beta1Pss ,GeV) >> iunit(_beta1Pcu ,GeV) >> iunit(_beta1Pcs ,GeV) >> iunit(_beta1Pub ,GeV) >> iunit(_beta1Psb ,GeV) >> iunit(_beta1Pcc ,GeV) >> iunit(_beta1Pbc ,GeV) >> _alphamuQM >> _CfDrho >> _CfDKstar >> _CfDsKstar >> _CfDsphi >> _CfBrho >> _CfBDstar >> _CfBsKstar >> _CfBsDstar >> _CfBcDstar >> _CfBcpsi >> _CfBcBsstar >> _CfBcBstar >> _thetaeta >> iunit(_mquark,GeV) >> _alphaQ >> iunit(_beta1S0,GeV) >> iunit(_mass1S0,GeV) >> iunit(_beta3S1,GeV) >> iunit(_beta1P,GeV) >> iunit(_massPoh,GeV) >> iunit(_massPth,GeV) >> _includeaW; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigISGW2FormFactor("Herwig::ISGW2FormFactor", "HwFormFactors.so"); void ISGW2FormFactor::Init() { static ClassDocumentation documentation ("The ISGW2FormFactor class implements the ISGW2 model of " "PRD52, 2783.", "The ISGW2 form factor model \\cite{Scora:1995ty} was used.", "\\bibitem{Scora:1995ty} D.~Scora and N.~Isgur," "Phys.\\ Rev.\\ D {\\bf 52} (1995) 2783 [arXiv:hep-ph/9503486].\n" "%%CITATION = PHRVA,D52,2783;%%\n"); static Parameter interfaceDownMass ("DownMass", "The mass of the down quark in the ISGW model (this is a consituent mass)", &ISGW2FormFactor::_mdown, GeV, 0.33*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceUpMass ("UpMass", "The mass of the up quark in the ISGW model (this is a consituent mass)", &ISGW2FormFactor::_mup, GeV, 0.33*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceStrangeMass ("StrangeMass", "The mass of the strange quark in the ISGW model (this is a consituent mass)", &ISGW2FormFactor::_mstrange, GeV, 0.55*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceCharmMass ("CharmMass", "The mass of the charm quark in the ISGW model (this is a consituent mass)", &ISGW2FormFactor::_mcharm, GeV, 1.82*GeV, ZERO, 3.0*GeV, false, false, true); static Parameter interfaceBottomMass ("BottomMass", "The mass of the bottom quark in the ISGW model (this is a consituent mass)", &ISGW2FormFactor::_mbottom, GeV, 5.20*GeV, 3.0*GeV, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0ud ("Beta1S0ud", "The beta wavefunction parameter for the ud meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0ud, GeV, 0.41*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0us ("Beta1S0us", "The beta wavefunction parameter for the us meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0us, GeV, 0.44*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0ss ("Beta1S0ss", "The beta wavefunction parameter for the ss meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0ss, GeV, 0.53*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0cu ("Beta1S0cu", "The beta wavefunction parameter for the cu meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0cu, GeV, 0.45*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0cs ("Beta1S0cs", "The beta wavefunction parameter for the cs meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0cs, GeV, 0.56*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0ub ("Beta1S0ub", "The beta wavefunction parameter for the ub meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0ub, GeV, 0.43*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0sb ("Beta1S0sb", "The beta wavefunction parameter for the sb meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0sb, GeV, 0.54*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0cc ("Beta1S0cc", "The beta wavefunction parameter for the cc meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0cc, GeV, 0.88*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1S0bc ("Beta1S0bc", "The beta wavefunction parameter for the bc meson in the 1 1S0 level", &ISGW2FormFactor::_beta1S0bc, GeV, 0.92*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pud ("Beta1Pud", "The beta wavefunction parameter for the ud meson in the 1P level", &ISGW2FormFactor::_beta1Pud, GeV, 0.28*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pus ("Beta1Pus", "The beta wavefunction parameter for the us meson in the 1P level", &ISGW2FormFactor::_beta1Pus, GeV, 0.30*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pss ("Beta1Pss", "The beta wavefunction parameter for the ss meson in the 1P level", &ISGW2FormFactor::_beta1Pss, GeV, 0.33*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pcu ("Beta1Pcu", "The beta wavefunction parameter for the cu meson in the 1P level", &ISGW2FormFactor::_beta1Pcu, GeV, 0.33*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pcs ("Beta1Pcs", "The beta wavefunction parameter for the cs meson in the 1P level", &ISGW2FormFactor::_beta1Pcs, GeV, 0.38*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pub ("Beta1Pub", "The beta wavefunction parameter for the ub meson in the 1P level", &ISGW2FormFactor::_beta1Pub, GeV, 0.35*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Psb ("Beta1Psb", "The beta wavefunction parameter for the sb meson in the 1P level", &ISGW2FormFactor::_beta1Psb, GeV, 0.41*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pcc ("Beta1Pcc", "The beta wavefunction parameter for the cc meson in the 1P level", &ISGW2FormFactor::_beta1Pcc, GeV, 0.52*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta1Pbc ("Beta1Pbc", "The beta wavefunction parameter for the bc meson in the 1P level", &ISGW2FormFactor::_beta1Pbc, GeV, 0.60*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1ud ("Beta3S1ud", "The beta wavefunction parameter for the ud meson in the 3S1 level", &ISGW2FormFactor::_beta3S1ud, GeV, 0.30*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1us ("Beta3S1us", "The beta wavefunction parameter for the us meson in the 3S1 level", &ISGW2FormFactor::_beta3S1us, GeV, 0.33*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1ss ("Beta3S1ss", "The beta wavefunction parameter for the ss meson in the 3S1 level", &ISGW2FormFactor::_beta3S1ss, GeV, 0.37*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1cu ("Beta3S1cu", "The beta wavefunction parameter for the cu meson in the 3S1 level", &ISGW2FormFactor::_beta3S1cu, GeV, 0.38*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1cs ("Beta3S1cs", "The beta wavefunction parameter for the cs meson in the 3S1 level", &ISGW2FormFactor::_beta3S1cs, GeV, 0.44*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1ub ("Beta3S1ub", "The beta wavefunction parameter for the ub meson in the 3S1 level", &ISGW2FormFactor::_beta3S1ub, GeV, 0.40*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1sb ("Beta3S1sb", "The beta wavefunction parameter for the sb meson in the 3S1 level", &ISGW2FormFactor::_beta3S1sb, GeV, 0.49*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1cc ("Beta3S1cc", "The beta wavefunction parameter for the cc meson in the 3S1 level", &ISGW2FormFactor::_beta3S1cc, GeV, 0.62*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceBeta3S1bc ("Beta3S1bc", "The beta wavefunction parameter for the bc meson in the 3S1 level", &ISGW2FormFactor::_beta3S1bc, GeV, 0.75*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceAlphaCutOff ("AlphaCutOff", "The value of the strong coupling constnat at the cut-off", &ISGW2FormFactor::_alphamuQM, 0.6, 0.0, 10.0, false, false, true); static Parameter interfaceCfDrho ("CfDrho", "The relativistic correction factor for D -> rho", &ISGW2FormFactor::_CfDrho, 0.889, 0.0, 1.0, false, false, true); static Parameter interfaceCfDKstar ("CfDKstar", "The relativistic correction factor for D -> Kstar", &ISGW2FormFactor::_CfDKstar, 0.928, 0.0, 1.0, false, false, true); static Parameter interfaceCfDsKstar ("CfDsKstar", "The relativistic correction factor for Ds -> Kstar", &ISGW2FormFactor::_CfDsKstar, 0.873, 0.0, 1.0, false, false, true); static Parameter interfaceCfDsphi ("CfDsphi", "The relativistic correction factor for Ds -> phi", &ISGW2FormFactor::_CfDsphi, 0.911, 0.0, 1.0, false, false, true); static Parameter interfaceCfBrho ("CfBrho", "The relativistic correction factor for B -> rho", &ISGW2FormFactor::_CfBrho, 0.905, 0.0, 1.0, false, false, true); static Parameter interfaceCfBDstar ("CfBDstar", "The relativistic correction factor for B -> Dstar", &ISGW2FormFactor::_CfBDstar, 0.989, 0.0, 1.0, false, false, true); static Parameter interfaceCfBsKstar ("CfBsKstar", "The relativistic correction factor for Bs -> Kstar", &ISGW2FormFactor::_CfBsKstar, 0.892, 0.0, 1.0, false, false, true); static Parameter interfaceCfBsDstar ("CfBsDstar", "The relativistic correction factor for Bs -> Dstar", &ISGW2FormFactor::_CfBsDstar, 0.984, 0.0, 1.0, false, false, true); static Parameter interfaceCfBcDstar ("CfBcDstar", "The relativistic correction factor for Bc -> Dstar", &ISGW2FormFactor::_CfBcDstar, 0.868, 0.0, 1.0, false, false, true); static Parameter interfaceCfBcpsi ("CfBcpsi", "The relativistic correction factor for Bc -> psi", &ISGW2FormFactor::_CfBcpsi, 0.967, 0.0, 1.0, false, false, true); static Parameter interfaceCfBcBsstar ("CfBcBsstar", "The relativistic correction factor for Bc -> Bsstar", &ISGW2FormFactor::_CfBcBsstar, 1.000, 0.0, 1.0, false, false, true); static Parameter interfaceCfBcBstar ("CfBcBstar", "The relativistic correction factor for Bc -> Bstar", &ISGW2FormFactor::_CfBcBstar, 1.000, 0.0, 1.0, false, false, true); static Parameter interfaceThetaEtaEtaPrime ("ThetaEtaEtaPrime", "The eta-eta' mixing angle", &ISGW2FormFactor::_thetaeta, -Constants::pi/9., -Constants::pi, Constants::pi, false, false, true); static Switch interfaceIncludeaW ("IncludeaW", "Include the a(omega) piece of the Cji factor", &ISGW2FormFactor::_includeaW, true, false, false); static SwitchOption interfaceIncludeaWInclude (interfaceIncludeaW, "Yes", "Include the factor", true); static SwitchOption interfaceIncludeaWDoNot (interfaceIncludeaW, "No", "Do not include the factor", false); } // member which does the work void ISGW2FormFactor::formFactor(Energy2 q2, unsigned int iloc, int, int id1, Energy mY, Energy mX, Complex & f1,Complex & f2,Complex & f3, Complex & f4) const { useMe(); // get the flavours of the quarks etc int jspin,spect,inquark,outquark; formFactorInfo(iloc,jspin,spect,inquark,outquark); int ifl0(abs(inquark)),ifl1(abs(outquark)),ifls(abs(spect)); // determine the multiplet int ispin(abs(id1)/1000); // masses of the quarks Energy mQ(_mquark[ifl0-1]),mq(_mquark[ifl1-1]),ms(_mquark[ifls-1]); // of the mesons Energy mtildeX(mq+ms),mtildeY(mQ+ms),mup(mq*mQ/(mQ+mq)),mum(mq*mQ/(mQ-mq)); // wavefunction parameters for the mesons Energy betaX(ZERO),mbarX(ZERO), betaY(_beta1S0[ifl0-1][ifls-1]),mbarY(_mass1S0[ifl0-1][ifls-1]); double Cf(1.); // the wavefunction parameter for the outgoing meson // 1S0 if(ispin==0&&jspin==0) { betaX=_beta1S0[ifl1-1][ifls-1]; mbarX=_mass1S0[ifl1-1][ifls-1]; } // 3S1 else if(ispin==0&&jspin==1) { betaX = _beta3S1[ifl1-1][ifls-1]; mbarX = _mass1S0[ifl1-1][ifls-1]; // set the relativistic correction parameter // decaying b if(ifl0==5) { if(ifls<3) Cf = ifl1<3 ? _CfBrho : _CfBDstar; else if(ifls==3) Cf = ifl1==4 ? _CfBsDstar : _CfBsKstar; else if(ifls==4) Cf = ifl1==4 ? _CfBcpsi : _CfBcDstar; } // decaying D else if(ifl0==4) { if(ifls<3) Cf = ifl1<3 ? _CfDrho : _CfDKstar; else if(ifls==3) Cf = ifl1<3 ? _CfDsKstar : _CfDsphi; else if(ifls==5) Cf = ifl1<3 ? _CfBcBstar : _CfBcBsstar; } } else if(ispin==10&&jspin==0) { betaX=_beta1P[ifl1-1][ifls-1]; mbarX=_massPoh[ifl1-1][ifls-1]; } // 1 3/2 P 1 (1 P1) else if((ispin==0&&jspin==2)||(ispin==10&&jspin==1)) { betaX = _beta1P[ifl1-1][ifls-1]; mbarX=_massPth[ifl1-1][ifls-1]; } // 1 1/2 P1 ( 3 P1) else if(ispin==20&&jspin==1) { betaX = _beta1P[ifl1-1][ifls-1]; mbarX=_massPoh[ifl1-1][ifls-1]; } else { throw Exception() << "ISGWS2FormFactor::formFactor" << " unknown multiplet" << Exception::abortnow; } Energy2 beta2XY(0.5*(betaX*betaX+betaY*betaY)); // number of active flavours int Nf = ifl0-1; int Nfp = ifl1==2 ? 0 : ifl1-1; // first piece of the f_n function double betar(betaX*betaY/beta2XY),fn(sqrt(mtildeX/mtildeY)*betar*sqrt(betar)); // q dependent piece Energy2 tm((mY-mX)*(mY-mX)),tmmt(tm-q2); // radius parameter InvEnergy2 r2(0.75/mQ/mq+1.5*ms*ms/mbarX/mbarY/beta2XY +16./mbarX/mbarY/(33.-2.*Nfp)*log(_alphamuQM/_alphaQ[ifl1-1])); // the parameters for the form-factor depenedent piece double rmbmtY(sqrt(mbarY/mtildeY)),rmbmtX(sqrt(mbarX/mtildeX)); // work out wtilde double wt(1.+0.5*tmmt/mbarX/mbarY); // storage of the form factors Energy f(ZERO); InvEnergy g(ZERO),appam(ZERO),apmam(ZERO); InvEnergy2 h(ZERO),bp(ZERO),bm(ZERO); double fpmfm(0.),fppfm(0.),k(0.); // scalar and vector from 1S levels if(ispin==0) { // parameters for the beta functions double asopi(alphaS(mq,mq*mQ)/Constants::pi),w(1.+0.5*tmmt/mX/mY); double aI(-6./(33.-2.*Nf)),rw(1./sqrt(w*w-1)*log(w+sqrt(w*w-1.))); double aLw(8./(33.-2.*Nfp)*(w*rw-1.)); double cji(pow(_alphaQ[ifl0-1]/_alphaQ[ifl1-1],aI)); if(_includeaW) cji*=pow(_alphaQ[ifl1-1]/_alphamuQM,aLw); double zji(mq/mQ); double gamji(-2.*zji/(1.-zji)*log(zji)-2.),chiji(-1.-gamji/(1.-zji)); // scalar if(jspin==0) { double fact((1.+1./12.*r2*tmmt)); fn/=(fact*fact); fact = (1.-0.5*ms*mq/mup/mtildeX*betaY*betaY/beta2XY); fppfm = fn*rmbmtX/rmbmtY*cji*(1.+asopi*(gamji-2./3.*chiji))* (2.-mtildeX/mq*fact); fpmfm = fn*rmbmtY/rmbmtX*cji*(1.+asopi*(gamji+2./3.*chiji))*mtildeY/mq*fact; } else if(jspin==1) { // factors for the F and R functions double fact((1.+1./12.*r2*tmmt)); fn/=(fact*fact); double betaapmam=1./3.-4./3./(1-zji)-chiji +gamji*(1.-2./3.*(1.+zji)/(1.-zji)/(1.-zji)); double ftemp = Cf*fn*rmbmtX*rmbmtY*cji*(1.+asopi*(-2./3.+gamji)); double gtemp = fn/rmbmtX/rmbmtY*cji*(1.+asopi*( 2./3.+gamji)); double aptemp = fn*rmbmtX/(rmbmtY*rmbmtY*rmbmtY)*cji; double amtemp = fn/rmbmtX/rmbmtY*cji*(1.+asopi*betaapmam); // rest of the calculation f = ftemp*mtildeY*(1.+wt+0.5*ms*(wt-1.)/mup); g =0.5*gtemp*(1./mq-0.5*ms*betaY*betaY/mum/mtildeX/beta2XY); appam = aptemp*(ms*betaX*betaX/(1.+wt)/mq/mQ/beta2XY* (1.-0.5*ms*betaX*betaX/mtildeY/beta2XY) +asopi/mtildeY*(-1.-chiji+4./3./(1.-zji) +2./3.*(1.+zji)/sqr(1.-zji)*gamji)); apmam =-amtemp/mtildeX*(mtildeY/mQ -0.5*ms*betaX*betaX/mup/beta2XY +wt*ms*mtildeY*betaX*betaX/(wt+1.)/mq/mQ/beta2XY* (1.-0.5*ms/mtildeY*betaX*betaX/beta2XY)); } else if(jspin==2) { // factors for the F function double fact((1.+1./18.*r2*tmmt)); fn*=betar/(fact*fact*fact); double htemp = fn/rmbmtX/(rmbmtY*rmbmtY*rmbmtY); double ktemp = fn*rmbmtX/rmbmtY; double bptemp(fn*rmbmtX/(rmbmtY*rmbmtY*rmbmtY*rmbmtY*rmbmtY)); double bmtemp(fn/rmbmtX/(rmbmtY*rmbmtY*rmbmtY)); // functions themselves double or2(sqrt(0.5)); h = 0.5*htemp*ms*or2/mtildeY/betaY*(1./mq-0.5*ms*betaY*betaY/mum/mtildeX/beta2XY); k = or2*ktemp*ms/betaY*(1.+wt); InvEnergy2 bppbm = 0.25*bptemp*or2*ms*ms/mq/mQ/mtildeY/betaY*betaX*betaX/beta2XY* (1.-0.5*ms/mtildeY*betaX*betaX/beta2XY); InvEnergy2 bpmbm = -or2*bmtemp*ms/mQ/mtildeX/betaY* (1.-0.5*ms*mQ/mup/mtildeY*betaX*betaX/beta2XY +0.25*ms/mq*betaX*betaX/beta2XY*(1.-0.5*ms/mtildeY*betaX*betaX/beta2XY)); // conversion bp = 0.5*(bppbm+bpmbm); bm = 0.5*(bppbm-bpmbm); } } // 1 3P0 else if(ispin==10&&jspin==0) { fn*=betar; double fact=(1.+1./18.*r2*tmmt); fn/=(fact*fact*fact); fn *= sqrt(2./3.)*ms/betaY; fppfm =-fn*rmbmtX/rmbmtY; fpmfm = fn*rmbmtY/rmbmtX*mtildeY/mtildeX; } // 1 3/2 P1 ( 1 P1) else if(ispin==10&&jspin==1) { // factors for the F and R functions double fact=(1.+1./18.*r2*tmmt); fn*=betar/(fact*fact*fact); double ftemp = fn*rmbmtX*rmbmtY; double gtemp = fn/rmbmtX/rmbmtY; double aptemp = fn*rmbmtX/(rmbmtY*rmbmtY*rmbmtY); double amtemp = fn/rmbmtX/rmbmtY; // light meson or onium if((ifls<3&&ifl1<3)||(ifls==ifl1)) { double oor2(sqrt(0.5)); f = oor2*ftemp*mtildeY*betaY*(1./mup +ms*mtildeX/3./mq/betaY/betaY*(wt-1.)*(wt-1.)); g = oor2*gtemp *(0.25*mtildeY*betaY/mQ/mq/mtildeX+(wt-1.)*ms/6./mtildeX/betaY); appam = oor2*aptemp*ms/mtildeY/betaY*(1.-ms/mq+0.5*ms/mup*betaY*betaY/beta2XY); apmam = oor2*amtemp*ms/mq/betaY*((4.-wt)/3. -0.5*ms*mq/mtildeX/mup*betaY*betaY/beta2XY); } // heavy meson else { double oor3(1./sqrt(3.)); f =-2.*ftemp*oor3*mtildeY*betaY* (1./mq+0.5*mtildeX*ms*(wt-1.)/betaY/betaY* (0.5*(wt+1.)/mq-0.5*ms*betaY*betaY/mum/mtildeX/beta2XY)); g =-0.5*gtemp*oor3*(0.5*(1.+wt)+0.5*betaY*betaY*mtildeY/ms/mq/mQ)*ms /betaY/mtildeX; appam =-0.5*aptemp/oor3*ms/betaY/mtildeY* (1.-ms/3./mq-ms/3.*betaY*betaY/beta2XY* (0.5/mum-1./mup)); apmam =-0.5*amtemp*oor3*ms/betaY/mtildeX* ((2.-wt)*mtildeX/mq+ms*betaY*betaY/beta2XY*(0.5/mum-1./mup)); } } // 1 1/2 P 1 (3 P1) else if(ispin==20&&jspin==1) { // factors for the F and R functions double fact=(1.+1./18.*r2*tmmt); fn*=betar/(fact*fact*fact); double ftemp = fn*rmbmtX*rmbmtY; double gtemp = fn/rmbmtX/rmbmtY; double aptemp = fn*rmbmtX/(rmbmtY*rmbmtY*rmbmtY); double amtemp = fn/rmbmtX/rmbmtY; // light meson if( ( ifls<3 && ifl1<3 ) || ( ifl1==ifls ) ) { f =-ftemp *mtildeY*betaY*(1./mum +ms*mtildeX*(wt-1.)/betaY/betaY* ((5.+wt)/6./mq-0.5/mum*ms/mtildeX* betaY*betaY/beta2XY)); g =-gtemp *0.5*ms/mtildeX/betaY*(5.+wt)/6.; appam =-aptemp*0.5*ms*mtildeX/mq/mtildeY/betaY* (1.-0.5*ms*mq/mtildeX/mum*betaY*betaY/beta2XY); apmam = amtemp*0.5*ms/mq/betaY*((wt+2.)/3. -0.5*ms*mq/mtildeX/mum*betaY*betaY/beta2XY); } // heavy meson else { double r2o3(sqrt(2./3.)); f = ftemp*r2o3*mtildeY*betaY*(0.5/mq-1.5/mQ+ms*mtildeX*(wt-1.)/betaY/betaY* (1./mq-0.5*ms*betaY*betaY/mum/mtildeX/beta2XY)); g = gtemp *0.5*r2o3*ms/betaY/mtildeX*(1.-0.25*betaY*betaY*mtildeY/ms/mq/mQ); appam = aptemp*0.5*r2o3*ms*ms*betaX*betaX/mtildeY/mq/betaY/beta2XY; apmam = -amtemp*r2o3*ms/mtildeX/betaY*(1.+0.5*ms*betaX*betaX/mq/beta2XY); } } else { throw Exception() << "ISGWS2FormFactor::formFactor" << " unknown multiplet" << Exception::abortnow; } // the final manipulations if(jspin==0) { double fp,fm; fp = 0.5*(fppfm+fpmfm); fm = 0.5*(fppfm-fpmfm); // convert to the standard form f1 = q2/(mY*mY-mX*mX)*fm+fp; f2 = fp; } else if(jspin==1) { InvEnergy ap(0.5*(appam+apmam)),am(0.5*(appam-apmam)); // convert to the standard notation Energy msum(mX+mY),mdiff(mY-mX); Complex ii(0.,1.); f2 = -ii*f/msum; - f3 = +ii*ap*msum; - f1 = -ii*0.5/mX*(am*q2+ii*msum*f2-ii*mdiff*f3); - f4 = ii*g*msum; + f3 = +Complex(ii*ap*msum); + f1 = -Complex(ii*0.5/mX*(am*q2+ii*msum*f2-ii*mdiff*f3)); + f4 = Complex(ii*g*msum); } else if(jspin==2) { Energy msum(mX+mY); f1 = h*sqr(msum); f2 = k; f3 = bp*sqr(msum); f4 = bm*sqr(msum); } // special for mixing double fact; if(id1==ParticleID::eta) { if(ifl1==3&&ifls==3){fact=-2.*cos(_thetaeta)/sqrt(6.)-sin(_thetaeta)/sqrt(3.);} else{fact=cos(_thetaeta)/sqrt(6.)-sin(_thetaeta)/sqrt(3.);} f1*=fact;f2*=fact;f3*=fact;f4*=fact; } else if(id1==ParticleID::etaprime) { if(ifl1==3&&ifls==3){fact=-2.*sin(_thetaeta)/sqrt(6.)+cos(_thetaeta)/sqrt(3.);} else{fact=sin(_thetaeta)/sqrt(6.)+cos(_thetaeta)/sqrt(3.);} f1*=fact;f2*=fact;f3*=fact;f4*=fact; } else if(ifl1==ifls&&ifl1<3) { if(abs(ifl1)==1&&int(id1/10)%100==1){fact=-sqrt(0.5);} else{fact=sqrt(0.5);} f1*=fact;f2*=fact;f3*=fact;f4*=fact; } } // form-factor for scalar to scalar void ISGW2FormFactor::ScalarScalarFormFactor(Energy2 q2, unsigned int iloc,int id0, int id1, Energy mY, Energy mX, Complex & f0,Complex & fp) const { Complex d1(0.),d2(0.); formFactor(q2,iloc,id0,id1,mY,mX,f0,fp,d1,d2); } // form-factor for scalar to vector void ISGW2FormFactor::ScalarVectorFormFactor(Energy2 q2, unsigned int iloc, int id0, int id1, Energy mY, Energy mX, Complex & A0,Complex & A1, Complex & A2,Complex & V) const { formFactor(q2,iloc,id0,id1,mY,mX,A0,A1,A2,V); } // form-factor for scalar to tensor void ISGW2FormFactor:: ScalarTensorFormFactor(Energy2 q2, unsigned int iloc, int id0, int id1, Energy mY, Energy mX, complex & h, Complex & k,complex & bp, complex & bm) const { Complex f1,f2,f3,f4; formFactor(q2,iloc,id0,id1,mY,mX,f1,f2,f3,f4); Energy msum(mX+mY); h = f1/sqr(msum); k = f2; bp = f3/sqr(msum); bm = f4/sqr(msum); } void ISGW2FormFactor::dataBaseOutput(ofstream & output,bool header,bool create) const { if(header) output << "update decayers set parameters=\""; if(create) output << "create Herwig::ISGW2FormFactor " << name() << "\n"; output << "newdef " << name() << ":DownMass " << _mdown/GeV << "\n"; output << "newdef " << name() << ":UpMass " << _mup/GeV << "\n"; output << "newdef " << name() << ":StrangeMass " << _mstrange/GeV << "\n"; output << "newdef " << name() << ":CharmMass " << _mcharm/GeV << "\n"; output << "newdef " << name() << ":BottomMass " << _mbottom/GeV << "\n"; output << "newdef " << name() << ":Beta1S0ud " << _beta1S0ud/GeV << "\n"; output << "newdef " << name() << ":Beta1S0us " << _beta1S0us/GeV << "\n"; output << "newdef " << name() << ":Beta1S0ss " << _beta1S0ss/GeV << "\n"; output << "newdef " << name() << ":Beta1S0cu " << _beta1S0cu/GeV << "\n"; output << "newdef " << name() << ":Beta1S0cs " << _beta1S0cs/GeV << "\n"; output << "newdef " << name() << ":Beta1S0ub " << _beta1S0ub/GeV << "\n"; output << "newdef " << name() << ":Beta1S0sb " << _beta1S0sb/GeV << "\n"; output << "newdef " << name() << ":Beta1S0cc " << _beta1S0cc/GeV << "\n"; output << "newdef " << name() << ":Beta1S0bc " << _beta1S0bc/GeV << "\n"; output << "newdef " << name() << ":Beta1Pud " << _beta1Pud/GeV << "\n"; output << "newdef " << name() << ":Beta1Pus " << _beta1Pus/GeV << "\n"; output << "newdef " << name() << ":Beta1Pss " << _beta1Pss/GeV << "\n"; output << "newdef " << name() << ":Beta1Pcu " << _beta1Pcu/GeV << "\n"; output << "newdef " << name() << ":Beta1Pcs " << _beta1Pcs/GeV << "\n"; output << "newdef " << name() << ":Beta1Pub " << _beta1Pub/GeV << "\n"; output << "newdef " << name() << ":Beta1Psb " << _beta1Psb/GeV << "\n"; output << "newdef " << name() << ":Beta1Pcc " << _beta1Pcc/GeV << "\n"; output << "newdef " << name() << ":Beta1Pbc " << _beta1Pbc/GeV << "\n"; output << "newdef " << name() << ":Beta3S1ud " << _beta3S1ud/GeV << "\n"; output << "newdef " << name() << ":Beta3S1us " << _beta3S1us/GeV << "\n"; output << "newdef " << name() << ":Beta3S1ss " << _beta3S1ss/GeV << "\n"; output << "newdef " << name() << ":Beta3S1cu " << _beta3S1cu/GeV << "\n"; output << "newdef " << name() << ":Beta3S1cs " << _beta3S1cs/GeV << "\n"; output << "newdef " << name() << ":Beta3S1ub " << _beta3S1ub/GeV << "\n"; output << "newdef " << name() << ":Beta3S1sb " << _beta3S1sb/GeV << "\n"; output << "newdef " << name() << ":Beta3S1cc " << _beta3S1cc/GeV << "\n"; output << "newdef " << name() << ":Beta3S1bc " << _beta3S1bc/GeV << "\n"; output << "newdef " << name() << ":AlphaCutOff " << _alphamuQM << "\n"; output << "newdef " << name() << ":CfDrho " << _CfDrho << "\n"; output << "newdef " << name() << ":CfDKstar " << _CfDKstar << "\n"; output << "newdef " << name() << ":CfDsKstar " << _CfDsKstar << "\n"; output << "newdef " << name() << ":CfDsphi " << _CfDsphi << "\n"; output << "newdef " << name() << ":CfBrho " << _CfBrho << "\n"; output << "newdef " << name() << ":CfBDstar " << _CfBDstar << "\n"; output << "newdef " << name() << ":CfBsKstar " << _CfBsKstar << "\n"; output << "newdef " << name() << ":CfBsDstar " << _CfBsDstar << "\n"; output << "newdef " << name() << ":CfBcDstar " << _CfBcDstar << "\n"; output << "newdef " << name() << ":CfBcpsi " << _CfBcpsi << "\n"; output << "newdef " << name() << ":CfBcBsstar " << _CfBcBsstar << "\n"; output << "newdef " << name() << ":CfBcBstar " << _CfBcBstar << "\n"; output << "newdef " << name() << ":ThetaEtaEtaPrime " << _thetaeta << "\n"; ScalarFormFactor::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/FormFactors/ISGWFormFactor.cc b/Decay/FormFactors/ISGWFormFactor.cc --- a/Decay/FormFactors/ISGWFormFactor.cc +++ b/Decay/FormFactors/ISGWFormFactor.cc @@ -1,545 +1,545 @@ // -*- C++ -*- // // ISGWFormFactor.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ISGWFormFactor class. // #include "ISGWFormFactor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" using namespace Herwig; using namespace ThePEG; ISGWFormFactor::ISGWFormFactor() { // default values of the parameters // fudge factor _kappa=0.7; // quark masses _mdown =0.33*GeV; _mup =0.33*GeV; _mstrange=0.55*GeV; _mcharm =1.82*GeV; _mbottom =5.12*GeV; // beta values _betaSud = 0.31*GeV; _betaSus = 0.34*GeV; _betaSuc = 0.39*GeV; _betaSub = 0.41*GeV; _betaPud = 0.27*GeV; _betaPus = 0.30*GeV; _betaPuc = 0.34*GeV; // the mixing for eta/eta' _thetaeta=-Constants::pi/18.; // B_u decays to d ubar addFormFactor(-521,-211 ,0,-2, 5, 1); addFormFactor(-521,-213 ,1,-2, 5, 1); addFormFactor(-521,-215 ,2,-2, 5, 1); addFormFactor(-521,-10213,1,-2, 5, 1); addFormFactor(-521,-20213,1,-2, 5, 1); addFormFactor(-521,-10211,0,-2, 5, 1); // B_u to uu (I=0) addFormFactor(-521, 221 ,0,-2, 5, 2); addFormFactor(-521, 331 ,0,-2, 5, 2); addFormFactor(-521, 223 ,1,-2, 5, 2); addFormFactor(-521, 225 ,2,-2, 5, 2); addFormFactor(-521, 10223,1,-2, 5, 2); addFormFactor(-521, 20223,1,-2, 5, 2); addFormFactor(-521, 10221,0,-2, 5, 2); // B_u to uu (I=1) addFormFactor(-521, 111 ,0,-2, 5, 2); addFormFactor(-521, 113 ,1,-2, 5, 2); addFormFactor(-521, 115 ,2,-2, 5, 2); addFormFactor(-521, 10113,1,-2, 5, 2); addFormFactor(-521, 20113,1,-2, 5, 2); addFormFactor(-521, 10111,0,-2, 5, 2); // B_u decays to d ubar addFormFactor(-521,-321 ,0,-2, 5, 3); addFormFactor(-521,-323 ,1,-2, 5, 3); addFormFactor(-521,-325 ,2,-2, 5, 3); addFormFactor(-521,-10323,1,-2, 5, 3); addFormFactor(-521,-20323,1,-2, 5, 3); addFormFactor(-521,-10321,0,-2, 5, 3); // B_u decays to c ubar addFormFactor(-521, 421 ,0,-2, 5, 4); addFormFactor(-521, 423 ,1,-2, 5, 4); addFormFactor(-521, 425 ,2,-2, 5, 4); addFormFactor(-521, 10423,1,-2, 5, 4); addFormFactor(-521, 20423,1,-2, 5, 4); addFormFactor(-521, 10421,0,-2, 5, 4); // B_d to d dbar (I=0) addFormFactor(-511, 221 ,0, 1,-5,-1); addFormFactor(-511, 331 ,0, 1,-5,-1); addFormFactor(-511, 223 ,1, 1,-5,-1); addFormFactor(-511, 225 ,2, 1,-5,-1); addFormFactor(-511, 10223,1, 1,-5,-1); addFormFactor(-511, 20223,1, 1,-5,-1); addFormFactor(-511, 10221,0, 1,-5,-1); // B_d to d dbar (I=1) addFormFactor(-511, 111 ,0, 1,-5,-1); addFormFactor(-511, 113 ,1, 1,-5,-1); addFormFactor(-511, 115 ,2, 1,-5,-1); addFormFactor(-511, 10113,1, 1,-5,-1); addFormFactor(-511, 20113,1, 1,-5,-1); addFormFactor(-511, 10111,0, 1,-5,-1); // B_d to u dbar addFormFactor(-511, 211 ,0, 1,-5,-2); addFormFactor(-511, 213 ,1, 1,-5,-2); addFormFactor(-511, 215 ,2, 1,-5,-2); addFormFactor(-511, 10213,1, 1,-5,-2); addFormFactor(-511, 20213,1, 1,-5,-2); addFormFactor(-511, 10211,0, 1,-5,-2); // B_d to s dbar addFormFactor(-511, 311 ,0, 1,-5,-3); addFormFactor(-511, 313 ,1, 1,-5,-3); addFormFactor(-511, 315 ,2, 1,-5,-3); addFormFactor(-511, 10313,1, 1,-5,-3); addFormFactor(-511, 20313,1, 1,-5,-3); addFormFactor(-511, 10311,0, 1,-5,-3); // B_d decays to c dbar addFormFactor(-511, 411 ,0, 1,-5,-4); addFormFactor(-511, 413 ,1, 1,-5,-4); addFormFactor(-511, 415 ,2, 1,-5,-4); addFormFactor(-511, 10413,1, 1,-5,-4); addFormFactor(-511, 20413,1, 1,-5,-4); addFormFactor(-511, 10411,0, 1,-5,-4); // D0 to d ubar addFormFactor( 421,-211 ,0,-2, 4, 1); addFormFactor( 421,-213 ,1,-2, 4, 1); addFormFactor( 421,-215 ,2,-2, 4, 1); addFormFactor( 421,-10213,1,-2, 4, 1); addFormFactor( 421,-20213,1,-2, 4, 1); addFormFactor( 421,-10211,0,-2, 4, 1); // D0 to d ubar (I=1) addFormFactor( 421, 111 ,0,-2, 4, 2); addFormFactor( 421, 113 ,1,-2, 4, 2); addFormFactor( 421, 115 ,2,-2, 4, 2); addFormFactor( 421, 10113,1,-2, 4, 2); addFormFactor( 421, 20113,1,-2, 4, 2); addFormFactor( 421, 10111,0,-2, 4, 2); // D0 to d ubar (I=0) addFormFactor( 421, 221 ,0,-2, 4, 2); addFormFactor( 421, 331 ,0,-2, 4, 2); addFormFactor( 421, 223 ,1,-2, 4, 2); addFormFactor( 421, 225 ,2,-2, 4, 2); addFormFactor( 421, 10223,1,-2, 4, 2); addFormFactor( 421, 20223,1,-2, 4, 2); addFormFactor( 421, 10221,0,-2, 4, 2); // D0 to s ubar addFormFactor( 421,-321 ,0,-2, 4, 3); addFormFactor( 421,-323 ,1,-2, 4, 3); addFormFactor( 421,-325 ,2,-2, 4, 3); addFormFactor( 421,-10323,1,-2, 4, 3); addFormFactor( 421,-20323,1,-2, 4, 3); addFormFactor( 421,-10321,0,-2, 4, 3); // D+ to d dbar I=0 addFormFactor( 411, 221 ,0,-1, 4, 1); addFormFactor( 411, 331 ,0,-1, 4, 1); addFormFactor( 411, 223 ,1,-1, 4, 1); addFormFactor( 411, 225 ,2,-1, 4, 1); addFormFactor( 411, 10223,1,-1, 4, 1); addFormFactor( 411, 20223,1,-1, 4, 1); addFormFactor( 411, 10221,0,-1, 4, 1); // D+ to d dbar I=1 addFormFactor( 411, 111 ,0,-1, 4, 1); addFormFactor( 411, 113 ,1,-1, 4, 1); addFormFactor( 411, 115 ,2,-1, 4, 1); addFormFactor( 411, 10113,1,-1, 4, 1); addFormFactor( 411, 20113,1,-1, 4, 1); addFormFactor( 411, 10111,0,-1, 4, 1); // D+ to u dbar addFormFactor( 411, 211 ,0,-1, 4, 2); addFormFactor( 411, 213 ,1,-1, 4, 2); addFormFactor( 411, 215 ,2,-1, 4, 2); addFormFactor( 411, 10213,1,-1, 4, 2); addFormFactor( 411, 20213,1,-1, 4, 2); addFormFactor( 411, 10211,0,-1, 4, 2); // D+ to s dbar addFormFactor( 411,-311 ,0,-1, 4, 3); addFormFactor( 411,-313 ,1,-1, 4, 3); addFormFactor( 411,-315 ,2,-1, 4, 3); addFormFactor( 411,-10313,1,-1, 4, 3); addFormFactor( 411,-20313,1,-1, 4, 3); addFormFactor( 411,-10311,0,-1, 4, 3); // set the initial number of modes initialModes(numberOfFactors()); } void ISGWFormFactor::doinit() { ScalarFormFactor::doinit(); // set up the quark masses _mquark.resize(5); _mquark[0]=_mdown; _mquark[1]=_mup; _mquark[2]=_mstrange; _mquark[3]=_mcharm; _mquark[4]=_mbottom; // and the beta values _betaS.resize(5,vector(5)); _betaP.resize(5,vector(5)); _betaS[0][0] = _betaSud;_betaP[0][0] = _betaPud; _betaS[1][0] = _betaSud;_betaP[1][0] = _betaPud; _betaS[2][0] = _betaSus;_betaP[2][0] = _betaPus; _betaS[3][0] = _betaSuc;_betaP[3][0] = _betaPuc; _betaS[4][0] = _betaSub;_betaP[4][0] = ZERO ; _betaS[0][1] = _betaSud;_betaP[0][1] = _betaPud; _betaS[1][1] = _betaSud;_betaP[1][1] = _betaPud; _betaS[2][1] = _betaSus;_betaP[2][1] = _betaPus; _betaS[3][1] = _betaSuc;_betaP[3][1] = _betaPuc; _betaS[4][1] = _betaSub;_betaP[4][1] = ZERO ; _betaS[0][2] = _betaSus;_betaP[0][2] = _betaPus; _betaS[1][2] = _betaSus;_betaP[1][2] = _betaPus; _betaS[2][2] = ZERO ;_betaP[2][2] = ZERO ; _betaS[3][2] = ZERO ;_betaP[3][2] = ZERO ; _betaS[4][2] = ZERO ;_betaP[4][2] = ZERO ; _betaS[0][3] = _betaSuc;_betaP[0][3] = _betaPuc; _betaS[1][3] = _betaSuc;_betaP[1][3] = _betaPuc; _betaS[2][3] = ZERO ;_betaP[2][3] = ZERO ; _betaS[3][3] = ZERO ;_betaP[3][3] = ZERO ; _betaS[4][3] = ZERO ;_betaP[4][3] = ZERO ; _betaS[0][4] = ZERO ;_betaP[0][4] = ZERO ; _betaS[1][4] = ZERO ;_betaP[1][4] = ZERO ; _betaS[2][4] = ZERO ;_betaP[2][4] = ZERO ; _betaS[3][4] = ZERO ;_betaP[3][4] = ZERO ; _betaS[4][4] = ZERO ;_betaP[4][4] = ZERO ; } void ISGWFormFactor::persistentOutput(PersistentOStream & os) const { os << _kappa << ounit(_mdown,GeV) << ounit(_mup,GeV) << ounit(_mstrange,GeV) << ounit(_mcharm,GeV) << ounit(_mbottom,GeV) << ounit(_betaSud,GeV) << ounit(_betaSus,GeV) << ounit(_betaSuc,GeV) << ounit(_betaSub,GeV) << ounit(_betaPud,GeV) << ounit(_betaPus,GeV) << ounit(_betaPuc,GeV) << _thetaeta << ounit(_mquark,GeV) << ounit(_betaS,GeV) << ounit(_betaP,GeV); } void ISGWFormFactor::persistentInput(PersistentIStream & is, int) { is >> _kappa >> iunit(_mdown,GeV) >> iunit(_mup,GeV) >> iunit(_mstrange,GeV) >> iunit(_mcharm,GeV) >> iunit(_mbottom,GeV) >> iunit(_betaSud,GeV) >> iunit(_betaSus,GeV) >> iunit(_betaSuc,GeV) >> iunit(_betaSub,GeV) >> iunit(_betaPud,GeV) >> iunit(_betaPus,GeV) >> iunit(_betaPuc,GeV) >> _thetaeta >> iunit(_mquark,GeV) >> iunit(_betaS,GeV) >> iunit(_betaP,GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigISGWFormFactor("Herwig::ISGWFormFactor", "HwFormFactors.so"); void ISGWFormFactor::Init() { static ClassDocumentation documentation ("The ISGWFormFactor class implements the ISGW model of" "Phys. Rev. D39, 799 (1989) for the scalar meson form-factors.", "The form factor model of ISGW \\cite{Isgur:1988gb} together with the" "form factors for the term which are supressed by the lepton mass from" "\\cite{Scora:1989ys,Isgur:1990jf}", "\\bibitem{Isgur:1988gb} N.~Isgur, D.~Scora, B.~Grinstein and M.~B.~Wise,\n" "Phys.\\ Rev.\\ D {\\bf 39} (1989) 799.\n" "%%CITATION = PHRVA,D39,799;%%\n" "\\bibitem{Scora:1989ys} D.~Scora and N.~Isgur, \n" "Phys.\\ Rev.\\ D {\\bf 40} (1989) 1491.\n" "%%CITATION = PHRVA,D40,1491;%%\n" "\\bibitem{Isgur:1990jf} N.~Isgur and M.~B.~Wise,\n" "Phys.\\ Rev.\\ D {\\bf 43} (1991) 819.\n" "%%CITATION = PHRVA,D43,819;%%\n"); static Parameter interfaceKappa ("Kappa", "The relavistic compensation factor of the ISGW model", &ISGWFormFactor::_kappa, 0.7, 0.0, 1.0, false, false, true); static Parameter interfaceDownMass ("DownMass", "The mass of the down quark in the ISGW model (this is a consituent mass)", &ISGWFormFactor::_mdown, GeV, 0.33*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceUpMass ("UpMass", "The mass of the up quark in the ISGW model (this is a consituent mass)", &ISGWFormFactor::_mup, GeV, 0.33*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceStrangeMass ("StrangeMass", "The mass of the strange quark in the ISGW model (this is a consituent mass)", &ISGWFormFactor::_mstrange, GeV, 0.55*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceCharmMass ("CharmMass", "The mass of the charm quark in the ISGW model (this is a consituent mass)", &ISGWFormFactor::_mcharm, GeV, 1.82*GeV, ZERO, 3.0*GeV, false, false, true); static Parameter interfaceBottomMass ("BottomMass", "The mass of the bottom quark in the ISGW model (this is a consituent mass)", &ISGWFormFactor::_mbottom, GeV, 5.12*GeV, 3.0*GeV, 10.0*GeV, false, false, true); static Parameter interfaceBetaSud ("BetaSud", "The variational parameter for s-wave ud mesons", &ISGWFormFactor::_betaSud, GeV, 0.31*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaSus ("BetaSus", "The variational parameter for s-wave us mesons", &ISGWFormFactor::_betaSus, GeV, 0.34*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaSuc ("BetaSuc", "The variational parameter for s-wave uc mesons", &ISGWFormFactor::_betaSuc, GeV, 0.39*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaSub ("BetaSub", "The variational parameter for s-wave ub mesons", &ISGWFormFactor::_betaSub, GeV, 0.41*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaPud ("BetaPud", "The variational parameter for p-wave ud mesons", &ISGWFormFactor::_betaPud, GeV, 0.27*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaPus ("BetaPus", "The variational parameter for p-wave us mesons", &ISGWFormFactor::_betaPus, GeV, 0.30*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceBetaPuc ("BetaPuc", "The variational parameter for p-wave uc mesons", &ISGWFormFactor::_betaPuc, GeV, 0.34*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfaceThetaEtaEtaPrime ("ThetaEtaEtaPrime", "The eta-eta' mixing angle", &ISGWFormFactor::_thetaeta, -Constants::pi/18., -Constants::pi, Constants::pi, false, false, true); } // form-factor for scalar to scalar void ISGWFormFactor::ScalarScalarFormFactor(Energy2 q2, unsigned int iloc,int id0, int id1,Energy mY,Energy mX, Complex & f0,Complex & fp) const { Complex d1(0.),d2(0.); formFactor(q2,iloc,id0,id1,mY,mX,f0,fp,d1,d2); } // form-factor for scalar to vector void ISGWFormFactor::ScalarVectorFormFactor(Energy2 q2, unsigned int iloc, int id0, int id1,Energy mY, Energy mX, Complex & A0,Complex & A1, Complex & A2,Complex & V) const { formFactor(q2,iloc,id0,id1,mY,mX,A0,A1,A2,V); } // form-factor for scalar to tensor void ISGWFormFactor::ScalarTensorFormFactor(Energy2 q2, unsigned int iloc, int id0, int id1, Energy mY, Energy mX, complex & h,Complex & k, complex & bp, complex & bm) const { Complex f1,f2,f3,f4; formFactor(q2,iloc,id0,id1,mY,mX,f1,f2,f3,f4); Energy msum(mX+mY); h = f1/sqr(msum); k = f2; bp = f3/sqr(msum); bm = f4/sqr(msum); } // member which does the work void ISGWFormFactor::formFactor(Energy2 q2, unsigned int iloc, int, int id1, Energy mY,Energy mX, Complex & f1,Complex & f2, Complex & f3, Complex & f4) const { useMe(); // work out the flavour of the heavy quarks etc int jspin,spect,inquark,outquark; formFactorInfo(iloc,jspin,spect,inquark,outquark); int ifl0(abs(inquark)),ifl1(abs(outquark)),ifls(abs(spect)); // determine the multiplet int ispin(abs(id1)/1000); // masses of the quarks Energy mQ(_mquark[ifl0-1]),mq(_mquark[ifl1-1]),ms(_mquark[ifls-1]); Energy mtildeX(mq+ms),mtildeY(mQ+ms); // wavefunction parameters for the mesons Energy betaX(ZERO),betaY(_betaS[ifl0-1][ifls-1]); // spin-0 outgoing mesons if(ispin==0&&jspin<2) { betaX=_betaS[ifl1-1][ifls-1]; } else { betaX=_betaP[ifl1-1][ifls-1]; } // compute the F_n function we will need Energy2 beta2XY(0.5*(betaX*betaX+betaY*betaY)),tm((mY-mX)*(mY-mX)); double betar(betaX*betaY/beta2XY),kappa2(_kappa*_kappa), slope((tm-q2)/(kappa2*beta2XY)); Energy mup(mq*mQ/(mQ+mq)),mum(mq*mQ/(mQ-mq)); double fn(sqrt(mtildeX/mtildeY)*betar*sqrt(betar)* exp(-0.25*ms*ms/(mtildeX*mtildeY)*slope)); // now we can compute the form-factors // for scalars if(jspin==0) { Complex fp,fm; // 1 1S0 if(ispin==0) { double yratio(ms/mtildeX*betaY*betaY/beta2XY); fp = fn*(1.+0.5*mQ/mum-0.25*mQ*mq/mup/mum*yratio); fm = fn*(1.-(mtildeX+mtildeY)*(0.5/mq-0.25/mup*yratio)); } // 1 3P0 else if(ispin<100) { // extra power of beta factors fn*=betar; fp = fn*ms*mQ*mq/sqrt(6.)/betaY/mtildeX/mum; fm =-fn*ms/betaY/sqrt(6.)*(mtildeX+mtildeY)/mtildeX; } // 2 1S0 else { throw Exception() << "ISGWFormFactor::formFactor" << " 2S not implemented" << Exception::abortnow; } // convert to the standard form f1 = Complex(q2/(mY*mY-mX*mX)*fm)+fp; f2 = fp; } // for vectors else if(jspin==1) { complex f; complex g,ap,am; Energy2 betaX2(betaX*betaX),betaY2(betaY*betaY); // 1 3S1 if(ispin==0) { f = 2.*mtildeY*fn; g = 0.5*fn*(1./mq-0.5/mum*ms/mtildeX*betaY2/beta2XY); ap =-0.5*fn/mtildeX*(1.+ms/mQ*(betaY2-betaX2)/(betaX2+betaY2) -0.25*ms*ms/mum/mtildeY*betaX2*betaX2/beta2XY/beta2XY); am = 0.5*fn/mtildeX*(1.+ms/mQ+ms*ms/mq/mQ*betaX2/beta2XY* (1.-0.25*(mtildeX+mtildeY)/mtildeY*betaX2/beta2XY)); } // 1 3P1 else if(ispin==20) { fn*=betar; f =-fn*mtildeY*betaY*(1./mum+0.5*ms/mtildeY*beta2XY*slope/betaY2* (1./mq-0.5/mum*ms/mtildeX*betaY2/beta2XY)); g = 0.5*fn*ms/mtildeX/betaY; ap = 0.25*fn*ms*mQ/mtildeY/betaY/mum*(1.-0.5*ms*mq/mtildeX/mum*betaY2/beta2XY); am = -0.25*fn*ms*(mtildeX+mtildeY)/mq/betaY/mtildeY* (1.-0.5*ms*mq/mtildeX/mum*betaY2/beta2XY); } // 1 1P1 else if(ispin==10) { fn*=betar; double ort(1./sqrt(2.)); f = fn*ort*mtildeY*betaY/mup; g = 0.25*fn*mtildeY*betaY*ort/mq/mQ/mtildeX; Energy msum(mtildeX+mtildeY); ap = fn*ms*ort/betaY/mtildeY*(1.+0.5*mQ/mum -0.25*mq*mQ*ms/mum/mup/mtildeX*betaY2/beta2XY); am = fn*ms*ort/betaY/mtildeY*(1.-0.5/mq*msum +0.25*ms*betaY2/mup/beta2XY*msum/mtildeX); } // 2 1S0 else { throw Exception() << "ISGWFormFactor::formFactor" << " 2S not implemented" << Exception::abortnow; } // convert to the standard notation Energy msum(mX+mY),mdiff(mY-mX); Complex ii(0.,1.); f2 = -ii*f/msum; - f3 = +ii*ap*msum; - f1 = -ii*0.5/mX*(am*q2+ii*msum*f2-ii*mdiff*f3); - f4 = ii*g*msum; + f3 = +Complex(ii*ap*msum); + f1 = -Complex(ii*0.5/mX*(am*q2+ii*msum*f2-ii*mdiff*f3)); + f4 = Complex(ii*g*msum); } // for tensors else if(jspin==2) { Energy msum(mX+mY); fn *=betar/sqrt(2.); double betaXb2(betaX*betaX/beta2XY); // 1 3P2 if(ispin==0) { f1 = 0.5*fn*ms/mtildeY/betaY*(1./mq -0.5*ms/mtildeX/mum*betaY*betaY/beta2XY)*sqr(msum); f2 = 2.*fn*ms/betaY; f3 =-0.5*fn*ms/mtildeX/mQ/betaY* (1.-0.5*ms*mQ/mup/mtildeY*betaXb2 +0.25*ms*mQ/mtildeY/mum*betaXb2*(1.-0.5*ms*betaXb2/mtildeY))* sqr(msum); f4 = 0.5*fn*ms/mtildeX/mQ/betaY* (1.-0.5*ms*mQ/mup/mtildeY*betaXb2+ 0.25*ms*betaXb2/mq*(mtildeX+mtildeY)/mtildeY*(1.-0.5*ms*betaXb2/mtildeY))* sqr(msum); } } else { throw Exception() << "ISGWFormFactor::FormFactor spin = " << jspin << " but spins higher than 2 not implemented" << Exception::runerror; } // special for mixing double fact(1.); if(id1==ParticleID::eta) { if(ifl1==3&&ifls==3) fact = -2.*cos(_thetaeta)/sqrt(6.) - sin(_thetaeta)/sqrt(3.); else fact = cos(_thetaeta)/sqrt(6.) - sin(_thetaeta)/sqrt(3.); } else if(id1==ParticleID::etaprime) { if(ifl1==3&&ifls==3) fact = -2.*sin(_thetaeta)/sqrt(6.) + cos(_thetaeta)/sqrt(3.); else fact = sin(_thetaeta)/sqrt(6.) + cos(_thetaeta)/sqrt(3.); } else if(ifl1==ifls&&ifl1<3) { if(abs(ifl1)==1&&int(id1/10)%100==1) fact = -sqrt(0.5); else fact = sqrt(0.5); } f1*=fact; f2*=fact; f3*=fact; f4*=fact; } void ISGWFormFactor::dataBaseOutput(ofstream & output,bool header,bool create) const { if(header) output << "update decayers set parameters=\""; if(create) output << "create Herwig::ISGWFormFactor " << name() << "\n"; output << "newdef " << name() << ":Kappa " << _kappa << "\n"; output << "newdef " << name() << ":DownMass " << _mdown/GeV << "\n"; output << "newdef " << name() << ":UpMass " << _mup/GeV << "\n"; output << "newdef " << name() << ":StrangeMass " << _mstrange/GeV << "\n"; output << "newdef " << name() << ":CharmMass " << _mcharm/GeV << "\n"; output << "newdef " << name() << ":BottomMass " << _mbottom/GeV << "\n"; output << "newdef " << name() << ":BetaSud " << _betaSud/GeV << "\n"; output << "newdef " << name() << ":BetaSus " << _betaSus/GeV << "\n"; output << "newdef " << name() << ":BetaSuc " << _betaSuc/GeV << "\n"; output << "newdef " << name() << ":BetaSub " << _betaSub/GeV << "\n"; output << "newdef " << name() << ":BetaPud " << _betaPud/GeV << "\n"; output << "newdef " << name() << ":BetaPus " << _betaPus/GeV << "\n"; output << "newdef " << name() << ":BetaPuc " << _betaPuc/GeV << "\n"; output << "newdef " << name() << ":ThetaEtaEtaPrime " << _thetaeta << "\n"; ScalarFormFactor::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/FormFactors/LambdabExcitedLambdacSumRuleFormFactor.cc b/Decay/FormFactors/LambdabExcitedLambdacSumRuleFormFactor.cc --- a/Decay/FormFactors/LambdabExcitedLambdacSumRuleFormFactor.cc +++ b/Decay/FormFactors/LambdabExcitedLambdacSumRuleFormFactor.cc @@ -1,143 +1,143 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the LambdabExcitedLambdacSumRuleFormFactor class. // #include "LambdabExcitedLambdacSumRuleFormFactor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" using namespace Herwig; using namespace ThePEG; LambdabExcitedLambdacSumRuleFormFactor::LambdabExcitedLambdacSumRuleFormFactor() { _xi1=0.29; _rho2=2.01; // modes handled by this form-factor // lambda_b to lambda_c1 addFormFactor(5122,14122,2,2,1,2,5,4); // lambda_b to lambda_c1* addFormFactor(5122,4124 ,2,4,1,2,5,4); } void LambdabExcitedLambdacSumRuleFormFactor:: persistentOutput(PersistentOStream & os) const { os << _xi1 << _rho2; } void LambdabExcitedLambdacSumRuleFormFactor:: persistentInput(PersistentIStream & is, int) { is >> _xi1 >> _rho2; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigLambdabExcitedLambdacSumRuleFormFactor("Herwig::LambdabExcitedLambdacSumRuleFormFactor", "HwFormFactors.so"); void LambdabExcitedLambdacSumRuleFormFactor::Init() { static ClassDocumentation documentation ("The LambdabExcitedLambdacSumRuleFormFactor class implements the" " form-factors for Lambda_b to Lambda_c1(*) from hep-ph/0012114.", "Lambda_b to Lambda_c1(*) used the formfactors from \\cite{Huang:2000xw}.", "%\\cite{Huang:2000xw}\n" "\\bibitem{Huang:2000xw}\n" " M.~Q.~Huang, J.~P.~Lee, C.~Liu and H.~S.~Song,\n" " %``Leading Isgur-Wise form factor of Lambda/b to Lambda/c1 transition using\n" " %QCD sum rules,''\n" " Phys.\\ Lett.\\ B {\\bf 502}, 133 (2001)\n" " [arXiv:hep-ph/0012114].\n" " %%CITATION = PHLTA,B502,133;%%\n" ); static Parameter interfaceXi ("Xi", "The intercept for the Isgur-Wise form-factor", &LambdabExcitedLambdacSumRuleFormFactor::_xi1, 0.29, 0.0, 10.0, false, false, true); static Parameter interfaceRho2 ("Rho2", "The slope parameter for the form-factor.", &LambdabExcitedLambdacSumRuleFormFactor::_rho2, 2.01, -10.0, 10.0, false, false, true); } void LambdabExcitedLambdacSumRuleFormFactor:: SpinHalfSpinHalfFormFactor(Energy2 q2,int,int,int,Energy m0,Energy m1, Complex & f1v,Complex & f2v,Complex & f3v, Complex & f1a,Complex & f2a,Complex & f3a) { useMe(); double omega(.5/m0/m1*(m0*m0+m1*m1-q2)),orr(1./sqrt(3.)); // the universal form-factor double xi=_xi1*(1.-_rho2*(omega-1.)); // the couplings in the velocity form Complex g1v,g1a,g2v,g2a,g3a,g3v; g1v = orr*(omega-1.)*xi; g1a = orr*(omega+1.)*xi; g2v =-2.*orr*xi; g3v = 0.; g2a =-2.*orr*xi; g3a = 0.; // convert to our form f1a = g1v-0.5*(m0-m1)*(g2v/m0+g3v/m1); f1v =-g1a-0.5*(m0+m1)*(g2a/m0+g3a/m1); - f2a = 0.5*(m0+m1)*( g2v/m0+g3v/m1); - f2v =-0.5*(m0+m1)*( g2a/m0+g3a/m1); - f3a = 0.5*(m0+m1)*( g2v/m0-g3v/m1); - f3v = 0.5*(m0+m1)*(-g2a/m0+g3a/m1); + f2a = Complex(0.5*(m0+m1)*( g2v/m0+g3v/m1)); + f2v =-Complex(0.5*(m0+m1)*( g2a/m0+g3a/m1)); + f3a = Complex(0.5*(m0+m1)*( g2v/m0-g3v/m1)); + f3v = Complex(0.5*(m0+m1)*(-g2a/m0+g3a/m1)); } void LambdabExcitedLambdacSumRuleFormFactor:: SpinHalfSpinThreeHalfFormFactor(Energy2 q2,int,int,int,Energy m0,Energy m1, Complex & f1v,Complex & f2v, Complex & f3v,Complex & f4v, Complex & f1a,Complex & f2a, Complex & f3a,Complex & f4a ) { useMe(); // the omega value double omega(.5/m0/m1*(m0*m0+m1*m1-q2)); // the universal form-factor double xi(_xi1*(1.-_rho2*(omega-1.))); // calculate the form factor // the couplings in the velocity form Complex N1,N2,N3,N4,K1,K2,K3,K4; Energy msum(m0+m1);Energy2 msum2(msum*msum); // in the form of the heavy quark papers N1 = xi; K1 = xi; N2 = 0.; K2 = 0.; N3 = 0.; K3 = 0.; N4 = 0.; K4 = 0.; // convert to our form f1v =-N4; f1a = K4; f2v =-N1*msum/m0; f2a = K1*msum/m0; - f3v =-msum2/m0*(N2/m0+N3/m1); - f3a = msum2/m0*(K2/m0+K3/m1); - f4v =-msum2/m0/m0*N2; - f4a = msum2/m0/m0*K2; + f3v =-Complex(msum2/m0*(N2/m0+N3/m1)); + f3a = Complex(msum2/m0*(K2/m0+K3/m1)); + f4v =-Complex(msum2/m0/m0*N2); + f4a = Complex(msum2/m0/m0*K2); } void LambdabExcitedLambdacSumRuleFormFactor::dataBaseOutput(ofstream & output, bool header, bool create) const { if(header) output << "update decayers set parameters=\""; if(create) output << "create Herwig::LambdabExcitedLambdacSumRuleFormFactor " << name() << " \n"; output << "newdef " << name() << ":Xi " << _xi1 << " \n"; output << "newdef " << name() << ":Rho2 " << _rho2 << " \n"; BaryonFormFactor::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/DtoKPiPiCLEO.cc b/Decay/ScalarMeson/DtoKPiPiCLEO.cc --- a/Decay/ScalarMeson/DtoKPiPiCLEO.cc +++ b/Decay/ScalarMeson/DtoKPiPiCLEO.cc @@ -1,1150 +1,1150 @@ // -*- C++ -*- // // DtoKPiPiCLEO.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the DtoKPiPiCLEO class. // #include "DtoKPiPiCLEO.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using ThePEG::Helicity::ScalarWaveFunction; using ThePEG::Helicity::incoming; using ThePEG::Helicity::outgoing; DtoKPiPiCLEO::DtoKPiPiCLEO() : _c1NR(), _c1rho(), _c1Kstarm(), _c1Kstar0(), _c1K1430m(), _c1K14300(), _c1rho1700(), _c1K1680(), _c2Kstarp(), _c2rho(), _c2omega(), _c2Kstarm(), _c2f980(), _c2f2(), _c2f1370(), _c2K14300(), _c2K14302(), _c2K1680(), _c2NR(), _rD0(), _rres() { // use local values for masses and widths _localparameters=true; // masses and widths _momega = 782.57*MeV; _womega = 8.44*MeV; _mf2 = 1275.4 *MeV; _wf2 = 185.1 *MeV; _mf1370 = 1310 *MeV; _wf1370 = 272.0 *MeV; _mK14300 = 1412 *MeV; _wK14300 = 294 *MeV; _mK14302 = 1425.6 *MeV; _wK14302 = 98.5 *MeV; _mK1680 = 1717 *MeV; _wK1680 = 322 *MeV; _mrho1700 = 1700 *MeV; _wrho1700 = 240 *MeV; _mK8920 = 896.1 *MeV; _wK8920 = 50.5 *MeV; _mK892A = 891.5 *MeV; _wK892A = 50 *MeV; _mK892B = 891.66*MeV; _wK892B = 50.8 *MeV; _mrhoA = 770 *MeV; _wrhoA = 150.7 *MeV; _mrhoB = 769.3 *MeV; _wrhoB = 150.2 *MeV; _mf980 = 977.00*MeV; _wf980 = 50. *MeV; _f0opt=false; _gpi=0.09; _gK=0.02; // amplitudes and phases for D0 -> K-pi+pi0 _a1NR = 1.75 ; _phi1NR = 31.2; _a1rho = 1.00 ; _phi1rho = 0. ; _a1Kstarm = 0.44 ; _phi1Kstarm = 163 ; _a1Kstar0 = 0.39 ; _phi1Kstar0 = -0.2; _a1K1430m = 0.77*GeV2; _phi1K1430m = 55.5; _a1K14300 = 0.85*GeV2; _phi1K14300 = 166 ; _a1rho1700 = 2.50 ; _phi1rho1700 = 171 ; _a1K1680 = 2.50 ; _phi1K1680 = 103 ; // amplitudes and phases for D0 -> K0pi+pi- _a2Kstarp = 0.11 ; _phi2Kstarp = 321; _a2rho = 1.00 ; _phi2rho = 0; _a2omega = 0.037 ; _phi2omega = 114; _a2Kstarm = 1.56 ; _phi2Kstarm = 150; _a2f980 = 0.34*GeV2; _phi2f980 = 188; _a2f2 = 0.7/GeV2 ; _phi2f2 = 308; _a2f1370 = 1.8*GeV2 ; _phi2f1370 = 85; _a2K14300 = 2.0*GeV2 ; _phi2K14300 = 3; _a2K14302 = 1.0/GeV2 ; _phi2K14302 = 335; _a2K1680 = 5.6 ; _phi2K1680 = 174; _a2NR = 1.1 ; _phi2NR = 340; // radial sizes _rD0 = 5.0/GeV; _rres = 1.5/GeV; // zero masses _mpi=ZERO; _mkp=ZERO; _mk0=ZERO; // intermediates generateIntermediates(true); } void DtoKPiPiCLEO::doinit() { DecayIntegrator::doinit(); // complex amplitudes for K-pi+pi0 double fact = Constants::pi/180.; _c1NR = _a1NR *Complex(cos(_phi1NR *fact),sin(_phi1NR *fact)); _c1rho = _a1rho *Complex(cos(_phi1rho *fact),sin(_phi1rho *fact)); _c1Kstarm = _a1Kstarm *Complex(cos(_phi1Kstarm *fact),sin(_phi1Kstarm *fact)); _c1Kstar0 = _a1Kstar0 *Complex(cos(_phi1Kstar0 *fact),sin(_phi1Kstar0 *fact)); _c1K1430m = _a1K1430m *Complex(cos(_phi1K1430m *fact),sin(_phi1K1430m *fact)); _c1K14300 = _a1K14300 *Complex(cos(_phi1K14300 *fact),sin(_phi1K14300 *fact)); _c1rho1700 = _a1rho1700*Complex(cos(_phi1rho1700*fact),sin(_phi1rho1700*fact)); _c1K1680 = _a1K1680 *Complex(cos(_phi1K1680 *fact),sin(_phi1K1680 *fact)); // complex amplitudes for D0 -> K0pi+pi- _c2Kstarp = _a2Kstarp*Complex(cos(_phi2Kstarp*fact),sin(_phi2Kstarp*fact)); _c2rho = _a2rho *Complex(cos(_phi2rho *fact),sin(_phi2rho *fact)); _c2omega = _a2omega *Complex(cos(_phi2omega *fact),sin(_phi2omega *fact)); _c2Kstarm = _a2Kstarm*Complex(cos(_phi2Kstarm*fact),sin(_phi2Kstarm*fact)); _c2f980 = _a2f980 *Complex(cos(_phi2f980 *fact),sin(_phi2f980 *fact)); _c2f2 = _a2f2 *Complex(cos(_phi2f2 *fact),sin(_phi2f2 *fact)); _c2f1370 = _a2f1370 *Complex(cos(_phi2f1370 *fact),sin(_phi2f1370 *fact)); _c2K14300 = _a2K14300*Complex(cos(_phi2K14300*fact),sin(_phi2K14300*fact)); _c2K14302 = _a2K14302*Complex(cos(_phi2K14302*fact),sin(_phi2K14302*fact)); _c2K1680 = _a2K1680 *Complex(cos(_phi2K1680 *fact),sin(_phi2K1680 *fact)); _c2NR = _a2NR *Complex(cos(_phi2NR *fact),sin(_phi2NR *fact)); // pion and kaon masses _mpi = getParticleData(ParticleID::piplus)->mass(); _mkp = getParticleData(ParticleID::Kplus )->mass(); _mk0 = getParticleData(ParticleID::K0 )->mass(); // resonances for the channels tPDPtr k892m = getParticleData(ParticleID::Kstarminus); tPDPtr k892p = getParticleData(ParticleID::Kstarplus); tPDPtr k8920 = getParticleData(ParticleID::Kstarbar0); tPDPtr rho770 = getParticleData(ParticleID::rhoplus); tPDPtr rho0 = getParticleData(ParticleID::rho0); tPDPtr rho1700 = getParticleData(30213); tPDPtr k1680m = getParticleData(-30323); tPDPtr k1430m0 = getParticleData(ParticleID::Kstar_0minus); tPDPtr k1430m2 = getParticleData(ParticleID::Kstar_2minus); tPDPtr k143000 = getParticleData(ParticleID::Kstar_0bar0 ); tPDPtr omega = getParticleData(ParticleID::omega); tPDPtr f980 = getParticleData(9010221); tPDPtr f1370 = getParticleData(10221); tPDPtr f2 = getParticleData(ParticleID::f_2); DecayPhaseSpaceChannelPtr newchannel; // D0 -> K- pi+ pi0 tPDVector extpart(4); extpart[0]=getParticleData(ParticleID::D0); extpart[1]=getParticleData(ParticleID::Kminus); extpart[2]=getParticleData(ParticleID::piplus); extpart[3]=getParticleData(ParticleID::pi0); DecayPhaseSpaceModePtr mode1 = new_ptr(DecayPhaseSpaceMode(extpart,this)); int ix=0; if(rho770) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(rho770,0,0., 2,3); mode1->addChannel(newchannel); ++ix; } if(k892m) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k892m,0,0., 1,3); mode1->addChannel(newchannel); ++ix; } if(k8920) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,3); newchannel->addIntermediate(k8920,0,0., 1,2); mode1->addChannel(newchannel); ++ix; } if(k1430m0) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k1430m0,0,0., 1,3); mode1->addChannel(newchannel); ++ix; } if(k143000) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,3); newchannel->addIntermediate(k143000,0,0., 1,2); mode1->addChannel(newchannel); ++ix; } if(rho1700) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(rho1700,0,0., 2,3); mode1->addChannel(newchannel); ++ix; } if(k1680m) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode1)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k1680m,0,0., 1,3); mode1->addChannel(newchannel); ++ix; } // add the mode vector wtemp; if(ix<=int(_weights.size())) { vector::const_iterator wit=_weights.begin(); wtemp=vector(wit,wit+ix); } else { wtemp=vector(ix,1./double(ix)); } if(_maxwgt.empty()) _maxwgt.push_back(1.); addMode(mode1,_maxwgt[0],wtemp); // D0 -> Kbar0 pi+ pi- extpart[0]=getParticleData(ParticleID::D0); extpart[1]=getParticleData(ParticleID::Kbar0); extpart[2]=getParticleData(ParticleID::piplus); extpart[3]=getParticleData(ParticleID::piminus); DecayPhaseSpaceModePtr mode2 = new_ptr(DecayPhaseSpaceMode(extpart,this)); int iy=ix; if(k892p) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,3); newchannel->addIntermediate(k892p,0,0., 1,2); mode2->addChannel(newchannel); ++iy; } if(rho0) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(rho0,0,0., 2,3); mode2->addChannel(newchannel); ++iy; } if(omega) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(omega,0,0., 2,3); mode2->addChannel(newchannel); ++iy; } if(k892m) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k892m,0,0., 1,3); mode2->addChannel(newchannel); ++iy; } if(f980) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(f980,0,0., 2,3); mode2->addChannel(newchannel); ++iy; } if(f2) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(f2,0,0., 2,3); mode2->addChannel(newchannel); ++iy; } if(f1370) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(f1370,0,0., 2,3); mode2->addChannel(newchannel); ++iy; } if(k1430m0) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k1430m0,0,0., 1,3); mode2->addChannel(newchannel); ++iy; } if(k1430m2) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k1430m2,0,0., 1,3); mode2->addChannel(newchannel); ++iy; } if(k1680m) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode2)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(k1680m,0,0., 1,3); mode2->addChannel(newchannel); ++iy; } // add the mode if(iy<=int(_weights.size())) { vector::const_iterator wit=_weights.begin(); wtemp=vector(wit+ix,wit+iy); } else { wtemp=vector(iy-ix,1./double(iy-ix)); } if(_maxwgt.size()<2) _maxwgt.push_back(1.); addMode(mode2,_maxwgt[1],wtemp); if(!_localparameters) { _momega = omega ->mass(); _mf980 = f980 ->mass(); _mf2 = f2 ->mass(); _mf1370 = f1370 ->mass(); _mK14300 = k1430m0->mass(); _mK14302 = k1430m2->mass(); _mK1680 = k1680m ->mass(); _mrho1700 = rho1700->mass(); _mK8920 = k8920 ->mass(); _mK892A = k892p ->mass(); _mK892B = k892p ->mass(); _mrhoA = rho770 ->mass(); _mrhoB = rho0 ->mass(); _womega = omega ->width(); _wf980 = f980 ->width(); _wf2 = f2 ->width(); _wf1370 = f1370 ->width(); _wK14300 = k1430m0->width(); _wK14302 = k1430m2->width(); _wK1680 = k1680m ->width(); _wrho1700 = rho1700->width(); _wK8920 = k8920 ->width(); _wK892A = k892p ->width(); _wK892B = k892p ->width(); _wrhoA = rho770 ->width(); _wrhoB = rho0 ->width(); } else { mode1->resetIntermediate(rho770 ,_mrhoA ,_wrhoA ); mode1->resetIntermediate(k892m ,_mK892A ,_wK892A ); mode1->resetIntermediate(k8920 ,_mK8920 ,_wK8920 ); mode1->resetIntermediate(k1430m0,_mK14300 ,_wK14300 ); mode1->resetIntermediate(k143000,_mK14300 ,_wK14300 ); mode1->resetIntermediate(rho1700,_mrho1700,_wrho1700); mode1->resetIntermediate(k1680m ,_mK1680 ,_wK1680 ); mode2->resetIntermediate(k892p ,_mK892B ,_wK892B ); mode2->resetIntermediate(rho0 ,_mrhoB ,_wrhoB ); mode2->resetIntermediate(omega ,_momega ,_womega ); mode2->resetIntermediate(k892m ,_mK892B ,_wK892B ); mode2->resetIntermediate(f980 ,_mf980 ,_wf980 ); mode2->resetIntermediate(f2 ,_mf2 ,_wf2 ); mode2->resetIntermediate(f1370 ,_mf1370 ,_wf1370 ); mode2->resetIntermediate(k1430m0,_mK14300 ,_wK14300 ); mode2->resetIntermediate(k1430m2,_mK14302 ,_wK14302 ); mode2->resetIntermediate(k1680m ,_mK1680 ,_wK1680 ); } } void DtoKPiPiCLEO::persistentOutput(PersistentOStream & os) const { os << ounit(_momega,GeV) << ounit(_womega,GeV) << ounit(_mf980,GeV) << _gpi << _gK << ounit(_mf2,GeV) << ounit(_wf2,GeV) << ounit(_mf1370,GeV) << ounit(_wf1370,GeV) << ounit(_mK14300,GeV) << ounit(_wK14300,GeV) << ounit(_mK14302,GeV) << ounit(_wK14302,GeV) << ounit(_mK1680,GeV) << ounit(_wK1680,GeV) << ounit(_mrho1700,GeV) << ounit(_wrho1700,GeV) << ounit(_mK8920,GeV) << ounit(_wK8920,GeV) << ounit(_mK892A,GeV) << ounit(_wK892A,GeV) << ounit(_mK892B,GeV) << ounit(_wK892B,GeV) << ounit(_mrhoA,GeV) << ounit(_wrhoA,GeV) << ounit(_mrhoB,GeV) << ounit(_wrhoB,GeV) << _a1NR << _phi1NR << _a1rho << _phi1rho << _a1Kstarm << _phi1Kstarm << _a1Kstar0 << _phi1Kstar0 << ounit(_a1K1430m,GeV2) << _phi1K1430m << ounit(_a1K14300,GeV2) << _phi1K14300 << _a1rho1700 << _phi1rho1700 << _a1K1680 << _phi1K1680 << _c1NR << _c1rho << _c1Kstarm << _c1Kstar0 << ounit(_c1K1430m,GeV2) << ounit(_c1K14300,GeV2) << _c1rho1700 << _c1K1680 << _a2Kstarp << _phi2Kstarp << _a2rho << _phi2rho << _a2omega << _phi2omega << _a2Kstarm << _phi2Kstarm << ounit(_a2f980,GeV2) << _phi2f980 << ounit(_a2f2,1./GeV2) << _phi2f2 << ounit(_a2f1370,GeV2) << _phi2f1370 << ounit(_a2K14300,GeV2) << _phi2K14300 << ounit(_a2K14302,1./GeV2) << _phi2K14302 << _a2K1680 << _phi2K1680 << _a2NR << _phi2NR << _c2Kstarp << _c2rho << _c2omega << _c2Kstarm << ounit(_c2f980,GeV2) << ounit(_c2f2,1./GeV2) << ounit(_c2f1370,GeV2) << ounit(_c2K14300,GeV2) << ounit(_c2K14302,1./GeV2) << _c2K1680 << _c2NR << _maxwgt << _weights << ounit(_rD0,1./GeV) << ounit(_rres,1./GeV) << ounit(_mpi,GeV) << ounit(_mkp,GeV) << ounit(_mk0,GeV) << ounit(_wf980,GeV) << _f0opt << _localparameters; } void DtoKPiPiCLEO::persistentInput(PersistentIStream & is, int) { is >> iunit(_momega,GeV) >> iunit(_womega,GeV) >> iunit(_mf980,GeV) >> _gpi >> _gK >> iunit(_mf2,GeV) >> iunit(_wf2,GeV) >> iunit(_mf1370,GeV) >> iunit(_wf1370,GeV) >> iunit(_mK14300,GeV) >> iunit(_wK14300,GeV) >> iunit(_mK14302,GeV) >> iunit(_wK14302,GeV) >> iunit(_mK1680,GeV) >> iunit(_wK1680,GeV) >> iunit(_mrho1700,GeV) >> iunit(_wrho1700,GeV) >> iunit(_mK8920,GeV) >> iunit(_wK8920,GeV) >> iunit(_mK892A,GeV) >> iunit(_wK892A,GeV) >> iunit(_mK892B,GeV) >> iunit(_wK892B,GeV) >> iunit(_mrhoA,GeV) >> iunit(_wrhoA,GeV) >> iunit(_mrhoB,GeV) >> iunit(_wrhoB,GeV) >> _a1NR >> _phi1NR >> _a1rho >> _phi1rho >> _a1Kstarm >> _phi1Kstarm >> _a1Kstar0 >> _phi1Kstar0 >> iunit(_a1K1430m,GeV2) >> _phi1K1430m >> iunit(_a1K14300,GeV2) >> _phi1K14300 >> _a1rho1700 >> _phi1rho1700 >> _a1K1680 >> _phi1K1680 >> _c1NR >> _c1rho >> _c1Kstarm >> _c1Kstar0 >> iunit(_c1K1430m,GeV2) >> iunit(_c1K14300,GeV2) >> _c1rho1700 >> _c1K1680 >> _a2Kstarp >> _phi2Kstarp >> _a2rho >> _phi2rho >> _a2omega >> _phi2omega >> _a2Kstarm >> _phi2Kstarm >> iunit(_a2f980,GeV2) >> _phi2f980 >> iunit(_a2f2,1./GeV2) >> _phi2f2 >> iunit(_a2f1370,GeV2) >> _phi2f1370 >> iunit(_a2K14300,GeV2) >> _phi2K14300 >> iunit(_a2K14302,1./GeV2) >> _phi2K14302 >> _a2K1680 >> _phi2K1680 >> _a2NR >> _phi2NR >> _c2Kstarp >> _c2rho >> _c2omega >> _c2Kstarm >> iunit(_c2f980,GeV2) >> iunit(_c2f2,1./GeV2) >> iunit(_c2f1370,GeV2) >> iunit(_c2K14300,GeV2) >> iunit(_c2K14302,1./GeV2) >> _c2K1680 >> _c2NR >> _maxwgt >> _weights >> iunit(_rD0,1./GeV) >> iunit(_rres,1./GeV) >> iunit(_mpi,GeV) >> iunit(_mkp,GeV) >> iunit(_mk0,GeV) >> iunit(_wf980,GeV) >> _f0opt >> _localparameters; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigDtoKPiPiCLEO("Herwig::DtoKPiPiCLEO", "HwSMDecay.so"); void DtoKPiPiCLEO::Init() { static ClassDocumentation documentation ("The DtoKPiPiCLEO class implements the models of CLEO for" " D0 -> Kbar0 pi+pi- and D0 -> K- pi+ pi0", "The CLEO fits of \\cite{Muramatsu:2002jp} and \\cite{Kopp:2000gv} were" " used for the decays $D^0\\to\\bar{K}^0\\pi^+\\pi^-$ and" " $D^0\\to K^-\\pi^+\\pi^0$.", "\\bibitem{Muramatsu:2002jp} H.~Muramatsu {\\it et al.} " "[CLEO Collaboration],Phys.\\ Rev.\\ Lett.\\ {\\bf 89} (2002) 251802" "[Erratum-ibid.\\ {\\bf 90} (2003) 059901] [arXiv:hep-ex/0207067].\n" "\\bibitem{Kopp:2000gv} S.~Kopp {\\it et al.} [CLEO Collaboration], " "Phys.\\ Rev.\\ D {\\bf 63} (2001) 092001 [arXiv:hep-ex/0011065]." ); static Switch interfaceLocalParameters ("LocalParameters", "Whether to use local values for the masses and widths or" " those from the ParticleData objects", &DtoKPiPiCLEO::_localparameters, true, false, false); static SwitchOption interfaceLocalParametersLocal (interfaceLocalParameters, "Local", "Use local values", true); static SwitchOption interfaceLocalParametersParticleData (interfaceLocalParameters, "ParticleData", "Use the values from the ParticleData objects", false); static Parameter interfaceOmegaMass ("OmegaMass", "The mass of the omega meson", &DtoKPiPiCLEO::_momega, MeV, 782.57*MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef980Mass ("f980Mass", "The mass of the f_0(980) meson", &DtoKPiPiCLEO::_mf980, MeV, 977.00*MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef_2Mass ("f_2Mass", "The mass of the f_2 meson", &DtoKPiPiCLEO::_mf2, MeV, 1275.4 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef1370Mass ("f1370Mass", "The mass of the f_0(1370) meson", &DtoKPiPiCLEO::_mf1370, MeV, 1310 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceK_01430Mass ("K_01430Mass", "The mass of the K_0(1430) meson", &DtoKPiPiCLEO::_mK14300, MeV, 1412 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceK_21430Mass ("K_21430Mass", "The mass of the K_2(1430) meson", &DtoKPiPiCLEO::_mK14302, MeV, 1425.6 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstar1680Mass ("Kstar1680Mass", "The mass of the K*(1680) meson", &DtoKPiPiCLEO::_mK1680, MeV, 1717 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerho1700Mass ("rho1700Mass", "The mass of the rho(1700) meson", &DtoKPiPiCLEO::_mrho1700, MeV, 1700 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstar0892Mass ("Kstar0892Mass", "The mass of the K*0(892) meson", &DtoKPiPiCLEO::_mK8920, MeV, 896.1 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstarPlus892AMass ("KstarPlus892AMass", "The mass of the K*+(892) meson in D0 -> K-pi+pi0", &DtoKPiPiCLEO::_mK892A, MeV, 891.5 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstarPlus892BMass ("KstarPlus892BMass", "The mass of the K*+(892) meson in D0 -> K0pi+pi-", &DtoKPiPiCLEO::_mK892B, MeV, 891.66*MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerhoPlusMass ("RhoPlusMass", "The mass of the rho+ meson in D0 -> K-pi+pi0", &DtoKPiPiCLEO::_mrhoA, MeV, 770 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerho0Mass ("Rho0Mass", "The mass of the rho+ meson in D0 -> K0pi+pi-", &DtoKPiPiCLEO::_mrhoB, MeV, 769.3 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceOmegaWidth ("OmegaWidth", "The width of the omega meson", &DtoKPiPiCLEO::_womega, MeV, 8.44*MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef980Width ("f980Width", "The width of the f_0(980) meson", &DtoKPiPiCLEO::_wf980, MeV, 50. *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef_2Width ("f_2Width", "The width of the f_2 meson", &DtoKPiPiCLEO::_wf2, MeV, 185.1 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacef1370Width ("f1370Width", "The width of the f_0(1370) meson", &DtoKPiPiCLEO::_wf1370, MeV, 272.0 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceK_01430Width ("K_01430Width", "The width of the K_0(1430) meson", &DtoKPiPiCLEO::_wK14300, MeV, 294 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceK_21430Width ("K_21430Width", "The width of the K_2(1430) meson", &DtoKPiPiCLEO::_wK14302, MeV, 98.5 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstar1680Width ("Kstar1680Width", "The width of the K*(1680) meson", &DtoKPiPiCLEO::_wK1680, MeV, 322 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerho1700Width ("rho1700Width", "The width of the rho(1700) meson", &DtoKPiPiCLEO::_wrho1700, MeV, 240 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstar0892Width ("Kstar0892Width", "The width of the K*0(892) meson", &DtoKPiPiCLEO::_wK8920, MeV, 50.5 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstarPlus892AWidth ("KstarPlus892AWidth", "The width of the K*+(892) meson in D0 -> K-pi+pi0", &DtoKPiPiCLEO::_wK892A, MeV, 50 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfaceKstarPlus892BWidth ("KstarPlus892BWidth", "The width of the K*+(892) meson in D0 -> K0pi+pi-", &DtoKPiPiCLEO::_wK892B, MeV, 50.8 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerhoPlusWidth ("RhoPlusWidth", "The width of the rho+ meson in D0 -> K-pi+pi0", &DtoKPiPiCLEO::_wrhoA, MeV, 150.7 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacerho0Width ("Rho0Width", "The width of the rho+ meson in D0 -> K0pi+pi-", &DtoKPiPiCLEO::_wrhoB, MeV, 150.2 *MeV, ZERO, 10000.0*MeV, false, false, Interface::limited); static Parameter interfacegPi ("gPi", "The g_pi coupling for the f_0(980) width", &DtoKPiPiCLEO::_gpi, 0.09, 0.0, 1., false, false, Interface::limited); static Parameter interfacegK ("gK", "The g_K coupling for the f_0(980) width", &DtoKPiPiCLEO::_gK, 0.02, 0.0, 1., false, false, Interface::limited); static Switch interfacef0Option ("f0Option", "Option for the treatment of the f_0(980) width", &DtoKPiPiCLEO::_f0opt, true, false, false); static SwitchOption interfacef0OptionCoupled (interfacef0Option, "Coupled", "Use the coupling pion and kaon channels", true); static SwitchOption interfacef0OptionSWave (interfacef0Option, "SWave", "Use a simple s-wave running width", false); static Parameter interfaceChargedNonResonantAmplitude ("ChargedNonResonantAmplitude", "Amplitude for the non-resonant component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1NR, 1.75, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedNonResonantPhase ("ChargedNonResonantPhase", "Phase for the non-resonant component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1NR, 31.2, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedRhoAmplitude ("ChargedRhoAmplitude", "Amplitude for the rho+ component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1rho, 1.0, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedRhoPhase ("ChargedRhoPhase", "Phase for the rho+ component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1rho, 0.0, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedKStarMinusAmplitude ("ChargedKStarMinusAmplitude", "Amplitude for the K*(892)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1Kstarm, 0.44, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedKStarMinusPhase ("ChargedKStarMinusPhase", "Phase for the K*(892)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1Kstarm, 163, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedKStar0Amplitude ("ChargedKStar0Amplitude", "Amplitude for the K*(892)0 component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1Kstar0, 0.39, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedKStar0Phase ("ChargedKStar0Phase", "Phase for the K*(892)0 component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1Kstar0, -0.2, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedK_0MinusAmplitude ("ChargedK_0MinusAmplitude", "Amplitude for the K_0(1430)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1K1430m, GeV2, 0.77*GeV2, ZERO, 10.0*GeV2, false, false, Interface::limited); static Parameter interfaceChargedK_0MinusPhase ("ChargedK_0MinusPhase", "Phase for the K_0(1430)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1K1430m, 55.5, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedK_00Amplitude ("ChargedK_00Amplitude", "Amplitude for the K_0(1430)0 component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1K14300, GeV2, 0.85*GeV2, ZERO, 10.0*GeV2, false, false, Interface::limited); static Parameter interfaceChargedK_00Phase ("ChargedK_00Phase", "Phase for the K_0(1430)0 component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1K14300, 166, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedRho1700Amplitude ("ChargedRho1700Amplitude", "Amplitude for the rho1700+ component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1rho1700, 2.5, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedRho1700Phase ("ChargedRho1700Phase", "Phase for the rho1700+ component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1rho1700, 171., -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceChargedK1680MinusAmplitude ("ChargedK1680MinusAmplitude", "Amplitude for the K*(1680)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_a1K1680, 2.5, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceChargedK1680MinusPhase ("ChargedK1680MinusPhase", "Phase for the K*(1680)- component for D0 -> K- pi+ pi0", &DtoKPiPiCLEO::_phi1K1680, 103, -180.0, 180.0, false, false, Interface::limited); static Parameter interfaceNeutralKStarPlusAmplitude ("NeutralKStarPlusAmplitude", "Amplitude for the K*(892)+ component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2Kstarp, 0.11, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralKStarPlusPhase ("NeutralKStarPlusPhase", "Phase for the K*(892)+ component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2Kstarp, 321., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralRhoAmplitude ("NeutralRhoAmplitude", "Amplitude for the rho0 component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2rho, 1.0, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralRhoPhase ("NeutralRhoPhase", "Phase for the rho0 component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2rho, 0.0, 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralOmegaAmplitude ("NeutralOmegaAmplitude", "Amplitude for the omega component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2omega, 0.037, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralOmegaPhase ("NeutralOmegaPhase", "Phase for the omega component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2omega, 114., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralKStarMinusAmplitude ("NeutralKStarMinusAmplitude", "Amplitude for the K*(892)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2Kstarm, 1.56, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralKStarMinusPhase ("NeutralKStarMinusPhase", "Phase for the K*(892)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2Kstarm, 150., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralf980Amplitude ("Neutralf980Amplitude", "Amplitude for the f_0(980) component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2f980, GeV2, 0.34*GeV2, ZERO, 10.0*GeV2, false, false, Interface::limited); static Parameter interfaceNeutralf980Phase ("Neutralf980Phase", "Phase for the f_0(980) component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2f980, 188., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralf2Amplitude ("Neutralf2Amplitude", "Amplitude for the f_2 component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2f2, 1./GeV2, 0.7/GeV2, ZERO, 10.0/GeV2, false, false, Interface::limited); static Parameter interfaceNeutralf2Phase ("Neutralf2Phase", "Phase for the f_0(2) component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2f2, 308., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralf1370Amplitude ("Neutralf1370Amplitude", "Amplitude for the f_0(1370) component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2f1370, GeV2, 1.8*GeV2, ZERO, 10.0*GeV2, false, false, Interface::limited); static Parameter interfaceNeutralf1370Phase ("Neutralf1370Phase", "Phase for the f_0(1370) component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2f1370, 85., 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralKK_0MinusAmplitude ("NeutralKK_0MinusAmplitude", "Amplitude for the K_0(1430)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2K14300, GeV2, 2.0*GeV2, ZERO, 10.0*GeV2, false, false, Interface::limited); static Parameter interfaceNeutralKK_0MinusPhase ("NeutralKK_0MinusPhase", "Phase for the K_0(1430)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2K14300, 3, 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralKK_2MinusAmplitude ("NeutralKK_2MinusAmplitude", "Amplitude for the K_2(1430)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2K14302, 1./GeV2, 1.0/GeV2, ZERO, 10.0/GeV2, false, false, Interface::limited); static Parameter interfaceNeutralKK_2MinusPhase ("NeutralKK_2MinusPhase", "Phase for the K_2(1430)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2K14302, 335, 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralK1680MinusAmplitude ("NeutralK1680MinusAmplitude", "Amplitude for the K*(892)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2K1680, 5.6, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralK1680MinusPhase ("NeutralK1680MinusPhase", "Phase for the K*(892)- component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2K1680, 174, 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceNeutralNonResonantAmplitude ("NeutralNonResonantAmplitude", "Amplitude for the non-resonant component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_a2NR, 1.1, 0.0, 10.0, false, false, Interface::limited); static Parameter interfaceNeutralNonResonantPhase ("NeutralNonResonantPhase", "Phase for the non-resonant component for D0 -> Kbar0 pi+ pi-", &DtoKPiPiCLEO::_phi2NR, 340, 0.0, 360.0, false, false, Interface::limited); static Parameter interfaceDRadius ("DRadius", "The radius parameter for the Blatt-Weisskopf form-factor for the D", &DtoKPiPiCLEO::_rD0, 1./GeV, 5./GeV, ZERO, 10./GeV, false, false, Interface::limited); static Parameter interfaceResonanceRadius ("ResonanceRadius", "The radius parameter for the Blatt-Weisskopf form-factor for the" "intermediate resonances", &DtoKPiPiCLEO::_rres, 1./GeV, 1.5/GeV, ZERO, 10./GeV, false, false, Interface::limited); static ParVector interfaceMaximumWeights ("MaximumWeights", "The maximum weights for the unweighting of the decays", &DtoKPiPiCLEO::_maxwgt, -1, 1.0, 0.0, 1.0e11, false, false, Interface::limited); static ParVector interfaceWeights ("Weights", "The weights for the different channels for the phase-space integration", &DtoKPiPiCLEO::_weights, -1, 1.0, 0.0, 1.0, false, false, Interface::limited); } int DtoKPiPiCLEO::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { int id0(parent->id()); // incoming particle must be D0 if(abs(id0)!=ParticleID::D0) return -1; cc = id0==ParticleID::Dbar0; // must be three decay products if(children.size()!=3) return -1; tPDVector::const_iterator pit = children.begin(); unsigned int npip(0),npim(0),nkm(0),nk0(0),npi0(0); for( ;pit!=children.end();++pit) { id0=(**pit).id(); if(id0 ==ParticleID::piplus) ++npip; else if(id0 ==ParticleID::pi0) ++npi0; else if(id0 ==ParticleID::piminus) ++npim; else if(abs(id0)==ParticleID::K0) ++nk0; else if(id0 ==ParticleID::K_L0) ++nk0; else if(id0 ==ParticleID::K_S0) ++nk0; else if(abs(id0)==ParticleID::Kplus) ++nkm; } if(npim==1&&npip==1&&nk0==1) return 1; else if(nkm==1&&(npip+npim)==1&&npi0==1) return 0; else return -1; } double DtoKPiPiCLEO::me2(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin0,PDT::Spin0,PDT::Spin0))); useMe(); if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); for(unsigned int ix=0;ix<3;++ix) ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true); return 0.; } // compute the invariant masses needed to calulate the amplitudes Energy mD = inpart.mass(); Energy mA = decay[0]->mass(); Energy mB = decay[1]->mass(); Energy mC = decay[2]->mass(); Energy mAB = (decay[0]->momentum()+decay[1]->momentum()).m(); Energy mAC = (decay[0]->momentum()+decay[2]->momentum()).m(); Energy mBC = (decay[1]->momentum()+decay[2]->momentum()).m(); // compute the amplitudes for the resonaces present in both models Complex amp(0); // calculate the matrix element if(imode()==0) { if(ichan<0) { amp = _c1NR +_c1rho *amplitude(1,false,mD,mB,mC,mA,mBC,mAB,mAC,_mrhoA ,_wrhoA ) +_c1rho1700 *amplitude(1,false,mD,mB,mC,mA,mBC,mAB,mAC,_mrho1700,_wrho1700) +_c1Kstarm *amplitude(1,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK892A ,_wK892A ) +_c1K1430m/GeV2*amplitude(0,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK14300 ,_wK14300 ) +_c1K1680 *amplitude(1,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK1680 ,_wK1680) +_c1Kstar0 *amplitude(1,false,mD,mA,mB,mC,mAB,mAC,mBC,_mK8920 ,_wK8920 ) +_c1K14300/GeV2*amplitude(0,false,mD,mA,mB,mC,mAB,mAC,mBC,_mK14300 ,_wK14300 ); } else if(ichan==0) { amp= _c1rho *amplitude(1,false,mD,mB,mC,mA,mBC,mAB,mAC,_mrhoA ,_wrhoA ); } else if(ichan==1) { amp=_c1Kstarm *amplitude(1,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK892A ,_wK892A ) ; } else if(ichan==2) { amp=_c1Kstar0 *amplitude(1,false,mD,mA,mB,mC,mAB,mAC,mBC,_mK8920 ,_wK8920 ) ; } else if(ichan==3) { amp=_c1K1430m/GeV2*amplitude(0,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK14300 ,_wK14300 ); } else if(ichan==4) { amp=_c1K14300/GeV2*amplitude(0,false,mD,mA,mB,mC,mAB,mAC,mBC,_mK14300 ,_wK14300 ); } else if(ichan==5) { amp=_c1rho1700 *amplitude(1,false,mD,mB,mC,mA,mBC,mAB,mAC,_mrho1700,_wrho1700); } else if(ichan==6) { amp=_c1K1680 *amplitude(1,false,mD,mA,mC,mB,mAC,mAB,mBC,_mK1680 ,_wK1680); } } else { if(ichan<0) { amp = _c2NR +_c2Kstarm *amplitude(1,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK892B ,_wK892B ) +Complex(_c2K14300/GeV2)*amplitude(0,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK14300,_wK14300) +Complex(_c2K14302*GeV2)*amplitude(2,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK14302,_wK14302) +_c2K1680 *amplitude(1,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK1680 ,_wK1680 ) +_c2Kstarp *amplitude(1,false ,mD,mA,mB,mC,mAB,mAC,mBC,_mK892B ,_wK892B ) +_c2rho *amplitude(1,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mrhoB ,_wrhoB ) +_c2omega *amplitude(1,false ,mD,mB,mC,mA,mBC,mAB,mAC,_momega ,_womega ) +Complex(_c2f980/GeV2 )*amplitude(0,_f0opt,mD,mB,mC,mA,mBC,mAB,mAC,_mf980 ,_wf980 ) +Complex(_c2f1370/GeV2 )*amplitude(0,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mf1370 ,_wf1370 ) +Complex(_c2f2*GeV2 )*amplitude(2,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mf2 ,_wf2 ); } else if(ichan==0) { amp=_c2Kstarp *amplitude(1,false ,mD,mA,mB,mC,mAB,mAC,mBC,_mK892B ,_wK892B ); } else if(ichan==1) { amp=_c2rho *amplitude(1,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mrhoB ,_wrhoB ); } else if(ichan==2) { amp=_c2omega *amplitude(1,false ,mD,mB,mC,mA,mBC,mAB,mAC,_momega ,_womega ); } else if(ichan==3) { amp=_c2Kstarm *amplitude(1,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK892B ,_wK892B ); } else if(ichan==4) { amp=_c2f980/GeV2 *amplitude(0,_f0opt,mD,mB,mC,mA,mBC,mAB,mAC,_mf980 ,_wf980 ); } else if(ichan==5) { - amp=_c2f2*GeV2 *amplitude(2,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mf2 ,_wf2 ); + amp=Complex(_c2f2*GeV2 *amplitude(2,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mf2 ,_wf2 )); } else if(ichan==6) { amp=_c2f1370/GeV2 *amplitude(0,false ,mD,mB,mC,mA,mBC,mAB,mAC,_mf1370 ,_wf1370 ); } else if(ichan==7) { amp=_c2K14300/GeV2*amplitude(0,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK14300,_wK14300); } else if(ichan==8) { - amp=_c2K14302*GeV2*amplitude(2,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK14302,_wK14302); + amp=Complex(_c2K14302*GeV2*amplitude(2,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK14302,_wK14302)); } else if(ichan==9) { amp=_c2K1680 *amplitude(1,false ,mD,mA,mC,mB,mAC,mAB,mBC,_mK1680 ,_wK1680 ); } } // now compute the matrix element (*ME())(0,0,0,0)=amp; return norm(amp); } void DtoKPiPiCLEO::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // parameters output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n"; output << "newdef " << name() << ":OmegaMass " << _momega/MeV << "\n"; output << "newdef " << name() << ":f980Mass " << _mf980/MeV << "\n"; output << "newdef " << name() << ":f_2Mass " << _mf2/MeV << "\n"; output << "newdef " << name() << ":f1370Mass " << _mf1370/MeV << "\n"; output << "newdef " << name() << ":K_01430Mass " << _mK14300/MeV << "\n"; output << "newdef " << name() << ":K_21430Mass " << _mK14302/MeV << "\n"; output << "newdef " << name() << ":Kstar1680Mass " << _mK1680/MeV << "\n"; output << "newdef " << name() << ":rho1700Mass " << _mrho1700/MeV << "\n"; output << "newdef " << name() << ":Kstar0892Mass " << _mK8920/MeV << "\n"; output << "newdef " << name() << ":KstarPlus892AMass " << _mK892A/MeV << "\n"; output << "newdef " << name() << ":KstarPlus892BMass " << _mK892B/MeV << "\n"; output << "newdef " << name() << ":RhoPlusMass " << _mrhoA/MeV << "\n"; output << "newdef " << name() << ":Rho0Mass " << _mrhoB/MeV << "\n"; output << "newdef " << name() << ":OmegaWidth " << _womega/MeV << "\n"; output << "newdef " << name() << ":f980Width " << _wf980/MeV << "\n"; output << "newdef " << name() << ":f_2Width " << _wf2/MeV << "\n"; output << "newdef " << name() << ":f1370Width " << _wf1370/MeV << "\n"; output << "newdef " << name() << ":K_01430Width " << _wK14300/MeV << "\n"; output << "newdef " << name() << ":K_21430Width " << _wK14302/MeV << "\n"; output << "newdef " << name() << ":Kstar1680Width " << _wK1680/MeV << "\n"; output << "newdef " << name() << ":rho1700Width " << _wrho1700/MeV << "\n"; output << "newdef " << name() << ":Kstar0892Width " << _wK8920/MeV << "\n"; output << "newdef " << name() << ":KstarPlus892AWidth " << _wK892A/MeV << "\n"; output << "newdef " << name() << ":KstarPlus892BWidth " << _wK892B/MeV << "\n"; output << "newdef " << name() << ":RhoPlusWidth " << _wrhoA/MeV << "\n"; output << "newdef " << name() << ":Rho0Width " << _wrhoB/MeV << "\n"; output << "newdef " << name() << ":gPi " << _gpi << "\n"; output << "newdef " << name() << ":gK " << _gK << "\n"; output << "newdef " << name() << ":f0Option " << _f0opt << "\n"; output << "newdef " << name() << ":ChargedNonResonantAmplitude " << _a1NR << "\n"; output << "newdef " << name() << ":ChargedNonResonantPhase " << _phi1NR<< "\n"; output << "newdef " << name() << ":ChargedRhoAmplitude " << _a1rho<< "\n"; output << "newdef " << name() << ":ChargedRhoPhase " << _phi1rho<< "\n"; output << "newdef " << name() << ":ChargedKStarMinusAmplitude " << _a1Kstarm<< "\n"; output << "newdef " << name() << ":ChargedKStarMinusPhase " << _phi1Kstarm<< "\n"; output << "newdef " << name() << ":ChargedKStar0Amplitude " << _a1Kstar0<< "\n"; output << "newdef " << name() << ":ChargedKStar0Phase " << _phi1Kstar0<< "\n"; output << "newdef " << name() << ":ChargedK_0MinusAmplitude " << _a1K1430m/GeV2 << "\n"; output << "newdef " << name() << ":ChargedK_0MinusPhase " << _phi1K1430m<< "\n"; output << "newdef " << name() << ":ChargedK_00Amplitude " << _a1K14300/GeV2 << "\n"; output << "newdef " << name() << ":ChargedK_00Phase " << _phi1K14300<< "\n"; output << "newdef " << name() << ":ChargedRho1700Amplitude " << _a1rho1700<< "\n"; output << "newdef " << name() << ":ChargedRho1700Phase " << _phi1rho1700<< "\n"; output << "newdef " << name() << ":ChargedK1680MinusAmplitude " << _a1K1680<< "\n"; output << "newdef " << name() << ":ChargedK1680MinusPhase " << _phi1K1680<< "\n"; output << "newdef " << name() << ":NeutralKStarPlusAmplitude " << _a2Kstarp<< "\n"; output << "newdef " << name() << ":NeutralKStarPlusPhase " << _phi2Kstarp<< "\n"; output << "newdef " << name() << ":NeutralRhoAmplitude " << _a2rho<< "\n"; output << "newdef " << name() << ":NeutralRhoPhase " << _phi2rho<< "\n"; output << "newdef " << name() << ":NeutralOmegaAmplitude " << _a2omega<< "\n"; output << "newdef " << name() << ":NeutralOmegaPhase " <<_phi2omega << "\n"; output << "newdef " << name() << ":NeutralKStarMinusAmplitude " << _a2Kstarm<< "\n"; output << "newdef " << name() << ":NeutralKStarMinusPhase " << _phi2Kstarm<< "\n"; output << "newdef " << name() << ":Neutralf980Amplitude " << _a2f980/GeV2<< "\n"; output << "newdef " << name() << ":Neutralf980Phase " << _phi2f980<< "\n"; output << "newdef " << name() << ":Neutralf2Amplitude " << _a2f2*GeV2<< "\n"; output << "newdef " << name() << ":Neutralf2Phase " << _phi2f2<< "\n"; output << "newdef " << name() << ":Neutralf1370Amplitude " << _a2f1370/GeV2<< "\n"; output << "newdef " << name() << ":Neutralf1370Phase " << _phi2f1370<< "\n"; output << "newdef " << name() << ":NeutralKK_0MinusAmplitude " << _a2K14300/GeV2 << "\n"; output << "newdef " << name() << ":NeutralKK_0MinusPhase " << _phi2K14300 << "\n"; output << "newdef " << name() << ":NeutralKK_2MinusAmplitude " << _a2K14302*GeV2<< "\n"; output << "newdef " << name() << ":NeutralKK_2MinusPhase " << _phi2K14302 << "\n"; output << "newdef " << name() << ":NeutralK1680MinusAmplitude " << _a2K1680<< "\n"; output << "newdef " << name() << ":NeutralK1680MinusPhase " << _phi2K1680<< "\n"; output << "newdef " << name() << ":NeutralNonResonantAmplitude " << _a2NR<< "\n"; output << "newdef " << name() << ":NeutralNonResonantPhase " << _phi2NR << "\n"; output << "newdef " << name() << ":DRadius " << _rD0*GeV << "\n"; output << "newdef " << name() << ":ResonanceRadius " << _rres*GeV << "\n"; for(unsigned int ix=0;ix<_maxwgt.size();++ix) { output << "insert " << name() << ":MaximumWeights " << ix << " " << _maxwgt[ix] << "\n"; } for(unsigned int ix=0;ix<_weights.size();++ix) { output << "insert " << name() << ":Weights " << ix << " " << _weights[ix] << "\n"; } if(header) { output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } } void DtoKPiPiCLEO::doinitrun() { DecayIntegrator::doinitrun(); _weights.resize(mode(0)->numberChannels()+mode(1)->numberChannels()); _maxwgt.resize(2); unsigned int iy=0; for(unsigned int ix=0;ix<2;++ix) { _maxwgt[ix]=mode(ix)->maxWeight(); for(unsigned int iz=0;iznumberChannels();++iz) { _weights[iy]=mode(ix)->channelWeight(iz); ++iy; } } } Complex DtoKPiPiCLEO::amplitude(int ispin,bool f0, Energy mD, Energy mA , Energy mB , Energy mC , Energy mAB, Energy mAC, Energy mBC, Energy mres, Energy wres) const{ // compute the production momenta Energy pDR = Kinematics::pstarTwoBodyDecay(mD,mres,mC); Energy pDAB = Kinematics::pstarTwoBodyDecay(mD,mAB ,mC); // and the decay momenta Energy pAB = Kinematics::pstarTwoBodyDecay(mAB ,mA,mB); Energy pR = Kinematics::pstarTwoBodyDecay(mres,mA,mB); double Fd(1.),Fr(1.),s(1.); switch(ispin) { case 0: // default values of parameters are correct break; case 1: Fr = sqrt((1.+sqr(_rres*pR ))/(1.+sqr(_rres*pAB ))); Fd = sqrt((1.+sqr(_rD0 *pDR))/(1.+sqr(_rD0 *pDAB))); s = ((mAC-mBC)*(mAC+mBC)+(mD-mC)*(mD+mC)*(mB-mA)*(mB+mA)/sqr(mres))/GeV2; break; case 2: Fr = sqrt((9.+3.*sqr(_rres*pR )+Math::powi(_rres*pR ,4))/ (9.+3.*sqr(_rres*pAB )+Math::powi(_rres*pAB ,4))); Fd = sqrt((9.+3.*sqr(_rD0 *pDR )+Math::powi(_rD0 *pDR ,4))/ (9.+3.*sqr(_rD0 *pDAB)+Math::powi(_rD0 *pDAB,4))); s = sqr(((mBC-mAC)*(mBC+mAC)+(mD-mC)*(mD+mC)*(mA-mB)*(mA+mB)/sqr(mres))/GeV2) -(mAB*mAB-2.*mD*mD-2.*mC*mC+sqr((mD-mC)*(mD+mC))/sqr(mres))* (mAB*mAB-2.*mA*mA-2.*mB*mB+sqr((mA-mB)*(mA+mB))/sqr(mres))/3./GeV2/GeV2; break; default: throw Exception() << "D0toKPiPiCLEO::amplitude spin is too high ispin = " << ispin << Exception::runerror; } // calculate the width term complex bw; if(!f0) { Energy2 mwid=wres*Math::powi(pAB/pR,2*ispin+1)*sqr(Fr*mres)/mAB; bw = sqr(mres)-sqr(mAB)-complex(ZERO,mwid); } else { Energy Gamma_pi = _gpi*sqrt(0.25*sqr(mAB)-sqr(_mpi)); Energy Gamma_K = 0.5*_gK *(sqrt(0.25*sqr(mAB)-sqr(_mkp))+ sqrt(0.25*sqr(mAB)-sqr(_mk0))); bw = sqr(mres)-sqr(mAB)-complex(ZERO,mres*(Gamma_pi+Gamma_K)); } return s*Fr*Fd*GeV2/bw; } diff --git a/Decay/ScalarMeson/EtaPiGammaGammaDecayer.cc b/Decay/ScalarMeson/EtaPiGammaGammaDecayer.cc --- a/Decay/ScalarMeson/EtaPiGammaGammaDecayer.cc +++ b/Decay/ScalarMeson/EtaPiGammaGammaDecayer.cc @@ -1,374 +1,374 @@ // -*- C++ -*- // // EtaPiGammaGammaDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the EtaPiGammaGammaDecayer class. // #include "EtaPiGammaGammaDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "Herwig/PDT/ThreeBodyAllOnCalculator.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void EtaPiGammaGammaDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { _etamax = mode(0)->maxWeight(); _etapmax = mode(1)->maxWeight(); } } EtaPiGammaGammaDecayer::EtaPiGammaGammaDecayer() : _grhoomega(12.924/GeV), _fpi(130.7*MeV),_rhomass(771.1*MeV), _rhowidth(149.2*MeV),_grho(_rhomass/_fpi),_mpi(ZERO),_rhoconst(0.), _localparameters(true),_ratiofpif8(1./1.3),_ratiofpif0(1./1.04), _theta(-Constants::pi/9.),_etamax(2.36858),_etapmax(0.006), _dconst(2), _econst(2) { // intermediates generateIntermediates(false); } void EtaPiGammaGammaDecayer::doinit() { DecayIntegrator::doinit(); // set rho parameters if needed tPDPtr rho(getParticleData(ParticleID::rho0)); if(!_localparameters) { _rhomass = rho->mass(); _rhowidth = rho->width(); } // constant for the running rho width _mpi=getParticleData(ParticleID::pi0)->mass(); Energy pcm =Kinematics::pstarTwoBodyDecay(_rhomass,_mpi,_mpi); _rhoconst=_rhomass*_rhomass*_rhowidth/(pcm*pcm*pcm); // set the prefactors double conv(sqrt(4.*Constants::pi*SM().alphaEM())); conv *=_fpi*_fpi*_grho/_rhomass/_rhomass; InvEnergy2 pre(2.*sqrt(3.)/9.*sqr(_grhoomega*conv)); double fact[2]; // constants for eta fact[0] = _ratiofpif8*cos(_theta)-sqrt(2.)*_ratiofpif0*sin(_theta); // constants for eta' fact[1] = _ratiofpif8*sin(_theta)+sqrt(2.)*_ratiofpif0*cos(_theta); for(unsigned int ix=0;ix<2;++ix) { _dconst[ix]=fact[ix]*pre; _econst[ix]=fact[ix]*pre; } // set up the phsae space for the decays tPDPtr eta[2]={getParticleData(ParticleID::eta),getParticleData(ParticleID::etaprime)}; tPDVector extpart;extpart.resize(4); extpart[1] = getParticleData(ParticleID::pi0); extpart[2] = getParticleData(ParticleID::gamma); extpart[3] = getParticleData(ParticleID::gamma); vector dummyweights(2,0.5); DecayPhaseSpaceChannelPtr newchannel; DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<2;++ix) { extpart[0] = eta[ix]; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); newchannel=new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,2); newchannel->addIntermediate(rho,0,0.0, 1,3); mode->addChannel(newchannel); newchannel=new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,3); newchannel->addIntermediate(rho,0,0.0, 1,2); mode->addChannel(newchannel); addMode(mode, (ix==0 ? _etamax : _etapmax),dummyweights); } } int EtaPiGammaGammaDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { cc=false; int id; if(children.size()!=3) return -1; tPDVector::const_iterator pit = children.begin(); unsigned int npi0(0),ngamma(0); for( ;pit!=children.end();++pit) { id=(**pit).id(); if(id==ParticleID::pi0) ++npi0; else if(id==ParticleID::gamma) ++ngamma; } if(!(npi0==1&&ngamma==2)) return -1; // number of the mode switch (parent->id()) { case ParticleID::eta : return 0; case ParticleID::etaprime: return 1; default: return -1; } } void EtaPiGammaGammaDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_grhoomega,1/GeV)<< ounit(_fpi,GeV)<< _grho << ounit(_rhomass,GeV)<< ounit(_rhowidth,GeV)<< _localparameters << _ratiofpif8 << _ratiofpif0 << _theta << _etamax << _etapmax << _rhoconst << ounit(_mpi,GeV) << ounit(_dconst,1/GeV2) << ounit(_econst,1/GeV2); } void EtaPiGammaGammaDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_grhoomega,1/GeV) >> iunit(_fpi,GeV)>> _grho >> iunit(_rhomass,GeV)>> iunit(_rhowidth,GeV)>> _localparameters >> _ratiofpif8 >> _ratiofpif0 >> _theta >> _etamax >> _etapmax >> _rhoconst >> iunit(_mpi,GeV) >> iunit(_dconst,1/GeV2) >> iunit(_econst,1/GeV2); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigEtaPiGammaGammaDecayer("Herwig::EtaPiGammaGammaDecayer", "HwSMDecay.so"); void EtaPiGammaGammaDecayer::Init() { static ClassDocumentation documentation ("The EtaPiGammaGammaDecayer class implements a VMD model for the" " decay of the eta or etaprime to a pion and two photons.", "The decays of $\\eta,\\eta'\\to\\pi^0\\gamma\\gamma$ were simulated using" " the matrix elements of \\cite{Holstein:2001bt}", "\\bibitem{Holstein:2001bt} B.~R.~Holstein,\n" " Phys.\\ Scripta {\\bf T99} (2002) 55 [arXiv:hep-ph/0112150].\n" "%%CITATION = PHSTB,T99,55;%%\n"); static Parameter interfacegrhoomega ("grhoomega", "The couping of the rho, omega and a pion", &EtaPiGammaGammaDecayer::_grhoomega, 1./GeV, 12.924/GeV, ZERO, 100./GeV, false, false, true); static Parameter interfaceFpi ("Fpi", "The pion decay constant", &EtaPiGammaGammaDecayer::_fpi, MeV, 130.7*MeV, ZERO, 200.0*MeV, false, false, true); static Parameter interfacegrho ("grho", "Rho decay constant", &EtaPiGammaGammaDecayer::_grho, 5.9, 0.0, 10.0, false, false, true); static Parameter interfaceRhoMass ("RhoMass", "The mass of the rho meson", &EtaPiGammaGammaDecayer::_rhomass, MeV, 771.1*MeV, 500.0*MeV, 1000.0*MeV, false, false, true); static Parameter interfaceRhoWidth ("RhoWidth", "The width of the rho meson", &EtaPiGammaGammaDecayer::_rhowidth, MeV, 149.2*MeV, 100.0*MeV, 200.0*MeV, false, false, true); static Parameter interfaceRatioFpiF8 ("RatioFpiF8", "The ratio of the decay constant Fpi to F8", &EtaPiGammaGammaDecayer::_ratiofpif8, 1./1.3, 0.0, 10.0, false, false, true); static Parameter interfaceRatioFpiF0 ("RatioFpiF0", "The ratio of the decay constant Fpi to F0", &EtaPiGammaGammaDecayer::_ratiofpif0, 1./1.04, 0.0, 10.0, false, false, true); static Parameter interfaceTheta ("Theta", "The eta etaprime mixing angle", &EtaPiGammaGammaDecayer::_theta, -Constants::pi/9., -Constants::pi, Constants::pi, false, false, true); static Parameter interfaceEtaMax ("EtaMax", "THe maximum weight for the eta decay", &EtaPiGammaGammaDecayer::_etamax, 1.35, -1.0e12, 1.0e12, false, false, false); static Parameter interfaceEtaPrimeMax ("EtaPrimeMax", "THe maximum weight for the eta prime decay", &EtaPiGammaGammaDecayer::_etapmax, 0.006, -1.0e12, 1.0e12, false, false, false); static Switch interfaceLocalParameters ("LocalParameters", "Use local values of the parameters", &EtaPiGammaGammaDecayer::_localparameters, true, false, false); static SwitchOption interfaceLocalParametersLocal (interfaceLocalParameters, "Local", "Use local values", true); static SwitchOption interfaceLocalParametersParticleData (interfaceLocalParameters, "ParticleData", "Use values from the particle data objects", false); } double EtaPiGammaGammaDecayer::me2(const int,const Particle & inpart, const ParticleVector& decay, MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin0,PDT::Spin1,PDT::Spin1))); useMe(); if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); ScalarWaveFunction::constructSpinInfo(decay[0],outgoing,true); for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::constructSpinInfo(_vectors[ix],decay[ix+1], outgoing,true,true); return 0.; } for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::calculateWaveFunctions(_vectors[ix],decay[ix+1], outgoing,true); // dot products we need Energy2 q1dotq2(decay[1]->momentum()*decay[2]->momentum()), pdotq1(inpart.momentum()*decay[1]->momentum()), pdotq2(inpart.momentum()*decay[2]->momentum()); complex e1dotq2[3],e1dotp[3],e2dotq1[3],e2dotp[3]; for(unsigned int ix=0;ix<3;++ix) { if(ix==1) { e1dotq2[ix]=ZERO; e1dotp[ix] =ZERO; e2dotq1[ix]=ZERO; e2dotp[ix] =ZERO; } else { e1dotq2[ix] =_vectors[0][ix]*decay[2]->momentum(); e1dotp[ix] =_vectors[0][ix]*inpart.momentum(); e2dotq1[ix] =_vectors[1][ix]*decay[1]->momentum(); e2dotp[ix] =_vectors[1][ix]*inpart.momentum(); } } // the momentum dependent pieces of the matrix element Complex ii(0.,1.); Energy2 mpi2(sqr(decay[0]->mass())),meta2(sqr(inpart.mass())), mrho2(sqr(_rhomass)), t(mpi2+2.*((decay[0]->momentum())*(decay[1]->momentum()))), u(mpi2+2.*((decay[0]->momentum())*(decay[2]->momentum()))); Energy q(sqrt(t)),pcm(Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi)); complex tgamma(ii*pcm*pcm*pcm*_rhoconst/q); q=sqrt(u);pcm = Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi); complex ugamma(ii*pcm*pcm*pcm*_rhoconst/q); complex prop1(1./(mrho2-t-tgamma)),prop2(1./(mrho2-u-ugamma)); complex Dfact(_dconst[imode()]*(prop1*(pdotq2-meta2) +prop2*(pdotq1-meta2))); complex Efact(_econst[imode()]*(prop1+prop2)); Complex e1dote2; for(unsigned int ix=0;ix<3;++ix) { for(unsigned int iy=0;iy<3;++iy) { if(ix==1||iy==1) (*ME())(0,0,ix,iy)=0.; else { e1dote2=_vectors[0][ix].dot(_vectors[1][iy]); (*ME())(0,0,ix,iy) = - Dfact*complex(e1dote2*q1dotq2- - e1dotq2[ix]*e2dotq1[iy]) - -Efact*complex(-e1dote2*pdotq1*pdotq2 - -e1dotp[ix]*e2dotp[iy]*q1dotq2 - +e1dotq2[ix]*e2dotp[iy]*pdotq1 - +e1dotp[ix]*e2dotq1[iy]*pdotq2); + Complex(Dfact*complex(e1dote2*q1dotq2- + e1dotq2[ix]*e2dotq1[iy]) + -Efact*complex(-e1dote2*pdotq1*pdotq2 + -e1dotp[ix]*e2dotp[iy]*q1dotq2 + +e1dotq2[ix]*e2dotp[iy]*pdotq1 + +e1dotp[ix]*e2dotq1[iy]*pdotq2)); } } } /* double me(ME()->contract(rhoin).real()); Energy M(inpart.mass()),M2(M*M); Energy2 s1(2.*(decay[1]->momentum()*decay[2]->momentum())); Energy2 s2(M2-2.*(inpart.momentum()*decay[1]->momentum())); Energy2 s3(M2-2.*(inpart.momentum()*decay[2]->momentum())); cout << "testing the matrix element " << ( 2*(2*(Dfact*conj(Dfact)).real() + 2*(Dfact*conj(Efact)).real()*M2 + (Efact*conj(Efact)).real()*M2*M2)* s1*s1 - 2*(Efact*conj(Efact)).real()*M2*s1*(M2 - s2)* (M2 - s3) +(Efact*conj(Efact)).real()*(M2 - s2)*(M2 - s2)* (M2-s3)*(M2-s3))/8. - me << endl; return me; */ return ME()->contract(_rho).real(); } double EtaPiGammaGammaDecayer:: threeBodyMatrixElement(const int imodeb, const Energy2 q2,const Energy2 s3, const Energy2 s2,const Energy2 s1,const Energy , const Energy ,const Energy ) const { // compute the prefactors Energy2 mrho2 = sqr(_rhomass); Energy q = sqrt(s3); Energy pcm = Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi); Complex ii(0.,1.); complex tgamma(ii*pcm*pcm*pcm*_rhoconst/q); q = sqrt(s2); pcm = Kinematics::pstarTwoBodyDecay(q,_mpi,_mpi); complex ugamma(ii*pcm*pcm*pcm*_rhoconst/q); complex prop1(1./(mrho2-s3-tgamma)), prop2(1./(mrho2-s2-ugamma)); Energy2 pdotq2(0.5*(q2-s3)), pdotq1(0.5*(q2-s2)); complex Dfact(_dconst[imodeb]*(prop1*(pdotq2-q2)+prop2*(pdotq1-q2))); complex Efact(_econst[imodeb]*(prop1+prop2)); InvEnergy4 D2 = (Dfact*conj(Dfact)).real(); InvEnergy8 E2((Efact*conj(Efact)).real()); InvEnergy6 ED((Efact*conj(Dfact)).real()); return (2 * (2*D2 + 2*ED*q2 + E2*sqr(q2)) * sqr(s1) - double(2*E2*q2*s1*(q2-s2)*(q2-s3)) + double(E2*sqr(q2-s2)*sqr(q2-s3)) )/8.; } WidthCalculatorBasePtr EtaPiGammaGammaDecayer::threeBodyMEIntegrator(const DecayMode & dm) const { // workout which mode we are doing int id(dm.parent()->id()),imode(1); if(id==ParticleID::eta){imode=0;} // construct the integrator vector inweights; inweights.push_back(0.5); inweights.push_back(0.5); Energy mrho(getParticleData(ParticleID::rhoplus)->mass()); Energy wrho(getParticleData(ParticleID::rhoplus)->width()); vector inmass; inmass.push_back(mrho); inmass.push_back(mrho); vector inwidth; inwidth.push_back(wrho); inwidth.push_back(wrho); vector intype; intype.push_back(1); intype.push_back(2); vector inpow(2,0.0); return new_ptr(ThreeBodyAllOnCalculator (inweights,intype,inmass,inwidth,inpow,*this, imode,_mpi,ZERO,ZERO)); } void EtaPiGammaGammaDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; DecayIntegrator::dataBaseOutput(output,false); output << "newdef " << name() << ":grhoomega " << _grhoomega*GeV << "\n"; output << "newdef " << name() << ":Fpi " << _fpi/MeV << "\n"; output << "newdef " << name() << ":grho " << _grho << "\n"; output << "newdef " << name() << ":RhoMass " << _rhomass/MeV << "\n"; output << "newdef " << name() << ":RhoWidth " << _rhowidth/MeV << "\n"; output << "newdef " << name() << ":RatioFpiF8 " << _ratiofpif8 << "\n"; output << "newdef " << name() << ":RatioFpiF0 " << _ratiofpif0 << "\n"; output << "newdef " << name() << ":Theta " << _theta << "\n"; output << "newdef " << name() << ":EtaMax " << _etamax << "\n"; output << "newdef " << name() << ":EtaPrimeMax " << _etapmax << "\n"; output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n"; if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/PScalar4FermionsDecayer.cc b/Decay/ScalarMeson/PScalar4FermionsDecayer.cc --- a/Decay/ScalarMeson/PScalar4FermionsDecayer.cc +++ b/Decay/ScalarMeson/PScalar4FermionsDecayer.cc @@ -1,404 +1,404 @@ // -*- C++ -*- // // PScalar4FermionsDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PScalar4FermionsDecayer class. // #include "PScalar4FermionsDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Helicity/ScalarSpinInfo.h" #include "ThePEG/Helicity/FermionSpinInfo.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "ThePEG/Helicity/epsilon.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PScalar4FermionsDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) _maxweight[ix] = mode(ix)->maxWeight(); } } PScalar4FermionsDecayer::PScalar4FermionsDecayer() : _coupling(1,0.025159062/GeV), _incoming(1,111), _outgoing1(1,11), _outgoing2(1,11), _maxweight(1,0.000234211), _includeVMD(1,2),_VMDid(1,113), _VMDmass(1,0.7758*GeV), _VMDwidth(1,0.1503*GeV), _initsize(1) { // intermediates generateIntermediates(false); } void PScalar4FermionsDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters are consistent unsigned int isize=_coupling.size(); if(isize!=_incoming.size() || isize!=_outgoing1.size() || isize!=_outgoing2.size()|| isize!=_maxweight.size() || isize!=_includeVMD.size()|| isize!=_VMDid.size() || isize!=_VMDmass.size() || isize!=_VMDwidth.size()) throw InitException() << "Inconsistent parameters in PScalar4FermionsDecayer" << Exception::abortnow; // create the integration channels for each mode tPDVector extpart(5); tPDPtr gamma=getParticleData(ParticleID::gamma); DecayPhaseSpaceChannelPtr newchannel; DecayPhaseSpaceModePtr mode; vector wgt; for(unsigned int ix=0;ix<_incoming.size();++ix) { wgt.resize(1);wgt[0]=1.; extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData( _outgoing1[ix]); extpart[2] = getParticleData(-_outgoing1[ix]); extpart[3] = getParticleData( _outgoing2[ix]); extpart[4] = getParticleData(-_outgoing2[ix]); mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); // first channel always need this newchannel=new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,-2); newchannel->addIntermediate(gamma ,1,-1.1, 1,2); newchannel->addIntermediate(gamma ,1,-1.1, 3,4); mode->addChannel(newchannel); if(_outgoing1[ix]==_outgoing2[ix]) { newchannel=new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,-2); newchannel->addIntermediate(gamma ,1,-1.1, 3,2); newchannel->addIntermediate(gamma ,1,-1.1, 1,4); mode->addChannel(newchannel); wgt.resize(2);wgt[0]=0.5;wgt[1]=0.5; } else{wgt.resize(1);wgt[0]=1.;} addMode(mode,_maxweight[ix],wgt); } // set up the values for the VMD factor if needed (copy the default mass and width // into the array) for(unsigned ix=0;ixmass(); _VMDwidth[ix]=getParticleData(_VMDid[ix])->width(); } } } int PScalar4FermionsDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { // must be four outgoing particles if(children.size()!=4) return -1; // get the id's of the outgoing particles int id[4]={0,0,0,0}; bool done[4]={false,false,false,false}; unsigned int ix(0),iy(0); // ids of the particles int id0(parent->id()),idtemp(-1),idl1(-1),idl2(-1),idt[2]; tPDVector::const_iterator pit = children.begin(); for ( ;pit!=children.end();++pit) { id[ix]=(**pit).id(); done[ix]=false; ++ix; } // find the two lepton pairs // find the first fermion ix=0; do { if( id[ix]>0 && !done[ix] ) { done[ix]=true; idtemp=id[ix]; } ++ix; } while(ix<4&&idtemp<0); if(idtemp<0) return -1; // find its antiparticle ix=0; do { if( id[ix]==-idtemp && !done[ix] ) { done[ix]=true; idl1=idtemp; } ++ix; } while( ix<4 && idl1<0 ); if(idl1<0) return -1; // find the second particle antiparticle pair for(ix=0;ix<4;++ix) { if(!done[ix]) { idt[iy]=id[ix]; ++iy; } } if(idt[0]==-idt[1]) idl2=abs(idt[0]); if(idl2<0) return -1; // loop over the modes and see if this is one of them ix=0; int imode(-1); do { if(_incoming[ix]==id0) { if((idl1==_outgoing1[ix]&&idl2==_outgoing2[ix])|| (idl2==_outgoing1[ix]&&idl1==_outgoing2[ix])) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); cc=false; return imode; } void PScalar4FermionsDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_coupling,1/MeV) << _incoming << _outgoing1 << _outgoing2 << _maxweight << _includeVMD << _VMDid << ounit(_VMDmass,MeV) << ounit(_VMDwidth,MeV); } void PScalar4FermionsDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_coupling,1/MeV) >> _incoming >> _outgoing1 >> _outgoing2 >> _maxweight >> _includeVMD >> _VMDid >> iunit(_VMDmass,MeV) >> iunit(_VMDwidth,MeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPScalar4FermionsDecayer("Herwig::PScalar4FermionsDecayer", "HwSMDecay.so"); void PScalar4FermionsDecayer::Init() { static ClassDocumentation documentation ("The PScalar4FermionsDecayer class is designed for the decay" " of a pseudosclar meson to four fermions. It is intended for the decay of" "the pion to two electron-positron pairs."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PScalar4FermionsDecayer::_incoming, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceOutcoming1 ("Outgoing1", "The PDG code for the first outgoing fermion", &PScalar4FermionsDecayer::_outgoing1, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceOutcoming2 ("Outgoing2", "The PDG code for the second outgoing fermion", &PScalar4FermionsDecayer::_outgoing2, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &PScalar4FermionsDecayer::_coupling, 1/MeV, 0, ZERO, -10000/MeV, 10000/MeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &PScalar4FermionsDecayer::_maxweight, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceIncludeVMD ("IncludeVMD", "There are three options for 0 the VMD factor is not included, for 1 the factor " "is included using the default mass and width of the particle specified by" " VMDID, and for 2 the factor is included using the mass and width specified" " by VMDwidth and VMDmass.", &PScalar4FermionsDecayer::_includeVMD, 0, 0, 0, 0, 2, false, false, true); static ParVector interfaceVMDID ("VMDID", "The PDG code for the particle to be used for the VMD factor.", &PScalar4FermionsDecayer::_VMDid, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceVMDmass ("VMDmass", "The mass to use for the particle in the VMD factor", &PScalar4FermionsDecayer::_VMDmass, 1.*MeV, -1, ZERO, -10000*MeV, 10000*MeV, false, false, true); static ParVector interfaceVMDwidth ("VMDwidth", "The width to use for the particle in the VMD factor", &PScalar4FermionsDecayer::_VMDwidth, 1.*MeV, -1, ZERO, -10000*MeV, 10000*MeV, false, false, true); } double PScalar4FermionsDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin1Half,PDT::Spin1Half, PDT::Spin1Half,PDT::Spin1Half))); bool identical((_outgoing1[imode()]==_outgoing2[imode()])); if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); // set up the spin information for the decay products for(unsigned int ix=0;ix<2;++ix) { SpinorBarWaveFunction:: constructSpinInfo(_wavebar[ix],decay[2*ix ],outgoing,true); SpinorWaveFunction:: constructSpinInfo(_wave[ix] ,decay[2*ix+1],outgoing,true); } return 0.; } // calculate the spinors for(unsigned int ix=0;ix<2;++ix) { SpinorBarWaveFunction:: calculateWaveFunctions(_wavebar[ix],decay[2*ix ],outgoing); SpinorWaveFunction:: calculateWaveFunctions(_wave[ix] ,decay[2*ix+1],outgoing); } // momenta of the outgoing photons Lorentz5Momentum momentum[4]; momentum[0]=decay[0]->momentum()+decay[1]->momentum();momentum[0].rescaleMass(); momentum[1]=decay[2]->momentum()+decay[3]->momentum();momentum[1].rescaleMass(); if(identical) { momentum[2]=decay[2]->momentum()+decay[1]->momentum();momentum[2].rescaleMass(); momentum[3]=decay[0]->momentum()+decay[3]->momentum();momentum[3].rescaleMass(); } // compute the currents for the two leptonic decays LorentzPolarizationVectorE current[4][2][2]; unsigned int it,ix,iy,iz; for(iz=0;iz<2;++iz) { it = iz==0 ? 1 : 0; for(ix=0;ix<2;++ix) { for(iy=0;iy<2;++iy) { current[iz][iy][ix] = _wave[iz][ix].vectorCurrent(_wavebar[iz][iy]); // the second two currents if(identical) current[iz+2][iy][ix] = _wave[it][ix].vectorCurrent(_wavebar[iz][iy]); } } } // invariants Energy2 m12(sqr(momentum[0].mass())); Energy2 m34(sqr(momentum[1].mass())); Energy2 m14(ZERO), m23(ZERO); complex prop1(1./m12/m34),prop2(0./sqr(MeV2)); Complex ii(0.,1.); if(identical) { m14=momentum[2].mass()*momentum[2].mass(); m23=momentum[3].mass()*momentum[3].mass(); prop2=1./m14/m23; } // the VMD factor if needed if(_includeVMD[imode()]>0) { Energy2 mrho2(_VMDmass[imode()]*_VMDmass[imode()]); Energy2 mwrho(_VMDmass[imode()]*_VMDwidth[imode()]); prop1 = prop1*(-mrho2+ii*mwrho)/(m12-mrho2+ii*mwrho)* (-mrho2+ii*mwrho)/(m34-mrho2+ii*mwrho); if(identical) { prop2 = prop2*(-mrho2+ii*mwrho)/(m14-mrho2+ii*mwrho)* (-mrho2+ii*mwrho)/(m23-mrho2+ii*mwrho); } } // prefactor Complex pre(_coupling[imode()]*4.*Constants::pi *SM().alphaEM()*inpart.mass()); Complex diag; // now compute the matrix element LorentzVector > eps; vector ispin(5,0); for(ispin[1]=0; ispin[1]<2;++ispin[1]) { for(ispin[2]=0;ispin[2]<2;++ispin[2]) { for(ispin[3]=0;ispin[3]<2;++ispin[3]) { for(ispin[4]=0;ispin[4]<2;++ispin[4]) { // the first diagram eps = epsilon(current[0][ispin[1]][ispin[2]],momentum[1], current[1][ispin[3]][ispin[4]]); - diag = prop1*(eps*momentum[0]); + diag = Complex(prop1*(eps*momentum[0])); // exchanged diagram if identical particles // (sign due normal ordering) if(identical) { eps = epsilon(current[2][ispin[1]][ispin[4]],momentum[3], current[3][ispin[3]][ispin[2]]); - diag-= prop2*(eps*momentum[2]); + diag-= Complex(prop2*(eps*momentum[2])); } (*ME())(ispin)=pre*diag; } } } } double me=ME()->contract(_rho).real(); if(identical) me *= 0.25; return me; } // output the setup info for the particle database void PScalar4FermionsDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":Outgoing1 " << ix << " " << _outgoing1[ix] << "\n"; output << "newdef " << name() << ":Outgoing2 " << ix << " " << _outgoing2[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*MeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; output << "newdef " << name() << ":IncludeVMD " << ix << " " << _includeVMD[ix] << "\n"; output << "newdef " << name() << ":VMDID " << ix << " " << _VMDid[ix] << "\n"; output << "newdef " << name() << ":VMDmass " << ix << " " << _VMDmass[ix]/MeV << "\n"; output << "newdef " << name() << ":VMDwidth " << ix << " " << _VMDwidth[ix]/MeV << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":Outgoing1 " << ix << " " << _outgoing1[ix] << "\n"; output << "insert " << name() << ":Outgoing2 " << ix << " " << _outgoing2[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*MeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; output << "insert " << name() << ":IncludeVMD " << ix << " " << _includeVMD[ix] << "\n"; output << "insert " << name() << ":VMDID " << ix << " " << _VMDid[ix] << "\n"; output << "insert " << name() << ":VMDmass " << ix << " " << _VMDmass[ix]/MeV << "\n"; output << "insert " << name() << ":VMDwidth " << ix << " " << _VMDwidth[ix]/MeV << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/PScalarLeptonNeutrinoDecayer.cc b/Decay/ScalarMeson/PScalarLeptonNeutrinoDecayer.cc --- a/Decay/ScalarMeson/PScalarLeptonNeutrinoDecayer.cc +++ b/Decay/ScalarMeson/PScalarLeptonNeutrinoDecayer.cc @@ -1,321 +1,321 @@ // -*- C++ -*- // // PScalarLeptonNeutrinoDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PScalarLeptonNeutrinoDecayer class. // #include "PScalarLeptonNeutrinoDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PScalarLeptonNeutrinoDecayer::doinitrun() { DecayIntegrator::doinitrun(); unsigned int iz(0),ix,iy; if(initialize()) { for(ix=0;ix<_incoming.size();++ix) { for(iy=0;iy<_leptons[ix];++iy) { if(iy==0) _maxweighte [ix] = mode(iz)->maxWeight(); else if(iy==1) _maxweightmu [ix] = mode(iz)->maxWeight(); else if(iy==2) _maxweighttau[ix] = mode(iz)->maxWeight(); ++iz; } } } } PScalarLeptonNeutrinoDecayer::PScalarLeptonNeutrinoDecayer() : _incoming(6), _decayconstant(6), _leptons(6), _maxweighte(6), _maxweightmu(6), _maxweighttau(6) { // pion decay _incoming[0] = 211; _decayconstant[0] = 127.27*MeV; _leptons[0] = 2; _maxweighte[0] = 0.00014; _maxweightmu[0] = 1.09; _maxweighttau[0] = 0.0; // kaon decay _incoming[1] = 321; _decayconstant[1] = 36.06*MeV; _leptons[1] = 2; _maxweighte[1] = 1.87e-05; _maxweightmu[1] = 0.74; _maxweighttau[1] = 0.0; // D_s decay _incoming[2] = 431; _decayconstant[2] = 281.36*MeV; _leptons[2] = 3; _maxweighte[2] = 1.83428e-07; _maxweightmu[2] = 0.00782778; _maxweighttau[2] = 0.00782778; // D decay _incoming[3] = 411; _decayconstant[3] = 51.20*MeV; _leptons[3] = 3; _maxweighte[3] = 1.19915e-08; _maxweightmu[3] = 0.000511418; _maxweighttau[3] = 0.00135052; // B_c decay _incoming[4] = 541; _decayconstant[4] = 16.0*MeV; _leptons[4] = 3; _maxweighte[4] = 1.7429e-09; _maxweightmu[4] = 7.47667e-05; _maxweighttau[4] = 0.0179128; // B_u decays _incoming[5] = 521; _decayconstant[5] = 0.759*MeV; _leptons[5] = 3; _maxweighte[5] = 1.19578e-11; _maxweightmu[5] = 5.12844e-07; _maxweighttau[5] = 0.000114138; // initial size of the vectors _initsize=_incoming.size(); // intermediates generateIntermediates(false); } void PScalarLeptonNeutrinoDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters are consistent unsigned int isize(_incoming.size()); if(isize!=_decayconstant.size()||isize!=_leptons.size()||isize!=_maxweighte.size()|| isize!=_maxweightmu.size()||isize!=_maxweighttau.size()) throw InitException() << "Inconsistent parameters in PScalarLeptonNeutrinoDecayer" << Exception::abortnow; // create the integration channels tPDVector extpart(3); tPDPtr nu[3]={getParticleData(ParticleID::nu_e), getParticleData(ParticleID::nu_mu), getParticleData(ParticleID::nu_tau)}; tPDPtr nubar[3]={getParticleData(ParticleID::nu_ebar), getParticleData(ParticleID::nu_mubar), getParticleData(ParticleID::nu_taubar)}; tPDPtr lep[3]={getParticleData(ParticleID::eminus), getParticleData(ParticleID::muminus), getParticleData(ParticleID::tauminus)}; tPDPtr lepbar[3]={getParticleData(ParticleID::eplus), getParticleData(ParticleID::muplus), getParticleData(ParticleID::tauplus)}; int charge; vector dummyweights; double wgt; DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); charge=extpart[0]->iCharge(); for(unsigned int iy=0;iy<_leptons[ix];++iy) { if(charge>0) { extpart[1]=lepbar[iy]; extpart[2]=nu[iy]; } else { extpart[1]=lep[iy]; extpart[2]=nubar[iy]; } mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); if(iy==0) wgt = _maxweighte[ix]; else if(iy==1) wgt = _maxweightmu[ix]; else wgt = _maxweighttau[ix]; addMode(mode,wgt,dummyweights); } } } int PScalarLeptonNeutrinoDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { int imode(-1); if(children.size()!=2) return imode; // ids of the particles int id0(parent->id()),id0bar(id0); if(parent->CC()){id0bar=-id0;} tPDVector::const_iterator pit = children.begin(); int id; unsigned ilep(4); for(;pit!=children.end();++pit) { id=abs((**pit).id()); if(id>=11&&id<=16&&id%2==0) ilep=(id-10)/2; } // find the channel we need bool found(false); int ichan(-1); unsigned int ix(0); do { if(id0 ==_incoming[ix]||id0bar==_incoming[ix]) { found=true;ichan+=ilep; cc=id0bar==_incoming[ix]; } else { ichan+=_leptons[ix]; } ++ix; } while (!found&&ix<_incoming.size()); if(found) imode=ichan; return imode; } void PScalarLeptonNeutrinoDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << ounit(_decayconstant,GeV) << _leptons << _maxweighte << _maxweightmu << _maxweighttau; } void PScalarLeptonNeutrinoDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> iunit(_decayconstant,GeV) >> _leptons >> _maxweighte >> _maxweightmu >> _maxweighttau; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPScalarLeptonNeutrinoDecayer("Herwig::PScalarLeptonNeutrinoDecayer", "HwSMDecay.so"); void PScalarLeptonNeutrinoDecayer::Init() { static ClassDocumentation documentation ("The PScalarLeptonNeutrinoDecayer class is the base class for" " the implementation of leptonic decay of a pseudoscalar meson to a lepton" "and a neutrino."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PScalarLeptonNeutrinoDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceLepton ("Leptons", "The allowed outgoing leptons, 1 is only electrons, 2 is electrons and muons and " "3 is all lepton flavours", &PScalarLeptonNeutrinoDecayer::_leptons, 0, 0, 0, 1, 3, false, false, true); static ParVector interfaceMaxWeighte ("MaxWeightElectron", "The maximum weight for the electron decay mode", &PScalarLeptonNeutrinoDecayer::_maxweighte, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceMaxWeightmu ("MaxWeightMuon", "The maximum weight for the muon decay mode", &PScalarLeptonNeutrinoDecayer::_maxweightmu, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceMaxWeighttau ("MaxWeightTau", "The maximum weight for the tau decay mode", &PScalarLeptonNeutrinoDecayer::_maxweighttau, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceDecayConstant ("DecayConstant", "The decay constant for the incoming pseudoscaalr meson.", &PScalarLeptonNeutrinoDecayer::_decayconstant, MeV, 0, ZERO, ZERO, 1000.*MeV, false, false, true); } double PScalarLeptonNeutrinoDecayer::me2(const int,const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin1Half,PDT::Spin1Half))); // work out which decay constant to use int icoup(0),id(abs(inpart.id())); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(id==abs(_incoming[ix])) icoup=ix; } // find the particles unsigned int iferm(0),ianti(0); for(unsigned ix=0;ixid(); if(id<=-11&&id>=-16) ianti=ix; else if(id>=11&&id<=16) iferm=ix; } int idferm = decay[iferm]->id(); // initialization if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); // set up the spin information for the decay products SpinorBarWaveFunction:: constructSpinInfo(_wavebar,decay[iferm],outgoing,true); SpinorWaveFunction:: constructSpinInfo(_wave ,decay[ianti],outgoing,true); } // calculate the spinors SpinorBarWaveFunction:: calculateWaveFunctions(_wavebar,decay[iferm],outgoing); SpinorWaveFunction:: calculateWaveFunctions(_wave ,decay[ianti],outgoing); // the prefactor Energy premass = idferm%2==0 ? decay[ianti]->mass() : decay[iferm]->mass(); InvEnergy pre = premass * 2.*_decayconstant[icoup]*SM().fermiConstant()/inpart.mass(); // compute the matrix element vector ispin(3,0); for(ispin[ianti+1]=0;ispin[ianti+1]<2;++ispin[ianti+1]) { for(ispin[iferm+1]=0;ispin[iferm+1]<2;++ispin[iferm+1]) { (*ME())(ispin)= idferm%2==0 ? - pre*_wave[ispin[ianti+1]].rightScalar(_wavebar[ispin[iferm+1]]) : - pre*_wave[ispin[ianti+1]].leftScalar( _wavebar[ispin[iferm+1]]) ; + Complex(pre*_wave[ispin[ianti+1]].rightScalar(_wavebar[ispin[iferm+1]])) : + Complex(pre*_wave[ispin[ianti+1]].leftScalar( _wavebar[ispin[iferm+1]])) ; } } // // test of the matrix element // double me=newME.contract(rhoin).real(); // Energy mass = idferm%2==0 ? decay[ianti]->mass() : decay[iferm]->mass(); // double test = sqr(_decayconstant[icoup]*SM().fermiConstant()*2.*mass/inpart.mass())* // (sqr(inpart.mass())-sqr(mass)); // cout << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << (me-test)/(me+test) << endl; return 0.5*ME()->contract(_rho).real(); } void PScalarLeptonNeutrinoDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":Leptons " << ix << " " << _leptons[ix] << "\n"; output << "newdef " << name() << ":MaxWeightElectron " << ix << " " << _maxweighte[ix] << "\n"; output << "newdef " << name() << ":MaxWeightMuon " << ix << " " << _maxweightmu[ix] << "\n"; output << "newdef " << name() << ":MaxWeightTau " << ix << " " << _maxweighttau[ix] << "\n"; output << "newdef " << name() << ":DecayConstant " << ix << " " << _decayconstant[ix]/MeV << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":Leptons " << ix << " " << _leptons[ix] << "\n"; output << "insert " << name() << ":MaxWeightElectron " << ix << " " << _maxweighte[ix] << "\n"; output << "insert " << name() << ":MaxWeightMuon " << ix << " " << _maxweightmu[ix] << "\n"; output << "insert " << name() << ":MaxWeightTau " << ix << " " << _maxweighttau[ix] << "\n"; output << "insert " << name() << ":DecayConstant " << ix << " " << _decayconstant[ix]/MeV << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/PScalarPScalarVectorDecayer.cc b/Decay/ScalarMeson/PScalarPScalarVectorDecayer.cc --- a/Decay/ScalarMeson/PScalarPScalarVectorDecayer.cc +++ b/Decay/ScalarMeson/PScalarPScalarVectorDecayer.cc @@ -1,311 +1,311 @@ // -*- C++ -*- // // PScalarPScalarVectorDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PScalarPScalarVectorDecayer class. // #include "PScalarPScalarVectorDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PScalarPScalarVectorDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } PScalarPScalarVectorDecayer::PScalarPScalarVectorDecayer() : _incoming(19), _outgoingP(19), _outgoingV(19), _coupling(19), _maxweight(19) { // decay pi' to rho pi _incoming[0] = 100111; _outgoingV[0] = 213; _outgoingP[0] = -211; _coupling[0] = 3.57; _maxweight[0] = 4.5; _incoming[1] = 100211; _outgoingV[1] = 213; _outgoingP[1] = 111; _coupling[1] = 3.57; _maxweight[1] = 4.5; _incoming[2] = 100211; _outgoingV[2] = 113; _outgoingP[2] = 211; _coupling[2] = 3.57; _maxweight[2] = 4.5; // K' to K rho _incoming[3] = 100311; _outgoingP[3] = 311; _outgoingV[3] = 113; _coupling[3] = 1.; _maxweight[3] = 4.; _incoming[4] = 100321; _outgoingP[4] = 321; _outgoingV[4] = 113; _coupling[4] = 1.; _maxweight[4] = 4.; _incoming[5] = 100311; _outgoingP[5] = 321; _outgoingV[5] = -213; _coupling[5] = 1.41; _maxweight[5] = 4.; _incoming[6] = 100321; _outgoingP[6] = 311; _outgoingV[6] = 213; _coupling[6] = 1.41; _maxweight[6] = 4.; // K' to K* pi _incoming[7] = 100311; _outgoingV[7] = 313; _outgoingP[7] = 111; _coupling[7] = 1.55; _maxweight[7] = 2.; _incoming[8] = 100321; _outgoingV[8] = 323; _outgoingP[8] = 111; _coupling[8] = 1.55; _maxweight[8] = 2.; _incoming[9] = 100311; _outgoingV[9] = 323; _outgoingP[9] = -211; _coupling[9] = 2.19; _maxweight[9] = 2.; _incoming[10] = 100321; _outgoingV[10] = 313; _outgoingP[10] = 211; _coupling[10] = 2.19; _maxweight[10] = 2.; // eta (1475) to K* K _incoming[11] = 100331; _outgoingV[11] = 323; _outgoingP[11] = -321; _coupling[11] = 2.92; _maxweight[11] = 3.5; _incoming[12] = 100331; _outgoingV[12] = 313; _outgoingP[12] = -311; _coupling[12] = 2.92; _maxweight[12] = 3.5; // eta (1475) to K* K _incoming[13] = 9020221; _outgoingV[13] = 323; _outgoingP[13] = -321; _coupling[13] = 0.956; _maxweight[13] = 4.; _incoming[14] = 9020221; _outgoingV[14] = 313; _outgoingP[14] = -311; _coupling[14] = 0.956; _maxweight[14] = 4.; // decay f_0(1370) to a_1 pi _incoming[15] = 10221; _outgoingV[15] = 20213; _outgoingP[15] = -211; _coupling[15] = 2.68; _maxweight[15] = 4.5; _incoming[16] = 10221; _outgoingV[16] = 20113; _outgoingP[16] = 111; _coupling[16] = 2.68; _maxweight[16] = 4.5; // decay f_0(1500) to a_1 pi _incoming[17] = 9030221; _outgoingV[17] = 20213; _outgoingP[17] = -211; _coupling[17] = 1.147; _maxweight[17] = 3.2; _incoming[18] = 9030221; _outgoingV[18] = 20113; _outgoingP[18] = 111; _coupling[18] = 1.147; _maxweight[18] = 3.2; // initial size of the arrays _initsize=_incoming.size(); // intermediates generateIntermediates(false); } void PScalarPScalarVectorDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters arew consistent unsigned int isize=_coupling.size(); if(isize!=_incoming.size() || isize!=_outgoingP.size()|| isize!=_outgoingV.size() || isize!=_maxweight.size()) throw InitException() << "Inconsistent parameters in PScalarPScalarVectorDecayer" << Exception::abortnow; // set up the integration channels vector wgt; DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoingP[ix]); extpart[2] = getParticleData(_outgoingV[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int PScalarPScalarVectorDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoingP[ix]&&id2 ==_outgoingV[ix])|| (id2 ==_outgoingP[ix]&&id1 ==_outgoingV[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoingP[ix]&&id2bar==_outgoingV[ix])|| (id2bar==_outgoingP[ix]&&id1bar==_outgoingV[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void PScalarPScalarVectorDecayer::persistentOutput(PersistentOStream & os) const { os << _coupling << _incoming << _outgoingP << _outgoingV << _maxweight; } void PScalarPScalarVectorDecayer::persistentInput(PersistentIStream & is, int) { is >> _coupling >> _incoming >> _outgoingP >> _outgoingV >> _maxweight; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPScalarPScalarVectorDecayer("Herwig::PScalarPScalarVectorDecayer", "HwSMDecay.so"); void PScalarPScalarVectorDecayer::Init() { static ClassDocumentation documentation ("The PScalarPScalarVectorDecayer class is designed for" " the decay of a pseduoscalar meson to two spin-1 particles."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PScalarPScalarVectorDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutgoingScalar ("OutgoingPScalar", "The PDG code for the outgoing pseudoscalar meson", &PScalarPScalarVectorDecayer::_outgoingP, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutgoingVector ("OutgoingVector", "The PDG code for the outgoing vector meson", &PScalarPScalarVectorDecayer::_outgoingV, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &PScalarPScalarVectorDecayer::_coupling, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &PScalarPScalarVectorDecayer::_maxweight, 0, 0, 0, 0., 100., false, false, true); } double PScalarPScalarVectorDecayer::me2( const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin0,PDT::Spin1))); if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); ScalarWaveFunction::constructSpinInfo(decay[0],outgoing,true); VectorWaveFunction::constructSpinInfo(_vectors,decay[1], outgoing,true,false); return 0.; } VectorWaveFunction::calculateWaveFunctions(_vectors,decay[1], outgoing,false); // calculate the matrix element Lorentz5Momentum psum(inpart.momentum()+decay[0]->momentum()); for(unsigned int ix=0;ix<3;++ix) { - (*ME())(0,0,ix)=_coupling[imode()]/inpart.mass()*(_vectors[ix]*psum); + (*ME())(0,0,ix)=Complex(_coupling[imode()]/inpart.mass()*(_vectors[ix]*psum)); } // test of the matrix element // double me=newME.contract(rhoin).real(); // Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = 4.*sqr(_coupling[imode()]*pcm/decay[1]->mass()); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << (me-test)/(me+test) << "\n"; // output the answer return ME()->contract(_rho).real(); } // specify the 1-2 matrix element to be used in the running width calculation bool PScalarPScalarVectorDecayer::twoBodyMEcode(const DecayMode & dm, int & mecode, double & coupling) const { int imode(-1); int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(true); do { if(id ==_incoming[ix]) { if(id1==_outgoingP[ix]&&id2==_outgoingV[ix]) { imode=ix; order=true; } if(id2==_outgoingP[ix]&&id1==_outgoingV[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingP[ix]&&id2bar==_outgoingV[ix]) { imode=ix; order=true; } if(id2bar==_outgoingP[ix]&&id1bar==_outgoingV[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling=_coupling[imode]; mecode=10; return order; } // output the setup information for the particle database void PScalarPScalarVectorDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "newdef " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix] << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "insert " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix] << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc b/Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc --- a/Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc +++ b/Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc @@ -1,450 +1,450 @@ // -*- C++ -*- // // PScalarVectorFermionsDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PScalarVectorFermionsDecayer class. // #include "PScalarVectorFermionsDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "ThePEG/Helicity/epsilon.h" #include "Herwig/PDT/ThreeBodyAllOn1IntegralCalculator.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PScalarVectorFermionsDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) _maxweight[ix]=mode(ix)->maxWeight(); } } PScalarVectorFermionsDecayer::PScalarVectorFermionsDecayer() : _coupling(5), _incoming(5), _outgoingV(5), _outgoingf(5), _outgoinga(5),_maxweight(5), _includeVMD(5), _VMDid(5), _VMDmass(5), _VMDwidth(5) { // pi0 -> gamma e+e- _incoming[0] = 111;_outgoingV[0] = 22; _outgoingf[0] = 11;_outgoinga[0] = -11; _coupling[0] = 0.00761872/GeV;_maxweight[0] = 0.027; _includeVMD[0] = 2;_VMDid[0] = 113; _VMDmass[0] = 0.7758*GeV;_VMDwidth[0] = 0.1503*GeV; // eta -> gamma e+e-/mu+/mu- _incoming[1] = 221;_outgoingV[1] = 22; _outgoingf[1] = 11;_outgoinga[1] = -11; _coupling[1] = 0.007554164/GeV;_maxweight[1] = 2.8; _includeVMD[1] = 2;_VMDid[1] = 113; _VMDmass[1] = 0.7758*GeV;_VMDwidth[1] = 0.1503*GeV; _incoming[2] = 221;_outgoingV[2] = 22; _outgoingf[2] = 13;_outgoinga[2] = -13; _coupling[2] = 0.007554164/GeV;_maxweight[2] = 2.1; _includeVMD[2] = 2;_VMDid[2] = 113; _VMDmass[2] = 0.7758*GeV;_VMDwidth[2] = 0.1503*GeV; // eta' -> gamma e+e-/mu+mu- _incoming[3] = 331;_outgoingV[3] = 22; _outgoingf[3] = 11;_outgoinga[3] = -11; _coupling[3] = 0.0104/GeV;_maxweight[3] = 5.2; _includeVMD[3] = 2;_VMDid[3] = 113; _VMDmass[3] = 0.7758*GeV;_VMDwidth[3] = 0.1503*GeV; _incoming[4] = 331;_outgoingV[4] = 22; _outgoingf[4] = 13;_outgoinga[4] = -13; _coupling[4] = 0.0104/GeV;_maxweight[4] = 3.0; _includeVMD[4] = 2;_VMDid[4] = 113; _VMDmass[4] = 0.7758*GeV;_VMDwidth[4] = 0.1503*GeV; // initial size of the arrays _initsize = _incoming.size(); // intermediates generateIntermediates(false); } void PScalarVectorFermionsDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters are consistent unsigned int isize=_coupling.size(); if(isize!=_incoming.size() || isize!=_outgoingV.size()|| isize!=_outgoingf.size()|| isize!=_outgoinga.size() || isize!=_maxweight.size()|| isize!=_includeVMD.size()|| isize!=_VMDid.size() || isize!=_VMDmass.size() || isize!=_VMDwidth.size()) throw InitException() << "Inconsistent parameters in PScalarVectorFermionsDecayer" << Exception::abortnow; // create the integration channel for each mode tPDVector extpart(4); tPDPtr gamma(getParticleData(ParticleID::gamma)); DecayPhaseSpaceChannelPtr newchannel; DecayPhaseSpaceModePtr mode; vector wgt(1,1.); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoingV[ix]); extpart[2] = getParticleData(_outgoingf[ix]); extpart[3] = getParticleData(_outgoinga[ix]); mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); newchannel=new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(extpart[0],0, 0.0,-1,1); newchannel->addIntermediate(gamma ,1,-1.1, 2,3); mode->addChannel(newchannel); addMode(mode,_maxweight[ix],wgt); } // set up the values for the VMD factor if needed (copy the default mass and width // into the array) for(unsigned ix=0;ixmass(); _VMDwidth[ix]=getParticleData(_VMDid[ix])->width(); } } } int PScalarVectorFermionsDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { int imode(-1); // must be three outgoing particles if(children.size()!=3) return imode; // ids of the particles int id0(parent->id()),idf[2]={0,0},idv(0); unsigned int nf(0); tPDVector::const_iterator pit = children.begin(); for( ;pit!=children.end();++pit) { if((**pit).iSpin()==PDT::Spin1) { idv=(**pit).id(); } else { idf[nf]=(**pit).id(); ++nf; } } // loop over the modes and see if this is one of them unsigned int ix=0; do { if(_incoming[ix]==id0&&_outgoingV[ix]==idv) {if((idf[0]==_outgoingf[ix]&&idf[1]==_outgoinga[ix])|| (idf[1]==_outgoingf[ix]&&idf[0]==_outgoinga[ix])){imode=ix;}} ++ix; } while(imode<0&&ix<_incoming.size()); cc=false; return imode; } void PScalarVectorFermionsDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_coupling,1/MeV) << _incoming << _outgoingV << _outgoingf << _outgoinga << _maxweight << _includeVMD << _VMDid << ounit(_VMDmass,MeV) << ounit(_VMDwidth,MeV); } void PScalarVectorFermionsDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_coupling,1/MeV) >> _incoming >> _outgoingV >> _outgoingf >> _outgoinga >> _maxweight >> _includeVMD >> _VMDid >> iunit(_VMDmass,MeV) >> iunit(_VMDwidth,MeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPScalarVectorFermionsDecayer("Herwig::PScalarVectorFermionsDecayer", "HwSMDecay.so"); void PScalarVectorFermionsDecayer::Init() { static ClassDocumentation documentation ("The PScalarVectorFermionsDecayer class is designed" " for the decay of a pseudoscalar meson to a photon and a" "fermion-antifermion pair"); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PScalarVectorFermionsDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingV ("OutgoingVector", "The PDG code for the outgoing pseudoscalar", &PScalarVectorFermionsDecayer::_outgoingV, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingF ("OutgoingFermion", "The PDG code for the outgoing fermion", &PScalarVectorFermionsDecayer::_outgoingf, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingA ("OutgoingAntiFermion", "The PDG code for the outgoing antifermion", &PScalarVectorFermionsDecayer::_outgoinga, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &PScalarVectorFermionsDecayer::_coupling, 1/MeV, 0, ZERO, -10000000/MeV, 10000000/MeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &PScalarVectorFermionsDecayer::_maxweight, 0, 0, 0, 0.0, 100., false, false, true); static ParVector interfaceIncludeVMD ("IncludeVMD", "There are three options for 0 the VMD factor is not included, for 1 the factor " "is included using the default mass and width of the particle specified by" " VMDID, and for 2 the factor is included using the mass and width specified" " by VMDwidth and VMDmass.", &PScalarVectorFermionsDecayer::_includeVMD, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceVMDID ("VMDID", "The PDG code for the particle to be used for the VMD factor.", &PScalarVectorFermionsDecayer::_VMDid, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceVMDmass ("VMDmass", "The mass to use for the particle in the VMD factor", &PScalarVectorFermionsDecayer::_VMDmass, MeV, 0, ZERO, ZERO, 10000.*MeV, false, false, true); static ParVector interfaceVMDwidth ("VMDwidth", "The width to use for the particle in the VMD factor", &PScalarVectorFermionsDecayer::_VMDwidth, MeV, 0, ZERO, ZERO, 10000.*MeV, false, false, true); } double PScalarVectorFermionsDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin1,PDT::Spin1Half, PDT::Spin1Half))); // initialization if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); // set up the spin information for the decay products VectorWaveFunction:: constructSpinInfo(_vectors,decay[0],outgoing,true,true); SpinorBarWaveFunction:: constructSpinInfo(_wavebar,decay[1],outgoing,true); SpinorWaveFunction:: constructSpinInfo(_wave ,decay[2],outgoing,true); return 0.; } // calculate the spinors and polarization vectors VectorWaveFunction:: calculateWaveFunctions(_vectors,decay[0],outgoing,true); SpinorBarWaveFunction:: calculateWaveFunctions(_wavebar,decay[1],outgoing); SpinorWaveFunction:: calculateWaveFunctions(_wave ,decay[2],outgoing); // now compute the matrix element Complex ii(0.,1.); Lorentz5Momentum pff(decay[1]->momentum()+decay[2]->momentum()); pff.rescaleMass(); Energy2 mff2(pff.mass()*pff.mass()); // compute the prefactor complex pre(_coupling[imode()]/mff2); // the VMD factor if(_includeVMD[imode()]>0) { Energy2 mrho2=_VMDmass[imode()]*_VMDmass[imode()]; Energy2 mwrho=_VMDmass[imode()]*_VMDwidth[imode()]; pre = pre*(-mrho2+ii*mwrho)/(mff2-mrho2+ii*mwrho); } LorentzVector > eps; LorentzVector > fcurrent; // compute the matrix element vector ispin(4);ispin[0]=0; for(ispin[3]=0;ispin[3]<2;++ispin[3]) { for(ispin[2]=0;ispin[2]<2;++ispin[2]) { fcurrent = _wave[ispin[3]].vectorCurrent(_wavebar[ispin[2]]); // compute the current for this part eps = epsilon(decay[0]->momentum(),pff,fcurrent); for(ispin[1]=0;ispin[1]<3;++ispin[1]) { - (*ME())(ispin)=pre *_vectors[ispin[1]].dot(eps); + (*ME())(ispin) = Complex(pre *_vectors[ispin[1]].dot(eps)); } } } double me = ME()->contract(_rho).real(); // //code to test the matrix element against the analytic result // Energy m[4]={inpart.mass(),decay[0]->mass(),decay[1]->mass(),decay[2]->mass()}; // Energy2 m2[4]={m[0]*m[0],m[1]*m[1],m[2]*m[2],m[3]*m[3]}; // Lorentz5Momentum p12=decay[0]->momentum()+decay[1]->momentum();p12.rescaleMass(); // Energy2 m122(p12.mass2()); // Complex output( ((pre*conj(pre)).real()*( // -2*m122*m122*mff2 - mff2*mff2*mff2 + // m2[1]*(2*m2[2]*m2[3] - 2*m2[3]*m2[3] + // m2[1]*(m2[2] - 2*m[2]*m[3] - m2[3])) - // 2*m[2]*(m[2]*m2[2] - 2*m2[1]*m[3] - m[2]*m2[3])* // m2[0] - (m2[2] + 2*m[2]*m[3] - m2[3])* // m2[0]*m2[0] +mff2*mff2* // (2*m2[1] + (m[2] - m[3])*(m[2] - m[3]) + 2*m2[0]) - // mff2*(m2[1]*m2[1] + 2*m2[1]*m[2]*(m[2] - 2*m[3]) + // 2*m2[2]*m2[3] - 2*(2*m[2] - m[3])*m[3]*m2[0] + // m2[0]*m2[0]) + 2*m122* // (-mff2*mff2 - (m2[2] - m2[3])* // (m2[1] - m2[0]) + // mff2*(m2[1] + m2[2] + m2[3] + // m2[0]))))); // cout << "testing the matrix element " // << real(output) << " " << me << " " << test2 << endl; return me; } // method to return an object to calculate the 3 or higher body partial width WidthCalculatorBasePtr PScalarVectorFermionsDecayer::threeBodyMEIntegrator(const DecayMode & dm) const { // workout which mode we are doing int imode(-1); // ids of the particles int id0(dm.parent()->id()),idf[2]={0,0},idv(0); unsigned int nf(0); ParticleMSet::const_iterator pit = dm.products().begin(); for( ;pit!=dm.products().end();++pit) { if((**pit).iSpin()==PDT::Spin1){idv=(**pit).id();} else{idf[nf]=(**pit).id();++nf;} } // loop over the modes and see if this is one of them unsigned int ix=0; do { if(_incoming[ix]==id0&&_outgoingV[ix]==idv) { if((idf[0]==_outgoingf[ix]&&idf[1]==_outgoinga[ix])|| (idf[1]==_outgoingf[ix]&&idf[0]==_outgoinga[ix])) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); // get the masses we need Energy m[3]={getParticleData(_outgoingV[imode])->mass(), getParticleData(_outgoingf[imode])->mass(), getParticleData(_outgoinga[imode])->mass()}; return new_ptr(ThreeBodyAllOn1IntegralCalculator (3,-1000.*MeV,-0.9*MeV,-0.9,*this,imode,m[0],m[1],m[2])); } InvEnergy PScalarVectorFermionsDecayer::threeBodydGammads(const int imodeb, const Energy2 q2, const Energy2 mff2, const Energy m1, const Energy m2, const Energy m3) const { // the masses of the external particles Energy q=sqrt(q2); Energy2 m12=m1*m1; Energy2 m22=m2*m2; Energy2 m32=m3*m3; // calculate the prefactor Complex ii(0.,1.); complex pre = _coupling[imodeb] / mff2; // the VMD factor if(_includeVMD[imodeb]>0) { Energy2 mrho2=_VMDmass[imodeb]*_VMDmass[imodeb]; Energy2 mwrho=_VMDmass[imodeb]*_VMDwidth[imodeb]; pre = pre*(-mrho2+ii*mwrho)/(mff2-mrho2+ii*mwrho); } InvEnergy6 factor=real(pre*conj(pre)); // compute the pieces from the integration limits Energy mff=sqrt(mff2); Energy e2star = 0.5*(mff2-m32+m22)/mff; Energy e1star = 0.5*(q2-mff2-m12)/mff; Energy e1sm = sqrt(e1star*e1star-m12); Energy e2sm = sqrt(e2star*e2star-m22); Energy2 a = 2*e1star*e2star+m12+m22; Energy2 b = 2*e1sm*e2sm; // term independent of s3 Energy8 me = 2*b*(2*(m12*(mff2*mff2 + 4*mff2*m2*m3 -(m22 - m32)*(m22 - m32)) + 2*m2*(m12 +m22)*m3*(-mff2 +m22 + q2)) +(m12 +m22)*(m12 +m22)*(-mff2 +m22 - 2*m2*m3 - m32) -(mff2 +m22 + 2*m2*m3 - m32)*(-mff2 +m22 + q2)*(-mff2 +m22 + q2)); // linear term me+= 2.*a*b*(2*(-mff2*mff2 - (m22 - m32)*(m12 - q2) + mff2*(m12 + m22 + m32 + q2))); // quadratic term me+=-4.*mff2*b*(3.*a*a+b*b)/3.; // phase space factors using Constants::pi; return -factor * me/256./pi/pi/pi/q2/q; } // output the setup information for the particle database void PScalarVectorFermionsDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "newdef " << name() << ":OutgoingFermion " << ix << " " << _outgoingf[ix] << "\n"; output << "newdef " << name() << ":OutgoingAntiFermion " << ix << " " << _outgoinga[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*MeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; output << "newdef " << name() << ":IncludeVMD " << ix << " " << _includeVMD[ix] << "\n"; output << "newdef " << name() << ":VMDID " << ix << " " << _VMDid[ix] << "\n"; output << "newdef " << name() << ":VMDmass " << ix << " " << _VMDmass[ix]/MeV << "\n"; output << "newdef " << name() << ":VMDwidth " << ix << " " << _VMDwidth[ix]/MeV << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "insert " << name() << ":OutgoingFermion " << ix << " " << _outgoingf[ix] << "\n"; output << "insert " << name() << ":OutgoingAntiFermion " << ix << " " << _outgoinga[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*MeV << "\n"; output << "insert " << name() << ":IncludeVMD " << ix << " " << _includeVMD[ix] << "\n"; output << "insert " << name() << ":VMDID " << ix << " " << _VMDid[ix] << "\n"; output << "insert " << name() << ":VMDmass " << ix << " " << _VMDmass[ix]/MeV << "\n"; output << "insert " << name() << ":VMDwidth " << ix << " " << _VMDwidth[ix]/MeV << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/PScalarVectorVectorDecayer.cc b/Decay/ScalarMeson/PScalarVectorVectorDecayer.cc --- a/Decay/ScalarMeson/PScalarVectorVectorDecayer.cc +++ b/Decay/ScalarMeson/PScalarVectorVectorDecayer.cc @@ -1,268 +1,268 @@ // -*- C++ -*- // // PScalarVectorVectorDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PScalarVectorVectorDecayer class. // #include "PScalarVectorVectorDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/epsilon.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PScalarVectorVectorDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) _maxweight[ix] = mode(ix)->maxWeight(); } } PScalarVectorVectorDecayer::PScalarVectorVectorDecayer() : _incoming(10), _outgoing1(10), _outgoing2(10), _coupling(10), _maxweight(10) { // decay eta -> omega gamma _incoming[0] = 331; _outgoing1[0] = 223; _outgoing2[0] = 22; _coupling[0] = 0.1412/GeV; _maxweight[0] = 1.2; // decay pi -> gamma gamma _incoming[1] = 111; _outgoing1[1] = 22; _outgoing2[1] = 22; _coupling[1] = 0.0178/GeV; _maxweight[1] = 1.1; // decay eta -> gamma gamma _incoming[2] = 221; _outgoing1[2] = 22; _outgoing2[2] = 22; _coupling[2] = 0.0176/GeV; _maxweight[2] = 1.1; // decay eta' -> gamma gamma _incoming[3] = 331; _outgoing1[3] = 22; _outgoing2[3] = 22; _coupling[3] = 0.0221/GeV; _maxweight[3] = 1.1; // decay eta_c -> rho rho _incoming[4] = 441; _outgoing1[4] = 213; _outgoing2[4] = -213; _coupling[4] = 0.0525/GeV; _maxweight[4] = 2.7; _incoming[5] = 441; _outgoing1[5] = 113; _outgoing2[5] = 113; _coupling[5] = 0.0371/GeV; _maxweight[5] = 2.7; // decay eta-c -> phi phi _incoming[6] = 441; _outgoing1[6] = 333; _outgoing2[6] = 333; _coupling[6] = 0.0267/GeV; _maxweight[6] = 9.; // decay eta-c -> gamma gamma _incoming[7] = 441; _outgoing1[7] = 22; _outgoing2[7] = 22; _coupling[7] = 0.00521/GeV; _maxweight[7] = 1.2; // decay eta_c -> K* K* _incoming[8] = 441; _outgoing1[8] = 323; _outgoing2[8] = -323; _coupling[8] = 0.0308/GeV; _maxweight[8] = 5.3; _incoming[9] = 441; _outgoing1[9] = 313; _outgoing2[9] = -313; _coupling[9] = 0.0308/GeV; _maxweight[9] = 5.3; // initial size of the vectors _initsize = _incoming.size(); // intermediates generateIntermediates(false); } void PScalarVectorVectorDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters arew consistent unsigned int isize(_coupling.size()); if(isize!=_incoming.size() || isize!=_outgoing1.size()|| isize!=_outgoing2.size() || isize!=_maxweight.size()) throw InitException() << "Inconsistent parameters in PScalarVectorVectorDecayer" << Exception::abortnow; // set up the integration channels vector wgt; DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoing1[ix]); extpart[2] = getParticleData(_outgoing2[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int PScalarVectorVectorDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { cc = false; if(children.size()!=2) return -1; int id(parent->id()); int id1(children[0]->id()); int id2(children[1]->id()); unsigned int ix(0); int imode(-1); do { if(_incoming[ix]==id) { if((id1==_outgoing1[ix]&&id2==_outgoing2[ix])|| (id2==_outgoing1[ix]&&id1==_outgoing2[ix])) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); return imode; } void PScalarVectorVectorDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_coupling,1/GeV) << _incoming << _outgoing1 << _outgoing2 << _maxweight; } void PScalarVectorVectorDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_coupling,1/GeV) >> _incoming >> _outgoing1 >> _outgoing2 >> _maxweight; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPScalarVectorVectorDecayer("Herwig::PScalarVectorVectorDecayer", "HwSMDecay.so"); void PScalarVectorVectorDecayer::Init() { static ClassDocumentation documentation ("The PScalarVectorVectorDecayer class is designed for" " the decay of a pseduoscalar meson to two spin-1 particles."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PScalarVectorVectorDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming1 ("FirstOutgoing", "The PDG code for the first outgoing particle", &PScalarVectorVectorDecayer::_outgoing1, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming2 ("SecondOutgoing", "The PDG code for the second outgoing particle", &PScalarVectorVectorDecayer::_outgoing2, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &PScalarVectorVectorDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 10000/GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &PScalarVectorVectorDecayer::_maxweight, 0, 0, 0, 0., 200., false, false, true); } double PScalarVectorVectorDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin1,PDT::Spin1))); bool photon[2]={false,false}; for(unsigned int ix=0;ix<2;++ix) photon[ix] = decay[ix]->id()==ParticleID::gamma; if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::constructSpinInfo(_vectors[ix],decay[ix], outgoing,true,photon[ix]); return 0.; } for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction:: calculateWaveFunctions(_vectors[ix],decay[ix],outgoing,photon[ix]); // now compute the matrix element InvEnergy2 fact(_coupling[imode()]/inpart.mass()); unsigned int ix,iy; for(ix=0;ix<3;++ix) { for(iy=0;iy<3;++iy) { - (*ME())(0,ix,iy)=fact*epsilon(_vectors[0][ix],decay[1]->momentum(), - _vectors[1][iy]) - *decay[0]->momentum(); + (*ME())(0,ix,iy)=Complex(fact*epsilon(_vectors[0][ix],decay[1]->momentum(), + _vectors[1][iy]) + *decay[0]->momentum()); } } // test of the matrix element // double test = 2.*sqr(fact*inpart.mass())* // sqr(Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(),decay[1]->mass())); // double me = newME.contract(rhoin).real(); // cerr << "testing the matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << (me-test)/(me+test) << "\n"; return ME()->contract(_rho).real(); } // specify the 1-2 matrix element to be used in the running width calculation bool PScalarVectorVectorDecayer::twoBodyMEcode(const DecayMode & dm, int & itype, double & coupling) const { int imode(-1); int id(dm.parent()->id()); ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id());++pit; int id2((**pit).id()); unsigned int ix(0); do { if(_incoming[ix]==id) { if((id1==_outgoing1[ix]&&id2==_outgoing2[ix])|| (id2==_outgoing1[ix]&&id1==_outgoing2[ix])) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); coupling=_coupling[imode]*dm.parent()->mass(); itype = 3; return id1==_outgoing1[imode]&&id2==_outgoing2[imode]; } // output the setup info for the particle database void PScalarVectorVectorDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "newdef " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "insert " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/ScalarMesonFactorizedDecayer.cc b/Decay/ScalarMeson/ScalarMesonFactorizedDecayer.cc --- a/Decay/ScalarMeson/ScalarMesonFactorizedDecayer.cc +++ b/Decay/ScalarMeson/ScalarMesonFactorizedDecayer.cc @@ -1,753 +1,753 @@ // -*- C++ -*- // // ScalarMesonFactorizedDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ScalarMesonFactorizedDecayer class. // #include "ScalarMesonFactorizedDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/RefVector.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/epsilon.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; ScalarMesonFactorizedDecayer::ScalarMesonFactorizedDecayer() // default values of the couplings (taken from ZPC34, 103) : _a1b(1.10), _a2b(-0.24), _a1c(1.30), _a2c(-0.55) { // intermediates generateIntermediates(true); } void ScalarMesonFactorizedDecayer::rebind(const TranslationMap & trans) { _ckm = trans.translate(_ckm); DecayIntegrator::rebind(trans); } IVector ScalarMesonFactorizedDecayer::getReferences() { IVector ret = DecayIntegrator::getReferences(); ret.push_back(_ckm); return ret; } void ScalarMesonFactorizedDecayer::doinit() { DecayIntegrator::doinit(); // get the ckm object _ckm=dynamic_ptr_cast::pointer>(SM().CKM()); if(!_ckm) throw InitException() << "ScalarMesonFactorizedDecayer::doinit() " << "the CKM object must be the Herwig one" << Exception::runerror; unsigned int ix,iy,iz,icurr,iform; // get the CKM matrix (unsquared for interference) Complex ckmmat[3][3]; vector< vector > CKM(_ckm->getUnsquaredMatrix(SM().families())); for(ix=0;ix<3;++ix){for(iy=0;iy<3;++iy){ckmmat[ix][iy]=CKM[ix][iy];}} int id0,id1,Wcharge,iq,ia,jspin,spect,inq,outq; // make sure the currents and form factors got initialised for(ix=0;ix<_current.size();++ix) _current[ix]->init(); for(ix=0;ix<_form.size();++ix) _form[ix]->init(); // find all the possible modes vector tformmap[2],tcurrmap[2]; vector inquark,outquark,currq,curra; vector particles; tPDVector extpart,ptemp; Energy min,minb; // loop over the modes in the form factors and currents for(iform=0;iform<_form.size();++iform) { for(ix=0;ix<_form[iform]->numberOfFactors();++ix) { // particles from the form-factor extpart.resize(2); _form[iform]->particleID(ix,id0,id1); _form[iform]->formFactorInfo(ix,jspin,spect,inq,outq); // particles from the form factor extpart[0]=getParticleData(id0); extpart[1]=getParticleData(id1); // charge of the decay products Wcharge =extpart[0]->iCharge()-extpart[1]->iCharge(); // max mass for the particles in the current min = extpart[0]->massMax()-extpart[1]->massMin(); for(icurr=0;icurr<_current.size();++icurr) { for(iy=0;iy<_current[icurr]->numberOfModes();++iy) { extpart.resize(2); // get the particles from the current _current[icurr]->decayModeInfo(iy,iq,ia); ptemp=_current[icurr]->particles(Wcharge,iy,iq,ia); minb=ZERO; for(iz=0;izmassMin(); } // add this mode to the list if(extpart.size()>2&&minb0&&inq%2!=iq%2)|| (inq<0&&abs(inq)%2!=abs(ia)%2))))) { tformmap[0].push_back(iform);tformmap[1].push_back(ix); tcurrmap[0].push_back(icurr);tcurrmap[1].push_back(iy); particles.push_back(extpart); inquark.push_back(inq);outquark.push_back(outq); currq.push_back(iq);curra.push_back(ia); } // if the meson in the current is neutral try the CC mode if(Wcharge==0&&iq!=-ia&&((inq>0&&inq%2!=iq%2)|| (inq<0&&abs(inq)%2!=abs(ia)%2))) { extpart.resize(2); // get the particles from the current ptemp=_current[icurr]->particles(Wcharge,iy,-ia,-iq); minb=ZERO; for(iz=0;izmassMin(); } if(extpart.size()>2&&minb modecc; vector modeloc,tformpart,ttform[2],ttcurr[2]; vector tCKM; Complex ckm; DecayPhaseSpaceModePtr mode; DecayPhaseSpaceChannelPtr channel; bool done; int id,idbar; double maxweight; vector channelwgts; unsigned int isize;double ort(sqrt(0.5)); vector::iterator start,end; for(ix=0;ix3 && !modeloc.empty() ) break; // create the mode and set the particles as for the first instance mode=new_ptr(DecayPhaseSpaceMode(particles[ix],this)); channel = new_ptr(DecayPhaseSpaceChannel(mode)); channel->addIntermediate(particles[ix][0],0,0.0,1,-1); min = particles[ix][0]->massMax()-particles[ix][1]->massMin(); Wcharge = particles[ix][0]->iCharge()-particles[ix][1]->iCharge(); done=_current[tcurrmap[0][ix]]->createMode(Wcharge,tcurrmap[1][ix], mode,2,1,channel,min); if(!done) throw InitException() << "Failed to construct mode in " << "ScalarMesonFactorizedDecayer::doinit()." << Exception::abortnow; // set the parameters for the additional modes ttform[0].clear();ttform[1].clear(); ttcurr[0].clear();ttcurr[1].clear(); ttform[0].push_back(tformmap[0][ix]);ttform[1].push_back(tformmap[1][ix]); ttcurr[0].push_back(tcurrmap[0][ix]);ttcurr[1].push_back(tcurrmap[1][ix]); tformpart.clear();tformpart.push_back(0); id=particles[ix][1]->id(); idbar = particles[ix][1]->CC() ? particles[ix][1]->CC()->id() : id; for(iy=0;iyid()==idbar)|| (!modecc[iy]&&particles[modeloc[iy]][iz]->id()==id)) tformpart.push_back(iz-1); ++iz; } while(tformpart.size()!=iy+2&&iz<3); } // calculate ckm factors tCKM.clear(); for(iy=0;iyparticleID(ttform[1][iy],id0,id1); Wcharge = getParticleData(id0)->iCharge()-getParticleData(id1)->iCharge(); ckm=1.; if(Wcharge!=0) { ckm=1.; if(abs(iq)%2==0) ckm *= conj(ckmmat[abs(iq)/2-1][(abs(ia)-1)/2]); else ckm *= conj(ckmmat[abs(ia)/2-1][(abs(iq)-1)/2]); if(abs(inq)%2==0) ckm *= ckmmat[abs(inq)/2-1][(abs(outq)-1)/2]; else ckm *= ckmmat[abs(outq)/2-1][(abs(inq)-1)/2]; if(abs(inq)==5) ckm*=_a1b; else ckm*=_a1c; } else { ckm=1.; if(inq>0) { if(abs(inq)%2==0) ckm *= ckmmat[abs(inq)/2-1][(abs(iq)-1)/2]; else ckm *= ckmmat[abs(iq)/2-1][(abs(inq)-1)/2]; if(abs(outq)%2==0) ckm *= conj(ckmmat[abs(outq)/2-1][(abs(ia)-1)/2]); else ckm *= conj(ckmmat[abs(ia)/2-1][(abs(outq)-1)/2]); } else { if(abs(inq)%2==0) ckm *= ckmmat[abs(inq)/2-1][(abs(ia)-1)/2]; else ckm *= ckmmat[abs(ia)/2-1][(abs(inq)-1)/2]; if(abs(outq)%2==0) ckm *= conj(ckmmat[abs(outq)/2-1][(abs(iq)-1)/2]); else ckm *= conj(ckmmat[abs(iq)/2-1][(abs(outq)-1)/2]); } if(abs(inq)==5) ckm*=_a2b; else ckm*=_a2c; } if((abs(inq)%2==0&&inq<0)||(abs(inq)%2!=0&&inq>0)){ckm=conj(ckm);} tCKM.push_back(ckm); } // special if the particles are idential add additional modes and // identical particle factors if(particles[ix][1]->id()==particles[ix][2]->id()&&particles[ix].size()==3) { isize=ttcurr[0].size(); for(iy=0;iynumberModes()){maxweight=_wgtmax[numberModes()];} else{maxweight=0.;} // the weights for the channel if(_wgtloc.size()>numberModes()&& _wgtloc[numberModes()]+mode->numberChannels()<=_weights.size()) { start=_weights.begin()+_wgtloc[numberModes()]; end = start+mode->numberChannels(); channelwgts=vector(start,end); } else { channelwgts.resize(mode->numberChannels(),1./(mode->numberChannels())); } // don't need channels for two body decays if(particles[ix].size()==3) { channelwgts.clear(); mode=new_ptr(DecayPhaseSpaceMode(particles[ix],this)); } addMode(mode,maxweight,channelwgts); // resize the duplicate modes to remove them for(iy=0;iyinitrun(); for(ix=0;ix<_form.size();++ix) _form[ix]->initrun(); DecayIntegrator::doinitrun(); if(initialize()) { _weights.clear(); _wgtloc.clear(); _wgtmax.clear(); for(ix=0;ixmaxWeight()); _wgtloc.push_back(_weights.size()); for(iy=0;iynumberChannels();++iy) { _weights.push_back(mode(ix)->channelWeight(iy)); } } } } bool ScalarMesonFactorizedDecayer::accept(tcPDPtr parent, const tPDVector & children) const { // N.B. this is a necessary but not sufficient test bool allowed(false),dummy; // find the ids of the particles tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); vector ids,idcurr; int id(parent->id()); for( ; pit!=pend;++pit) ids.push_back((**pit).id()); // loop over the possible particles in the formfactor unsigned int ipart(0),iform,icurr,ix; do { idcurr.clear(); for(ix=0;ixformFactorNumber(id,ids[ipart],dummy)>=0) { // check if possible from the current icurr=0; do { allowed=_current[icurr]->accept(idcurr); ++icurr; } while(!allowed&&icurr<_current.size()); } ++iform; } while(!allowed&&iform<_form.size()); ++ipart; } while(!allowed&&ipartid()),id0bar(id0); if(parent->CC()){id0bar=parent->CC()->id();} // of the products vector ids,idbars; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ;pit!=pend;++pit) { ids.push_back((**pit).id()); if((**pit).CC()) idbars.push_back((**pit).CC()->id()); else idbars.push_back(ids.back()); } // loop over the modes vector done(ids.size(),false); unsigned int nfound,ix,iy,iz; int idtemp; bool found; cc=false; ix=0; do { // particle mode if(id0==mode(ix)->externalParticles(0)->id()&& ids.size()+1==mode(ix)->numberofParticles()) { nfound=0; for(iy=0;iyexternalParticles(iy+1)->id(); iz=0;found=false; do{if(idtemp==ids[iz]&&!done[iz]){done[iz]=true;found=true;}++iz;} while(izexternalParticles(0)->id()&& ids.size()+1==mode(ix)->numberofParticles()) { nfound=0; for(iy=0;iyexternalParticles(iy+1)->id(); iz=0;found=false; do { if(idtemp==idbars[iz]&&!done[iz]) { done[iz]=true; found=true; } ++iz; } while(izPDGName() + "->"; for(unsigned int ix=0;ixPDGName() +","; throw DecayIntegratorError() << "Unable to find the mode " << mode << " in " << name() << " ScalarMesonFactorizedDecayer::decay()" << Exception::abortnow; } return imode; } void ScalarMesonFactorizedDecayer::persistentOutput(PersistentOStream & os) const { os << _current << _form << _ckm << _a1b << _a2b << _a1c << _a2c << _currentmapA << _currentmapB << _formmapA << _formmapB << _formpart << _wgtloc << _wgtmax << _weights << _CKMfact ; } void ScalarMesonFactorizedDecayer::persistentInput(PersistentIStream & is, int) { is >> _current >> _form >> _ckm >> _a1b >> _a2b >> _a1c >> _a2c >> _currentmapA >> _currentmapB >> _formmapA >> _formmapB >> _formpart >> _wgtloc >> _wgtmax >> _weights >> _CKMfact; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigScalarMesonFactorizedDecayer("Herwig::ScalarMesonFactorizedDecayer", "HwSMDecay.so"); void ScalarMesonFactorizedDecayer::Init() { static ClassDocumentation documentation ("The ScalarMesonFactorizedDecayer class is designed for the weak decay of" " scalar mesons using the factorization approximation."); static RefVector interfaceCurrents ("Currents", "A vector of references to the currents", &ScalarMesonFactorizedDecayer::_current, -1, false, false, true, false, false); static RefVector interfaceFormFactors ("FormFactors", "A vector of references to the form-factors", &ScalarMesonFactorizedDecayer::_form, -1, false, false, true, false, false); static Parameter interfacea1Bottom ("a1Bottom", "The factorization paramter a_1 for decays of bottom baryons", &ScalarMesonFactorizedDecayer::_a1b, 1.1, -10.0, 10.0, false, false, true); static Parameter interfacea2Bottom ("a2Bottom", "The factorization paramter a_2 for decays of bottom baryons", &ScalarMesonFactorizedDecayer::_a2b, -0.24, -10.0, 10.0, false, false, true); static Parameter interfacea1Charm ("a1Charm", "The factorization paramter a_1 for decays of charm baryons", &ScalarMesonFactorizedDecayer::_a1c, 1.3, -10.0, 10.0, false, false, true); static Parameter interfacea2Charm ("a2Charm", "The factorization paramter a_2 for decays of charm baryons", &ScalarMesonFactorizedDecayer::_a2c, -0.55, -10.0, 10.0, false, false, true); static ParVector interfaceWeightLocation ("WeightLocation", "The locations of the weights for a given channel in the vector", &ScalarMesonFactorizedDecayer::_wgtloc, 0, 0, 0, 0, 10000, false, false, true); static ParVector interfaceWeightMax ("MaximumWeight", "The maximum weight for a given channel.", &ScalarMesonFactorizedDecayer::_wgtmax, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceWeights ("Weights", "The weights for the integration.", &ScalarMesonFactorizedDecayer::_weights, 0, 0, 0, 0., 1., false, false, true); } double ScalarMesonFactorizedDecayer::me2(const int ichan, const Particle & part, const ParticleVector & decay, MEOption meopt) const { if(!ME()) { // create the matrix element vector spin; for(unsigned int ix=0;ixdataPtr()->iSpin()); ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,spin))); } // initialisation if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&part),incoming); _vectors.resize(decay.size()); _tensors.resize(decay.size()); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&part), incoming,true); // get the wavefunctions of the decay products for(unsigned int ix=0;ixdataPtr()->iSpin()) { case 1: ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true); break; case 3: VectorWaveFunction::constructSpinInfo(_vectors[ix],decay[ix],outgoing, true,false); break; case 5: TensorWaveFunction::constructSpinInfo(_tensors[ix],decay[ix],outgoing, true,false); break; default: assert(false); } } return 0.; } // get the wavefunctions of the decay products for(unsigned int ix=0;ixdataPtr()->iSpin()) { case 1: break; case 3: VectorWaveFunction:: calculateWaveFunctions(_vectors[ix],decay[ix],outgoing,false); break; case 5: TensorWaveFunction:: calculateWaveFunctions(_tensors[ix],decay[ix],outgoing,false); break; default: assert(false); } } ME()->zero(); // find the mode unsigned int mode(imode()),chel,fhel; int id0(part.id()),id1; Complex ii(0.,1.); vector ihel(decay.size()); // loop over the different diagrams vector form; Complex fp,f0,A0,A1,A2,A3,V,k; complex h,bp,bm; // complex dot; Lorentz5Momentum q,sum; Energy2 q2; Energy MP(part.mass()),MV,msum,mdiff,scale; LorentzPolarizationVectorE dotv; double pre; ParticleVector cpart; for(unsigned int iy=0;iy<_CKMfact[mode].size();++iy) { MV=decay[_formpart[mode][iy]]->mass(); id1=decay[_formpart[mode][iy]]->id(); int id0t,id1t; _form[_formmapA[mode][iy]]->particleID(_formmapB[mode][iy],id0t,id1t); bool cc(id0t!=id0); // calculate the form-factor part form.clear(); q = part.momentum()-decay[_formpart[mode][iy]]->momentum(); q.rescaleMass(); sum = part.momentum()+decay[_formpart[mode][iy]]->momentum();sum.rescaleMass(); q2=q.mass2(); if(decay[_formpart[mode][iy]]->dataPtr()->iSpin()==1) { _form[_formmapA[mode][iy]]->ScalarScalarFormFactor(q2,_formmapB[mode][iy], id0,id1,MP,MV,f0,fp); pre=(MP*MP-MV*MV)/q2; form.push_back(fp*sum+pre*(f0-fp)*q); } else if(decay[_formpart[mode][iy]]->dataPtr()->iSpin()==3) { msum=MP+MV;mdiff=MP-MV; _form[_formmapA[mode][iy]]->ScalarVectorFormFactor(q2,_formmapB[mode][iy],id0, id1,MP,MV,A0,A1,A2,V); if(cc){V=-V;} - A3 = 0.5/MV*(msum*A1-mdiff*A2); + A3 = Complex(0.5/MV*(msum*A1-mdiff*A2)); // compute the hadron currents for(unsigned int ix=0;ix<3;++ix) { // dot product complex dot = _vectors[_formpart[mode][iy]][ix]*part.momentum(); // current form.push_back(-ii*msum*A1*_vectors[_formpart[mode][iy]][ix] +ii*A2/msum*dot*sum +2.*ii*MV/q2*(A3-A0)*dot*q +2.*V/msum*epsilon(_vectors[_formpart[mode][iy]][ix], part.momentum(), decay[_formpart[mode][iy]]->momentum())); } } else if(decay[_formpart[mode][iy]]->dataPtr()->iSpin()==5) { _form[_formmapA[mode][iy]]->ScalarTensorFormFactor(q2,_formmapB[mode][iy], id0,id1,MP,MV,h,k,bp,bm); if(cc){h=-h;} // compute the hadron currents for(unsigned int ix=0;ix<5;++ix) { dotv = _tensors[_formpart[mode][iy]][ix]*part.momentum(); complex dot = dotv*part.momentum(); form.push_back(ii*h*epsilon(dotv,sum,q)-k*dotv -bp*dot*sum-bm*dot*q); } } // find the particles for the current cpart.clear(); for(unsigned int ix=0;ix constants(decay.size()+1),ihel(decay.size()+1); int itemp(1); do { --ix; if(ix!=_formpart[mode][iy]) { itemp*=decay[ix]->data().iSpin(); constants[ix]=itemp; } } while(ix!=0); constants[decay.size()]=1; if(_formpart[mode][iy]!=decay.size()) constants[_formpart[mode][iy]]=constants[_formpart[mode][iy]+1]; // calculate the current vector curr=_current[_currentmapA[mode][iy]]-> current(_currentmapB[mode][iy],ichan,scale,cpart,meopt); pre = (pow(part.mass()/scale,int(cpart.size()-2))); // loop over the helicities to calculate the matrix element ihel[0]=0; for(chel=0;chel0;--ix) { if(ix!=_formpart[mode][iy]+1) ihel[ix]=(chel%constants[ix-1])/constants[ix]; } for(fhel=0;fhelcontract(_rho)).real(); } void ScalarMesonFactorizedDecayer::findModes(unsigned int imode, vector & particles, vector & loc, vector & cc) { unsigned int ix,iy,nfound,iz; // resize the vectors loc.clear();cc.clear(); // get the id's for the mode vector id,idbar; int idtemp; bool found; for(ix=0;ixid()); if(particles[imode][ix]->CC()) idbar.push_back(particles[imode][ix]->CC()->id()); else idbar.push_back(id[ix]); } vector done(id.size(),false); // loop over the modes for(ix=0;ixid()==id[0]&&particles[ix].size()==id.size()) { nfound=1; for(iy=0;iyid(); iz=1; found=false; do { if(idtemp==id[iz]&&!done[iz]) { done[iz]=true; found=true; } ++iz; } while(izid()==idbar[0]&&particles[ix].size()==idbar.size()) { nfound=1; for(iy=0;iyid(); iz=1; found=false; do { if(idtemp==idbar[iz]&&!done[iz]) { done[iz]=true; found=true; } ++iz; } while(izdataBaseOutput(output,false,true); output << "insert " << name() << ":Currents " << ix << " " << _current[ix]->name() << " \n"; } for(ix=0;ix<_form.size();++ix) { _form[ix]->dataBaseOutput(output,false,true); output << "insert " << name() << ":FormFactors " << ix << " " << _form[ix]->name() << " \n"; } for(ix=0;ix<_wgtloc.size();++ix) { output << "insert " << name() << ":WeightLocation " << ix << " " << _wgtloc[ix] << "\n"; } for(ix=0;ix<_wgtmax.size();++ix) { output << "insert " << name() << ":MaximumWeight " << ix << " " << _wgtmax[ix] << "\n"; } for(ix=0;ix<_weights.size();++ix) { output << "insert " << name() << ":Weights " << ix << " " << _weights[ix] << "\n"; } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/ScalarMesonTensorScalarDecayer.cc b/Decay/ScalarMeson/ScalarMesonTensorScalarDecayer.cc --- a/Decay/ScalarMeson/ScalarMesonTensorScalarDecayer.cc +++ b/Decay/ScalarMeson/ScalarMesonTensorScalarDecayer.cc @@ -1,278 +1,278 @@ // -*- C++ -*- // // ScalarMesonTensorScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ScalarMesonTensorScalarDecayer class. // #include "ScalarMesonTensorScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void ScalarMesonTensorScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } ScalarMesonTensorScalarDecayer::ScalarMesonTensorScalarDecayer() : _incoming(3), _outgoingT(3), _outgoingS(3), _coupling(3), _maxweight(3) { // D+ -> f_2 pi _incoming[0] = 411; _outgoingT[0] = 225; _outgoingS[0] = 211; _coupling[0] = 8.23E-7/GeV; _maxweight[0] = 5; // chi_c0 -> K*_0 K*_2 _incoming[1] = 10441; _outgoingT[1] = 325; _outgoingS[1] = -10321; _coupling[1] = 0.0217/GeV; _maxweight[1] = 5; _incoming[2] = 10441; _outgoingT[2] = 315; _outgoingS[2] = -10311; _coupling[2] = 0.0217/GeV; _maxweight[2] = 5; // initial size of the arrays _initsize=_incoming.size(); // intermediates generateIntermediates(false); } void ScalarMesonTensorScalarDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters arew consistent unsigned int isize=_coupling.size(); if(isize!=_incoming.size() || isize!=_outgoingT.size()|| isize!=_outgoingS.size() || isize!=_maxweight.size()) throw InitException() << "Inconsistent parameters in " << "ScalarMesonTensorScalarDecayer" << Exception::abortnow; // set up the integration channels vector wgt; DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoingT[ix]); extpart[2] = getParticleData(_outgoingS[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int ScalarMesonTensorScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id0(parent->id()); int id0bar = parent->CC() ? parent->CC()->id() : id0; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; unsigned int ix(0); int imode(-1); do { if(id0 ==_incoming[ix]) { if((id1 ==_outgoingT[ix]&&id2 ==_outgoingS[ix])|| (id2 ==_outgoingT[ix]&&id1 ==_outgoingS[ix])) { imode=ix; cc=false; } } if(id0bar==_incoming[ix]&&imode<0) { if((id1bar==_outgoingT[ix]&&id2bar==_outgoingS[ix])|| (id2bar==_outgoingT[ix]&&id1bar==_outgoingS[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void ScalarMesonTensorScalarDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_coupling,1/GeV) << _incoming << _outgoingT << _outgoingS << _maxweight; } void ScalarMesonTensorScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_coupling,1/GeV) >> _incoming >> _outgoingT >> _outgoingS >> _maxweight; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigScalarMesonTensorScalarDecayer("Herwig::ScalarMesonTensorScalarDecayer", "HwSMDecay.so"); void ScalarMesonTensorScalarDecayer::Init() { static ClassDocumentation documentation ("The ScalarMesonTensorScalarDecayer class is designed for" " the decay of a pseduoscalar meson to two spin-1 particles."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &ScalarMesonTensorScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingT ("OutgoingTensor", "The PDG code for the outgoing tensor", &ScalarMesonTensorScalarDecayer::_outgoingT, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingS ("OutgoingScalar", "The PDG code for the outgoing scalar", &ScalarMesonTensorScalarDecayer::_outgoingS, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &ScalarMesonTensorScalarDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 100./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &ScalarMesonTensorScalarDecayer::_maxweight, 0, 0, 0, 0., 100., false, false, true); } double ScalarMesonTensorScalarDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin2,PDT::Spin0))); if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); TensorWaveFunction::constructSpinInfo(_tensors,decay[0], outgoing,true,false); ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true); return 0.; } TensorWaveFunction:: calculateWaveFunctions(_tensors,decay[0],outgoing,false); // calculate the matrix element InvEnergy2 fact(_coupling[imode()]/inpart.mass()); LorentzPolarizationVectorE vtemp; for(unsigned int ix=0;ix<5;++ix) { vtemp = _tensors[ix]*inpart.momentum(); - (*ME())(0,ix,0) = fact * decay[1]->momentum().dot(vtemp); + (*ME())(0,ix,0) = Complex(fact * decay[1]->momentum().dot(vtemp)); } // test of the matrix element // double me=newME.contract(rhoin).real(); // Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = 2.*pow<4,1>(pcm)*sqr(_coupling[imode()]*inpart.mass())/ // 3./pow<4,1>(decay[0]->mass()); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << (me-test)/(me+test) << "\n"; // output the answer return ME()->contract(_rho).real(); } // specify the 1-2 matrix element to be used in the running width calculation bool ScalarMesonTensorScalarDecayer::twoBodyMEcode(const DecayMode & dm, int & itype, double & coupling) const { int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(false); int imode(-1); do { if(id ==_incoming[ix]) { if(id1==_outgoingT[ix]&&id2==_outgoingS[ix]) { imode=ix; order=true; } if(id2==_outgoingT[ix]&&id1==_outgoingS[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingT[ix]&&id2bar==_outgoingS[ix]) { imode=ix; order=true; } if(id2bar==_outgoingT[ix]&&id1bar==_outgoingS[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling=_coupling[imode]*dm.parent()->mass(); itype = 11; return order; } // output the setup information for the particle database void ScalarMesonTensorScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingTensor " << ix << " " << _outgoingT[ix] << "\n"; output << "newdef " << name() << ":OutgoingScalar " << ix << " " << _outgoingS[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingTensor " << ix << " " << _outgoingT[ix] << "\n"; output << "insert " << name() << ":OutgoingScalar " << ix << " " << _outgoingS[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/ScalarMeson/ScalarVectorVectorDecayer.cc b/Decay/ScalarMeson/ScalarVectorVectorDecayer.cc --- a/Decay/ScalarMeson/ScalarVectorVectorDecayer.cc +++ b/Decay/ScalarMeson/ScalarVectorVectorDecayer.cc @@ -1,281 +1,281 @@ // -*- C++ -*- // // ScalarVectorVectorDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ScalarVectorVectorDecayer class. // #include "ScalarVectorVectorDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Utilities/Kinematics.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void ScalarVectorVectorDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } ScalarVectorVectorDecayer::ScalarVectorVectorDecayer() : _incoming(13), _outgoing1(13), _outgoing2(13), _coupling(13), _maxweight(13) { // f_0(1370) to rho rho _incoming[0] = 10221; _outgoing1[0] = 113; _outgoing2[0] = 113; _coupling[0] = 11.26/GeV; _maxweight[0] = 20.; _incoming[1] = 10221; _outgoing1[1] = 213; _outgoing2[1] = -213; _coupling[1] = 15.92/GeV; _maxweight[1] = 20.; // f_0(1500) to rho rho _incoming[2] = 9030221; _outgoing1[2] = 113; _outgoing2[2] = 113; _coupling[2] = 1.691/GeV; _maxweight[2] = 20.; _incoming[3] = 9030221; _outgoing1[3] = 213; _outgoing2[3] = -213; _coupling[3] = 2.391/GeV; _maxweight[3] = 20.; // chi_c0 decays _incoming[4] = 10441; _outgoing1[4] = 443; _outgoing2[4] = 22; _coupling[4] = 0.251/GeV; _maxweight[4] = 1.; _incoming[5] = 10441; _outgoing1[5] = 323; _outgoing2[5] = -323; _coupling[5] = 0.0088/GeV; _maxweight[5] = 1.; _incoming[6] = 10441; _outgoing1[6] = 313; _outgoing2[6] = -313; _coupling[6] = 0.0088/GeV; _maxweight[6] = 1.; _incoming[7] = 10441; _outgoing1[7] = 333; _outgoing2[7] = 333; _coupling[7] = 0.0067/GeV; _maxweight[7] = 1.; _incoming[8] = 10441; _outgoing1[8] = 22; _outgoing2[8] = 22; _coupling[8] = 0.0027/GeV; _maxweight[8] = 1.; _incoming[12] = 10441; _outgoing1[12] = 223; _outgoing2[12] = 223; _coupling[12] = 0.0093/GeV; _maxweight[12] = 1.; // a'_0 -> omega rho _incoming[9] = 10111; _outgoing1[9] = 113; _outgoing2[9] = 223; _coupling[9] = 27.09/GeV; _maxweight[9] = 20.; _incoming[10] = 10211; _outgoing1[10] = 213; _outgoing2[10] = 223; _coupling[10] = 27.09/GeV; _maxweight[10] = 20.; _incoming[11] =-10211; _outgoing1[11] =-213; _outgoing2[11] = 223; _coupling[11] = 27.09/GeV; _maxweight[11] = 20.; // size of arrays _initsize = _incoming.size(); // intermediates generateIntermediates(false); } void ScalarVectorVectorDecayer::doinit() { DecayIntegrator::doinit(); // check the parameters arew consistent unsigned int isize(_coupling.size()); if(isize!=_incoming.size() || isize!=_outgoing1.size()|| isize!=_outgoing2.size() || isize!=_maxweight.size()) throw InitException() << "Inconsistent parameters in " << "ScalarVectorVectorDecayerDecayer" << Exception::abortnow; // set up the integration channels vector wgt; DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoing1[ix]); extpart[2] = getParticleData(_outgoing2[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int ScalarVectorVectorDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { cc = false; // check that at least some modes exist // must be two outgoing particles if(_incoming.size()==0||children.size()!=2) return -1; // ids of the particles int id0(parent->id()); int id1(children[0]->id()); int id2(children[1]->id()); // loop over the modes and see if this is one of them unsigned int ix=0; int imode(-1); do { if(_incoming[ix]==id0) { if((_outgoing1[ix]==id1&&_outgoing2[ix]==id2)|| (_outgoing1[ix]==id2&&_outgoing2[ix]==id1)) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); return imode; } void ScalarVectorVectorDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_coupling,1/GeV) << _incoming << _outgoing1 << _outgoing2 << _maxweight; } void ScalarVectorVectorDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_coupling,1/GeV) >> _incoming >> _outgoing1 >> _outgoing2 >> _maxweight; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigScalarVectorVectorDecayer("Herwig::ScalarVectorVectorDecayer", "HwSMDecay.so"); void ScalarVectorVectorDecayer::Init() { static ClassDocumentation documentation ("The ScalarVectorVectorDecayer class is designed for" " the decay of a pseduoscalar meson to two spin-1 particles."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &ScalarVectorVectorDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming1 ("FirstOutgoing", "The PDG code for the first outgoing particle", &ScalarVectorVectorDecayer::_outgoing1, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming2 ("SecondOutgoing", "The PDG code for the second outgoing particle", &ScalarVectorVectorDecayer::_outgoing2, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &ScalarVectorVectorDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 10000/GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &ScalarVectorVectorDecayer::_maxweight, 0, 0, 0, 0., 500000., false, false, true); } double ScalarVectorVectorDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin1,PDT::Spin1))); bool photon[2]={false,false}; for(unsigned int ix=0;ix<2;++ix) photon[ix] = decay[ix]->id()==ParticleID::gamma; if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::constructSpinInfo(_vectors[ix],decay[ix], outgoing,true,photon[ix]); return 0.; } for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction:: calculateWaveFunctions(_vectors[ix],decay[ix],outgoing,photon[ix]); // now compute the matrix element InvEnergy2 fact(_coupling[imode()]/inpart.mass()); Energy2 p1p2(decay[0]->momentum()*decay[1]->momentum()); unsigned int ix,iy; for(ix=0;ix<3;++ix) { for(iy=0;iy<3;++iy) { - (*ME())(0,ix,iy)=fact*(p1p2*_vectors[0][ix].dot(_vectors[1][iy])- - (_vectors[1][iy]*decay[0]->momentum())* - (_vectors[0][ix]*decay[1]->momentum())); + (*ME())(0,ix,iy)=Complex(fact*(p1p2*_vectors[0][ix].dot(_vectors[1][iy])- + (_vectors[1][iy]*decay[0]->momentum())* + (_vectors[0][ix]*decay[1]->momentum()))); } } // test of the matrix element // double me = newME.contract(rhoin).real(); // Energy pcm=Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = sqr(_coupling[imode()]/inpart.mass())* // (2.*sqr(pcm*inpart.mass())+3.*sqr(decay[0]->mass()*decay[1]->mass())); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << "\n"; return ME()->contract(_rho).real(); } // output the setup info for the particle database void ScalarVectorVectorDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "newdef " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "insert " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } // specify the 1-2 matrix element to be used in the running width calculation bool ScalarVectorVectorDecayer::twoBodyMEcode(const DecayMode & dm, int & itype, double & coupling) const { int imode(-1); int id(dm.parent()->id()); ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id());++pit; int id2((**pit).id()); unsigned int ix(0); do { if(_incoming[ix]==id) { if((id1==_outgoing1[ix]&&id2==_outgoing2[ix])|| (id2==_outgoing1[ix]&&id1==_outgoing2[ix])) imode=ix; } ++ix; } while(imode<0&&ix<_incoming.size()); coupling=_coupling[imode]*dm.parent()->mass(); itype = 12; return id1==_outgoing1[imode]&&id2==_outgoing2[imode]; } diff --git a/Decay/ScalarMeson/SemiLeptonicScalarDecayer.cc b/Decay/ScalarMeson/SemiLeptonicScalarDecayer.cc --- a/Decay/ScalarMeson/SemiLeptonicScalarDecayer.cc +++ b/Decay/ScalarMeson/SemiLeptonicScalarDecayer.cc @@ -1,345 +1,345 @@ // -*- C++ -*- // // SemiLeptonicScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the SemiLeptonicScalarDecayer class. // #include "SemiLeptonicScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/LorentzPolarizationVector.h" #include "ThePEG/Helicity/epsilon.h" #include "ThePEG/Helicity/LorentzTensor.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; SemiLeptonicScalarDecayer::SemiLeptonicScalarDecayer() { // intermediates generateIntermediates(true); } void SemiLeptonicScalarDecayer::doinitrun() { _current->initrun(); _form->initrun(); DecayIntegrator::doinitrun(); if(initialize()) { _maxwgt.clear(); for(unsigned int ix=0;ixmaxWeight()); } } } void SemiLeptonicScalarDecayer::doinit() { DecayIntegrator::doinit(); // make sure the current got initialised _current->init(); // and the form factors _form->init(); // the channels tPDVector extpart,ptemp; _modemap.clear(); double maxweight; vector channelwgts(1,1.); int id0(0),id1(0),Wcharge(0); Energy min; DecayPhaseSpaceModePtr mode; DecayPhaseSpaceChannelPtr channel; int iq,ia; unsigned int ix,iy,iz; bool done; for(ix=0;ix<_form->numberOfFactors();++ix) { // get the external particles for this mode extpart.resize(2); _form->particleID(ix,id0,id1); extpart[0]=getParticleData(id0); extpart[1]=getParticleData(id1); _modemap.push_back(numberModes()); if(!extpart[0]||!extpart[1]) continue; Wcharge =(extpart[0]->iCharge()-extpart[1]->iCharge()); min = extpart[0]->mass()+extpart[0]->widthUpCut() -extpart[1]->mass()+extpart[1]->widthLoCut(); for(iy=0;iy<_current->numberOfModes();++iy) { extpart.resize(2); _current->decayModeInfo(iy,iq,ia); ptemp=_current->particles(Wcharge,iy,iq,ia); for(iz=0;izaddIntermediate(extpart[0],0,0.0,1,-1); done=_current->createMode(Wcharge,iy,mode,2,1,channel,min); if(done) { // the maximum weight if(_maxwgt.size()>numberModes()) maxweight=_maxwgt[numberModes()]; else maxweight=2.; channelwgts.resize(mode->numberChannels(), 1./(mode->numberChannels())); addMode(mode,maxweight,channelwgts); } } } } bool SemiLeptonicScalarDecayer::accept(tcPDPtr parent, const tPDVector & children) const { // find the non-lepton int imes(0),idtemp,idin(parent->id()); vector idother; bool dummy; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)>16) imes=idtemp; else idother.push_back(idtemp); } // check that the form factor exists if(_form->formFactorNumber(idin,imes,dummy)<0) return false; // and the current return _current->accept(idother); } int SemiLeptonicScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { // find the ids of the particles for the decay current tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); int idtemp,imes(0),idin(parent->id()); vector idother; cc=false; for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)>16) imes=idtemp; else idother.push_back(idtemp); } return _modemap[_form->formFactorNumber(idin,imes,cc)] +_current->decayMode(idother); } void SemiLeptonicScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _current << _form << _maxwgt << _modemap; } void SemiLeptonicScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _current >> _form >> _maxwgt >> _modemap; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSemiLeptonicScalarDecayer("Herwig::SemiLeptonicScalarDecayer", "HwSMDecay.so"); void SemiLeptonicScalarDecayer::Init() { static ClassDocumentation documentation ("The SemiLeptonicScalarDecayer class is designed for the" "semi-leptonic decay of a (pseudo)-scalar meson."); static Reference interfaceCurrent ("Current", "The current for the leptons produced in the decay.", &SemiLeptonicScalarDecayer::_current, true, true, true, false, false); static Reference interfaceFormFactor ("FormFactor", "The form factor", &SemiLeptonicScalarDecayer::_form, true, true, true, false, false); static ParVector interfaceMaximumWeight ("MaximumWeight", "The maximum weights for the decays", &SemiLeptonicScalarDecayer::_maxwgt, 0, 0, 0, 0, 100., false, false, true); } // combine the currents and form-factors to give the matrix element double SemiLeptonicScalarDecayer::me2(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { // get the information on the form-factor int jspin(0),id0(inpart.id()),id1(decay[0]->id()); bool cc(false); unsigned int iloc(_form->formFactorNumber(id0,id1,cc)); int spect,iq,ia; _form->formFactorInfo(iloc,jspin,spect,iq,ia); // extract leptons for the lepton current Energy scale; ParticleVector leptons; leptons.push_back(decay[decay.size()-2]); leptons.push_back(decay[decay.size()-1]); int mode=(abs(decay[1]->id())-11)/2; if(!ME()) { if(jspin==0) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin0,PDT::Spin1Half,PDT::Spin1Half))); else if(jspin==1) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin1,PDT::Spin1Half,PDT::Spin1Half))); else if(jspin==2) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin0,PDT::Spin2,PDT::Spin1Half,PDT::Spin1Half))); } // initialisation if(meopt==Initialize) { ScalarWaveFunction:: calculateWaveFunctions(_rho,const_ptr_cast(&inpart),incoming); // work out the mapping for the lepton vector _constants.resize(decay.size()+1); _ispin.resize(decay.size()); _imes=0; unsigned int itemp(1); for(int ix=int(decay.size()-1);ix>=0;--ix) { _ispin[ix]=decay[ix]->data().iSpin(); if(abs(decay[ix]->id())<=16) { itemp*=_ispin[ix]; _constants[ix]=itemp; } else _imes=ix; } _constants[decay.size()]=1; _constants[_imes]=_constants[_imes+1]; } if(meopt==Terminate) { // set up the spin information for the decay products ScalarWaveFunction::constructSpinInfo(const_ptr_cast(&inpart), incoming,true); if(jspin==0) ScalarWaveFunction:: constructSpinInfo(decay[0],outgoing,true); else if(jspin==1) VectorWaveFunction:: constructSpinInfo(_vectors,decay[0],outgoing,true,false); else if(jspin==2) TensorWaveFunction:: constructSpinInfo(_tensors,decay[0],outgoing,true,false); _current->current(mode,ichan,scale,leptons,meopt); return 0.; } // get the wavefunctions of the decay products switch(decay[0]->dataPtr()->iSpin()) { case 1: break; case 3: VectorWaveFunction:: calculateWaveFunctions(_vectors,decay[0],outgoing,false); break; case 5: TensorWaveFunction:: calculateWaveFunctions(_tensors,decay[0],outgoing,false); break; default: assert(false); } // work out the value of q and calculate the form factors Lorentz5Momentum q(inpart.momentum()-decay[0]->momentum()); q.rescaleMass(); Energy2 q2(q.mass2()); Lorentz5Momentum sum(inpart.momentum()+decay[0]->momentum()); // calculate the hadronic current for the decay Complex ii(0.,1.); vector hadron; if(jspin==0) { Complex fp,f0; _form->ScalarScalarFormFactor(q2,iloc,id0,id1,inpart.mass(),decay[0]->mass(), f0,fp); Complex pre((sqr(inpart.mass())-sqr(decay[0]->mass()))/q2*(f0-fp)); hadron.push_back(fp*sum+(pre*q)); } else if(jspin==1) { Complex A0,A1,A2,A3,V; complex dot; Energy MP(inpart.mass()),MV(decay[0]->mass()),msum(MP+MV),mdiff(MP-MV); _form->ScalarVectorFormFactor(q2,iloc,id0,id1,MP,MV,A0,A1,A2,V); - A3 = 0.5/MV*(msum*A1-mdiff*A2); + A3 = Complex(0.5/MV*(msum*A1-mdiff*A2)); if(cc) V*=-1.; // compute the hadron currents for(unsigned int ix=0;ix<3;++ix) { // dot product dot = _vectors[ix]*inpart.momentum(); // current hadron.push_back(-ii*msum*A1*_vectors[ix] +ii*A2/msum*dot*sum +2.*ii*MV/q2*(A3-A0)*dot*q +2.*V/msum*Helicity::epsilon(_vectors[ix],inpart.momentum(), decay[0]->momentum())); } } else if(jspin==2) { complex h,bp,bm; complex k; complex dot; _form->ScalarTensorFormFactor(q2,iloc,id0,id1,inpart.mass(),decay[0]->mass(), h,k,bp,bm); if(!cc) h*=-1.; LorentzPolarizationVectorE dotv; // compute the hadron currents for(unsigned int ix=0;ix<5;++ix) { dotv = _tensors[ix]*inpart.momentum(); dot = dotv*inpart.momentum(); hadron.push_back(ii*h*Helicity::epsilon(dotv,sum,q) -k*dotv-bp*dot*sum-bm*dot*q); } } // construct the lepton current vector lepton(_current->current(mode,ichan,scale,leptons,meopt)); // compute the matrix element vector ihel(decay.size()+1); for(unsigned int mhel=0;mhel0;--ix) { if(ix-1!=_imes) ihel[ix]=(lhel%_constants[ix-1])/_constants[ix]; } // helicities of mesons ihel[0]=0; ihel[_imes+1]=mhel; - (*ME())(ihel)= lepton[lhel].dot(hadron[mhel])*SM().fermiConstant(); + (*ME())(ihel) = Complex(lepton[lhel].dot(hadron[mhel])*SM().fermiConstant()); } } // store the matrix element double ckm(1.); if(iq<=6) { if(iq%2==0) ckm = SM().CKM(abs(iq)/2-1,(abs(ia)-1)/2); else ckm = SM().CKM(abs(ia)/2-1,(abs(iq)-1)/2); } // return the answer return 0.5*(ME()->contract(_rho)).real()*ckm; } // output the setup information for the particle database void SemiLeptonicScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; DecayIntegrator::dataBaseOutput(output,false); for(unsigned int ix=0;ix<_maxwgt.size();++ix) { output << "insert " << name() << ":MaximumWeight " << ix << " " << _maxwgt[ix] << "\n"; } _current->dataBaseOutput(output,false,true); output << "newdef " << name() << ":Current " << _current->name() << " \n"; _form->dataBaseOutput(output,false,true); output << "newdef " << name() << ":FormFactor " << _form->name() << " \n"; if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/Tau/TauDecayer.cc b/Decay/Tau/TauDecayer.cc --- a/Decay/Tau/TauDecayer.cc +++ b/Decay/Tau/TauDecayer.cc @@ -1,361 +1,360 @@ // -*- C++ -*- // // TauDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the TauDecayer class. // // Author: Peter Richardson // #include "TauDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Helicity/VectorSpinInfo.h" #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" #include "Herwig/Decay/DecayVertex.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" #include "ThePEG/Helicity/FermionSpinInfo.h" #include "ThePEG/StandardModel/StandardModelBase.h" using namespace Herwig; using namespace ThePEG::Helicity; void TauDecayer::doinit() { DecayIntegrator::doinit(); // make sure the current got initialised _current->init(); // set up the phase-space channels DecayPhaseSpaceModePtr mode; DecayPhaseSpaceChannelPtr channel; tPDVector extpart,ptemp; extpart.push_back(getParticleData(ParticleID::tauminus)); extpart.push_back(getParticleData(ParticleID::nu_tau)); Energy mtau(extpart[0]->mass()); double maxweight; vector channelwgts; int iq(0),ia(0); _modemap.clear(); unsigned int ix,iy; bool done; vector::iterator start,end; for(ix=0;ix<_current->numberOfModes();++ix) { // get the external particles for this mode extpart.resize(2); ptemp=_current->particles(-3,ix,iq,ia); for(iy=0;iyaddIntermediate(extpart[0],0,0.0,-1,1); done=_current->createMode(-3,ix,mode,2,1,channel,mtau); if(done) { // the maximum weight and the channel weights // the maximum maxweight = _wgtmax.size()>numberModes() ? _wgtmax[numberModes()] : 0; // the weights for the channel if(_wgtloc.size()>numberModes()&& _wgtloc[numberModes()]+mode->numberChannels()<=_weights.size()) { start=_weights.begin()+_wgtloc[numberModes()]; end = start+mode->numberChannels(); channelwgts=vector(start,end); } else { channelwgts.resize(mode->numberChannels(),1./(mode->numberChannels())); } _modemap.push_back(ix); // special for the two body modes if(extpart.size()==3) { channelwgts.clear(); mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); } addMode(mode,maxweight,channelwgts); } } _current->reset(); _current->touch(); _current->update(); } void TauDecayer::doinitrun() { _current->initrun(); DecayIntegrator::doinitrun(); if(initialize()) { _weights.clear();_wgtloc.clear();_wgtmax.clear(); unsigned int ix,iy; for(ix=0;ixmaxWeight()); _wgtloc.push_back(_weights.size()); for(iy=0;iynumberChannels();++iy) { _weights.push_back(mode(ix)->channelWeight(iy)); } } } } bool TauDecayer::accept(tcPDPtr parent, const tPDVector & children) const { bool allowed(false); // find the neutrino int idnu(0),idtemp,idin(parent->id()); vector idother; tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)==16) idnu=idtemp; else idother.push_back(idtemp); } if((idnu==ParticleID::nu_tau && idin==ParticleID::tauminus)|| (idnu==ParticleID::nu_taubar && idin==ParticleID::tauplus )) { allowed=_current->accept(idother); } return allowed; } int TauDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { int imode(-1); tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); int idtemp;vector idother; for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(abs(idtemp)!=16) idother.push_back(idtemp); } unsigned int itemp=_current->decayMode(idother); for(unsigned int ix=0;ix<_modemap.size();++ix) { if(_modemap[ix]==itemp) imode=ix; } // perform the decay cc=parent->id()==ParticleID::tauplus; return imode; } void TauDecayer::persistentOutput(PersistentOStream & os) const { os << _modemap << _current << _wgtloc << _wgtmax << _weights << _polOpt << _tauMpol << _tauPpol; } void TauDecayer::persistentInput(PersistentIStream & is, int) { is >> _modemap >> _current >> _wgtloc >> _wgtmax >> _weights >> _polOpt >> _tauMpol >> _tauPpol; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigTauDecayer("Herwig::TauDecayer", "HwTauDecay.so"); void TauDecayer::Init() { static ClassDocumentation documentation ("The TauDecayer class is designed to use a weak current" " to perform the decay of the tau."); static Reference interfaceWeakCurrent ("WeakCurrent", "The reference for the decay current to be used.", &TauDecayer::_current, false, false, true, false, false); static ParVector interfaceWeightLocation ("WeightLocation", "The locations of the weights for a given channel in the vector", &TauDecayer::_wgtloc, 0, 0, 0, 0, 10000, false, false, true); static ParVector interfaceWeightMax ("MaximumWeight", "The maximum weight for a given channel.", &TauDecayer::_wgtmax, 0, 0, 0, 0., 100., false, false, true); static ParVector interfaceWeights ("Weights", "The weights for the integration.", &TauDecayer::_weights, 0, 0, 0, 0., 1., false, false, true); static Switch interfacePolarizationOption ("PolarizationOption", "Option of forcing the polarization of the tau leptons, N.B. you" " should only use this option for making distributions for" " comparision if you really know what you are doing.", &TauDecayer::_polOpt, false, false, false); static SwitchOption interfacePolarizationOptionDefault (interfacePolarizationOption, "Default", "Don't force the polarization use the full spin density matrices" " to get the right answer", false); static SwitchOption interfacePolarizationOptionForce (interfacePolarizationOption, "Force", "Force the polarizations", true); static Parameter interfaceTauMinusPolarization ("TauMinusPolarization", "The polarization of the tau-, left=-1, right=+1 if this is forced.", &TauDecayer::_tauMpol, 0.0, -1.0, 1.0, false, false, Interface::limited); static Parameter interfaceTauPlusPolarization ("TauPlusPolarization", "The polarization of the tau+, left=-1, right=+1 if this is forced.", &TauDecayer::_tauPpol, 0.0, -1.0, 1.0, false, false, Interface::limited); } // combine the currents to give the matrix element double TauDecayer::me2(const int ichan,const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { // map the mode to those in the current int mode(_modemap[imode()]); // get the particles for the hadronic current ParticleVector hadpart(decay.begin()+1,decay.end()); Energy q; // extract info on the decaying particle if(meopt==Initialize) { // spin density matrix for the decaying particle _rho = RhoDMatrix(PDT::Spin1Half); if(inpart.id()==ParticleID::tauminus) SpinorWaveFunction ::calculateWaveFunctions(_inspin,_rho, const_ptr_cast(&inpart), incoming); else SpinorBarWaveFunction::calculateWaveFunctions(_inbar ,_rho, const_ptr_cast(&inpart), incoming); // fix rho if no correlations fixRho(_rho); if(_polOpt) { _rho(0,1) = _rho(1,0) = 0.; if(inpart.id()==ParticleID::tauminus) { _rho(0,0) = 0.5*(1.-_tauMpol); _rho(1,1) = 0.5*(1.+_tauMpol); } else { _rho(0,0) = 0.5*(1.+_tauPpol); _rho(1,1) = 0.5*(1.-_tauPpol); } } // work out the mapping for the hadron vector _constants = vector(decay.size()+1); _ispin = vector(decay.size()); int itemp(1); unsigned int ix(decay.size()); do { --ix; _ispin[ix] = decay[ix]->data().iSpin(); itemp *= _ispin[ix]; _constants[ix] = itemp; } while(ix>0); _constants[decay.size()] = 1; _constants[0 ] = _constants[1]; } if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1Half,_ispin))); // connect the spininfo up if needed if(meopt==Terminate) { if(inpart.id()==ParticleID::tauminus) { SpinorWaveFunction :: constructSpinInfo(_inspin,const_ptr_cast(&inpart),incoming,true); SpinorBarWaveFunction:: constructSpinInfo(_inbar,decay[0],outgoing,true); } else { SpinorBarWaveFunction:: constructSpinInfo(_inbar ,const_ptr_cast(&inpart),incoming,true); SpinorWaveFunction:: constructSpinInfo(_inspin,decay[0],outgoing,true); } _current->current(mode,ichan,q,hadpart,meopt); return 0.; } // calculate the spinors for the decay products if(inpart.id()==ParticleID::tauminus) SpinorBarWaveFunction::calculateWaveFunctions(_inbar ,decay[0],outgoing); else SpinorWaveFunction ::calculateWaveFunctions(_inspin,decay[0],outgoing); // calculate the hadron current vector hadron(_current->current(mode,ichan,q,hadpart,meopt)); // prefactor double pre = sqr(pow(inpart.mass()/q,int(hadpart.size()-2))); // calculate the lepton current LorentzPolarizationVectorE lepton[2][2]; for(unsigned ix=0;ix<2;++ix) { for(unsigned iy=0;iy<2;++iy) { if(inpart.id()==15) lepton[ix][iy]=2.*_inspin[ix].leftCurrent(_inbar[iy]); else lepton[iy][ix]=2.*_inspin[ix].leftCurrent(_inbar[iy]); } } // compute the matrix element vector ihel(decay.size()+1); for(unsigned int hhel=0;hhel1;--ix) { ihel[ix]=(hhel%_constants[ix-1])/_constants[ix]; } // loop over the helicities of the tau and neutrino and set up the matrix // element for(ihel[1]=0;ihel[1]<2;++ihel[1]){ for(ihel[0]=0;ihel[0]<2;++ihel[0]) { - (*ME())(ihel)= lepton[ihel[0]][ihel[1]].dot(hadron[hhel])* - SM().fermiConstant(); + (*ME())(ihel)= Complex(lepton[ihel[0]][ihel[1]].dot(hadron[hhel])*SM().fermiConstant()); } } } // multiply by the CKM element int iq,ia; _current->decayModeInfo(mode,iq,ia); double ckm(1.); if(iq<=6) { if(iq%2==0) ckm = SM().CKM(iq/2-1,(abs(ia)-1)/2); else ckm = SM().CKM(abs(ia)/2-1,(iq-1)/2); } return 0.5*pre*ckm*(ME()->contract(_rho)).real(); } // output the setup information for the particle database void TauDecayer::dataBaseOutput(ofstream & output,bool header) const { unsigned int ix; if(header) output << "update decayers set parameters=\""; DecayIntegrator::dataBaseOutput(output,false); for(ix=0;ix<_wgtloc.size();++ix) { output << "insert " << name() << ":WeightLocation " << ix << " " << _wgtloc[ix] << "\n"; } for(ix=0;ix<_wgtmax.size();++ix) { output << "insert " << name() << ":MaximumWeight " << ix << " " << _wgtmax[ix] << "\n"; } for(ix=0;ix<_weights.size();++ix) { output << "insert " << name() << ":Weights " << ix << " " << _weights[ix] << "\n"; } _current->dataBaseOutput(output,false,true); output << "newdef " << name() << ":WeakCurrent " << _current->name() << " \n"; output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";\n"; } diff --git a/Decay/TensorMeson/TensorMeson2PScalarDecayer.cc b/Decay/TensorMeson/TensorMeson2PScalarDecayer.cc --- a/Decay/TensorMeson/TensorMeson2PScalarDecayer.cc +++ b/Decay/TensorMeson/TensorMeson2PScalarDecayer.cc @@ -1,382 +1,382 @@ // -*- C++ -*- // // TensorMeson2PScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the TensorMeson2PScalarDecayer class. // #include "TensorMeson2PScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void TensorMeson2PScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } TensorMeson2PScalarDecayer::TensorMeson2PScalarDecayer() : _incoming(48), _outgoing1(48), _outgoing2(48), _coupling(48), _maxweight(48) { // a_2 -> eta pi _incoming[0] = 115; _outgoing1[0] = 221; _outgoing2[0] = 111; _coupling[0] = 10.90/GeV; _maxweight[0] = 1.7; _incoming[1] = 215; _outgoing1[1] = 221; _outgoing2[1] = 211; _coupling[1] = 10.90/GeV; _maxweight[1] = 1.7; // a_2 -> eta' pi _incoming[2] = 115; _outgoing1[2] = 331; _outgoing2[2] = 111; _coupling[2] = 9.92/GeV; _maxweight[2] = 1.9; _incoming[3] = 215; _outgoing1[3] = 331; _outgoing2[3] = 211; _coupling[3] = 9.92/GeV; _maxweight[3] = 1.9; // a_2 -> K K _incoming[4] = 115; _outgoing1[4] = 311; _outgoing2[4] = -311; _coupling[4] = 7.36/GeV; _maxweight[4] = 1.7; _incoming[5] = 115; _outgoing1[5] = 321; _outgoing2[5] = -321; _coupling[5] = 7.36/GeV; _maxweight[5] = 1.7; _incoming[6] = 215; _outgoing1[6] = 321; _outgoing2[6] = -311; _coupling[6] = 10.41/GeV; _maxweight[6] = 1.7; // f_2 -> pi pi _incoming[7] = 225; _outgoing1[7] = 211; _outgoing2[7] = -211; _coupling[7] = 18.73/GeV; _maxweight[7] = 1.7; _incoming[8] = 225; _outgoing1[8] = 111; _outgoing2[8] = 111; _coupling[8] = 13.24/GeV; _maxweight[8] = 1.7; // f_2 -> eta eta _incoming[9] = 225; _outgoing1[9] = 221; _outgoing2[9] = 221; _coupling[9] = 8.362/GeV; _maxweight[9] = 1.8; // f_2 -> KK _incoming[10] = 225; _outgoing1[10] = 321; _outgoing2[10] = -321; _coupling[10] = 11.03/GeV; _maxweight[10] = 2.; _incoming[11] = 225; _outgoing1[11] = 311; _outgoing2[11] = -311; _coupling[11] = 11.38/GeV; _maxweight[11] = 2.; // f'_2 -> KK _incoming[12] = 335; _outgoing1[12] = 321; _outgoing2[12] = -321; _coupling[12] = 14.65/GeV; _maxweight[12] = 1.65; _incoming[13] = 335; _outgoing1[13] = 311; _outgoing2[13] = -311; _coupling[13] = 14.65/GeV; _maxweight[13] = 1.65; // f'_2 -> eta eta _incoming[14] = 335; _outgoing1[14] = 221; _outgoing2[14] = 221; _coupling[14] = 9.15/GeV; _maxweight[14] = 1.7; // f'_2 -> pi pi _incoming[15] = 335; _outgoing1[15] = 211; _outgoing2[15] = -211; _coupling[15] = 0.860/GeV; _maxweight[15] = 1.7; _incoming[16] = 335; _outgoing1[16] = 111; _outgoing2[16] = 111; _coupling[16] = 0.608/GeV; _maxweight[16] = 1.7; // K_2 -> K eta _incoming[17] = 325; _outgoing1[17] = 321; _outgoing2[17] = 221; _coupling[17] = 1.52/GeV; _maxweight[17] = 1.8; _incoming[18] = 315; _outgoing1[18] = 311; _outgoing2[18] = 221; _coupling[18] = 1.52/GeV; _maxweight[18] = 1.8; // K_2 -> K pi _incoming[19] = 325; _outgoing1[19] = 321; _outgoing2[19] = 111; _coupling[19] = 8.30/GeV;_maxweight[19] = 1.65; _incoming[20] = 325; _outgoing1[20] = 311; _outgoing2[20] = 211; _coupling[20] = 11.74/GeV; _maxweight[20] = 1.65; _incoming[21] = 315; _outgoing1[21] = 311; _outgoing2[21] = 111; _coupling[21] = 8.68/GeV; _maxweight[21] = 1.65; _incoming[22] = 315; _outgoing1[22] = 321; _outgoing2[22] = -211; _coupling[22] = 12.28/GeV; _maxweight[22] = 1.65; // B_2 -> B pi _incoming[23] = 525; _outgoing1[23] = 521; _outgoing2[23] = 111; _coupling[23] = 27.23/GeV; _maxweight[23] = 1.65; _incoming[24] = 525; _outgoing1[24] = 511; _outgoing2[24] = 211; _coupling[24] = 38.52/GeV; _maxweight[24] = 1.65; _incoming[25] = 515; _outgoing1[25] = 511; _outgoing2[25] = 111; _coupling[25] = 27.16/GeV; _maxweight[25] = 1.65; _incoming[26] = 515; _outgoing1[26] = 521; _outgoing2[26] = -211; _coupling[26] = 38.62/GeV; _maxweight[26] = 1.65; // D_2 -> D pi _incoming[27] = 425; _outgoing1[27] = 421; _outgoing2[27] = 111; _coupling[27] = 18.07/GeV; _maxweight[27] = 1.7; _incoming[28] = 425; _outgoing1[28] = 411; _outgoing2[28] = -211; _coupling[28] = 25.56/GeV; _maxweight[28] = 1.7; _incoming[29] = 415; _outgoing1[29] = 411; _outgoing2[29] = 111; _coupling[29] = 14.91/GeV; _maxweight[29] = 1.7; _incoming[30] = 415; _outgoing1[30] = 421; _outgoing2[30] = 211; _coupling[30] = 21.09/GeV; _maxweight[30] = 1.7; // D_s2 _incoming[31] = 435; _outgoing1[31] = 421; _outgoing2[31] = 321; _coupling[31] = 23.39/GeV; _maxweight[31] = 1.7; _incoming[32] = 435; _outgoing1[32] = 411; _outgoing2[32] = 311; _coupling[32] = 23.39/GeV; _maxweight[32] = 1.7; // B_s2 _incoming[33] = 535; _outgoing1[33] = 521; _outgoing2[33] = -321; _coupling[33] = 45.43/GeV; _maxweight[33] = 1.7; _incoming[34] = 535; _outgoing1[34] = 511; _outgoing2[34] = -311; _coupling[34] = 48.84/GeV; _maxweight[34] = 1.7; // chi_c2 to pi pi _incoming[35] = 445; _outgoing1[35] = 211; _outgoing2[35] = -211; _coupling[35] = 0.0200/GeV; _maxweight[35] = 1.7; _incoming[36] = 445; _outgoing1[36] = 111; _outgoing2[36] = 111; _coupling[36] = 0.0141/GeV; _maxweight[36] = 1.7; // chi_c2 to K K _incoming[37] = 445; _outgoing1[37] = 321; _outgoing2[37] = -321; _coupling[37] = 0.056/GeV; _maxweight[37] = 1.7; _incoming[38] = 445; _outgoing1[38] = 311; _outgoing2[38] = -311; _coupling[38] = 0.056/GeV; _maxweight[38] = 1.7; // f_2 to sigma sigma _incoming[39] = 225; _outgoing1[39] = 9000221; _outgoing2[39] = 9000221; _coupling[39] = 104.1/GeV; _maxweight[39] = 60.; // pi_2 to sigma pi _incoming[40] = 10115; _outgoing1[40] = 9000221; _outgoing2[40] = 111; _coupling[40] = 15.3/GeV; _maxweight[40] = 10.; _incoming[41] = 10215; _outgoing1[41] = 9000221; _outgoing2[41] = 211; _coupling[41] = 15.3/GeV; _maxweight[41] = 10.; // eta_2 to a_0 pi _incoming[42] = 10225; _outgoing1[42] = 9000111; _outgoing2[42] = 111; _coupling[42] = 11.3/GeV; _maxweight[42] = 10.; _incoming[43] = 10225; _outgoing1[43] = 9000211; _outgoing2[43] = -211; _coupling[43] = 11.3/GeV; _maxweight[43] = 10.; // eta'_2 to a_0 pi _incoming[44] = 10335; _outgoing1[44] = 9000111; _outgoing2[44] = 111; _coupling[44] = 4.43/GeV; _maxweight[44] = 10.; _incoming[45] = 10335; _outgoing1[45] = 9000211; _outgoing2[45] = -211; _coupling[45] = 4.43/GeV; _maxweight[45] = 10.; // chi_c2(2P) to D D _incoming[46] = 100445; _outgoing1[46] = 411; _outgoing2[46] = -411; _coupling[46] = 22.3/GeV; _maxweight[46] = 1.7; _incoming[47] = 100445; _outgoing1[47] = 421; _outgoing2[47] = -421; _coupling[47] = 22.3/GeV; _maxweight[47] = 1.7; // initial size of the vectors _initsize=_incoming.size(); // intermediates generateIntermediates(false); } void TensorMeson2PScalarDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoing1.size()||isize!=_outgoing2.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters TensorMeson2PScalarDecayer" << Exception::abortnow; // set up the integration channels vector wgt(0); DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); extpart[1]=getParticleData(_outgoing1[ix]); extpart[2]=getParticleData(_outgoing2[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int TensorMeson2PScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoing1[ix]&&id2 ==_outgoing2[ix])|| (id2 ==_outgoing1[ix]&&id1 ==_outgoing2[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoing1[ix]&&id2bar==_outgoing2[ix])|| (id2bar==_outgoing1[ix]&&id1bar==_outgoing2[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void TensorMeson2PScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoing1 << _outgoing2 << _maxweight << ounit(_coupling,1/GeV); } void TensorMeson2PScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoing1 >> _outgoing2 >> _maxweight >> iunit(_coupling,1/GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigTensorMeson2PScalarDecayer("Herwig::TensorMeson2PScalarDecayer", "HwTMDecay.so"); void TensorMeson2PScalarDecayer::Init() { static ClassDocumentation documentation ("The TensorMeson2PScalarDecayer class is designed for the decay" " of a tensor meson to two (pseudo)-scalar mesons."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &TensorMeson2PScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming1 ("FirstOutgoing", "The PDG code for the first outgoing particle", &TensorMeson2PScalarDecayer::_outgoing1, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming2 ("SecondOutgoing", "The PDG code for the second outgoing particle", &TensorMeson2PScalarDecayer::_outgoing2, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &TensorMeson2PScalarDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 1000./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &TensorMeson2PScalarDecayer::_maxweight, 0, 0, 0, 0., 100000., false, false, true); } // matrix elememt for the process double TensorMeson2PScalarDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin2,PDT::Spin0,PDT::Spin0))); // stuff for incoming particle if(meopt==Initialize) { _rho = RhoDMatrix(PDT::Spin2); TensorWaveFunction:: calculateWaveFunctions(_tensors,_rho,const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { TensorWaveFunction::constructSpinInfo(_tensors,const_ptr_cast(&inpart), incoming,true,false); // set up the spin information for the decay products for(unsigned int ix=0;ixmomentum())*decay[0]->momentum()); + (*ME())(ix,0,0) = Complex(_coupling[imode()]/inpart.mass()* + ((_tensors[ix]*decay[1]->momentum())*decay[0]->momentum())); } // // test of the answer // double me = newME.contract(_rho).real(); // Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = Energy4(pow<4,1>(2*pcm))*sqr( _coupling[imode()]/inpart.mass())/120.; // cout << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << endl; // return the answer return ME()->contract(_rho).real(); } bool TensorMeson2PScalarDecayer::twoBodyMEcode(const DecayMode & dm,int & mecode, double & coupling) const { int imode(-1); int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(false); do { if(id ==_incoming[ix]) { if(id1==_outgoing1[ix]&&id2==_outgoing2[ix]) { imode=ix; order=true; } if(id2==_outgoing1[ix]&&id1==_outgoing2[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoing1[ix]&&id2bar==_outgoing2[ix]) { imode=ix; order=true; } if(id2bar==_outgoing1[ix]&&id1bar==_outgoing2[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling=_coupling[imode]*dm.parent()->mass(); mecode=7; return order; } void TensorMeson2PScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "newdef " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "insert " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/TensorMeson/TensorMesonVectorPScalarDecayer.cc b/Decay/TensorMeson/TensorMesonVectorPScalarDecayer.cc --- a/Decay/TensorMeson/TensorMesonVectorPScalarDecayer.cc +++ b/Decay/TensorMeson/TensorMesonVectorPScalarDecayer.cc @@ -1,351 +1,351 @@ // -*- C++ -*- // // TensorMesonVectorPScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the TensorMesonVectorPScalarDecayer class. // #include "TensorMesonVectorPScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/epsilon.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void TensorMesonVectorPScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()){ for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } TensorMesonVectorPScalarDecayer::TensorMesonVectorPScalarDecayer() : _incoming(31), _outgoingV(31), _outgoingP(31), _coupling(31), _maxweight(31) { // a_2 -> rho pi _incoming[0] = 115; _outgoingV[0] = 213; _outgoingP[0] = -211; _coupling[0] = 21.1/GeV2; _maxweight[0] = 10.; _incoming[1] = 215; _outgoingV[1] = 113; _outgoingP[1] = 211; _coupling[1] = 21.1/GeV2; _maxweight[1] = 9.; _incoming[2] = 215; _outgoingV[2] = 213; _outgoingP[2] = 111; _coupling[2] = 21.1/GeV2; _maxweight[2] = 9.; // a_2+/- -> gamma pi+/- _incoming[3] = 215; _outgoingV[3] = 22; _outgoingP[3] = 211; _coupling[3] = 0.551/GeV2; _maxweight[3] = 2.; // k_2 -> K_2 omega _incoming[4] = 315; _outgoingV[4] = 223; _outgoingP[4] = 311; _coupling[4] = 11.66/GeV2; _maxweight[4] = 17.; _incoming[5] = 325; _outgoingV[5] = 223; _outgoingP[5] = 321; _coupling[5] = 11.66/GeV2; _maxweight[5] = 20.5; // k_2+/- -> K+/- gamma _incoming[6] = 325; _outgoingV[6] = 22; _outgoingP[6] = 321; _coupling[6] = 0.553/GeV2; _maxweight[6] = 2.2; // B_c2 -> B_c gamma _incoming[7] = 545; _outgoingV[7] = 22; _outgoingP[7] = 541; _coupling[7] = 0.651/GeV2; _maxweight[7] = 2.; // K_2 -> K rho _incoming[8] = 325; _outgoingV[8] = 113; _outgoingP[8] = 321; _coupling[8] = 10.14/GeV2; _maxweight[8] = 9.; _incoming[9] = 325; _outgoingV[9] = 213; _outgoingP[9] = 311; _coupling[9] = 14.33/GeV2; _maxweight[9] = 9.; _incoming[10] = 315; _outgoingV[10] = 113; _outgoingP[10] = 311; _coupling[10] = 10.14/GeV2; _maxweight[10] = 9.; _incoming[11] = 315; _outgoingV[11] = -213; _outgoingP[11] = 321; _coupling[11] = 14.33/GeV2; _maxweight[11] = 9.; // K_2 -> K* pi _incoming[12] = 325; _outgoingV[12] = 323; _outgoingP[12] = 111; _coupling[12] = 9.733/GeV2; _maxweight[12] = 13; _incoming[13] = 325; _outgoingV[13] = 313; _outgoingP[13] = 211; _coupling[13] = 13.77/GeV2; _maxweight[13] = 11; _incoming[14] = 315; _outgoingV[14] = 313; _outgoingP[14] = 111; _coupling[14] = 9.733/GeV2; _maxweight[14] = 8.; _incoming[15] = 315; _outgoingV[15] = 323; _outgoingP[15] = -211; _coupling[15] = 13.77/GeV2; _maxweight[15] = 8.; // D_2 -> D* pi _incoming[16] = 425; _outgoingV[16] = 423; _outgoingP[16] = 111; _coupling[16] = 8.035/GeV2; _maxweight[16] = 2.2; _incoming[17] = 425; _outgoingV[17] = 413; _outgoingP[17] = -211; _coupling[17] = 11.670/GeV2; _maxweight[17] = 2.4; _incoming[18] = 415; _outgoingV[18] = 413; _outgoingP[18] = 111; _coupling[18] = 6.801/GeV2; _maxweight[18] = 2.4; _incoming[19] = 415; _outgoingV[19] = 423; _outgoingP[19] = 211; _coupling[19] = 9.527/GeV2; _maxweight[19] = 2.; // D_s2 -> D* K _incoming[20] = 435; _outgoingV[20] = 423; _outgoingP[20] = 321; _coupling[20] = 13.10/GeV2; _maxweight[20] = 2.2; _incoming[21] = 435; _outgoingV[21] = 413; _outgoingP[21] = 311; _coupling[21] = 13.10/GeV2; _maxweight[21] = 2.5; // B_2 -> B* pi _incoming[22] = 525; _outgoingV[22] = 523; _outgoingP[22] = 111; _coupling[22] = 4.99/GeV2; _maxweight[22] = 2.1; _incoming[23] = 525; _outgoingV[23] = 513; _outgoingP[23] = 211; _coupling[23] = 7.059/GeV2; _maxweight[23] = 2.1; _incoming[24] = 515; _outgoingV[24] = 513; _outgoingP[24] = 111; _coupling[24] = 4.99/GeV2; _maxweight[24] = 2.1; _incoming[25] = 515; _outgoingV[25] = 523; _outgoingP[25] = -211; _coupling[25] = 7.059/GeV2; _maxweight[25] = 2.1; // D_s2 _incoming[26] = 435; _outgoingV[26] = 423; _outgoingP[26] = 321; _coupling[26] = 13.09/GeV2; _maxweight[26] = 2.2; _incoming[27] = 435; _outgoingV[27] = 413; _outgoingP[27] = 311; _coupling[27] = 13.09/GeV2; _maxweight[27] = 2.5; // B_s2 _incoming[28] = 535; _outgoingV[28] = 523; _outgoingP[28] = -321; _coupling[28] = 7.29/GeV2; _maxweight[28] = 2.4; _incoming[29] = 535; _outgoingV[29] = 513; _outgoingP[29] = -311; _coupling[29] = 9.43/GeV2; _maxweight[29] = 2.1; // upsilon_2(1d) to chi_b gamma _incoming[30] = 20555; _outgoingV[30] = 22; _outgoingP[30] = 10551; _coupling[30] = 1.11/GeV2; _maxweight[30] = 2.4; // initial size of the arrays _initsize=_incoming.size(); // intermediates generateIntermediates(false); } void TensorMesonVectorPScalarDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoingV.size()||isize!=_outgoingP.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters TensorMesonVectorPScalarDecayer" << Exception::abortnow; // set up the integration channels vector wgt; DecayPhaseSpaceModePtr mode; tPDVector extpart(3); for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0] = getParticleData(_incoming[ix]); extpart[1] = getParticleData(_outgoingV[ix]); extpart[2] = getParticleData(_outgoingP[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int TensorMesonVectorPScalarDecayer::modeNumber(bool & cc, tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoingP[ix]&&id2 ==_outgoingV[ix])|| (id2 ==_outgoingP[ix]&&id1 ==_outgoingV[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoingP[ix]&&id2bar==_outgoingV[ix])|| (id2bar==_outgoingP[ix]&&id1bar==_outgoingV[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void TensorMesonVectorPScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoingV << _outgoingP << _maxweight << ounit(_coupling,1/GeV2); } void TensorMesonVectorPScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoingV >> _outgoingP >> _maxweight >> iunit(_coupling,1/GeV2); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigTensorMesonVectorPScalarDecayer("Herwig::TensorMesonVectorPScalarDecayer", "HwTMDecay.so"); void TensorMesonVectorPScalarDecayer::Init() { static ClassDocumentation documentation ("The TensorMesonVectorPScalarDecayer class implements the" " decay of a tensor meson to a spin-1 particle and a pseduoscalar meson"); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &TensorMesonVectorPScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingV ("OutgoingVector", "The PDG code for the outgoing spin-1particle", &TensorMesonVectorPScalarDecayer::_outgoingV, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingP ("OutgoingScalar", "The PDG code for the outgoing pseudoscalar meson", &TensorMesonVectorPScalarDecayer::_outgoingP, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &TensorMesonVectorPScalarDecayer::_coupling, 1/GeV2, 0, ZERO, ZERO, 100./GeV2, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &TensorMesonVectorPScalarDecayer::_maxweight, 0, 0, 0, 0., 1000., false, false, true); } // matrix elememt for the process double TensorMesonVectorPScalarDecayer::me2(const int,const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin2,PDT::Spin1,PDT::Spin0))); // check for photons bool photon(_outgoingV[imode()]==ParticleID::gamma); // stuff for incoming particle if(meopt==Initialize) { _rho = RhoDMatrix(PDT::Spin2); TensorWaveFunction:: calculateWaveFunctions(_tensors,_rho,const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { TensorWaveFunction::constructSpinInfo(_tensors,const_ptr_cast(&inpart), incoming,true,false); // set up the spin information for the decay products VectorWaveFunction::constructSpinInfo(_vectors,decay[0],outgoing,true,photon); ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true); return 0.; } VectorWaveFunction::calculateWaveFunctions(_vectors,decay[0],outgoing,photon); InvEnergy3 fact(_coupling[imode()]/inpart.mass()); // calculate the matrix element for(unsigned int inhel=0;inhel<5;++inhel) { for(unsigned int vhel=0;vhel<3;++vhel){ if(vhel==1&&photon) (*ME())(inhel,vhel,0)=0.; else { LorentzVector > vtemp= fact*epsilon(decay[0]->momentum(),_vectors[vhel],decay[1]->momentum()); - (*ME())(inhel,vhel,0)= (decay[1]->momentum()*_tensors[inhel]).dot(vtemp); + (*ME())(inhel,vhel,0)= Complex((decay[1]->momentum()*_tensors[inhel]).dot(vtemp)); } } } // // test of the answer // double me = ME()->contract(_rho).real(); // Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = Energy4(pow<4,1>(2*pcm))*sqr( _coupling[imode()])/80.; // cout << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << endl; // return the answer return ME()->contract(_rho).real(); } bool TensorMesonVectorPScalarDecayer::twoBodyMEcode(const DecayMode & dm,int & mecode, double & coupling) const { int imode(-1); int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(false); do { if(id ==_incoming[ix]) { if(id1==_outgoingP[ix]&&id2==_outgoingV[ix]) { imode=ix; order=true; } if(id2==_outgoingP[ix]&&id1==_outgoingV[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingP[ix]&&id2bar==_outgoingV[ix]) { imode=ix; order=true; } if(id2bar==_outgoingP[ix]&&id1bar==_outgoingV[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling=_coupling[imode]*sqr(dm.parent()->mass()); mecode=8; return order; } void TensorMesonVectorPScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "newdef " << name() << ":OutgoingScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV2 << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "insert " << name() << ":OutgoingScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV2 << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/TensorMeson/TensorMesonVectorVectorDecayer.cc b/Decay/TensorMeson/TensorMesonVectorVectorDecayer.cc --- a/Decay/TensorMeson/TensorMesonVectorVectorDecayer.cc +++ b/Decay/TensorMeson/TensorMesonVectorVectorDecayer.cc @@ -1,359 +1,359 @@ // -*- C++ -*- // // TensorMesonVectorVectorDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the TensorMesonVectorVectorDecayer class. // #include "TensorMesonVectorVectorDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void TensorMesonVectorVectorDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } void TensorMesonVectorVectorDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoing1.size()||isize!=_outgoing2.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters TensorMesonVectorVectorDecayer" << Exception::abortnow; // set up the integration channels vector wgt(0); tPDVector extpart(3); DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); extpart[1]=getParticleData(_outgoing1[ix]); extpart[2]=getParticleData(_outgoing2[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } TensorMesonVectorVectorDecayer::TensorMesonVectorVectorDecayer() : _incoming(22), _outgoing1(22), _outgoing2(22), _coupling(22), _maxweight(22) { // a_2 -> gamma gamma _incoming[0] = 115; _outgoing1[0] = 22; _outgoing2[0] = 22; _coupling[0] = 0.00727/GeV; _maxweight[0] = 1.7; // f_2 -> gamma gamma _incoming[1] = 225; _outgoing1[1] = 22; _outgoing2[1] = 22; _coupling[1] = 0.01253/GeV; _maxweight[1] = 1.7; // f'_2 -> gamma gamma _incoming[2] = 335; _outgoing1[2] = 22; _outgoing2[2] = 22; _coupling[2] = 0.00161/GeV; _maxweight[2] = 1.7; // chi_b(2P) decays _incoming[3] = 100555; _outgoing1[3] = 553; _outgoing2[3] = 223; _coupling[3] = 0.0118/GeV; _maxweight[3] = 1.8; _incoming[4] = 100555; _outgoing1[4] = 553; _outgoing2[4] = 22; _coupling[4] = 0.0172/GeV; _maxweight[4] = 1.7; _incoming[5] = 100555; _outgoing1[5] = 100553; _outgoing2[5] = 22; _coupling[5] = 0.145/GeV; _maxweight[5] = 1.7; _incoming[6] = 100555; _outgoing1[6] = 333; _outgoing2[6] = 333; _coupling[6] = 0.00483/GeV; _maxweight[6] = 18.0; // chi_c decays _incoming[7] = 445; _outgoing1[7] = 443; _outgoing2[7] = 22; _coupling[7] = 0.243/GeV; _maxweight[7] = 1.7; _incoming[8] = 445; _outgoing1[8] = 323; _outgoing2[8] = -323; _coupling[8] = 0.00560/GeV; _maxweight[8] = 15.; _incoming[9] = 445; _outgoing1[9] = 313; _outgoing2[9] = -313; _coupling[9] = 0.00560/GeV; _maxweight[9] = 20.; _incoming[10] = 445; _outgoing1[10] = 333; _outgoing2[10] = 333; _coupling[10] = 0.00418/GeV; _maxweight[10] = 10.; _incoming[11] = 445; _outgoing1[11] = 22; _outgoing2[11] = 22; _coupling[11] = 0.00122/GeV; _maxweight[11] = 1.7; // chi_b(1P) decays _incoming[12] = 555; _outgoing1[12] = 553; _outgoing2[12] = 22; _coupling[12] = 0.0683/GeV; _maxweight[12] = 1.8; // a_2 omega rho _incoming[13] = 115; _outgoing1[13] = 223; _outgoing2[13] = 113; _coupling[13] = 23.1/GeV; _maxweight[13] = 15.; _incoming[14] = 215; _outgoing1[14] = 223; _outgoing2[14] = 213; _coupling[14] = 23.1/GeV; _maxweight[14] = 21.; // f_2 rho rho _incoming[15] = 225; _outgoing1[15] = 113; _outgoing2[15] = 113; _coupling[15] = 11.7/GeV; _maxweight[15] = 26.; _incoming[16] = 225; _outgoing1[16] = 213; _outgoing2[16] = -213; _coupling[16] = 16.5/GeV; _maxweight[16] = 26.; // K_2-> K* rho _incoming[17] = 315; _outgoing1[17] = 113; _outgoing2[17] = 313; _coupling[17] = 13.42/GeV; _maxweight[17] = 30.; _incoming[18] = 315; _outgoing1[18] = -213; _outgoing2[18] = 323; _coupling[18] = 18.98/GeV; _maxweight[18] = 30.; _incoming[19] = 325; _outgoing1[19] = 113; _outgoing2[19] = 323; _coupling[19] = 13.42/GeV; _maxweight[19] = 30.; _incoming[20] = 325; _outgoing1[20] = 213; _outgoing2[20] = 313; _coupling[20] = 18.98/GeV; _maxweight[20] = 30.; _incoming[21] = 445; _outgoing1[21] = 223; _outgoing2[21] = 223; _coupling[21] = 0.00389/GeV; _maxweight[21] = 12.; // initial size of the vectors _initsize = _incoming.size(); // intermediates generateIntermediates(false); } int TensorMesonVectorVectorDecayer::modeNumber(bool & cc, tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoing1[ix]&&id2 ==_outgoing2[ix])|| (id2 ==_outgoing1[ix]&&id1 ==_outgoing2[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoing1[ix]&&id2bar==_outgoing2[ix])|| (id2bar==_outgoing1[ix]&&id1bar==_outgoing2[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void TensorMesonVectorVectorDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoing1 << _outgoing2 << _maxweight << ounit(_coupling,1/GeV); } void TensorMesonVectorVectorDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoing1 >> _outgoing2 >> _maxweight >> iunit(_coupling,1/GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigTensorMesonVectorVectorDecayer("Herwig::TensorMesonVectorVectorDecayer", "HwTMDecay.so"); void TensorMesonVectorVectorDecayer::Init() { static ClassDocumentation documentation ("The TensorMesonVectorVectorDecayer class performs the" " decay of a tensor meson to two scalar mesons."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &TensorMesonVectorVectorDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming1 ("FirstOutgoing", "The PDG code for the first outgoing particle", &TensorMesonVectorVectorDecayer::_outgoing1, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcoming2 ("SecondOutgoing", "The PDG code for the second outgoing particle", &TensorMesonVectorVectorDecayer::_outgoing2, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &TensorMesonVectorVectorDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 1000./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &TensorMesonVectorVectorDecayer::_maxweight, 0, 0, 0, 0., 100., false, false, true); } // matrix elememt for the process double TensorMesonVectorVectorDecayer::me2(const int,const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin2,PDT::Spin1,PDT::Spin1))); // photons ?? bool photon[2]; for(unsigned int ix=0;ix<2;++ix) photon[ix]=decay[ix]->id()==ParticleID::gamma; // stuff for incoming particle if(meopt==Initialize) { _rho = RhoDMatrix(PDT::Spin2); TensorWaveFunction:: calculateWaveFunctions(_tensors,_rho,const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { TensorWaveFunction::constructSpinInfo(_tensors,const_ptr_cast(&inpart), incoming,true,false); // set up the spin information for the decay products for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::constructSpinInfo(_vectors[ix],decay[ix], outgoing,true,photon[ix]); return 0.; } for(unsigned int ix=0;ix<2;++ix) VectorWaveFunction::calculateWaveFunctions(_vectors[ix],decay[ix], outgoing,photon[ix]); // compute some useful dot products etc complex p1eps2[3],p2eps1[3]; Energy2 p1p2(decay[0]->momentum()*decay[1]->momentum()); for(unsigned int ix=0;ix<3;++ix) { p1eps2[ix]=_vectors[1][ix]*decay[0]->momentum(); p2eps1[ix]=_vectors[0][ix]*decay[1]->momentum(); } // compute the traces and useful dot products Complex trace[5]; complex pboth[5]; LorentzPolarizationVectorE pleft[2][5],pright[2][5]; for(unsigned int ix=0;ix<5;++ix) { trace[ix]=_tensors[ix].xx() + _tensors[ix].yy() + _tensors[ix].zz() + _tensors[ix].tt(); pleft[0][ix] =(-decay[0]->momentum())*_tensors[ix]; pleft[1][ix] =(-decay[1]->momentum())*_tensors[ix]; pright[0][ix]=_tensors[ix]*(-decay[0]->momentum()); pright[1][ix]=_tensors[ix]*(-decay[1]->momentum()); pboth[ix]=((pleft[0][ix]+pright[0][ix])*decay[1]->momentum()); } // loop to compute the matrix element Complex e1e2; LorentzTensor te1e2; InvEnergy2 fact(_coupling[imode()]/inpart.mass()); complex me; for(unsigned int ix=0;ix<3;++ix) { for(unsigned iy=0;iy<3;++iy) { e1e2=_vectors[0][ix].dot(_vectors[1][iy]); te1e2=complex(p1p2)* (LorentzTensor(_vectors[0][ix],_vectors[1][iy])+ LorentzTensor(_vectors[1][iy],_vectors[0][ix])); for(unsigned int inhel=0;inhel<5;++inhel) { me = (_tensors[inhel]*te1e2 -p2eps1[ix]*(_vectors[1][iy].dot(pleft[0][inhel]+pright[0][inhel])) -p1eps2[iy]*(_vectors[0][ix].dot(pleft[1][inhel]+pright[1][inhel])) +pboth[inhel]*e1e2 +(p2eps1[ix]*p1eps2[iy]-e1e2*p1p2)*trace[inhel]); - (*ME())(inhel,ix,iy)=fact*me; + (*ME())(inhel,ix,iy)=Complex(fact*me); } } } // // testing the matrix element // double metest = ME()->contract(_rho).real(); // Energy2 m02(sqr(inpart.mass())),m12(sqr(decay[0]->mass())),m22(sqr(decay[1]->mass())); // Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // Energy2 pcm2(sqr(pcm)); // double test = 4./15./m02/m02*sqr(_coupling[imode()])* // (3.*m02*(8.*pcm2*pcm2+5.*(m12*m22+pcm2*(m12+m22)))-5.*(m12-m22)*(m12-m22)*pcm2); // cout << "testing the matrix element VV " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << metest << " " << test << " " << (metest-test)/(metest+test) << endl; // return the answer return ME()->contract(_rho).real(); } bool TensorMesonVectorVectorDecayer::twoBodyMEcode(const DecayMode & dm,int & mecode, double & coupling) const { int imode(-1); int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); do { if(id ==_incoming[ix]) { if(id1==_outgoing1[ix]&&id2==_outgoing2[ix]) { imode=ix; } if(id2==_outgoing1[ix]&&id1==_outgoing2[ix]) { imode=ix; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoing1[ix]&&id2bar==_outgoing2[ix]) { imode=ix; } if(id2bar==_outgoing1[ix]&&id1bar==_outgoing2[ix]) { imode=ix; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling=_coupling[imode]*dm.parent()->mass(); mecode=9; return id1==_outgoing1[imode]&&id2==_outgoing2[imode]; } void TensorMesonVectorVectorDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "newdef " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":FirstOutgoing " << ix << " " << _outgoing1[ix] << "\n"; output << "insert " << name() << ":SecondOutgoing " << ix << " " << _outgoing2[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/VectorMeson/PVectorMesonVectorPScalarDecayer.cc b/Decay/VectorMeson/PVectorMesonVectorPScalarDecayer.cc --- a/Decay/VectorMeson/PVectorMesonVectorPScalarDecayer.cc +++ b/Decay/VectorMeson/PVectorMesonVectorPScalarDecayer.cc @@ -1,443 +1,443 @@ // -*- C++ -*- // // PVectorMesonVectorPScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the PVectorMesonVectorPScalarDecayer class. // #include "PVectorMesonVectorPScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void PVectorMesonVectorPScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } void PVectorMesonVectorPScalarDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoingV.size()||isize!=_outgoingP.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters in " << "PVectorMesonVectorPScalarDecayer::doinit()" << Exception::abortnow; // set up the integration channels vector wgt(0); tPDVector extpart(3); DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); extpart[1]=getParticleData(_outgoingV[ix]); extpart[2]=getParticleData(_outgoingP[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } PVectorMesonVectorPScalarDecayer::PVectorMesonVectorPScalarDecayer() : _coupling(67), _incoming(67), _outgoingV(67), _outgoingP(67), _maxweight(67) { // decay mode h'_1 to K K* _incoming[0] = 10333; _outgoingV[0] = 313; _outgoingP[0] = -311; _coupling[0] = 4.889/GeV; _maxweight[0] = 11.; _incoming[1] = 10333; _outgoingV[1] = 323; _outgoingP[1] = -321; _coupling[1] = 4.156/GeV; _maxweight[1] = 11.; // decay mode h_1 to rho _incoming[2] = 10223; _outgoingV[2] = 113; _outgoingP[2] = 111; _coupling[2] = 4.411/GeV; _maxweight[2] = 6.; _incoming[3] = 10223; _outgoingV[3] = -213; _outgoingP[3] = 211; _coupling[3] = 4.411/GeV; _maxweight[3] = 6.; // decay mode b_1 to omega pi _incoming[4] = 10113; _outgoingV[4] = 223; _outgoingP[4] = 111; _coupling[4] = 3.862/GeV; _maxweight[4] = 7.5; _incoming[5] = 10213; _outgoingV[5] = 223; _outgoingP[5] = 211; _coupling[5] = 3.862/GeV; _maxweight[5] = 7.5; // decay mode b_1^+ to gamma pi _incoming[6] = 10213; _outgoingV[6] = 22; _outgoingP[6] = 211; _coupling[6] = 0.195/GeV; _maxweight[6] = 2.; // decay mode D'_s1 to D*K _incoming[7] = 20433; _outgoingV[7] = 413; _outgoingP[7] = 311; _coupling[7] = 0.161/GeV; _maxweight[7] = 2.5; _incoming[8] = 20433; _outgoingV[8] = 423; _outgoingP[8] = 321; _coupling[8] = 0.161/GeV; _maxweight[8] = 2.5; // decay mode B'_s1 to B*K _incoming[9] = 20533; _outgoingV[9] = 513; _outgoingP[9] = -311; _coupling[9] = 0.389/GeV; _maxweight[9] = 2.1; _incoming[10] = 20533; _outgoingV[10] = 523; _outgoingP[10] = -321; _coupling[10] = 0.389/GeV; _maxweight[10] = 2.1; // decay mode K_1 to rho K _incoming[11] = 10323; _outgoingV[11] = 213; _outgoingP[11] = 311; _coupling[11] = 4.98/GeV; _maxweight[11] = 3.5; _incoming[12] = 10323; _outgoingV[12] = 113; _outgoingP[12] = 321; _coupling[12] = 3.40/GeV; _maxweight[12] = 3.5; _incoming[13] = 10313; _outgoingV[13] = -213; _outgoingP[13] = 321; _coupling[13] = 4.87/GeV; _maxweight[13] = 3.5; _incoming[14] = 10313; _outgoingV[14] = 113; _outgoingP[14] = 311; _coupling[14] = 3.55/GeV; _maxweight[14] = 3.5; // decay mode K'_1 to rho K _incoming[15] = 20323; _outgoingV[15] = 213; _outgoingP[15] = 311; _coupling[15] = 0.97/GeV; _maxweight[15] = 6.5; _incoming[16] = 20323; _outgoingV[16] = 113; _outgoingP[16] = 321; _coupling[16] = 0.69/GeV; _maxweight[16] = 6.5; _incoming[17] = 20313; _outgoingV[17] = -213; _outgoingP[17] = 321; _coupling[17] = 0.97/GeV; _maxweight[17] = 6.5; _incoming[18] = 20313; _outgoingV[18] = 113; _outgoingP[18] = 311; _coupling[18] = 0.707/GeV; _maxweight[18] = 6.5; // decay mode K_1 to omega K _incoming[19] = 10323; _outgoingV[19] = 223; _outgoingP[19] = 321; _coupling[19] = 4.76/GeV; _maxweight[19] = 7.5; _incoming[20] = 10313; _outgoingV[20] = 223; _outgoingP[20] = 311; _coupling[20] = 6.0/GeV; _maxweight[20] = 7.5; // decay mode K'_1 to omega K _incoming[21] = 20323; _outgoingV[21] = 223; _outgoingP[21] = 321; _coupling[21] = 0.600/GeV; _maxweight[21] = 8.; _incoming[22] = 20313; _outgoingV[22] = 223; _outgoingP[22] = 311; _coupling[22] = 0.600/GeV; _maxweight[22] = 8.; // decay mode K_1 to K* pi _incoming[23] = 10323; _outgoingP[23] = 211; _outgoingV[23] = 313; _coupling[23] = 0.941/GeV; _maxweight[23] = 8.5; _incoming[24] = 10323; _outgoingP[24] = 111; _outgoingV[24] = 323; _coupling[24] = 0.656/GeV; _maxweight[24] = 8.5; _incoming[25] = 10313; _outgoingP[25] = -211; _outgoingV[25] = 323; _coupling[25] = 0.932/GeV; _maxweight[25] = 8.5; _incoming[26] = 10313; _outgoingP[26] = 111; _outgoingV[26] = 313; _coupling[26] = 0.658/GeV; _maxweight[26] = 8.5; // decay mode K'_1 to K* pi _incoming[27] = 20323; _outgoingP[27] = 211; _outgoingV[27] = 313; _coupling[27] = 2.845/GeV; _maxweight[27] = 12.; _incoming[28] = 20323; _outgoingP[28] = 111; _outgoingV[28] = 323; _coupling[28] = 1.99/GeV; _maxweight[28] = 12.; _incoming[29] = 20313; _outgoingP[29] = -211; _outgoingV[29] = 323; _coupling[29] = 2.84/GeV; _maxweight[29] = 12.; _incoming[30] = 20313; _outgoingP[30] = 111; _outgoingV[30] = 313; _coupling[30] = 2.00/GeV; _maxweight[30] = 12.; // decaymode D_1 to D* pi _incoming[31] = 10423; _outgoingP[31] = -211; _outgoingV[31] = 413; _coupling[31] = 0.489/GeV; _maxweight[31] = 3.; _incoming[32] = 10423; _outgoingP[32] = 111; _outgoingV[32] = 423; _coupling[32] = 0.347/GeV; _maxweight[32] = 3.; _incoming[33] = 10413; _outgoingP[33] = 211; _outgoingV[33] = 423; _coupling[33] = 0.542/GeV; _maxweight[33] = 3.; _incoming[34] = 10413; _outgoingP[34] = 111; _outgoingV[34] = 413; _coupling[34] = 0.383/GeV; _maxweight[34] = 3.; // decaymode D'_1 to D* pi _incoming[35] = 20423; _outgoingP[35] = -211; _outgoingV[35] = 413; _coupling[35] = 1.933/GeV; _maxweight[35] = 3.; _incoming[36] = 20423; _outgoingP[36] = 111; _outgoingV[36] = 423; _coupling[36] = 1.367/GeV; _maxweight[36] = 3.; _incoming[37] = 20413; _outgoingP[37] = 211; _outgoingV[37] = 423; _coupling[37] = 1.926/GeV; _maxweight[37] = 3.; _incoming[38] = 20413; _outgoingP[38] = 111; _outgoingV[38] = 413; _coupling[38] = 1.367/GeV; _maxweight[38] = 3.; // decaymode B_1 to B* pi _incoming[39] = 10523; _outgoingP[39] = 211; _outgoingV[39] = 513; _coupling[39] = 0.130/GeV; _maxweight[39] = 2.2; _incoming[40] = 10523; _outgoingP[40] = 111; _outgoingV[40] = 523; _coupling[40] = 0.0924/GeV; _maxweight[40] = 2.2; _incoming[41] = 10513; _outgoingP[41] = -211; _outgoingV[41] = 523; _coupling[41] = 0.130/GeV; _maxweight[41] = 2.2; _incoming[42] = 10513; _outgoingP[42] = 111; _outgoingV[42] = 513; _coupling[42] = 0.0924/GeV; _maxweight[42] = 2.2; // decaymode B'_1 to B* pi _incoming[43] = 20523; _outgoingP[43] = 211; _outgoingV[43] = 513; _coupling[43] = 0.445/GeV; _maxweight[43] = 2.2; _incoming[44] = 20523; _outgoingP[44] = 111; _outgoingV[44] = 523; _coupling[44] = 0.314/GeV; _maxweight[44] = 2.2; _incoming[45] = 20513; _outgoingP[45] = -211; _outgoingV[45] = 523; _coupling[45] = 0.445/GeV; _maxweight[45] = 2.2; _incoming[46] = 20513; _outgoingP[46] = 111; _outgoingV[46] = 513; _coupling[46] = 0.314/GeV; _maxweight[46] = 2.2; // decaymode D_s1 to D* pi _incoming[47] = 10433; _outgoingP[47] = 111; _outgoingV[47] = 433; _coupling[47] = 0.022/GeV; _maxweight[47] = 2.5; // decaymode D_s1 to D gamma _incoming[48] = 10433; _outgoingP[48] = 431; _outgoingV[48] = 22; _coupling[48] = 0.0587/GeV; _maxweight[48] = 2.1; // decaymode B_s1 to B gamma _incoming[49] = 10533; _outgoingP[49] = 531; _outgoingV[49] = 22; _coupling[49] = 0.142/GeV; _maxweight[49] = 2.; // decaymode B_s1 to B* pi _incoming[50] = 10533; _outgoingP[50] = 111; _outgoingV[50] = 533; _coupling[50] = 0.0074/GeV; _maxweight[50] = 2.1; // decaymode B_c1 to B_c gamma _incoming[51] = 10543; _outgoingP[51] = 541; _outgoingV[51] = 22; _coupling[51] = 0.0759/GeV; _maxweight[51] = 2.2; // decaymode B'_c1 to B_c gamma _incoming[52] = 20543; _outgoingP[52] = 541; _outgoingV[52] = 22; _coupling[52] = 0.175/GeV; _maxweight[52] = 2.2; // decaymode h_c to eta_c gamma _incoming[53] = 10443; _outgoingP[53] = 441; _outgoingV[53] = 22; _coupling[53] = 0.329/GeV; _maxweight[53] = 4.; // decaymode h_b to eta_b gamma _incoming[54] = 10553; _outgoingP[54] = 551; _outgoingV[54] = 22; _coupling[54] = 0.0356/GeV; _maxweight[54] = 3.5; // a_1 to K* K _incoming[55] = 20213; _outgoingP[55] = -311; _outgoingV[55] = 323; _coupling[55] = 3.42/GeV; _maxweight[55] = 2.5; _incoming[56] = 20213; _outgoingP[56] = 321; _outgoingV[56] = -313; _coupling[56] = 3.42/GeV; _maxweight[56] = 2.5; _incoming[57] = 20113; _outgoingP[57] = 321; _outgoingV[57] = -323; _coupling[57] = 3.42/GeV; _maxweight[57] = 4.0; _incoming[58] = 20113; _outgoingP[58] = 311; _outgoingV[58] = -313; _coupling[58] = 3.42/GeV; _maxweight[58] = 4.0; // a_1 to gamma pi _incoming[59] = 20113; _outgoingP[59] = 111; _outgoingV[59] = 22; _coupling[59] = 0.01/GeV; _maxweight[59] = 2.; _incoming[60] = 20213; _outgoingP[60] = 211; _outgoingV[60] = 22; _coupling[60] = 0.01/GeV; _maxweight[60] = 2.; // f'_1 to K* K _incoming[61] = 20333; _outgoingP[61] = 321; _outgoingV[61] = -323; _coupling[61] = 1.637/GeV; _maxweight[61] = 7.; _incoming[62] = 20333; _outgoingP[62] = 311; _outgoingV[62] = -313; _coupling[62] = 1.737/GeV; _maxweight[62] = 7.; // decay mode K_1 to gamma K _incoming[63] = 10313; _outgoingV[63] = 22; _outgoingP[63] = 311; _coupling[63] = 0.119/GeV; _maxweight[63] = 7.5; // decay mode K'_1 to gamma K _incoming[64] = 20313; _outgoingV[64] = 22; _outgoingP[64] = 311; _coupling[64] = 0.220/GeV; _maxweight[64] = 8.; // decaymode B_s1 to B K _incoming[65] = 10533; _outgoingP[65] = -311; _outgoingV[65] = 513; _coupling[65] = 0.0418/GeV; _maxweight[65] = 2.; _incoming[66] = 10533; _outgoingP[66] = -321; _outgoingV[66] = 523; _coupling[66] = 0.0373/GeV; _maxweight[66] = 2.; // initial size of the arrays _initsize = _coupling.size(); // intermediates generateIntermediates(false); } int PVectorMesonVectorPScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoingV[ix]&&id2 ==_outgoingP[ix])|| (id2 ==_outgoingV[ix]&&id1 ==_outgoingP[ix])) imode=ix; } if(idbar==_incoming[ix]&&imode<0) { if((id1bar==_outgoingV[ix]&&id2bar==_outgoingP[ix])|| (id2bar==_outgoingV[ix]&&id1bar==_outgoingP[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void PVectorMesonVectorPScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoingV << _outgoingP << _maxweight << ounit(_coupling,1/GeV); } void PVectorMesonVectorPScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoingV >> _outgoingP >> _maxweight >> iunit(_coupling,1/GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigPVectorMesonVectorPScalarDecayer("Herwig::PVectorMesonVectorPScalarDecayer", "HwVMDecay.so"); void PVectorMesonVectorPScalarDecayer::Init() { static ClassDocumentation documentation ("The PVectorMesonVectorPScalarDecayer class is designed for the " "decay of a pseudovector meson to a vector meson, or the photon, and a " "pseudoscalar meson."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &PVectorMesonVectorPScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingVector ("OutgoingVector", "The PDG code for the outgoing spin-1 particle", &PVectorMesonVectorPScalarDecayer::_outgoingV, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingPScalar ("OutgoingPScalar", "The PDG code for the outgoing spin-0 particle", &PVectorMesonVectorPScalarDecayer::_outgoingP, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &PVectorMesonVectorPScalarDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 100./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &PVectorMesonVectorPScalarDecayer::_maxweight, 0, 0, 0, 0., 10000., false, false, true); } double PVectorMesonVectorPScalarDecayer::me2(const int, const Particle & inpart, const ParticleVector& decay, MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin0))); // is the vector massless bool photon(_outgoingV[imode()]==ParticleID::gamma); if(meopt==Initialize) { VectorWaveFunction::calculateWaveFunctions(_vectors[0],_rho, const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { VectorWaveFunction::constructSpinInfo(_vectors[0],const_ptr_cast(&inpart), incoming,true,false); VectorWaveFunction::constructSpinInfo(_vectors[1],decay[0], outgoing,true,photon); ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true); return 0.; } VectorWaveFunction::calculateWaveFunctions(_vectors[1],decay[0],outgoing,photon); // compute the matrix element Energy2 p0dotpv(inpart.momentum()*decay[0]->momentum()); complex epsdot(ZERO); InvEnergy2 pre(_coupling[imode()]/inpart.mass()); for(unsigned ix=0;ix<3;++ix) { if(ix==1&&photon) { for(unsigned int iy=0;iy<3;++iy) (*ME())(iy,ix,0)=0.; } else { epsdot=_vectors[1][ix]*inpart.momentum(); for(unsigned int iy=0;iy<3;++iy) - (*ME())(iy,ix,0)=pre*_vectors[0][iy].dot(p0dotpv*_vectors[1][ix] - -epsdot*decay[0]->momentum()); + (*ME())(iy,ix,0)=Complex(pre*_vectors[0][iy].dot(p0dotpv*_vectors[1][ix] + -epsdot*decay[0]->momentum())); } } // test of the matrix element // double me = newME.contract(rhoin).real(); // Energy pcm=Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = sqr(_coupling[imode()])/3.*(2.*sqr(pcm)+3.*sqr(decay[0]->mass())); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << "\n"; // return the answer return ME()->contract(_rho).real(); } bool PVectorMesonVectorPScalarDecayer::twoBodyMEcode(const DecayMode & dm, int & mecode, double & coupling) const { int id(dm.parent()->id()),idbar(id); if(dm.parent()->CC()){idbar=dm.parent()->CC()->id();} ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()),id1bar(id1); if((**pit).CC()){id1bar=(**pit).CC()->id();} ++pit; int id2((**pit).id()),id2bar(id2); if((**pit).CC()){id2bar=(**pit).CC()->id();} unsigned int ix(0); bool order(false); int imode(-1); do { if(id==_incoming[ix]) { if(id1 ==_outgoingV[ix]&&id2 ==_outgoingP[ix]) { imode=ix; order=true; } if(id2 ==_outgoingV[ix]&&id1 ==_outgoingP[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingV[ix]&&id2bar==_outgoingP[ix]) { imode=ix; order=true; } if(id2bar==_outgoingV[ix]&&id1bar==_outgoingP[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling = _coupling[imode]*dm.parent()->mass(); mecode = 4; return order; } void PVectorMesonVectorPScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "newdef " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "insert " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/VectorMeson/VectorMesonPVectorPScalarDecayer.cc b/Decay/VectorMeson/VectorMesonPVectorPScalarDecayer.cc --- a/Decay/VectorMeson/VectorMesonPVectorPScalarDecayer.cc +++ b/Decay/VectorMeson/VectorMesonPVectorPScalarDecayer.cc @@ -1,327 +1,327 @@ // -*- C++ -*- // // VectorMesonPVectorPScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the VectorMesonPVectorPScalarDecayer class. // #include "VectorMesonPVectorPScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void VectorMesonPVectorPScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } void VectorMesonPVectorPScalarDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoingA.size()||isize!=_outgoingP.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters in " << "VectorMesonPVectorPScalarDecayer::doinit()" << Exception::abortnow; // set up the integration channels vector wgt(0); tPDVector extpart(3); DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); extpart[1]=getParticleData(_outgoingA[ix]); extpart[2]=getParticleData(_outgoingP[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } VectorMesonPVectorPScalarDecayer::VectorMesonPVectorPScalarDecayer() : _coupling(21), _incoming(21), _outgoingA(21), _outgoingP(21), _maxweight(21) { // Jpsi to K_1 K _incoming[0] = 443; _outgoingA[0] = 20313; _outgoingP[0] = -311; _coupling[0] = 0.00127/GeV; _maxweight[0] = 12.; _incoming[1] = 443; _outgoingA[1] = 20323; _outgoingP[1] = -321; _coupling[1] = 0.00127/GeV; _maxweight[1] = 12.; // Jpsi to b_1 pi _incoming[2] = 443; _outgoingA[2] = 10213; _outgoingP[2] = -211; _coupling[2] = 0.00106/GeV; _maxweight[2] = 10.5; _incoming[3] = 443; _outgoingA[3] = 10113; _outgoingP[3] = 111; _coupling[3] = 0.00106/GeV; _maxweight[3] = 10.5; // psi(2s) to K_1 K _incoming[4] = 100443; _outgoingA[4] = 10313; _outgoingP[4] = -311; _coupling[4] = 0.00152/GeV; _maxweight[4] = 12.; _incoming[5] = 100443; _outgoingA[5] = 10323; _outgoingP[5] = -321; _coupling[5] = 0.00152/GeV; _maxweight[5] = 12.; // psi(2s) to b_1 pi _incoming[6] = 100443; _outgoingA[6] = 10213; _outgoingP[6] = -211; _coupling[6] = 0.000694/GeV; _maxweight[6] = 10.5; _incoming[7] = 100443; _outgoingA[7] = 10113; _outgoingP[7] = 111; _coupling[7] = 0.000694/GeV; _maxweight[7] = 10.5; // rho'' decays // to h_1 _incoming[8] = 30213; _outgoingA[8] = 10223; _outgoingP[8] = 211; _coupling[8] = 1.45/GeV; _maxweight[8] = 5.5; _incoming[9] = 30113; _outgoingA[9] = 10223; _outgoingP[9] = 111; _coupling[9] = 1.45/GeV; _maxweight[9] = 5.5; // to a_1 _incoming[10] = 30213; _outgoingA[10] = 20213; _outgoingP[10] = 111; _coupling[10] = 1.09/GeV; _maxweight[10] = 4.; _incoming[11] = 30213; _outgoingA[11] = 20113; _outgoingP[11] = 211; _coupling[11] = 1.09/GeV; _maxweight[11] = 4.; _incoming[12] = 30113; _outgoingA[12] = 20213; _outgoingP[12] = -211; _coupling[12] = 1.09/GeV; _maxweight[12] = 4.; // rho' decays // to h_1 _incoming[13] = 100213; _outgoingA[13] = 10223; _outgoingP[13] = 211; _coupling[13] = 1.20/GeV; _maxweight[13] = 5.; _incoming[14] = 100113; _outgoingA[14] = 10223; _outgoingP[14] = 111; _coupling[14] = 1.20/GeV; _maxweight[14] = 5.; // to a_1 _incoming[15] = 100213; _outgoingA[15] = 20213; _outgoingP[15] = 111; _coupling[15] = 1.83/GeV; _maxweight[15] = 4.; _incoming[16] = 100213; _outgoingA[16] = 20113; _outgoingP[16] = 211; _coupling[16] = 1.83/GeV; _maxweight[16] = 4.; _incoming[17] = 100113; _outgoingA[17] = 20213; _outgoingP[17] = -211; _coupling[17] = 1.83/GeV; _maxweight[17] = 4.; // omega' to b pi _incoming[18] = 100223; _outgoingA[18] = 10113; _outgoingP[18] = 111; _coupling[18] = 1.659/GeV; _maxweight[18] = 7.; _incoming[19] = 100223; _outgoingA[19] = 10213; _outgoingP[19] = -211; _coupling[19] = 1.659/GeV; _maxweight[19] = 6.; // psi(2s) -> h_c pi0 _incoming[20] = 100443; _outgoingA[20] = 10443; _outgoingP[20] = 111; _coupling[20] = 0.0029/GeV; _maxweight[20] = 6.; // initial size of the arrays _initsize = _coupling.size(); // intermediates generateIntermediates(false); } int VectorMesonPVectorPScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoingA[ix]&&id2 ==_outgoingP[ix])|| (id2 ==_outgoingA[ix]&&id1 ==_outgoingP[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoingA[ix]&&id2bar==_outgoingP[ix])|| (id2bar==_outgoingA[ix]&&id1bar==_outgoingP[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void VectorMesonPVectorPScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoingA << _outgoingP << _maxweight << ounit(_coupling,1/GeV); } void VectorMesonPVectorPScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoingA >> _outgoingP >> _maxweight >> iunit(_coupling,1/GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigVectorMesonPVectorPScalarDecayer("Herwig::VectorMesonPVectorPScalarDecayer", "HwVMDecay.so"); void VectorMesonPVectorPScalarDecayer::Init() { static ClassDocumentation documentation ("The VectorMesonPVectorPScalarDecayer class is designed for the " "decay of a vector meson to a pseudovector meson and a " "pseudoscalar meson."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &VectorMesonPVectorPScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingVector ("OutgoingPVector", "The PDG code for the outgoing spin-1 particle", &VectorMesonPVectorPScalarDecayer::_outgoingA, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingScalar ("OutgoingPScalar", "The PDG code for the outgoing spin-0 particle", &VectorMesonPVectorPScalarDecayer::_outgoingP, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &VectorMesonPVectorPScalarDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 100./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &VectorMesonPVectorPScalarDecayer::_maxweight, 0, 0, 0, 0., 100., false, false, true); } double VectorMesonPVectorPScalarDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin0))); // is the vector massless bool photon(_outgoingA[imode()]==ParticleID::gamma); if(meopt==Initialize) { VectorWaveFunction::calculateWaveFunctions(_vectors[0],_rho, const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { VectorWaveFunction::constructSpinInfo(_vectors[0],const_ptr_cast(&inpart), incoming,true,false); VectorWaveFunction::constructSpinInfo(_vectors[1],decay[0], outgoing,true,photon); ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true); return 0.; } VectorWaveFunction::calculateWaveFunctions(_vectors[1],decay[0],outgoing,photon); // compute the matrix element Energy2 p0dotpv(inpart.momentum()*decay[0]->momentum()); complex epsdot(ZERO); InvEnergy2 pre(_coupling[imode()]/inpart.mass()); for(unsigned int ix=0;ix<3;++ix) { epsdot=_vectors[1][ix]*inpart.momentum(); for(unsigned int iy=0;iy<3;++iy) { - (*ME())(iy,ix,0)=pre*(p0dotpv*(_vectors[1][ix].dot(_vectors[0][iy]))- - epsdot*(_vectors[0][iy]*decay[0]->momentum())); + (*ME())(iy,ix,0)=Complex(pre*(p0dotpv*(_vectors[1][ix].dot(_vectors[0][iy]))- + epsdot*(_vectors[0][iy]*decay[0]->momentum()))); } } // test of the matrix element // double me = ME()->contract(_rho).real(); // Energy pcm=Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = sqr(_coupling[imode()])/3.*(2.*sqr(pcm)+3.*sqr(decay[0]->mass())); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << "\n"; // return the answer return ME()->contract(_rho).real(); } bool VectorMesonPVectorPScalarDecayer::twoBodyMEcode(const DecayMode & dm, int & mecode, double & coupling) const { int imode(-1); int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(false); do { if(id==_incoming[ix]) { if(id1 ==_outgoingA[ix]&&id2 ==_outgoingP[ix]) { imode=ix; order=true; } if(id2 ==_outgoingA[ix]&&id1 ==_outgoingP[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingA[ix]&&id2bar==_outgoingP[ix]) { imode=ix; order=true; } if(id2bar==_outgoingA[ix]&&id1bar==_outgoingP[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling = _coupling[imode]*dm.parent()->mass(); mecode = 4; return order; } void VectorMesonPVectorPScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingPVector " << ix << " " << _outgoingA[ix] << "\n"; output << "newdef " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingPVector " << ix << " " << _outgoingA[ix] << "\n"; output << "insert " << name() << ":OutgoingPScalar " << ix << " " << _outgoingP[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/VectorMeson/VectorMesonVectorScalarDecayer.cc b/Decay/VectorMeson/VectorMesonVectorScalarDecayer.cc --- a/Decay/VectorMeson/VectorMesonVectorScalarDecayer.cc +++ b/Decay/VectorMeson/VectorMesonVectorScalarDecayer.cc @@ -1,315 +1,315 @@ // -*- C++ -*- // // VectorMesonVectorScalarDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the VectorMesonVectorScalarDecayer class. // #include "VectorMesonVectorScalarDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/PDT/DecayMode.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Decay/TwoBodyDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; void VectorMesonVectorScalarDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { for(unsigned int ix=0;ix<_incoming.size();++ix) if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight(); } } VectorMesonVectorScalarDecayer::VectorMesonVectorScalarDecayer() : _coupling(16), _incoming(16), _outgoingV(16), _outgoingS(16), _maxweight(16) { // decay of the phi to the a_0 and f_0 and a photon _incoming[0] = 333; _outgoingV[0] = 22; _outgoingS[0] = 9000111; _coupling[0] = 0.238/GeV; _maxweight[0] = 10.; _incoming[1] = 333; _outgoingV[1] = 22; _outgoingS[1] = 9010221; _coupling[1] = 0.267/GeV; _maxweight[1] = 15.; // Jpsi decays _incoming[2] = 443; _outgoingV[2] = 22; _outgoingS[2] = 10331; _coupling[2] = 0.00207/GeV; _maxweight[2] = 3.; _incoming[3] = 443; _outgoingV[3] = 223; _outgoingS[3] = 10331; _coupling[3] = 0.00144/GeV; _maxweight[3] = 9.; _incoming[4] = 443; _outgoingV[4] = 333; _outgoingS[4] = 10331; _coupling[4] = 0.00127/GeV; _maxweight[4] = 9.; _incoming[5] = 443; _outgoingV[5] = 333; _outgoingS[5] = 9010221; _coupling[5] = 0.00064/GeV; _maxweight[5] = 6.; _incoming[6] = 443; _outgoingV[6] = 223; _outgoingS[6] = 9010221; _coupling[6] = 0.00044/GeV; _maxweight[6] = 7.; _incoming[15] = 443; _outgoingV[15] = 22; _outgoingS[15] = 9030221; _coupling[15] = 0.00114/GeV; _maxweight[15] = 3.; // upsilon(2s) _incoming[7] = 100553; _outgoingV[7] = 22; _outgoingS[7] = 10551; _coupling[7] = 0.105/GeV; _maxweight[7] = 2.; // upsilon(3s) _incoming[8] = 200553; _outgoingV[8] = 22; _outgoingS[8] = 110551; _coupling[8] = 0.160/GeV; _maxweight[8] = 2.; // psi2s decays _incoming[9] = 100443; _outgoingV[9] = 22; _outgoingS[9] = 10441; _coupling[9] = 0.258/GeV; _maxweight[9] = 4.; _incoming[10] = 100443; _outgoingV[10] = 22; _outgoingS[10] = 331; _coupling[10] = 0.0508/GeV; _maxweight[10] = 2.; _incoming[11] = 100443; _outgoingV[11] = 22; _outgoingS[11] = 10331; _coupling[11] = 0.000680/GeV; _maxweight[11] = 2.; _incoming[12] = 100443; _outgoingV[12] = 333; _outgoingS[12] = 9010221; _coupling[12] = 0.000509/GeV; _maxweight[12] = 6.; // rho' to sigma rho _incoming[13] = 100213; _outgoingV[13] = 213; _outgoingS[13] = 9000221; _coupling[13] = 5.056/GeV; _maxweight[13] = 5.5; _incoming[14] = 100113; _outgoingV[14] = 113; _outgoingS[14] = 9000221; _coupling[14] = 5.056/GeV; _maxweight[14] = 5.5; // initial size of the arrays _initsize = _coupling.size(); // intermediates generateIntermediates(false); } void VectorMesonVectorScalarDecayer::doinit() { DecayIntegrator::doinit(); // check consistence of the parameters unsigned int isize=_incoming.size(); if(isize!=_outgoingV.size()||isize!=_outgoingS.size()|| isize!=_maxweight.size()||isize!=_coupling.size()) throw InitException() << "Inconsistent parameters in " << "VectorMesonVectorScalarDecayer::doinit()" << Exception::abortnow; // set up the integration channels vector wgt(0); tPDVector extpart(3); DecayPhaseSpaceModePtr mode; for(unsigned int ix=0;ix<_incoming.size();++ix) { extpart[0]=getParticleData(_incoming[ix]); extpart[1]=getParticleData(_outgoingV[ix]); extpart[2]=getParticleData(_outgoingS[ix]); if(extpart[0]&&extpart[1]&&extpart[2]) mode=new_ptr(DecayPhaseSpaceMode(extpart,this)); else mode=DecayPhaseSpaceModePtr(); addMode(mode,_maxweight[ix],wgt); } } int VectorMesonVectorScalarDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=2) return -1; int id(parent->id()); int idbar = parent->CC() ? parent->CC()->id() : id; int id1(children[0]->id()); int id1bar = children[0]->CC() ? children[0]->CC()->id() : id1; int id2(children[1]->id()); int id2bar = children[1]->CC() ? children[1]->CC()->id() : id2; int imode(-1); unsigned int ix(0); cc=false; do { if(id ==_incoming[ix]) { if((id1 ==_outgoingV[ix]&&id2 ==_outgoingS[ix])|| (id2 ==_outgoingV[ix]&&id1 ==_outgoingS[ix])) imode=ix; } if(idbar==_incoming[ix]) { if((id1bar==_outgoingV[ix]&&id2bar==_outgoingS[ix])|| (id2bar==_outgoingV[ix]&&id1bar==_outgoingS[ix])) { imode=ix; cc=true; } } ++ix; } while(ix<_incoming.size()&&imode<0); return imode; } void VectorMesonVectorScalarDecayer::persistentOutput(PersistentOStream & os) const { os << _incoming << _outgoingV << _outgoingS << _maxweight << ounit(_coupling,1/GeV); } void VectorMesonVectorScalarDecayer::persistentInput(PersistentIStream & is, int) { is >> _incoming >> _outgoingV >> _outgoingS >> _maxweight >> iunit(_coupling,1/GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigVectorMesonVectorScalarDecayer("Herwig::VectorMesonVectorScalarDecayer", "HwVMDecay.so"); void VectorMesonVectorScalarDecayer::Init() { static ClassDocumentation documentation ("The VectorMesonVectorScalarDecayer class is designed for the " "decay of a vector meson to a vector meson, or the photon, and a " "scalar meson."); static ParVector interfaceIncoming ("Incoming", "The PDG code for the incoming particle", &VectorMesonVectorScalarDecayer::_incoming, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingVector ("OutgoingVector", "The PDG code for the outgoing spin-1 particle", &VectorMesonVectorScalarDecayer::_outgoingV, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceOutcomingScalar ("OutgoingScalar", "The PDG code for the outgoing spin-0 particle", &VectorMesonVectorScalarDecayer::_outgoingS, 0, 0, 0, -10000000, 10000000, false, false, true); static ParVector interfaceCoupling ("Coupling", "The coupling for the decay mode", &VectorMesonVectorScalarDecayer::_coupling, 1/GeV, 0, ZERO, ZERO, 100./GeV, false, false, true); static ParVector interfaceMaxWeight ("MaxWeight", "The maximum weight for the decay mode", &VectorMesonVectorScalarDecayer::_maxweight, 0, 0, 0, 0., 100., false, false, true); } double VectorMesonVectorScalarDecayer::me2(const int, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { if(!ME()) ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin0))); // is the vector massless bool photon(_outgoingV[imode()]==ParticleID::gamma); if(meopt==Initialize) { VectorWaveFunction::calculateWaveFunctions(_vectors[0],_rho, const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { VectorWaveFunction::constructSpinInfo(_vectors[0],const_ptr_cast(&inpart), incoming,true,false); VectorWaveFunction::constructSpinInfo(_vectors[1],decay[0], outgoing,true,photon); ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true); return 0.; } VectorWaveFunction::calculateWaveFunctions(_vectors[1],decay[0],outgoing,photon); // compute the matrix element Energy2 p0dotpv(inpart.momentum()*decay[0]->momentum()); complex epsdot(ZERO); InvEnergy2 pre(_coupling[imode()]/inpart.mass()); for(unsigned int ix=0;ix<3;++ix) { if(ix==1&&photon) { for(unsigned int iy=0;iy<3;++iy) (*ME())(iy,ix,0)=0.; } else { epsdot=_vectors[1][ix]*inpart.momentum(); for(unsigned int iy=0;iy<3;++iy) { - (*ME())(iy,ix,0)=pre*_vectors[0][iy].dot(p0dotpv*_vectors[1][ix]- - epsdot*decay[0]->momentum()); + (*ME())(iy,ix,0)=Complex(pre*_vectors[0][iy].dot(p0dotpv*_vectors[1][ix]- + epsdot*decay[0]->momentum())); } } } // test of the matrix element // double me = newME.contract(rhoin).real(); // Energy pcm=Kinematics::pstarTwoBodyDecay(inpart.mass(),decay[0]->mass(), // decay[1]->mass()); // double test = sqr(_coupling[imode()])/3.*(2.*sqr(pcm)+3.*sqr(decay[0]->mass())); // cerr << "testing matrix element for " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << me << " " << test << " " << (me-test)/(me+test) << "\n"; // return the answer return ME()->contract(_rho).real(); } bool VectorMesonVectorScalarDecayer::twoBodyMEcode(const DecayMode & dm, int & mecode, double & coupling) const { int id(dm.parent()->id()); int idbar = dm.parent()->CC() ? dm.parent()->CC()->id() : id; ParticleMSet::const_iterator pit(dm.products().begin()); int id1((**pit).id()); int id1bar = (**pit).CC() ? (**pit).CC()->id() : id1; ++pit; int id2((**pit).id()); int id2bar = (**pit).CC() ? (**pit).CC()->id() : id2; unsigned int ix(0); bool order(false); int imode(-1); do { if(id==_incoming[ix]) { if(id1 ==_outgoingV[ix]&&id2 ==_outgoingS[ix]) { imode=ix; order=true; } if(id2 ==_outgoingV[ix]&&id1 ==_outgoingS[ix]) { imode=ix; order=false; } } if(idbar==_incoming[ix]&&imode<0) { if(id1bar==_outgoingV[ix]&&id2bar==_outgoingS[ix]) { imode=ix; order=true; } if(id2bar==_outgoingV[ix]&&id1bar==_outgoingS[ix]) { imode=ix; order=false; } } ++ix; } while(ix<_incoming.size()&&imode<0); coupling = _coupling[imode]*dm.parent()->mass(); mecode = 4; return order; } void VectorMesonVectorScalarDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // the rest of the parameters for(unsigned int ix=0;ix<_incoming.size();++ix) { if(ix<_initsize) { output << "newdef " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "newdef " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "newdef " << name() << ":OutgoingScalar " << ix << " " << _outgoingS[ix] << "\n"; output << "newdef " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "newdef " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } else { output << "insert " << name() << ":Incoming " << ix << " " << _incoming[ix] << "\n"; output << "insert " << name() << ":OutgoingVector " << ix << " " << _outgoingV[ix] << "\n"; output << "insert " << name() << ":OutgoingScalar " << ix << " " << _outgoingS[ix] << "\n"; output << "insert " << name() << ":Coupling " << ix << " " << _coupling[ix]*GeV << "\n"; output << "insert " << name() << ":MaxWeight " << ix << " " << _maxweight[ix] << "\n"; } } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/VectorMeson/a1SimpleDecayer.cc b/Decay/VectorMeson/a1SimpleDecayer.cc --- a/Decay/VectorMeson/a1SimpleDecayer.cc +++ b/Decay/VectorMeson/a1SimpleDecayer.cc @@ -1,479 +1,479 @@ // -*- C++ -*- // // a1SimpleDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the a1SimpleDecayer class. // #include "a1SimpleDecayer.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/PDT/WidthCalculatorBase.h" #include "Herwig/PDT/ThreeBodyAllOnCalculator.h" #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" using namespace Herwig; using namespace ThePEG::Helicity; a1SimpleDecayer::a1SimpleDecayer() : _rhomass(3), _rhowidth(3), _rhowgts(3),_localparameters(true), _coupling(47.95/GeV), _onemax(5.4474), _twomax(5.47784), _threemax(5.40185), _onewgts(6), _twowgts(6), _threewgts(6), _mpi(ZERO) { // rho masses, widths and weights _rhomass[0] = 0.773*GeV; _rhowidth[0] = 0.145*GeV; _rhowgts[0] = 1.0; _rhomass[1] = 1.370*GeV; _rhowidth[1] = 0.510*GeV; _rhowgts[1] = -0.145; _rhomass[2] = 1.750*GeV; _rhowidth[2] = 0.120*GeV; _rhowgts[2] = 0.; // integration weights _onewgts[0] = 0.235562; _twowgts[0] = 0.236208; _threewgts[0] = 0.234259; _onewgts[1] = 0.231098; _twowgts[1] = 0.229481; _threewgts[1] = 0.233634; _onewgts[2] = 0.131071; _twowgts[2] = 0.131169; _threewgts[2] = 0.135922; _onewgts[3] = 0.131135; _twowgts[3] = 0.133604; _threewgts[3] = 0.129231; _onewgts[4] = 0.135841; _twowgts[4] = 0.132685; _threewgts[4] = 0.133949; _onewgts[5] = 0.135294; _twowgts[5] = 0.136854; _threewgts[5] = 0.133005; generateIntermediates(true); } void a1SimpleDecayer::doinit() { DecayIntegrator::doinit(); // pointers to the particles we need as external particles tPDPtr a1p = getParticleData(ParticleID::a_1plus); tPDPtr a10 = getParticleData(ParticleID::a_10); tPDPtr pip = getParticleData(ParticleID::piplus); tPDPtr pim = getParticleData(ParticleID::piminus); tPDPtr pi0 = getParticleData(ParticleID::pi0); // the different rho resonances tPDPtr rhop[3] = {getParticleData(213),getParticleData(100213), getParticleData(30213)}; tPDPtr rho0[3] = {getParticleData(113),getParticleData(100113), getParticleData(30113)}; tPDPtr rhom[3] = {getParticleData(-213),getParticleData(-100213), getParticleData(-30213)}; tPDVector extpart(4); DecayPhaseSpaceChannelPtr newchannel; DecayPhaseSpaceModePtr mode; // decay mode a_1+ -> pi+ pi0 pi0 extpart[0]=a1p; extpart[1]=pi0; extpart[2]=pi0; extpart[3]=pip; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { if(!rhop[ix]) continue; // first rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(rhop[ix],0,0.0,1,3); mode->addChannel(newchannel); // second rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(rhop[ix],0,0.0,2,3); mode->addChannel(newchannel); } if(_onewgts.size()!=mode->numberChannels()) _onewgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_onemax,_onewgts); // decay mode a_10 -> pi+ pi- pi0 extpart[0]=a10; extpart[1]=pip; extpart[2]=pim; extpart[3]=pi0; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { if(!rhop[ix]) continue; // first rho channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,2); newchannel->addIntermediate(rhop[ix],0,0.0,1,3); mode->addChannel(newchannel); // second channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,1); newchannel->addIntermediate(rhom[ix],0,0.0,2,3); mode->addChannel(newchannel); } if(_twowgts.size()!=mode->numberChannels()) _twowgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_twomax,_twowgts); // decay mode a_1+ -> pi+ pi+ pi- extpart[0]=a1p; extpart[1]=pip; extpart[2]=pip; extpart[3]=pim; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; // the neutral rho channels // first channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(rho0[ix],0,0.0,1,3); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(rho0[ix],0,0.0,2,3); mode->addChannel(newchannel); } if(_threewgts.size()!=mode->numberChannels()) _threewgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_threemax,_threewgts); // if using local parameters set the values in the phase space channels if(_localparameters) { for(unsigned int iy=0;iy<_rhomass.size();++iy) { resetIntermediate(rho0[iy],_rhomass[iy],_rhowidth[iy]); resetIntermediate(rhop[iy],_rhomass[iy],_rhowidth[iy]); resetIntermediate(rhom[iy],_rhomass[iy],_rhowidth[iy]); } // make sure the rho array has enough masses if(_rhomass.size()<3) { for(unsigned int ix=_rhomass.size();ix<3;++ix) { _rhomass.push_back(rhop[ix]->mass()); _rhowidth.push_back(rhop[ix]->width()); } } } // set the local variables if needed else { // masses and widths for the particles _rhomass.resize(3);_rhowidth.resize(3); for(unsigned int ix=0;ix<3;++ix) { if(!rhop[ix]) continue; _rhomass[ix]=rhop[ix]->mass(); _rhowidth[ix]=rhop[ix]->width(); } } _mpi = pip->mass(); } void a1SimpleDecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { // get the weights for the different channels for(unsigned int ix=0;ix<_onewgts.size();++ix) _onewgts[ix]=mode(0)->channelWeight(ix); for(unsigned int ix=0;ix<_twowgts.size();++ix) _twowgts[ix]=mode(1)->channelWeight(ix); for(unsigned int ix=0;ix<_threewgts.size();++ix) _threewgts[ix]=mode(2)->channelWeight(ix); // get the maximum weight _onemax = mode(0)->maxWeight(); _twomax = mode(1)->maxWeight(); _threemax = mode(2)->maxWeight(); } } void a1SimpleDecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_rhomass,GeV) << ounit(_rhowidth,GeV) << _rhowgts << _localparameters << ounit(_coupling,1./GeV) << _onemax << _twomax << _threemax << _onewgts << _twowgts << _threewgts << ounit(_mpi,GeV); } void a1SimpleDecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_rhomass,GeV) >> iunit(_rhowidth,GeV) >> _rhowgts >> _localparameters >> iunit(_coupling,1./GeV) >> _onemax >> _twomax >> _threemax >> _onewgts >> _twowgts >> _threewgts >> iunit(_mpi,GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwiga1SimpleDecayer("Herwig::a1SimpleDecayer", "HwVMDecay.so"); void a1SimpleDecayer::Init() { static ClassDocumentation documentation ("The a1SimpleDecayer class implements a simple model for the decay of" " the a_1 to three pions based on the approach of Kuhn and Santanmaria," " Z.Phys. C48, 445 (1990)", "The decays of the $a_1$ were modelled using the approach of " "\\cite{Kuhn:1990ad}.\n", "\\bibitem{Kuhn:1990ad} J.~H.~Kuhn and A.~Santamaria,\n" "Z.\\ Phys.\\ C {\\bf 48} (1990) 445.\n" "%%CITATION = ZEPYA,C48,445;%%\n"); static Switch interfaceLocalParameters ("LocalParameters", "Use local values of the intermediate resonances masses and widths", &a1SimpleDecayer::_localparameters, true, false, false); static SwitchOption interfaceLocalParametersLocal (interfaceLocalParameters, "Local", "Use the local values", true); static SwitchOption interfaceLocalParametersDefault (interfaceLocalParameters, "ParticleData", "Use the values from the particleData objects", false); static Parameter interfaceCoupling ("Coupling", "The overall coupling for the decay", &a1SimpleDecayer::_coupling, 1./GeV, 47.95/GeV, ZERO, 100./GeV, false, false, Interface::limited); static ParVector interfacerhomass ("RhoMasses", "The masses of the different rho resonnaces", &a1SimpleDecayer::_rhomass, MeV, 0, ZERO, ZERO, 10000*MeV, false, false, true); static ParVector interfacerhowidth ("RhoWidths", "The widths of the different rho resonnaces", &a1SimpleDecayer::_rhowidth, MeV, 0, ZERO, ZERO, 10000*MeV, false, false, true); static ParVector interfaceRhoWeights ("RhoWeights", "Weight for the different rho resonances", &a1SimpleDecayer::_rhowgts, -1, 0.0, -10.0, 10.0, false, false, Interface::limited); static Parameter interfaceOneMax ("OneMax", "The maximum weight for the integration fo the channel a_1^+->pi+pi0pi0", &a1SimpleDecayer::_onemax, 5.57613, 0.0, 10000.0, false, false, true); static Parameter interfaceTwoMax ("TwoMax", "The maximum weight for the integration fo the channel a_1^0->pi+pi-pi0", &a1SimpleDecayer::_twomax, 5.61218, 0.0, 10000.0, false, false, true); static Parameter interfaceThreeMax ("ThreeMax", "The maximum weight for the integration fo the channel a_1^+->pi+pi+pi-", &a1SimpleDecayer::_threemax, 5.5384, 0.0, 10000.0, false, false, true); static ParVector interfaceonewgts ("OneChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^+->pi+pi0pi0", &a1SimpleDecayer::_onewgts, 0, 0, 0, 0., 1., false, false, true); static ParVector interfacetwowgts ("TwoChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^0->pi+pi-pi0", &a1SimpleDecayer::_twowgts, 0, 0, 0, 0., 1., false, false, true); static ParVector interfacethreewgts ("ThreeChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^+->pi+pi+pi-", &a1SimpleDecayer::_threewgts, 0, 0, 0, 0., 1., false, false, true); } int a1SimpleDecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=3) return -1; int id(parent->id()); // check the pions tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); int idtemp,npi0(0),npiplus(0),npiminus(0); for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(idtemp==ParticleID::piplus) ++npiplus; else if(idtemp==ParticleID::piminus) ++npiminus; else if(idtemp==ParticleID::pi0) ++npi0; } int imode(-1); // a_1+ decay modes if(id==ParticleID::a_1plus) { cc=false; if(npiplus==1&&npi0==2) imode=0; else if(npiplus==2&&npiminus==1) imode=2; } // a_1- modes else if(id==ParticleID::a_1minus) { cc=true; if(npiminus==1&&npi0==2) imode=0; else if(npiminus==2&&npiplus==1) imode=2; } // a_0 modes else if(id==ParticleID::a_10) { cc=false; if(npiminus==1&&npiplus==1&&npi0==1) imode=1; } return imode; } double a1SimpleDecayer::me2(const int ichan,const Particle & inpart, const ParticleVector & decay,MEOption meopt) const { if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1,PDT::Spin0,PDT::Spin0,PDT::Spin0))); useMe(); if(meopt==Initialize) { VectorWaveFunction::calculateWaveFunctions(_vectors,_rho, const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { VectorWaveFunction::constructSpinInfo(_vectors,const_ptr_cast(&inpart), incoming,true,false); // set up the spin information for the decay products for(unsigned int ix=0;ix<3;++ix) ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true); return 0.; } Lorentz5Vector > current; Energy2 s1 = (decay[1]->momentum()+decay[2]->momentum()).m2(); Energy2 s2 = (decay[0]->momentum()+decay[2]->momentum()).m2(); if(ichan<0) { current = rhoFormFactor(s2,-1)*(decay[0]->momentum()-decay[2]->momentum()) +rhoFormFactor(s1,-1)*(decay[1]->momentum()-decay[2]->momentum()); } else if(ichan<3) { current = rhoFormFactor(s2,ichan)*(decay[0]->momentum()-decay[2]->momentum()); } else if(ichan<6) { current = rhoFormFactor(s1,-1)*(decay[1]->momentum()-decay[2]->momentum()); } // compute the matrix element for(unsigned int ix=0;ix<3;++ix) - (*ME())(ix,0,0,0)=_coupling*current.dot(_vectors[ix]); + (*ME())(ix,0,0,0) = Complex(_coupling*current.dot(_vectors[ix])); // matrix element and identical particle factor double output=ME()->contract(_rho).real(); if(imode()!=1) output*=0.5; // test the output // double test = threeBodyMatrixElement(imode(),sqr(inpart.mass()), // s3,s2,s1,decay[0]->mass(),decay[1]->mass(), // decay[2]->mass()); // if(ichan<0) cerr << "testing matrix element " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << decay[2]->PDGName() << output << " " << test << " " // << (output-test)/(output+test) << "\n"; // return the answer return output; } double a1SimpleDecayer:: threeBodyMatrixElement(const int iopt,const Energy2 q2, const Energy2 s3, const Energy2 s2,const Energy2 s1, const Energy m1, const Energy m2 ,const Energy m3) const { Energy2 v12 = (s2-2.*sqr(m1)-2.*sqr(m3))+0.25*sqr(s1-s3-sqr(m1)+sqr(m3))/q2; Energy2 v22 = (s1-2.*sqr(m2)-2.*sqr(m3))+0.25*sqr(s2-s3-sqr(m2)+sqr(m3))/q2; Energy2 v1v2 = (0.5*q2-s3-0.5*(3*sqr(m3)-sqr(m1)-sqr(m2))) +0.25*(s1-s3-sqr(m1)+sqr(m3))*(s2-s3-sqr(m2)+sqr(m3))/q2; Complex rho1=rhoFormFactor(s2,-1); Complex rho2=rhoFormFactor(s1,-1); double me = sqr(_coupling)*real(v12*rho1*conj(rho1)+v22*rho2*conj(rho2) +2.*v1v2*rho1*conj(rho2))/3.; if(iopt!=1) me *= 0.5; return me; } WidthCalculatorBasePtr a1SimpleDecayer::threeBodyMEIntegrator(const DecayMode & dm) const { ParticleMSet::const_iterator pit = dm.products().begin(); ParticleMSet::const_iterator pend = dm.products().end(); int ncharged=0; for( ; pit!=pend;++pit) { if(abs((**pit).id())==ParticleID::piplus) ++ncharged; } --ncharged; // integrator to perform the integral vector inweights;inweights.push_back(0.5);inweights.push_back(0.5); vector intype;intype.push_back(2);intype.push_back(3); vector inmass(2,_rhomass[0]),inwidth(2,_rhowidth[0]); vector inpow(2,0.0); Energy mpi0=getParticleData(ParticleID::pi0)->mass(); Energy mpic=getParticleData(ParticleID::piplus)->mass(); Energy m[3]; m[0] = ncharged<2 ? mpi0 : mpic; m[1] = m[0]; m[2] = (ncharged==0||ncharged==2) ? mpi0 : mpic; return new_ptr(ThreeBodyAllOnCalculator (inweights,intype,inmass,inwidth,inpow,*this,ncharged,m[0],m[1],m[2])); } void a1SimpleDecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n"; output << "newdef " << name() << ":Coupling " << _coupling*GeV << "\n"; output << "newdef " << name() << ":OneMax " << _onemax << "\n"; output << "newdef " << name() << ":TwoMax " << _twomax << "\n"; output << "newdef " << name() << ":ThreeMax " << _threemax << "\n"; for(unsigned int ix=0;ix<_rhomass.size();++ix) { if(ix<3) output << "newdef " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/MeV << "\n"; else output << "insert " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/MeV << "\n"; } for(unsigned int ix=0;ix<_rhowidth.size();++ix) { if(ix<3) output << "newdef " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/MeV << "\n"; else output << "insert " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/MeV << "\n"; } for(unsigned int ix=0;ix<_rhowgts.size();++ix) { if(ix<3) output << "newdef " << name() << ":RhoWeights " << ix << " " << _rhowgts[ix] << "\n"; else output << "insert " << name() << ":RhoWeights " << ix << " " << _rhowgts[ix] << "\n"; } for(unsigned int ix=0;ix<_onewgts.size();++ix) { output << "newdef " << name() << ":OneChargedWeights " << ix << " " << _onewgts[ix] << "\n"; } for(unsigned int ix=0;ix<_twowgts.size();++ix) { output << "newdef " << name() << ":TwoChargedWeights " << ix << " " << _twowgts[ix] << "\n"; } for(unsigned int ix=0;ix<_threewgts.size();++ix) { output << "newdef " << name() << ":ThreeChargedWeights " << ix << " " << _threewgts[ix] << "\n"; } if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } // functions to return the Breit-Wigners Complex a1SimpleDecayer::rhoFormFactor(Energy2 q2,int ires) const { Complex output(0.),norm(0.); for(unsigned int ix=0,N=min(3,int(_rhowgts.size()));ix pi0 pi0 pi0 extpart[0]=a10; extpart[1]=pi0; extpart[2]=pi0; extpart[3]=pi0; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); // there are six sigma channels tPDPtr temp; for(unsigned int ix=0;ix<3;++ix) { if(ix==0) temp = sigma; else if(ix==1) temp = f2; else if(ix==2) temp = f0; if(temp) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,1); newchannel->addIntermediate(temp,0,0.0,2,3); mode->addChannel(newchannel); newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,2); newchannel->addIntermediate(temp,0,0.0,1,3); mode->addChannel(newchannel); newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,3); newchannel->addIntermediate(temp,0,0.0,1,2); mode->addChannel(newchannel); } } if(_zerowgts.size()!=mode->numberChannels()) _zerowgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_zeromax,_zerowgts); // decay mode a_1+ -> pi+ pi0 pi0 extpart[0]=a1p; extpart[1]=pi0; extpart[2]=pi0; extpart[3]=pip; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { if(!rhop[ix]) continue; // first rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(rhop[ix],0,0.0,2,3); mode->addChannel(newchannel); // second rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(rhop[ix],0,0.0,1,3); mode->addChannel(newchannel); } // the sigma channel if(sigma) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,3); newchannel->addIntermediate(sigma,0,0.0,1,2); mode->addChannel(newchannel); } // the f_2 channel if(f2) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,3); newchannel->addIntermediate(f2,0,0.0,1,2); mode->addChannel(newchannel); } // the f_0 channel if(f0) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,3); newchannel->addIntermediate(f0,0,0.0,1,2); mode->addChannel(newchannel); } if(_onewgts.size()!=mode->numberChannels()) _onewgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_onemax,_onewgts); // decay mode a_10 -> pi+ pi- pi0 extpart[0]=a10; extpart[1]=pip; extpart[2]=pim; extpart[3]=pi0; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { if(!rhop[ix]) continue; // first rho channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,1); newchannel->addIntermediate(rhom[ix],0,0.0,2,3); mode->addChannel(newchannel); // second channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,2); newchannel->addIntermediate(rhop[ix],0,0.0,1,3); mode->addChannel(newchannel); } // sigma channel if(sigma) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,3); newchannel->addIntermediate(sigma,0,0.0,1,2); mode->addChannel(newchannel); } // f_2 channel if(f2) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,3); newchannel->addIntermediate(f2,0,0.0,1,2); mode->addChannel(newchannel); } // f_0 channel if(f0) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a10,0,0.0,-1,3); newchannel->addIntermediate(f0,0,0.0,1,2); mode->addChannel(newchannel); } if(_twowgts.size()!=mode->numberChannels()) _twowgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_twomax,_twowgts); // decay mode a_1+ -> pi+ pi+ pi- extpart[0]=a1p; extpart[1]=pip; extpart[2]=pip; extpart[3]=pim; mode = new_ptr(DecayPhaseSpaceMode(extpart,this)); for(unsigned int ix=0;ix<3;++ix) { // the neutral rho channels if(!rho0[ix]) continue; // first channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(rho0[ix],0,0.0,2,3); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(rho0[ix],0,0.0,1,3); mode->addChannel(newchannel); } // the sigma channels if(sigma) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(sigma,0,0.0,2,3); mode->addChannel(newchannel); newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(sigma,0,0.0,1,3); mode->addChannel(newchannel); } // the f_2 channels if(f2) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(f2,0,0.0,2,3); mode->addChannel(newchannel); newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(f2,0,0.0,1,3); mode->addChannel(newchannel); } // the f_0 channel if(f0) { newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,1); newchannel->addIntermediate(f0,0,0.0,2,3); mode->addChannel(newchannel); newchannel = new_ptr(DecayPhaseSpaceChannel(mode)); newchannel->addIntermediate(a1p,0,0.0,-1,2); newchannel->addIntermediate(f0,0,0.0,1,3); mode->addChannel(newchannel); } if(_threewgts.size()!=mode->numberChannels()) _threewgts=vector(mode->numberChannels(),1./mode->numberChannels()); addMode(mode,_threemax,_threewgts); // if using local parameters set the values in the phase space channels if(_localparameters) { for(unsigned int iy=0;iy<_rhomass.size();++iy) { resetIntermediate(rho0[iy],_rhomass[iy],_rhowidth[iy]); resetIntermediate(rhop[iy],_rhomass[iy],_rhowidth[iy]); resetIntermediate(rhom[iy],_rhomass[iy],_rhowidth[iy]); } resetIntermediate(sigma,_sigmamass,_sigmawidth); resetIntermediate(f2,_f2mass,_f2width); resetIntermediate(f0,_f0mass,_f0width); // make sure the rho array has enough masses if(_rhomass.size()<3) { for(unsigned int ix=_rhomass.size();ix<3;++ix) { _rhomass.push_back(rhop[ix]->mass()); _rhowidth.push_back(rhop[ix]->width()); } } } // set the local variables if needed else { // masses and widths for the particles _rhomass.resize(3);_rhowidth.resize(3); for(unsigned int ix=0;ix<3;++ix) { _rhomass[ix]=rhop[ix]->mass(); _rhowidth[ix]=rhop[ix]->width(); } if(f2) { _f2mass=f2->mass(); _f2width=f2->width(); } if(f0) { _f0mass=f0->mass(); _f0width=f0->width(); } if(sigma) { _sigmamass=sigma->mass(); _sigmawidth=sigma->width(); } } // parameters for the breit-wigners _mpic=pip->mass(); _mpi0=pi0->mass(); // momenta of the decay products for on-shell particles _psigmacc = Kinematics::pstarTwoBodyDecay(_sigmamass,_mpic,_mpic); _psigma00 = Kinematics::pstarTwoBodyDecay(_sigmamass,_mpi0,_mpi0); _pf2cc = Kinematics::pstarTwoBodyDecay(_f2mass ,_mpic,_mpic); _pf200 = Kinematics::pstarTwoBodyDecay(_f2mass ,_mpi0,_mpi0); _pf0cc = Kinematics::pstarTwoBodyDecay(_f0mass ,_mpic,_mpic); _pf000 = Kinematics::pstarTwoBodyDecay(_f0mass ,_mpi0,_mpi0); _prhocc.resize(3);_prhoc0.resize(3); for(unsigned int ix=0;ix<3;++ix) { _prhocc[ix] = Kinematics::pstarTwoBodyDecay(_rhomass[ix],_mpic,_mpic); _prhoc0[ix] = Kinematics::pstarTwoBodyDecay(_rhomass[ix],_mpic,_mpi0); } // couplings for the different modes Complex ii(0.,1.); _rhocoupP.resize(_rhomagP.size()); for(unsigned int ix=0;ix<_rhomagP.size();++ix) _rhocoupP[ix]=_rhomagP[ix]*(cos(_rhophaseP[ix])+ii*sin(_rhophaseP[ix])); _rhocoupD.resize(_rhomagD.size()); for(unsigned int ix=0;ix<_rhomagD.size();++ix) _rhocoupD[ix]=_rhomagD[ix]*(cos(_rhophaseD[ix])+ii*sin(_rhophaseD[ix])); _f0coup=_f0mag*(cos(_f0phase)+ii*sin(_f0phase)); _f2coup=_f2mag*(cos(_f2phase)+ii*sin(_f2phase)); _sigmacoup=_sigmamag*(cos(_sigmaphase)+ii*sin(_sigmaphase)); } inline void a1ThreePionCLEODecayer::doinitrun() { DecayIntegrator::doinitrun(); if(initialize()) { // get the weights for the different channels for(unsigned int ix=0;ix<_zerowgts.size();++ix) _zerowgts[ix]=mode(0)->channelWeight(ix); for(unsigned int ix=0;ix<_onewgts.size();++ix) _onewgts[ix]=mode(1)->channelWeight(ix); for(unsigned int ix=0;ix<_twowgts.size();++ix) _twowgts[ix]=mode(2)->channelWeight(ix); for(unsigned int ix=0;ix<_threewgts.size();++ix) _threewgts[ix]=mode(3)->channelWeight(ix); // get the maximum weight _zeromax = mode(0)->maxWeight(); _onemax = mode(1)->maxWeight(); _twomax = mode(2)->maxWeight(); _threemax = mode(3)->maxWeight(); } } int a1ThreePionCLEODecayer::modeNumber(bool & cc,tcPDPtr parent, const tPDVector & children) const { if(children.size()!=3) return -1; int id(parent->id()); // check the pions tPDVector::const_iterator pit = children.begin(); tPDVector::const_iterator pend = children.end(); int idtemp,npi0(0),npiplus(0),npiminus(0); for( ; pit!=pend;++pit) { idtemp=(**pit).id(); if(idtemp==ParticleID::piplus) ++npiplus; else if(idtemp==ParticleID::piminus) ++npiminus; else if(idtemp==ParticleID::pi0) ++npi0; } int imode(-1); // a_1+ decay modes if(id==ParticleID::a_1plus) { cc=false; if(npiplus==1&&npi0==2) imode=1; else if(npiplus==2&&npiminus==1) imode=3; } // a_1- modes else if(id==ParticleID::a_1minus) { cc=true; if(npiminus==1&&npi0==2) imode=1; else if(npiminus==2&&npiplus==1) imode=3; } // a_0 modes else if(id==ParticleID::a_10) { cc=false; if(npiminus==1&&npiplus==1&&npi0==1) imode=2; else if(npi0==3) imode=0; } return imode; } void a1ThreePionCLEODecayer::persistentOutput(PersistentOStream & os) const { os << ounit(_rhomass,GeV) << ounit(_rhowidth,GeV) << ounit(_prhocc,GeV) << ounit(_prhoc0,GeV) << ounit(_f2mass,GeV) << ounit(_f2width,GeV) << ounit(_pf2cc,GeV) << ounit(_pf200,GeV) << ounit(_f0mass,GeV) << ounit(_f0width,GeV) << ounit(_pf0cc,GeV) << ounit(_pf000,GeV) << ounit(_sigmamass,GeV) << ounit(_sigmawidth,GeV) << ounit(_psigmacc,GeV) << ounit(_psigma00,GeV) << ounit(_mpi0,GeV) << ounit(_mpic,GeV) << ounit(_coupling,1/GeV) << _rhomagP << _rhophaseP << _rhocoupP << ounit(_rhomagD ,1/GeV2)<< _rhophaseD << ounit(_rhocoupD,1/GeV2) << ounit(_f2mag,1/GeV2) << _f2phase << ounit(_f2coup,1/GeV2) << _f0mag << _f0phase << _f0coup << _sigmamag << _sigmaphase << _sigmacoup << _localparameters << _zerowgts << _onewgts << _twowgts << _threewgts << _zeromax << _onemax << _twomax << _threemax; } void a1ThreePionCLEODecayer::persistentInput(PersistentIStream & is, int) { is >> iunit(_rhomass,GeV) >> iunit(_rhowidth,GeV) >> iunit(_prhocc,GeV) >> iunit(_prhoc0,GeV) >> iunit(_f2mass,GeV) >> iunit(_f2width,GeV) >> iunit(_pf2cc,GeV) >> iunit(_pf200,GeV) >> iunit(_f0mass,GeV) >> iunit(_f0width,GeV) >> iunit(_pf0cc,GeV) >> iunit(_pf000,GeV) >> iunit(_sigmamass,GeV) >> iunit(_sigmawidth,GeV) >> iunit(_psigmacc,GeV) >> iunit(_psigma00,GeV) >> iunit(_mpi0,GeV) >> iunit(_mpic,GeV) >> iunit(_coupling,1/GeV) >> _rhomagP >> _rhophaseP >> _rhocoupP >> iunit(_rhomagD,1/GeV2) >> _rhophaseD >> iunit(_rhocoupD,1/GeV2)>>iunit(_f2mag,1/GeV2) >> _f2phase >> iunit(_f2coup,1/GeV2) >> _f0mag >> _f0phase >> _f0coup >> _sigmamag >> _sigmaphase >> _sigmacoup >> _localparameters >> _zerowgts >> _onewgts >> _twowgts >> _threewgts >> _zeromax >> _onemax >> _twomax >> _threemax; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwiga1ThreePionCLEODecayer("Herwig::a1ThreePionCLEODecayer", "HwVMDecay.so"); void a1ThreePionCLEODecayer::Init() { static ClassDocumentation documentation ("The a1ThreePionCLEODecayer class performs the decay of the " "a_1 to three pions using the model of CLEO", "The decay of a_1 to three pions was modelled after \\cite{Asner:1999kj}.", "%\\cite{Asner:1999kj}\n" "\\bibitem{Asner:1999kj}\n" " D.~M.~Asner {\\it et al.} [CLEO Collaboration],\n" " ``Hadronic structure in the decay tau- --> nu/tau pi- pi0 pi0 and the sign\n" " %of the tau neutrino helicity,''\n" " Phys.\\ Rev.\\ D {\\bf 61}, 012002 (2000)\n" " [arXiv:hep-ex/9902022].\n" " %%CITATION = PHRVA,D61,012002;%%\n" ); static ParVector interfacerhomass ("RhoMasses", "The masses of the different rho resonnaces", &a1ThreePionCLEODecayer::_rhomass, GeV, 0, ZERO, -10000*GeV, 10000*GeV, false, false, true); static ParVector interfacerhowidth ("RhoWidths", "The widths of the different rho resonnaces", &a1ThreePionCLEODecayer::_rhowidth, GeV, 0, ZERO, -10000*GeV, 10000*GeV, false, false, true); static Parameter interfacef_2Mass ("f_2Mass", "The mass of the f_2 meson", &a1ThreePionCLEODecayer::_f2mass, GeV, 1.275*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacef_2Width ("f_2Width", "The width of the f_2 meson", &a1ThreePionCLEODecayer::_f2width, GeV, 0.185*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfacef_0Mass ("f_0Mass", "The mass of the f_0 meson", &a1ThreePionCLEODecayer::_f0mass, GeV, 1.186*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacef_0Width ("f_0Width", "The width of the f_0 meson", &a1ThreePionCLEODecayer::_f0width, GeV, 0.350*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfacesigmaMass ("sigmaMass", "The mass of the sigma meson", &a1ThreePionCLEODecayer::_sigmamass, GeV, 0.860*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacesigmaWidth ("sigmaWidth", "The width of the sigma meson", &a1ThreePionCLEODecayer::_sigmawidth, GeV, 0.880*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfaceCoupling ("Coupling", "The overall coupling for the decay", &a1ThreePionCLEODecayer::_coupling, 1./GeV, 45.57/GeV, -0./GeV, 1000./GeV, false, false, false); static ParVector interfacerhomagP ("RhoPWaveMagnitude", "The magnitude of the couplings for the p-wave rho currents", &a1ThreePionCLEODecayer::_rhomagP, 0, 0, 0, 0, 10000, false, false, true); static ParVector interfacerhophaseP ("RhoPWavePhase", "The phase of the couplings for the p-wave rho currents", &a1ThreePionCLEODecayer::_rhophaseP, 0, 0, 0, -pi, pi, false, false, true); static ParVector interfacerhomagD ("RhoDWaveMagnitude", "The magnitude of the couplings for the d-wave rho currents", &a1ThreePionCLEODecayer::_rhomagD, 1/MeV2, 0, ZERO, ZERO, 10000/MeV2, false, false, true); static ParVector interfacerhophaseD ("RhoDWavePhase", "The phase of the couplings for the d-wave rho currents", &a1ThreePionCLEODecayer::_rhophaseD, 0, 0, 0, -pi, pi, false, false, true); static Parameter interfacef0Phase ("f0Phase", "The phase of the f_0 scalar current", &a1ThreePionCLEODecayer::_f0phase, 0.54*pi, -pi, pi, false, false, Interface::limited); static Parameter interfacef2Phase ("f2Phase", "The phase of the f_2 tensor current", &a1ThreePionCLEODecayer::_f2phase, 0.56*pi, -pi, pi, false, false, Interface::limited); static Parameter interfacesigmaPhase ("sigmaPhase", "The phase of the sigma scalar current", &a1ThreePionCLEODecayer::_sigmaphase, 0.23*pi, -pi, pi, false, false, Interface::limited); static Parameter interfacef0Magnitude ("f0Magnitude", "The magnitude of the f_0 scalar current", &a1ThreePionCLEODecayer::_f0mag, 0.77, 0.0, 10, false, false, true); static Parameter interfacef2Magnitude ("f2Magnitude", "The magnitude of the f_2 tensor current", &a1ThreePionCLEODecayer::_f2mag, 1./GeV2, 0.71/GeV2, ZERO, 10./GeV2, false, false, true); static Parameter interfacesigmaMagnitude ("sigmaMagnitude", "The magnitude of the sigma scalar current", &a1ThreePionCLEODecayer::_sigmamag, 2.1, 0.0, 10, false, false, true); static Switch interfaceLocalParameters ("LocalParameters", "Use local values of the intermediate resonances masses and widths", &a1ThreePionCLEODecayer::_localparameters, true, false, false); static SwitchOption interfaceLocalParametersLocal (interfaceLocalParameters, "Local", "Use the local values", true); static SwitchOption interfaceLocalParametersDefault (interfaceLocalParameters, "ParticleData", "Use the values from the particleData objects", false); static ParVector interfacezerowgts ("AllNeutralWeights", "The weights of the different channels to use for the integration of" " the decay a_1^0->pi0pi0pi0", &a1ThreePionCLEODecayer::_zerowgts, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfaceonewgts ("OneChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^+->pi+pi0pi0", &a1ThreePionCLEODecayer::_onewgts, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfacetwowgts ("TwoChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^0->pi+pi-pi0", &a1ThreePionCLEODecayer::_twowgts, 0, 0, 0, -10000, 10000, false, false, true); static ParVector interfacethreewgts ("ThreeChargedWeights", "The weights of the different channels to use for the integration of" " the decay a_1^+->pi+pi+pi-", &a1ThreePionCLEODecayer::_threewgts, 0, 0, 0, -10000, 10000, false, false, true); static Parameter interfaceZeroMax ("ZeroMax", "The maximum weight for the integration fo the channel a_1^0->pi0pi0pi0", &a1ThreePionCLEODecayer::_zeromax, 0.0716349E3, 0.0, 10000.0, false, false, true); static Parameter interfaceOneMax ("OneMax", "The maximum weight for the integration fo the channel a_1^+->pi+pi0pi0", &a1ThreePionCLEODecayer::_onemax,1.23756E3, 0.0, 10000.0, false, false, true); static Parameter interfaceTwoMax ("TwoMax", "The maximum weight for the integration fo the channel a_1^0->pi+pi-pi0", &a1ThreePionCLEODecayer::_twomax,2.43819E3, 0.0, 10000.0, false, false, true); static Parameter interfaceThreeMax ("ThreeMax", "The maximum weight for the integration fo the channel a_1^+->pi+pi+pi-", &a1ThreePionCLEODecayer::_threemax, 1.38754E3, 0.0, 10000.0, false, false, true); } double a1ThreePionCLEODecayer::me2(const int ichan, const Particle & inpart, const ParticleVector & decay, MEOption meopt) const { useMe(); if(!ME()) ME(new_ptr(GeneralDecayMatrixElement(PDT::Spin1,PDT::Spin0,PDT::Spin0,PDT::Spin0))); if(meopt==Initialize) { VectorWaveFunction::calculateWaveFunctions(_vectors,_rho, const_ptr_cast(&inpart), incoming,false); } if(meopt==Terminate) { VectorWaveFunction::constructSpinInfo(_vectors,const_ptr_cast(&inpart), incoming,true,false); // set up the spin information for the decay products for(unsigned int ix=0;ix<3;++ix) ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true); return 0.; } // momentum of the incoming particle Lorentz5Momentum Q=inpart.momentum(); Energy2 q2=Q.mass2(); // identify the mesons // calculate the invariants and form factors Lorentz5Momentum ps1=decay[1]->momentum()+decay[2]->momentum(); Lorentz5Momentum ps2=decay[0]->momentum()+decay[2]->momentum(); Lorentz5Momentum ps3=decay[0]->momentum()+decay[1]->momentum(); ps1.rescaleMass(); ps2.rescaleMass(); ps3.rescaleMass(); Energy2 s1=ps1.mass2(),s2=ps2.mass2(),s3=ps3.mass2(); complex F1,F2,F3; formFactors(imode(),ichan,q2,s1,s2,s3,F1,F2,F3); // use the form-factors to compute the current LorentzPolarizationVector output= - F1*decay[1]->momentum()-F1*decay[2]->momentum() - -F2*decay[2]->momentum()+F2*decay[0]->momentum() - +F3*decay[0]->momentum()-F3*decay[1]->momentum(); + LorentzPolarizationVector(F1*decay[1]->momentum())-LorentzPolarizationVector(F1*decay[2]->momentum()) + -LorentzPolarizationVector(F2*decay[2]->momentum())+LorentzPolarizationVector(F2*decay[0]->momentum()) + +LorentzPolarizationVector(F3*decay[0]->momentum())-LorentzPolarizationVector(F3*decay[1]->momentum()); // compute the matrix element for(unsigned int ix=0;ix<3;++ix) (*ME())(ix,0,0,0)=output.dot(_vectors[ix]); // answer double out = ME()->contract(_rho).real(); // test of the answer // double test = threeBodyMatrixElement(imode(),sqr(inpart.mass()), // s3,s2,s1,decay[0]->mass(),decay[1]->mass(), // decay[2]->mass()); // if(ichan<0) cerr << "testing matrix element " << inpart.PDGName() << " -> " // << decay[0]->PDGName() << " " << decay[1]->PDGName() << " " // << decay[2]->PDGName() << out << " " << test << " " // << (out-test)/(out+test) << "\n"; // return the answer return out; } // matrix element for the running a_1 width double a1ThreePionCLEODecayer:: threeBodyMatrixElement(const int iopt,const Energy2 q2, const Energy2 s3, const Energy2 s2,const Energy2 s1, const Energy m1, const Energy m2 ,const Energy m3) const { Energy2 m12=m1*m1,m22=m2*m2,m32=m3*m3; // calculate the form factors complex F1,F2,F3; formFactors(iopt,-1,q2,s1,s2,s3,F1,F2,F3); // analytic calculation of the matrix element double dot1=( F1*conj(F1)*(2.*m22+2.*m32-s1)+F2*conj(F2)*(2.*m12+2.*m32-s2) +F3*conj(F3)*(2.*m12+2.*m22-s3)-F1*conj(F2)*( s1+s2-s3-4.*m32) +F1*conj(F3)*( s1-s2+s3-4.*m22)-F2*conj(F3)*(-s1+s2+s3-4.*m12)).real(); complex dot2 = 0.5*(F1*(s3-m32-s2+m22)-F2*(s1-m12-s3+m32)+F3*(s2-m22-s1+m12)); return (-dot1+(dot2*conj(dot2)).real()/q2)/3.; } WidthCalculatorBasePtr a1ThreePionCLEODecayer::threeBodyMEIntegrator(const DecayMode & dm) const { ParticleMSet::const_iterator pit = dm.products().begin(); ParticleMSet::const_iterator pend = dm.products().end(); int ncharged=0; for( ; pit!=pend;++pit) { if(abs((**pit).id())==ParticleID::piplus) ++ncharged; } // integrator to perform the integral vector inweights;inweights.push_back(0.5);inweights.push_back(0.5); vector intype;intype.push_back(2);intype.push_back(3); vector inmass(2,_rhomass[0]),inwidth(2,_rhowidth[0]); vector inpow(2,0.0); Energy m[3]; m[0] = ncharged<2 ? _mpi0 : _mpic; m[1] = m[0]; m[2] = (ncharged==0||ncharged==2) ? _mpi0 : _mpic; return new_ptr(ThreeBodyAllOnCalculator (inweights,intype,inmass,inwidth,inpow,*this,ncharged,m[0],m[1],m[2])); } // calculate the form factos void a1ThreePionCLEODecayer::formFactors(int iopt,int ichan, Energy2 q2,Energy2 s1,Energy2 s2, Energy2 s3, complex & FF1, complex & FF2, complex & FF3) const { Complex F1, F2, F3; InvEnergy fact = _coupling; // a_1^0 pi0 pi0 pi0 mode if(iopt==0) { fact*=1./sqrt(6.); // compute the breit wigners we need Complex sigbws1 = sigmaBreitWigner(s1,1); Complex sigbws2 = sigmaBreitWigner(s2,1); Complex sigbws3 = sigmaBreitWigner(s3,1); Complex f0bws1 = f0BreitWigner(s1,1); Complex f0bws2 = f0BreitWigner(s2,1); Complex f0bws3 = f0BreitWigner(s3,1); Complex f2bws1 = f2BreitWigner(s1,1); Complex f2bws2 = f2BreitWigner(s2,1); Complex f2bws3 = f2BreitWigner(s3,1); if(ichan<0) { // the scalar terms F1=2./3.*(_sigmacoup*sigbws3+_f0coup*f0bws3) -2./3.*(_sigmacoup*sigbws2+_f0coup*f0bws2); F2=2./3.*(_sigmacoup*sigbws3+_f0coup*f0bws3) -2./3.*(_sigmacoup*sigbws1+_f0coup*f0bws1); F3=-2./3.*(_sigmacoup*sigbws1+_f0coup*f0bws1) +2./3.*(_sigmacoup*sigbws2+_f0coup*f0bws2); // the tensor terms complex Dfact1 = 1./18.*(4.*_mpi0*_mpi0-s1)*(q2+s1-_mpi0*_mpi0)/s1*f2bws1; complex Dfact2 = 1./18.*(4.*_mpi0*_mpi0-s2)*(q2+s2-_mpi0*_mpi0)/s2*f2bws2; complex Dfact3 = 1./18.*(4.*_mpi0*_mpi0-s3)*(q2-_mpi0*_mpi0+s3)/s3*f2bws3; - F1+=_f2coup*( 0.5*(s3-s2)*f2bws1-Dfact2+Dfact3); - F2+=_f2coup*( 0.5*(s3-s1)*f2bws2-Dfact1+Dfact3); - F3+=_f2coup*(-0.5*(s1-s2)*f2bws3-Dfact1+Dfact2); + F1 += Complex(_f2coup*( 0.5*(s3-s2)*f2bws1-Dfact2+Dfact3)); + F2 += Complex(_f2coup*( 0.5*(s3-s1)*f2bws2-Dfact1+Dfact3)); + F3 += Complex(_f2coup*(-0.5*(s1-s2)*f2bws3-Dfact1+Dfact2)); } else if(ichan==0) { F2=-2./3.*_sigmacoup*sigbws1; F3=-2./3.*_sigmacoup*sigbws1; } else if(ichan==1) { F1=-2./3.*_sigmacoup*sigbws2; F3=+2./3.*_sigmacoup*sigbws2; } else if(ichan==2) { F1= 2./3.*_sigmacoup*sigbws3; F2= 2./3.*_sigmacoup*sigbws3; } else if(ichan==3) { complex Dfact1 = 1./18.*(4.*_mpi0*_mpi0-s1)*(q2+s1-_mpi0*_mpi0)/s1*f2bws1; - F1+=_f2coup*0.5*(s3-s2)*f2bws1; - F2-=_f2coup*Dfact1; - F3-=_f2coup*Dfact1; + F1+=Complex(_f2coup*0.5*(s3-s2)*f2bws1); + F2-=Complex(_f2coup*Dfact1); + F3-=Complex(_f2coup*Dfact1); } else if(ichan==4) { complex Dfact2 = 1./18.*(4.*_mpi0*_mpi0-s2)*(q2+s2-_mpi0*_mpi0)/s2*f2bws2; - F2+=_f2coup*0.5*(s3-s1)*f2bws2; - F1-=_f2coup*Dfact2; - F3+=_f2coup*Dfact2; + F2+=Complex(_f2coup*0.5*(s3-s1)*f2bws2); + F1-=Complex(_f2coup*Dfact2); + F3+=Complex(_f2coup*Dfact2); } else if(ichan==5) { complex Dfact3 = 1./18.*(4.*_mpi0*_mpi0-s3)*(q2-_mpi0*_mpi0+s3)/s3*f2bws3; - F3+=-_f2coup*0.5*(s1-s2)*f2bws3; - F1+=_f2coup*Dfact3; - F2+=_f2coup*Dfact3; + F3+=Complex(-_f2coup*0.5*(s1-s2)*f2bws3); + F1+=Complex(_f2coup*Dfact3); + F2+=Complex(_f2coup*Dfact3); } else if(ichan==6) { F2=-2./3.*_f0coup*f0bws1; F3=-2./3.*_f0coup*f0bws1; } else if(ichan==7) { F1=-2./3.*_f0coup*f0bws2; F3=+2./3.*_f0coup*f0bws2; } else if(ichan==8) { F1= 2./3.*_f0coup*f0bws3; F2= 2./3.*_f0coup*f0bws3; } } // a_1^+ -> pi0 pi0 pi+ else if(iopt==1) { fact *= 1./sqrt(2.); // compute the breit wigners we need Complex rhos1bw[3],rhos2bw[3],f0bw,sigbw,f2bw; for(unsigned int ix=0,N=max(_rhocoupP.size(),_rhocoupD.size());ixpi+pi-pi0 else if(iopt==2) { // compute the breit wigners we need Complex rhos1bw[3],rhos2bw[3],f0bw,sigbw,f2bw; for(unsigned int ix=0,N=max(_rhocoupP.size(),_rhocoupD.size());ix pi+ pi+ pi- mode else { fact *= 1./sqrt(2.); // compute the breit wigners we need Complex rhos1bw[3],rhos2bw[3],f0bws1,sigbws1,f2bws1,f0bws2,sigbws2,f2bws2; for(unsigned int ix=0,N=max(_rhocoupP.size(),_rhocoupD.size());ix sfact1 = 1./18.*(4.*_mpic*_mpic-s1)*(q2+s1-_mpic*_mpic)/s1*f2bws1; complex sfact2 = 1./18.*(4.*_mpic*_mpic-s2)*(q2+s2-_mpic*_mpic)/s2*f2bws2; - F1+=_f2coup*(0.5*(s3-s2)*f2bws1-sfact2); - F2+=_f2coup*(0.5*(s3-s1)*f2bws2-sfact1); - F3+=_f2coup*(-sfact1+sfact2); + F1+=Complex(_f2coup*(0.5*(s3-s2)*f2bws1-sfact2)); + F2+=Complex(_f2coup*(0.5*(s3-s1)*f2bws2-sfact1)); + F3+=Complex(_f2coup*(-sfact1+sfact2)); } else if(ichan%2==0&&ichan<=4) { unsigned int ires=ichan/2; Energy2 Dfact2=1./3.*(s2-s3); if(ires<_rhocoupP.size()) F1-=_rhocoupP[ires]*rhos1bw[ires]; if(ires<_rhocoupD.size()){ - F2-=Dfact2*_rhocoupD[ires]*rhos1bw[ires]; - F3-=_rhocoupD[ires]*Dfact2*rhos1bw[ires]; + F2-=Complex(Dfact2*_rhocoupD[ires]*rhos1bw[ires]); + F3-=Complex(_rhocoupD[ires]*Dfact2*rhos1bw[ires]); } } else if(ichan%2==1&&ichan<=5) { unsigned int ires=(ichan-1)/2; Energy2 Dfact1=1./3.*(s1-s3); if(ires<_rhocoupP.size()) F2-=_rhocoupP[ires]*rhos2bw[ires]; if(ires<_rhocoupD.size()) { - F1-=Dfact1*_rhocoupD[ires]*rhos2bw[ires]; - F3+=_rhocoupD[ires]*Dfact1*rhos2bw[ires]; + F1-=Complex(Dfact1*_rhocoupD[ires]*rhos2bw[ires]); + F3+=Complex(_rhocoupD[ires]*Dfact1*rhos2bw[ires]); } } else if(ichan==6) { F2-=2./3.*_sigmacoup*sigbws1; F3-=2./3.*_sigmacoup*sigbws1; } else if(ichan==7) { F1-=2./3.*_sigmacoup*sigbws2; F3+=2./3.*_sigmacoup*sigbws2; } else if(ichan==8) { complex sfact1 = 1./18.*(4.*_mpic*_mpic-s1)*(q2+s1-_mpic*_mpic)/s1*f2bws1; - F1+=_f2coup*0.5*(s3-s2)*f2bws1; - F2-=_f2coup*sfact1; - F3-=_f2coup*sfact1; + F1+=Complex(_f2coup*0.5*(s3-s2)*f2bws1); + F2-=Complex(_f2coup*sfact1); + F3-=Complex(_f2coup*sfact1); } else if(ichan==9) { complex sfact2 = 1./18.*(4.*_mpic*_mpic-s2)*(q2+s2-_mpic*_mpic)/s2*f2bws2; - F1-=_f2coup*sfact2; - F2+=_f2coup*0.5*(s3-s1)*f2bws2; - F3+=_f2coup*sfact2; + F1-=Complex(_f2coup*sfact2); + F2+=Complex(_f2coup*0.5*(s3-s1)*f2bws2); + F3+=Complex(_f2coup*sfact2); } else if(ichan==10) { F2-=2./3.*_f0coup*f0bws1; F3-=2./3.*_f0coup*f0bws1; } else if(ichan==11) { F1-=2./3.*_f0coup*f0bws2; F3+=2./3.*_f0coup*f0bws2; } } FF1 = F1 * fact; FF2 = F2 * fact; FF3 = F3 * fact; } // output the setup information for the particle database void a1ThreePionCLEODecayer::dataBaseOutput(ofstream & output, bool header) const { if(header) output << "update decayers set parameters=\""; // parameters for the DecayIntegrator base class DecayIntegrator::dataBaseOutput(output,false); // masses and widths of the intermediate particles output << "newdef " << name() << ":f_2Mass " << _f2mass/GeV << "\n"; output << "newdef " << name() << ":f_2Width " << _f2width/GeV << "\n"; output << "newdef " << name() << ":f_0Mass " << _f0mass/GeV << "\n"; output << "newdef " << name() << ":f_0Width " << _f0width/GeV << "\n"; output << "newdef " << name() << ":sigmaMass " << _sigmamass/GeV << "\n"; output << "newdef " << name() << ":sigmaWidth " << _sigmawidth/GeV << "\n"; for(unsigned int ix=0;ix<_rhomass.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/GeV << "\n"; else output << "insert " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/GeV << "\n"; } for(unsigned int ix=0;ix<_rhowidth.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/GeV << "\n"; else output << "insert " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/GeV << "\n"; } // couplings and phases for different channels output << "newdef " << name() << ":f0Phase " << _f0phase << "\n"; output << "newdef " << name() << ":f2Phase " << _f2phase<< "\n"; output << "newdef " << name() << ":sigmaPhase " << _sigmaphase<< "\n"; output << "newdef " << name() << ":f0Magnitude " << _f0mag<< "\n"; output << "newdef " << name() << ":f2Magnitude " << _f2mag*GeV2 << "\n"; output << "newdef " << name() << ":sigmaMagnitude " << _sigmamag << "\n"; output << "newdef " << name() << ":Coupling " << _coupling*GeV << "\n"; for(unsigned int ix=0;ix<_rhomagP.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoPWaveMagnitude " << ix << " " << _rhomagP[ix] << "\n"; else output << "insert " << name() << ":RhoPWaveMagnitude " << ix << " " << _rhomagP[ix] << "\n"; } for(unsigned int ix=0;ix<_rhophaseP.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoPWavePhase " << ix << " " << _rhophaseP[ix] << "\n"; else output << "insert " << name() << ":RhoPWavePhase " << ix << " " << _rhophaseP[ix] << "\n"; } for(unsigned int ix=0;ix<_rhomagD.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoDWaveMagnitude " << ix << " " << _rhomagD[ix]*MeV2 << "\n"; else output << "insert " << name() << ":RhoDWaveMagnitude " << ix << " " << _rhomagD[ix]*MeV2 << "\n"; } for(unsigned int ix=0;ix<_rhophaseD.size();++ix) { if(ix<2) output << "newdef " << name() << ":RhoDWavePhase " << ix << " " << _rhophaseD[ix] << "\n"; else output << "insert " << name() << ":RhoDWavePhase " << ix << " " << _rhophaseD[ix] << "\n"; } // use local values of the masses etc. output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n"; // integration weights for the different channels for(unsigned int ix=0;ix<_zerowgts.size();++ix) { output << "newdef " << name() << ":AllNeutralWeights " << ix << " " << _zerowgts[ix] << "\n"; } for(unsigned int ix=0;ix<_onewgts.size();++ix) { output << "newdef " << name() << ":OneChargedWeights " << ix << " " << _onewgts[ix] << "\n"; } for(unsigned int ix=0;ix<_twowgts.size();++ix) { output << "newdef " << name() << ":TwoChargedWeights " << ix << " " << _twowgts[ix] << "\n"; } for(unsigned int ix=0;ix<_threewgts.size();++ix) { output << "newdef " << name() << ":ThreeChargedWeights " << ix << " " << _threewgts[ix] << "\n"; } // maximum weights for the different channels output << "newdef " << name() << ":ZeroMax " << _zeromax << "\n"; output << "newdef " << name() << ":OneMax " << _onemax << "\n"; output << "newdef " << name() << ":TwoMax " << _twomax << "\n"; output << "newdef " << name() << ":ThreeMax " << _threemax << "\n"; if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } diff --git a/Decay/WeakCurrents/ThreeMesonCurrentBase.cc b/Decay/WeakCurrents/ThreeMesonCurrentBase.cc --- a/Decay/WeakCurrents/ThreeMesonCurrentBase.cc +++ b/Decay/WeakCurrents/ThreeMesonCurrentBase.cc @@ -1,248 +1,248 @@ // -*- C++ -*- // // ThreeMesonCurrentBase.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ThreeMesonCurrentBase class. // #include "ThreeMesonCurrentBase.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Helicity/epsilon.h" #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h" #include "ThePEG/Utilities/DescribeClass.h" using namespace Herwig; using namespace ThePEG; using namespace ThePEG::Helicity; ThreeMesonCurrentBase::ThreeMesonCurrentBase() { // the quarks for the different modes addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-3); addDecayMode(2,-3); addDecayMode(2,-3); addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-1); addDecayMode(2,-1); setInitialModes(12); } DescribeAbstractNoPIOClass describeHerwigThreeMesonCurrentBase("Herwig::ThreeMesonCurrentBase", "HwWeakCurrents.so"); void ThreeMesonCurrentBase::Init() { static ClassDocumentation< ThreeMesonCurrentBase> documentation ("The ThreeMesonCurrentBase class is designed to be the " "base class for " "the three meson decays of the tau, ie pi- pi- pi+, pi0 pi0 pi-, " "K- pi- K+, K0 pi- Kbar0, K- pi0 K0,pi0 pi0 K-, K- pi- pi+, " "pi- Kbar0 pi0, pi- pi0 eta, K0S pi- K0S, K0L pi- K0L, K0S pi- K0L"); } // the hadronic currents vector ThreeMesonCurrentBase::current(const int imode, const int ichan, Energy & scale,const ParticleVector & decay, DecayIntegrator::MEOption meopt) const { if(meopt==DecayIntegrator::Terminate) { for(unsigned int ix=0;ix<3;++ix) ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true); return vector(1,LorentzPolarizationVectorE()); } // calculate q2,s1,s2,s3 Lorentz5Momentum q; for(unsigned int ix=0;ixmomentum();} q.rescaleMass(); scale=q.mass(); Energy2 q2=q.mass2(); Energy2 s1 = (decay[1]->momentum()+decay[2]->momentum()).m2(); Energy2 s2 = (decay[0]->momentum()+decay[2]->momentum()).m2(); Energy2 s3 = (decay[0]->momentum()+decay[1]->momentum()).m2(); FormFactors F = calculateFormFactors(ichan,imode,q2,s1,s2,s3); //if(inpart.id()==ParticleID::tauplus){F.F5=conj(F.F5);} // the first three form-factors LorentzPolarizationVector vect; - vect = (F.F2-F.F1)*decay[2]->momentum() - +(F.F1-F.F3)*decay[1]->momentum() - +(F.F3-F.F2)*decay[0]->momentum(); + vect = LorentzPolarizationVector((F.F2-F.F1)*decay[2]->momentum()) + +LorentzPolarizationVector((F.F1-F.F3)*decay[1]->momentum()) + +LorentzPolarizationVector((F.F3-F.F2)*decay[0]->momentum()); // multiply by the transverse projection operator complex dot=(vect*q)/q2; // scalar and parity violating terms - vect += (F.F4-dot)*q; + vect += LorentzPolarizationVector((F.F4-dot)*q); if(F.F5!=complex()) - vect += Complex(0.,1.)*F.F5*Helicity::epsilon(decay[0]->momentum(), - decay[1]->momentum(), - decay[2]->momentum()); + vect += LorentzPolarizationVector(Complex(0.,1.)*F.F5*Helicity::epsilon(decay[0]->momentum(), + decay[1]->momentum(), + decay[2]->momentum())); // factor to get dimensions correct return vector(1,q.mass()*vect); } bool ThreeMesonCurrentBase::accept(vector id) { int npip(0),npim(0),nkp(0),nkm(0), npi0(0),nk0(0),nk0bar(0),neta(0),nks(0),nkl(0); for(unsigned int ix=0;ix id) { int npip(0),npim(0),nkp(0),nkm(0), npi0(0),nk0(0),nk0bar(0),neta(0),nks(0),nkl(0); for(unsigned int ix=0;ixCC()) extpart[ix]=extpart[ix]->CC(); } } // return the answer return extpart; } diff --git a/Decay/WeakCurrents/ThreePionCLEOCurrent.cc b/Decay/WeakCurrents/ThreePionCLEOCurrent.cc --- a/Decay/WeakCurrents/ThreePionCLEOCurrent.cc +++ b/Decay/WeakCurrents/ThreePionCLEOCurrent.cc @@ -1,1086 +1,1086 @@ // -*- C++ -*- // // ThreePionCLEOCurrent.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ThreePionCLEOCurrent class. // #include "ThreePionCLEOCurrent.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/PDT/ThreeBodyAllOnCalculator.h" #include "ThePEG/Utilities/DescribeClass.h" using namespace Herwig; DescribeClass describeHerwigThreePionCLEOCurrent("Herwig::ThreePionCLEOCurrent", "HwWeakCurrents.so"); HERWIG_INTERPOLATOR_CLASSDESC(ThreePionCLEOCurrent,Energy,Energy2) ThreePionCLEOCurrent::ThreePionCLEOCurrent() { // local particle properties _localparameters=true; // rho masses and widths if(_rhomass.size()==0) { _rhomass.push_back(0.7743*GeV);_rhowidth.push_back(0.1491*GeV); _rhomass.push_back(1.370*GeV);_rhowidth.push_back(0.386*GeV); } // f_2 mass and width _f2mass=1.275*GeV;_f2width=0.185*GeV; // f_0(1370) mass and width _f0mass=1.186*GeV;_f0width=0.350*GeV; // sigma mass and width _sigmamass = 0.860*GeV;_sigmawidth =0.880*GeV; // a1 mass and width _a1mass = 1.331*GeV;_a1width=0.814*GeV; // parameters for the K K* contribution to the a_1 running width _mKstar = 894*MeV; _mK=496*MeV; _gammk=3.32; // pion decay constant _fpi = 130.7*MeV/sqrt(2.); // couplings and phases for the different channels // p-wave rho and rho prime using Constants::pi; if(_rhomagP.size()==0) { _rhomagP.push_back(1.) ;_rhophaseP.push_back(0.); _rhomagP.push_back(0.12);_rhophaseP.push_back(0.99*pi); } // d-wave rho and rho prime if(_rhomagD.size()==0) { _rhomagD.push_back(0.37/GeV2);_rhophaseD.push_back(-0.15*pi); _rhomagD.push_back(0.87/GeV2);_rhophaseD.push_back( 0.53*pi); } // f_2 _f2mag=0.71/GeV2;_f2phase=0.56*pi;_f2coup=ZERO; // sigma _sigmamag=2.10;_sigmaphase=0.23*pi;_sigmacoup=0.; // f_0 _f0mag=0.77;_f0phase=-0.54*pi;_f0coup=0.; // initialize the a_1 width _initializea1=false; _a1opt=true; double a1q2in[200]={0 ,15788.6,31577.3,47365.9,63154.6,78943.2, 94731.9,110521 ,126309 ,142098 ,157886 ,173675 , 189464 ,205252 ,221041 ,236830 ,252618 ,268407 , 284196 ,299984 ,315773 ,331562 ,347350 ,363139 , 378927 ,394716 ,410505 ,426293 ,442082 ,457871 , 473659 ,489448 ,505237 ,521025 ,536814 ,552603 , 568391 ,584180 ,599969 ,615757 ,631546 ,647334 , 663123 ,678912 ,694700 ,710489 ,726278 ,742066 , 757855 ,773644 ,789432 ,805221 ,821010 ,836798 , 852587 ,868375 ,884164 ,899953 ,915741 ,931530 , 947319 ,963107 ,978896 ,994685 , 1.01047e+06,1.02626e+06,1.04205e+06,1.05784e+06, 1.07363e+06,1.08942e+06,1.10521e+06,1.12099e+06, 1.13678e+06,1.15257e+06,1.16836e+06,1.18415e+06, 1.19994e+06,1.21573e+06,1.23151e+06,1.24730e+06, 1.26309e+06,1.27888e+06,1.29467e+06,1.31046e+06, 1.32625e+06,1.34203e+06,1.35782e+06,1.37361e+06, 1.38940e+06,1.40519e+06,1.42098e+06,1.43677e+06, 1.45256e+06,1.46834e+06,1.48413e+06,1.49992e+06, 1.51571e+06,1.53150e+06,1.54729e+06,1.56308e+06, 1.57886e+06,1.59465e+06,1.61044e+06,1.62623e+06, 1.64202e+06,1.65781e+06,1.67360e+06,1.68939e+06, 1.70517e+06,1.72096e+06,1.73675e+06,1.75254e+06, 1.76833e+06,1.78412e+06,1.79991e+06,1.81569e+06, 1.83148e+06,1.84727e+06,1.86306e+06,1.87885e+06, 1.89464e+06,1.91043e+06,1.92621e+06,1.94200e+06, 1.95779e+06,1.97358e+06,1.98937e+06,2.00516e+06, 2.02095e+06,2.03674e+06,2.05252e+06,2.06831e+06, 2.08410e+06,2.09989e+06,2.11568e+06,2.13147e+06, 2.14726e+06,2.16304e+06,2.17883e+06,2.19462e+06, 2.21041e+06,2.22620e+06,2.24199e+06,2.25778e+06, 2.27356e+06,2.28935e+06,2.30514e+06,2.32093e+06, 2.33672e+06,2.35251e+06,2.36830e+06,2.38409e+06, 2.39987e+06,2.41566e+06,2.43145e+06,2.44724e+06, 2.46303e+06,2.47882e+06,2.49461e+06,2.51039e+06, 2.52618e+06,2.54197e+06,2.55776e+06,2.57355e+06, 2.58934e+06,2.60513e+06,2.62092e+06,2.63670e+06, 2.65249e+06,2.66828e+06,2.68407e+06,2.69986e+06, 2.71565e+06,2.73144e+06,2.74722e+06,2.76301e+06, 2.77880e+06,2.79459e+06,2.81038e+06,2.82617e+06, 2.84196e+06,2.85774e+06,2.87353e+06,2.88932e+06, 2.90511e+06,2.92090e+06,2.93669e+06,2.95248e+06, 2.96827e+06,2.98405e+06,2.99984e+06,3.01563e+06, 3.03142e+06,3.04721e+06,3.06300e+06,3.07879e+06, 3.09457e+06,3.11036e+06,3.12615e+06,3.14194e+06}; double a1widthin[200]={0,0,0,0,0,0,0,0, 0,0,0,0.00021256,0.0107225,0.0554708,0.150142,0.303848, 0.522655,0.81121,1.1736,1.61381,2.13606,2.74499,3.44583,4.24454, 5.14795,6.16391,7.3014,8.57079,9.98398,11.5547,13.2987,15.2344, 17.3827,19.7683,22.4195,25.3695,28.6568,32.3264,36.4311,41.0322, 46.201,52.0203,58.5847,66.0011,74.3871,83.8666,94.5615,106.578, 119.989,134.807,150.968,168.315,186.615,205.576,224.893,244.28, 263.499,282.364,300.748,318.569,335.781,352.367,368.327,383.677, 398.438,412.638,426.306,439.472,452.167,464.421,476.263,487.719, 498.815,509.576,520.024,530.179,540.063,549.693,559.621,568.26, 577.229,586.005,594.604,603.035,611.314,619.447,627.446,635.321, 643.082,650.736,658.288,665.75,673.127,680.427,687.659,694.82, 701.926,708.977,715.983,722.944,729.862,736.752,743.619,750.452, 757.271,764.076,770.874,777.658,784.444,791.233,798.027,804.838, 811.649,818.485,825.342,832.224,839.139,846.082,853.059,860.079, 867.143,874.248,881.409,919.527,945.28,965.514,983.228,999.471, 1014.69,1029.15,1043.05,1056.49,1069.57,1082.36,1094.88,1107.2, 1120.89,1131.4,1143.33,1155.15,1166.92,1178.61,1190.27,1201.92, 1213.55,1225.18,1236.81,1250.06,1260.16,1271.86,1283.64,1295.46, 1307.36,1319.3,1331.34,1343.45,1355.64,1367.93,1380.31,1392.77, 1405.35,1418.03,1430.83,1443.75,1457.17,1469.94,1483.22,1496.64, 1510.18,1523.86,1537.67,1551.64,1565.72,1579.99,1594.38,1608.92, 1623.63,1642.08,1653.51,1668.69,1684.03,1699.53,1715.21,1731.04, 1747.05,1763.23,1779.59,1796.12,1812.83,1829.72,1846.79,1864.04, 1881.49,1899.11,1916.93,1934.93,1953.13,1971.52,1990.12,2008.89}; if(_a1runwidth.empty()) { vector tmp1(a1widthin,a1widthin+200); std::transform(tmp1.begin(), tmp1.end(), back_inserter(_a1runwidth), [](double x){return x*GeV;}); vector tmp2(a1q2in,a1q2in+200); _a1runq2.clear(); std::transform(tmp2.begin(), tmp2.end(), back_inserter(_a1runq2), [](double x){return x*GeV2;}); } // zero parameters which will be calculated later to avoid problems _pf2cc=ZERO; _pf200=ZERO; _pf0cc=ZERO; _pf000=ZERO; _psigmacc=ZERO; _psigma00=ZERO; _mpi0=ZERO; _mpic=ZERO; _fact=ZERO; _maxmass=ZERO; _maxcalc=ZERO; } void ThreePionCLEOCurrent::doinit() { ThreeMesonCurrentBase::doinit(); // pointers to the particles we need tPDPtr a1m = getParticleData(ParticleID::a_1minus); // the different rho resonances tPDPtr rhom[3]; rhom[0] = getParticleData(-213); rhom[1] = getParticleData(-100213); rhom[2] = getParticleData(-30213); // the sigma tPDPtr sigma = getParticleData(9000221); // the f_2 tPDPtr f2=getParticleData(225); // the f_0 tPDPtr f0=getParticleData(10221); if(_localparameters) { // make sure the rho array has enough masses if(_rhomass.size()<3) { for(unsigned int ix=_rhomass.size();ix<3;++ix) { _rhomass.push_back(rhom[ix]->mass()); _rhowidth.push_back(rhom[ix]->width()); } } } // set the local variables if needed else { // masses and widths for the particles _rhomass.resize(3);_rhowidth.resize(3); for(unsigned int ix=0;ix<3;++ix) {_rhomass[ix]=rhom[ix]->mass();_rhowidth[ix]=rhom[ix]->width();} _f2mass=f2->mass();_f2width=f2->width(); _f0mass=f0->mass();_f0width=f0->width(); _sigmamass=sigma->mass();_sigmawidth=sigma->width(); _a1mass=a1m->mass();_a1width=a1m->width(); _mKstar=getParticleData(ParticleID::Kstarplus)->mass(); _mK =getParticleData(ParticleID::Kplus)->mass(); } // parameters for the breit-wigners _mpic=getParticleData(ParticleID::piplus)->mass(); _mpi0=getParticleData(ParticleID::pi0)->mass(); // momenta of the decay products for on-shell particles _psigmacc=Kinematics::pstarTwoBodyDecay(_sigmamass,_mpic,_mpic); _psigma00=Kinematics::pstarTwoBodyDecay(_sigmamass,_mpi0,_mpi0); _pf2cc=Kinematics::pstarTwoBodyDecay(_f2mass,_mpic,_mpic); _pf200=Kinematics::pstarTwoBodyDecay(_f2mass,_mpi0,_mpi0); _pf0cc=Kinematics::pstarTwoBodyDecay(_f0mass,_mpic,_mpic); _pf000=Kinematics::pstarTwoBodyDecay(_f0mass,_mpi0,_mpi0); _prhocc.resize(3);_prhoc0.resize(3); for(unsigned int ix=0;ix<3;++ix) { _prhocc[ix]=Kinematics::pstarTwoBodyDecay(_rhomass[ix],_mpic,_mpic); _prhoc0[ix]=Kinematics::pstarTwoBodyDecay(_rhomass[ix],_mpic,_mpi0); } // couplings for the different modes Complex ii(0.,1.); _rhocoupP.resize(_rhomagP.size()); for(unsigned int ix=0;ix<_rhomagP.size();++ix) {_rhocoupP[ix]=_rhomagP[ix]*(cos(_rhophaseP[ix])+ii*sin(_rhophaseP[ix]));} _rhocoupD.resize(_rhomagD.size()); for(unsigned int ix=0;ix<_rhomagD.size();++ix) {_rhocoupD[ix]=_rhomagD[ix]*(cos(_rhophaseD[ix])+ii*sin(_rhophaseD[ix]));} _f0coup=_f0mag*(cos(_f0phase)+ii*sin(_f0phase)); _f2coup=_f2mag*(cos(_f2phase)+ii*sin(_f2phase)); _sigmacoup=_sigmamag*(cos(_sigmaphase)+ii*sin(_sigmaphase)); // overall coupling _fact = 2.*sqrt(2.)/_fpi/3.; // initialise the a_1 running width calculation inita1Width(-1); } void ThreePionCLEOCurrent::persistentOutput(PersistentOStream & os) const { os << ounit(_rhomass,GeV) << ounit(_rhowidth,GeV) << ounit(_prhocc,GeV) << ounit(_prhoc0,GeV) << ounit(_f2mass,GeV) << ounit(_f2width,GeV) << ounit(_pf2cc,GeV) << ounit(_pf200,GeV) << ounit(_f0mass,GeV) << ounit(_f0width,GeV) << ounit(_pf0cc,GeV) << ounit(_pf000,GeV) << ounit(_sigmamass,GeV) << ounit(_sigmawidth,GeV) << ounit(_psigmacc,GeV) << ounit(_psigma00,GeV) << ounit(_mpi0,GeV) << ounit(_mpic,GeV) << ounit(_fpi,GeV) << ounit(_fact,1/GeV) << _rhomagP << _rhophaseP << _rhocoupP << ounit(_rhomagD,1/GeV2) << _rhophaseD << ounit(_rhocoupD,1/GeV2) <> iunit(_rhomass,GeV) >> iunit(_rhowidth,GeV) >> iunit(_prhocc,GeV) >> iunit(_prhoc0,GeV) >> iunit(_f2mass,GeV) >> iunit(_f2width,GeV) >> iunit(_pf2cc,GeV) >> iunit(_pf200,GeV) >> iunit(_f0mass,GeV) >> iunit(_f0width,GeV) >> iunit(_pf0cc,GeV) >> iunit(_pf000,GeV) >> iunit(_sigmamass,GeV) >> iunit(_sigmawidth,GeV) >> iunit(_psigmacc,GeV) >> iunit(_psigma00,GeV) >> iunit(_mpi0,GeV) >> iunit(_mpic,GeV) >> iunit(_fpi,GeV) >> iunit(_fact,1/GeV) >> _rhomagP >> _rhophaseP >> _rhocoupP >> iunit(_rhomagD,1/GeV2) >> _rhophaseD >> iunit(_rhocoupD,1/GeV2) >> iunit(_f2mag,1/GeV2) >> _f2phase >> iunit(_f2coup,1/GeV2) >> _f0mag >> _f0phase >> _f0coup >> _sigmamag >> _sigmaphase >> _sigmacoup >> _localparameters >> iunit(_a1mass,GeV) >> iunit(_a1width,GeV) >> iunit(_a1runwidth,GeV) >> iunit(_a1runq2,GeV2) >> _initializea1 >> iunit(_mKstar,GeV) >> iunit(_mK,GeV) >> _gammk >> _a1opt >> iunit(_maxmass,GeV) >> iunit(_maxcalc,GeV) >> _a1runinter; } void ThreePionCLEOCurrent::Init() { static ClassDocumentation documentation ("The ThreePionCLEOCurrent class performs the decay of the" " tau to three pions using the currents from CLEO", "The decay of tau to three pions is modelled using the currents from " "\\cite{Asner:1999kj}.", " %\\cite{Asner:1999kj}\n" "\\bibitem{Asner:1999kj}\n" " D.~M.~Asner {\\it et al.} [CLEO Collaboration],\n" " ``Hadronic structure in the decay tau- --> nu/tau pi- pi0 pi0 and the sign\n" " %of the tau neutrino helicity,''\n" " Phys.\\ Rev.\\ D {\\bf 61}, 012002 (2000)\n" " [arXiv:hep-ex/9902022].\n" " %%CITATION = PHRVA,D61,012002;%%\n" ); static ParVector interfacerhomass ("RhoMasses", "The masses of the different rho resonnaces", &ThreePionCLEOCurrent::_rhomass, MeV, 0, ZERO, -10000*MeV, 10000*MeV, false, false, true); static ParVector interfacerhowidth ("RhoWidths", "The widths of the different rho resonnaces", &ThreePionCLEOCurrent::_rhowidth, MeV, 0, ZERO, -10000*MeV, 10000*MeV, false, false, true); static Parameter interfacef_2Mass ("f_2Mass", "The mass of the f_2 meson", &ThreePionCLEOCurrent::_f2mass, GeV, 1.275*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacef_2Width ("f_2Width", "The width of the f_2 meson", &ThreePionCLEOCurrent::_f2width, GeV, 0.185*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfacef_0Mass ("f_0Mass", "The mass of the f_0 meson", &ThreePionCLEOCurrent::_f0mass, GeV, 1.186*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacef_0Width ("f_0Width", "The width of the f_0 meson", &ThreePionCLEOCurrent::_f0width, GeV, 0.350*GeV, ZERO, 1.0*GeV, false, false, true); static Parameter interfacesigmaMass ("sigmaMass", "The mass of the sigma meson", &ThreePionCLEOCurrent::_sigmamass, GeV, 0.860*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacesigmaWidth ("sigmaWidth", "The width of the sigma meson", &ThreePionCLEOCurrent::_sigmawidth, GeV, 0.880*GeV, ZERO, 2.0*GeV, false, false, true); static Parameter interfacea1Mass ("a1Mass", "The mass of the a_1 meson", &ThreePionCLEOCurrent::_a1mass, GeV, 1.331*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfacea1Width ("a1Width", "The width of the a_1 meson", &ThreePionCLEOCurrent::_a1width, GeV, 0.814*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceKaonMass ("KaonMass", "The mass of the kaon", &ThreePionCLEOCurrent::_mK, GeV, 0.496*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceKStarMass ("KStarMass", "The mass of the k* meson", &ThreePionCLEOCurrent::_mKstar, GeV, 0.894*GeV, ZERO, 10.0*GeV, false, false, true); static Parameter interfaceKaonCoupling ("KaonCoupling", "The relative coupling for the kaon in the a_1 running width", &ThreePionCLEOCurrent::_gammk, 3.32, 0.0, 10.0, false, false, true); static Parameter interfaceFpi ("Fpi", "The pion decay constant", &ThreePionCLEOCurrent::_fpi, MeV, 130.7*MeV/sqrt(2.), ZERO, 500.0*MeV, false, false, true); static ParVector interfacerhomagP ("RhoPWaveMagnitude", "The magnitude of the couplings for the p-wave rho currents", &ThreePionCLEOCurrent::_rhomagP, 0, 0, 0, 0, 10000, false, false, true); static ParVector interfacerhophaseP ("RhoPWavePhase", "The phase of the couplings for the p-wave rho currents", &ThreePionCLEOCurrent::_rhophaseP, 0, 0, 0, -Constants::twopi, Constants::twopi, false, false, true); static ParVector interfacerhomagD ("RhoDWaveMagnitude", "The magnitude of the couplings for the d-wave rho currents", &ThreePionCLEOCurrent::_rhomagD, 1/MeV2, 0, ZERO, ZERO, 10000/MeV2, false, false, true); static ParVector interfacerhophaseD ("RhoDWavePhase", "The phase of the couplings for the d-wave rho currents", &ThreePionCLEOCurrent::_rhophaseD, 0, 0, 0, -Constants::twopi, Constants::twopi, false, false, true); static Parameter interfacef0Phase ("f0Phase", "The phase of the f_0 scalar current", &ThreePionCLEOCurrent::_f0phase, 0.54*Constants::pi, -Constants::twopi, Constants::twopi, false, false, true); static Parameter interfacef2Phase ("f2Phase", "The phase of the f_2 tensor current", &ThreePionCLEOCurrent::_f2phase, 0.56*Constants::pi,-Constants::twopi, Constants::twopi, false, false, true); static Parameter interfacesigmaPhase ("sigmaPhase", "The phase of the sigma scalar current", &ThreePionCLEOCurrent::_sigmaphase, 0.23*Constants::pi, -Constants::twopi, Constants::twopi, false, false, true); static Parameter interfacef0Magnitude ("f0Magnitude", "The magnitude of the f_0 scalar current", &ThreePionCLEOCurrent::_f0mag, 0.77, 0.0, 10, false, false, true); static Parameter interfacef2Magnitude ("f2Magnitude", "The magnitude of the f_2 tensor current", &ThreePionCLEOCurrent::_f2mag, 1./GeV2, 0.71/GeV2, ZERO, 10./GeV2, false, false, true); static Parameter interfacesigmaMagnitude ("sigmaMagnitude", "The magnitude of the sigma scalar current", &ThreePionCLEOCurrent::_sigmamag, 2.1, 0.0, 10, false, false, true); static Switch interfaceLocalParameters ("LocalParameters", "Use local values of the intermediate resonances masses and widths", &ThreePionCLEOCurrent::_localparameters, true, false, false); static SwitchOption interfaceLocalParametersLocal (interfaceLocalParameters, "Local", "Use the local values", true); static SwitchOption interfaceLocalParametersDefault (interfaceLocalParameters, "ParticleData", "Use the values from the particleData objects", false); static ParVector interfacea1RunningWidth ("a1RunningWidth", "The values of the a_1 width for interpolation to giving the running width.", &ThreePionCLEOCurrent::_a1runwidth, MeV, 0, ZERO, ZERO, 10000000*MeV, false, false, true); static ParVector interfacea1RunningQ2 ("a1RunningQ2", "The values of the q^2 for interpolation to giving the running width.", &ThreePionCLEOCurrent::_a1runq2, MeV2, 0, ZERO, ZERO, 10000000*MeV2, false, false, true); static Switch interfaceInitializea1 ("Initializea1", "Initialise the calculation of the a_1 running width", &ThreePionCLEOCurrent::_initializea1, false, false, false); static SwitchOption interfaceInitializea1Initialization (interfaceInitializea1, "Yes", "Initialize the calculation", true); static SwitchOption interfaceInitializea1NoInitialization (interfaceInitializea1, "No", "Use the default values", false); static Switch interfacea1WidthOption ("a1WidthOption", "Option for the treatment of the a1 width", &ThreePionCLEOCurrent::_a1opt, true, false, false); static SwitchOption interfacea1WidthOptionLocal (interfacea1WidthOption, "Local", "Use a calculation of the running width based on the parameters as" " interpolation table.", true); static SwitchOption interfacea1WidthOptionParam (interfacea1WidthOption, "Kuhn", "Use the parameterization of Kuhn and Santamaria for default parameters." " This should only be used for testing vs TAUOLA", false); } // initialisation of the a_1 width // (iopt=-1 initialises, iopt=0 starts the interpolation) void ThreePionCLEOCurrent::inita1Width(int iopt) { if(iopt==-1) { _maxcalc=_maxmass; if(!_initializea1||_maxmass==ZERO) return; // parameters for the table of values Energy2 step=sqr(_maxmass)/200.; // function to be integrated to give the matrix element // integrator to perform the integral vector inweights;inweights.push_back(0.5);inweights.push_back(0.5); vector intype;intype.push_back(2);intype.push_back(3); Energy mrho=getParticleData(ParticleID::rhoplus)->mass(); Energy wrho=getParticleData(ParticleID::rhoplus)->width(); vector inmass;inmass.push_back(mrho);inmass.push_back(mrho); vector inwidth;inwidth.push_back(wrho);inwidth.push_back(wrho); vector inpow(2,0.0); ThreeBodyAllOnCalculator widthgenN(inweights,intype,inmass,inwidth,inpow,*this,0,_mpi0,_mpi0,_mpic); ThreeBodyAllOnCalculator widthgenC(inweights,intype,inmass,inwidth,inpow,*this,1,_mpic,_mpic,_mpic); // normalisation constant to give physical width if on shell double a1const = _a1width/(widthgenN.partialWidth(sqr(_a1mass))+ widthgenC.partialWidth(sqr(_a1mass))); // loop to give the values _a1runq2.clear();_a1runwidth.clear(); for(Energy2 moff2=ZERO; moff2<=sqr(_maxmass); moff2+=step) { Energy moff=sqrt(moff2); _a1runq2.push_back(moff2); Energy charged=a1const*widthgenC.partialWidth(moff2); Energy neutral=a1const*widthgenN.partialWidth(moff2); Energy kaon = moff<=_mK+_mKstar ? ZERO : 2.870*_gammk*_gammk/8./Constants::pi* Kinematics::pstarTwoBodyDecay(moff,_mK,_mKstar)/moff2*GeV2; Energy total = charged + neutral + kaon; _a1runwidth.push_back(total); } } // set up the interpolator else if(iopt==0) { _a1runinter = make_InterpolatorPtr(_a1runwidth,_a1runq2,3); } } // modes handled by this class bool ThreePionCLEOCurrent::acceptMode(int imode) const { return imode>=0&&imode<=1; } ThreePionCLEOCurrent::FormFactors ThreePionCLEOCurrent:: calculateFormFactors(const int ichan, const int imode, Energy2 q2, Energy2 s1, Energy2 s2, Energy2 s3) const { Complex F1=0., F2=0., F3=0.;//F4=0.;F5=0.; // calculate the form factors without the a_1 piece CLEOFormFactor(imode,ichan,q2,s1,s2,s3,F1,F2,F3); // change sign of the f_2 term F2=-F2; // multiply by the a_1 factor complex a1fact = a1BreitWigner(q2) * _fact; return FormFactors(F1*a1fact, F2*a1fact, F3*a1fact); } void ThreePionCLEOCurrent::CLEOFormFactor(int imode,int ichan, Energy2 q2,Energy2 s1, Energy2 s2, Energy2 s3, Complex & F1, Complex & F2, Complex & F3) const { useMe(); if(imode==0) { // compute the breit wigners we need Complex rhos1bw[3],rhos2bw[3],f0bws1,sigbws1,f2bws1,f0bws2,sigbws2,f2bws2; for(unsigned int ix=0,N=max(_rhocoupP.size(),_rhocoupD.size());ix sfact1 = 1./18.*(4.*_mpic*_mpic-s1)*(q2+s1-_mpic*_mpic)/s1*f2bws1; complex sfact2 = 1./18.*(4.*_mpic*_mpic-s2)*(q2+s2-_mpic*_mpic)/s2*f2bws2; - F1+=_f2coup*(0.5*(s3-s2)*f2bws1-sfact2); - F2+=_f2coup*(0.5*(s3-s1)*f2bws2-sfact1); - F3+=_f2coup*(-sfact1+sfact2); + F1+=Complex(_f2coup*(0.5*(s3-s2)*f2bws1-sfact2)); + F2+=Complex(_f2coup*(0.5*(s3-s1)*f2bws2-sfact1)); + F3+=Complex(_f2coup*(-sfact1+sfact2)); } else if(ichan%2==0&&ichan<=4) { unsigned int ires=ichan/2; Energy2 Dfact2=1./3.*(s2-s3); if(ires<_rhocoupP.size()) F1-=_rhocoupP[ires]*rhos1bw[ires]; if(ires<_rhocoupD.size()) { - F2-=Dfact2*_rhocoupD[ires]*rhos1bw[ires]; - F3-=_rhocoupD[ires]*Dfact2*rhos1bw[ires]; + F2-=Complex(Dfact2*_rhocoupD[ires]*rhos1bw[ires]); + F3-=Complex(_rhocoupD[ires]*Dfact2*rhos1bw[ires]); } } else if(ichan%2==1&&ichan<=5) { unsigned int ires=(ichan-1)/2; Energy2 Dfact1=1./3.*(s1-s3); if(ires<_rhocoupP.size()) { F2-=_rhocoupP[ires]*rhos2bw[ires]; } if(ires<_rhocoupD.size()) { - F1-=Dfact1*_rhocoupD[ires]*rhos2bw[ires]; - F3+=_rhocoupD[ires]*Dfact1*rhos2bw[ires]; + F1-=Complex(Dfact1*_rhocoupD[ires]*rhos2bw[ires]); + F3+=Complex(_rhocoupD[ires]*Dfact1*rhos2bw[ires]); } } else if(ichan==6) { F2-=2./3.*_sigmacoup*sigbws1; F3-=2./3.*_sigmacoup*sigbws1; } else if(ichan==7) { F1-=2./3.*_sigmacoup*sigbws2; F3+=2./3.*_sigmacoup*sigbws2; } else if(ichan==8) { complex sfact1 = 1./18.*(4.*_mpic*_mpic-s1)*(q2+s1-_mpic*_mpic)/s1*f2bws1; - F1+=_f2coup*0.5*(s3-s2)*f2bws1; - F2-=_f2coup*sfact1; - F3-=_f2coup*sfact1; + F1+=Complex(_f2coup*0.5*(s3-s2)*f2bws1); + F2-=Complex(_f2coup*sfact1); + F3-=Complex(_f2coup*sfact1); } else if(ichan==9) { complex sfact2 = 1./18.*(4.*_mpic*_mpic-s2)*(q2+s2-_mpic*_mpic)/s2*f2bws2; - F1-=_f2coup*sfact2; - F2+=_f2coup*0.5*(s3-s1)*f2bws2; - F3+=_f2coup*sfact2; + F1-=Complex(_f2coup*sfact2); + F2+=Complex(_f2coup*0.5*(s3-s1)*f2bws2); + F3+=Complex(_f2coup*sfact2); } else if(ichan==10) { F2-=2./3.*_f0coup*f0bws1; F3-=2./3.*_f0coup*f0bws1; } else if(ichan==11) { F1-=2./3.*_f0coup*f0bws2; F3+=2./3.*_f0coup*f0bws2; } } // calculate the pi0 pi0 pi+ factor else if(imode==1) { // compute the breit wigners we need Complex rhos1bw[3],rhos2bw[3],f0bw,sigbw,f2bw; for(unsigned int ix=0,N=max(_rhocoupP.size(),_rhocoupD.size());ixmassMin(); if(min>upp) return false; _maxmass=max(_maxmass,upp); // pointers to the particles we need tPDPtr a1m = getParticleData(ParticleID::a_1minus); // the different rho resonances tPDPtr rhom[3]; if(icharge==-3) { rhom[0] = getParticleData(-213); rhom[1] = getParticleData(-100213); rhom[2] = getParticleData(-30213); } else if(icharge==3) { rhom[0] = getParticleData(213); rhom[1] = getParticleData(100213); rhom[2] = getParticleData(30213); } else { return false; } tPDPtr rho0[3] = {getParticleData(113),getParticleData(100113), getParticleData(30113)}; // the sigma tPDPtr sigma = getParticleData(9000221); // the f_2 tPDPtr f2=getParticleData(225); // the f_0 tPDPtr f0=getParticleData(10221); // set up the integration channels DecayPhaseSpaceChannelPtr newchannel; if(imode==0) { for(unsigned int ix=0;ix<3;++ix) { if(!rho0[ix]) continue; // the neutral rho channels // first channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc); newchannel->addIntermediate(rho0[ix],0,0.0,iloc+1,iloc+2); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+1); newchannel->addIntermediate(rho0[ix],0,0.0,iloc,iloc+2); mode->addChannel(newchannel); } // the sigma channels if(sigma) { newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc); newchannel->addIntermediate(sigma,0,0.0,iloc+1,iloc+2); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+1); newchannel->addIntermediate(sigma,0,0.0,iloc,iloc+2); mode->addChannel(newchannel); } // the f_2 channels if(f2) { newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc); newchannel->addIntermediate(f2,0,0.0,iloc+1,iloc+2); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+1); newchannel->addIntermediate(f2,0,0.0,iloc,iloc+2); mode->addChannel(newchannel); } if(f0) { // the f_0 channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc); newchannel->addIntermediate(f0,0,0.0,iloc+1,iloc+2); mode->addChannel(newchannel); // interchanged channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+1); newchannel->addIntermediate(f0,0,0.0,iloc,iloc+2); mode->addChannel(newchannel); } } else { for(unsigned int ix=0;ix<3;++ix) { if(!rhom[ix]) continue; // first rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc); newchannel->addIntermediate(rhom[ix],0,0.0,iloc+2,iloc+1); mode->addChannel(newchannel); // second rho+ channel newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+1); newchannel->addIntermediate(rhom[ix],0,0.0,iloc+2,iloc); mode->addChannel(newchannel); } // the sigma channel if(sigma) { newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+2); newchannel->addIntermediate(sigma,0,0.0,iloc,iloc+1); mode->addChannel(newchannel); } // the f_2 channel if(f2) { newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+2); newchannel->addIntermediate(f2,0,0.0,iloc,iloc+1); mode->addChannel(newchannel); } // the f_0 channel if(f0) { newchannel = new_ptr(DecayPhaseSpaceChannel(*phase)); newchannel->addIntermediate(a1m,0,0.0,-ires-1,iloc+2); newchannel->addIntermediate(f0,0,0.0,iloc,iloc+1); mode->addChannel(newchannel); } } if(_localparameters) { for(unsigned int iy=0;iy<_rhomass.size();++iy) { if(rho0[iy]) mode->resetIntermediate(rho0[iy],_rhomass[iy],_rhowidth[iy]); if(rhom[iy]) mode->resetIntermediate(rhom[iy],_rhomass[iy],_rhowidth[iy]); } if(sigma) mode->resetIntermediate(sigma,_sigmamass,_sigmawidth); if(f2) mode->resetIntermediate(f2,_f2mass,_f2width); if(f0) mode->resetIntermediate(f0,_f0mass,_f0width); mode->resetIntermediate(a1m,_a1mass,_a1width); } return true; } void ThreePionCLEOCurrent::dataBaseOutput(ofstream & output,bool header, bool create) const { if(header){output << "update decayers set parameters=\"";} if(create) { output << "create Herwig::ThreePionCLEOCurrent " << name() << " HwWeakCurrents.so\n"; } for(unsigned int ix=0;ix<_rhomass.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/MeV << "\n"; } else { output << "insert " << name() << ":RhoMasses " << ix << " " << _rhomass[ix]/MeV << "\n"; } } for(unsigned int ix=0;ix<_rhowidth.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/MeV << "\n"; } else { output << "insert " << name() << ":RhoWidths " << ix << " " << _rhowidth[ix]/MeV << "\n"; } } output << "newdef " << name() << ":f_2Mass " << _f2mass/GeV << "\n"; output << "newdef " << name() << ":f_2Width " << _f2width/GeV << "\n"; output << "newdef " << name() << ":f_0Mass " << _f0mass/GeV << "\n"; output << "newdef " << name() << ":f_0Width " << _f0width/GeV << "\n"; output << "newdef " << name() << ":sigmaMass " << _sigmamass/GeV << "\n"; output << "newdef " << name() << ":sigmaWidth " << _sigmawidth/GeV << "\n"; output << "newdef " << name() << ":a1Mass " << _a1mass/GeV << "\n"; output << "newdef " << name() << ":a1Width " <<_a1width /GeV << "\n"; output << "newdef " << name() << ":KaonMass " << _mK/GeV << "\n"; output << "newdef " << name() << ":KStarMass " << _mKstar/GeV << "\n"; output << "newdef " << name() << ":KaonCoupling " << _gammk << "\n"; output << "newdef " << name() << ":Fpi " << _fpi/MeV << "\n"; output << "newdef " << name() << ":a1WidthOption " << _a1opt << "\n"; for(unsigned int ix=0;ix<_rhomagP.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoPWaveMagnitude " << ix << " " << _rhomagP[ix] << "\n"; } else { output << "insert " << name() << ":RhoPWaveMagnitude " << ix << " " << _rhomagP[ix] << "\n"; } } for(unsigned int ix=0;ix<_rhophaseP.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoPWavePhase " << ix << " " << _rhophaseP[ix] << "\n"; } else { output << "insert " << name() << ":RhoPWavePhase " << ix << " " << _rhophaseP[ix] << "\n"; } } for(unsigned int ix=0;ix<_rhomagD.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoDWaveMagnitude " << ix << " " << _rhomagD[ix]*MeV2 << "\n"; } else { output << "insert " << name() << ":RhoDWaveMagnitude " << ix << " " << _rhomagD[ix]*MeV2 << "\n"; } } for(unsigned int ix=0;ix<_rhophaseD.size();++ix) { if(ix<2) { output << "newdef " << name() << ":RhoDWavePhase " << ix << " " << _rhophaseD[ix] << "\n"; } else { output << "insert " << name() << ":RhoDWavePhase " << ix << " " << _rhophaseD[ix] << "\n"; } } output << "newdef " << name() << ":f0Phase " << _f0phase << "\n"; output << "newdef " << name() << ":f2Phase " <<_f2phase << "\n"; output << "newdef " << name() << ":sigmaPhase " <<_sigmaphase << "\n"; output << "newdef " << name() << ":f0Magnitude " << _f0mag << "\n"; output << "newdef " << name() << ":f2Magnitude " << _f2mag*GeV2 << "\n"; output << "newdef " << name() << ":sigmaMagnitude " <<_sigmamag << "\n"; output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n"; output << "newdef " << name() << ":Initializea1 " <<_initializea1 << "\n"; for(unsigned int ix=0;ix<_a1runwidth.size();++ix) { if(ix<200) { output << "newdef " << name() << ":a1RunningWidth " << ix << " " << _a1runwidth[ix]/MeV << "\n"; } else { output << "insert " << name() << ":a1RunningWidth " << ix << " " << _a1runwidth[ix]/MeV << "\n"; } } for(unsigned int ix=0;ix<_a1runq2.size();++ix) { if(ix<200) { output << "newdef " << name() << ":a1RunningQ2 " << ix << " " << _a1runq2[ix]/MeV2 << "\n"; } else { output << "insert " << name() << ":a1RunningQ2 " << ix << " " << _a1runq2[ix]/MeV2 << "\n"; } } ThreeMesonCurrentBase::dataBaseOutput(output,false,false); if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl; } void ThreePionCLEOCurrent::doinitrun() { // set up the running a_1 width inita1Width(0); ThreeMesonCurrentBase::doinitrun(); } void ThreePionCLEOCurrent::doupdate() { ThreeMesonCurrentBase::doupdate(); // update running width if needed if ( !touched() ) return; if(_maxmass!=_maxcalc) inita1Width(-1); } Energy ThreePionCLEOCurrent::a1width(Energy2 q2) const { Energy output; if(_a1opt) output=(*_a1runinter)(q2); else { double gam(0.); if(q2<0.1753*GeV2) { gam =0.; } else if(q2<0.823*GeV2) { double p=q2/GeV2-0.1753; gam = 5.80900*p*sqr(p)*(1.-3.00980*p+4.57920*sqr(p)); } else { double p=q2/GeV2; gam = -13.91400+27.67900*p-13.39300*sqr(p) +3.19240*sqr(p)*p-0.10487*sqr(sqr(p)); } if(q2<0.1676*GeV2) { gam+=0.; } else if(q2<0.823*GeV2) { double p=q2/GeV2-0.1676; gam+= 6.28450*p*sqr(p)*(1.-2.95950*p+4.33550*sqr(p)); } else { double p=q2/GeV2; gam+= -15.41100+32.08800*p-17.66600*sqr(p) +4.93550*sqr(p)*p-0.37498*sqr(sqr(p)); } Energy mkst=0.894*GeV,mk=0.496*GeV; Energy2 mk1sq=sqr(mkst+mk), mk2sq=sqr(mkst-mk); double c3pi=sqr(0.2384),ckst=sqr(4.7621)*c3pi; gam*=c3pi; if(q2>mk1sq) gam+=0.5*ckst*sqrt((q2-mk1sq)*(q2-mk2sq))/q2; gam = gam*_a1width*_a1mass/GeV2/1.331/0.814/1.0252088; output = gam*GeV2/sqrt(q2); } return output; } double ThreePionCLEOCurrent::threeBodyMatrixElement(const int iopt, const Energy2 q2, const Energy2 s3, const Energy2 s2, const Energy2 s1, const Energy, const Energy, const Energy) const { Energy p1[5],p2[5],p3[5]; Energy2 p1sq, p2sq, p3sq; Energy q=sqrt(q2); Energy2 mpi2c=_mpic*_mpic; Energy2 mpi20=_mpi0*_mpi0; // construct the momenta for the 2 neutral 1 charged mode Complex F1,F2,F3; if(iopt==0) { // construct the momenta of the decay products p1[0] = 0.5*(q2+mpi20-s1)/q; p1sq=p1[0]*p1[0]; p1[4]=sqrt(p1sq-mpi20); p2[0] = 0.5*(q2+mpi20-s2)/q; p2sq=p2[0]*p2[0]; p2[4]=sqrt(p2sq-mpi20); p3[0] = 0.5*(q2+mpi2c-s3)/q; p3sq=p3[0]*p3[0]; p3[4]=sqrt(p3sq-mpi2c); // take momentum of 1 parallel to z axis p1[1]=ZERO;p1[2]=ZERO;p1[3]=p1[4]; // construct 2 double cos2 = 0.5*(p1sq+p2sq-p3sq-2.*mpi20+mpi2c)/p1[4]/p2[4]; p2[1] = p2[4]*sqrt(1.-cos2*cos2); p2[2]=ZERO; p2[3]=-p2[4]*cos2; // construct 3 double cos3 = 0.5*(p1sq-p2sq+p3sq-mpi2c)/p1[4]/p3[4]; p3[1] =-p3[4]*sqrt(1.-cos3*cos3); p3[2]=ZERO; p3[3]=-p3[4]*cos3; // calculate the form factors CLEOFormFactor(1,-1,q2,s1,s2,s3,F1,F2,F3); } // construct the momenta for the 3 charged mode else { // construct the momenta of the decay products p1[0] = 0.5*(q2+mpi2c-s1)/q; p1sq=p1[0]*p1[0]; p1[4]=sqrt(p1sq-mpi2c); p2[0] = 0.5*(q2+mpi2c-s2)/q; p2sq=p2[0]*p2[0]; p2[4]=sqrt(p2sq-mpi2c); p3[0] = 0.5*(q2+mpi2c-s3)/q; p3sq=p3[0]*p3[0]; p3[4]=sqrt(p3sq-mpi2c); // take momentum of 1 parallel to z axis p1[1]=ZERO;p1[2]=ZERO;p1[3]=p1[4]; // construct 2 double cos2 = 0.5*(p1sq+p2sq-p3sq-mpi2c)/p1[4]/p2[4]; p2[1] = p2[4]*sqrt(1.-cos2*cos2); p2[2]=ZERO; p2[3]=-p2[4]*cos2; // construct 3 double cos3 = 0.5*(p1sq-p2sq+p3sq-mpi2c)/p1[4]/p3[4]; p3[1] =-p3[4]*sqrt(1.-cos3*cos3); p3[2]=ZERO; p3[3]=-p3[4]*cos3; // calculate the form factors CLEOFormFactor(0,-1,q2,s1,s2,s3,F1,F2,F3); } // construct a vector with the current complex current[4]; for(unsigned int ix=0;ix<4;++ix) current[ix] = F1*(p2[ix]-p3[ix])-F2*(p3[ix]-p1[ix])+F3*(p1[ix]-p2[ix]); complex dot1=current[0]*conj(current[0]); for(unsigned int ix=1;ix<4;++ix) dot1-=current[ix]*conj(current[ix]); complex dot2=current[0]*q; return(-dot1+dot2*conj(dot2)/q2).real() / sqr(_rhomass[0]); } diff --git a/MatrixElement/Hadron/MEPP2HiggsJet.cc b/MatrixElement/Hadron/MEPP2HiggsJet.cc --- a/MatrixElement/Hadron/MEPP2HiggsJet.cc +++ b/MatrixElement/Hadron/MEPP2HiggsJet.cc @@ -1,878 +1,877 @@ // -*- C++ -*- // // MEPP2HiggsJet.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the MEPP2HiggsJet class. // #include "MEPP2HiggsJet.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Repository/EventGenerator.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/StandardModel/StandardModelBase.h" #include "ThePEG/Utilities/SimplePhaseSpace.h" #include "ThePEG/PDT/EnumParticles.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/Handlers/StandardXComb.h" #include "ThePEG/Cuts/Cuts.h" #include "ThePEG/MatrixElement/Tree2toNDiagram.h" #include "Herwig/MatrixElement/HardVertex.h" #include "Herwig/Utilities/HiggsLoopFunctions.h" using namespace Herwig; using namespace Herwig::HiggsLoopFunctions; IBPtr MEPP2HiggsJet::clone() const { return new_ptr(*this); } IBPtr MEPP2HiggsJet::fullclone() const { return new_ptr(*this); } unsigned int MEPP2HiggsJet::orderInAlphaS() const { return 3; } unsigned int MEPP2HiggsJet::orderInAlphaEW() const { return 1; } void MEPP2HiggsJet::persistentOutput(PersistentOStream & os) const { os << _shapeopt << _maxflavour << _process << _minloop << _maxloop << _massopt << ounit(_mh,GeV) << ounit(_wh,GeV) << _hmass; } void MEPP2HiggsJet::persistentInput(PersistentIStream & is, int) { is >> _shapeopt >> _maxflavour >> _process >> _minloop >> _maxloop >> _massopt >> iunit(_mh,GeV) >> iunit(_wh,GeV) >> _hmass; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigMEPP2HiggsJet("Herwig::MEPP2HiggsJet", "HwMEHadron.so"); void MEPP2HiggsJet::Init() { static ClassDocumentation documentation ("The MEPP2HiggsJet class implements the matrix elements for" " Higgs+Jet production in hadron-hadron collisions.", "The theoretical calculations of \\cite{Baur:1989cm} and \\cite{Ellis:1987xu}" " were used for the Higgs+jet matrix element in hadron-hadron collisions.", "\\bibitem{Baur:1989cm} U.~Baur and E.~W.~N.~Glover," "Nucl.\\ Phys.\\ B {\\bf 339} (1990) 38.\n" "\\bibitem{Ellis:1987xu} R.~K.~Ellis, I.~Hinchliffe, M.~Soldate and " "J.~J.~van der Bij, Nucl.\\ Phys.\\ B {\\bf 297} (1988) 221."); static Parameter interfaceMaximumFlavour ("MaximumFlavour", "The maximum flavour of the quarks in the process", &MEPP2HiggsJet::_maxflavour, 5, 1, 5, false, false, Interface::limited); static Switch interfaceShapeOption ("ShapeScheme", "Option for the treatment of the Higgs resonance shape", &MEPP2HiggsJet::_shapeopt, 1, false, false); static SwitchOption interfaceStandardShapeFixed (interfaceShapeOption, "FixedBreitWigner", "Breit-Wigner s-channel resonanse", 1); static SwitchOption interfaceStandardShapeRunning (interfaceShapeOption, "MassGenerator", "Use the mass generator to give the shape", 2); static Switch interfaceProcess ("Process", "Which subprocesses to include", &MEPP2HiggsJet::_process, 0, false, false); static SwitchOption interfaceProcessAll (interfaceProcess, "All", "Include all subprocesses", 0); static SwitchOption interfaceProcess1 (interfaceProcess, "qqbar", "Only include the incoming q qbar subprocess", 1); static SwitchOption interfaceProcessqg (interfaceProcess, "qg", "Only include the incoming qg subprocess", 2); static SwitchOption interfaceProcessqbarg (interfaceProcess, "qbarg", "Only include the incoming qbar g subprocess", 3); static SwitchOption interfaceProcessgg (interfaceProcess, "gg", "Only include the incoming gg subprocess", 4); static Parameter interfaceMinimumInLoop ("MinimumInLoop", "The minimum flavour of the quarks to include in the loops", &MEPP2HiggsJet::_minloop, 6, 4, 6, false, false, Interface::limited); static Parameter interfaceMaximumInLoop ("MaximumInLoop", "The maximum flavour of the quarks to include in the loops", &MEPP2HiggsJet::_maxloop, 6, 4, 6, false, false, Interface::limited); static Switch interfaceMassOption ("MassOption", "Option for the treatment of the masses in the loop diagrams", &MEPP2HiggsJet::_massopt, 0, false, false); static SwitchOption interfaceMassOptionFull (interfaceMassOption, "Full", "Include the full mass dependence", 0); static SwitchOption interfaceMassOptionLarge (interfaceMassOption, "Large", "Use the heavy mass limit", 1); } bool MEPP2HiggsJet::generateKinematics(const double * r) { Energy ptmin = max(lastCuts().minKT(mePartonData()[2]), lastCuts().minKT(mePartonData()[3])); Energy e = sqrt(sHat())/2.0; // generate the mass of the higgs boson Energy2 mhmax2 = sHat()-4.*ptmin*e; Energy2 mhmin2 =ZERO; if(mhmax2<=mhmin2) return false; double rhomin = atan2((mhmin2-sqr(_mh)), _mh*_wh); double rhomax = atan2((mhmax2-sqr(_mh)), _mh*_wh); Energy mh = sqrt(_mh*_wh*tan(rhomin+r[1]*(rhomax-rhomin))+sqr(_mh)); // assign masses if(mePartonData()[2]->id()!=ParticleID::h0) { meMomenta()[2].setMass(ZERO); meMomenta()[3].setMass(mh); } else { meMomenta()[3].setMass(ZERO); meMomenta()[2].setMass(mh); } Energy q = ZERO; try { q = SimplePhaseSpace:: getMagnitude(sHat(), meMomenta()[2].mass(), meMomenta()[3].mass()); } catch ( ImpossibleKinematics & e ) { return false; } Energy2 m22 = meMomenta()[2].mass2(); Energy2 m32 = meMomenta()[3].mass2(); Energy2 e0e2 = 2.0*e*sqrt(sqr(q) + m22); Energy2 e1e2 = 2.0*e*sqrt(sqr(q) + m22); Energy2 e0e3 = 2.0*e*sqrt(sqr(q) + m32); Energy2 e1e3 = 2.0*e*sqrt(sqr(q) + m32); Energy2 pq = 2.0*e*q; double ctmin = -1.0,ctmax = 1.0; Energy2 thmin = lastCuts().minTij(mePartonData()[0], mePartonData()[2]); if ( thmin > ZERO ) ctmax = min(ctmax, (e0e2 - m22 - thmin)/pq); thmin = lastCuts().minTij(mePartonData()[1], mePartonData()[2]); if ( thmin > ZERO ) ctmin = max(ctmin, (thmin + m22 - e1e2)/pq); thmin = lastCuts().minTij(mePartonData()[1], mePartonData()[3]); if ( thmin > ZERO ) ctmax = min(ctmax, (e1e3 - m32 - thmin)/pq); thmin = lastCuts().minTij(mePartonData()[0], mePartonData()[3]); if ( thmin > ZERO ) ctmin = max(ctmin, (thmin + m32 - e0e3)/pq); if ( ptmin > ZERO ) { double ctm = 1.0 - sqr(ptmin/q); if ( ctm <= 0.0 ) return false; ctmin = max(ctmin, -sqrt(ctm)); ctmax = min(ctmax, sqrt(ctm)); } if ( ctmin >= ctmax ) return false; double cth = getCosTheta(ctmin, ctmax, r); Energy pt = q*sqrt(1.0-sqr(cth)); phi(rnd(2.0*Constants::pi)); meMomenta()[2].setX(pt*sin(phi())); meMomenta()[2].setY(pt*cos(phi())); meMomenta()[2].setZ(q*cth); meMomenta()[3].setX(-pt*sin(phi())); meMomenta()[3].setY(-pt*cos(phi())); meMomenta()[3].setZ(-q*cth); meMomenta()[2].rescaleEnergy(); meMomenta()[3].rescaleEnergy(); vector out(2); out[0] = meMomenta()[2]; out[1] = meMomenta()[3]; tcPDVector tout(2); tout[0] = mePartonData()[2]; tout[1] = mePartonData()[3]; if ( !lastCuts().passCuts(tout, out, mePartonData()[0], mePartonData()[1]) ) return false; tHat(pq*cth + m22 - e0e2); uHat(m22 + m32 - sHat() - tHat()); // main piece jacobian((pq/sHat())*Constants::pi*jacobian()); // mass piece jacobian((rhomax-rhomin)*jacobian()); return true; } void MEPP2HiggsJet::getDiagrams() const { tcPDPtr h0=getParticleData(ParticleID::h0); tcPDPtr g =getParticleData(ParticleID::g); tcPDPtr q[6],qb[6]; for(int ix=0;ix H g if(_process==0||_process==1) {for(unsigned int ix=0;ix<_maxflavour;++ix) {add(new_ptr((Tree2toNDiagram(2), q[ix], qb[ix], 1, g , 3, h0, 3, g, -1)));}} // q g -> H g if(_process==0||_process==2) {for(unsigned int ix=0;ix<_maxflavour;++ix) {add(new_ptr((Tree2toNDiagram(3), q[ix], g, g, 2, h0, 1, q[ix], -2)));}} // qbar g -> H qbar if(_process==0||_process==3) {for(unsigned int ix=0;ix<_maxflavour;++ix) {add(new_ptr((Tree2toNDiagram(3), qb[ix], g, g, 2, h0, 1, qb[ix], -3)));}} // g g -> H g if(_process==0||_process==4) { // t channel add(new_ptr((Tree2toNDiagram(3), g, g, g, 1, h0, 2, g, -4))); // u channel add(new_ptr((Tree2toNDiagram(3), g, g, g, 2, h0, 1, g, -5))); // s channel add(new_ptr((Tree2toNDiagram(2), g, g, 1, g , 3, h0, 3, g, -6))); } } Energy2 MEPP2HiggsJet::scale() const { return meMomenta()[2].perp2()+ meMomenta()[2].m2(); } double MEPP2HiggsJet::me2() const { useMe(); double output(0.); // g g to H g if(mePartonData()[0]->id()==ParticleID::g&&mePartonData()[1]->id()==ParticleID::g) { // order of the particles unsigned int ih(2),ig(3); if(mePartonData()[3]->id()==ParticleID::h0){ig=2;ih=3;} VectorWaveFunction glin1(meMomenta()[ 0],mePartonData()[ 0],incoming); VectorWaveFunction glin2(meMomenta()[ 1],mePartonData()[ 1],incoming); ScalarWaveFunction hout(meMomenta()[ih],mePartonData()[ih],outgoing); VectorWaveFunction glout(meMomenta()[ig],mePartonData()[ig],outgoing); vector g1,g2,g4; for(unsigned int ix=0;ix<2;++ix) { glin1.reset(2*ix);g1.push_back(glin1); glin2.reset(2*ix);g2.push_back(glin2); glout.reset(2*ix);g4.push_back(glout); } // calculate the matrix element output = ggME(g1,g2,hout,g4,false); } // qg -> H q else if(mePartonData()[0]->id()>0&&mePartonData()[1]->id()==ParticleID::g) { // order of the particles unsigned int iq(0),iqb(3),ih(2),ig(1); if(mePartonData()[0]->id()==ParticleID::g){iq=1;ig=0;} if(mePartonData()[3]->id()==ParticleID::h0){iqb=2;ih=3;} // calculate the spinors and polarization vectors vector fin; vector fout; vector gin; SpinorWaveFunction qin (meMomenta()[iq ],mePartonData()[iq ],incoming); VectorWaveFunction glin(meMomenta()[ig ],mePartonData()[ig ],incoming); ScalarWaveFunction hout(meMomenta()[ih ],mePartonData()[ih ],outgoing); SpinorBarWaveFunction qout(meMomenta()[iqb],mePartonData()[iqb],outgoing); for(unsigned int ix=0;ix<2;++ix) { qin.reset(ix) ; fin.push_back( qin); qout.reset(ix) ;fout.push_back(qout); glin.reset(2*ix); gin.push_back(glin); } // calculate the matrix element output = qgME(fin,gin,hout,fout,false); } // qbar g -> H q else if(mePartonData()[0]->id()<0&&mePartonData()[1]->id()==ParticleID::g) { // order of the particles unsigned int iq(0),iqb(3),ih(2),ig(1); if(mePartonData()[0]->id()==ParticleID::g){iq=1;ig=0;} if(mePartonData()[3]->id()==ParticleID::h0){iqb=2;ih=3;} // calculate the spinors and polarization vectors vector fin; vector fout; vector gin; SpinorBarWaveFunction qin (meMomenta()[iq ],mePartonData()[iq ],incoming); VectorWaveFunction glin(meMomenta()[ig ],mePartonData()[ig ],incoming); ScalarWaveFunction hout(meMomenta()[ih ],mePartonData()[ih ],outgoing); SpinorWaveFunction qout(meMomenta()[iqb],mePartonData()[iqb],outgoing); for(unsigned int ix=0;ix<2;++ix) { qin.reset(ix) ; fin.push_back( qin); qout.reset(ix) ;fout.push_back(qout); glin.reset(2*ix); gin.push_back(glin); } // calculate the matrix element output = qbargME(fin,gin,hout,fout,false); } // q qbar to H g else if(mePartonData()[0]->id()==-mePartonData()[1]->id()) { // order of the particles unsigned int iq(0),iqb(1),ih(2),ig(3); if(mePartonData()[0]->id()<0){iq=1;iqb=0;} if(mePartonData()[2]->id()==ParticleID::g){ig=2;ih=3;} // calculate the spinors and polarization vectors vector fin; vector ain; vector gout; SpinorWaveFunction qin (meMomenta()[iq ],mePartonData()[iq ],incoming); SpinorBarWaveFunction qbin(meMomenta()[iqb],mePartonData()[iqb],incoming); ScalarWaveFunction hout(meMomenta()[ih ],mePartonData()[ih ],outgoing); VectorWaveFunction glout(meMomenta()[ig ],mePartonData()[ig ],outgoing); for(unsigned int ix=0;ix<2;++ix) { qin.reset(ix) ; fin.push_back( qin); qbin.reset(ix) ; ain.push_back( qbin); glout.reset(2*ix);gout.push_back(glout); } // calculate the matrix element output = qqbarME(fin,ain,hout,gout,false); } else throw Exception() << "Unknown subprocess in MEPP2HiggsJet::me2()" << Exception::runerror; // return the answer return output; } double MEPP2HiggsJet::qqbarME(vector & fin, vector & ain, ScalarWaveFunction & hout, vector & gout, bool calc) const { // the particles should be in the order // for the incoming // 0 incoming fermion (u spinor) // 1 incoming antifermion (vbar spinor) // for the outgoing // 0 outgoing higgs // 1 outgoing gluon // me to be returned ProductionMatrixElement newme(PDT::Spin1Half,PDT::Spin1Half, PDT::Spin0,PDT::Spin1); // get the kinematic invariants Energy2 s(sHat()),u(uHat()),t(tHat()),mh2(hout.m2()),et(scale()); // calculate the loop function complex A5 = Energy2(); for ( int ix=_minloop; ix<=_maxloop; ++ix ) { // full mass dependance if(_massopt==0) { Energy2 mf2=sqr(getParticleData(ix)->mass()); A5+= mf2*(4.+4.*double(s/(u+t))*(W1(s,mf2)-W1(mh2,mf2)) +(1.-4.*double(mf2/(u+t)))*(W2(s,mf2)-W2(mh2,mf2))); } // infinite mass limit else { A5+=2.*(s-mh2)/3.; } } // multiply by the rest of the form factors using Constants::pi; double g(sqrt(4.*pi*SM().alphaEM(mh2)/SM().sin2ThetaW())); double gs(sqrt(4.*pi*SM().alphaS(et))); Energy mw(getParticleData(ParticleID::Wplus)->mass()); complex A5c = A5 * Complex(0.,1.)*g*sqr(gs)*gs/(32.*s*sqr(pi)*mw); // compute the matrix element LorentzPolarizationVectorE fcurrent; complex fdotp; complex epsdot[2]; Complex diag; Lorentz5Momentum ps(fin[0].momentum()+ain[0].momentum()); ps.rescaleMass(); for(unsigned int ix=0;ix<2;++ix){epsdot[ix]=gout[ix].wave().dot(ps);} Energy2 denom(-ps*gout[0].momentum()); LorentzSpinorBar atemp; double output(0.); for(unsigned int ihel1=0;ihel1<2;++ihel1) { for(unsigned int ihel2=0;ihel2<2;++ihel2) { // compute the fermion current atemp=ain[ihel2].wave(); fcurrent=UnitRemoval::E*fin[ihel1].wave().vectorCurrent(atemp); fdotp = -(fcurrent.dot(gout[0].momentum())); for(unsigned int ghel=0;ghel<2;++ghel) { // calculate the matrix element - diag=A5c*(fcurrent.dot(gout[ghel].wave()) - -fdotp*epsdot[ghel]/denom); + diag = Complex(A5c*(fcurrent.dot(gout[ghel].wave()) + -fdotp*epsdot[ghel]/denom)); // calculate the matrix element output+=real(diag*conj(diag)); if(calc) newme(ihel1,ihel2,0,2*ghel)=diag; } } } // test with glover form // final colour/spin factors if(calc) _me.reset(newme); return output/9.; } double MEPP2HiggsJet::qgME(vector & fin, vector & gin, ScalarWaveFunction & hout, vector & fout,bool calc) const { // the particles should be in the order // for the incoming // 0 incoming fermion (u spinor) // 1 incoming gluon // for the outgoing // 0 outgoing higgs // 1 outgoing fermion (ubar spinor) // me to be returned ProductionMatrixElement newme(PDT::Spin1Half,PDT::Spin1, PDT::Spin0,PDT::Spin1Half); // get the kinematic invariants Energy2 s(sHat()),u(uHat()),t(tHat()),mh2(hout.m2()),et(scale()); // calculate the loop function complex A5 = Energy2(); for(int ix=_minloop;ix<=_maxloop;++ix) { if(_massopt==0) { Energy2 mf2=sqr(getParticleData(ix)->mass()); A5+= mf2*(4.+4.*double(u/(s+t))*(W1(u,mf2)-W1(mh2,mf2)) +(1.-4.*double(mf2/(s+t)))*(W2(u,mf2)-W2(mh2,mf2))); } else { A5+=2.*(u-mh2)/3.; } } // multiply by the rest of the form factors using Constants::pi; double g(sqrt(4.*pi*SM().alphaEM(mh2)/SM().sin2ThetaW())); double gs(sqrt(4.*pi*SM().alphaS(et))); Energy mw(getParticleData(ParticleID::Wplus)->mass()); complex A5c =A5*Complex(0.,1.)*g*sqr(gs)*gs/(32.*u*sqr(pi)*mw); // compute the matrix element LorentzPolarizationVectorE fcurrent; complex fdotp; complex epsdot[2]; Complex diag; Lorentz5Momentum pu(fin[0].momentum()+fout[0].momentum()); pu.rescaleMass(); for(unsigned int ix=0;ix<2;++ix){epsdot[ix]=gin[ix].wave().dot(pu);} Energy2 denom(pu*gin[0].momentum()); LorentzSpinorBar atemp; double output(0.); for(unsigned int ihel=0;ihel<2;++ihel) { for(unsigned int ohel=0;ohel<2;++ohel) { // compute the fermion current atemp=fout[ohel].wave(); fcurrent=UnitRemoval::E*fin[ihel].wave().vectorCurrent(atemp); fdotp=fcurrent.dot(gin[0].momentum()); for(unsigned int ghel=0;ghel<2;++ghel) { // calculate the matrix element - diag=A5c*(fcurrent.dot(gin[ghel].wave())-fdotp*epsdot[ghel]/denom); + diag = Complex(A5c*(fcurrent.dot(gin[ghel].wave())-fdotp*epsdot[ghel]/denom)); // calculate the matrix element output+=real(diag*conj(diag)); if(calc) newme(ihel,2*ghel,0,ohel)=diag; } } } // final colour/spin factors if(calc) _me.reset(newme); return output/24.; } double MEPP2HiggsJet::qbargME(vector & fin, vector & gin, ScalarWaveFunction & hout, vector & fout,bool calc) const { // the particles should be in the order // for the incoming // 0 incoming antifermion (vbar spinor) // 1 incoming gluon // for the outgoing // 0 outgoing higgs // 1 outgoing antifermion (v spinor) // me to be returned ProductionMatrixElement newme(PDT::Spin1Half,PDT::Spin1, PDT::Spin0,PDT::Spin1Half); // get the kinematic invariants Energy2 s(sHat()),u(uHat()),t(tHat()),mh2(hout.m2()),et(scale()); // calculate the loop function complex A5 = Energy2(); for(int ix=_minloop;ix<=_maxloop;++ix) { if(_massopt==0) { Energy2 mf2=sqr(getParticleData(ix)->mass()); A5+= mf2*(4.+4.*double(u/(s+t))*(W1(u,mf2)-W1(mh2,mf2)) +(1.-4.*double(mf2/(s+t)))*(W2(u,mf2)-W2(mh2,mf2))); } else { A5+=2.*(u-mh2)/3.; } } // multiply by the rest of the form factors using Constants::pi; double g(sqrt(4.*pi*SM().alphaEM(mh2)/SM().sin2ThetaW())); double gs(sqrt(4.*pi*SM().alphaS(et))); Energy mw(getParticleData(ParticleID::Wplus)->mass()); complex A5c = A5*Complex(0.,1.)*g*sqr(gs)*gs/(32.*u*sqr(pi)*mw); // compute the matrix element LorentzPolarizationVectorE fcurrent; complex fdotp; complex epsdot[2]; Complex diag; Lorentz5Momentum pu(fin[0].momentum()+fout[0].momentum()); pu.rescaleMass(); for(unsigned int ix=0;ix<2;++ix){epsdot[ix]=gin[ix].wave().dot(pu);} Energy2 denom(pu*gin[0].momentum()); LorentzSpinorBar atemp; double output(0.); for(unsigned int ihel=0;ihel<2;++ihel) { for(unsigned int ohel=0;ohel<2;++ohel) { // compute the fermion current atemp=fin[ihel].wave(); fcurrent=UnitRemoval::E*fout[ohel].wave().vectorCurrent(atemp); fdotp=fcurrent.dot(gin[0].momentum()); for(unsigned int ghel=0;ghel<2;++ghel) { // calculate the matrix element - diag=A5c*(fcurrent.dot(gin[ghel].wave())-fdotp*epsdot[ghel]/denom); + diag = Complex(A5c*(fcurrent.dot(gin[ghel].wave())-fdotp*epsdot[ghel]/denom)); // calculate the matrix element output+=real(diag*conj(diag)); if(calc) newme(ihel,2*ghel,0,ohel)=diag; } } } // final colour/spin factors if(calc) _me.reset(newme); return output/24.; } Selector MEPP2HiggsJet::diagrams(const DiagramVector & diags) const { Selector sel; for ( DiagramIndex i = 0; i < diags.size(); ++i ) { if(abs(diags[i]->id())<4) sel.insert(1.0, i); else sel.insert(_diagwgt[abs(diags[i]->id())-4], i); } return sel; } Selector MEPP2HiggsJet::colourGeometries(tcDiagPtr diag) const { // colour lines for q qbar -> h0 g static const ColourLines cqqbar("1 3 5,-2 -3 -5"); // colour lines for q g -> h0 q static const ColourLines cqg("1 2 -3, 3 -2 5"); // colour lines for qbar q -> h0 qbar static const ColourLines cqbarg("-1 -2 3, -3 2 -5"); // colour lines for g g -> h0 g static const ColourLines cgg[6]={ColourLines("1 2 5, -3 -5, 3 -2 -1"), ColourLines("-1 -2 -5, 3 5, -3 2 1"), ColourLines("1 5, -1 -2 3, -3 2 -5"), ColourLines("-1 -5, 1 2 -3, 3 -2 5"), ColourLines("1 3 5, -5 -3 -2, 2 -1"), ColourLines("-1 -3 -5, 5 3 2 ,-2 1")}; // select the colour flow Selector sel; if ( diag->id() == -1) sel.insert(1.0, &cqqbar); else if ( diag->id() == -2) sel.insert(1.0, &cqg); else if ( diag->id() == -3) sel.insert(1.0, &cqbarg); else { sel.insert(0.5, &cgg[2*(abs(diag->id())-4) ]); sel.insert(0.5, &cgg[2*(abs(diag->id())-4)+1]); } // return the answer return sel; } double MEPP2HiggsJet::ggME(vector g1, vector g2, ScalarWaveFunction & hout, vector g4, bool calc) const { // the particles should be in the order // for the incoming // 0 first incoming gluon // 1 second incoming gluon // for the outgoing // 0 outgoing higgs // 1 outgoing gluon // me to be returned ProductionMatrixElement newme(PDT::Spin1,PDT::Spin1, PDT::Spin0,PDT::Spin1); // get the kinematic invariants Energy2 s(sHat()),u(uHat()),t(tHat()),mh2(hout.m2()),et(scale()); // calculate the loop functions Complex A4stu(0.),A2stu(0.),A2tsu(0.),A2ust(0.); Complex A5s(0.),A5t(0.),A5u(0.); for(int ix=_minloop;ix<=_maxloop;++ix) { Energy2 mf2=sqr(getParticleData(ix)->mass()); // loop functions if(_massopt==0) { A4stu+=A4(s,t,u,mf2); A2stu+=A2(s,t,u,mf2); A2tsu+=A2(u,s,t,mf2); A2ust+=A2(t,s,u,mf2); - A5s+= mf2/s*(4.+4.*double(s/(u+t))*(W1(s,mf2)-W1(mh2,mf2)) - +(1.-4.*double(mf2/(u+t)))*(W2(s,mf2)-W2(mh2,mf2))); - A5t+= mf2/t*(4.+4.*double(t/(s+u))*(W1(t,mf2)-W1(mh2,mf2)) - +(1.-4.*double(mf2/(s+u)))*(W2(t,mf2)-W2(mh2,mf2))); - A5u+= mf2/u*(4.+4.*double(u/(s+t))*(W1(u,mf2)-W1(mh2,mf2)) - +(1.-4.*double(mf2/(s+t)))*(W2(u,mf2)-W2(mh2,mf2))); + A5s+= double(mf2/s)*(4.+4.*double(s/(u+t))*(W1(s,mf2)-W1(mh2,mf2)) + +(1.-4.*double(mf2/(u+t)))*(W2(s,mf2)-W2(mh2,mf2))); + A5t+= double(mf2/t)*(4.+4.*double(t/(s+u))*(W1(t,mf2)-W1(mh2,mf2)) + +(1.-4.*double(mf2/(s+u)))*(W2(t,mf2)-W2(mh2,mf2))); + A5u+= double(mf2/u)*(4.+4.*double(u/(s+t))*(W1(u,mf2)-W1(mh2,mf2)) + +(1.-4.*double(mf2/(s+t)))*(W2(u,mf2)-W2(mh2,mf2))); } else { A4stu=-1./3.; A2stu=-sqr(s/mh2)/3.; A2tsu=-sqr(t/mh2)/3.; A2ust=-sqr(u/mh2)/3.; A5s+=2.*(s-mh2)/3./s; A5t+=2.*(t-mh2)/3./t; A5u+=2.*(u-mh2)/3./u; } } Complex A3stu=0.5*(A2stu+A2ust+A2tsu-A4stu); // compute the dot products for the matrix element complex eps[3][4][2]; Energy2 pdot[4][4]; pdot[0][0]=ZERO; pdot[0][1]= g1[0].momentum()*g2[0].momentum(); pdot[0][2]=-1.*g1[0].momentum()*g4[0].momentum(); pdot[0][3]=-1.*g1[0].momentum()*hout.momentum(); pdot[1][0]= pdot[0][1]; pdot[1][1]= ZERO; pdot[1][2]=-1.*g2[0].momentum()*g4[0].momentum(); pdot[1][3]=-1.*g2[0].momentum()*hout.momentum(); pdot[2][0]= pdot[0][2]; pdot[2][1]= pdot[1][2]; pdot[2][2]= ZERO; pdot[2][3]= g4[0].momentum()*hout.momentum(); pdot[3][0]=pdot[0][3]; pdot[3][1]=pdot[1][3]; pdot[3][2]=pdot[2][3]; pdot[3][3]=mh2; for(unsigned int ix=0;ix<2;++ix) { eps[0][0][ix]=InvEnergy(); eps[0][1][ix]=g1[ix].wave().dot(g2[0].momentum())/pdot[0][1]; eps[0][2][ix]=-1.*g1[ix].wave().dot(g4[0].momentum())/pdot[0][2]; eps[0][3][ix]=-1.*g1[ix].wave().dot(hout.momentum())/ pdot[0][3]; eps[1][0][ix]=g2[ix].wave().dot(g1[0].momentum())/ pdot[1][0]; eps[1][1][ix]=InvEnergy(); eps[1][2][ix]=-1.*g2[ix].wave().dot(g4[0].momentum())/pdot[1][2]; eps[1][3][ix]=-1.*g2[ix].wave().dot(hout.momentum())/ pdot[1][3]; eps[2][0][ix]=g4[ix].wave().dot(g1[0].momentum())/ pdot[2][0]; eps[2][1][ix]=g4[ix].wave().dot(g2[0].momentum())/ pdot[2][1]; eps[2][2][ix]=InvEnergy(); eps[2][3][ix]=-1.*g4[ix].wave().dot(hout.momentum())/ pdot[2][3]; } // prefactors using Constants::pi; double g(sqrt(4.*pi*SM().alphaEM(mh2)/SM().sin2ThetaW())); double gs(sqrt(4.*pi*SM().alphaS(et))); Energy mw(getParticleData(ParticleID::Wplus)->mass()); Energy3 pre=g*sqr(mh2)*gs*sqr(gs)/(32.*sqr(pi)*mw); // compute the matrix element double output(0.); Complex diag[4],wdot[3][3]; _diagwgt[0]=0.; _diagwgt[1]=0.; _diagwgt[2]=0.; for(unsigned int ihel1=0;ihel1<2;++ihel1) { for(unsigned int ihel2=0;ihel2<2;++ihel2) { for(unsigned int ohel=0;ohel<2;++ohel) { wdot[0][1]=g1[ihel1].wave().dot(g2[ihel2].wave()); wdot[0][2]=g1[ihel1].wave().dot(g4[ohel ].wave()); wdot[1][0]=wdot[0][1]; wdot[1][2]=g2[ihel2].wave().dot(g4[ohel ].wave()); wdot[2][0]=wdot[0][2]; wdot[2][1]=wdot[1][2]; // last piece - diag[3]=pre*A3stu*(eps[0][2][ihel1]*eps[1][0][ihel2]*eps[2][1][ohel]- - eps[0][1][ihel1]*eps[1][2][ihel2]*eps[2][0][ohel]+ - (eps[2][0][ohel ]-eps[2][1][ohel ])*wdot[0][1]/pdot[0][1]+ - (eps[1][2][ihel2]-eps[1][0][ihel2])*wdot[0][2]/pdot[0][2]+ - (eps[0][1][ihel1]-eps[0][2][ihel1])*wdot[1][2]/pdot[1][2]); + diag[3]= Complex(pre*A3stu*(eps[0][2][ihel1]*eps[1][0][ihel2]*eps[2][1][ohel]- + eps[0][1][ihel1]*eps[1][2][ihel2]*eps[2][0][ohel]+ + (eps[2][0][ohel ]-eps[2][1][ohel ])*wdot[0][1]/pdot[0][1]+ + (eps[1][2][ihel2]-eps[1][0][ihel2])*wdot[0][2]/pdot[0][2]+ + (eps[0][1][ihel1]-eps[0][2][ihel1])*wdot[1][2]/pdot[1][2])); // first piece - diag[3]+=pre*( - +A2stu*(eps[0][1][ihel1]*eps[1][0][ihel2]-wdot[0][1]/pdot[0][1])* - (eps[2][0][ohel ]-eps[2][1][ohel ]) - +A2ust*(eps[0][2][ihel1]*eps[2][0][ohel ]-wdot[0][2]/pdot[0][2])* - (eps[1][2][ihel2]-eps[1][0][ihel2]) - +A2tsu*(eps[1][2][ihel2]*eps[2][1][ohel ]-wdot[1][2]/pdot[1][2])* - (eps[0][1][ihel1]-eps[0][2][ihel1]) - ); + diag[3] += Complex(pre*(+A2stu*(eps[0][1][ihel1]*eps[1][0][ihel2]-wdot[0][1]/pdot[0][1])* + (eps[2][0][ohel ]-eps[2][1][ohel ]) + +A2ust*(eps[0][2][ihel1]*eps[2][0][ohel ]-wdot[0][2]/pdot[0][2])* + (eps[1][2][ihel2]-eps[1][0][ihel2]) + +A2tsu*(eps[1][2][ihel2]*eps[2][1][ohel ]-wdot[1][2]/pdot[1][2])* + (eps[0][1][ihel1]-eps[0][2][ihel1]) + )); output+=real(diag[3]*conj(diag[3])); // matrix element if needed if(calc) newme(2*ihel1,2*ihel2,0,2*ohel)=diag[3]; // different diagrams - diag[0] = A5t*UnitRemoval::InvE*(-eps[0][3][ihel1]* - (-2.*eps[2][1][ohel ]*eps[1][0][ihel2]*pdot[2][1]*pdot[1][0] - -2.*eps[1][2][ihel2]*eps[2][0][ohel ]*pdot[1][2]*pdot[2][0] - +wdot[1][2]*(pdot[0][1]+pdot[0][2])) - -2.*eps[2][1][ohel ]*pdot[2][1]*wdot[0][1] - -2.*eps[1][2][ihel2]*pdot[1][2]*wdot[0][2] - +wdot[1][2]*(eps[0][1][ihel1]*pdot[0][1]+ - eps[0][2][ihel1]*pdot[0][2])); - diag[1] = A5u*UnitRemoval::InvE*(-eps[1][3][ihel2]* - (+2.*eps[0][1][ihel1]*eps[2][0][ohel ]*pdot[0][1]*pdot[2][0] - +2.*eps[0][2][ihel1]*eps[2][1][ohel ]*pdot[0][2]*pdot[2][1] - -wdot[0][2]*(pdot[1][0]+pdot[1][2])) - +2.*eps[2][0][ohel ]*pdot[2][0]*wdot[0][1] - +2.*eps[0][2][ihel1]*pdot[0][2]*wdot[2][1] - -wdot[0][2]*(eps[1][0][ihel2]*pdot[1][0]+ - eps[1][2][ihel2]*pdot[1][2])); - diag[2] = A5s*UnitRemoval::InvE*(-eps[2][3][ohel ]* - (+2.*eps[0][1][ihel1]*eps[1][2][ihel2]*pdot[0][1]*pdot[1][2] - -2.*eps[1][0][ihel2]*eps[0][2][ihel1]*pdot[1][0]*pdot[1][3] - +wdot[0][1]*(pdot[2][0]-pdot[2][1])) - +2.*eps[0][1][ihel1]*pdot[0][1]*wdot[1][2] - -2.*eps[1][0][ihel2]*pdot[1][0]*wdot[0][2] - +wdot[0][1]*(eps[2][0][ohel]*pdot[2][0]- - eps[2][1][ohel]*pdot[2][1])); + diag[0] = Complex(A5t*UnitRemoval::InvE*(-eps[0][3][ihel1]* + (-2.*eps[2][1][ohel ]*eps[1][0][ihel2]*pdot[2][1]*pdot[1][0] + -2.*eps[1][2][ihel2]*eps[2][0][ohel ]*pdot[1][2]*pdot[2][0] + +wdot[1][2]*(pdot[0][1]+pdot[0][2])) + -2.*eps[2][1][ohel ]*pdot[2][1]*wdot[0][1] + -2.*eps[1][2][ihel2]*pdot[1][2]*wdot[0][2] + +wdot[1][2]*(eps[0][1][ihel1]*pdot[0][1]+ + eps[0][2][ihel1]*pdot[0][2]))); + diag[1] = Complex(A5u*UnitRemoval::InvE*(-eps[1][3][ihel2]* + (+2.*eps[0][1][ihel1]*eps[2][0][ohel ]*pdot[0][1]*pdot[2][0] + +2.*eps[0][2][ihel1]*eps[2][1][ohel ]*pdot[0][2]*pdot[2][1] + -wdot[0][2]*(pdot[1][0]+pdot[1][2])) + +2.*eps[2][0][ohel ]*pdot[2][0]*wdot[0][1] + +2.*eps[0][2][ihel1]*pdot[0][2]*wdot[2][1] + -wdot[0][2]*(eps[1][0][ihel2]*pdot[1][0]+ + eps[1][2][ihel2]*pdot[1][2]))); + diag[2] = Complex(A5s*UnitRemoval::InvE*(-eps[2][3][ohel ]* + (+2.*eps[0][1][ihel1]*eps[1][2][ihel2]*pdot[0][1]*pdot[1][2] + -2.*eps[1][0][ihel2]*eps[0][2][ihel1]*pdot[1][0]*pdot[1][3] + +wdot[0][1]*(pdot[2][0]-pdot[2][1])) + +2.*eps[0][1][ihel1]*pdot[0][1]*wdot[1][2] + -2.*eps[1][0][ihel2]*pdot[1][0]*wdot[0][2] + +wdot[0][1]*(eps[2][0][ohel]*pdot[2][0]- + eps[2][1][ohel]*pdot[2][1]))); _diagwgt[0]+=real(diag[0]*conj(diag[0])); _diagwgt[1]+=real(diag[1]*conj(diag[1])); _diagwgt[2]+=real(diag[2]*conj(diag[2])); } } } // final colour and spin factors if(calc){_me.reset(newme);} return 3.*output/32.; } void MEPP2HiggsJet::constructVertex(tSubProPtr sub) { // extract the particles in the hard process ParticleVector hard; hard.push_back(sub->incoming().first);hard.push_back(sub->incoming().second); hard.push_back(sub->outgoing()[0]);hard.push_back(sub->outgoing()[1]); // ensure correct order or particles if((hard[0]->id()==ParticleID::g&&hard[1]->id()!=ParticleID::g)|| (hard[0]->id()<0&&hard[1]->id()<6)) swap(hard[0],hard[1]); if(hard[2]->id()!=ParticleID::h0) swap(hard[2],hard[3]); // different processes // g g to H g if(hard[0]->id()==ParticleID::g) { vector g1,g2,g4; VectorWaveFunction(g1,hard[0],incoming,false,true,true); VectorWaveFunction(g2,hard[1],incoming,false,true,true); VectorWaveFunction(g4,hard[3],outgoing,true ,true,true); ScalarWaveFunction hout(hard[2],outgoing,true); g1[1]=g1[2];g2[1]=g2[2];g4[1]=g4[2]; ggME(g1,g2,hout,g4,true); } // qg -> H q else if(hard[0]->id()>0&&hard[1]->id()==ParticleID::g) { vector g2; vector qin; vector qout; SpinorWaveFunction( qin,hard[0],incoming,false,true); VectorWaveFunction( g2,hard[1],incoming,false,true,true); SpinorBarWaveFunction(qout,hard[3],outgoing,true ,true); ScalarWaveFunction hout(hard[2],outgoing,true); g2[1]=g2[2]; qgME(qin,g2,hout,qout,true); } // qbar g -> H q else if(hard[0]->id()<0&&hard[1]->id()==ParticleID::g) { vector g2; vector qin; vector qout; SpinorBarWaveFunction( qin,hard[0],incoming,false,true); VectorWaveFunction( g2,hard[1],incoming,false,true,true); SpinorWaveFunction( qout,hard[3],outgoing,true ,true); ScalarWaveFunction hout(hard[2],outgoing,true); g2[1]=g2[2]; qbargME(qin,g2,hout,qout,true); } // q qbar to H g else if(hard[0]->id()==-hard[1]->id()) { vector qbar; vector q; vector g4; SpinorWaveFunction( q ,hard[0],incoming,false,true); SpinorBarWaveFunction(qbar,hard[1],incoming,false,true); VectorWaveFunction( g4,hard[3],outgoing,true ,true,true); ScalarWaveFunction hout(hard[2],outgoing,true); g4[1]=g4[2]; qqbarME(q,qbar,hout,g4,true); } else throw Exception() << "Unknown subprocess in MEPP2HiggsJet::constructVertex()" << Exception::runerror; // construct the vertex HardVertexPtr hardvertex=new_ptr(HardVertex()); // set the matrix element for the vertex hardvertex->ME(_me); // set the pointers and to and from the vertex for(unsigned int ix=0;ix<4;++ix) { (hard[ix]->spinInfo())-> productionVertex(hardvertex); } } int MEPP2HiggsJet::nDim() const { return 2; } void MEPP2HiggsJet::doinit() { ME2to2Base::doinit(); tcPDPtr h0=getParticleData(ParticleID::h0); _mh = h0->mass(); _wh = h0->generateWidth(_mh); if(h0->massGenerator()) { _hmass=dynamic_ptr_cast(h0->massGenerator()); } if(_shapeopt==2&&!_hmass) throw InitException() << "If using the mass generator for the line shape in MEPP2HiggsJet::doinit()" << "the mass generator must be an instance of the GenericMassGenerator class" << Exception::runerror; } CrossSection MEPP2HiggsJet::dSigHatDR() const { using Constants::pi; InvEnergy2 bwfact; Energy moff = mePartonData()[2]->id()==ParticleID::h0 ? meMomenta()[2].mass() : meMomenta()[3].mass(); if(_shapeopt==1) { tcPDPtr h0 = mePartonData()[2]->id()==ParticleID::h0 ? mePartonData()[2] : mePartonData()[3]; bwfact = h0->generateWidth(moff)*moff/pi/ (sqr(sqr(moff)-sqr(_mh))+sqr(_mh*_wh)); } else { bwfact = _hmass->BreitWignerWeight(moff); } return me2()*jacobian()/(16.0*sqr(Constants::pi)*sHat())*sqr(hbarc)* (sqr(sqr(moff)-sqr(_mh))+sqr(_mh*_wh))/(_mh*_wh)*bwfact; } diff --git a/Models/ADD/ADDModelFFWGRVertex.cc b/Models/ADD/ADDModelFFWGRVertex.cc --- a/Models/ADD/ADDModelFFWGRVertex.cc +++ b/Models/ADD/ADDModelFFWGRVertex.cc @@ -1,199 +1,199 @@ // -*- C++ -*- // // ADDModelFFWGRVertex.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the ADDModelFFWGRVertex class. // #include "ADDModelFFWGRVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Models/StandardModel/StandardCKM.h" using namespace Herwig; using namespace ThePEG; ADDModelFFWGRVertex::ADDModelFFWGRVertex() : charge_(17,0.), gl_(17,0.), gr_(17,0.), ckm_(3,vector(3,0.0)), couplast_(0.), q2last_(ZERO), kappa_(ZERO), r_(ZERO) { orderInGem(2); orderInGs (0); colourStructure(ColourStructure::DELTA); } void ADDModelFFWGRVertex::doinit() { for(int ix=1;ix<7;++ix) { addToList(-ix,ix,22,39); addToList(-ix,ix,23,39); } for(int ix=11;ix<17;++ix) { addToList(-ix,ix,22,39); addToList(-ix,ix,23,39); } // particles for outgoing W- // quarks for(int ix=1;ix<6;ix+=2) { for(int iy=2;iy<7;iy+=2) { addToList(-ix, iy, -24,39); } } // leptons for(int ix=11;ix<17;ix+=2) { addToList(-ix, ix+1, -24,39); } // particles for outgoing W+ // quarks for(int ix=2;ix<7;ix+=2) { for(int iy=1;iy<6;iy+=2) { addToList(-ix, iy, 24,39); } } // leptons for(int ix=11;ix<17;ix+=2) { addToList(-ix-1, ix, 24,39); } FFVTVertex::doinit(); tcHwADDPtr hwADD=dynamic_ptr_cast(generator()->standardModel()); if(!hwADD) throw Exception() << "Must have ADDModel in ADDModelFFWGRVertex::doinit()" << Exception::runerror; double sw2 = sin2ThetaW(); double fact = 0.25/sqrt(sw2*(1.-sw2)); for(int ix=1;ix<4;++ix) { charge_[2*ix-1] = hwADD->ed(); charge_[2*ix ] = hwADD->eu(); charge_[2*ix+9 ] = hwADD->ee(); charge_[2*ix+10] = hwADD->enu(); gl_[2*ix-1] = fact*(hwADD->vd() + hwADD->ad() ); gl_[2*ix ] = fact*(hwADD->vu() + hwADD->au() ); gl_[2*ix+9 ] = fact*(hwADD->ve() + hwADD->ae() ); gl_[2*ix+10] = fact*(hwADD->vnu() + hwADD->anu()); gr_[2*ix-1] = fact*(hwADD->vd() - hwADD->ad() ); gr_[2*ix ] = fact*(hwADD->vu() - hwADD->au() ); gr_[2*ix+9 ] = fact*(hwADD->ve() - hwADD->ae() ); gr_[2*ix+10] = fact*(hwADD->vnu() - hwADD->anu()); } kappa_=2./hwADD->MPlanckBar(); r_ = sqr(hwADD->LambdaT())/hwADD->MPlanckBar(); Ptr::transient_pointer CKM = generator()->standardModel()->CKM(); // cast the CKM object to the HERWIG one ThePEG::Ptr::transient_const_pointer hwCKM = ThePEG::dynamic_ptr_cast< ThePEG::Ptr:: transient_const_pointer>(CKM); if(hwCKM) { vector< vector > CKM; CKM = hwCKM->getUnsquaredMatrix(generator()->standardModel()->families()); for(unsigned int ix=0;ix<3;++ix) { for(unsigned int iy=0;iy<3;++iy) { ckm_[ix][iy]=CKM[ix][iy]; } } } else { throw Exception() << "Must have access to the Herwig::StandardCKM object" << "for the CKM matrix in SMFFWVertex::doinit()" << Exception::runerror; } } void ADDModelFFWGRVertex::persistentOutput(PersistentOStream & os) const { os << charge_ << gl_ << gr_ << ounit(kappa_,InvGeV) << ckm_ << ounit(r_,GeV); } void ADDModelFFWGRVertex::persistentInput(PersistentIStream & is, int) { is >> charge_ >> gl_ >> gr_ >> iunit(kappa_,InvGeV) >> ckm_ >> iunit(r_,GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigADDModelFFWGRVertex("Herwig::ADDModelFFWGRVertex", "HwADDModel.so"); void ADDModelFFWGRVertex::Init() { static ClassDocumentation documentation ("The ADDModelFFWGRVertexxs class is the implementation" " of the two fermion vector coupling for the ADD model."); } void ADDModelFFWGRVertex::setCoupling(Energy2 q2,tcPDPtr aa,tcPDPtr bb, tcPDPtr cc, tcPDPtr) { // work out the particles int iferm= abs(aa->id()); int ibos = abs(cc->id()); Complex coup; // overall factor assert( ibos >= 22 && ibos <= 24 ); if( q2last_ != q2 || couplast_ == 0. ) { couplast_ = electroMagneticCoupling(q2); q2last_ = q2; } // photon if(ibos==22) { // alpha - coup = UnitRemoval::E * kappa_ * couplast_; + coup = Complex(UnitRemoval::E * kappa_ * couplast_); // _charge of particle assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)); coup *= charge_[iferm]; left (1.); right(1.); } // Z boson else if(ibos==23) { - coup = UnitRemoval::E * kappa_ * couplast_; + coup = Complex(UnitRemoval::E * kappa_ * couplast_); // _charge of particle assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)); left (gl_[iferm]); right(gr_[iferm]); } else if(ibos==24) { coup = Complex(UnitRemoval::E * kappa_ * couplast_) * sqrt(0.5) / sqrt(sin2ThetaW()); // the left and right couplings int iferm=abs(aa->id()); int ianti=abs(bb->id()); // quarks if(iferm>=1 && iferm <=6) { int iu,id; // up type first if(iferm%2==0) { iu = iferm/2; id = (ianti+1)/2; } // down type first else { iu = ianti/2; id = (iferm+1)/2; } assert( iu>=1 && iu<=3 && id>=1 && id<=3); left(ckm_[iu-1][id-1]); right(0.); } // leptons else if(iferm>=11 && iferm <=16) { left(1.); right(0.); } else assert(false); } // set the coupling norm(coup); } Complex ADDModelFFWGRVertex::propagator(int iopt, Energy2 q2,tcPDPtr part, Energy mass, Energy width) { if(part->id()!=ParticleID::Graviton) return VertexBase::propagator(iopt,q2,part,mass,width); else return Complex(4.*Constants::pi*UnitRemoval::E2/sqr(r_)); } diff --git a/Models/LH/LHFFHVertex.cc b/Models/LH/LHFFHVertex.cc --- a/Models/LH/LHFFHVertex.cc +++ b/Models/LH/LHFFHVertex.cc @@ -1,289 +1,289 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the LHFFHVertex class. // #include "LHFFHVertex.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" using namespace Herwig; void LHFFHVertex::persistentOutput(PersistentOStream & os) const { os << ounit(_coup,1./GeV) << _model; } void LHFFHVertex::persistentInput(PersistentIStream & is, int) { is >> iunit(_coup,1./GeV) >> _model; } // Static variable needed for the type description system in ThePEG. DescribeClass describeHerwigLHFFHVertex("Herwig::LHFFHVertex", "HwLHModel.so"); void LHFFHVertex::Init() { static ClassDocumentation documentation ("The LHFFHVertex class implements the interaction of the fermions" " and the Higgs bosons in the Little Higgs model"); } LHFFHVertex::LHFFHVertex() : _q2last(0.*GeV2) { orderInGem(1); orderInGs(0); _masslast[0] = 0.*GeV; _masslast[1] = 0.*GeV; _idlast[0] = 0; _idlast[1] = 0; colourStructure(ColourStructure::DELTA); } void LHFFHVertex::doinit() { // SM like higgs for (int ix=1;ix<=6;++ix) { addToList( -ix, ix, 25); } addToList( -6, 8, 25); addToList( -8, 6, 25); addToList( -8, 8, 25); for(int ix=11;ix<16;ix+=2) { addToList( -ix, ix, 25); } // phi0 for (int ix=1;ix<=6;++ix) { addToList( -ix, ix, 35); } addToList( -6, 8, 35); addToList( -8, 6, 35); for(int ix=11;ix<16;ix+=2) { addToList( -ix, ix, 35); } // phiP for (int ix=1;ix<=6;++ix) { addToList( -ix, ix, 36); } addToList( -6, 8, 36); addToList( -8, 6, 36); for(int ix=11;ix<16;ix+=2) { addToList( -ix, ix, 36); } // phi +/- for(int ix=1;ix<6;ix+=2) { addToList( -ix-1, ix, 37); addToList( -ix , ix+1, -37); } addToList( -8 , 5, 37); addToList( -5 , 8, -37); for(int ix=11;ix<16;ix+=2) { addToList( -ix-1, ix, 37); addToList( -ix , ix+1, -37); } _model = dynamic_ptr_cast(generator()->standardModel()); if(!_model) throw InitException() << "Must be using the LHModel " << " in LHFFPVertex::doinit()" << Exception::runerror; _coup.resize(11); Energy v = _model->vev(); double s0 = _model->sinTheta0(); double sP = _model->sinThetaP(); double sPlus = _model->sinThetaPlus(); double s02 = sqr(s0); double vf = _model->vev()/_model->f(); double xL = sqr(_model->lambda1())/(sqr(_model->lambda1())+sqr(_model->lambda2())); double xR = sqr(_model->lambda1())/sqrt(sqr(_model->lambda1())+sqr(_model->lambda2())); Energy mT = getParticleData(8)->mass(); // lightest higgs couplings // coupling of light SM fermions _coup[0] = (1.-0.5*s02+vf*s0/sqrt(2.)-2./3.*sqr(vf))/v; // couplings to top quark _coup[1] = (1.-0.5*s02+vf*s0/sqrt(2.)-2./3.*sqr(vf)+sqr(vf)*xL*(1.+xL))/v; // couplings to the T quark _coup[2] =-xR*(1.+xL)*vf/mT; // couplings to tT _coup[3] = xR/mT; _coup[4] = vf/v*(1.+xL); // phi 0 // light particles _coup[5] = sqrt(0.5)/v*(vf-sqrt(2.)*s0); // mixed _coup[6] = sqrt(0.5)/v*(vf-sqrt(2.)*s0)*_model->lambda1()/_model->lambda2(); // phi P _coup[7] = Complex(0.,1.)*sqrt(0.5)/v*(vf-sqrt(2.)*sP); _coup[8] = Complex(0.,1.)*sqrt(0.5)/v*(vf-sqrt(2.)*sP)*_model->lambda1()/_model->lambda2(); // phi +/- _coup[9] = -sqrt(0.5)/v*(vf-2.*sPlus); _coup[9] = -sqrt(0.5)/v*(vf-2.*sPlus)*_model->lambda1()/_model->lambda2(); FFSVertex::doinit(); } void LHFFHVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) { int iferm=abs(a->id()); int ianti=abs(b->id()); // left and right couplings set to one left (1.); right(1.); // first the overall normalisation if(q2!=_q2last||_idlast[0]!=iferm||_idlast[1]!=ianti) { _q2last = q2; _idlast[0] = iferm; if(_idlast[0]==8) _idlast[0]=6; assert((_idlast[0]>=1 && _idlast[0]<=6 ) || (_idlast[0]>=11 && _idlast[0]<=16)); if(iferm==_idlast[0]) _masslast[0] = _model->mass(q2,a); else _masslast[0] = _model->mass(q2,getParticleData(ParticleID::t)); _idlast[1] = ianti; if(_idlast[1]==8) _idlast[1]=6; assert((_idlast[1]>=1 && _idlast[1]<=6 ) || (_idlast[1]>=11 && _idlast[1]<=16)); if(_idlast[0]!=_idlast[1]) { if(ianti==_idlast[1]) _masslast[1] = _model->mass(q2,a); else _masslast[1] = _model->mass(q2,getParticleData(ParticleID::t)); } else { _masslast[1] = _masslast[0]; } } // SM like higgs if(c->id()==ParticleID::h0) { if(iferm==ianti) { if((iferm>=1 && iferm<=5 ) || (iferm>=11 && iferm<=16)) { norm(-Complex(_coup[0]*_masslast[0])); } else if(iferm==6) { norm(-Complex(_coup[1]*_masslast[0])); } else if(iferm==8) { norm(-Complex(_coup[2]*a->mass())); } else assert(false); } else { assert( (iferm == 6 && ianti == 8 ) || (ianti == 6 && iferm == 8 )); Complex cleft,cright; if(iferm==6) { - cleft = -_coup[3]*b->mass(); - cright = -_coup[4]*_masslast[0]; + cleft = Complex(-_coup[3]*b->mass()); + cright = Complex(-_coup[4]*_masslast[0]); } else { - cleft = -_coup[3]*a->mass(); - cright = -_coup[4]*_masslast[0]; + cleft = Complex(-_coup[3]*a->mass()); + cright = Complex(-_coup[4]*_masslast[0]); } if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) { cright = conj(cleft); cleft = 0.; } left (cleft ); right(cright); norm(1.); } } else if(c->id()==ParticleID::H0) { if(iferm==ianti) { if((iferm>=1 && iferm<=6 ) || (iferm>=11 && iferm<=16)) { norm(-Complex(_coup[5]*_masslast[0])); } else assert(false); } else { assert( (iferm == 6 && ianti == 8 ) || (iferm == 8 && ianti == 6 ) ); Complex cleft = Complex(_coup[6]*_masslast[0]); Complex cright = 0.; if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) { cright = conj(cleft); cleft = 0.; } left (cleft ); right(cright); norm(1.); } } else if(c->id()==ParticleID::A0) { left(-1.); right(1.); if(iferm==ianti) { if((iferm>=1 && iferm<=6 ) || (iferm>=11 && iferm<=16)) { if(iferm%2==0) norm(-Complex( _coup[7]*_masslast[0])); else norm(-Complex(-_coup[7]*_masslast[0])); } else assert(false); } else { assert( (iferm == 6 && ianti == 8 ) || (iferm == 8 && ianti == 6 )); Complex cleft = Complex(_coup[8]*_masslast[0]); Complex cright = 0.; if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) { cright = conj(cleft); cleft = 0.; } left (cleft ); right(cright); norm(1.); } } else if(c->id()==ParticleID::Hplus) { norm(1.); Complex cleft(0.),cright(0.); if(iferm%2==0) { if(iferm==ParticleID::t) { - cleft = _masslast[0]*_coup[ 9]; + cleft = Complex(_masslast[0]*_coup[ 9]); } else { - cleft = _masslast[0]*_coup[10]; - cright = _masslast[1]*_coup[10]; + cleft = Complex(_masslast[0]*_coup[10]); + cright = Complex(_masslast[1]*_coup[10]); } } else { if(ianti==ParticleID::t) { - cleft = _masslast[1]*_coup[ 9]; + cleft = Complex(_masslast[1]*_coup[ 9]); } else { - cleft = _masslast[1]*_coup[10]; - cright = _masslast[0]*_coup[10]; + cleft = Complex(_masslast[1]*_coup[10]); + cright = Complex(_masslast[0]*_coup[10]); } } left ( cleft); right(cright); } else if(c->id()==ParticleID::Hminus) { norm(1.); Complex cleft(0.),cright(0.); if(iferm%2==0) { if(iferm==ParticleID::t) { - cright = _masslast[0]*_coup[ 9]; + cright = Complex(_masslast[0]*_coup[ 9]); } else { - cright = _masslast[0]*_coup[10]; - cleft = _masslast[1]*_coup[10]; + cright = Complex(_masslast[0]*_coup[10]); + cleft = Complex(_masslast[1]*_coup[10]); } } else { if(ianti==ParticleID::t) { - cright = _masslast[1]*_coup[ 9]; + cright = Complex(_masslast[1]*_coup[ 9]); } else { - cright = _masslast[1]*_coup[10]; - cleft = _masslast[0]*_coup[10]; + cright = Complex(_masslast[1]*_coup[10]); + cleft = Complex(_masslast[0]*_coup[10]); } } left ( cleft); right(cright); } } diff --git a/Models/LHTP/LHTPFFHVertex.cc b/Models/LHTP/LHTPFFHVertex.cc --- a/Models/LHTP/LHTPFFHVertex.cc +++ b/Models/LHTP/LHTPFFHVertex.cc @@ -1,388 +1,388 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the LHTPFFHVertex class. // #include "LHTPFFHVertex.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" using namespace Herwig; void LHTPFFHVertex::persistentOutput(PersistentOStream & os) const { os << ounit(cL_,1./GeV) << ounit(cR_,1./GeV) << model_; } void LHTPFFHVertex::persistentInput(PersistentIStream & is, int) { is >> iunit(cL_,1./GeV) >> iunit(cR_,1./GeV) >> model_; } // Static variable needed for the type description system in ThePEG. DescribeClass describeHerwigLHTPFFHVertex("Herwig::LHTPFFHVertex", "HwLHTPModel.so"); void LHTPFFHVertex::Init() { static ClassDocumentation documentation ("The LHTPFFHVertex class implements the interaction of the fermions" " and the Higgs bosons in the Little Higgs model with T-parity"); } LHTPFFHVertex::LHTPFFHVertex() : q2Last_(ZERO) { orderInGem(1); orderInGs(0); massLast_[0] = 0.*GeV; massLast_[1] = 0.*GeV; idLast_[0] = 0; idLast_[1] = 0; colourStructure(ColourStructure::DELTA); } void LHTPFFHVertex::doinit() { // SM like higgs addToList( -3, 3, 25); addToList( -4, 4, 25); addToList( -5, 5, 25); addToList( -6, 6, 25); addToList( -6, 8, 25); addToList( -8, 6, 25); addToList( -8, 8, 25); addToList( -13, 13, 25); addToList( -15, 15, 25); addToList( -4000002, 4000002, 25); addToList( -4000004, 4000004, 25); addToList( -4000006, 4000006, 25); addToList( -4000012, 4000012, 25); addToList( -4000014, 4000014, 25); addToList( -4000016, 4000016, 25); // phi0 addToList( -3 , 4000003, 35); addToList( -4 , 4000004, 35); addToList( -5 , 4000005, 35); addToList( -4000003, 3, 35); addToList( -4000004, 4, 35); addToList( -4000005, 5, 35); addToList( -6 , 4000006, 35); addToList( -8 , 4000006, 35); addToList( -4000006, 6, 35); addToList( -4000006, 8, 35); // phiP addToList( -2 , 4000002, 36); addToList( -3 , 4000003, 36); addToList( -4 , 4000004, 36); addToList( -5 , 4000005, 36); addToList( -4000002, 2, 36); addToList( -4000003, 3, 36); addToList( -4000004, 4, 36); addToList( -4000005, 5, 36); addToList( -12 , 4000012, 36); addToList( -14 , 4000014, 36); addToList( -16 , 4000016, 36); addToList( -4000012, 12, 36); addToList( -4000014, 14, 36); addToList( -4000016, 16, 36); addToList( -6 , 4000006, 36); addToList( -6 , 4000008, 36); addToList( -8 , 4000006, 36); addToList( -8 , 4000008, 36); addToList( -4000006, 6, 36); addToList( -4000008, 6, 36); addToList( -4000006, 8, 36); addToList( -4000008, 8, 36); // phi +/- addToList( -1 , 4000002, -37); addToList( -3 , 4000004, -37); addToList( -5 , 4000006, -37); addToList( -4000001, 2, -37); addToList( -4000003, 4, -37); addToList( -4000005, 6, -37); addToList( -4000005, 8, -37); addToList( -4000002, 1, 37); addToList( -4000004, 3, 37); addToList( -4000006, 5, 37); addToList( -2 , 4000001, 37); addToList( -4 , 4000003, 37); addToList( -6 , 4000005, 37); addToList( -8 , 4000005, 37); addToList( -11 , 4000012, -37); addToList( -13 , 4000014, -37); addToList( -15 , 4000016, -37); addToList( -4000011, 12, -37); addToList( -4000013, 14, -37); addToList( -4000015, 16, -37); addToList( -4000012, 11 , 37); addToList( -4000014, 13 , 37); addToList( -4000016, 15 , 37); addToList( -12, 4000011, 37); addToList( -14, 4000013, 37); addToList( -16, 4000015, 37); model_ = dynamic_ptr_cast(generator()->standardModel()); if(!model_) throw InitException() << "Must be using the LHModel " << " in LHFFPVertex::doinit()" << Exception::runerror; cL_ .resize(18); cR_ .resize(18); Energy v = model_->vev(); Energy f = model_->f(); double vf = model_->vev()/model_->f(); double sa = model_->sinAlpha(); double ca = model_->cosAlpha(); // lightest higgs couplings // coupling of light SM fermions cL_[0] = cR_[0] = 1./v; // couplings to top quarks cL_[1] = cR_[1] = sa*ca/f; cL_[2] = -sa/ca/v; cR_[2] = sqr(ca)*vf/v; // couplings to T-odd quarks cL_[3] = cR_[3] = 0.5*sqrt(0.5)/f*model_->kappaQuark(); // couplings to T-odd leptons cL_[4] = cR_[4] = 0.5*sqrt(0.5)/f*model_->kappaLepton(); // Phi0 // quark, T-odd quark cL_[5] = sqrt(0.5)/f; cR_[5] = ZERO; // and top quarks cL_[6] = sqrt(0.5)*model_->cosThetaR()/f/ca; cR_[6] = ZERO; cL_[7] = sqrt(0.5)*model_->sinThetaR()/f/ca; cR_[7] = ZERO; // PhiP // quark, T-odd quark cL_[8] = vf/f*model_->kappaQuark()/12; cR_[8] = sqrt(0.5)/f; // lepton, T-odd lepton cL_[9] = vf/f*model_->kappaLepton()/12; cR_[9] = ZERO; // top, T_- cL_[10] = model_->cosThetaR()*sqrt(2.)*vf/f/ca/3; cR_[10] = ZERO; cL_[11] = model_->sinThetaR()*sqrt(2.)*vf/f/ca/3; cR_[11] = ZERO; // top, t_- cL_[12] = model_->cosThetaL()*vf/f/12.*model_->kappaQuark(); cR_[12] = model_->cosThetaR()*sqrt(0.5)/f/ca; cL_[13] = model_->sinThetaL()*vf/f/12.*model_->kappaQuark(); cR_[13] = model_->sinThetaR()*sqrt(0.5)/f/ca; // Phi +/- cL_[14] = vf/f*model_->kappaLepton()/24.; cR_[14] = ZERO; // quark T-odd quark cL_[15] = vf/f*model_->kappaQuark() /24.; cR_[15] =-vf*sqrt(0.5)/v; cL_[16] = model_->cosThetaL()*vf/f*model_->kappaQuark() /24.; cR_[16] =-model_->cosThetaR()*vf*sqrt(0.5)/v/ca; cL_[17] = model_->sinThetaL()*vf/f*model_->kappaQuark() /24.; cR_[17] =-model_->sinThetaR()*vf*sqrt(0.5)/v/ca; FFSVertex::doinit(); } void LHTPFFHVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) { norm(1.); int iferm=abs(a->id()); int ianti=abs(b->id()); // int ihigg=abs(c->id()); // left and right couplings set to one // SM like higgs if(c->id()==ParticleID::h0) { // to SM fermions and T if(iferm<=16&&ianti<=16) { // running masses if(q2!=q2Last_||idLast_[0]!=iferm||idLast_[1]!=ianti) { q2Last_ = q2; idLast_[0] = iferm; assert((idLast_[0]>=1 && idLast_[0]<=8 ) || (idLast_[0]>=11 && idLast_[0]<=16)); if(idLast_[0]!=8) massLast_[0] = model_->mass(q2,a); else massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t)); idLast_[1] = ianti; assert((idLast_[1]>=1 && idLast_[1]<=8 ) || (idLast_[1]>=11 && idLast_[1]<=16)); if(idLast_[0]!=idLast_[1]) { if(idLast_[1]!=8) massLast_[1] = model_->mass(q2,a); else massLast_[1] = model_->mass(q2,getParticleData(ParticleID::t)); } else { massLast_[1] = massLast_[0]; } } if(iferm<6||iferm>8) { left (-Complex(cL_[0]*massLast_[0])); right(-Complex(cR_[0]*massLast_[0])); } else { if(iferm==8&&ianti==8) { left ( Complex(cL_[1]*massLast_[0])); right( Complex(cR_[1]*massLast_[0])); } else { if(a->id()==ParticleID::tbar||b->id()==ParticleID::tbar) { left (-Complex(cL_[2]*massLast_[0])); right(-Complex(cR_[2]*massLast_[0])); } else { left (-Complex(cR_[2]*massLast_[0])); right(-Complex(cL_[2]*massLast_[0])); } } } } else { if(iferm<=4000006) { left ( Complex(cL_[3]*model_->vev())); right( Complex(cR_[3]*model_->vev())); } else { left ( Complex(cL_[4]*model_->vev())); right( Complex(cR_[4]*model_->vev())); } } } // Phi0 else if(c->id()==ParticleID::H0 || c->id()==ParticleID::A0) { tcPDPtr ferm = a; if(iferm>4000000) { swap(iferm,ianti); ferm = b; } if(q2!=q2Last_||idLast_[0]!=iferm) { q2Last_ = q2; idLast_[0] = iferm; assert((idLast_[0]>=1 && idLast_[0]<=8 ) || (idLast_[0]>=11 && idLast_[0]<=16)); if(idLast_[0]!=8) massLast_[0] = model_->mass(q2,ferm); else massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t)); } if(c->id()==ParticleID::H0 ) { unsigned int iloc = 5; if(iferm==6) iloc = 6; else if(iferm==8) iloc = 7; if( (a->id()>=1&&a->id()<=8) || (b->id()>=1&&b->id()<=8) ) { left ( Complex(cR_[iloc]*massLast_[0])); right( Complex(cL_[iloc]*massLast_[0])); } else { left ( Complex(cL_[iloc]*massLast_[0])); right( Complex(cR_[iloc]*massLast_[0])); } } // PhiP else if(c->id()==ParticleID::A0) { if(iferm<=5) { if( (a->id()>=1&&a->id()<=5) || (b->id()>=1&&b->id()<=5) ) { if(iferm%2==0) { right(Complex(0., 1.)*model_->vev()*cL_[8]); left (Complex(0.,-1.)*massLast_[0] *cR_[8]); } else { right(Complex(ZERO)); left (Complex(0., 1.)*massLast_[0] *cR_[8]); } } else { if(iferm%2==0) { left (Complex(0.,-1.)*model_->vev()*cL_[8]); right(Complex(0., 1.)*massLast_[0] *cR_[8]); } else { left (Complex(ZERO)); right(Complex(0.,-1.)*massLast_[0] *cR_[8]); } } } else if(iferm>=12) { if( (a->id()>=11&&a->id()<=16) || (b->id()>=11&&b->id()<=16) ) { right(Complex(0., 1.)*model_->vev()*cL_[9]); left (Complex(0.,-1.)*massLast_[0] *cR_[9]); } else { right(Complex(0.,-1.)*massLast_[0] *cR_[9]); left (Complex(0., 1.)*model_->vev()*cL_[9]); } } else { if(ianti==4000008) { unsigned int iloc = (iferm+14)/2; if( (a->id()==6||a->id()==8) || (b->id()==6||b->id()==8) ) { left (Complex(0., 1.)*massLast_[0]*cR_[iloc]); right(Complex(0., 1.)*massLast_[0]*cL_[iloc]); } else { left (Complex(0.,-1.)*massLast_[0]*cL_[iloc]); right(Complex(0.,-1.)*massLast_[0]*cR_[iloc]); } } else { unsigned int iloc = (iferm+18)/2; if( (a->id()==6||a->id()==8) || (b->id()==6||b->id()==8) ) { left (Complex(0., 1.)*model_->vev()*cL_[iloc]); right(Complex(0.,-1.)*massLast_[0] *cR_[iloc]); } else { left (Complex(0., 1.)*massLast_[0] *cR_[iloc]); right(Complex(0.,-1.)*model_->vev()*cL_[iloc]); } } } } } else if(abs(c->id())==ParticleID::Hplus) { tcPDPtr ferm = a; if(iferm>4000000) { swap(iferm,ianti); ferm = b; } if(q2!=q2Last_||idLast_[0]!=iferm) { q2Last_ = q2; idLast_[0] = iferm; assert((idLast_[0]>=1 && idLast_[0]<=8 ) || (idLast_[0]>=11 && idLast_[0]<=16)); if(idLast_[0]!=8) massLast_[0] = model_->mass(q2,ferm); else massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t)); } Complex cleft(0.),cright(0.); // lepton and T-odd lepton if(iferm>=11&&iferm<=16) { - cright = cR_[14]*massLast_[0]; - cleft = cL_[14]*model_->vev(); + cright = Complex(cR_[14]*massLast_[0]); + cleft = Complex(cL_[14]*model_->vev()); } else if(iferm>=1&&iferm<=6) { - cright = cR_[15]*massLast_[0]; - cleft = cL_[15]*model_->vev(); + cright = Complex(cR_[15]*massLast_[0]); + cleft = Complex(cL_[15]*model_->vev()); } else if(iferm==6) { - cright = cR_[16]*massLast_[0]; - cleft = cL_[16]*model_->vev(); + cright = Complex(cR_[16]*massLast_[0]); + cleft = Complex(cL_[16]*model_->vev()); } else if(iferm==8) { - cright = cR_[17]*massLast_[0]; - cleft = cL_[17]*model_->vev(); + cright = Complex(cR_[17]*massLast_[0]); + cleft = Complex(cL_[17]*model_->vev()); } if((a->id()>=1&&a->id()<=16) ||(b->id()>=1&&b->id()<=16) ) { swap(cleft,cright); cleft *= -1.; cright *= -1.; } if(c->id()==ParticleID::Hminus) { cleft *= -1.; cright *= -1.; } left (cleft ); right(cright); } } diff --git a/Models/RSModel/RSModelFFWGRVertex.cc b/Models/RSModel/RSModelFFWGRVertex.cc --- a/Models/RSModel/RSModelFFWGRVertex.cc +++ b/Models/RSModel/RSModelFFWGRVertex.cc @@ -1,191 +1,191 @@ // -*- C++ -*- // // RSModelFFWGRVertex.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the RSModelFFWGRVertex class. // #include "RSModelFFWGRVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Models/StandardModel/StandardCKM.h" using namespace Herwig; using namespace ThePEG; RSModelFFWGRVertex::RSModelFFWGRVertex() : charge_(17,0.), gl_(17,0.), gr_(17,0.), ckm_(3,vector(3,0.0)), couplast_(0.), q2last_(ZERO), kappa_(ZERO) { orderInGem(2); orderInGs (0); colourStructure(ColourStructure::DELTA); } void RSModelFFWGRVertex::doinit() { for(int ix=11;ix<17;++ix) { addToList(-ix,ix,22,39); addToList(-ix,ix,23,39); } for(int ix=1;ix<7;++ix) { addToList(-ix,ix,22,39); addToList(-ix,ix,23,39); } // particles for outgoing W- // quarks for(int ix=1;ix<6;ix+=2) { for(int iy=2;iy<7;iy+=2) { addToList(-ix, iy, -24,39); } } // leptons for(int ix=11;ix<17;ix+=2) { addToList(-ix, ix+1, -24,39); } // particles for outgoing W+ // quarks for(int ix=2;ix<7;ix+=2) { for(int iy=1;iy<6;iy+=2) { addToList(-ix, iy, 24,39); } } // leptons for(int ix=11;ix<17;ix+=2) { addToList(-ix-1, ix, 24,39); } FFVTVertex::doinit(); tcHwRSPtr hwRS=dynamic_ptr_cast(generator()->standardModel()); if(!hwRS) throw Exception() << "Must have RSModel in RSModelFFWGRVertex::doinit()" << Exception::runerror; double sw2 = sin2ThetaW(); double fact = 0.25/sqrt(sw2*(1.-sw2)); for(int ix=1;ix<4;++ix) { charge_[2*ix-1] = hwRS->ed(); charge_[2*ix ] = hwRS->eu(); charge_[2*ix+9 ] = hwRS->ee(); charge_[2*ix+10] = hwRS->enu(); gl_[2*ix-1] = fact*(hwRS->vd() + hwRS->ad() ); gl_[2*ix ] = fact*(hwRS->vu() + hwRS->au() ); gl_[2*ix+9 ] = fact*(hwRS->ve() + hwRS->ae() ); gl_[2*ix+10] = fact*(hwRS->vnu() + hwRS->anu()); gr_[2*ix-1] = fact*(hwRS->vd() - hwRS->ad() ); gr_[2*ix ] = fact*(hwRS->vu() - hwRS->au() ); gr_[2*ix+9 ] = fact*(hwRS->ve() - hwRS->ae() ); gr_[2*ix+10] = fact*(hwRS->vnu() - hwRS->anu()); } kappa_ = 2./hwRS->lambda_pi(); Ptr::transient_pointer CKM = generator()->standardModel()->CKM(); // cast the CKM object to the HERWIG one ThePEG::Ptr::transient_const_pointer hwCKM = ThePEG::dynamic_ptr_cast< ThePEG::Ptr:: transient_const_pointer>(CKM); if(hwCKM) { vector< vector > CKM; CKM = hwCKM->getUnsquaredMatrix(generator()->standardModel()->families()); for(unsigned int ix=0;ix<3;++ix) { for(unsigned int iy=0;iy<3;++iy) { ckm_[ix][iy]=CKM[ix][iy]; } } } else { throw Exception() << "Must have access to the Herwig::StandardCKM object" << "for the CKM matrix in SMFFWVertex::doinit()" << Exception::runerror; } } void RSModelFFWGRVertex::persistentOutput(PersistentOStream & os) const { os << charge_ << gl_ << gr_ << ounit(kappa_,InvGeV) << ckm_; } void RSModelFFWGRVertex::persistentInput(PersistentIStream & is, int) { is >> charge_ >> gl_ >> gr_ >> iunit(kappa_,InvGeV) >> ckm_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigRSModelFFWGRVertex("Herwig::RSModelFFWGRVertex", "HwRSModel.so"); void RSModelFFWGRVertex::Init() { static ClassDocumentation documentation ("The RSModelFFWGRVertexxs class is the implementation" " of the two fermion vector coupling for the RS model."); } // FFWGR coupling void RSModelFFWGRVertex::setCoupling(Energy2 q2,tcPDPtr aa,tcPDPtr bb, tcPDPtr cc, tcPDPtr) { // work out the particles int iferm= abs(aa->id()); int ibos = abs(cc->id()); Complex coup; // overall factor assert( ibos >= 22 && ibos <= 24 ); if( q2last_ != q2 || couplast_ == 0. ) { couplast_ = electroMagneticCoupling(q2); q2last_ = q2; } // photon if(ibos==22) { // alpha - coup = UnitRemoval::E * kappa_ * couplast_; + coup = Complex(UnitRemoval::E * kappa_ * couplast_); // _charge of particle assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)); coup *= charge_[iferm]; left (1.); right(1.); } // Z boson else if(ibos==23) { - coup = UnitRemoval::E * kappa_ * couplast_; + coup = Complex(UnitRemoval::E * kappa_ * couplast_); // _charge of particle assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)); left (gl_[iferm]); right(gr_[iferm]); } else if(ibos==24) { coup = Complex(UnitRemoval::E * kappa_ * couplast_) * sqrt(0.5) / sqrt(sin2ThetaW()); // the left and right couplings int iferm=abs(aa->id()); int ianti=abs(bb->id()); // quarks if(iferm>=1 && iferm <=6) { int iu,id; // up type first if(iferm%2==0) { iu = iferm/2; id = (ianti+1)/2; } // down type first else { iu = ianti/2; id = (iferm+1)/2; } assert( iu>=1 && iu<=3 && id>=1 && id<=3); left(ckm_[iu-1][id-1]); right(0.); } // leptons else if(iferm>=11 && iferm <=16) { left(1.); right(0.); } else assert(false); } // set the coupling norm(coup); } diff --git a/Models/StandardModel/SMHPPVertex.cc b/Models/StandardModel/SMHPPVertex.cc --- a/Models/StandardModel/SMHPPVertex.cc +++ b/Models/StandardModel/SMHPPVertex.cc @@ -1,286 +1,286 @@ // -*- C++ -*- // // SMHPPVertex.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the SMHPPVertex class. // #include "SMHPPVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/EnumParticles.h" #include "Herwig/Looptools/clooptools.h" using namespace Herwig; using namespace ThePEG; void SMHPPVertex::persistentOutput(PersistentOStream & os) const { os << _theSM << ounit(_mw,GeV) << _massopt << _minloop << _maxloop << _CoefRepresentation; } void SMHPPVertex::persistentInput(PersistentIStream & is, int) { is >> _theSM >> iunit(_mw, GeV) >> _massopt >> _minloop >> _maxloop >> _CoefRepresentation; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSMHPPVertex("Herwig::SMHPPVertex", "Herwig.so"); void SMHPPVertex::Init() { static ClassDocumentation documentation ("This class implements the h0->gamma,gamma vertex."); static Parameter interfaceMinQuarkInLoop ("MinQuarkInLoop", "The minimum flavour of the quarks to include in the loops", &SMHPPVertex::_minloop, 6, 1, 6, false, false, Interface::limited); static Parameter interfaceMaxQuarkInLoop ("MaxQuarkInLoop", "The maximum flavour of the quarks to include in the loops", &SMHPPVertex::_maxloop, 6, 1, 6, false, false, Interface::limited); static Switch interfaceMassOption ("LoopMassScheme", "Switch for the treatment of the masses in the loops ", &SMHPPVertex::_massopt, 2, false, false); static SwitchOption interfaceHeavyMass (interfaceMassOption, "PoleMasses", "The loop is calculcated with the pole quark masses", 1); static SwitchOption interfaceNormalMass (interfaceMassOption, "RunningMasses", "running quark masses are taken in the loop", 2); static Switch interfaceScheme ("CoefficientScheme", "Which scheme for the tensor coefficients is applied", &SMHPPVertex::_CoefRepresentation, 1, false, false); static SwitchOption interfaceSchemeSimplified (interfaceScheme, "Simplified", "Represection suitable for the simplified the H-g-g and H-gamma-gamma vertices", 1); static SwitchOption interfaceSchemeGeneral (interfaceScheme, "General", "Represection suitable for the Passarino-Veltman tensor reduction scheme", 2); } void SMHPPVertex::setCoupling(Energy2 q2, tcPDPtr part2, tcPDPtr part3, tcPDPtr part1) { assert( part1->id() == ParticleID::h0 && part2->id() == ParticleID::gamma && part3->id() == ParticleID::gamma ); int Qminloop = _minloop; int Qmaxloop = _maxloop; if (_maxloop < _minloop) { Qmaxloop=_minloop; Qminloop=_maxloop; } switch (_CoefRepresentation) { case 1: { if(q2 != _q2last||_couplast==0.) { double g = weakCoupling(q2); double e2 = sqr(electroMagneticCoupling(q2)); _couplast = UnitRemoval::E * e2 * g / 8. / _mw/ sqr(Constants::pi); _q2last = q2; } norm(_couplast); Complex loop(0.); // quark loops for ( int i = Qminloop; i <= Qmaxloop; ++i ) { tcPDPtr qrk = getParticleData(i); Energy mass = (2 == _massopt) ? _theSM->mass(q2,qrk) : qrk->mass(); Charge charge = qrk->charge(); - loop += 3.*sqr(charge/ThePEG::Units::eplus) * Af(sqr(mass)/invariant(0,0)); + loop += Complex(3.*sqr(charge/ThePEG::Units::eplus) * Af(sqr(mass)/invariant(0,0))); } // lepton loops int Lminloop = 3; // still fixed value int Lmaxloop = 3; // still fixed value for (int i = Lminloop; i <= Lmaxloop; ++i) { tcPDPtr lpt = getParticleData(9 + 2*i); Energy mass = (2 == _massopt) ? _theSM->mass(q2,lpt) : lpt->mass(); Charge charge = lpt->charge(); - loop += sqr(charge/ThePEG::Units::eplus) * Af(sqr(mass)/invariant(0,0)); + loop += Complex(sqr(charge/ThePEG::Units::eplus) * Af(sqr(mass)/invariant(0,0))); } // W loop loop += Aw(sqr(_mw)/invariant(0,0)); a00(loop); a11(0.0); a12(0.0); a21(-loop); a22(0.0); aEp(0.0); break; } case 2: { if(q2 != _q2last||_couplast==0.) { Looptools::clearcache(); double e = electroMagneticCoupling(q2); _couplast = pow(e,3)/sqrt(sin2ThetaW()); _q2last = q2; } norm(_couplast); // quarks int delta = Qmaxloop - Qminloop + 1; type.resize(delta,PDT::SpinUnknown); masses.resize(delta,ZERO); for (int i = 0; i < delta; ++i) { tcPDPtr q = getParticleData(_minloop+i); type[i] = PDT::Spin1Half; masses[i] = (2 == _massopt) ? _theSM->mass(q2,q) : q->mass(); double copl = -masses[i]*3.*sqr(q->iCharge()/3.)/_mw/2.; couplings.push_back(make_pair(copl, copl)); } // tau type.push_back(PDT::Spin1Half); tcPDPtr tau = getParticleData(ParticleID::tauminus); masses.push_back(_theSM->mass(q2,tau)); double copl = -masses.back()*sqr(tau->iCharge()/3.)/_mw/2.; couplings.push_back(make_pair(copl, copl)); // W type.push_back(PDT::Spin1); masses.push_back(_mw); const double mw = UnitRemoval::InvE*_mw; couplings.push_back(make_pair(mw,mw)); setNParticles(delta+2); VVSLoopVertex::setCoupling(q2, part1, part2, part3); break; } } } Complex SMHPPVertex::Af(const double tau) const { return tau*(4. - W2(tau)*(1. - 4.*tau)); } Complex SMHPPVertex::Aw(const double tau) const { return 0.5*(-3.*W2(tau)*tau*(4.*tau - 2.) - 12.*tau - 2.); } Complex SMHPPVertex::W2(double lambda) const { double pi = Constants::pi; if (0.0 == lambda) return 0.0; if (lambda < 0.0) return 4.*sqr(asinh(0.5*sqrt(-1./lambda))); double root(0.5*sqrt(1./lambda)); Complex ac(0.); // formulae from NPB297,221 if(root < 1.) { ac = -sqr(asin(root)); } else { double ex = acosh(root); ac = sqr(ex) - 0.25*sqr(pi) - pi*ex*Complex(0.,1.); } return 4.*ac; } SMHPPVertex::SMHPPVertex() :_couplast(0.),_q2last(),_mw(),_massopt(1), _minloop(6),_maxloop(6),_CoefRepresentation(1) { orderInGs(0); orderInGem(3); colourStructure(ColourStructure::SINGLET); } // functions for loops for testing // namespace { // Complex F0(double tau) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return tau*(1.-tau*ft); // } // Complex FHalf(double tau,double eta) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return -2.*tau*(eta+(1.-tau*eta)*ft); // } // Complex F1(double tau) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return 2.+3.*tau+3.*tau*(2.-tau)*ft; // } // } void SMHPPVertex::doinit() { //PDG codes for particles at vertices addToList(22,22,25); _theSM = dynamic_ptr_cast(generator()->standardModel()); if( !_theSM ) throw InitException() << "SMHGGVertex::doinit() - The pointer to the SM object is null." << Exception::abortnow; _mw = getParticleData(ThePEG::ParticleID::Wplus)->mass(); VVSLoopVertex::doinit(); // // code to test the partial width // Energy mh = getParticleData(25)->mass(); // Complex I(0.); // for(long ix=int(_minloop);ix<=int(_maxloop);++ix) { // tcPDPtr qrk = getParticleData(ix); // Energy mt = (2 == _massopt) ? _theSM->mass(sqr(mh),qrk) : qrk->mass(); // double tau = sqr(2.*mt/mh); // I += 3.*sqr(double(qrk->iCharge())/3.)*FHalf(tau,1.); // cerr << "testing half " << FHalf(tau,1) << " " << Af(0.25*tau) << "\n"; // } // for(long ix=15;ix<=15;++ix) { // tcPDPtr qrk = getParticleData(ix); // Energy mt = (2 == _massopt) ? _theSM->mass(sqr(mh),qrk) : qrk->mass(); // double tau = sqr(2.*mt/mh); // I += sqr(double(qrk->iCharge())/3.)*FHalf(tau,1.); // } // I += F1(sqr(2.*_mw/mh)); // Energy width = sqr(weakCoupling(sqr(mh))*sqr(electroMagneticCoupling(sqr(mh)))) // /1024./pow(Constants::pi,5)/16.*sqr(mh/_mw)*mh*std::norm(I); // cerr << "testing anal " << width/GeV << "\n"; if(loopToolsInitialized()) Looptools::ltexi(); } diff --git a/Models/Susy/NMSSM/NMSSMGGHVertex.cc b/Models/Susy/NMSSM/NMSSMGGHVertex.cc --- a/Models/Susy/NMSSM/NMSSMGGHVertex.cc +++ b/Models/Susy/NMSSM/NMSSMGGHVertex.cc @@ -1,209 +1,211 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the NMSSMGGHVertex class. // #include "NMSSMGGHVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/Models/Susy/NMSSM/NMSSM.h" #include "Herwig/Looptools/clooptools.h" using namespace Herwig; NMSSMGGHVertex::NMSSMGGHVertex() : _sw(0.), _cw(0.), _mw(0.*MeV), _mz(0.*MeV),_lambdaVEV(0.*MeV), _lambda(0.), _v1(0.*MeV), _v2(0.*MeV), _triTp(0.*MeV), _triBt(0.*MeV), _sb(0.), _cb(0.), _masslast(make_pair(0.*MeV,0.*MeV)), _q2last(0.*MeV2), _couplast(0.), _coup(0.), _hlast(0), _recalc(true) { orderInGem(1); orderInGs(2); colourStructure(ColourStructure::DELTA); } void NMSSMGGHVertex::doinit() { addToList(21,21,25); addToList(21,21,35); addToList(21,21,36); addToList(21,21,45); addToList(21,21,46); _theSM = dynamic_ptr_cast(generator()->standardModel()); if( !_theSM ) { throw InitException() << "NMSSMGGHVertex::doinit - The SM pointer is null!" << Exception::abortnow; } // SM parameters _sw = sqrt(sin2ThetaW()); _cw = sqrt(1. - sin2ThetaW()); _mw = getParticleData(24)->mass(); _mz = getParticleData(23)->mass(); _top = getParticleData(6); _bt = getParticleData(5); //NMSSM parameters tcNMSSMPtr nmssm = dynamic_ptr_cast(_theSM); _mixS = nmssm->CPevenHiggsMix(); _mixP = nmssm->CPoddHiggsMix(); _mixQt = nmssm->stopMix(); _mixQb = nmssm->sbottomMix(); double beta = atan(nmssm->tanBeta()); _sb = sin(beta); _cb = cos(beta); _v1 = sqrt(2.)*_mw*_cb; _v2 = sqrt(2.)*_mw*_sb; _lambda = nmssm->lambda(); _lambdaVEV = nmssm->lambdaVEV(); _triTp = nmssm->topTrilinear(); _triBt = nmssm->bottomTrilinear(); // resize vectors here and use setNParticles method // to the set the actual number in the loop. // Also only the top mass hass to be calculated at runtime masses.resize(6, Energy()); masses[0] = getParticleData(6)->mass(); masses[1] = getParticleData(5)->mass(); masses[2] = getParticleData(1000005)->mass(); masses[3] = getParticleData(2000005)->mass(); masses[4] = getParticleData(1000006)->mass(); masses[5] = getParticleData(2000006)->mass(); type.resize(6, PDT::Spin0); type[0] = PDT::Spin1Half; type[1] = PDT::Spin1Half; couplings.resize(6); VVSLoopVertex::doinit(); if(loopToolsInitialized()) Looptools::ltexi(); } void NMSSMGGHVertex::persistentOutput(PersistentOStream & os) const { os << _theSM << _sw << _cw << ounit(_mw, GeV) << ounit(_mz, GeV) << ounit(_lambdaVEV,GeV) << _lambda << ounit(_v1,GeV) << ounit(_v2,GeV) << ounit(_triTp,GeV) << ounit(_triBt,GeV) << _top << _bt << _mixS << _mixP << _mixQt << _mixQb << _sb << _cb; } void NMSSMGGHVertex::persistentInput(PersistentIStream & is, int) { is >> _theSM >> _sw >> _cw >> iunit(_mw, GeV) >> iunit(_mz, GeV) >> iunit(_lambdaVEV,GeV) >> _lambda >> iunit(_v1,GeV) >> iunit(_v2,GeV) >> iunit(_triTp,GeV) >> iunit(_triBt,GeV) >> _top >> _bt >> _mixS >> _mixP >> _mixQt >> _mixQb >> _sb >> _cb; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigNMSSMGGHVertex("Herwig::NMSSMGGHVertex", "HwSusy.so HwNMSSM.so"); void NMSSMGGHVertex::Init() { static ClassDocumentation documentation ("The effective coupling of a higgs to a pair of gluons in the " "NMSSM."); } void NMSSMGGHVertex::setCoupling(Energy2 q2, tcPDPtr p1, tcPDPtr p2, tcPDPtr p3) { long hid(p3->id()); if( q2 != _q2last ) { Looptools::clearcache(); _couplast = sqr(strongCoupling(q2)); _coup = weakCoupling(q2); _q2last = q2; _recalc = true; } norm(_couplast*_coup); // scalar higgs bosons if( hid != _hlast ) { _hlast = hid; _recalc = true; if( hid % 5 == 0 ) { // location of the higgs int iloc = (hid - 25)/10; // 6 particles in the loop setNParticles(6); // top and bottom quark masses Energy mt = _theSM->mass(q2, _top); Energy mb = _theSM->mass(q2, _bt); Complex c(0.); // couplings for the top quark loop c = -0.25*mt*(*_mixS)(iloc, 1)/_sb/_mw; couplings[0] = make_pair(c,c); masses[0] = mt; // couplings for the bottom quark loop c = -0.25*mb*(*_mixS)(iloc, 0)/_cb/_mw; couplings[1] = make_pair(c,c); masses[1] = mb; // sbottoms double f1 = mb/_mw/_cb; complex f2 = 0.5*_mz/_cw* ( - _cb*(*_mixS)(iloc,0) + _sb*(*_mixS)(iloc,1)); complex cpl; for(unsigned int ix=0;ix<2;++ix) { cpl = -f2*( (1. - 2.*sqr(_sw)/3.)*(*_mixQb)(ix, 0)*(*_mixQb)(ix, 0) + 2.*sqr(_sw)*(*_mixQb)(ix, 1)*(*_mixQb)(ix, 1)/3.) - f1*mb*(*_mixS)(iloc,0) *((*_mixQb)(ix, 0)*(*_mixQb)(ix, 0) + (*_mixQb)(ix, 1)*(*_mixQb)(ix, 1)) - 0.5*f1*(-_lambdaVEV*(*_mixS)(iloc,1) - _lambda*_v2*(*_mixS)(iloc,2)/_coup + _triBt*(*_mixS)(iloc,0))*((*_mixQb)(ix, 1)*(*_mixQb)(ix, 0) + (*_mixQb)(ix, 0)*(*_mixQb)(ix, 1)); - couplings[2+ix] = make_pair(0.5*cpl*UnitRemoval::InvE,0.5*cpl*UnitRemoval::InvE); + couplings[2+ix] = make_pair(Complex(0.5*cpl*UnitRemoval::InvE), + Complex(0.5*cpl*UnitRemoval::InvE)); } // stop f1 = mt/_mw/_sb; for(unsigned int ix=0;ix<2;++ix) { cpl =+f2*( (1. - 4.*sqr(_sw)/3.)*(*_mixQt)(ix, 0)*(*_mixQt)(ix, 0) + 4.*sqr(_sw)*(*_mixQt)(ix, 1)*(*_mixQt)(ix, 1)/3.) - f1*mt*(*_mixS)(iloc,1) *((*_mixQt)(ix, 0)*(*_mixQt)(ix, 0) + (*_mixQt)(ix, 1)*(*_mixQt)(ix, 1)) - 0.5*f1*(-_lambdaVEV*(*_mixS)(iloc,0) - _lambda*_v1*(*_mixS)(iloc,2)/_coup + _triTp*(*_mixS)(iloc,1))*((*_mixQt)(ix, 1)*(*_mixQt)(ix, 0) + (*_mixQt)(ix, 0)*(*_mixQt)(ix, 1)); - couplings[4+ix] = make_pair(0.5*cpl*UnitRemoval::InvE,0.5*cpl*UnitRemoval::InvE); + couplings[4+ix] = make_pair(Complex(0.5*cpl*UnitRemoval::InvE), + Complex(0.5*cpl*UnitRemoval::InvE)); } } // pseudoscalar higgs bosons else { // location of the higgs int iloc = (hid - 36)/10; // 2 particles in the loop setNParticles(2); // top and bottom quark masses Energy mt = _theSM->mass(q2, _top); Energy mb = _theSM->mass(q2, _bt); Complex c(0.); // top quark couplings c = Complex(0.,-1.)*0.25*mt*(*_mixP)(iloc, 1)/_sb/_mw; couplings[0] = make_pair(-c,c); masses[0] = mt; // bottom quark couplings c = Complex(0., -1.)*0.25*mb*(*_mixP)(iloc, 0)/_cb/_mw; couplings[1] = make_pair(-c,c); masses[1] = mb; } } if( _recalc ) { VVSLoopVertex::setCoupling(q2, p1, p2, p3); _recalc = false; } } diff --git a/Models/Susy/NMSSM/NMSSMPPHVertex.cc b/Models/Susy/NMSSM/NMSSMPPHVertex.cc --- a/Models/Susy/NMSSM/NMSSMPPHVertex.cc +++ b/Models/Susy/NMSSM/NMSSMPPHVertex.cc @@ -1,284 +1,287 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the NMSSMPPHVertex class. // #include "NMSSMPPHVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/EnumParticles.h" #include "Herwig/Models/Susy/NMSSM/NMSSM.h" #include "Herwig/Looptools/clooptools.h" using namespace Herwig; NMSSMPPHVertex::NMSSMPPHVertex() : _sw(0.), _cw(0.), _mw(0.*MeV), _mz(0.*MeV),_lambdaVEV(0.*MeV), _lambda(0.), _triTp(0.*MeV), _triBt(0.*MeV), _sb(0.), _cb(0.), _kappa(0.),_vu(ZERO),_vd(ZERO),_s(ZERO),_theAl(ZERO), _masslast(make_pair(0.*MeV,0.*MeV)),_q2last(0.*MeV2), _couplast(0.), _coup(0.), _hlast(0), _recalc(true) { orderInGem(3); orderInGs(0); colourStructure(ColourStructure::SINGLET); } void NMSSMPPHVertex::doinit() { addToList(22,22,25); addToList(22,22,35); addToList(22,22,36); addToList(22,22,45); addToList(22,22,46); _theSM = dynamic_ptr_cast(generator()->standardModel()); if( !_theSM ) { throw InitException() << "NMSSMPPHVertex::doinit - The SM pointer is null!" << Exception::abortnow; } // SM parameters _sw = sqrt(sin2ThetaW()); _cw = sqrt(1. - sin2ThetaW()); _mw = getParticleData(24)->mass(); _mz = getParticleData(23)->mass(); _top = getParticleData(6); _bt = getParticleData(5); _tau = getParticleData(15); //NMSSM parameters tcNMSSMPtr nmssm = dynamic_ptr_cast(_theSM); _mixS = nmssm->CPevenHiggsMix(); _mixP = nmssm->CPoddHiggsMix(); _mixQt = nmssm->stopMix(); _mixQb = nmssm->sbottomMix(); _mixLt = nmssm->stauMix(); double beta = atan(nmssm->tanBeta()); _sb = sin(beta); _cb = cos(beta); _lambda = nmssm->lambda(); _lambdaVEV = nmssm->lambdaVEV(); _triTp = nmssm->topTrilinear(); _triBt = nmssm->bottomTrilinear(); _triTa = nmssm->tauTrilinear(); _vd = sqrt(2)*_mw*_cb; _vu = sqrt(2)*_mw*_sb; _s = _lambdaVEV/_lambda; _theAl = nmssm->trilinearLambda(); _kappa = nmssm->kappa(); _mixU = nmssm->charginoUMix(); _mixV = nmssm->charginoVMix(); // resize vectors here and use setNParticles method // to the set the actual number in the loop. // Also only the top mass hass to be calculated at runtime masses.resize(13, Energy()); masses[ 0] = getParticleData( 6)->mass(); masses[ 1] = getParticleData( 5)->mass(); masses[ 2] = getParticleData(15)->mass(); masses[ 3] = getParticleData(ParticleID::SUSY_chi_1plus)->mass(); masses[ 4] = getParticleData(ParticleID::SUSY_chi_2plus)->mass(); masses[ 5] = _mw; masses[ 6] = getParticleData(ParticleID::Hplus)->mass(); masses[ 7] = getParticleData(1000005)->mass(); masses[ 8] = getParticleData(2000005)->mass(); masses[ 9] = getParticleData(1000006)->mass(); masses[10] = getParticleData(2000006)->mass(); masses[11] = getParticleData(1000015)->mass(); masses[12] = getParticleData(2000015)->mass(); type.resize(13, PDT::Spin0); type[0] = PDT::Spin1Half; type[1] = PDT::Spin1Half; type[2] = PDT::Spin1Half; type[3] = PDT::Spin1Half; type[4] = PDT::Spin1Half; type[5] = PDT::Spin1; couplings.resize(13); VVSLoopVertex::doinit(); if(loopToolsInitialized()) Looptools::ltexi(); } void NMSSMPPHVertex::persistentOutput(PersistentOStream & os) const { os << _theSM << _sw << _cw << ounit(_mw, GeV) << ounit(_mz, GeV) << ounit(_lambdaVEV,GeV) << _lambda << ounit(_triTp,GeV) << ounit(_triBt,GeV) << ounit(_triTa,GeV) << _top << _bt << _tau << _mixS << _mixP << _mixU << _mixV << _mixQt << _mixQb << _mixLt << _sb << _cb << _kappa << ounit(_vu,GeV) << ounit(_vd,GeV) << ounit(_s,GeV) << ounit(_theAl,GeV); } void NMSSMPPHVertex::persistentInput(PersistentIStream & is, int) { is >> _theSM >> _sw >> _cw >> iunit(_mw, GeV) >> iunit(_mz, GeV) >> iunit(_lambdaVEV,GeV) >> _lambda >> iunit(_triTp,GeV) >> iunit(_triBt,GeV) >> iunit(_triTa,GeV) >> _top >> _bt >> _tau >> _mixS >> _mixP >> _mixU >> _mixV >> _mixQt >> _mixQb >> _mixLt >> _sb >> _cb >> _kappa >> iunit(_vu,GeV) >> iunit(_vd,GeV) >> iunit(_s,GeV) >> iunit(_theAl,GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigNMSSMPPHVertex("Herwig::NMSSMPPHVertex", "HwSusy.so HwNMSSM.so"); void NMSSMPPHVertex::Init() { static ClassDocumentation documentation ("The effective coupling of a higgs to a pair of gluons in the " "NMSSM."); } void NMSSMPPHVertex::setCoupling(Energy2 q2, tcPDPtr p1, tcPDPtr p2, tcPDPtr p3) { long hid(p3->id()); double rt = sqrt(0.5); if( q2 != _q2last ) { Looptools::clearcache(); _couplast = sqr(electroMagneticCoupling(q2)); _coup = weakCoupling(q2); _q2last = q2; _recalc = true; } norm(_couplast*_coup); // scalar higgs bosons if( hid != _hlast ) { _hlast = hid; _recalc = true; // top and bottom quark masses Energy mt = _theSM->mass(q2, _top); Energy mb = _theSM->mass(q2, _bt); Energy mtau = _theSM->mass(q2, _tau); // scalar if( hid % 5 == 0 ) { // location of the higgs int iloc = (hid - 25)/10; // 6 particles in the loop setNParticles(13); Complex c(0.); // couplings for the top quark loop c = -1.5*sqr(_theSM->eu())* mt*(*_mixS)(iloc, 1)/_sb/_mw; couplings[0] = make_pair(c,c); masses[0] = mt; // couplings for the bottom quark loop c = -1.5*sqr(_theSM->ed())* mb*(*_mixS)(iloc, 0)/_cb/_mw; couplings[1] = make_pair(c,c); masses[1] = mb; // couplings for the tau lepton loop c = -0.5*sqr(_theSM->ee())*mtau*(*_mixS)(iloc, 0)/_cb/_mw; couplings[2] = make_pair(c,c); masses[2] = mtau; // charginos for(unsigned int ic=0;ic<2;++ic) { c = -_lambda/_coup*rt*(*_mixS)(iloc,2)*(*_mixU)(ic,1)*(*_mixV)(ic,1) -rt*((*_mixS)(iloc,0)*(*_mixU)(ic,1)*(*_mixV)(ic,0) + (*_mixS)(iloc,1)*(*_mixU)(ic,0)*(*_mixV)(ic,1)); couplings[3+ic] = make_pair(c,c); } // W boson - c = UnitRemoval::InvE*_mw* - (_cb*(*_mixS)(iloc,0)+_sb*(*_mixS)(iloc,1)); + c = Complex(UnitRemoval::InvE*_mw* + (_cb*(*_mixS)(iloc,0)+_sb*(*_mixS)(iloc,1))); couplings[5] = make_pair(c,c); // charged Higgs complex cpl; cpl = sqr(_lambda)*rt*2.*(_s*((*_mixS)(iloc,2)*sqr(_cb) + (*_mixS)(iloc,2)*sqr(_sb)) - (_vu*(*_mixS)(iloc,0)/_coup + _vd*(*_mixS)(iloc,1)/_coup)*_sb*_cb) +_lambda*_sb*_cb*2*(*_mixS)(iloc,2)*(_kappa*_s/rt + rt*_theAl) + sqr(_coup)*0.5*rt*sqr(_sw)/sqr(_cw)*((_vu*(*_mixS)(iloc,1)/_coup - _vd*(*_mixS)(iloc,0)/_coup)*sqr(_cb) + (_vd*(*_mixS)(iloc,0)/_coup - _vu*(*_mixS)(iloc,1)/_coup)*sqr(_sb)) + sqr(_coup)*0.5*rt*(_vu*((*_mixS)(iloc,1)*sqr(_cb) + (*_mixS)(iloc,1)*sqr(_sb) + 2.*(*_mixS)(iloc,0)*_cb*_sb)/_coup + _vd*((*_mixS)(iloc,0)*sqr(_cb) + (*_mixS)(iloc,0)*sqr(_sb) + 2.*(*_mixS)(iloc,1)*_sb*_cb)/_coup); cpl /= -_coup; - couplings[6] = make_pair(cpl*UnitRemoval::InvE,cpl*UnitRemoval::InvE); + couplings[6] = make_pair(Complex(cpl*UnitRemoval::InvE), + Complex(cpl*UnitRemoval::InvE)); // sbottoms double f1 = mb/_mw/_cb; complex f2 = 0.5*_mz/_cw* ( - _cb*(*_mixS)(iloc,0) + _sb*(*_mixS)(iloc,1)); for(unsigned int ix=0;ix<2;++ix) { cpl = -f2*( (1. - 2.*sqr(_sw)/3.)*(*_mixQb)(ix, 0)*(*_mixQb)(ix, 0) + 2.*sqr(_sw)*(*_mixQb)(ix, 1)*(*_mixQb)(ix, 1)/3.) - f1*mb*(*_mixS)(iloc,0) *((*_mixQb)(ix, 0)*(*_mixQb)(ix, 0) + (*_mixQb)(ix, 1)*(*_mixQb)(ix, 1)) - 0.5*f1*(-_lambdaVEV*(*_mixS)(iloc,1) - _lambda*_vu*(*_mixS)(iloc,2)/_coup + _triBt*(*_mixS)(iloc,0))*((*_mixQb)(ix, 1)*(*_mixQb)(ix, 0) + (*_mixQb)(ix, 0)*(*_mixQb)(ix, 1)); cpl *= 3.*sqr(_theSM->ed()); - couplings[7+ix] = make_pair(cpl*UnitRemoval::InvE,cpl*UnitRemoval::InvE); + couplings[7+ix] = make_pair(Complex(cpl*UnitRemoval::InvE),Complex(cpl*UnitRemoval::InvE)); } // stop f1 = mt/_mw/_sb; for(unsigned int ix=0;ix<2;++ix) { cpl =+f2*( (1. - 4.*sqr(_sw)/3.)*(*_mixQt)(ix, 0)*(*_mixQt)(ix, 0) + 4.*sqr(_sw)*(*_mixQt)(ix, 1)*(*_mixQt)(ix, 1)/3.) - f1*mt*(*_mixS)(iloc,1) *((*_mixQt)(ix, 0)*(*_mixQt)(ix, 0) + (*_mixQt)(ix, 1)*(*_mixQt)(ix, 1)) - 0.5*f1*(-_lambdaVEV*(*_mixS)(iloc,0) - _lambda*_vd*(*_mixS)(iloc,2)/_coup + _triTp*(*_mixS)(iloc,1))*((*_mixQt)(ix, 1)*(*_mixQt)(ix, 0) + (*_mixQt)(ix, 0)*(*_mixQt)(ix, 1)); cpl *= 3.*sqr(_theSM->eu()); - couplings[9+ix] = make_pair(cpl*UnitRemoval::InvE,cpl*UnitRemoval::InvE); + couplings[9+ix] = make_pair(Complex(cpl*UnitRemoval::InvE), + Complex(cpl*UnitRemoval::InvE)); } // sbottoms f1 = mtau/_mw/_cb; for(unsigned int ix=0;ix<2;++ix) { cpl = -f2*( (1. - 2.*sqr(_sw))*(*_mixLt)(ix, 0)*(*_mixLt)(ix, 0) + 2.*sqr(_sw)*(*_mixLt)(ix, 1)*(*_mixLt)(ix, 1)) - f1*mtau*(*_mixS)(iloc,0) *((*_mixLt)(ix, 0)*(*_mixLt)(ix, 0) + (*_mixLt)(ix, 1)*(*_mixLt)(ix, 1)) - 0.5*f1*(-_lambdaVEV*(*_mixS)(iloc,1) - _lambda*_vu*(*_mixS)(iloc,2)/_coup + _triTa*(*_mixS)(iloc,0))*((*_mixLt)(ix, 1)*(*_mixLt)(ix, 0) + (*_mixLt)(ix, 0)*(*_mixLt)(ix, 1)); cpl *= sqr(_theSM->ee()); - couplings[11+ix] = make_pair(cpl*UnitRemoval::InvE,cpl*UnitRemoval::InvE); + couplings[11+ix] = make_pair(Complex(cpl*UnitRemoval::InvE), + Complex(cpl*UnitRemoval::InvE)); } } // pseudoscalar higgs bosons else { // location of the higgs int iloc = (hid - 36)/10; // 2 particles in the loop setNParticles(5); Complex c(0.); // top quark couplings c = Complex(0., 1.)*1.5*sqr(_theSM->eu())* mt*(*_mixP)(iloc, 1)/_sb/_mw; couplings[0] = make_pair(c,-c); masses[0] = mt; // bottom quark couplings c = Complex(0., 1.)*1.5*sqr(_theSM->ed())* mb*(*_mixP)(iloc, 0)/_cb/_mw; couplings[1] = make_pair(c,-c); masses[1] = mb; // tau lepton couplings c = Complex(0., 1.)*0.5*sqr(_theSM->ee())*mtau*(*_mixP)(iloc, 0)/_cb/_mw; couplings[2] = make_pair(c,-c); masses[2] = mtau; // charginos for(unsigned int ic=0;ic<2;++ic) { c = Complex(0,-1.0)* (_lambda/_coup*rt*(*_mixP)(iloc,2)*(*_mixU)(ic,1)*(*_mixV)(ic,1) -rt*((*_mixP)(iloc,0)*(*_mixU)(ic,1)*(*_mixV)(ic,0) + (*_mixP)(iloc,1)*(*_mixU)(ic,0)*(*_mixV)(ic,1))); couplings[3+ic] = make_pair(-c,c); } } } if( _recalc ) { VVSLoopVertex::setCoupling(q2, p1, p2, p3); _recalc = false; } } diff --git a/Models/Susy/RPV/RPVFFSVertex.cc b/Models/Susy/RPV/RPVFFSVertex.cc --- a/Models/Susy/RPV/RPVFFSVertex.cc +++ b/Models/Susy/RPV/RPVFFSVertex.cc @@ -1,826 +1,826 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the RPVFFSVertex class. // #include "RPVFFSVertex.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.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; namespace { unsigned int neutralinoIndex(long id) { if(id> 1000000) return id<1000025 ? id-1000022 : (id-1000005)/10; else if(abs(id)<=16) return (abs(id)-4)/2; else return id-13; } unsigned int charginoIndex(long id) { return abs(id)>1000000 ? (abs(id)-1000024)/13 : (abs(id)-7)/2; } } RPVFFSVertex::RPVFFSVertex() : interactions_(0), mw_(ZERO), _q2last(ZERO), _couplast(0.), _leftlast(0.),_rightlast(0.), _id1last(0), _id2last(0), _id3last(0), yukawa_(true), _sw(0.), _cw(0.),_sb(0.), _cb(0.), vd_(ZERO), vu_(ZERO), _massLast(make_pair(ZERO,ZERO)) { orderInGem(1); orderInGs(0); colourStructure(ColourStructure::DELTA); } IBPtr RPVFFSVertex::clone() const { return new_ptr(*this); } IBPtr RPVFFSVertex::fullclone() const { return new_ptr(*this); } void RPVFFSVertex::doinit() { // cast the model to the RPV one model_ = dynamic_ptr_cast(generator()->standardModel()); if( !model_ ) throw InitException() << "RPVFFSVertex::doinit() - " << "The pointer to the MSSM object is null!" << Exception::abortnow; // get the various mixing matrices _stop = model_->stopMix(); _sbot = model_->sbottomMix(); _stau = model_->stauMix(); _nmix = model_->neutralinoMix(); _umix = model_->charginoUMix(); _vmix = model_->charginoVMix(); _mixH = model_->CPevenHiggsMix(); _mixP = model_->CPoddHiggsMix(); _mixC = model_->ChargedHiggsMix(); if(!_stop || !_sbot ) throw InitException() << "RPVFFSVertex::doinit() - " << "A squark mixing matrix pointer is null." << " stop: " << _stop << " sbottom: " << _sbot << Exception::abortnow; if(!_nmix) throw InitException() << "RPVFFSVertex::doinit() - " << "A gaugino mixing matrix pointer is null." << " N: " << _nmix << " U: " << _umix << " V: " << _vmix << Exception::abortnow; if(! ( _stau || (!_stau&& _mixC->size().first>1))) throw InitException() << "RPVFFSVertex::doinit() - " << "Must have either the stau mixing matrix or it" << " must be part of the charged Higgs boson mixing." << Exception::abortnow; // various interactions // scalar Higgs bosons vector h0(2); h0[0] = 25; h0[1] = 35; if(_mixH&&_mixH->size().first>2) { h0.push_back(1000012); h0.push_back(1000014); h0.push_back(1000016); } // pseudoscalar Higgs bosons vector a0(1,36); if(_mixP&&_mixP->size().first>1) { a0.push_back(1000017); a0.push_back(1000018); a0.push_back(1000019); } // charged Higgs bosons vector hp(1,37); if(_mixC->size().first>1) { hp.push_back(-1000011); hp.push_back(-1000013); hp.push_back(-1000015); hp.push_back(-2000011); hp.push_back(-2000013); hp.push_back(-2000015); } // neutralinos vector neu(4); neu[0] = 1000022; neu[1] = 1000023; neu[2] = 1000025; neu[3] = 1000035; if(_nmix->size().first>4) { if(model_->majoranaNeutrinos()) { neu.push_back(17); neu.push_back(18); neu.push_back(19); } else { neu.push_back(12); neu.push_back(14); neu.push_back(16); } } // charginos vector chg(2); chg[0] = 1000024; chg[1] = 1000037; if(_umix->size().first>2) { chg.push_back(-11); chg.push_back(-13); chg.push_back(-15); } // FFH if(interactions_==0||interactions_==1) { // quarks neutral scalar for ( unsigned int h = 0; h < h0.size(); ++h ) { for(long ix=1;ix<7;++ix) addToList(-ix,ix,h0[h]); } // quarks neutral pseudoscalar for ( unsigned int h = 0; h < a0.size(); ++h ) { for(long ix=1;ix<7;++ix) addToList(-ix,ix,a0[h]); } // quarks charged higgs for(unsigned int h=0;hsize().first<=4) { for(unsigned int h=0;hsize().first<=4) { for(unsigned int nl = 0; nl < neu.size(); ++nl) { for(long ix=12;ix<17;ix+=2) { addToList( neu[nl], ix, -(1000000+ix) ); addToList( neu[nl], -ix, (1000000+ix) ); } } } // charged leptons no mixing if(!_mixC || _mixC->size().first==1) { for(unsigned int nl = 0; nl < neu.size(); ++nl) { for(long ix=11;ix<17;ix+=2) { addToList( neu[nl], ix, -(1000000+ix) ); addToList( neu[nl], -ix, (1000000+ix) ); addToList( neu[nl], ix, -(2000000+ix) ); addToList( neu[nl], -ix, (2000000+ix) ); } } } } // chargino sfermion if(interactions_==0||interactions_==4) { //quarks for(unsigned int ic = 0; ic < chg.size(); ++ic) { for(long ix = 1; ix < 7; ++ix) { if( ix % 2 == 0 ) { addToList(-chg[ic], ix,-( 999999+ix)); addToList(-chg[ic], ix,-(1999999+ix)); addToList( chg[ic],-ix, 999999+ix ); addToList( chg[ic],-ix, 1999999+ix ); } else { addToList(-chg[ic],-ix, 1000001+ix ); addToList(-chg[ic],-ix, 2000001+ix ); addToList( chg[ic], ix,-(1000001+ix)); addToList( chg[ic], ix,-(2000001+ix)); } } } // sneutrinos if(!_mixH || _mixH->size().first<=2) { for(unsigned int ic = 0; ic < chg.size(); ++ic) { for(long ix = 11; ix < 17; ix+=2) { addToList(-chg[ic],-ix,1000001+ix); addToList(chg[ic],ix,-(1000001+ix)); } } } // charged leptons if(!_mixC || _mixC->size().first==1) { for(unsigned int ic = 0; ic < chg.size(); ++ic) { for(long ix = 12; ix < 17; ix+=2) { addToList(-chg[ic], ix,-( 999999+ix)); addToList(-chg[ic], ix,-(1999999+ix)); addToList( chg[ic],-ix, ( 999999+ix)); addToList( chg[ic],-ix, (1999999+ix)); } } } } FFSVertex::doinit(); // various couplings and parameters mw_ = getParticleData(ParticleID::Wplus)->mass(); _sw = sqrt(sin2ThetaW()); double tb = model_->tanBeta(); _cw = sqrt(1. - sqr(_sw)); _sb = tb/sqrt(1 + sqr(tb)); _cb = sqrt(1 - sqr(_sb)); vector vnu = model_->sneutrinoVEVs(); double g = electroMagneticCoupling(sqr(mw_))/_sw; Energy v = 2.*mw_/g; vd_ = sqrt((sqr(v)-sqr(vnu[0])-sqr(vnu[1])-sqr(vnu[2]))/ (1.+sqr(tb))); vu_ = vd_*tb; // couplings of the neutral scalar Higgs to charginos Energy me = model_->mass(sqr(mw_),getParticleData(ParticleID::eminus )); Energy mmu = model_->mass(sqr(mw_),getParticleData(ParticleID::muminus )); Energy mtau = model_->mass(sqr(mw_),getParticleData(ParticleID::tauminus)); double h_E[3] = {sqrt(2.)*me/vd_/g,sqrt(2.)*mmu /vd_/g,sqrt(2.)*mtau/vd_/g}; for(unsigned int ih=0;ih<_mixH->size().first;++ih ) { OCCHL_.push_back(vector > (_umix->size().first,vector(_umix->size().first,0.))); for(unsigned int i=0;i<_umix->size().first;++i) { for(unsigned int j=0;j<_umix->size().first;++j) { OCCHL_[ih][i][j] = -sqrt(0.5)* ( (*_mixH)(ih,0)*(*_vmix)(i,0)*(*_umix)(j,1) + (*_mixH)(ih,1)*(*_vmix)(i,1)*(*_umix)(j,0)); for(unsigned int k=2;k<_umix->size().first;++k) { OCCHL_[ih][i][j] -= sqrt(0.5)*(+(*_mixH)(ih,k)*(*_vmix)(i,0)*(*_umix)(j,k) +h_E[k-2]*(*_umix)(j,k)*(*_vmix)(i,k)*(*_mixH)(ih,0) -h_E[k-2]*(*_umix)(j,1)*(*_vmix)(i,k)*(*_mixH)(ih,k)); } } } } // couplings of the neutral scalar Higgs to neutralinos double tw = _sw/_cw; for(unsigned int ih=0;ih<_mixH->size().first;++ih) { ONNHL_.push_back(vector > (_nmix->size().first,vector(_nmix->size().first,0.))); for(unsigned int i=0;i<_nmix->size().first;++i) { for(unsigned int j=0;j<_nmix->size().first;++j) { ONNHL_[ih][i][j] =0.; for(unsigned int in=2;in<_nmix->size().first;++in) { double sign = in!=3 ? 1. : -1.; ONNHL_[ih][i][j] += 0.5*sign*(*_mixH)(ih,in-2)* ( + (tw*(*_nmix)(i,0) - (*_nmix)(i,1) )*(*_nmix)(j,in) + (tw*(*_nmix)(j,0) - (*_nmix)(j,1) )*(*_nmix)(i,in) ); } } } } // couplings of the neutral pseudoscalar Higgs to neutralinos for(unsigned int ih=0;ih<_mixP->size().first;++ih) { ONNAL_.push_back(vector > (_nmix->size().first,vector(_nmix->size().first,0.))); for(unsigned int i=0;i<_nmix->size().first;++i) { for(unsigned int j=0;j<_nmix->size().first;++j) { ONNAL_[ih][i][j] =0.; for(unsigned int in=2;in<_nmix->size().first;++in) { double sign = in!=3 ? 1. : -1.; ONNAL_[ih][i][j] += -0.5*sign*(*_mixP)(ih,in-2)* ( + (tw*(*_nmix)(i,0) - (*_nmix)(i,1) )*(*_nmix)(j,in) + (tw*(*_nmix)(j,0) - (*_nmix)(j,1) )*(*_nmix)(i,in) ); } } } } // couplings of the neutral pseudoscalar higgs to charginos for(unsigned int ih=0;ih<_mixP->size().first;++ih) { OCCAL_.push_back(vector > (_umix->size().first,vector(_umix->size().first,0.))); for(unsigned int i=0;i<_umix->size().first;++i) { for(unsigned int j=0;j<_umix->size().first;++j) { OCCAL_[ih][i][j] = (*_mixP)(ih,0)*(*_vmix)(i,0)*(*_umix)(j,1)+ (*_mixP)(ih,1)*(*_vmix)(i,1)*(*_umix)(j,0); for(unsigned int k=2;k<_umix->size().first;++k) { OCCAL_[ih][i][j] += (*_mixP)(ih,k)*(*_vmix)(i,0)*(*_umix)(j,k) -h_E[k-2]*(*_umix)(j,k)*(*_vmix)(i,k)*(*_mixP)(ih,0) +h_E[k-2]*(*_umix)(j,1)*(*_vmix)(i,k)*(*_mixP)(ih,k); } OCCAL_[ih][i][j] *= sqrt(0.5); } } } // couplings for the charged higgs for(unsigned int ih=0;ih<_mixC->size().first;++ih) { OCNSL_.push_back(vector > (_nmix->size().first,vector(_umix->size().first,0.))); OCNSR_.push_back(vector > (_nmix->size().first,vector(_umix->size().first,0.))); for(unsigned int i = 0; i < _nmix->size().first; ++i) { for(unsigned int j=0;j<_umix->size().first;++j) { OCNSL_[ih][i][j] = (*_mixC)(ih,1)*conj((*_nmix)(i, 3)*(*_vmix)(j,0) +((*_nmix)(i,1) + (*_nmix)(i,0)*tw)*(*_vmix)(j,1)/sqrt(2)); OCNSR_[ih][i][j] = (*_mixC)(ih,0)* ((*_nmix)(i, 2)*(*_umix)(j,0) -((*_nmix)(i,1) + (*_nmix)(i,0)*tw)*(*_umix)(j,1)/sqrt(2)); for(unsigned int k=2;k<_umix->size().first;++k) { OCNSL_[ih][i][j] += -h_E[k-2]*(*_mixC)(ih,0)*conj((*_nmix)(i,2+k)*(*_vmix)(j,k)) +(*_mixC)(ih,k )*h_E[k-2]*conj((*_nmix)(i, 2)*(*_vmix)(j,k)) +(*_mixC)(ih,k+3)*tw*sqrt(2.)*conj((*_nmix)(i,0)*(*_vmix)(j,k)); OCNSR_[ih][i][j] += (*_mixC)(ih,k)*((*_nmix)(i,2+k)*(*_umix)(j,0) -((*_nmix)(i,1) + (*_nmix)(i,0)*tw)*(*_umix)(j,k)/sqrt(2)) -(*_mixC)(ih,k+3)*h_E[k-2]*((*_nmix)(i,k+2)*(*_umix)(j,1)-(*_nmix)(i,2)*(*_umix)(j,k)); } } } } } void RPVFFSVertex::persistentOutput(PersistentOStream & os) const { os << interactions_ << _stop << _sbot << _stau << _umix << _vmix << _nmix << _mixH << _mixP << _mixC << ounit(mw_,GeV) << yukawa_ << model_ << _sw << _cw << _sb << _cb << ounit(vd_,GeV) << ounit(vu_,GeV) << OCCHL_ << ONNHL_ << ONNAL_ << OCCAL_ << OCNSL_ << OCNSR_; } void RPVFFSVertex::persistentInput(PersistentIStream & is, int) { is >> interactions_ >> _stop >> _sbot >> _stau >> _umix >> _vmix >> _nmix >> _mixH >> _mixP >> _mixC >> iunit(mw_,GeV) >> yukawa_ >> model_ >> _sw >> _cw >> _sb >> _cb >> iunit(vd_,GeV) >> iunit(vu_,GeV) >> OCCHL_ >> ONNHL_ >> ONNAL_ >> OCCAL_ >> OCNSL_ >> OCNSR_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigRPVFFSVertex("Herwig::RPVFFSVertex", "HwSusy.so HwRPV.so"); void RPVFFSVertex::Init() { static ClassDocumentation documentation ("The RPVFFSVertex class implements all the couplings of fermion-antiferion to scalars" " in R-Parity violating models, including sfermion fermion gaugino, SM ferimon antiferimon Higgs " "and gaugino-gaugino Higgs."); static Switch interfaceInteractions ("Interactions", "Whice interactions to include", &RPVFFSVertex::interactions_, 0, false, false); static SwitchOption interfaceInteractionsAll (interfaceInteractions, "All", "Include all the interactions", 0); static SwitchOption interfaceInteractionsHiggsSMFermions (interfaceInteractions, "HiggsSMFermions", "Interactions of Higgs with SM fermions", 1); static SwitchOption interfaceInteractionsHiggsGaugino (interfaceInteractions, "HiggsGaugino", "Interactions of the Higgs with the gauginos", 2); static SwitchOption interfaceInteractionsNeutralinoSfermion (interfaceInteractions, "NeutralinoSfermion", "Include the neutralino sfermion interactions", 3); static SwitchOption interfaceInteractionsCharginoSfermions (interfaceInteractions, "CharginoSfermions", "Include the chargino sfermion interactions", 4); static Switch interfaceYukawa ("Yukawa", "Whether or not to include the Yukawa type couplings in neutralino/chargino interactions", &RPVFFSVertex::yukawa_, true, false, false); static SwitchOption interfaceYukawaYes (interfaceYukawa, "Yes", "Include the terms", true); static SwitchOption interfaceYukawaNo (interfaceYukawa, "No", "Don't include them", false); } void RPVFFSVertex::neutralinoSfermionCoupling(Energy2 q2, tcPDPtr fermion, tcPDPtr gaugino, tcPDPtr sfermion) { long ism(abs(fermion->id())),ig(abs(gaugino->id())),isc(sfermion->id()); if( ig != _id1last || ism != _id2last || isc != _id3last ) { _id1last = ig; _id2last = ism; _id3last = isc; // sfermion mass eigenstate unsigned int alpha(abs(isc)/1000000 - 1); // neutralino state unsigned int nl = neutralinoIndex(ig); assert(nl<=6); // common primed neutralino matrices Complex n2prime = (*_nmix)(nl,1)*_cw - (*_nmix)(nl,0)*_sw; //handle neutrinos first if( ism == 12 || ism == 14 || ism == 16 ) { _leftlast = Complex(0., 0.); _rightlast = -sqrt(0.5)*n2prime/_cw; } else { Complex n1prime = (*_nmix)(nl,0)*_cw + (*_nmix)(nl,1)*_sw; tcPDPtr smf = getParticleData(ism); double qf = smf->charge()/eplus; Complex bracketl = qf*_sw*( conj(n1prime) - _sw*conj(n2prime)/_cw ); double y = yukawa_ ? double(model_->mass(q2, smf)/2./mw_) : 0.; double lambda(0.); //neutralino mixing element Complex nlf(0.); if( ism % 2 == 0 ) { y /= _sb; lambda = -0.5 + qf*sqr(_sw); nlf = (*_nmix)(nl,3); } else { y /= _cb; lambda = 0.5 + qf*sqr(_sw); nlf = (*_nmix)(nl,2); } Complex bracketr = _sw*qf*n1prime - n2prime*lambda/_cw; //heavy quarks/sleptons if( ism == 5 || ism == 6 || ism == 15 ) { Complex ma1(0.), ma2(0.); if( ism == 5 ) { ma1 = (*_sbot)(alpha,0); ma2 = (*_sbot)(alpha,1); } else if( ism == 6 ) { ma1 = (*_stop)(alpha,0); ma2 = (*_stop)(alpha,1); } else { ma1 = (*_stau)(alpha,0); ma2 = (*_stau)(alpha,1); } _leftlast = y*conj(nlf)*ma1 - ma2*bracketl; _rightlast = y*nlf*ma2 + ma1*bracketr; } else { if( alpha == 0 ) { _leftlast = y*conj(nlf); _rightlast = bracketr; } else { _leftlast = -bracketl; _rightlast = y*nlf; } } _leftlast *= -sqrt(2.); _rightlast *= -sqrt(2.); } } //determine the helicity order of the vertex if( fermion->id() < 0 ) { left (conj(_rightlast)); right(conj( _leftlast)); } else { left ( _leftlast); right(_rightlast); } norm(_couplast); } void RPVFFSVertex::charginoSfermionCoupling(Energy2 q2, tcPDPtr fermion, tcPDPtr gaugino, tcPDPtr sfermion) { long ism(abs(fermion->id())),ig(abs(gaugino->id())),isc(sfermion->id()); if( ig != _id1last || ism != _id2last || isc != _id3last ) { _id1last = ig; _id2last = ism; _id3last = isc; // sfermion mass eigenstate unsigned int alpha(abs(isc)/1000000 - 1); // get the type of chargino unsigned int ch = charginoIndex(ig); assert(ch<=4); // various mixing matrix elements Complex ul1 = (*_umix)(ch,0), ul2 = (*_umix)(ch,1); Complex vl1 = (*_vmix)(ch,0), vl2 = (*_vmix)(ch,1); // lepton/slepton if( ism >= 11 && ism <= 16 ) { long lept = ( ism % 2 == 0 ) ? ism - 1 : ism; double y = yukawa_ ? double(model_->mass(q2, getParticleData(lept))/mw_/sqrt(2)/_cb) : 0.; if( ism == 12 || ism == 14 ) { _leftlast = 0.; _rightlast = alpha == 0 ? - ul1 : y*ul2; } else if( ism == 16 ) { _leftlast = 0.; _rightlast = -ul1*(*_stau)(alpha, 0) + y*(*_stau)(alpha,1)*ul2; } else if( ism == 11 || ism == 13 || ism == 15 ) { _leftlast = y*conj(ul2); _rightlast = -vl1; } } // squark/quark else { double yd(0.), yu(0.); if(yukawa_) { if( ism % 2 == 0) { yu = model_->mass(q2, getParticleData(ism))/mw_/sqrt(2)/_sb; yd = model_->mass(q2, getParticleData(ism - 1))/mw_/sqrt(2)/_cb; } else { yu = model_->mass(q2, getParticleData(ism + 1))/mw_/sqrt(2)/_sb; yd = model_->mass(q2, getParticleData(ism))/mw_/sqrt(2)/_cb; } } //heavy quarks if( ism == 5 ) { _leftlast = yd*conj(ul2)*(*_stop)(alpha,0); _rightlast = -vl1*(*_stop)(alpha, 0) + yu*vl2*(*_stop)(alpha,1); } else if( ism == 6 ) { _leftlast = yu*conj(vl2)*(*_sbot)(alpha,0); _rightlast = -ul1*(*_sbot)(alpha, 0) + yd*ul2*(*_sbot)(alpha,1); } else { if( alpha == 0 ) { _leftlast = (ism % 2 == 0) ? yu*conj(vl2) : yd*conj(ul2); _rightlast = (ism % 2 == 0) ? -ul1 : -vl1; } else { _leftlast = 0.; _rightlast = (ism % 2 == 0) ? yd*ul2 : yu*vl2; } } } } //determine the helicity order of the vertex if( fermion->id() < 0 ) { left (conj(_rightlast)); right(conj( _leftlast)); } else { left ( _leftlast); right(_rightlast); } norm(_couplast); } void RPVFFSVertex::higgsFermionCoupling(Energy2 q2, tcPDPtr f1, tcPDPtr f2, tcPDPtr higgs) { long f1ID(f1->id()), f2ID(f2->id()), isc(higgs->id()); // running fermion masses if( q2 != _q2last || _id1last != f1ID) { _massLast.first = model_->mass(q2,f1); _id1last = f1ID; } if( q2 != _q2last || _id2last != f2ID) { _massLast.second = model_->mass(q2,f2); _id2last = f2ID; } if( q2 != _q2last) _id3last = isc; Complex fact(0.); // scalar neutral Higgs if(isc == ParticleID::h0 || isc == ParticleID::H0 || isc == ParticleID::SUSY_nu_eL || isc == ParticleID::SUSY_nu_muL || isc == ParticleID::SUSY_nu_tauL ) { unsigned int ih = isc < 1000000 ? (isc-25)/10 : (isc-1000008)/2; unsigned int id = abs(f1ID); - fact = -_massLast.first* - ((id%2==0) ? (*_mixH)(ih,1)/vu_ : (*_mixH)(ih,0)/vd_); + fact = -Complex(_massLast.first* + ((id%2==0) ? (*_mixH)(ih,1)/vu_ : (*_mixH)(ih,0)/vd_)); left (1.); right(1.); } // pseudoscalar neutral Higgs else if(isc == ParticleID::A0 || isc == 1000017 || isc == 1000018 || isc == 1000019 ) { unsigned int ih = isc < 1000000 ? 0 : (isc-1000016); unsigned int id = abs(f1ID); if(_mixP) { - fact = -Complex(0., 1.)*_massLast.first* - ( (id%2==0) ? (*_mixP)(ih,1)/vu_ : (*_mixP)(ih,0)/vd_); + fact = Complex(-Complex(0., 1.)*_massLast.first* + ( (id%2==0) ? (*_mixP)(ih,1)/vu_ : (*_mixP)(ih,0)/vd_)); } else { - fact = -Complex(0., 1.)*_massLast.first* - ( (id%2==0) ? _cb/vu_ : _sb/vd_); + fact = Complex(-Complex(0., 1.)*_massLast.first* + ( (id%2==0) ? _cb/vu_ : _sb/vd_)); } left ( 1.); right(-1.); } // charged higgs else { if(!_mixC) { if( abs(f1ID) % 2 == 0 ) { _leftlast = _massLast.first /vu_*_cb; _rightlast = _massLast.second/vd_*_sb; } else { _leftlast = _massLast.second/vu_*_cb; _rightlast = _massLast.first /vd_*_sb; } } else { unsigned int ih; if(abs(isc)==ParticleID::Hplus) { ih = 0; } else { isc *= -1; ih = abs(isc)<2000000 ? (abs(isc)-1000009)/2 : (abs(isc)-2000003)/2; } if( abs(f1ID) % 2 == 0 ) { - _leftlast = _massLast.first /vu_*(*_mixC)(ih,1); - _rightlast = _massLast.second/vd_*(*_mixC)(ih,0); + _leftlast = Complex(_massLast.first /vu_*(*_mixC)(ih,1)); + _rightlast = Complex(_massLast.second/vd_*(*_mixC)(ih,0)); } else { - _leftlast = _massLast.second/vu_*(*_mixC)(ih,1); - _rightlast = _massLast.first /vd_*(*_mixC)(ih,0); + _leftlast = Complex(_massLast.second/vu_*(*_mixC)(ih,1)); + _rightlast = Complex(_massLast.first /vd_*(*_mixC)(ih,0)); } } if( isc > 0 ) swap(_leftlast,_rightlast); fact = sqrt(2.); left ( _leftlast); right(_rightlast); } norm(fact); } void RPVFFSVertex::higgsGauginoCoupling(Energy2, tcPDPtr f1, tcPDPtr f2, tcPDPtr higgs) { long f1ID(f1->id()), f2ID(f2->id()), isc(higgs->id()); if( isc == _id3last && f1ID == _id1last && f2ID == _id2last ) { left ( _leftlast); right(_rightlast); } else { _id1last = f1ID; _id2last = f2ID; _id3last = isc; // scalar neutral Higgs if(isc == ParticleID::h0 || isc == ParticleID::H0 || isc == ParticleID::SUSY_nu_eL || isc == ParticleID::SUSY_nu_muL || isc == ParticleID::SUSY_nu_tauL ) { unsigned int ih = isc < 1000000 ? (isc-25)/10 : (isc-1000008)/2; // charginos if(f1->charged()) { unsigned int ei = charginoIndex(f1ID); unsigned int ej = charginoIndex(f2ID); if (ei< 2&&f1ID>0) swap(ei,ej); else if(ei>=2&&f1ID<0) swap(ei,ej); _rightlast = conj(OCCHL_[ih][ej][ei]); _leftlast = OCCHL_[ih][ei][ej] ; } // neutralinos else { unsigned int ei = neutralinoIndex(f1ID); unsigned int ej = neutralinoIndex(f2ID); _leftlast = conj(ONNHL_[ih][ej][ei]); _rightlast = ONNHL_[ih][ei][ej] ; } } // pseudoscalar neutral Higgs else if(isc == ParticleID::A0 || isc == 1000017 || isc == 1000018 || isc == 1000019 ) { unsigned int ih = isc < 1000000 ? 0 : (isc-1000016); // charginos if(f1->charged()) { unsigned int ei = charginoIndex(f1ID); unsigned int ej = charginoIndex(f2ID); if (ei< 2&&f1ID>0) swap(ei,ej); else if(ei>=2&&f1ID<0) swap(ei,ej); _rightlast = -Complex(0.,1.)*conj(OCCAL_[ih][ej][ei]); _leftlast = Complex(0.,1.)* OCCAL_[ih][ei][ej] ; } // neutralinos else { unsigned int ei = neutralinoIndex(f1ID); unsigned int ej = neutralinoIndex(f2ID); _leftlast = Complex(0.,1.)*conj(ONNAL_[ih][ej][ei]); _rightlast = -Complex(0.,1.)* ONNAL_[ih][ei][ej] ; } } // charged higgs else { unsigned int ih = abs(isc) < 1000000 ? 0 : (abs(isc) < 2000000 ? (abs(isc)-1000009)/2 : (abs(isc)-2000003)/2); long chg(f2ID), neu(f1ID); if(f1->charged()) swap(chg, neu); unsigned int ei = neutralinoIndex(neu); unsigned int ej = charginoIndex(chg); _leftlast = -OCNSL_[ih][ei][ej]; _rightlast = -OCNSR_[ih][ei][ej]; bool chargedSwap = abs(isc)<1000000 ? isc<0 : isc>0; if( chargedSwap ) { Complex tmp = _leftlast; _leftlast = conj(_rightlast); _rightlast = conj(tmp); } } left ( _leftlast); right(_rightlast); } norm(_couplast); } void RPVFFSVertex::setCoupling(Energy2 q2, tcPDPtr part1, tcPDPtr part2,tcPDPtr part3) { // overall normalisation if(q2!=_q2last || _couplast==0.) { _couplast = weakCoupling(q2); _q2last=q2; } long f1ID(part1->id()), f2ID(part2->id()), isc(abs(part3->id())); // squark quark if(part3->coloured()) { tcPDPtr smfermion = part1, gaugino = part2; if(gaugino->coloured()) swap(smfermion,gaugino); if(gaugino->charged()) charginoSfermionCoupling(q2,smfermion,gaugino,part3); else neutralinoSfermionCoupling(q2,smfermion,gaugino,part3); } // slepton/lepton without mixing else if((( isc >= 1000011 && isc <= 1000016) || ( isc >= 2000011 && isc <= 2000016)) && (!_mixC || _mixC->size().first<=1 || !_mixP || _mixP->size().first<=1 )) { tcPDPtr smfermion = part1, gaugino = part2; if(abs(gaugino->id())<1000000) swap(smfermion,gaugino); if(gaugino->charged()) charginoSfermionCoupling(q2,smfermion,gaugino,part3); else neutralinoSfermionCoupling(q2,smfermion,gaugino,part3); } // SM quarks and Higgs else if((abs(f1ID) <= 6 && abs(f2ID) <= 6) || ((abs(f1ID) >= 11 && abs(f1ID) <= 16) && (abs(f2ID) >= 11 && abs(f2ID) <= 16) && _umix->size().first==2) ) { higgsFermionCoupling(q2,part1,part2,part3); } // gauginos and the Higgs (general case for sleptons) else { higgsGauginoCoupling(q2,part1,part2,part3); } } diff --git a/Models/Susy/SSGVNVVertex.cc b/Models/Susy/SSGVNVVertex.cc --- a/Models/Susy/SSGVNVVertex.cc +++ b/Models/Susy/SSGVNVVertex.cc @@ -1,120 +1,120 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the SSGVNVVertex class. // #include "SSGVNVVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "MSSM.h" using namespace Herwig; SSGVNVVertex::SSGVNVVertex() : sw_(0.), cw_(0.), sb_(0.), cb_(0.), mz_(91.1876*GeV), MPlanck_(2.4e18*GeV) { orderInGem(1); orderInGs(0); colourStructure(ColourStructure::SINGLET); } IBPtr SSGVNVVertex::clone() const { return new_ptr(*this); } IBPtr SSGVNVVertex::fullclone() const { return new_ptr(*this); } void SSGVNVVertex::persistentOutput(PersistentOStream & os) const { os << sw_ << cw_ << sb_ << cb_ << ounit(mz_,GeV) << nmix_ << ounit(MPlanck_,GeV); } void SSGVNVVertex::persistentInput(PersistentIStream & is, int) { is >> sw_ >> cw_ >> sb_ >> cb_ >> iunit(mz_,GeV) >> nmix_ >> iunit(MPlanck_,GeV); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSSGVNVVertex("Herwig::SSGVNVVertex", "SSGVNVVertex.so"); void SSGVNVVertex::Init() { static ClassDocumentation documentation ("The SSGVNVVertex class implements the coupling of the gravitino" " to the neutralino and a photon or Z boson, or the gluino and gluon."); } void SSGVNVVertex::doinit() { long neu[4] = {ParticleID::SUSY_chi_10, ParticleID::SUSY_chi_20, ParticleID::SUSY_chi_30, ParticleID::SUSY_chi_40}; for(unsigned int j = 0; j < 4; ++j) { addToList(ParticleID::SUSY_Gravitino, neu[j], ParticleID::gamma); addToList(ParticleID::SUSY_Gravitino, neu[j], ParticleID::Z0); } addToList(ParticleID::SUSY_Gravitino, ParticleID::SUSY_g, ParticleID::g); RFVVertex::doinit(); tMSSMPtr model = dynamic_ptr_cast(generator()->standardModel()); if( !model ) throw InitException() << "SSGVNVVertex::doinit() - The pointer to the MSSM object is null!" << Exception::abortnow; double tanb = model->tanBeta(); sb_ = tanb/sqrt(1. + sqr(tanb)); cb_ = sqrt( 1. - sqr(sb_) ); sw_ = sqrt(sin2ThetaW()); cw_ = sqrt(1. - sin2ThetaW()); nmix_ = model->neutralinoMix(); MPlanck_ = model->MPlanck(); } void SSGVNVVertex::setCoupling(Energy2 , #ifndef NDEBUG tcPDPtr part1, #else tcPDPtr, #endif tcPDPtr part2,tcPDPtr part3) { assert(part1->id()==ParticleID::SUSY_Gravitino); assert(part3->iSpin()==PDT::Spin1); unsigned int neut = part2->id() - ParticleID::SUSY_chi_10; if(neut>1) neut = ( neut == 13 ) ? 3 : 2; int bid = part3->id(); Complex coup[2]; vector lV,rV; switch(bid) { case ParticleID::gamma : coup[0] = (*nmix_)(neut,0)*cw_+(*nmix_)(neut,1)*sw_; lV.push_back(-coup[0]*part2->mass()*UnitRemoval::InvE); lV.push_back( coup[0]); lV.push_back(0.); rV=lV; break; case ParticleID::Z0 : coup[0] = -(*nmix_)(neut,0)*sw_+(*nmix_)(neut,1)*cw_; coup[1] = -(*nmix_)(neut,2)*cb_+(*nmix_)(neut,3)*sb_; lV.push_back((-coup[0]*part2->mass()-mz_*coup[1])*UnitRemoval::InvE); lV.push_back( coup[0]); lV.push_back(0.); rV=lV; - rV[0] = (-coup[0]*part2->mass()+mz_*coup[1])*UnitRemoval::InvE; + rV[0] = Complex((-coup[0]*part2->mass()+mz_*coup[1])*UnitRemoval::InvE); break; case ParticleID::g : lV.push_back(-double(part2->mass()*UnitRemoval::InvE)); lV.push_back(1.); lV.push_back(0.); rV=lV; break; default : assert(false); } left (lV); right(rV); norm(double(1./MPlanck_*UnitRemoval::E)); } diff --git a/Models/Susy/SSHGGVertex.cc b/Models/Susy/SSHGGVertex.cc --- a/Models/Susy/SSHGGVertex.cc +++ b/Models/Susy/SSHGGVertex.cc @@ -1,293 +1,293 @@ // -*- C++ -*- // // SSHGGVertex.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the SSHGGVertex class. // #include "SSHGGVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/EnumParticles.h" #include "Herwig/Looptools/clooptools.h" #include using namespace ThePEG::Helicity; using namespace Herwig; SSHGGVertex::SSHGGVertex() : theIncludeTriLinear(true), thePseudoScalarTreatment(false), theSw(0.), theMw(), theZfact(), theQt1L(0.), theQt1R(0.), theQt1LR(0.), theQt2L(0.), theQt2R(0.), theQt2LR(0.), theQb1L(0.), theQb1R(0.), theQb1LR(0.), theQb2L(0.), theQb2R(0.), theQb2LR(0.), theSqmass(4,ZERO), theTanB(0.),theSinA(0.), theCosA(0.), theSinB(0.), theCosB(0.), theSinApB(0.), theCosApB(0.), theCouplast(0.), theq2last(), theHaveCoeff(false), theLastID(0) { orderInGs(2); orderInGem(1); colourStructure(ColourStructure::DELTA); } void SSHGGVertex::doinit() { //PDG codes for particles at vertices addToList(21,21,25); addToList(21,21,35); addToList(21,21,36); theMSSM = dynamic_ptr_cast(generator()->standardModel()); if( !theMSSM ) throw InitException() << "SSHGGVertex::doinit() - The pointer to the MSSM object is null!" << Exception::abortnow; theMw = getParticleData(ParticleID::Wplus)->mass(); thetop = getParticleData(ParticleID::t); thebot = getParticleData(ParticleID::b); theSw = sqrt(sin2ThetaW()); theZfact = getParticleData(ParticleID::Wplus)->mass()/(1. - sqr(theSw)); theSinA = sin(theMSSM->higgsMixingAngle()); theCosA = sqrt(1. - sqr(theSinA)); theTanB = theMSSM->tanBeta(); theSinB = theTanB/sqrt(1. + sqr(theTanB)); theCosB = sqrt( 1. - sqr(theSinB) ); theSinApB = theSinA*theCosB + theCosA*theSinB; theCosApB = theCosA*theCosB - theSinA*theSinB; MixingMatrixPtr stop = theMSSM->stopMix(); MixingMatrixPtr sbot = theMSSM->sbottomMix(); theQt1L = (*stop)(0,0)*(*stop)(0,0); theQt1R = (*stop)(0,1)*(*stop)(0,1); theQt1LR = (*stop)(0,1)*(*stop)(0,0) + (*stop)(0,1)*(*stop)(0,0); theQt2L = (*stop)(1,0)*(*stop)(1,0); theQt2R = (*stop)(1,1)*(*stop)(1,1); theQt2LR = (*stop)(1,1)*(*stop)(1,0) + (*stop)(1,0)*(*stop)(1,1); theQb1L = (*sbot)(0,0)*(*sbot)(0,0); theQb1R = (*sbot)(0,1)*(*sbot)(0,1); theQb1LR = (*sbot)(0,1)*(*sbot)(0,0) + (*sbot)(0,1)*(*sbot)(0,0); theQb2L = (*sbot)(1,0)*(*sbot)(1,0); theQb2R = (*sbot)(1,1)*(*sbot)(1,1); theQb2LR = (*sbot)(1,1)*(*sbot)(1,0) + (*sbot)(1,0)*(*sbot)(1,1); assert( theSqmass.size() == 4 ); theSqmass[0] = getParticleData(ParticleID::SUSY_b_1)->mass(); theSqmass[1] = getParticleData(ParticleID::SUSY_t_1)->mass(); theSqmass[2] = getParticleData(ParticleID::SUSY_b_2)->mass(); theSqmass[3] = getParticleData(ParticleID::SUSY_t_2)->mass(); VVSLoopVertex::doinit(); if(loopToolsInitialized()) Looptools::ltexi(); } void SSHGGVertex::persistentOutput(PersistentOStream & os) const { os << theMSSM << theSw << ounit(theMw,GeV) << ounit(theZfact,GeV) << theQt1L << theQt1R << theQt1LR << theQt2L << theQt2R << theQt2LR << theQb1L << theQb1R << theQb1LR << theQb2L << theQb2R << theQb2LR << thetop << thebot << theTanB << theIncludeTriLinear << theSinA << theCosA << theSinB << theCosB << theSinApB << theCosApB << ounit(theSqmass, GeV) << thePseudoScalarTreatment; } void SSHGGVertex::persistentInput(PersistentIStream & is, int) { is >> theMSSM >> theSw >> iunit(theMw,GeV) >> iunit(theZfact,GeV) >> theQt1L >> theQt1R >> theQt1LR >> theQt2L >> theQt2R >> theQt2LR >> theQb1L >> theQb1R >> theQb1LR >> theQb2L >> theQb2R >> theQb2LR >> thetop >> thebot >> theTanB >> theIncludeTriLinear >> theSinA >> theCosA >> theSinB >> theCosB >> theSinApB >> theCosApB >> iunit(theSqmass, GeV) >> thePseudoScalarTreatment; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSSHGGVertex("Herwig::SSHGGVertex", "HwSusy.so"); void SSHGGVertex::Init() { static ClassDocumentation documentation ("This class implements the higgs-gluon-gluon effective " "vertex in the MSSM including stop, sbottom and top quarks " "loops."); static Switch interfaceIncludeTriLinear ("IncludeTriLinear", "Whether or not to include the A term squark trilinear couplings", &SSHGGVertex::theIncludeTriLinear, true, false, false); static SwitchOption interfaceIncludeTriLinearYes (interfaceIncludeTriLinear, "Yes", "Include them", true); static SwitchOption interfaceIncludeTriLinearNo (interfaceIncludeTriLinear, "No", "Don't include them", false); static Switch interfacePseudoScalarTreatment ("PseudoScalarTreatment", "Whether to treat the pseudoscalar as pseudoscalar or scalar, for testing only", &SSHGGVertex::thePseudoScalarTreatment, false, false, false); static SwitchOption interfacePseudoScalarTreatmentPseudoScalar (interfacePseudoScalarTreatment, "PseudoScalar", "Treat as a pseudoscalar, the right physics", false); static SwitchOption interfacePseudoScalarTreatmentScalar (interfacePseudoScalarTreatment, "Scalar", "Treat as a scalar for testing", true); } void SSHGGVertex::setCoupling(Energy2 q2, tcPDPtr particle2, tcPDPtr particle3, tcPDPtr particle1) { long higgs(abs(particle1->id())); assert( higgs == ParticleID::h0 || higgs == ParticleID::H0 || higgs == ParticleID::A0 ); assert(particle2->id() == ParticleID::g && particle3->id() == ParticleID::g ); if( q2 != theq2last || theCouplast == 0. || higgs != theLastID ) { Looptools::clearcache(); theCouplast = weakCoupling(q2)*sqr(strongCoupling(q2)); Energy mt = theMSSM->mass(q2, thetop); Energy mb = theMSSM->mass(q2, thebot); masses.clear(); type.clear(); if( higgs == ParticleID::h0 || higgs == ParticleID::H0 ) { setNParticles(6); masses.insert(masses.begin(), theSqmass.begin(), theSqmass.end()); masses.push_back(mt); masses.push_back(mb); type.resize(6, PDT::Spin0); type[4] = PDT::Spin1Half; type[5] = PDT::Spin1Half; couplings.resize(6, make_pair(0., 0.)); complex brac1 = theZfact*(0.5 + theMSSM->ed()*sqr(theSw)); complex brac2 = theZfact*(0.5 - theMSSM->eu()*sqr(theSw)); complex brac3 = theZfact*theMSSM->ed()*sqr(theSw); complex brac4 = theZfact*theMSSM->eu()*sqr(theSw); Energy Trib=theMSSM->bottomTrilinear().real(); Energy Trit=theMSSM->topTrilinear().real(); Energy theMu = theMSSM->muParameter(); if( higgs == ParticleID::h0 ) { // lightest sbottom complex trilinear = theIncludeTriLinear ? theQb1LR*0.5*mb/theMw*(Trib*theSinA + theMu*theCosA)/theCosB : Energy(); Complex coup = 0.5*UnitRemoval::InvE* (theQb1L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + theQb1R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3)+trilinear); couplings[0] = make_pair(coup, coup); // lightest stop trilinear = theIncludeTriLinear ? -theQt1LR*0.5*mt/theMw*(Trit*theCosA + theMu*theSinA)/theSinB : Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQt1L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + - theQt1R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQt1L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + + theQt1R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4)+trilinear)); couplings[1] = make_pair(coup, coup); // heavier sbottom trilinear = theIncludeTriLinear ? theQb2LR*0.5*mb/theMw*(Trib*theSinA + theMu*theCosA)/theCosB : Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQb2L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + - theQb2R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQb2L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + + theQb2R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3)+trilinear)); couplings[2] = make_pair(coup, coup); // heavier stop trilinear = theIncludeTriLinear ? -theQt2LR*0.5*mt/theMw*(Trit*theCosA + theMu*theSinA)/theSinB : Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQt2L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + - theQt2R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQt2L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + + theQt2R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4)+trilinear)); couplings[3] = make_pair(coup, coup); // top coup = -0.25*(mt*theCosA/theMw/theSinB); couplings[4] = make_pair(coup, coup); // bottom coup = +0.25*(mb*theSinA/theMw/theCosB); couplings[5] = make_pair(coup, coup); } else { // lightest sbottom complex trilinear = theIncludeTriLinear ? theQb1LR*0.5*mb/theMw*(theMu*theSinA - Trib*theCosA)/theCosB: Energy(); Complex coup = 0.5*UnitRemoval::InvE* (theQb1L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + theQb1R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear); couplings[0] = make_pair(coup, coup); // lightest stop trilinear = theIncludeTriLinear ? -theQt1LR*0.5*mt/theMw*(-theMu*theCosA + Trit*theSinA)/theSinB: Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQt1L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + - theQt1R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQt1L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + + theQt1R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear)); couplings[1] = make_pair(coup, coup); // heavier sbottom trilinear = theIncludeTriLinear ? theQb2LR*0.5*mb/theMw*(theMu*theSinA - Trib*theCosA)/theCosB: Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQb2L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + - theQb2R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQb2L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + + theQb2R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear)); couplings[2] = make_pair(coup, coup); // heavier stop trilinear = theIncludeTriLinear ? -theQt2LR*0.5*mt/theMw*(-theMu*theCosA + Trit*theSinA)/theSinB: Energy(); - coup = 0.5*UnitRemoval::InvE* - (theQt2L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + - theQt2R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear); + coup = Complex(0.5*UnitRemoval::InvE* + (theQt2L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + + theQt2R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear)); couplings[3] = make_pair(coup, coup); // top coup = -0.25*mt*theSinA/theMw/theSinB; couplings[4] = make_pair(coup, coup); // bottom coup = -0.25*mb*theCosA/theMw/theCosB; couplings[5] = make_pair(coup, coup); } } else { setNParticles(2); masses.resize(2); couplings.resize(2); masses[0] = mt; masses[1] = mb; type.resize(2,PDT::Spin1Half); Complex coup = 0.25*Complex(0., 1.)*mt/theMw/theTanB; couplings[0] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); coup = 0.25*Complex(0., 1.)*mb/theMw*theTanB; couplings[1] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); } theq2last = q2; theLastID = higgs; theHaveCoeff = false; } norm(theCouplast); //calculate tensor coefficients if( !theHaveCoeff ) { VVSLoopVertex::setCoupling(q2, particle2, particle3, particle1); theHaveCoeff = true; } } diff --git a/Models/Susy/SSHPPVertex.cc b/Models/Susy/SSHPPVertex.cc --- a/Models/Susy/SSHPPVertex.cc +++ b/Models/Susy/SSHPPVertex.cc @@ -1,634 +1,634 @@ // -*- C++ -*- // // SSHPPVertex.cc is a part of Herwig - A multi-purpose Monte Carlo event generator // Copyright (C) 2002-2017 The Herwig Collaboration // // Herwig is licenced under version 3 of the GPL, see COPYING for details. // Please respect the MCnet academic guidelines, see GUIDELINES for details. // // // This is the implementation of the non-inlined, non-templated member // functions of the SSHPPVertex class. // #include "SSHPPVertex.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/EnumParticles.h" #include #include "Herwig/Looptools/clooptools.h" using namespace ThePEG::Helicity; using namespace Herwig; SSHPPVertex::SSHPPVertex() : theIncludeTriLinear(true), thePseudoScalarTreatment(false), theSw(0.), theMw(), theZfact(), theQt1L(0.), theQt1R(0.), theQt1LR(0.), theQt2L(0.), theQt2R(0.), theQt2LR(0.), theQb1L(0.), theQb1R(0.), theQb1LR(0.), theQb2L(0.), theQb2R(0.), theQb2LR(0.), theLt1L(0.), theLt1R(0.), theLt1LR(0.), theLt2L(0.), theLt2R(0.), theLt2LR(0.), theSfmass(6,ZERO), theTanB(0.),theSinA(0.), theCosA(0.), theSinB(0.), theCosB(0.), theSinApB(0.), theCosApB(0.), theSinBmA(0.), theCosBmA(0.), theCouplast(0.), theq2last(), theHaveCoeff(false), theLastID(0) { orderInGs(0); orderInGem(3); colourStructure(ColourStructure::SINGLET); } void SSHPPVertex::persistentOutput(PersistentOStream & os) const { os << theMSSM << theSw << ounit(theMw,GeV) << ounit(theZfact,GeV) << theQt1L << theQt1R << theQt1LR << theQt2L << theQt2R << theQt2LR << theQb1L << theQb1R << theQb1LR << theQb2L << theQb2R << theQb2LR << theLt1L << theLt1R << theLt1LR << theLt2L << theLt2R << theLt2LR << thetop << thebot << thetau << theTanB << theIncludeTriLinear << theSinA << theCosA << theSinB << theCosB << theSinApB << theCosApB << theSinBmA << theCosBmA << thePseudoScalarTreatment << ounit(theSfmass, GeV) << theU << theV; } void SSHPPVertex::persistentInput(PersistentIStream & is, int) { is >> theMSSM >> theSw >> iunit(theMw,GeV) >> iunit(theZfact,GeV) >> theQt1L >> theQt1R >> theQt1LR >> theQt2L >> theQt2R >> theQt2LR >> theQb1L >> theQb1R >> theQb1LR >> theQb2L >> theQb2R >> theQb2LR >> theLt1L >> theLt1R >> theLt1LR >> theLt2L >> theLt2R >> theLt2LR >> thetop >> thebot >> thetau >> theTanB >> theIncludeTriLinear >> theSinA >> theCosA >> theSinB >> theCosB >> theSinApB >> theCosApB >> theSinBmA >> theCosBmA >> thePseudoScalarTreatment >> iunit(theSfmass, GeV) >> theU >> theV; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSSHPPVertex("Herwig::SSHPPVertex", "HwSusy.so"); void SSHPPVertex::Init() { static ClassDocumentation documentation ("This class implements the higgs-gluon-gluon effective " "vertex in the MSSM including stop, sbottom and top quarks " "loops."); static Switch interfaceIncludeTriLinear ("IncludeTriLinear", "Whether or not to include the A term squark trilinear couplings", &SSHPPVertex::theIncludeTriLinear, true, false, false); static SwitchOption interfaceIncludeTriLinearYes (interfaceIncludeTriLinear, "Yes", "Include them", true); static SwitchOption interfaceIncludeTriLinearNo (interfaceIncludeTriLinear, "No", "Don't include them", false); static Switch interfacePseudoScalarTreatment ("PseudoScalarTreatment", "Whether to treat the pseudoscalar as pseudoscalar or scalar, for testing only", &SSHPPVertex::thePseudoScalarTreatment, false, false, false); static SwitchOption interfacePseudoScalarTreatmentPseudoScalar (interfacePseudoScalarTreatment, "PseudoScalar", "Treat as a pseudoscalar, the right physics", false); static SwitchOption interfacePseudoScalarTreatmentScalar (interfacePseudoScalarTreatment, "Scalar", "Treat as a scalar for testing", true); } void SSHPPVertex::setCoupling(Energy2 q2, tcPDPtr particle2, tcPDPtr particle3, tcPDPtr particle1) { long higgs(abs(particle1->id())); // check allowed assert ( higgs == ParticleID::h0 || higgs == ParticleID::H0 || higgs == ParticleID::A0 ); assert(particle2->id() == ParticleID::gamma && particle3->id() == ParticleID::gamma ); // couplings if( q2 != theq2last || theCouplast == 0. || higgs != theLastID ) { Looptools::clearcache(); theCouplast = sqr(electroMagneticCoupling(q2))*weakCoupling(q2); Energy mt = theMSSM->mass(q2, thetop); Energy mb = theMSSM->mass(q2, thebot); Energy mtau = theMSSM->mass(q2, thetau); masses.clear(); type.clear(); if( higgs == ParticleID::h0 || higgs == ParticleID::H0 ) { setNParticles(13); masses.insert(masses.begin(), theSfmass.begin(), theSfmass.end()); masses.push_back(mt); masses.push_back(mb); masses.push_back(mtau); masses.push_back(getParticleData(ParticleID::Hplus)->mass()); masses.push_back(theMw); masses.push_back(getParticleData(ParticleID::SUSY_chi_1plus)->mass()); masses.push_back(getParticleData(ParticleID::SUSY_chi_2plus)->mass()); type.resize(13, PDT::Spin0); type[6] = PDT::Spin1Half; type[7] = PDT::Spin1Half; type[8] = PDT::Spin1Half; type[9] = PDT::Spin0; type[10] = PDT::Spin1; type[11] = PDT::Spin1Half; type[12] = PDT::Spin1Half; couplings.resize(13, make_pair(0., 0.)); complex brac1 = theZfact*(0.5 + theMSSM->ed()*sqr(theSw)); complex brac2 = theZfact*(0.5 - theMSSM->eu()*sqr(theSw)); complex brac3 = theZfact*theMSSM->ed()*sqr(theSw); complex brac4 = theZfact*theMSSM->eu()*sqr(theSw); complex brac5 = theZfact*(0.5 + theMSSM->ee()*sqr(theSw)); complex brac6 = theZfact*theMSSM->ee()*sqr(theSw); Energy Trib=theMSSM->bottomTrilinear().real(); Energy Trit=theMSSM->topTrilinear().real(); Energy Trita=theMSSM->tauTrilinear().real(); Energy theMu = theMSSM->muParameter(); if( higgs == ParticleID::h0 ) { // lightest sbottom complex trilinear = theIncludeTriLinear ? theQb1LR*0.5*mb/theMw*(Trib*theSinA + theMu*theCosA)/theCosB : Energy(); Complex coup = 3.*UnitRemoval::InvE*sqr(theMSSM->ed())* (theQb1L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + theQb1R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3) + trilinear); couplings[0] = make_pair(coup, coup); // lightest stop trilinear = theIncludeTriLinear ? theQt1LR*0.5*mt/theMw*(Trit*theCosA + theMu*theSinA)/theSinB : Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->eu())* - (theQt1L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + - theQt1R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4) - - trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->eu())* + (theQt1L *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + + theQt1R *( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4) - + trilinear)); couplings[1] = make_pair(coup, coup); // lightest stau trilinear = theIncludeTriLinear ? theLt1LR*0.5*mtau/theMw*(Trita*theSinA + theMu*theCosA)/theCosB : Energy(); - coup = UnitRemoval::InvE*sqr(theMSSM->ee())* - (theLt1L *( sqr(mtau)*theSinA/theMw/theCosB - theSinApB*brac5) + - theLt1R *( sqr(mtau)*theSinA/theMw/theCosB + theSinApB*brac6) + - trilinear); + coup = Complex(UnitRemoval::InvE*sqr(theMSSM->ee())* + (theLt1L *( sqr(mtau)*theSinA/theMw/theCosB - theSinApB*brac5) + + theLt1R *( sqr(mtau)*theSinA/theMw/theCosB + theSinApB*brac6) + + trilinear)); couplings[2] = make_pair(coup, coup); // heavier sbottom trilinear = theIncludeTriLinear ? theQb2LR*0.5*mb/theMw*(Trib*theSinA + theMu*theCosA)/theCosB : Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->ed())* - (theQb2L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + - theQb2R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3) + - trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->ed())* + (theQb2L *( sqr(mb)*theSinA/theMw/theCosB - theSinApB*brac1) + + theQb2R *( sqr(mb)*theSinA/theMw/theCosB + theSinApB*brac3) + + trilinear)); couplings[3] = make_pair(coup, coup); // heavier stop trilinear = theIncludeTriLinear ? theQt2LR*0.5*mt/theMw*(Trit*theCosA + theMu*theSinA)/theSinB : Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->eu())* - (theQt2L*( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + - theQt2R*( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4) - - trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->eu())* + (theQt2L*( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac2) + + theQt2R*( - sqr(mt)*theCosA/theMw/theSinB + theSinApB*brac4) - + trilinear)); couplings[4] = make_pair(coup, coup); // heavier stau trilinear = theIncludeTriLinear ? theLt2LR*0.5*mtau/theMw*(Trita*theSinA + theMu*theCosA)/theCosB : Energy(); - coup = UnitRemoval::InvE*sqr(theMSSM->ee())* - (theLt2L *( sqr(mtau)*theSinA/theMw/theCosB - theSinApB*brac5) + - theLt2R *( sqr(mtau)*theSinA/theMw/theCosB + theSinApB*brac6)+ - trilinear); + coup = Complex(UnitRemoval::InvE*sqr(theMSSM->ee())* + (theLt2L *( sqr(mtau)*theSinA/theMw/theCosB - theSinApB*brac5) + + theLt2R *( sqr(mtau)*theSinA/theMw/theCosB + theSinApB*brac6)+ + trilinear)); couplings[5] = make_pair(coup, coup); // top coup = - 3.*mt*sqr(theMSSM->eu())*theCosA/2./theMw/theSinB; couplings[6] = make_pair(coup, coup); // bottom coup = 3.*mb*sqr(theMSSM->ed())*theSinA/2./theMw/theCosB; couplings[7] = make_pair(coup, coup); // tau coup = mtau*sqr(theMSSM->ee())*theSinA/2./theMw/theCosB; couplings[8] = make_pair(coup, coup); // charged higgs coup = - UnitRemoval::InvE*theMw*(theSinBmA + 0.5/(1.-sqr(theSw))* (sqr(theCosB)-sqr(theSinB))*theSinApB); couplings[9] = make_pair(coup, coup); // W boson coup = UnitRemoval::InvE*theMw*theSinBmA; couplings[10] = make_pair(coup, coup); // charginos for(unsigned int ix=0;ix<2;++ix) { Complex Q = sqrt(0.5)*(*theV)(ix,0)*(*theU)(ix,1); Complex S = sqrt(0.5)*(*theV)(ix,1)*(*theU)(ix,0); coup = Q*theSinA-S*theCosA; couplings[11+ix] = make_pair(conj(coup), coup); } } else { // lightest sbottom complex trilinear = theIncludeTriLinear ? theQb1LR*0.5*mb/theMw*(theMu*theSinA - Trib*theCosA)/theCosB: Energy(); Complex coup = 3.*UnitRemoval::InvE*sqr(theMSSM->ed())* (theQb1L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + theQb1R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear); couplings[0] = make_pair(coup, coup); // lightest stop trilinear = theIncludeTriLinear ? -theQt1LR*0.5*mt/theMw*(-theMu*theCosA + Trit*theSinA)/theSinB: Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->eu())* - (theQt1L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + - theQt1R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->eu())* + (theQt1L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + + theQt1R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear)); couplings[1] = make_pair(coup, coup); // lightest stau trilinear = theIncludeTriLinear ? theLt1LR*0.5*mtau/theMw*(theMu*theSinA - Trita*theCosA)/theCosB: Energy(); - coup = UnitRemoval::InvE*sqr(theMSSM->ee())* - (theLt1L *( - sqr(mtau)*theCosA/theMw/theCosB + theCosApB*brac5) + - theLt1R *( - sqr(mtau)*theCosA/theMw/theCosB - theCosApB*brac6)+trilinear); + coup = Complex(UnitRemoval::InvE*sqr(theMSSM->ee())* + (theLt1L *( - sqr(mtau)*theCosA/theMw/theCosB + theCosApB*brac5) + + theLt1R *( - sqr(mtau)*theCosA/theMw/theCosB - theCosApB*brac6)+trilinear)); couplings[2] = make_pair(coup, coup); // heavier sbottom trilinear = theIncludeTriLinear ? theQb2LR*0.5*mb/theMw*(theMu*theSinA - Trib*theCosA)/theCosB: Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->ed())* - (theQb2L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + - theQb2R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->ed())* + (theQb2L *( - sqr(mb)*theCosA/theMw/theCosB + theCosApB*brac1) + + theQb2R *( - sqr(mb)*theCosA/theMw/theCosB - theCosApB*brac3)+trilinear)); couplings[3] = make_pair(coup, coup); // heavier stop trilinear = theIncludeTriLinear ? -theQt2LR*0.5*mt/theMw*(-theMu*theCosA + Trit*theSinA)/theSinB: Energy(); - coup = 3.*UnitRemoval::InvE*sqr(theMSSM->eu())* - (theQt2L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + - theQt2R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear); + coup = Complex(3.*UnitRemoval::InvE*sqr(theMSSM->eu())* + (theQt2L *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac2) + + theQt2R *( - sqr(mt)*theSinA/theMw/theSinB - theCosApB*brac4)+trilinear)); couplings[4] = make_pair(coup, coup); // heavier stau trilinear = theIncludeTriLinear ? theLt2LR*0.5*mtau/theMw*(theMu*theSinA - Trita*theCosA)/theCosB: Energy(); - coup = UnitRemoval::InvE*sqr(theMSSM->ee())* - (theLt2L *( - sqr(mtau)*theCosA/theMw/theCosB + theCosApB*brac5) + - theLt2R *( - sqr(mtau)*theCosA/theMw/theCosB - theCosApB*brac6)+trilinear); + coup = Complex(UnitRemoval::InvE*sqr(theMSSM->ee())* + (theLt2L *( - sqr(mtau)*theCosA/theMw/theCosB + theCosApB*brac5) + + theLt2R *( - sqr(mtau)*theCosA/theMw/theCosB - theCosApB*brac6)+trilinear)); couplings[5] = make_pair(coup, coup); // top coup = -3.*mt*sqr(theMSSM->eu())*theSinA/2./theMw/theSinB; couplings[6] = make_pair(coup, coup); // bottom coup = -3.*mb*sqr(theMSSM->ed())*theCosA/2./theMw/theCosB; couplings[7] = make_pair(coup, coup); // tau coup = -mtau*sqr(theMSSM->ee())*theCosA/2./theMw/theCosB; couplings[8] = make_pair(coup, coup); // charged higgs coup = - UnitRemoval::InvE*theMw*(theCosBmA - 0.5/(1.-sqr(theSw))* (sqr(theCosB)-sqr(theSinB))*theCosApB); couplings[9] = make_pair(coup, coup); // W boson coup = UnitRemoval::InvE*theMw*theCosBmA; couplings[10] = make_pair(coup, coup); // charginos for(unsigned int ix=0;ix<2;++ix) { Complex Q = sqrt(0.5)*(*theV)(ix,0)*(*theU)(ix,1); Complex S = sqrt(0.5)*(*theV)(ix,1)*(*theU)(ix,0); coup = -Q*theCosA-S*theSinA; couplings[11+ix] = make_pair(conj(coup), coup); } } } else { setNParticles(5); masses.resize(5); couplings.resize(5); masses[0] = mt; masses[1] = mb; masses[2] = mtau; masses[3] = getParticleData(ParticleID::SUSY_chi_1plus)->mass(); masses[4] = getParticleData(ParticleID::SUSY_chi_2plus)->mass(); type.resize(5,PDT::Spin1Half); // top Complex coup = 3.*Complex(0., 1.)*sqr(theMSSM->eu())*mt/2./theMw/theTanB; couplings[0] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); // bottom coup = 3.*Complex(0., 1.)*sqr(theMSSM->ed())*mb/2./theMw*theTanB; couplings[1] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); // tau coup = Complex(0., 1.)*sqr(theMSSM->ee())*mtau/2./theMw*theTanB; couplings[2] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); // charginos for(unsigned int ix=0;ix<2;++ix) { Complex Q = sqrt(0.5)*(*theV)(ix,0)*(*theU)(ix,1); Complex S = sqrt(0.5)*(*theV)(ix,1)*(*theU)(ix,0); coup = - Complex(0., 1.)*(Q*theSinB+S*theCosB); couplings[3+ix] = make_pair(coup, thePseudoScalarTreatment ? coup : -coup); } } theq2last = q2; theLastID = higgs; theHaveCoeff = false; } norm(theCouplast); //calculate tensor coefficients if( !theHaveCoeff ) { VVSLoopVertex::setCoupling(q2, particle2, particle3, particle1); theHaveCoeff = true; } } // functions for loops for testing // namespace { // Complex F0(double tau) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return tau*(1.-tau*ft); // } // Complex FHalf(double tau,double eta) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return -2.*tau*(eta+(1.-tau*eta)*ft); // } // Complex F1(double tau) { // Complex ft; // if(tau>=1.) // ft = sqr(asin(1./sqrt(tau))); // else { // double etap = 1.+sqrt(1.-tau); // double etam = 1.-sqrt(1.-tau); // ft = -0.25*sqr(log(etap/etam)-Constants::pi*Complex(0.,1.)); // } // return 2.+3.*tau+3.*tau*(2.-tau)*ft; // } // } void SSHPPVertex::doinit() { //PDG codes for particles at vertices addToList(22,22,25); addToList(22,22,35); addToList(22,22,36); theMSSM = dynamic_ptr_cast(generator()->standardModel()); if( !theMSSM ) throw InitException() << "SSHPPVertex::doinit() - The pointer to the MSSM object is null!" << Exception::abortnow; theMw = getParticleData(ParticleID::Wplus)->mass(); thetop = getParticleData(ParticleID::t); thebot = getParticleData(ParticleID::b); thetau = getParticleData(ParticleID::tauminus); theSw = sqrt(sin2ThetaW()); theZfact = getParticleData(ParticleID::Wplus)->mass()/(1. - sqr(theSw)); theSinA = sin(theMSSM->higgsMixingAngle()); theCosA = sqrt(1. - sqr(theSinA)); theTanB = theMSSM->tanBeta(); theSinB = theTanB/sqrt(1. + sqr(theTanB)); theCosB = sqrt( 1. - sqr(theSinB) ); theSinApB = theSinA*theCosB + theCosA*theSinB; theCosApB = theCosA*theCosB - theSinA*theSinB; theSinBmA =-theSinA*theCosB + theCosA*theSinB; theCosBmA = theCosA*theCosB + theSinA*theSinB; MixingMatrix stop = *theMSSM->stopMix(); MixingMatrix sbot = *theMSSM->sbottomMix(); MixingMatrix stau = *theMSSM->stauMix(); theQt1L = stop(0,0)*stop(0,0); theQt1R = stop(0,1)*stop(0,1); theQt1LR = stop(0,1)*stop(0,0) + stop(0,1)*stop(0,0); theQt2L = stop(1,0)*stop(1,0); theQt2R = stop(1,1)*stop(1,1); theQt2LR = stop(1,1)*stop(1,0) + stop(1,0)*stop(1,1); theQb1L = sbot(0,0)*sbot(0,0); theQb1R = sbot(0,1)*sbot(0,1); theQb1LR = sbot(0,1)*sbot(0,0) + sbot(0,1)*sbot(0,0); theQb2L = sbot(1,0)*sbot(1,0); theQb2R = sbot(1,1)*sbot(1,1); theQb2LR = sbot(1,1)*sbot(1,0) + sbot(1,0)*sbot(1,1); theLt1L = stau(0,0)*stau(0,0); theLt1R = stau(0,1)*stau(0,1); theLt1LR = stau(0,1)*stau(0,0) + stau(0,1)*stau(0,0); theLt2L = stau(1,0)*stau(1,0); theLt2R = stau(1,1)*stau(1,1); theLt2LR = stau(1,1)*stau(1,0) + stau(1,0)*stau(1,1); theU = theMSSM->charginoUMix(); theV = theMSSM->charginoVMix(); assert( theSfmass.size() == 6 ); theSfmass[0] = getParticleData(ParticleID::SUSY_b_1)->mass(); theSfmass[1] = getParticleData(ParticleID::SUSY_t_1)->mass(); theSfmass[2] = getParticleData(ParticleID::SUSY_tau_1minus)->mass(); theSfmass[3] = getParticleData(ParticleID::SUSY_b_2)->mass(); theSfmass[4] = getParticleData(ParticleID::SUSY_t_2)->mass(); theSfmass[5] = getParticleData(ParticleID::SUSY_tau_2minus)->mass(); VVSLoopVertex::doinit(); // test calc of the width // for(unsigned int ix=0;ix<2;++ix) { // Energy mh = getParticleData(25+long(ix)*10)->mass(); // Energy mt = theMSSM->mass(sqr(mh ), thetop); // Energy mb = theMSSM->mass(sqr(mh ), thebot); // Energy mtau = theMSSM->mass(sqr(mh ), thetau); // Energy mhp = getParticleData(ParticleID::Hplus)->mass(); // Energy mc[2] = {getParticleData(ParticleID::SUSY_chi_1plus)->mass(), // getParticleData(ParticleID::SUSY_chi_2plus)->mass()}; // // sbottom // Complex rsb1,rsb2; // if(ix==0) { // rsb1 = // +theQb1L*(-sqr(mb/theMw)*(1.-sqr(theSw))*theSinA/theCosB // -(-0.5+sqr(theSw)/3.)*theSinApB) // +theQb1R*(-sqr(mb/theMw)*(1.-sqr(theSw))*theSinA/theCosB // +sqr(theSw)/3.*theSinApB); // rsb2 = // +theQb2L*(-sqr(mb/theMw)*(1.-sqr(theSw))*theSinA/theCosB // -(-0.5+sqr(theSw)/3.)*theSinApB) // +theQb2R*(-sqr(mb/theMw)*(1.-sqr(theSw))*theSinA/theCosB // +sqr(theSw)/3.*theSinApB); // } // else { // rsb1 = // +theQb1L*(+sqr(mb/theMw)*(1.-sqr(theSw))*theCosA/theCosB // +(-0.5+sqr(theSw)/3.)*theCosApB) // +theQb1R*(+sqr(mb/theMw)*(1.-sqr(theSw))*theCosA/theCosB // -sqr(theSw)/3.*theCosApB); // rsb2 = // +theQb2L*(+sqr(mb/theMw)*(1.-sqr(theSw))*theCosA/theCosB // +(-0.5+sqr(theSw)/3.)*theCosApB) // +theQb2R*(+sqr(mb/theMw)*(1.-sqr(theSw))*theCosA/theCosB // -sqr(theSw)/3.*theCosApB); // } // Complex Isb1 = 3.*sqr(1./3.)*rsb1*sqr(theMw/theSfmass[0])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[0]/mh)); // Complex Isb2 = 3.*sqr(1./3.)*rsb2*sqr(theMw/theSfmass[3])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[3]/mh)); // // stop // Complex rst1,rst2; // if(ix==0) { // rst1 = // +theQt1L*(+sqr(mt/theMw)*(1.-sqr(theSw))*theCosA/theSinB // -(+0.5-2.*sqr(theSw)/3.)*theSinApB) // +theQt1R*(+sqr(mt/theMw)*(1.-sqr(theSw))*theCosA/theSinB // -2.*sqr(theSw)/3.*theSinApB); // rst2 = // +theQt2L*(+sqr(mt/theMw)*(1.-sqr(theSw))*theCosA/theSinB // -(+0.5-2.*sqr(theSw)/3.)*theSinApB) // +theQt2R*(+sqr(mt/theMw)*(1.-sqr(theSw))*theCosA/theSinB // -2.*sqr(theSw)/3.*theSinApB); // } // else { // rst1 = // +theQt1L*(+sqr(mt/theMw)*(1.-sqr(theSw))*theSinA/theSinB // +(+0.5-2.*sqr(theSw)/3.)*theCosApB) // +theQt1R*(+sqr(mt/theMw)*(1.-sqr(theSw))*theSinA/theSinB // +2.*sqr(theSw)/3.*theCosApB); // rst2 = // +theQt2L*(+sqr(mt/theMw)*(1.-sqr(theSw))*theSinA/theSinB // +(+0.5-2.*sqr(theSw)/3.)*theCosApB) // +theQt2R*(+sqr(mt/theMw)*(1.-sqr(theSw))*theSinA/theSinB // +2.*sqr(theSw)/3.*theCosApB); // } // Complex Ist1 = 3.*sqr(2./3.)*rst1*sqr(theMw/theSfmass[1])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[1]/mh)); // Complex Ist2 = 3.*sqr(2./3.)*rst2*sqr(theMw/theSfmass[4])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[4]/mh)); // // stau // Complex rstau1,rstau2; // if(ix==0) { // rstau1 = // +theLt1L*(-sqr(mtau/theMw)*(1.-sqr(theSw))*theSinA/theCosB // -(-0.5+sqr(theSw))*theSinApB) // +theLt1R*(-sqr(mtau/theMw)*(1.-sqr(theSw))*theSinA/theCosB // +sqr(theSw)*theSinApB); // rstau2 = // +theLt2L*(-sqr(mtau/theMw)*(1.-sqr(theSw))*theSinA/theCosB // -(-0.5+sqr(theSw))*theSinApB) // +theLt2R*(-sqr(mtau/theMw)*(1.-sqr(theSw))*theSinA/theCosB // +sqr(theSw)*theSinApB); // } // else { // rstau1 = // +theLt1L*(+sqr(mtau/theMw)*(1.-sqr(theSw))*theCosA/theCosB // +(-0.5+sqr(theSw))*theCosApB) // +theLt1R*(+sqr(mtau/theMw)*(1.-sqr(theSw))*theCosA/theCosB // -sqr(theSw)*theCosApB); // rstau2 = // +theLt2L*(+sqr(mtau/theMw)*(1.-sqr(theSw))*theCosA/theCosB // +(-0.5+sqr(theSw))*theCosApB) // +theLt2R*(+sqr(mtau/theMw)*(1.-sqr(theSw))*theCosA/theCosB // -sqr(theSw)*theCosApB); // } // Complex Istau1 = rstau1*sqr(theMw/theSfmass[2])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[2]/mh)); // Complex Istau2 = rstau2*sqr(theMw/theSfmass[5])/(1.-sqr(theSw)) // *F0(sqr(2.*theSfmass[5]/mh)); // // charged higgs // Complex rh; // if(ix==0) { // rh = theSinBmA+0.5*(sqr(theCosB)-sqr(theSinB))*theSinApB/(1.-sqr(theSw)); // } // else { // rh = theCosBmA-0.5*(sqr(theCosB)-sqr(theSinB))*theCosApB/(1.-sqr(theSw)); // } // Complex Ih = rh*sqr(theMw/mhp)*F0(sqr(2.*mhp/mh)); // // W // Complex rw; // if(ix==0) { // rw = theSinBmA; // } // else { // rw = theCosBmA; // } // Complex IW = rw*F1(sqr(2.*theMw/mh)); // // top // Complex rt; // if(ix==0) { // rt = theCosA/theSinB; // } // else { // rt = theSinA/theSinB; // } // Complex Itop = 3.*sqr(2./3.)*rt*FHalf(sqr(2.*mt/mh),1.); // // bottom // Complex rb; // if(ix==0) { // rb =-theSinA/theCosB; // } // else { // rb = theCosA/theCosB; // } // Complex Ibot = 3.*sqr(1./3.)*rb*FHalf(sqr(2.*mb/mh),1.); // // tau // Complex rtau; // if(ix==0) { // rtau =-theSinA/theCosB; // } // else { // rtau = theCosA/theCosB; // } // Complex Itau = rtau*FHalf(sqr(2.*mtau/mh),1.); // // charginos // Complex rc[2],IC[2]; // for(unsigned int ic=0;ic<2;++ic) { // Complex Q = sqrt(0.5)*(*theV)(ic,0)*(*theU)(ic,1); // Complex S = sqrt(0.5)*(*theV)(ic,1)*(*theU)(ic,0); // if(ix==0) { // rc[ic] = 2.*(S*theCosA-Q*theSinA); // } // else { // rc[ic] = 2.*(S*theSinA+Q*theCosA); // } // IC[ic] = rc[ic]*FHalf(sqr(2.*mc[ic]/mh),1.)*theMw/mc[ic]; // } // Energy pre = sqr(mh/theMw)*mh/1024./pow(Constants::pi,3) // *sqr(weakCoupling(sqr(mh))*sqr(electroMagneticCoupling(sqr(mh)))/4./Constants::pi); // cerr << "testing lighter sbottom" << ix << " " // << pre*std::norm(Isb1)/GeV << "\n"; // cerr << "testing heavier sbottom" << ix << " " // << pre*std::norm(Istau2)/GeV << "\n"; // cerr << "testing lighter stop" << ix << " " // << pre*std::norm(Ist1)/GeV << "\n"; // cerr << "testing heavier stop" << ix << " " // << pre*std::norm(Ist2)/GeV << "\n"; // cerr << "testing lighter stau" << ix << " " // << pre*std::norm(Istau1)/GeV << "\n"; // cerr << "testing heavier stau" << ix << " " // << pre*std::norm(Isb2)/GeV << "\n"; // cerr << "testing top " << ix << " " // << pre*std::norm(Itop)/GeV << "\n"; // cerr << "testing bottom " << ix << " " // << pre*std::norm(Ibot)/GeV << "\n"; // cerr << "testing tau " << ix << " " // << pre*std::norm(Itau)/GeV << "\n"; // cerr << "testing higgs " << ix << " " // << pre*std::norm(Ih)/GeV << "\n"; // cerr << "testing W " << ix << " " // << pre*std::norm(IW)/GeV << "\n"; // cerr << "testing chi1 " << ix << " " // << pre*std::norm(IC[0])/GeV << "\n"; // cerr << "testing chi2 " << ix << " " // << pre*std::norm(IC[1])/GeV << "\n"; // cerr << "testing chi " << ix << " " // << pre*std::norm(IC[0]+IC[1])/GeV << "\n"; // cerr << "testing higgs width " << ix << " " // << pre*std::norm(Isb1+Isb2+Ist1+Ist2+Istau1+Istau2+ // Itop+Ibot+Itau+Ih+IW+IC[0]+IC[1])/GeV << "\n"; // } if(loopToolsInitialized()) Looptools::ltexi(); }