Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7879065
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
67 KB
Subscribers
None
View Options
diff --git a/Decay/VectorMeson/VectorMesonVectorPScalarDecayer.cc b/Decay/VectorMeson/VectorMesonVectorPScalarDecayer.cc
--- a/Decay/VectorMeson/VectorMesonVectorPScalarDecayer.cc
+++ b/Decay/VectorMeson/VectorMesonVectorPScalarDecayer.cc
@@ -1,472 +1,474 @@
// -*- C++ -*-
//
// VectorMesonVectorPScalarDecayer.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 VectorMesonVectorPScalarDecayer class.
//
#include "VectorMesonVectorPScalarDecayer.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/PDT/DecayMode.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/ParVector.h"
#include "ThePEG/Helicity/VectorSpinInfo.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
using namespace Herwig;
using namespace ThePEG::Helicity;
void VectorMesonVectorPScalarDecayer::doinitrun() {
DecayIntegrator::doinitrun();
if(initialize()) {
for(unsigned int ix=0;ix<_incoming.size();++ix) {
if(mode(ix)) _maxweight[ix] = mode(ix)->maxWeight();
}
}
}
void VectorMesonVectorPScalarDecayer::doinit() {
DecayIntegrator::doinit();
// check consistency 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 "
<< "VectorMesonVectorPScalarDecayer" << Exception::runerror;
// set up the integration channels
PhaseSpaceModePtr mode;
for(unsigned int ix=0;ix<_incoming.size();++ix) {
tPDPtr in = getParticleData(_incoming[ix]);
tPDVector out = {getParticleData(_outgoingV[ix]),
getParticleData(_outgoingP[ix])};
if(in&&out[0]&&out[1])
mode = new_ptr(PhaseSpaceMode(in,out,_maxweight[ix]));
else
mode=PhaseSpaceModePtr();
addMode(mode);
}
}
VectorMesonVectorPScalarDecayer::VectorMesonVectorPScalarDecayer()
: _coupling(73), _incoming(73), _outgoingV(73), _outgoingP(73), _maxweight(73) {
// intermediates
generateIntermediates(false);
// rho -> gamma pi modes
_incoming[0] = 113; _outgoingV[0] = 22; _outgoingP[0] = 111;
_coupling[0] = 0.2527/GeV; _maxweight[0] = 1.7;
_incoming[1] = 213; _outgoingV[1] = 22; _outgoingP[1] = 211;
_coupling[1] = 0.2210/GeV; _maxweight[1] = 1.7;
// rho -> gamma eta mode
_incoming[2] = 113; _outgoingV[2] = 22; _outgoingP[2] = 221;
_coupling[2] = 0.492/GeV; _maxweight[2] = 1.7;
// omega -> gamma pi
_incoming[3] = 223; _outgoingV[3] = 22; _outgoingP[3] = 111;
_coupling[3] = 0.7279465/GeV; _maxweight[3] = 1.7;
// omega -> gamma eta
_incoming[4] = 223; _outgoingV[4] = 22; _outgoingP[4] = 221;
_coupling[4] = 0.143/GeV; _maxweight[4] = 1.7;
// phi -> gamma pi
_incoming[5] = 333; _outgoingV[5] = 22; _outgoingP[5] = 111;
_coupling[5] = 0.0397/GeV; _maxweight[5] = 1.7;
// phi -> gamma eta
_incoming[6] = 333; _outgoingV[6] = 22; _outgoingP[6] = 221;
_coupling[6] = 0.212/GeV; _maxweight[6] = 1.7;
// phi -> gamma eta'
_incoming[7] = 333; _outgoingV[7] = 22; _outgoingP[7] = 331;
_coupling[7] = 0.219/GeV; _maxweight[7] = 1.8;
// phi -> omega pi
_incoming[8] = 333; _outgoingV[8] = 223; _outgoingP[8] = 111;
_coupling[8] = 0.0417/GeV; _maxweight[8] = 1.9;
// phi' -> K* K
_incoming[9] = 100333; _outgoingV[9] = 323; _outgoingP[9] = -321;
_coupling[9] = 3.934/GeV; _maxweight[9] = 5.;
_incoming[10] = 100333; _outgoingV[10] = 313; _outgoingP[10] = -311;
_coupling[10] = 4.011/GeV; _maxweight[10] = 5.;
// K* -> gamma K
_incoming[11] = 313; _outgoingV[11] = 22; _outgoingP[11] = 311;
_coupling[11] = 0.384/GeV; _maxweight[11] = 1.7;
_incoming[12] = 323; _outgoingV[12] = 22; _outgoingP[12] = 321;
_coupling[12] = 0.253/GeV; _maxweight[12] = 1.7;
// d* decay
_incoming[13] = 423; _outgoingV[13] = 22; _outgoingP[13] = 421;
_coupling[13] = 0.616/GeV; _maxweight[13] = 1.7;
_incoming[14] = 413; _outgoingV[14] = 22; _outgoingP[14] = 411;
_coupling[14] = 0.152/GeV; _maxweight[14] = 1.7;
// D_s* decays
_incoming[15] = 433; _outgoingV[15] = 22; _outgoingP[15] = 431;
_coupling[15] = 0.764/GeV; _maxweight[15] = 1.7;
// B_s* decays
_incoming[16] = 533; _outgoingV[16] = 22; _outgoingP[16] = 531;
_coupling[16] = 0.248/GeV; _maxweight[16] = 1.7;
// B_c* decays
_incoming[17] = 543; _outgoingV[17] = 22; _outgoingP[17] = 541;
_coupling[17] = 0.266/GeV; _maxweight[17] = 1.7;
// B* decay
_incoming[18] = 523; _outgoingV[18] = 22; _outgoingP[18] = 521;
_coupling[18] = 0.553/GeV; _maxweight[18] = 1.7;
_incoming[19] = 513; _outgoingV[19] = 22; _outgoingP[19] = 511;
_coupling[19] = 0.310/GeV; _maxweight[19] = 1.7;
// rho'' eta rho
_incoming[20] = 30113; _outgoingV[20] = 113; _outgoingP[20] = 221;
_coupling[20] = 2.663/GeV; _maxweight[20] = 4.;
_incoming[21] = 30213; _outgoingV[21] = 213; _outgoingP[21] = 221;
_coupling[21] = 2.663/GeV; _maxweight[21] = 4.;
// rho '' K* K
_incoming[22] = 30113; _outgoingV[22] = 323; _outgoingP[22] = -321;
_coupling[22] = 0.894/GeV; _maxweight[22] = 5.;
_incoming[23] = 30113; _outgoingV[23] = 313; _outgoingP[23] = -311;
_coupling[23] = 0.908/GeV; _maxweight[23] = 5.;
_incoming[24] = 30213; _outgoingV[24] = 323; _outgoingP[24] = -311;
_coupling[24] = 1.265/GeV; _maxweight[24] = 5.;
_incoming[25] = 30213; _outgoingV[25] = -313; _outgoingP[25] = 321;
_coupling[25] = 1.273/GeV; _maxweight[25] = 5.;
// omega'' rho pi
_incoming[26] = 30223; _outgoingV[26] = 213; _outgoingP[26] = -211;
_coupling[26] = 2.996/GeV; _maxweight[26] = 3.5;
_incoming[27] = 30223; _outgoingV[27] = 113; _outgoingP[27] = 111;
_coupling[27] = 2.996/GeV; _maxweight[27] = 3.5;
// omega' rho pi
_incoming[28] = 100223; _outgoingV[28] = 213; _outgoingP[28] = -211;
_coupling[28] = 4.507/GeV; _maxweight[28] = 4.;
_incoming[29] = 100223; _outgoingV[29] = 113; _outgoingP[29] = 111;
_coupling[29] = 4.507/GeV; _maxweight[29] = 4.;
// K*''->K* pi decays
_incoming[30] = 30313; _outgoingV[30] = 323; _outgoingP[30] = -211;
_coupling[30] = 3.36/GeV; _maxweight[30] = 4.;
_incoming[31] = 30313; _outgoingV[31] = 313; _outgoingP[31] = 111;
_coupling[31] = 2.38/GeV; _maxweight[31] = 4.;
_incoming[32] = 30323; _outgoingV[32] = 313; _outgoingP[32] = 211;
_coupling[32] = 3.36/GeV; _maxweight[32] = 4.;
_incoming[33] = 30323; _outgoingV[33] = 323; _outgoingP[33] = 111;
_coupling[33] = 2.38/GeV; _maxweight[33] = 4.;
// K*''->K rho decays
_incoming[34] = 30313; _outgoingP[34] = 321; _outgoingV[34] = -213;
_coupling[34] = 4.159/GeV; _maxweight[34] = 3.;
_incoming[35] = 30313; _outgoingP[35] = 311; _outgoingV[35] = 113;
_coupling[35] = 2.939/GeV; _maxweight[35] = 3.;
_incoming[36] = 30323; _outgoingP[36] = 311; _outgoingV[36] = 213;
_coupling[36] = 4.159/GeV; _maxweight[36] = 3.;
_incoming[37] = 30323; _outgoingP[37] = 321; _outgoingV[37] = 113;
_coupling[37] = 2.939/GeV; _maxweight[37] = 3.;
// K*' decays
_incoming[38] = 100313; _outgoingV[38] = 323; _outgoingP[38] = -211;
_coupling[38] = 9.469/GeV; _maxweight[38] = 6.;
_incoming[39] = 100313; _outgoingV[39] = 313; _outgoingP[39] = 111;
_coupling[39] = 6.781/GeV; _maxweight[39] = 6.;
_incoming[40] = 100323; _outgoingV[40] = 313; _outgoingP[40] = 211;
_coupling[40] = 9.469/GeV; _maxweight[40] = 6.;
_incoming[41] = 100323; _outgoingV[41] = 323; _outgoingP[41] = 111;
_coupling[41] = 6.781/GeV; _maxweight[41] = 6.;
// J/psi -> gamma eta_c decay
_incoming[42] = 443; _outgoingV[42] = 22; _outgoingP[42] = 441;
_coupling[42] = 0.149/GeV; _maxweight[42] = 30.;
// J/psi -> gamma eta' decay
_incoming[43] = 443; _outgoingV[43] = 22; _outgoingP[43] = 331;
_coupling[43] = 0.00250/GeV; _maxweight[43] = 1.7;
// J/psi -> rho pi decay
_incoming[44] = 443; _outgoingV[44] = 213; _outgoingP[44] = -211;
_coupling[44] = 0.00274/GeV; _maxweight[44] = 3.3;
_incoming[45] = 443; _outgoingV[45] = 113; _outgoingP[45] = 111;
_coupling[45] = 0.00274/GeV; _maxweight[45] = 3.3;
// J/psi -> K* K decay
_incoming[46] = 443; _outgoingV[46] = 323; _outgoingP[46] = -321;
_coupling[46] = 0.00180/GeV; _maxweight[46] = 6.;
_incoming[47] = 443; _outgoingV[47] = 313; _outgoingP[47] = -311;
_coupling[47] = 0.00180/GeV; _maxweight[47] = 6.;
// J/psi -> omega eta decay
_incoming[48] = 443; _outgoingV[48] = 223; _outgoingP[48] = 221;
_coupling[48] = 0.00154/GeV; _maxweight[48] = 6.;
// J/psi -> gamma eta decay
_incoming[49] = 443; _outgoingV[49] = 22; _outgoingP[49] = 221;
_coupling[49] = 0.00103/GeV; _maxweight[49] = 1.7;
// J/psi -> phi eta decay
_incoming[50] = 443; _outgoingV[50] = 333; _outgoingP[50] = 221;
_coupling[50] = 0.00110/GeV; _maxweight[50] = 5.5;
// J/psi -> phi eta' decay
_incoming[51] = 443; _outgoingV[51] = 333; _outgoingP[51] = 331;
_coupling[51] = 0.00085/GeV; _maxweight[51] = 5.5;
// J/psi -> omega pi0 decay
_incoming[52] = 443; _outgoingV[52] = 223; _outgoingP[52] = 111;
_coupling[52] = 0.00073/GeV; _maxweight[52] = 6.;
// J/psi -> rho0 eta decay
_incoming[53] = 443; _outgoingV[53] = 113; _outgoingP[53] = 221;
_coupling[53] = 0.00054/GeV; _maxweight[53] = 3.;
// J/psi -> rho0 eta' decay
_incoming[54] = 443; _outgoingV[54] = 113; _outgoingP[54] = 331;
_coupling[54] = 0.00045/GeV; _maxweight[54] = 3.;
// J/psi -> omega eta' decay
_incoming[55] = 443; _outgoingV[55] = 223; _outgoingP[55] = 331;
_coupling[55] = 0.00058/GeV; _maxweight[55] = 6.;
// J/psi -> gamma pi0 decay
_incoming[56] = 443; _outgoingV[56] = 22; _outgoingP[56] = 111;
_coupling[56] = 0.000177/GeV; _maxweight[56] = 1.7;
// psi(2s)-> j/psi eta decay
_incoming[57] = 100443; _outgoingV[57] = 443; _outgoingP[57] = 221;
_coupling[57] = 0.230/GeV; _maxweight[57] = 1.7;
// psi(2s)-> gamma eta_c decay
_incoming[58] = 100443; _outgoingV[58] = 22; _outgoingP[58] = 441;
_coupling[58] = 0.0114/GeV; _maxweight[58] = 3.4;
// psi(2s)-> gamma eta' decay
_incoming[59] = 100443; _outgoingV[59] = 22; _outgoingP[59] = 331;
_coupling[59] = 0.00062/GeV; _maxweight[59] = 1.7;
// psi(2s)-> J/psi pi0 decay
_incoming[60] = 100443; _outgoingV[60] = 443; _outgoingP[60] = 111;
_coupling[60] = 0.0106/GeV; _maxweight[60] = 1.7;
// psi(1d)-> gamma eta_c decay
_incoming[61] = 30443; _outgoingV[61] = 443; _outgoingP[61] = 221;
_coupling[61] = 0.135/GeV; _maxweight[61] = 1.7;
_incoming[62] = 30443; _outgoingV[62] = 333; _outgoingP[62] = 221;
_coupling[62] = 0.0076/GeV; _maxweight[62] = 5.5;
// psi(2s) K* K
_incoming[63] = 100443; _outgoingV[63] = 323; _outgoingP[63] = -321;
_coupling[63] = 0.00021/GeV; _maxweight[63] = 6.5;
_incoming[64] = 100443; _outgoingV[64] = 313; _outgoingP[64] = -311;
_coupling[64] = 0.00054/GeV; _maxweight[64] = 6.5;
// psi(2s) -> phi eta decay
_incoming[65] = 100443; _outgoingV[65] = 333; _outgoingP[65] = 221;
_coupling[65] = 0.00029/GeV; _maxweight[65] = 5.5;
// psi(2s) -> phi eta' decay
_incoming[66] = 100443; _outgoingV[66] = 333; _outgoingP[66] = 331;
_coupling[66] = 0.00033/GeV; _maxweight[66] = 5.5;
// psi(2s) -> rho pi decay
_incoming[67] = 100443; _outgoingV[67] = 213; _outgoingP[67] = -211;
_coupling[67] = 0.00017/GeV; _maxweight[67] = 3.5;
_incoming[68] = 100443; _outgoingV[68] = 113; _outgoingP[68] = 111;
_coupling[68] = 0.00017/GeV; _maxweight[68] = 3.5;
// psi(2s) -> omega eta' decay
_incoming[69] = 100443; _outgoingV[69] = 223; _outgoingP[69] = 331;
_coupling[69] = 0.00032/GeV; _maxweight[69] = 6.;
// psi(2s) -> rho0 eta decay
_incoming[70] = 100443; _outgoingV[70] = 113; _outgoingP[70] = 221;
_coupling[70] = 0.00025/GeV; _maxweight[70] = 3.5;
// psi(2s) -> omega pi0 decay
_incoming[71] = 100443; _outgoingV[71] = 223; _outgoingP[71] = 111;
_coupling[71] = 0.00022/GeV; _maxweight[71] = 6.;
// psi(2s) -> rho0 eta' decay
_incoming[72] = 100443; _outgoingV[72] = 113; _outgoingP[72] = 331;
_coupling[72] = 0.00026/GeV; _maxweight[72] = 3.5;
// initial size of the vectors for the database output
_initsize=_incoming.size();
}
int VectorMesonVectorPScalarDecayer::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]) {
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 VectorMesonVectorPScalarDecayer::persistentOutput(PersistentOStream & os) const {
os << _incoming << _outgoingV << _outgoingP << _maxweight << ounit(_coupling,1/MeV);
}
void VectorMesonVectorPScalarDecayer::persistentInput(PersistentIStream & is, int) {
is >> _incoming >> _outgoingV >> _outgoingP >> _maxweight >> iunit(_coupling,1/MeV);
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<VectorMesonVectorPScalarDecayer,DecayIntegrator>
describeHerwigVectorMesonVectorPScalarDecayer("Herwig::VectorMesonVectorPScalarDecayer", "HwVMDecay.so");
void VectorMesonVectorPScalarDecayer::Init() {
static ClassDocumentation<VectorMesonVectorPScalarDecayer> documentation
("The VectorMesonVectorPScalarDecayer class is designed for the "
"decay of a vector meson to another vector meson, or the photon, and a "
"pseudoscalar meson.");
static ParVector<VectorMesonVectorPScalarDecayer,int> interfaceIncoming
("Incoming",
"The PDG code for the incoming particle",
&VectorMesonVectorPScalarDecayer::_incoming,
0, 0, 0, -10000000, 10000000, false, false, true);
static ParVector<VectorMesonVectorPScalarDecayer,int> interfaceOutcomingVector
("OutgoingVector",
"The PDG code for the outgoing spin-1 particle",
&VectorMesonVectorPScalarDecayer::_outgoingV,
0, 0, 0, -10000000, 10000000, false, false, true);
static ParVector<VectorMesonVectorPScalarDecayer,int> interfaceOutcomingPScalar
("OutgoingPScalar",
"The PDG code for the outgoing spin-0 particle",
&VectorMesonVectorPScalarDecayer::_outgoingP,
0, 0, 0, -10000000, 10000000, false, false, true);
static ParVector<VectorMesonVectorPScalarDecayer,InvEnergy> interfaceCoupling
("Coupling",
"The coupling for the decay mode",
&VectorMesonVectorPScalarDecayer::_coupling,
1/MeV, 0, ZERO, -10000000/MeV, 10000000/MeV, false, false, true);
static ParVector<VectorMesonVectorPScalarDecayer,double> interfaceMaxWeight
("MaxWeight",
"The maximum weight for the decay mode",
&VectorMesonVectorPScalarDecayer::_maxweight,
0, 0, 0, -10000000, 10000000, false, false, true);
}
+
void VectorMesonVectorPScalarDecayer::
constructSpinInfo(const Particle & part, ParticleVector decay) const {
VectorWaveFunction::constructSpinInfo(_vectors[0],const_ptr_cast<tPPtr>(&part),
incoming,true,false);
VectorWaveFunction::constructSpinInfo(_vectors[1],decay[0],
outgoing,true,decay[0]->id()==ParticleID::gamma);
ScalarWaveFunction::constructSpinInfo(decay[1],outgoing,true);
}
+
double VectorMesonVectorPScalarDecayer::me2(const int,const Particle & part,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
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<tPPtr>(&part),
incoming,false);
}
_vectors[1].resize(3);
for(unsigned int ix=0;ix<3;++ix) {
if(photon && ix==1) continue;
_vectors[1][ix] = HelicityFunctions::polarizationVector(-momenta[0],ix,Helicity::outgoing);
}
// compute the matrix element
LorentzPolarizationVector vtemp;
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 {
vtemp=_coupling[imode()]/part.mass()*
epsilon(part.momentum(),_vectors[1][ix],momenta[0]);
for(unsigned int iy=0;iy<3;++iy) (*ME())(iy,ix,0)=_vectors[0][iy].dot(vtemp);
}
}
double me = ME()->contract(_rho).real();
// test of the matrix element
// Energy pcm=Kinematics::pstarTwoBodyDecay(part.mass(),momenta[0].mass(),
// momenta[1].mass());
// double test = sqr(_coupling[imode()]*pcm)*2./3.;
// cerr << "testing matrix element for " << part.PDGName() << " -> "
// << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
// << me << " " << test << " " << (me-test)/(me+test) << "\n";
// return the answer
return me;
}
bool VectorMesonVectorPScalarDecayer::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 ==_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 = 1;
return order;
}
// output the setup info for the particle database
void VectorMesonVectorPScalarDecayer::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]*MeV << "\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]*MeV << "\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,453 +1,453 @@
// -*- 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()
// rho masses, widths and weights
: _rhomass ({0.773*GeV,1.370*GeV,1.750*GeV}),
_rhowidth({0.145*GeV,0.510*GeV,0.120*GeV}),
_rhowgts({1.0,-0.145,0.}),_localparameters(true),
_coupling(47.95/GeV),
// integration weights
_onemax(5.4474), _twomax(5.47784), _threemax(5.40185),
_onewgts ({0.235562,0.231098,0.131071,0.131135,0.135841,0.135294}),
_twowgts ({0.236208,0.229481,0.131169,0.133604,0.132685,0.136854}),
_threewgts({0.234259,0.233634,0.135922,0.129231,0.133949,0.133005}),
_mpi(ZERO) {
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)};
// decay mode a_1+ -> pi+ pi0 pi0
tPDPtr in = a1p;
tPDVector out = {pi0,pi0,pip};
PhaseSpaceModePtr mode = new_ptr(PhaseSpaceMode(in,out,_onemax));
unsigned int nrho(0);
for(unsigned int ix=0;ix<3;++ix) if(rhop[ix]) ++nrho;
if(_onewgts.size()!=2*nrho) _onewgts=vector<double>(2*nrho,0.5/nrho);
for(unsigned int ix=0;ix<3;++ix) {
if(!rhop[ix]) continue;
// first rho+ channel
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rhop[ix],0,2,1,1,1,3));
c1.weight(_onewgts[2*ix]);
mode->addChannel(c1);
// second rho+ channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rhop[ix],0,1,1,2,1,3));
c2.weight(_onewgts[2*ix+1]);
mode->addChannel(c2);
}
addMode(mode);
// decay mode a_10 -> pi+ pi- pi0
in = a10;
out = {pip,pim,pi0};
mode = new_ptr(PhaseSpaceMode(in,out,_twomax));
if(_twowgts.size()!=2*nrho) _twowgts=vector<double>(2*nrho,0.5/nrho);
for(unsigned int ix=0;ix<3;++ix) {
if(!rhop[ix]) continue;
// first rho channel
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rhop[ix],0,2,1,1,1,3));
c1.weight(_twowgts[2*ix]);
mode->addChannel(c1);
// second channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rhom[ix],0,1,1,2,1,3));
c2.weight(_twowgts[2*ix+1]);
mode->addChannel(c2);
}
addMode(mode);
// decay mode a_1+ -> pi+ pi+ pi-
in = a1p;
out = {pip,pip,pim};
mode = new_ptr(PhaseSpaceMode(in,out,_threemax));
nrho = 0;
for(unsigned int ix=0;ix<3;++ix) if(rho0[ix]) ++nrho;
if(_threewgts.size()!=2*nrho) _threewgts=vector<double>(2*nrho,0.5/nrho);
for(unsigned int ix=0;ix<3;++ix) {
if(!rho0[ix]) continue;
// the neutral rho channels
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rho0[ix],0,2,1,1,1,3));
c1.weight(_threewgts[2*ix]);
mode->addChannel(c1);
// interchanged channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rho0[ix],0,1,1,2,1,3));
c2.weight(_threewgts[2*ix+1]);
mode->addChannel(c2);
}
addMode(mode);
// 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)->channels()[ix].weight();
for(unsigned int ix=0;ix<_twowgts.size();++ix)
_twowgts[ix]=mode(1)->channels()[ix].weight();
for(unsigned int ix=0;ix<_threewgts.size();++ix)
_threewgts[ix]=mode(2)->channels()[ix].weight();
// 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<a1SimpleDecayer,DecayIntegrator>
describeHerwiga1SimpleDecayer("Herwig::a1SimpleDecayer", "HwVMDecay.so");
void a1SimpleDecayer::Init() {
static ClassDocumentation<a1SimpleDecayer> 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<a1SimpleDecayer,bool> 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<a1SimpleDecayer,InvEnergy> interfaceCoupling
("Coupling",
"The overall coupling for the decay",
&a1SimpleDecayer::_coupling, 1./GeV, 47.95/GeV, ZERO, 100./GeV,
false, false, Interface::limited);
static ParVector<a1SimpleDecayer,Energy> interfacerhomass
("RhoMasses",
"The masses of the different rho resonaces",
&a1SimpleDecayer::_rhomass, MeV, 3, 775.*MeV, ZERO, 10000*MeV,
false, false, Interface::limited);
static ParVector<a1SimpleDecayer,Energy> interfaceRhoWidths
("RhoWidths",
"The widths of the different rho resonances",
&a1SimpleDecayer::_rhowidth, MeV, 3, 141*MeV, 0.0*MeV, 10000.0*MeV,
false, false, Interface::limited);
static ParVector<a1SimpleDecayer,double> interfaceRhoWeights
("RhoWeights",
"Weight for the different rho resonances",
&a1SimpleDecayer::_rhowgts, 3, 0.0, -10.0, 10.0,
false, false, Interface::limited);
static Parameter<a1SimpleDecayer,double> 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<a1SimpleDecayer,double> 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<a1SimpleDecayer,double> 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<a1SimpleDecayer,double> 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<a1SimpleDecayer,double> 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<a1SimpleDecayer,double> 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 {
+ const tPDVector & children) const {
if(children.size()!=3) return -1;
int id(parent->id());
// check the pions
int npi0(0),npiplus(0),npiminus(0);
for(auto child : children) {
int idtemp= child->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;
}
void a1SimpleDecayer::
constructSpinInfo(const Particle & part, ParticleVector decay) const {
VectorWaveFunction::constructSpinInfo(_vectors,const_ptr_cast<tPPtr>(&part),
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);
}
double a1SimpleDecayer::me2(const int ichan, const Particle & part,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
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<tPPtr>(&part),
incoming,false);
}
Lorentz5Vector<complex<Energy> > current;
Energy2 s1 = (momenta[1]+momenta[2]).m2();
Energy2 s2 = (momenta[0]+momenta[2]).m2();
if(ichan<0) {
current = rhoFormFactor(s2,-1)*(momenta[0]-momenta[2])
+rhoFormFactor(s1,-1)*(momenta[1]-momenta[2]);
}
else if(ichan<3) {
current =
rhoFormFactor(s2,ichan)*(momenta[0]-momenta[2]);
}
else if(ichan<6) {
current =
rhoFormFactor(s1,-1)*(momenta[1]-momenta[2]);
}
// compute the matrix element
for(unsigned int ix=0;ix<3;++ix)
(*ME())(ix,0,0,0)=_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
// Energy2 s3 = (momenta[0]+momenta[1]).m2();
// double test = threeBodyMatrixElement(imode(),sqr(part.mass()),
// s3,s2,s1,momenta[0].mass(),
// momenta[1].mass(),
// momenta[2].mass());
// if(ichan<0) cerr << "testing matrix element " << part.PDGName() << " -> "
// << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
// << outgoing[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<double> inweights;inweights.push_back(0.5);inweights.push_back(0.5);
vector<int> intype;intype.push_back(2);intype.push_back(3);
vector<Energy> inmass(2,_rhomass[0]),inwidth(2,_rhowidth[0]);
vector<double> 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<a1SimpleDecayer>
(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) {
output << "newdef " << name() << ":RhoMasses " << ix << " "
<< _rhomass[ix]/MeV << "\n";
}
for(unsigned int ix=0;ix<_rhowidth.size();++ix) {
output << "newdef " << name() << ":RhoWidths " << ix << " "
<< _rhowidth[ix]/MeV << "\n";
}
for(unsigned int ix=0;ix<_rhowgts.size();++ix) {
output << "newdef " << 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;ix<3;++ix) norm += _rhowgts[ix];
if(ires<0) {
for(unsigned int ix=0;ix<3;++ix) {
output+=_rhowgts[ix]*rhoBreitWigner(q2,ix);
}
}
else {
assert(ires<3);
output=_rhowgts[ires]*rhoBreitWigner(q2,ires);
}
return output/norm;
}
diff --git a/Decay/VectorMeson/a1ThreePionDecayer.cc b/Decay/VectorMeson/a1ThreePionDecayer.cc
--- a/Decay/VectorMeson/a1ThreePionDecayer.cc
+++ b/Decay/VectorMeson/a1ThreePionDecayer.cc
@@ -1,757 +1,735 @@
// -*- C++ -*-
//
// a1ThreePionDecayer.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 a1ThreePionDecayer class.
//
#include "a1ThreePionDecayer.h"
#include "ThePEG/Utilities/DescribeClass.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 "ThePEG/PDT/DecayMode.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
#include "Herwig/PDT/ThreeBodyAllOnCalculator.h"
#include "Herwig/Decay/GeneralDecayMatrixElement.h"
using namespace Herwig;
using namespace ThePEG::Helicity;
a1ThreePionDecayer::a1ThreePionDecayer()
: _rhomass(1,0.7761*GeV), _rhowidth(1,0.1445*GeV), _sigmamass(0.8*GeV),
_sigmawidth(0.8*GeV), _psigma(ZERO), _mpi(ZERO), _mpi2(ZERO),
_lambda2(1.2*GeV2), _a1mass2(1.23*1.23*GeV2),
_zsigma(0.), _zmag(1.3998721), _zphase(0.43585036),
_rhomag(1,1.), _rhophase(1,0.), _coupling(90.44),
- _localparameters(true), _zerowgts(3), _onewgts(7), _twowgts(7),
- _threewgts(8) ,_zeromax(19.144), _onemax(7.83592),
+ _localparameters(true),
+ _zerowgts ({0.339108,0.335601,0.325291}),
+ _onewgts ({0.19616 ,0.191408,0.12137 ,0.115498,0.12729 ,0.127183,0.12109 }),
+ _twowgts ({0.188163,0.192479,0.121658,0.12135 ,0.127298,0.124835,0.124217}),
+ _threewgts({0.153071,0.165741,0.107509,0.10275 ,0.109738,0.11254 ,0.125344,0.123307}) ,
+ _zeromax(19.144), _onemax(7.83592),
_twomax(6.64804), _threemax(6.66296) {
- // weights for the different channels
- _threewgts[0] = 0.153071;
- _threewgts[1] = 0.165741;
- _threewgts[2] = 0.107509;
- _threewgts[3] = 0.10275 ;
- _threewgts[4] = 0.109738;
- _threewgts[5] = 0.11254 ;
- _threewgts[6] = 0.125344;
- _threewgts[7] = 0.123307;
- _onewgts[0] = 0.19616 ;
- _onewgts[1] = 0.191408;
- _onewgts[2] = 0.12137 ;
- _onewgts[3] = 0.115498;
- _onewgts[4] = 0.12729 ;
- _onewgts[5] = 0.127183;
- _onewgts[6] = 0.12109 ;
- _zerowgts[0] = 0.339108;
- _zerowgts[1] = 0.335601;
- _zerowgts[2] = 0.325291;
- _twowgts[0] = 0.188163;
- _twowgts[1] = 0.192479;
- _twowgts[2] = 0.121658;
- _twowgts[3] = 0.12135 ;
- _twowgts[4] = 0.127298;
- _twowgts[5] = 0.124835;
- _twowgts[6] = 0.124217;
// generation of intermediates
generateIntermediates(true);
}
void a1ThreePionDecayer::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)->channels()[ix].weight();
for(unsigned int ix=0;ix<_onewgts.size();++ix)
_onewgts[ix]=mode(1)->channels()[ix].weight();
for(unsigned int ix=0;ix<_twowgts.size();++ix)
_twowgts[ix]=mode(2)->channels()[ix].weight();
for(unsigned int ix=0;ix<_threewgts.size();++ix)
_threewgts[ix]=mode(3)->channels()[ix].weight();
// get the maximum weight
_zeromax = mode(0)->maxWeight();
_onemax = mode(1)->maxWeight();
_twomax = mode(2)->maxWeight();
_threemax = mode(3)->maxWeight();
}
}
void a1ThreePionDecayer::doinit() {
DecayIntegrator::doinit();
// particles we need for the external state
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);
// possible intermediate particles
// 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)};
// the sigma
tPDPtr sigma = getParticleData(9000221);
// set up the phase space integration
// decay mode a_0 -> pi0 pi0 pi0
tPDPtr in = a10;
tPDVector out={pi0,pi0,pi0};
if(sigma) {
PhaseSpaceModePtr mode = new_ptr(PhaseSpaceMode(in,out,_zeromax));
if(_zerowgts.size()!=3) _zerowgts=vector<double>(3,1./3.);
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,sigma,0,1,1,2,1,3));
c1.weight(_zerowgts[0]);
mode->addChannel(c1);
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,sigma,0,2,1,1,1,3));
c2.weight(_zerowgts[1]);
mode->addChannel(c2);
PhaseSpaceChannel c3((PhaseSpaceChannel(mode),0,sigma,0,3,1,1,1,2));
c3.weight(_zerowgts[2]);
mode->addChannel(c3);
addMode(mode);
}
// decay mode a_1+ -> pi+ pi0 pi0
in = a1p;
out = {pi0,pi0,pip};
PhaseSpaceModePtr mode = new_ptr(PhaseSpaceMode(in,out,_onemax));
unsigned int nrho(0);
for(unsigned int ix=0;ix<3;++ix) if(rhop[ix]) ++nrho;
if(_onewgts.size()!=2*nrho+1) _onewgts=vector<double>(2*nrho+1,1./(2.*nrho+1.));
for(unsigned int ix=0;ix<3;++ix) {
if(!rhop[ix]) continue;
// first rho+ channel
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rhop[ix],0,1,1,2,1,3));
c1.weight(_onewgts[2*ix]);
mode->addChannel(c1);
// second rho+ channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rhop[ix],0,2,1,1,1,3));
c2.weight(_onewgts[2*ix+1]);
mode->addChannel(c2);
}
// the sigma channel
if(sigma) {
PhaseSpaceChannel c3((PhaseSpaceChannel(mode),0,sigma,0,3,1,1,1,2));
c3.weight(_onewgts.back());
mode->addChannel(c3);
}
addMode(mode);
// decay mode a_1 -> pi+ pi- pi0
in = a10;
out = {pip,pim,pi0};
mode = new_ptr(PhaseSpaceMode(in,out,_twomax));
if(_twowgts.size()!=2*nrho+1) _twowgts=vector<double>(2*nrho+1,1./(2.*nrho+1.));
for(unsigned int ix=0;ix<3;++ix) {
if(!rhop[ix]) continue;
// first rho channel
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rhop[ix],0,1,1,2,1,3));
c1.weight(_twowgts[2*ix]);
mode->addChannel(c1);
// second channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rhom[ix],0,2,1,1,1,3));
c2.weight(_twowgts[2*ix+1]);
mode->addChannel(c2);
}
// sigma channel
if(sigma) {
PhaseSpaceChannel c3((PhaseSpaceChannel(mode),0,sigma,0,3,1,1,1,2));
c3.weight(_twowgts.back());
mode->addChannel(c3);
}
addMode(mode);
// decay mode a_1+ -> pi+ pi+ pi-
in = a1p;
out = {pip,pip,pim};
mode = new_ptr(PhaseSpaceMode(in,out,_threemax));
nrho = 0;
for(unsigned int ix=0;ix<3;++ix) if(rho0[ix]) ++nrho;
if(_threewgts.size()!=2*nrho+2) _threewgts=vector<double>(2*nrho+2,1./(2.*nrho+2.));
for(unsigned int ix=0;ix<3;++ix) {
// the neutral rho channels
if(!rho0[ix]) continue;
// the neutral rho channels
PhaseSpaceChannel c1((PhaseSpaceChannel(mode),0,rho0[ix],0,1,1,2,1,3));
c1.weight(_threewgts[2*ix]);
mode->addChannel(c1);
// interchanged channel
PhaseSpaceChannel c2((PhaseSpaceChannel(mode),0,rho0[ix],0,2,1,1,1,3));
c2.weight(_threewgts[2*ix+1]);
mode->addChannel(c2);
}
// the sigma channels
if(sigma) {
PhaseSpaceChannel c3((PhaseSpaceChannel(mode),0,sigma,0,1,1,2,1,3));
c3.weight(_threewgts[6]);
mode->addChannel(c3);
PhaseSpaceChannel c4((PhaseSpaceChannel(mode),0,sigma,0,2,1,1,1,3));
c4.weight(_threewgts[7]);
mode->addChannel(c4);
}
addMode(mode);
// set up the parameters
_mpi=getParticleData(ParticleID::piplus)->mass();
_mpi2=sqr(_mpi);
if(_localparameters) {
if(_rhomass.size()<_rhocoupling.size()) {
unsigned int itemp=_rhomass.size();
_rhomass.resize(_rhocoupling.size());
_rhowidth.resize(_rhocoupling.size());
for(unsigned int ix=itemp;ix<_rhocoupling.size();++ix) {
_rhomass[ix]=rhop[ix]->mass();
_rhowidth[ix]=rhop[ix]->width();
}
// reset the intermediates in the phase space integration if needed
resetIntermediate(sigma,_sigmamass,_sigmawidth);
for(unsigned int iy=0;iy<_rhocoupling.size();++iy) {
resetIntermediate(rho0[iy],_rhomass[iy],_rhowidth[iy]);
resetIntermediate(rhop[iy],_rhomass[iy],_rhowidth[iy]);
resetIntermediate(rhom[iy],_rhomass[iy],_rhowidth[iy]);
}
}
}
else {
_a1mass2=sqr(getParticleData(ParticleID::a_1plus)->mass());
if(sigma) {
_sigmamass=sigma->mass();
_sigmawidth=sigma->width();
}
_rhomass.resize(_rhocoupling.size());
_rhowidth.resize(_rhocoupling.size());
for(unsigned int ix=0;ix<_rhocoupling.size();++ix) {
_rhomass[ix]=rhop[ix]->mass();
_rhowidth[ix]=rhop[ix]->width();
}
}
// parameters for the resonances
// for the sigma
_psigma=Kinematics::pstarTwoBodyDecay(_sigmamass,_mpi,_mpi);
// for the rho
_prho.resize(_rhomass.size());_hm2.resize(_rhomass.size());
_dhdq2m2.resize(_rhomass.size());_rhoD.resize(_rhomass.size());
for(unsigned int ix=0;ix<_rhomass.size();++ix) {
_prho[ix] = Kinematics::pstarTwoBodyDecay(_rhomass[ix],_mpi,_mpi);
_hm2[ix] = hFunction(_rhomass[ix]);
_dhdq2m2[ix] = dhdq2Parameter(ix);
_rhoD[ix] = DParameter(ix);
}
// convert the magnitude and phase of z into a phase
_zsigma = _zmag*Complex(cos(_zphase),sin(_zphase));
// convert rho couplings
for(unsigned int ix=0;ix<_rhomag.size();++ix) {
_rhocoupling.push_back(_rhomag[ix]*Complex(cos(_rhophase[ix]),sin(_rhophase[ix])));
}
}
int a1ThreePionDecayer::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 a1ThreePionDecayer::persistentOutput(PersistentOStream & os) const {
os << ounit(_rhomass,GeV) << ounit(_rhowidth,GeV) << ounit(_prho,GeV)
<< ounit(_hm2,GeV2) << ounit(_rhoD,GeV2) << _dhdq2m2 << ounit(_sigmamass,GeV)
<< ounit(_sigmawidth,GeV) << ounit(_psigma,GeV) << ounit(_mpi,GeV)
<< ounit(_mpi2,GeV2) << ounit(_lambda2,GeV2) << ounit(_a1mass2,GeV2) << _zsigma
<< _rhocoupling << _coupling << _localparameters << _zerowgts << _onewgts
<< _twowgts << _threewgts << _zeromax << _zmag << _zphase
<< _onemax << _twomax << _threemax << _coupling << _rhomag << _rhophase;
}
void a1ThreePionDecayer::persistentInput(PersistentIStream & is, int) {
is >> iunit(_rhomass,GeV) >> iunit(_rhowidth,GeV) >> iunit(_prho,GeV)
>> iunit(_hm2,GeV2) >> iunit(_rhoD,GeV2) >> _dhdq2m2 >> iunit(_sigmamass,GeV)
>> iunit(_sigmawidth,GeV) >> iunit(_psigma,GeV) >> iunit(_mpi,GeV)
>> iunit(_mpi2,GeV2) >> iunit(_lambda2,GeV2) >> iunit(_a1mass2,GeV2) >> _zsigma
>> _rhocoupling >> _coupling >> _localparameters >> _zerowgts >> _onewgts
>> _twowgts >> _threewgts >> _zeromax >> _zmag >> _zphase
>> _onemax >> _twomax >> _threemax >> _coupling >> _rhomag >> _rhophase;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<a1ThreePionDecayer,DecayIntegrator>
describeHerwiga1ThreePionDecayer("Herwig::a1ThreePionDecayer", "HwVMDecay.so");
void a1ThreePionDecayer::Init() {
static ClassDocumentation<a1ThreePionDecayer> documentation
("The a1ThreePionDecayer class is designed to decay the a_1 "
"resonance to three pions using a model based on that used in the modelling "
"of tau->4 pions.",
"The decay of the $a_1$ resonance to three pions uses a model based on"
"tau to four pions, \\cite{Bondar:2002mw}.",
"%\\cite{Bondar:2002mw}\n"
"\\bibitem{Bondar:2002mw}\n"
" A.~E.~Bondar, S.~I.~Eidelman, A.~I.~Milstein, T.~Pierzchala, N.~I.~Root, Z.~Was and M.~Worek,\n"
" ``Novosibirsk hadronic currents for tau --> 4pi channels of tau decay\n"
" %library TAUOLA,''\n"
" Comput.\\ Phys.\\ Commun.\\ {\\bf 146}, 139 (2002)\n"
" [arXiv:hep-ph/0201149].\n"
" %%CITATION = CPHCB,146,139;%%\n"
);
static Switch<a1ThreePionDecayer,bool> interfaceLocalParameters
("LocalParameters",
"Use local values of the intermediate resonances masses and widths",
&a1ThreePionDecayer::_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<a1ThreePionDecayer,double> interfaceCoupling
("Coupling",
"The overall coupling for the decay",
&a1ThreePionDecayer::_coupling, 90.44, 0.0, 1000.0,
false, false, true);
static ParVector<a1ThreePionDecayer,Energy> interfacerhomass
("RhoMasses",
"The masses of the different rho resonnaces",
&a1ThreePionDecayer::_rhomass,
GeV, 0, ZERO, ZERO, 10000*GeV, false, false, true);
static ParVector<a1ThreePionDecayer,Energy> interfacerhowidth
("RhoWidths",
"The widths of the different rho resonnaces",
&a1ThreePionDecayer::_rhowidth,
GeV, 0, ZERO, ZERO, 10000*GeV, false, false, true);
static ParVector<a1ThreePionDecayer,double> interfaceRhoMagnitude
("RhoMagnitude",
"The magnitude of the rho couplings",
&a1ThreePionDecayer::_rhomag, -1, 1.0, 0.0, 10.0,
false, false, Interface::limited);
static ParVector<a1ThreePionDecayer,double> interfaceRhoPhase
("RhoPhase",
"The phase of the rho coupling",
&a1ThreePionDecayer::_rhophase, -1, 0., 0.0, 2.*Constants::pi,
false, false, Interface::limited);
static Parameter<a1ThreePionDecayer,Energy2> interfaceLambda2
("Lambda2",
"The value of the mass scale squared to use in the form-factor",
&a1ThreePionDecayer::_lambda2, GeV2, 1.2*GeV2, 0.0001*GeV2, 10.0*GeV2,
false, false, true);
static Parameter<a1ThreePionDecayer,Energy2> interfacea1mass2
("a1mass2",
"The local value of the square of the a_1 mass",
&a1ThreePionDecayer::_a1mass2, GeV2, 1.5129*GeV2, 0.5*GeV2, 10.0*GeV2,
false, false, true);
static Parameter<a1ThreePionDecayer,Energy> interfaceSigmaMass
("SigmaMass",
"The local value of the sigma mass",
&a1ThreePionDecayer::_sigmamass, GeV, 0.8*GeV, ZERO, 10.0*GeV,
false, false, true);
static Parameter<a1ThreePionDecayer,Energy> interfaceSigmaWidth
("SigmaWidth",
"The local value of the sigma width",
&a1ThreePionDecayer::_sigmawidth, GeV, 0.8*GeV, ZERO, 10.0*GeV,
false, false, true);
static ParVector<a1ThreePionDecayer,double> interfacezerowgts
("AllNeutralWeights",
"The weights of the different channels to use for the integration of"
" the decay a_1^0->pi0pi0pi0",
&a1ThreePionDecayer::_zerowgts,
0, 0, 0, -10000, 10000, false, false, true);
static ParVector<a1ThreePionDecayer,double> interfaceonewgts
("OneChargedWeights",
"The weights of the different channels to use for the integration of"
" the decay a_1^+->pi+pi0pi0",
&a1ThreePionDecayer::_onewgts,
0, 0, 0, -10000, 10000, false, false, true);
static ParVector<a1ThreePionDecayer,double> interfacetwowgts
("TwoChargedWeights",
"The weights of the different channels to use for the integration of"
" the decay a_1^0->pi+pi-pi0",
&a1ThreePionDecayer::_twowgts,
0, 0, 0, -10000, 10000, false, false, true);
static ParVector<a1ThreePionDecayer,double> interfacethreewgts
("ThreeChargedWeights",
"The weights of the different channels to use for the integration of"
" the decay a_1^+->pi+pi+pi-",
&a1ThreePionDecayer::_threewgts,
0, 0, 0, -10000, 10000, false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceZeroMax
("ZeroMax",
"The maximum weight for the integration fo the channel a_1^0->pi0pi0pi0",
&a1ThreePionDecayer::_zeromax, 107.793, 0.0, 10000.0,
false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceOneMax
("OneMax",
"The maximum weight for the integration fo the channel a_1^+->pi+pi0pi0",
&a1ThreePionDecayer::_onemax, 1088.96, 0.0, 10000.0,
false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceTwoMax
("TwoMax",
"The maximum weight for the integration fo the channel a_1^0->pi+pi-pi0",
&a1ThreePionDecayer::_twomax, 1750.73, 0.0, 10000.0,
false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceThreeMax
("ThreeMax",
"The maximum weight for the integration fo the channel a_1^+->pi+pi+pi-",
&a1ThreePionDecayer::_threemax, 739.334, 0.0, 10000.0,
false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceSigmaMagnitude
("SigmaMagnitude",
"magnitude of the relative sigma coupling",
&a1ThreePionDecayer::_zmag, 1.3998721, 0.0, 10.0e20,
false, false, true);
static Parameter<a1ThreePionDecayer,double> interfaceSigmaPhase
("SigmaPhase",
"phase of the relative sigma coupling",
&a1ThreePionDecayer::_zphase, 0.43585036, 0.0, Constants::twopi,
false, false, true);
}
void a1ThreePionDecayer::
constructSpinInfo(const Particle & part, ParticleVector decay) const {
VectorWaveFunction::constructSpinInfo(_vectors,const_ptr_cast<tPPtr>(&part),
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);
}
double a1ThreePionDecayer::me2(const int ichan, const Particle & part,
const tPDVector & ,
const vector<Lorentz5Momentum> & momenta,
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<tPPtr>(&part),
incoming,false);
}
// momentum of the incoming particle
Lorentz5Momentum Q=part.momentum();
// momenta of the intermediates
Energy2 s1=(momenta[1]+momenta[2]).m2();
Energy2 s2=(momenta[0]+momenta[2]).m2();
Energy2 s3=(momenta[0]+momenta[1]).m2();
Energy2 dot01=Q*momenta[0];
Energy2 dot02=Q*momenta[1];
Energy2 dot03=Q*momenta[2];
// vector for the output
LorentzVector<complex<Energy3> > output;
// a_10 -> pi0pi0pi0
if(imode()==0) {
//the breit-wigners
Complex sig1=sigmaBreitWigner(s1);
Complex sig2=sigmaBreitWigner(s2);
Complex sig3=sigmaBreitWigner(s3);
// compute the vector
LorentzPolarizationVectorE tmpoutput;
if(ichan<0) {
tmpoutput= sig1*(momenta[0])+sig2*(momenta[1])
+sig3*(momenta[2]);
}
else if(ichan==0) tmpoutput=sig1*(momenta[0]);
else if(ichan==1) tmpoutput=sig2*(momenta[1]);
else if(ichan==2) tmpoutput=sig3*(momenta[2]);
// the coupling z and identical particle factor
output = tmpoutput * _zsigma* 1./sqrt(6.) *Q.mass2();
}
// a_1+ -> pi0pi0pi+
else if(imode()==1) {
// scalar propagator
Complex sig1 = sigmaBreitWigner(s3);
// sigma terms
if(ichan<0||ichan==6)
output = _zsigma*Q.mass2()*sig1*momenta[2];
// the rho terms
for(int ix=0,N=_rhocoupling.size();ix<N;++ix) {
Complex rho1=_rhocoupling[ix]*rhoBreitWigner(s1,ix);
Complex rho2=_rhocoupling[ix]*rhoBreitWigner(s2,ix);
if(ichan<0||ichan==2*ix) {
output +=rho1*(dot03*(momenta[1])-
dot02*(momenta[2]));
}
if(ichan<0||ichan==2*ix+1){
output +=rho2*(dot03*(momenta[0])-
dot01*(momenta[2]));
}
}
// the identical particle factor
output *= 1./sqrt(2.);
}
// a_10->pi+pi-pi0
else if(imode()==2) {
// the sigma terms
Complex sig1=sigmaBreitWigner(s3);
if(ichan<0||ichan==6)
output = _zsigma*Q.mass2()*sig1*momenta[2];
// rho terms
for(int ix=0,N=_rhocoupling.size();ix<N;++ix) {
Complex rho1=_rhocoupling[ix]*rhoBreitWigner(s1,ix);
Complex rho2=_rhocoupling[ix]*rhoBreitWigner(s2,ix);
if(ichan<0||ichan==2*ix) {
output+=rho1*(dot03*(momenta[1])
-dot02*(momenta[2]));
}
if(ichan<0||ichan==2*ix+1) {
output+=rho2*(dot03*(momenta[0])
-dot01*(momenta[2]));
}
}
}
// a1+ -> pi+pi+pi-
else if(imode()==3) {
// the scalar propagators
Complex sig1=sigmaBreitWigner(s1);
Complex sig2=sigmaBreitWigner(s2);
// sigma terms
LorentzPolarizationVectorE tmpoutput;
if(ichan<0||ichan==6) tmpoutput+=sig1*(momenta[0]);
if(ichan<0||ichan==7) tmpoutput+=sig2*(momenta[1]);
output = tmpoutput * _zsigma * Q.mass2();
// rho terms
for(int ix=0,N=_rhocoupling.size();ix<N;++ix) {
Complex rho1 = _rhocoupling[ix]*rhoBreitWigner(s1,ix);
Complex rho2 = _rhocoupling[ix]*rhoBreitWigner(s2,ix);
if(ichan<0||ichan==2*ix) {
output-=rho1*( dot03*(momenta[1])-
dot02*(momenta[2]));
}
if(ichan<0||ichan==2*ix+1) {
output-=rho2*( dot03*(momenta[0])-
dot01*(momenta[2]));
}
}
// the identical particle factor
output *= 1./sqrt(2.);
}
// form-factor
LorentzPolarizationVector outputFinal
= output * a1FormFactor(Q.mass2())*_coupling/(Q.mass()*sqr(_rhomass[0]));
// compute the matrix element
for(unsigned int ix=0;ix<3;++ix)
(*ME())(ix,0,0,0)=outputFinal.dot(_vectors[ix]);
// return the answer
double out = ME()->contract(_rho).real();
// test of the answer
// double test = threeBodyMatrixElement(imode(),sqr(part.mass()),s3,s2,s1,
// momenta[0].mass(),momenta[1].mass(),
// momenta[2].mass());
// if(ichan<0) cerr << "testing matrix element " << part.PDGName() << " -> "
// << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
// << outgoing[2]->PDGName() << " " << out << " " << test << " "
// << (out-test)/(out+test) << "\n";
return out;
}
// matrix element for the running a_1 width
double a1ThreePionDecayer::
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 {
Energy6 meout(0.*pow<3,1>(GeV2));
Energy2 m12(sqr(m1)),m22(sqr(m2)),m32(sqr(m3));
Energy2 dot01(q2-s1+m12),dot02(q2-s2+m22),dot03(q2-s3+m32),
dot12(s3-m12-m22),dot13(s2-m12-m32),dot23(s1-m22-m32);
if(iopt==0) {
Complex sig1=sigmaBreitWigner(s1);
Complex sig2=sigmaBreitWigner(s2);
Complex sig3=sigmaBreitWigner(s3);
Energy2 metemp =
real(0.25*sig1*conj(sig1)*lambda(q2,s1,m12)/q2+
0.25*sig2*conj(sig2)*lambda(q2,s2,m22)/q2+
0.25*sig3*conj(sig3)*lambda(q2,s3,m32)/q2+
sig1*conj(sig2)*(-dot12+0.5*dot01*dot02/q2)+
sig1*conj(sig3)*(-dot13+0.5*dot01*dot03/q2)+
sig2*conj(sig3)*(-dot23+0.5*dot02*dot03/q2));
meout = metemp*real(_zsigma*conj(_zsigma))/6.*sqr(q2);
}
else if(iopt==1||iopt==2) {
// the sigma terms
Complex sig=sigmaBreitWigner(s3);
Complex rho1,rho2;
for(int ix=0,N=_rhocoupling.size();ix<N;++ix) {
rho1 += _rhocoupling[ix]*rhoBreitWigner(s1,ix);
rho2 += _rhocoupling[ix]*rhoBreitWigner(s2,ix);
}
meout =
0.25*lambda(q2,m32,s3)*q2*norm(_zsigma*sig)+
0.25*norm(rho1)*(dot23*dot02*dot03-m32*sqr(dot02)-m22*sqr(dot03))+
0.25*norm(rho2)*(dot13*dot01*dot03-m32*sqr(dot01)-m12*sqr(dot03))-
0.5*real(_zsigma*sig*conj(rho1))*q2*(dot03*dot23-2.*m32*dot02)-
0.5*real(_zsigma*sig*conj(rho2))*q2*(dot03*dot13-2.*m32*dot01)-
0.25*real(rho1*conj(rho2))*(sqr(dot03)*dot12-dot03*dot02*dot13
-dot03*dot01*dot23+2.*m32*dot02*dot01);
if(iopt==1) meout *= 0.5;
}
else if(iopt==3) {
Complex sig1=sigmaBreitWigner(s1);
Complex sig2=sigmaBreitWigner(s2);
Complex rho1,rho2;
for(int ix=0,N=_rhocoupling.size();ix<N;++ix) {
rho1 += _rhocoupling[ix]*rhoBreitWigner(s1,ix);
rho2 += _rhocoupling[ix]*rhoBreitWigner(s2,ix);
}
meout =
0.25*lambda(q2,m12,s1)*q2*norm(_zsigma*sig1)+
0.25*lambda(q2,m22,s2)*q2*norm(_zsigma*sig2)+
0.25*norm(rho1)*(dot23*dot02*dot03-m32*sqr(dot02)-m22*sqr(dot03))+
0.25*norm(rho2)*(dot13*dot01*dot03-m32*sqr(dot01)-m12*sqr(dot03))-
0.25*real(rho1*conj(rho2))*(sqr(dot03)*dot12-dot03*dot02*dot13
-dot03*dot01*dot23+2.*m32*dot02*dot01)-
real(_zsigma*sig1*conj(_zsigma*sig2))*q2*(q2*dot12-0.5*dot02*dot01)+
0.5*real(_zsigma*sig1*conj(rho1))*q2*(dot03*dot12-dot02*dot13)+
0.5*real(_zsigma*sig2*conj(rho1))*q2*(2.*dot03*m22-dot02*dot23)+
0.5*real(_zsigma*sig1*conj(rho2))*q2*(2.*dot03*m12-dot01*dot13)+
0.5*real(_zsigma*sig2*conj(rho2))*q2*(dot03*dot12-dot01*dot23);
meout *= 0.5;
}
return meout*a1FormFactor(q2)*sqr(_coupling/sqr(_rhomass[0]))/q2/3.;
}
WidthCalculatorBasePtr
a1ThreePionDecayer::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<double> inweights(2,0.5);
vector<int> intype;intype.push_back(2);intype.push_back(3);
vector<Energy> inmass(2,_rhomass[0]),inwidth(2,_rhowidth[0]);
vector<double> inpow(2,0.0);
Energy m[3];
Energy mpi0=getParticleData(ParticleID::pi0)->mass();
Energy mpic=getParticleData(ParticleID::piplus)->mass();
m[0] = ncharged<2 ? mpi0 : mpic;
m[1] = m[0];
m[2] = (ncharged==0||ncharged==2) ? mpi0 : mpic;
return new_ptr(ThreeBodyAllOnCalculator<a1ThreePionDecayer>
(inweights,intype,inmass,inwidth,inpow,*this,ncharged,m[0],m[1],m[2]));
}
// output the setup information for the particle database
void a1ThreePionDecayer::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 << "\n";
output << "newdef " << name() << ":Lambda2 " << _lambda2/GeV2 << "\n";
output << "newdef " << name() << ":a1mass2 " << _a1mass2/GeV2 << "\n";
output << "newdef " << name() << ":SigmaMass " << _sigmamass/GeV << "\n";
output << "newdef " << name() << ":SigmaWidth " << _sigmawidth/GeV << "\n";
output << "newdef " << name() << ":SigmaMagnitude " << _zmag << "\n";
output << "newdef " << name() << ":SigmaPhase " << _zphase << "\n";
for(unsigned int ix=0;ix<_rhomag.size();++ix) {
if(ix<1) output << "newdef " << name() << ":RhoMagnitude " << ix << " "
<< _rhomag[ix] << "\n";
else output << "insert " << name() << ":RhoMagnitude " << ix << " "
<< _rhomag[ix] << "\n";
}
for(unsigned int ix=0;ix<_rhophase.size();++ix) {
if(ix<1) output << "newdef " << name() << ":RhoPhase " << ix << " "
<< _rhophase[ix] << "\n";
else output << "insert " << name() << ":RhoPhase " << ix << " "
<< _rhophase[ix] << "\n";
}
for(unsigned int ix=0;ix<_rhomass.size();++ix) {
if(ix<1) 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<1) output << "newdef " << name() << ":RhoWidths " << ix << " "
<< _rhowidth[ix]/GeV << "\n";
else output << "insert " << name() << ":RhoWidths " << ix << " "
<< _rhowidth[ix]/GeV << "\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";
}
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;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:26 PM (1 d, 7 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805823
Default Alt Text
(67 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment