Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8308649
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
58 KB
Subscribers
None
View Options
diff --git a/Decay/WeakCurrents/FivePionCurrent.cc b/Decay/WeakCurrents/FivePionCurrent.cc
--- a/Decay/WeakCurrents/FivePionCurrent.cc
+++ b/Decay/WeakCurrents/FivePionCurrent.cc
@@ -1,770 +1,728 @@
// -*- C++ -*-
//
// FivePionCurrent.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 FivePionCurrent class.
//
#include "FivePionCurrent.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
using namespace Herwig;
using namespace ThePEG::Helicity;
FivePionCurrent::FivePionCurrent() {
// set the number of modes
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
setInitialModes(3);
// masses of the intermediates
_rhomass = 776*MeV;
_a1mass = 1260*MeV;
_omegamass = 782*MeV;
_sigmamass = 800*MeV;
// widths of the intermediates
_rhowidth = 150*MeV;
_a1width = 400*MeV;
_omegawidth = 8.5*MeV;
_sigmawidth = 600*MeV;
// use local values of the resonance parameters
_localparameters=true;
// include the rho Breit-Wigners in omega decay
_rhoomega = true;
// Normalisation parameters for the different currents
_c =4.*GeV2;
_c0=3.;
// various meson coupling constants
_fomegarhopi=0.07/MeV;
_grhopipi=6.0;
_garhopi=6.*GeV;
_faaf=4.*GeV;
_ffpipi=5.*GeV;
_presigma = ZERO;
_preomega = ZERO;
}
inline void FivePionCurrent::doinit() {
- WeakDecayCurrent::doinit();
+ WeakCurrent::doinit();
if(!_localparameters) {
_rhomass = getParticleData(ParticleID::rhominus)->mass();
_rhowidth = getParticleData(ParticleID::rhominus)->width();
_omegamass = getParticleData(ParticleID::omega)->mass();
_omegawidth = getParticleData(ParticleID::omega)->width();
_sigmamass = getParticleData(9000221)->mass();
_sigmawidth = getParticleData(9000221)->width();
_a1mass = getParticleData(ParticleID::a_1minus)->mass();
_a1width = getParticleData(ParticleID::a_1minus)->width();
}
// prefactors
_presigma = _c/sqr(sqr(_a1mass)*_sigmamass*_rhomass)*_faaf*_ffpipi*
_garhopi*_grhopipi;
_preomega = _c0*_fomegarhopi*sqr(_grhopipi/(sqr(_rhomass)*_omegamass));
}
void FivePionCurrent::persistentOutput(PersistentOStream & os) const {
static const InvEnergy7 InvGeV7 = pow<-7,1>(GeV);
static const InvEnergy3 InvGeV3 = pow<-3,1>(GeV);
os << ounit(_rhomass,GeV) << ounit(_a1mass,GeV) << ounit(_omegamass,GeV)
<< ounit(_sigmamass,GeV) << ounit(_rhowidth,GeV)
<< ounit(_a1width,GeV) << ounit(_omegawidth,GeV) << ounit(_sigmawidth,GeV)
<< _localparameters << ounit(_c,GeV2) << _c0
<< ounit(_fomegarhopi,1/GeV) << _grhopipi << ounit(_garhopi,GeV)
<< ounit(_faaf,GeV) << ounit(_ffpipi,GeV)
<< ounit(_preomega,InvGeV7) << ounit(_presigma,InvGeV3) << _rhoomega;
}
void FivePionCurrent::persistentInput(PersistentIStream & is, int) {
static const InvEnergy7 InvGeV7 = pow<-7,1>(GeV);
static const InvEnergy3 InvGeV3 = pow<-3,1>(GeV);
is >> iunit(_rhomass,GeV) >> iunit(_a1mass,GeV) >> iunit(_omegamass,GeV)
>> iunit(_sigmamass,GeV) >> iunit(_rhowidth,GeV)
>> iunit(_a1width,GeV) >> iunit(_omegawidth,GeV) >> iunit(_sigmawidth,GeV)
>> _localparameters >> iunit(_c,GeV2) >> _c0
>> iunit(_fomegarhopi,1/GeV) >> _grhopipi >> iunit(_garhopi,GeV)
>> iunit(_faaf,GeV) >> iunit(_ffpipi,GeV)
>> iunit(_preomega,InvGeV7) >> iunit(_presigma,InvGeV3) >> _rhoomega;
}
// The following static variable is needed for the type
// description system in ThePEG.
-DescribeClass<FivePionCurrent,WeakDecayCurrent>
+DescribeClass<FivePionCurrent,WeakCurrent>
describeHerwigFivePionCurrent("Herwig::FivePionCurrent", "HwWeakCurrents.so");
void FivePionCurrent::Init() {
static ClassDocumentation<FivePionCurrent> documentation
("The FivePionCurrent class implements the model of hep-ph/0602162",
"The model of \\cite{Kuhn:2006nw} was used for the hadronic five pion current.",
"\\bibitem{Kuhn:2006nw} J.~H.~Kuhn and Z.~Was, hep-ph/0602162, (2006).");
static Parameter<FivePionCurrent,Energy> interfaceRhoMass
("RhoMass",
"The mass of the rho meson",
&FivePionCurrent::_rhomass, MeV, 776*MeV, 500*MeV, 1000*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceA1Mass
("A1Mass",
"The mass of the a_1 meson",
&FivePionCurrent::_a1mass, MeV, 1260*MeV, 1000*MeV, 1500*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceOmegaMass
("OmegaMass",
"The mass of the omega meson",
&FivePionCurrent::_omegamass, MeV, 782*MeV, 600*MeV, 900*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceSigmaMass
("SigmaMass",
"The mass of the sigma meson",
&FivePionCurrent::_sigmamass, MeV, 800*MeV, 400*MeV, 1200*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceRhoWidth
("RhoWidth",
"The width of the rho meson",
&FivePionCurrent::_rhowidth, MeV, 150*MeV, 100*MeV, 300*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceA1Width
("A1Width",
"The width of the a_1 meson",
&FivePionCurrent::_a1width, MeV, 400*MeV, 100*MeV, 800*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceOmegaWidth
("OmegaWidth",
"The width of the omega meson",
&FivePionCurrent::_omegawidth, MeV, 8.5*MeV, 1.0*MeV, 20.0*MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceSigmaWidth
("SigmaWidth",
"The width of the sigma meson",
&FivePionCurrent::_sigmawidth, MeV, 600*MeV, 100*MeV, 1200*MeV,
false, false, Interface::limited);
static Switch<FivePionCurrent,bool> interfaceLocalParameters
("LocalParameters",
"Use local values of the meson masses and widths or those from the"
" ParticleData objects.",
&FivePionCurrent::_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);
static Switch<FivePionCurrent,bool> interfaceRhoOmega
("RhoOmega",
"Option for the treatment of the rho Breit-Wigners in the omega decay",
&FivePionCurrent::_rhoomega, true, false, false);
static SwitchOption interfaceRhoOmegaInclude
(interfaceRhoOmega,
"Yes",
"Include the rho Breit-Wigners",
true);
static SwitchOption interfaceRhoOmegaOmit
(interfaceRhoOmega,
"No",
"Don't include the rho Breit-Wigners",
false);
static Parameter<FivePionCurrent,Energy2> interfaceC
("C",
"The normalisation parameter for the a_1 sigma current",
&FivePionCurrent::_c, GeV2, 4.0*GeV2, 0.1*GeV2, 20.0*GeV2,
false, false, Interface::limited);
static Parameter<FivePionCurrent,double> interfaceC0
("C0",
"The normalisation constant for the omega-rho current",
&FivePionCurrent::_c0, 3., 0.1, 10.0,
false, false, Interface::limited);
static Parameter<FivePionCurrent,InvEnergy> interfacegomegarhopi
("fomegarhopi",
"The coupling of omega-rho-pi",
&FivePionCurrent::_fomegarhopi, 1./MeV, 0.07/MeV, 0.01/MeV, 0.2/MeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,double> interfacegrhopipi
("grhopipi",
"The coupling for rho-pi-pi",
&FivePionCurrent::_grhopipi, 6.0, 1.0, 20.0,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfacegarhopi
("garhopi",
"The coupling of a-rho-pi",
&FivePionCurrent::_garhopi, GeV, 6.0*GeV, 0.1*GeV, 20.0*GeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfacefaaf
("faaf",
"The coupling of a-a-f",
&FivePionCurrent::_faaf, GeV, 4.0*GeV, 0.1*GeV, 20.0*GeV,
false, false, Interface::limited);
static Parameter<FivePionCurrent,Energy> interfaceffpipi
("ffpipi",
"The coupling of f-pi-pi",
&FivePionCurrent::_ffpipi, GeV, 5.0*GeV, 0.1*GeV, 20.0*GeV,
false, false, Interface::limited);
}
bool FivePionCurrent::accept(vector<int> id) {
bool allowed(false);
// check five products
if(id.size()!=5){return false;}
int npiminus=0,npiplus=0,npi0=0;
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID:: piplus){++npiplus;}
else if(id[ix]==ParticleID::piminus){++npiminus;}
else if(id[ix]==ParticleID::pi0){++npi0;}
}
if(npiplus>npiminus) swap(npiplus,npiminus);
if( npiminus==3&&npiplus==2&&npi0==0) allowed=true;
else if(npiminus==2&&npiplus==1&&npi0==2) allowed=true;
else if(npiminus==1&&npiplus==0&&npi0==4) allowed=true;
return allowed;
}
-bool FivePionCurrent::createMode(int icharge, unsigned int imode,
- DecayPhaseSpaceModePtr mode,
+bool FivePionCurrent::createMode(int icharge, tcPDPtr resonance,
+ IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
+ unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,unsigned int ires,
- DecayPhaseSpaceChannelPtr phase,Energy upp) {
+ PhaseSpaceChannel phase, Energy upp ) {
// check the charge
if(abs(icharge)!=3) return false;
+ // check the total isospin
+ if(Itotal!=IsoSpin::IUnknown) {
+ if(Itotal!=IsoSpin::IOne) return false;
+ }
+ // check I_3
+ if(i3!=IsoSpin::I3Unknown) {
+ switch(i3) {
+ case IsoSpin::I3Zero:
+ return false;
+ break;
+ case IsoSpin::I3One:
+ if(icharge ==-3) return false;
+ break;
+ case IsoSpin::I3MinusOne:
+ if(icharge ==3) return false;
+ default:
+ return false;
+ }
+ }
// check that the modes are kinematical allowed
Energy min(ZERO);
// 3 pi- 2pi+
if(imode==0) {
min=5.*getParticleData(ParticleID::piplus)->mass();
}
// 2pi- pi+ 2pi0
else if(imode==1) {
min=3.*getParticleData(ParticleID::piplus)->mass()
+2.*getParticleData(ParticleID::pi0)->mass();
}
// pi- 4pi0
else {
min= getParticleData(ParticleID::piplus)->mass()
+4.*getParticleData(ParticleID::pi0)->mass();
}
if(min>upp) return false;
// intermediates for the channels
tPDPtr omega(getParticleData(ParticleID::omega)),rhop,rhom,
rho0(getParticleData(ParticleID::rho0)),a1m,a10(getParticleData(ParticleID::a_10)),
sigma(getParticleData(9000221));
if(icharge==3) {
rhop = getParticleData(ParticleID::rhominus);
rhom = getParticleData(ParticleID::rhoplus);
a1m = getParticleData(ParticleID::a_1plus);
}
else {
rhop = getParticleData(ParticleID::rhoplus);
rhom = getParticleData(ParticleID::rhominus);
a1m = getParticleData(ParticleID::a_1minus);
}
- DecayPhaseSpaceChannelPtr newchannel;
+ if(resonance && resonance !=a1m) return false;
// all charged mode
if(imode==0) {
if(sigma) {
// 1st two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+1,
+ ires+4,iloc+2,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1,a1m ,ires+3,rho0 ,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+3));
// 2nd two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+4, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+1,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+5,
+ ires+4,iloc+2,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+1,
+ ires+1,a1m ,ires+3,rho0 ,ires+3,iloc+2,
+ ires+4,iloc+5,ires+4,iloc+3));
// 3rd two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+4, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+2,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+1,
+ ires+4,iloc+5,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+4,ires+2,iloc+2,
+ ires+1,a1m ,ires+3,rho0 ,ires+3,iloc+5,
+ ires+4,iloc+1,ires+4,iloc+3));
// 4th two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+1, iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+3);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+5,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+1,
+ ires+4,iloc+2,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+5,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+4));
// 5th two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+1, iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+4, iloc+3);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+1,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+5,
+ ires+4,iloc+2,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+1,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+2,
+ ires+4,iloc+5,ires+4,iloc+4));
// 6th two a_1 sigma channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rho0 ,0,0.0, iloc+4, iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+3);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+2,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+1,
+ ires+4,iloc+5,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma ,ires+2,iloc+3,ires+2,iloc+2,
+ ires+1,a1m ,ires+3, rho0 ,ires+3,iloc+5,
+ ires+4,iloc+1,ires+4,iloc+4));
}
}
// 2 neutral mode
else if(imode==1) {
// first three omega channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+2);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+1);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rhop ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1,omega,ires+3, rho0,ires+3,iloc+3,
+ ires+4,iloc+1,ires+4,iloc+2));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1,omega,ires+3, rhop,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1,omega,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+2,ires+4,iloc+3));
// second three omega channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+2);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rhop ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+4);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+5,
+ ires+1,omega,ires+3, rho0,ires+3,iloc+3,
+ ires+4,iloc+1,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+5,
+ ires+1,omega,ires+3, rhop,ires+3,iloc+4,
+ ires+4,iloc+1,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+5,
+ ires+1,omega,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+4,ires+4,iloc+3));
// third three omega channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+1);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rhop ,0,0.0, iloc , iloc+4);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+4);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+3,
+ ires+1,omega,ires+3, rho0,ires+3,iloc+5,
+ ires+4,iloc+1,ires+4,iloc+2));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+3,
+ ires+1,omega,ires+3, rhop,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+5));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+4,ires+2,iloc+3,
+ ires+1,omega,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+2,ires+4,iloc+5));
// fourth three omega channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rhop ,0,0.0, iloc , iloc+4);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- newchannel->addIntermediate(omega ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+4);
- mode->addChannel(newchannel);
- // first two sigma a_1 channels
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+3,
+ ires+1,omega,ires+3, rho0,ires+3,iloc+5,
+ ires+4,iloc+1,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+3,
+ ires+1,omega,ires+3, rhop,ires+3,iloc+4,
+ ires+4,iloc+1,ires+4,iloc+5));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, rhom,ires+2,iloc+2,ires+2,iloc+3,
+ ires+1,omega,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+4,ires+4,iloc+5));
if(sigma) {
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+4);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- mode->addChannel(newchannel);
+ // first two sigma a_1 channels
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+1,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+3,
+ ires+4,iloc+4,ires+4,iloc+5));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+1,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+5,
+ ires+4,iloc+4,ires+4,iloc+3));
// second two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+3);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+2);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+4);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+3);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+1,ires+2,iloc+4,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+3,
+ ires+4,iloc+2,ires+4,iloc+5));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+1,ires+2,iloc+4,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+5,
+ ires+4,iloc+2,ires+4,iloc+3));
// third two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+3);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+2, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rho0 ,0,0.0, iloc , iloc+1);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+3,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rho0,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+4));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1,sigma,ires+2,iloc+3,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rho0,ires+3,iloc+4,
+ ires+4,iloc+1,ires+4,iloc+2));
}
}
// 4 neutral mode
else {
if(sigma) {
// 1st two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rhom ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
- // 2nd two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+4, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc );
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+2,
+ ires+4,iloc+1,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+2,ires+4,iloc+3));
+ // // 2nd two sigma a_1 channels
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+1,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+2,
+ ires+4,iloc+5,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+1,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+5,
+ ires+4,iloc+2,ires+4,iloc+3));
// 3rd two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+1);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+1, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+1,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+2,
+ ires+4,iloc+4,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+1,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+4,
+ ires+4,iloc+2,ires+4,iloc+3));
// 4th two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+1, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rhom ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+1, iloc+4);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+2,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+4,
+ ires+4,iloc+1,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+2,ires+2,iloc+5,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+4,ires+4,iloc+3));
// 5th two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rhom ,0,0.0, iloc , iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc+3, iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc );
- newchannel->addIntermediate(rhom ,0,0.0, iloc+4, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+5,
+ ires+4,iloc+1,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+4,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+1,
+ ires+4,iloc+5,ires+4,iloc+3));
// 6th two sigma a_1 channels
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+3);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+4, iloc+2);
- mode->addChannel(newchannel);
- newchannel=new_ptr(DecayPhaseSpaceChannel(*phase));
- newchannel->addIntermediate(a1m ,0,0.0,-ires-1,-ires-2);
- newchannel->addIntermediate(sigma ,0,0.0, iloc , iloc+1);
- newchannel->addIntermediate(a1m ,0,0.0,-ires-3, iloc+4);
- newchannel->addIntermediate(rhom ,0,0.0, iloc+3, iloc+2);
- mode->addChannel(newchannel);
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+1,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+4,
+ ires+4,iloc+5,ires+4,iloc+3));
+ mode->addChannel((PhaseSpaceChannel(phase),ires,a1m,
+ ires+1, sigma,ires+2,iloc+1,ires+2,iloc+2,
+ ires+1, a1m,ires+3, rhom,ires+3,iloc+5,
+ ires+4,iloc+4,ires+4,iloc+3));
}
}
// reset the parameters of the resonances if using local values
if(_localparameters) {
mode->resetIntermediate(rhom,_rhomass,_rhowidth);
mode->resetIntermediate(rhop,_rhomass,_rhowidth);
mode->resetIntermediate(rho0,_rhomass,_rhowidth);
mode->resetIntermediate(omega,_omegamass,_omegawidth);
mode->resetIntermediate(a1m,_a1mass,_a1width);
mode->resetIntermediate(a10,_a1mass,_a1width);
if(sigma) mode->resetIntermediate(sigma,_sigmamass,_sigmawidth);
}
// return if successful
return true;
}
// the particles produced by the current
tPDVector FivePionCurrent::particles(int icharge, unsigned int imode,int,int) {
// particle data objects for the pions
tPDPtr piplus (getParticleData(ParticleID::piplus ));
tPDPtr pi0 (getParticleData(ParticleID::pi0 ));
tPDPtr piminus(getParticleData(ParticleID::piminus));
if(icharge==3) swap(piplus,piminus);
tPDVector output(5);
// all charged
if(imode==0) {
output[0]=piminus;
output[1]=piminus;
output[2]=piplus;;
output[3]=piplus;
output[4]=piminus;
}
// two neutral
else if(imode==1) {
output[0]=piplus;
output[1]=piminus;
output[2]=pi0;;
output[3]=piminus;
output[4]=pi0;
}
// four neutral
else {
output[0]=pi0;
output[1]=pi0;
output[2]=piminus;;
output[3]=pi0;
output[4]=pi0;
}
return output;
}
// the decay mode
unsigned int FivePionCurrent::decayMode(vector<int> idout) {
unsigned int npi(0);
for(unsigned int ix=0;ix<idout.size();++ix) {
if(abs(idout[ix])==ParticleID::pi0) ++npi;
}
return npi/2;
}
// output the information for the database
void FivePionCurrent::dataBaseOutput(ofstream & output,bool header,bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::FivePionCurrent " << name()
<< " HwWeakCurrents.so\n";
output << "newdef " << name() << ":RhoMass " << _rhomass/MeV << "\n";
output << "newdef " << name() << ":A1Mass " << _a1mass/MeV << "\n";
output << "newdef " << name() << ":SigmaMass " << _sigmamass/MeV << "\n";
output << "newdef " << name() << ":OmegaMass " << _omegamass/MeV << "\n";
output << "newdef " << name() << ":RhoWidth " << _rhowidth/MeV << "\n";
output << "newdef " << name() << ":A1Width " << _a1width/MeV << "\n";
output << "newdef " << name() << ":SigmaWidth " << _sigmawidth/MeV << "\n";
output << "newdef " << name() << ":OmegaWidth " << _omegawidth/MeV << "\n";
output << "newdef " << name() << ":LocalParameters " << _localparameters << "\n";
output << "newdef " << name() << ":RhoOmega " << _rhoomega << "\n";
output << "newdef " << name() << ":C " << _c/GeV2 << "\n";
output << "newdef " << name() << ":C0 " << _c0 << "\n";
output << "newdef " << name() << ":fomegarhopi " <<_fomegarhopi*MeV << "\n";
output << "newdef " << name() << ":grhopipi " <<_grhopipi << "\n";
output << "newdef " << name() << ":garhopi " << _garhopi/GeV << "\n";
output << "newdef " << name() << ":faaf " <<_faaf/GeV << "\n";
output << "newdef " << name() << ":ffpipi " << _ffpipi/GeV << "\n";
- WeakDecayCurrent::dataBaseOutput(output,false,false);
+ WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";\n";
}
+void FivePionCurrent::constructSpinInfo(ParticleVector decay) const {
+ for(unsigned int ix=0;ix<decay.size();++ix)
+ ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true);
+}
+
vector<LorentzPolarizationVectorE>
-FivePionCurrent::current(const int imode,const int ichan,
- Energy & scale,const ParticleVector & decay,
- DecayIntegrator::MEOption meopt) const {
+FivePionCurrent::current(tcPDPtr,
+ IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
+ const int imode, const int ichan,Energy & scale,
+ const tPDVector & outgoing,
+ const vector<Lorentz5Momentum> & momenta,
+ DecayIntegrator2::MEOption) const {
+ // check the isospin
+ if(Itotal!=IsoSpin::IUnknown && Itotal!=IsoSpin::IOne)
+ return vector<LorentzPolarizationVectorE>();
+ int icharge = outgoing[0]->iCharge()+outgoing[1]->iCharge();
+ // check I_3
+ if(i3!=IsoSpin::I3Unknown) {
+ switch(i3) {
+ case IsoSpin::I3Zero:
+ return vector<LorentzPolarizationVectorE>();
+ break;
+ case IsoSpin::I3One:
+ if(icharge ==-3) return vector<LorentzPolarizationVectorE>();
+ break;
+ case IsoSpin::I3MinusOne:
+ if(icharge ==3) return vector<LorentzPolarizationVectorE>();
+ default:
+ return vector<LorentzPolarizationVectorE>();
+ }
+ }
useMe();
- if(meopt==DecayIntegrator::Terminate) {
- for(unsigned int ix=0;ix<5;++ix)
- ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true);
- return vector<LorentzPolarizationVectorE>(1,LorentzPolarizationVectorE());
- }
LorentzVector<complex<InvEnergy2> > output;
- Lorentz5Momentum q1(decay[0]->momentum());
- Lorentz5Momentum q2(decay[1]->momentum());
- Lorentz5Momentum q3(decay[2]->momentum());
- Lorentz5Momentum q4(decay[3]->momentum());
- Lorentz5Momentum q5(decay[4]->momentum());
+ Lorentz5Momentum q1(momenta[0]);
+ Lorentz5Momentum q2(momenta[1]);
+ Lorentz5Momentum q3(momenta[2]);
+ Lorentz5Momentum q4(momenta[3]);
+ Lorentz5Momentum q5(momenta[4]);
// total momentum
Lorentz5Momentum Q(q1+q2+q3+q4+q5);
Q.rescaleMass();
scale=Q.mass();
// decide which decay mode
if(imode==0) {
if(ichan<0) {
output=
a1SigmaCurrent(0,Q,q1,q2,q3,q4,q5)+
a1SigmaCurrent(0,Q,q5,q2,q3,q4,q1)+
a1SigmaCurrent(0,Q,q1,q5,q3,q4,q2)+
a1SigmaCurrent(0,Q,q1,q2,q4,q3,q5)+
a1SigmaCurrent(0,Q,q5,q2,q4,q3,q1)+
a1SigmaCurrent(0,Q,q1,q5,q4,q3,q2);
}
else if(ichan==0 ) output=a1SigmaCurrent(2,Q,q1,q2,q3,q4,q5);
else if(ichan==1 ) output=a1SigmaCurrent(1,Q,q1,q2,q3,q4,q5);
else if(ichan==2 ) output=a1SigmaCurrent(2,Q,q5,q2,q3,q4,q1);
else if(ichan==3 ) output=a1SigmaCurrent(1,Q,q5,q2,q3,q4,q1);
else if(ichan==4 ) output=a1SigmaCurrent(2,Q,q1,q5,q3,q4,q2);
else if(ichan==5 ) output=a1SigmaCurrent(1,Q,q1,q5,q3,q4,q2);
else if(ichan==6 ) output=a1SigmaCurrent(2,Q,q1,q2,q4,q3,q5);
else if(ichan==7 ) output=a1SigmaCurrent(1,Q,q1,q2,q4,q3,q5);
else if(ichan==8 ) output=a1SigmaCurrent(2,Q,q5,q2,q4,q3,q1);
else if(ichan==9 ) output=a1SigmaCurrent(1,Q,q5,q2,q4,q3,q1);
else if(ichan==10) output=a1SigmaCurrent(2,Q,q1,q5,q4,q3,q2);
else if(ichan==11) output=a1SigmaCurrent(1,Q,q1,q5,q4,q3,q2);
// identical particle symmetry factor
output/=sqrt(12.);
}
else if(imode==1) {
if(ichan<0) {
output=
rhoOmegaCurrent(0,Q,q1,q2,q3,q4,q5)
+rhoOmegaCurrent(0,Q,q1,q4,q3,q2,q5)
+rhoOmegaCurrent(0,Q,q1,q2,q5,q4,q3)
+rhoOmegaCurrent(0,Q,q1,q4,q5,q2,q3)
+a1SigmaCurrent(0,Q,q2,q4,q1,q3,q5)
+a1SigmaCurrent(0,Q,q3,q5,q2,q1,q4)
+a1SigmaCurrent(0,Q,q3,q5,q4,q1,q2);
}
else if(ichan==0 ) output=rhoOmegaCurrent(3,Q,q1,q2,q3,q4,q5);
else if(ichan==1 ) output=rhoOmegaCurrent(2,Q,q1,q2,q3,q4,q5);
else if(ichan==2 ) output=rhoOmegaCurrent(1,Q,q1,q2,q3,q4,q5);
else if(ichan==3 ) output=rhoOmegaCurrent(3,Q,q1,q4,q3,q2,q5);
else if(ichan==4 ) output=rhoOmegaCurrent(2,Q,q1,q4,q3,q2,q5);
else if(ichan==5 ) output=rhoOmegaCurrent(1,Q,q1,q4,q3,q2,q5);
else if(ichan==6 ) output=rhoOmegaCurrent(3,Q,q1,q2,q5,q4,q3);
else if(ichan==7 ) output=rhoOmegaCurrent(2,Q,q1,q2,q5,q4,q3);
else if(ichan==8 ) output=rhoOmegaCurrent(1,Q,q1,q2,q5,q4,q3);
else if(ichan==9 ) output=rhoOmegaCurrent(3,Q,q1,q4,q5,q2,q3);
else if(ichan==10) output=rhoOmegaCurrent(2,Q,q1,q4,q5,q2,q3);
else if(ichan==11) output=rhoOmegaCurrent(1,Q,q1,q4,q5,q2,q3);
else if(ichan==12) output=a1SigmaCurrent(2,Q,q3,q5,q4,q1,q2);
else if(ichan==13) output=a1SigmaCurrent(1,Q,q3,q5,q4,q1,q2);
else if(ichan==14) output=a1SigmaCurrent(2,Q,q3,q5,q2,q1,q4);
else if(ichan==15) output=a1SigmaCurrent(1,Q,q3,q5,q2,q1,q4);
else if(ichan==16) output=a1SigmaCurrent(2,Q,q2,q4,q1,q3,q5);
else if(ichan==17) output=a1SigmaCurrent(1,Q,q2,q4,q1,q3,q5);
// identical particle symmetry factor
output/=2.;
}
else if(imode==2) {
if(ichan<0) {
output=
a1SigmaCurrent(0,Q,q1,q2,q3,q4,q5)+
a1SigmaCurrent(0,Q,q5,q2,q3,q4,q1)+
a1SigmaCurrent(0,Q,q2,q4,q3,q1,q5)+
a1SigmaCurrent(0,Q,q1,q4,q3,q2,q5)+
a1SigmaCurrent(0,Q,q1,q5,q3,q4,q2)+
a1SigmaCurrent(0,Q,q4,q5,q3,q1,q2);
}
else if(ichan==0 ) output=a1SigmaCurrent(1,Q,q1,q2,q3,q4,q5);
else if(ichan==1 ) output=a1SigmaCurrent(2,Q,q1,q2,q3,q4,q5);
else if(ichan==2 ) output=a1SigmaCurrent(1,Q,q5,q2,q3,q4,q1);
else if(ichan==3 ) output=a1SigmaCurrent(2,Q,q5,q2,q3,q4,q1);
else if(ichan==4 ) output=a1SigmaCurrent(2,Q,q2,q4,q3,q1,q5);
else if(ichan==5 ) output=a1SigmaCurrent(1,Q,q2,q4,q3,q1,q5);
else if(ichan==6 ) output=a1SigmaCurrent(1,Q,q1,q4,q3,q2,q5);
else if(ichan==7 ) output=a1SigmaCurrent(2,Q,q1,q4,q3,q2,q5);
else if(ichan==8 ) output=a1SigmaCurrent(1,Q,q1,q5,q3,q4,q2);
else if(ichan==9 ) output=a1SigmaCurrent(2,Q,q1,q5,q3,q4,q2);
else if(ichan==10) output=a1SigmaCurrent(2,Q,q4,q5,q3,q1,q2);
else if(ichan==11) output=a1SigmaCurrent(1,Q,q4,q5,q3,q1,q2);
// identical particle symmetry factor
output/=sqrt(24.);
}
else {
throw DecayIntegratorError() << "Unknown decay mode in the "
<< "FivePionCurrent::"
<< "hadronCurrent()" << Exception::abortnow;
}
// normalise and return the current
return vector<LorentzPolarizationVectorE>(1, output * pow<3,1>(scale));
}
diff --git a/Decay/WeakCurrents/FivePionCurrent.h b/Decay/WeakCurrents/FivePionCurrent.h
--- a/Decay/WeakCurrents/FivePionCurrent.h
+++ b/Decay/WeakCurrents/FivePionCurrent.h
@@ -1,408 +1,428 @@
// -*- C++ -*-
//
// FivePionCurrent.h 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.
//
#ifndef HERWIG_FivePionCurrent_H
#define HERWIG_FivePionCurrent_H
//
// This is the declaration of the FivePionCurrent class.
//
-#include "WeakDecayCurrent.h"
+#include "WeakCurrent.h"
#include "ThePEG/Helicity/epsilon.h"
namespace Herwig {
using namespace ThePEG;
/**
* Here is the documentation of the FivePionCurrent class.
*
* @see \ref FivePionCurrentInterfaces "The interfaces"
* defined for FivePionCurrent.
*/
-class FivePionCurrent: public WeakDecayCurrent {
+class FivePionCurrent: public WeakCurrent {
public:
/**
* The default constructor.
*/
FivePionCurrent();
/** @name Methods for the construction of the phase space integrator. */
//@{
/**
* Complete the construction of the decay mode for integration.classes inheriting
* from this one.
- * @param icharge The total charge of the outgoing particles in the current.
- * @param imode The mode in the current being asked for.
- * @param mode The phase space mode for the integration
- * @param iloc The location of the of the first particle from the current in
- * the list of outgoing particles.
- * @param ires The location of the first intermediate for the current.
- * @param phase The prototype phase space channel for the integration.
- * @param upp The maximum possible mass the particles in the current are
- * allowed to have.
+ * This method is purely virtual and must be implemented in the classes inheriting
+ * from WeakCurrent.
+ * @param icharge The total charge of the outgoing particles in the current.
+ * @param resonance If specified only include terms with this particle
+ * @param Itotal If specified the total isospin of the current
+ * @param I3 If specified the thrid component of isospin
+ * @param imode The mode in the current being asked for.
+ * @param mode The phase space mode for the integration
+ * @param iloc The location of the of the first particle from the current in
+ * the list of outgoing particles.
+ * @param ires The location of the first intermediate for the current.
+ * @param phase The prototype phase space channel for the integration.
+ * @param upp The maximum possible mass the particles in the current are
+ * allowed to have.
* @return Whether the current was sucessfully constructed.
*/
- virtual bool createMode(int icharge,unsigned int imode,DecayPhaseSpaceModePtr mode,
+ virtual bool createMode(int icharge, tcPDPtr resonance,
+ IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
+ unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,unsigned int ires,
- DecayPhaseSpaceChannelPtr phase,Energy upp);
+ PhaseSpaceChannel phase, Energy upp );
/**
* The particles produced by the current.
* @param icharge The total charge of the particles in the current.
* @param imode The mode for which the particles are being requested
* @param iq The PDG code for the quark
* @param ia The PDG code for the antiquark
* @return The external particles for the current.
*/
virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
//@}
/**
* Hadronic current. This method is purely virtual and must be implemented in
* all classes inheriting from this one.
+ * @param resonance If specified only include terms with this particle
+ * @param Itotal If specified the total isospin of the current
+ * @param I3 If specified the thrid component of isospin
* @param imode The mode
* @param ichan The phase-space channel the current is needed for.
* @param scale The invariant mass of the particles in the current.
- * @param decay The decay products
+ * @param outgoing The particles produced in the decay
+ * @param momenta The momenta of the particles produced in the decay
* @param meopt Option for the calculation of the matrix element
* @return The current.
*/
- virtual vector<LorentzPolarizationVectorE>
- current(const int imode,const int ichan,Energy & scale,
- const ParticleVector & decay, DecayIntegrator::MEOption meopt) const;
+ virtual vector<LorentzPolarizationVectorE>
+ current(tcPDPtr resonance,
+ IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
+ const int imode, const int ichan,Energy & scale,
+ const tPDVector & outgoing,
+ const vector<Lorentz5Momentum> & momenta,
+ DecayIntegrator2::MEOption meopt) const;
+
+ /**
+ * Construct the SpinInfo for the decay products
+ */
+ void constructSpinInfo(ParticleVector decay) const;
/**
* Accept the decay.
* @param id The id's of the particles in the current.
* @return Can this current have the external particles specified.
*/
virtual bool accept(vector<int> id);
/**
* Return the decay mode number for a given set of particles in the current.
* @param id The id's of the particles in the current.
* @return The number of the mode
*/
virtual unsigned int decayMode(vector<int> id);
/**
* Output the setup information for the particle database
* @param os The stream to output the information to
* @param header Whether or not to output the information for MySQL
* @param create Whether or not to add a statement creating the object
*/
virtual void dataBaseOutput(ofstream & os,bool header,bool create) 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:
/**
* Methods to calculate the Breit-Wigner distributions for the various
* mesons.
*/
//@{
/**
* Breit-Wigner for the \f$\rho\f$.
* @param scale The virtual mass
*/
Complex rhoBreitWigner(Energy2 scale) const {
Energy2 m2=sqr(_rhomass);
return m2/(m2-scale-Complex(0.,1.)*_rhomass*_rhowidth);
}
/**
* Breit-Wigner for the \f$a_1\f$.
* @param scale The virtual mass
*/
Complex a1BreitWigner(Energy2 scale) const {
Energy2 m2=sqr(_a1mass);
return m2/(m2-scale-Complex(0.,1.)*_a1mass*_a1width);
}
/**
* Breit-Wigner for the \f$\omega\f$.
* @param scale The virtual mass
*/
Complex omegaBreitWigner(Energy2 scale) const {
Energy2 m2=sqr(_omegamass);
return m2/(m2-scale-Complex(0.,1.)*_omegamass*_omegawidth);
}
/**
* Breit-Wigner for the \f$\sigma\f$.
* @param scale The virtual mass
*/
Complex sigmaBreitWigner(Energy2 scale) const {
Energy2 m2=sqr(_sigmamass);
return m2/(m2-scale-Complex(0.,1.)*_sigmamass*_sigmawidth);
}
//@}
/**
* Currents for the different channels
*/
//@{
/**
* The \f$\rho\omega\f$ current
* @param iopt Option for the inclusion of \f$\rho\f$ Breit-Wigner terms in the
* \f$\omega\f$ decay piece
* @param Q The total momentum for the current
* @param q1 The first momentum
* @param q2 The first momentum
* @param q3 The first momentum
* @param q4 The first momentum
* @param q5 The first momentum
*/
LorentzVector<complex<InvEnergy2> >
rhoOmegaCurrent(unsigned int iopt,
const Lorentz5Momentum & Q,
const Lorentz5Momentum & q1,
const Lorentz5Momentum & q2,
const Lorentz5Momentum & q3,
const Lorentz5Momentum & q4,
const Lorentz5Momentum & q5) const {
// prefactor
complex<InvEnergy7> pre(_preomega*a1BreitWigner(Q.m2())*
omegaBreitWigner((q1+q2+q3).m2())*
rhoBreitWigner((q4+q5).m2()));
// omega piece
Complex omega(-1.);
if(_rhoomega) {
if(iopt==1) omega=rhoBreitWigner((q2+q3).m2());
else if(iopt==2) omega=rhoBreitWigner((q1+q3).m2());
else if(iopt==3) omega=rhoBreitWigner((q1+q2).m2());
else
omega=rhoBreitWigner((q2+q3).m2())+rhoBreitWigner((q1+q3).m2())+
rhoBreitWigner((q1+q2).m2());
}
LorentzVector<complex<Energy3> > omegacurrent(Helicity::epsilon(q1,q2,q3));
LorentzVector<complex<InvEnergy2> > output =
pre * omega * Helicity::epsilon(q4-q5,omegacurrent,Q);
return output;
}
/**
* The \f$a_1\sigma\f$ current
* @param iopt Option for the inclusion of \f$\rho\f$ Breit-Wigner terms in the
* \f$a_1\f$ decay piece
* @param Q The total momentum for the current
* @param q1 The first momentum
* @param q2 The first momentum
* @param q3 The first momentum
* @param q4 The first momentum
* @param q5 The first momentum
*/
LorentzVector<complex<InvEnergy2> >
a1SigmaCurrent(unsigned int iopt,
const Lorentz5Momentum & Q,
const Lorentz5Momentum & q1,
const Lorentz5Momentum & q2,
const Lorentz5Momentum & q3,
const Lorentz5Momentum & q4,
const Lorentz5Momentum & q5) const {
Lorentz5Momentum pa1(q1+q2+q3);pa1.rescaleMass();
Energy2 ma12(pa1.m2());
complex<InvEnergy3> pre(_presigma*a1BreitWigner(Q.m2())*a1BreitWigner(ma12)*
sigmaBreitWigner((q4+q5).m2()));
Energy2 pdot[2]={q2*(q1-q3),q1*(q2-q3)};
LorentzPolarizationVectorE rho[2] =
{(pdot[0]/ma12*pa1-q1+q3)*rhoBreitWigner((q1+q3).m2()),
(pdot[1]/ma12*pa1-q2+q3)*rhoBreitWigner((q2+q3).m2())};
LorentzPolarizationVectorE total;
if(iopt==1) total = rho[0];
else if(iopt==2) total = rho[1];
else total = rho[0]+rho[1];
Complex qdot = total * Q / Q.m2();
LorentzPolarizationVectorE cq(Q);
cq = cq * qdot;
cq -= total;
return pre * cq;
}
//@}
protected:
/** @name Clone Methods. */
//@{
/**
* Make a simple clone of this object.
* @return a pointer to the new object.
*/
virtual IBPtr clone() const {return new_ptr(*this);}
/** 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 {return new_ptr(*this);}
//@}
protected:
/** @name Standard Interfaced functions. */
//@{
/**
* Initialize this object after the setup phase before saving an
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
//@}
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
FivePionCurrent & operator=(const FivePionCurrent &);
private:
/**
* The masses and widths of the intermediate particles
*/
//@{
/**
* The mass of the \f$\rho\f$ for the current.
*/
Energy _rhomass;
/**
* The mass of the \f$a_1\f$ for the current.
*/
Energy _a1mass;
/**
* The mass of the \f$\omega\f$ for the current.
*/
Energy _omegamass;
/**
* The mass of the \f$\sigma\f$ for the current.
*/
Energy _sigmamass;
/**
* The width for the \f$\rho\f$.
*/
Energy _rhowidth;
/**
* The \f$a_1\f$ width
*/
Energy _a1width;
/**
* The \f$\omega\f$ width.
*/
Energy _omegawidth;
/**
* The \f$\sigma\f$ width.
*/
Energy _sigmawidth;
//@}
/**
* use local values of the particle masses
*/
bool _localparameters;
/**
* Option for the treatment of \f$\rho\f$ Breit-Wigners in \f$\omega\f$ decay
*/
bool _rhoomega;
/**
* Normalisation parameters for the different currents
*/
//@{
/**
* The \f$c\f$ parameter
*/
Energy2 _c;
/**
* The \f$c_0\f$ parameter
*/
double _c0;
/**
* The \f$f_{\omega\rho\pi}\f$ parameter
*/
InvEnergy _fomegarhopi;
/**
* The \f$g_{\rho\pi\pi}\f$ parameter
*/
double _grhopipi;
/**
* The \f$G_{a\rho\pi}\f$ parameter
*/
Energy _garhopi;
/**
* The \f$f_{aaf}\f$ parameter
*/
Energy _faaf;
/**
* The \f$f_{f\pi\pi}\f$ parameter
*/
Energy _ffpipi;
//@}
/**
* Values cached to avoid unnessacary calculations
*/
//@{
/**
* Prefactor for the \f$\rho\omega\f$ current
*/
InvEnergy7 _preomega;
/**
* Prefactor for the \f$a_1\sigma\f$ current
*/
InvEnergy3 _presigma;
//@}
};
}
#endif /* HERWIG_FivePionCurrent_H */
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Dec 21, 12:45 PM (1 d, 21 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4022814
Default Alt Text
(58 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment