Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7877126
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
18 KB
Subscribers
None
View Options
diff --git a/Decay/HeavyMeson/HQETStrongDecayer.cc b/Decay/HeavyMeson/HQETStrongDecayer.cc
--- a/Decay/HeavyMeson/HQETStrongDecayer.cc
+++ b/Decay/HeavyMeson/HQETStrongDecayer.cc
@@ -1,404 +1,434 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the HQETStrongDecayer class.
//
#include "HQETStrongDecayer.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/ParVector.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/WaveFunction/TensorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Utilities/Kinematics.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Helicity/HelicityFunctions.h"
using namespace Herwig;
HQETStrongDecayer::HQETStrongDecayer()
: fPi_(130.2*MeV), g_(0.565), h_(0.565), f_(0.565/3.), deltaEta_(1./43.7), Lambda_(1.*GeV),
incoming_ ({413,413,423,433, //D* decay modes: VtoSS
415,415,425,425,435,435, //D*_2 decay modes: TtoSS
415,415,425,425,435,435, //D*_2 decay modes: TtoVS
10413,10413,10423,10423,10433,10433, //D_1 decay modes: VtoVS
- 10411,10411,10421,10421,10431}), //D*_0 decay modes: StoSS
+ 10411,10411,10421,10421,10431, //D*_0 decay modes: StoSS
+ 20413,20413,20423,20423,20433}), //D'_1 decay modes: VtoVS
outgoingH_({421,411,421,431,
411,421,411,421,411,421,
413,423,413,423,413,423,
413,423,413,423,413,423,
- 411,421,411,421,431}),
+ 411,421,411,421,431,
+ 413,423,413,423,433}),
outgoingL_({211,111,111,111,
111,211,-211,111,311,321,
111,211,-211,111,311,321,
111,211,-211,111,311,321,
+ 111,211,-211,111,111,
111,211,-211,111,111}),
type_ ({1, 1, 1, -1,
2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4,
- 5, 5, 5, 5, 5}),
+ 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6}),
maxWeight_({1., 1., 1., 1.,
1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1., 1.,
+ 1., 1., 1., 1., 1.,
1., 1., 1., 1., 1.})
{}
void HQETStrongDecayer::doinit() {
DecayIntegrator::doinit();
// check consistence of the parameters
unsigned int isize=incoming_.size();
if(isize!=outgoingH_.size()||isize!=outgoingL_.size()||
isize!=maxWeight_.size()||isize!=type_ .size())
throw InitException() << "Inconsistent parameters in HQETStrongDecayer"
<< Exception::abortnow;
// set up the integration channels
PhaseSpaceModePtr mode;
for(unsigned int ix=0;ix<incoming_.size();++ix) {
tPDPtr in = getParticleData(incoming_[ix]);
tPDVector out = {getParticleData(outgoingH_[ix]),
getParticleData(outgoingL_[ix])};
if(in&&out[0]&&out[1])
mode=new_ptr(PhaseSpaceMode(in,out,maxWeight_[ix]));
else
mode=PhaseSpaceModePtr();
addMode(mode);
}
}
void HQETStrongDecayer::doinitrun() {
DecayIntegrator::doinitrun();
if(initialize()) {
for(unsigned int ix=0;ix<incoming_.size();++ix)
if(mode(ix)) maxWeight_[ix] = mode(ix)->maxWeight();
}
}
IBPtr HQETStrongDecayer::clone() const {
return new_ptr(*this);
}
IBPtr HQETStrongDecayer::fullclone() const {
return new_ptr(*this);
}
void HQETStrongDecayer::persistentOutput(PersistentOStream & os) const {
os << ounit(fPi_,MeV) << g_ << h_ << f_<< deltaEta_ << ounit(Lambda_,GeV) << maxWeight_;
}
void HQETStrongDecayer::persistentInput(PersistentIStream & is, int) {
is >> iunit(fPi_,MeV) >> g_ >> h_ >> f_ >> deltaEta_ >> iunit(Lambda_,GeV) >> maxWeight_;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<HQETStrongDecayer,DecayIntegrator>
describeHerwigHQETStrongDecayer("Herwig::HQETStrongDecayer", "HwHMDecay.so");
void HQETStrongDecayer::Init() {
static ClassDocumentation<HQETStrongDecayer> documentation
("The HQETStrongDecayer class performs the strong decays of excited heavy mesons using HQET results.");
static Parameter<HQETStrongDecayer,Energy> interfacefPi
("fPi",
"The pion decay constant",
&HQETStrongDecayer::fPi_, MeV, 130.2*MeV, 100.0*MeV, 200.0*MeV,
false, false, Interface::limited);
static Parameter<HQETStrongDecayer,double> interfaceg
("g",
"The coupling for D* decays",
&HQETStrongDecayer::g_, 0.565, 0.0, 1.0,
false, false, Interface::limited);
static Parameter<HQETStrongDecayer,double> interfaceh
("h",
"The coupling for D_1, D*_2 and D*_2s decays",
&HQETStrongDecayer::h_, 0.565, 0.0, 1.0,
false, false, Interface::limited);
static Parameter<HQETStrongDecayer,double> interfacef
("f",
"The coupling for D*_0 and D'_1 decays",
&HQETStrongDecayer::f_, 0.565/3., 0.0, 1.0,
false, false, Interface::limited);
static ParVector<HQETStrongDecayer,double> interfaceMaxWeight
("MaxWeight",
"The maximum weight for the decay mode",
&HQETStrongDecayer::maxWeight_,
0, 0, 0, 0., 100000., false, false, true);
static Parameter<HQETStrongDecayer,double> interfaceDeltaEta
("DeltaEta",
"The mixing parameter for eta-pi0 of isospin violating decays",
&HQETStrongDecayer::deltaEta_, 1./43.7, 0.0, 1.,
false, false, Interface::limited);
static Parameter<HQETStrongDecayer,Energy> interfacefLambda
("Lambda",
"Strong decays momentum scale",
&HQETStrongDecayer::Lambda_, GeV, 1.*GeV, .1*GeV, 2.*GeV,
false, false, Interface::limited);
}
int HQETStrongDecayer::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 ==outgoingH_[ix]&&id2 ==outgoingL_[ix])||
(id2 ==outgoingH_[ix]&&id1 ==outgoingL_[ix])) imode=ix;
}
if(idbar==incoming_[ix]) {
if((id1bar==outgoingH_[ix]&&id2bar==outgoingL_[ix])||
(id2bar==outgoingH_[ix]&&id1bar==outgoingL_[ix])) {
imode=ix;
cc=true;
}
}
++ix;
}
while(ix<incoming_.size()&&imode<0);
return imode;
}
void HQETStrongDecayer::
constructSpinInfo(const Particle & part, ParticleVector decay) const {
switch (part.dataPtr()->iSpin()) {
case PDT::Spin0:
Helicity::ScalarWaveFunction::constructSpinInfo(const_ptr_cast<tPPtr>(&part),
Helicity::incoming,true);
break;
case PDT::Spin1:
Helicity::VectorWaveFunction::constructSpinInfo(vecIn_,const_ptr_cast<tPPtr>(&part),
Helicity::incoming,true,false);
break;
case PDT::Spin2:
Helicity::TensorWaveFunction::constructSpinInfo(tensorIn_,const_ptr_cast<tPPtr>(&part),
Helicity::incoming,true,false);
break;
default:
assert(false);
}
// set up the spin information for the decay products
for(unsigned int ix=0;ix<decay.size();++ix) {
switch (decay[ix]->dataPtr()->iSpin()) {
case PDT::Spin1:
Helicity::VectorWaveFunction::constructSpinInfo(vecOut_,decay[ix],
Helicity::outgoing,true,false);
break;
case PDT::Spin0:
Helicity::ScalarWaveFunction::constructSpinInfo(decay[ix],Helicity::outgoing,true);
break;
default:
assert(false);
}
}
}
// matrix elememt for the process
double HQETStrongDecayer::me2(const int, const Particle & part,
const tPDVector & outgoing,
const vector<Lorentz5Momentum> & momenta,
MEOption meopt) const {
if(!ME()) {
if(abs(type_[imode()])==1) {
ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin0,PDT::Spin0)));
}
if(abs(type_[imode()])==2) {
ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin2,PDT::Spin0,PDT::Spin0)));
}
if(abs(type_[imode()])==3) {
ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin2,PDT::Spin1,PDT::Spin0)));
}
- if(abs(type_[imode()])==4) {
+ if(abs(type_[imode()])==4 || abs(type_[imode()])==6) {
ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin0)));
}
if(abs(type_[imode()])==5) {
ME(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin0,PDT::Spin0,PDT::Spin0)));
}
}
// stuff for incoming particle
if(meopt==Initialize) {
- if(abs(type_[imode()])==1 || abs(type_[imode()])==4) {
+ if(abs(type_[imode()])==1 || abs(type_[imode()])==4 || abs(type_[imode()])==6) {
rho_ = RhoDMatrix(PDT::Spin1);
Helicity::VectorWaveFunction::calculateWaveFunctions(vecIn_,rho_,const_ptr_cast<tPPtr>(&part),
Helicity::incoming,false);
}
else if(abs(type_[imode()])==2 || abs(type_[imode()])==3) {
rho_ = RhoDMatrix(PDT::Spin2);
Helicity::TensorWaveFunction::calculateWaveFunctions(tensorIn_,rho_,const_ptr_cast<tPPtr>(&part),
Helicity::incoming,false);
}
else if(abs(type_[imode()])==5) {
rho_ = RhoDMatrix(PDT::Spin0);
Helicity::ScalarWaveFunction::calculateWaveFunctions(rho_,const_ptr_cast<tPPtr>(&part),
Helicity::incoming);
}
else {
cerr << "Unknown decay mode: type " << type_[imode()] << " for " << part << "\n";
assert(false);
}
}
double output(0.);
// calculate the matrix element
Energy pcm = Kinematics::pstarTwoBodyDecay(part.mass(),momenta[0].mass(),
momenta[1].mass()); //test subject
double test(0.), ratio(0.);
// HeavyVectorMeson to PScalarMeson + PScalarMeson
if(abs(type_[imode()])==1) {
InvEnergy fact = -2.*g_/fPi_*sqrt(momenta[0].mass()/part.mass());
for(unsigned int ix=0;ix<3;++ix) {
(*ME())(ix,0,0) = fact*(vecIn_[ix]*momenta[1]);
}
// analytic test of the answer
test = 4.*sqr(g_)*momenta[0].mass()*sqr(pcm)/3./sqr(fPi_)/part.mass();
}
// HeavyTensorMeson to PScalarMeson + PScalarMeson
else if(abs(type_[imode()])==2) {
InvEnergy2 fact = -2.*h_/fPi_*sqrt(momenta[0].mass()/part.mass())/Lambda_;
for(unsigned int ix=0;ix<5;++ix) {
(*ME())(ix,0,0) = fact*(tensorIn_[ix]*momenta[1]*momenta[0]);
}
// analytic test of the answer
test = 8.*sqr(h_)*momenta[0].mass()*sqr(sqr(pcm))/15./sqr(fPi_)/sqr(Lambda_)/part.mass();
}
// HeavyTensorMeson to VectorMeson + PScalarMeson
else if(abs(type_[imode()])==3) {
// get the polarization vectors
vecOut_={
HelicityFunctions::polarizationVector(-momenta[0],0,Helicity::outgoing),
HelicityFunctions::polarizationVector(-momenta[0],1,Helicity::outgoing),
HelicityFunctions::polarizationVector(-momenta[0],2,Helicity::outgoing)};
InvEnergy3 fact = -2.*h_/fPi_*sqrt(momenta[0].mass()/part.mass())/Lambda_/part.mass();
for(unsigned int ix=0;ix<5;++ix) {
for(unsigned int iy=0;iy<3;++iy) {
LorentzVector<complex<InvEnergy> > vtemp =
fact*epsilon(momenta[0],vecOut_[iy],momenta[1]);
(*ME())(ix,iy,0) = (momenta[1]*tensorIn_[ix]).dot(vtemp);
}
}
// analytic test of the answer
test = 4.*sqr(h_)*momenta[0].mass()*sqr(sqr(pcm))/5./sqr(fPi_)/sqr(Lambda_)/part.mass();
}
// PVectorMeson to VectorMeson + PScalarMeson
- else if(abs(type_[imode()])==4) {
+ else if(abs(type_[imode()])==4 || abs(type_[imode()])==6) {
// get the polarization vectors
vecOut_={
HelicityFunctions::polarizationVector(-momenta[0],0,Helicity::outgoing),
HelicityFunctions::polarizationVector(-momenta[0],1,Helicity::outgoing),
HelicityFunctions::polarizationVector(-momenta[0],2,Helicity::outgoing)};
- InvEnergy2 fact = sqrt(2./3.)*(h_/fPi_)*sqrt(momenta[0].mass()/part.mass())/Lambda_;
- for(unsigned int ix=0;ix<3;++ix) {
- for(unsigned int iy=0;iy<3;++iy) {
- (*ME())(ix,iy,0)=Complex(fact*(vecOut_[iy].dot(vecIn_[ix])
- *(sqr(part.momentum())-sqr(part.momentum()*momenta[0]/momenta[0].mass()))
- - 3.*vecIn_[ix]*part.momentum()*vecOut_[iy]*part.momentum()));
+ if(abs(type_[imode()])==4){
+ InvEnergy2 fact = sqrt(2./3.)*(h_/fPi_)*sqrt(momenta[0].mass()/part.mass())/Lambda_;
+ for(unsigned int ix=0;ix<3;++ix) {
+ for(unsigned int iy=0;iy<3;++iy) {
+ (*ME())(ix,iy,0)=Complex(fact*(vecOut_[iy].dot(vecIn_[ix])
+ *(sqr(part.momentum())-sqr(part.momentum()*momenta[0]/momenta[0].mass()))
+ - 3.*vecIn_[ix]*part.momentum()*vecOut_[iy]*part.momentum()));
+ }
}
+ // analytic test of the answer
+ test = 4.*sqr(h_)*momenta[0].mass()*sqr(sqr(pcm))/3./sqr(fPi_)/sqr(Lambda_)/part.mass();
}
- // analytic test of the answer
- test = 4.*sqr(h_)*momenta[0].mass()*sqr(sqr(pcm))/3./sqr(fPi_)/sqr(Lambda_)/part.mass();
+ else if(abs(type_[imode()])==6) {
+ InvEnergy fact = -(f_/fPi_)*sqrt(momenta[0].mass()/part.mass());
+ for(unsigned int ix=0;ix<3;++ix) {
+ for(unsigned int iy=0;iy<3;++iy) {
+ (*ME())(ix,iy,0)=Complex(fact*(
+ part.momentum()*(momenta[0]/part.mass() + momenta[1]/momenta[0].mass())
+ * vecIn_[ix].dot(vecOut_[iy])
+ + vecOut_[iy].dot(momenta[0])*vecIn_[ix].dot(part.momentum())/part.mass()
+ + vecOut_[iy].dot(part.momentum())*vecIn_[ix].dot(momenta[0])/momenta[0].mass()));
+ }
+ }
+ // analytic test of the answer
+ test = sqr(f_)/(4.*sqr(fPi_))*sqr(part.mass()-momenta[0].mass())
+ * sqr(part.mass()+momenta[0].mass()-momenta[1].mass())
+ * sqr(part.mass()+momenta[0].mass()+momenta[1].mass())
+ / (part.mass()*momenta[0].mass())/sqr(part.mass());
+ output = ME()->contract(rho_).real();
+ // testing
+ ratio = (output-test)/(output+test);
+ generator()->log() << "testing matrix element for " << part.PDGName() << " -> "
+ << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
+ << output << " " << test << " " << ratio << endl;
+ }
}
// ScalarMeson to ScalarMeson + ScalarMeson
else if(abs(type_[imode()])==5) {
InvEnergy fact = f_/fPi_*sqrt(momenta[0].mass()/part.mass());
- (*ME())(0,0,0) = fact*(part.momentum()*momenta[0]/part.mass()
- - part.momentum()*momenta[1]/momenta[0].mass());
+ (*ME())(0,0,0) = fact*part.momentum()*(momenta[0]/part.mass()
+ + momenta[1]/momenta[0].mass());
// analytic test of the answer
test = sqr(f_)/(4.*sqr(fPi_))*(momenta[0].mass()/part.mass())
* sqr(part.mass()-momenta[0].mass())
* sqr(part.mass()+momenta[0].mass()-momenta[1].mass())
* sqr(part.mass()+momenta[0].mass()+momenta[1].mass())
/ sqr(part.mass()*momenta[0].mass());
}
else {
assert(false);
}
output = ME()->contract(rho_).real();
// testing
- ratio = (output-test)/(output+test);
- generator()->log() << "testing matrix element for " << part.PDGName() << " -> "
- << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
- << output << " " << test << " " << ratio << endl;
+ //ratio = (output-test)/(output+test);
+ //generator()->log() << "testing matrix element for " << part.PDGName() << " -> "
+ // << outgoing[0]->PDGName() << " " << outgoing[1]->PDGName() << " "
+ // << output << " " << test << " " << ratio << endl;
// isospin factors
if(abs(outgoing[1]->id())==ParticleID::pi0) {
output *= type_[imode()]>0 ? 0.5 : 0.125*sqr(deltaEta_);
}
// return the answer
return output;
}
bool HQETStrongDecayer::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==outgoingH_[ix]&&id2==outgoingL_[ix]) {
// imode=ix;
// order=true;
// }
// if(id2==outgoingH_[ix]&&id1==outgoingL_[ix]) {
// imode=ix;
// order=false;
// }
// }
// if(idbar==incoming_[ix]&&imode<0) {
// if(id1bar==outgoingH_[ix]&&id2bar==outgoingL_[ix]) {
// imode=ix;
// order=true;
// }
// if(id2bar==outgoingH_[ix]&&id1bar==outgoingL_[ix]) {
// imode=ix;
// order=false;
// }
// }
// ++ix;
// }
// while(ix<incoming_.size()&&imode<0);
// coupling=_coupling[imode]*dm.parent()->mass();
// mecode=7;
// return order;
}
void HQETStrongDecayer::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
// couplings
output << "newdef " << name() << ":fPi " << fPi_/MeV << "\n";
output << "newdef " << name() << ":g " << g_ << "\n";
if(header) output << "\n\" where BINARY ThePEGName=\""
<< fullName() << "\";" << endl;
for(unsigned int ix=0;ix<incoming_.size();++ix) {
output << "newdef " << name() << ":MaxWeight " << ix << " " << maxWeight_[ix] << "\n";
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 2:50 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3804833
Default Alt Text
(18 KB)
Attached To
R563 testingHerwigHG
Event Timeline
Log In to Comment