Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8309972
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
34 KB
Subscribers
None
View Options
diff --git a/Shower/QTilde/SplittingFunctions/OneOneOneEWSplitFn.cc b/Shower/QTilde/SplittingFunctions/OneOneOneEWSplitFn.cc
--- a/Shower/QTilde/SplittingFunctions/OneOneOneEWSplitFn.cc
+++ b/Shower/QTilde/SplittingFunctions/OneOneOneEWSplitFn.cc
@@ -1,279 +1,284 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OneOneOneEWSplitFn class.
//
#include "OneOneOneEWSplitFn.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/ParticleData.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Models/StandardModel/SMFFHVertex.h"
#include "ThePEG/Interface/Parameter.h"
using namespace Herwig;
IBPtr OneOneOneEWSplitFn::clone() const {
return new_ptr(*this);
}
IBPtr OneOneOneEWSplitFn::fullclone() const {
return new_ptr(*this);
}
void OneOneOneEWSplitFn::persistentOutput(PersistentOStream & os) const {
os << gWWG_ << gWWZ_ << _theSM << _couplingValueIm << _couplingValueRe;
}
void OneOneOneEWSplitFn::persistentInput(PersistentIStream & is, int) {
is >> gWWG_ >> gWWZ_ >> _theSM >> _couplingValueIm >> _couplingValueRe;
}
// The following static variable is needed for the type description system in ThePEG.
DescribeClass<OneOneOneEWSplitFn,SplittingFunction>
describeHerwigOneOneOneEWSplitFn("Herwig::OneOneOneEWSplitFn", "HwShower.so");
void OneOneOneEWSplitFn::Init() {
static ClassDocumentation<OneOneOneEWSplitFn> documentation
("The OneOneOneEWSplitFn class implements the splitting W->WG, W->WZ and Z->ZZ");
static Parameter<OneOneOneEWSplitFn, double> interfaceCouplingValueIm
("CouplingValue.Im",
"The numerical value (imaginary part) of the splitting coupling to be imported for BSM splittings",
&OneOneOneEWSplitFn::_couplingValueIm, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
static Parameter<OneOneOneEWSplitFn, double> interfaceCouplingValueRe
("CouplingValue.Re",
"The numerical value (real part) of the splitting coupling to be imported for BSM splittings",
&OneOneOneEWSplitFn::_couplingValueRe, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
}
void OneOneOneEWSplitFn::doinit() {
SplittingFunction::doinit();
tcSMPtr sm = generator()->standardModel();
double sw2 = sm->sin2ThetaW();
// WWZ coupling
gWWZ_ = sqrt((1.-sw2)/sw2);
// WWG coupling
gWWG_ = 1.;
// to employ running masses, wherever needed
_theSM = dynamic_ptr_cast<tcHwSMPtr>(generator()->standardModel());
}
void OneOneOneEWSplitFn::getCouplings(Complex & gvvv, const IdList & ids) const {
if(_couplingValueIm!=0||_couplingValueRe!=0) {
double e = sqrt(4.*Constants::pi*generator()->standardModel()
->alphaEM(sqr(getParticleData(ParticleID::Z0)->mass())));
gvvv = Complex(_couplingValueRe,_couplingValueIm)/e;
}
// Z > WW
else if(ids[0]->id()==ParticleID::Z0 && abs(ids[1]->id())==ParticleID::Wplus
&& abs(ids[2]->id())==ParticleID::Wplus){
gvvv = Complex(0.,gWWZ_);
}
// W > WG
else if(abs(ids[0]->id())==ParticleID::Wplus && abs(ids[1]->id())==ParticleID::Wplus
&& ids[2]->id()==ParticleID::gamma){
gvvv = Complex(0.,gWWG_);
}
// W > WZ
else if(abs(ids[0]->id())==ParticleID::Wplus && abs(ids[1]->id())==ParticleID::Wplus
&& ids[2]->id()==ParticleID::Z0){
gvvv = Complex(0.,gWWZ_);
}
else
assert(false);
}
double OneOneOneEWSplitFn::P(const double z, const Energy2 t,
const IdList &ids, const bool mass, const RhoDMatrix & rho) const {
Complex gvvv(0.,0.);
getCouplings(gvvv,ids);
double abs_rho_00 = abs(rho(0,0));
double abs_rho_11 = abs(rho(1,1));
double abs_rho_22 = abs(rho(2,2));
// massless limit
double val = ((2.*sqr(1.-(1.-z)*z))/((1.-z)*z))*(abs_rho_00+abs_rho_22);
// massive limits
if(mass) {
double m0t2 = sqr(ids[0]->mass())/t;
double m1t2 = sqr(ids[1]->mass())/t;
double m2t2 = sqr(ids[2]->mass())/t;
val += 4.*m0t2*sqr(1.-z)*abs_rho_11 + (2*(m0t2*sqr(1.-(1.-z)*z)
-m2t2*(1.-sqr(1.-z)*z) -m1t2*(1.-(1.-z)*sqr(z)))*(abs_rho_00+abs_rho_22))
/((1.-z)*z);
}
return norm(gvvv)*val;
}
double OneOneOneEWSplitFn::overestimateP(const double z,
const IdList & ids) const {
Complex gvvv(0.,0.);
getCouplings(gvvv,ids);
double val = norm(gvvv)*(2./(z*(1.-z)));
return val;
}
double OneOneOneEWSplitFn::ratioP(const double z, const Energy2 t,
const IdList & ids, const bool mass,
const RhoDMatrix & rho) const {
double val(0.);
double abs_rho_00 = abs(rho(0,0));
double abs_rho_11 = abs(rho(1,1));
double abs_rho_22 = abs(rho(2,2));
// massless limit
val = sqr(1.-(1.-z)*z)*(abs_rho_00+abs_rho_22);
// massive limit
if(mass) {
double m0t2 = sqr(ids[0]->mass())/t;
double m1t2 = sqr(ids[1]->mass())/t;
double m2t2 = sqr(ids[2]->mass())/t;
val += (4.*m0t2*sqr(1.-z)*abs_rho_11 + (2*(m0t2*sqr(1.-(1.-z)*z)
-m2t2*(1.-sqr(1.-z)*z) -m1t2*(1.-(1.-z)*sqr(z)))*(abs_rho_00+abs_rho_22))
/((1.-z)*z))/(2./(z*(1.-z)));
}
return val;
}
double OneOneOneEWSplitFn::integOverP(const double z,
const IdList & ids,
unsigned int PDFfactor) const {
Complex gvvv(0.);
getCouplings(gvvv,ids);
double pre = norm(gvvv);
switch (PDFfactor) {
case 0:
return 2.*pre*(log(z)-log(1.-z));
case 1:
//return -2.*pre*(1./z+log(1.-z)-log(z));
case 2:
//return 2.*pre*(2.*log(z)+(2.*z-1.)/(z*(1.-z))-2.*log(1.-z));
case 3:
//return 2.*pre*(1./(1.-z)-1./z-2.*log(1.-z)+2.*log(z));
default:
throw Exception() << "OneOneOneEWSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
double OneOneOneEWSplitFn::invIntegOverP(const double r, const IdList & ids,
unsigned int PDFfactor) const {
Complex gvvv(0.);
getCouplings(gvvv,ids);
double pre = norm(gvvv);
switch (PDFfactor) {
case 0:
return exp(0.5*r/pre)/(1.+exp(0.5*r/pre));
case 1:
case 2:
case 3:
default:
throw Exception() << "OneOneOneEWSplitFn::invIntegOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
bool OneOneOneEWSplitFn::accept(const IdList &ids) const {
if(ids.size()!=3) return false;
- // Z > WW
- if(ids[0]->id()==ParticleID::Z0 && abs(ids[1]->id())==ParticleID::Wplus
- && ids[1]->id()==-ids[2]->id())
- return true;
-
- if(abs(ids[0]->id())==ParticleID::Wplus) {
- // W > WG
- if(ids[1]->id()==ids[0]->id() && ids[2]->id()==ParticleID::gamma)
+ if(_couplingValueIm==0&&_couplingValueRe==0) {
+ // Z > WW
+ if(ids[0]->id()==ParticleID::Z0 && abs(ids[1]->id())==ParticleID::Wplus
+ && ids[1]->id()==-ids[2]->id())
return true;
- // W > WZ
- if(ids[1]->id()==ids[0]->id() && ids[2]->id()==ParticleID::Z0)
+ if(abs(ids[0]->id())==ParticleID::Wplus) {
+ // W > WG
+ if(ids[1]->id()==ids[0]->id() && ids[2]->id()==ParticleID::gamma)
+ return true;
+ // W > WZ
+ if(ids[1]->id()==ids[0]->id() && ids[2]->id()==ParticleID::Z0)
+ return true;
+ }
+ }
+ else {
+ if(ids[0]->iSpin()==PDT::Spin1 && ids[1]->iSpin()==PDT::Spin1 && ids[2]->iSpin()==PDT::Spin1)
return true;
}
return false;
}
vector<pair<int, Complex> >
OneOneOneEWSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
vector<pair<int, Complex> >
OneOneOneEWSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
DecayMEPtr OneOneOneEWSplitFn::matrixElement(const double z, const Energy2 t,
const IdList & ids, const double phi,
bool) {
// calculate the kernal
DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin1)));
Complex gvvv(0.);
getCouplings(gvvv,ids);
// defining dummies
double m0t = ids[0]->mass()/sqrt(t);
double m1t = ids[1]->mass()/sqrt(t);
double m2t = ids[2]->mass()/sqrt(t);
Complex phase = exp(Complex(0.,1.)*phi);
Complex cphase = conj(phase);
double z1_z = z*(1.-z);
double sqrtmass = sqrt(sqr(m0t)-sqr(m1t)/z-sqr(m2t)/(1.-z)+1.);
double r2 = sqrt(2.);
// assign kernel
(*kernal)(0,0,0) = gvvv*phase*(1./sqrt(z1_z))*sqrtmass;
(*kernal)(0,0,1) = gvvv*r2*m2t*(z/(1.-z)); //2>4
(*kernal)(0,0,2) = -gvvv*cphase*sqrt(z/(1.-z))*sqrtmass;
(*kernal)(0,1,0) = -gvvv*r2*m1t*(1.-z)/z; //2>4
(*kernal)(0,1,1) = 0.;
(*kernal)(0,1,2) = 0.;
(*kernal)(0,2,0) = -gvvv*(1.-z)*cphase*sqrt((1.-z)/z)*sqrtmass;
(*kernal)(0,2,1) = 0.;
(*kernal)(0,2,2) = 0.;
(*kernal)(1,0,0) = 0.;
(*kernal)(1,0,1) = 0.; //2>4
(*kernal)(1,0,2) = -gvvv*r2*m0t*(1.-z); //2>4
(*kernal)(1,1,0) = 0.; //221>441
(*kernal)(1,1,1) = 0.; //222>444
(*kernal)(1,1,2) = 0.; //223>443
(*kernal)(1,2,0) = -gvvv*r2*m0t*(1.-z); //2>4
(*kernal)(1,2,1) = 0.; //2>4
(*kernal)(1,2,2) = 0.; //2>4
(*kernal)(2,0,0) = 0.;
(*kernal)(2,0,1) = 0.;
(*kernal)(2,0,2) = gvvv*(1.-z)*phase*sqrt((1.-z)/z)*sqrtmass;
(*kernal)(2,1,0) = 0.;
(*kernal)(2,1,1) = 0.; //2>4
(*kernal)(2,1,2) = -gvvv*r2*m1t*((1.-z)/z);//2>4
(*kernal)(2,2,0) = gvvv*phase*sqrt(z/(1.-z))*sqrtmass;
(*kernal)(2,2,1) = gvvv*r2*m2t*(z/(1.-z)); //2>4
(*kernal)(2,2,2) = -gvvv*cphase*(1./sqrt(z1_z))*sqrtmass;
// return the answer
return kernal;
}
diff --git a/Shower/QTilde/SplittingFunctions/OneOneZeroEWSplitFn.cc b/Shower/QTilde/SplittingFunctions/OneOneZeroEWSplitFn.cc
--- a/Shower/QTilde/SplittingFunctions/OneOneZeroEWSplitFn.cc
+++ b/Shower/QTilde/SplittingFunctions/OneOneZeroEWSplitFn.cc
@@ -1,238 +1,239 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OneOneZeroEWSplitFn class.
//
#include "OneOneZeroEWSplitFn.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/ParticleData.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Models/StandardModel/SMFFHVertex.h"
#include "ThePEG/Interface/Parameter.h"
using namespace Herwig;
IBPtr OneOneZeroEWSplitFn::clone() const {
return new_ptr(*this);
}
IBPtr OneOneZeroEWSplitFn::fullclone() const {
return new_ptr(*this);
}
void OneOneZeroEWSplitFn::persistentOutput(PersistentOStream & os) const {
os << gWWH_ << gZZH_ << _theSM << _couplingValueIm << _couplingValueRe;
}
void OneOneZeroEWSplitFn::persistentInput(PersistentIStream & is, int) {
is >> gWWH_ >> gZZH_ >> _theSM >> _couplingValueIm >> _couplingValueRe;
}
// The following static variable is needed for the type description system in ThePEG.
DescribeClass<OneOneZeroEWSplitFn,SplittingFunction>
describeHerwigOneOneZeroEWSplitFn("Herwig::OneOneZeroEWSplitFn", "HwShower.so");
void OneOneZeroEWSplitFn::Init() {
static ClassDocumentation<OneOneZeroEWSplitFn> documentation
("The OneOneZeroEWSplitFn class implements the splittings W->WH and Z->ZH");
static Parameter<OneOneZeroEWSplitFn, double> interfaceCouplingValueIm
("CouplingValue.Im",
"The numerical value (imaginary part) of the splitting coupling to be imported for BSM splittings",
&OneOneZeroEWSplitFn::_couplingValueIm, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
static Parameter<OneOneZeroEWSplitFn, double> interfaceCouplingValueRe
("CouplingValue.Re",
"The numerical value (real part) of the splitting coupling to be imported for BSM splittings",
&OneOneZeroEWSplitFn::_couplingValueRe, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
}
void OneOneZeroEWSplitFn::doinit() {
SplittingFunction::doinit();
tcSMPtr sm = generator()->standardModel();
double sw2 = sm->sin2ThetaW();
// W -> W H coupling g = e/sin theta_W
gWWH_ = 1./sqrt(sw2);
// Z -> Z H coupling
gZZH_ = 1./(sqrt(sw2)*sqrt(1.-sw2));
// to employ running masses, wherever needed
_theSM = dynamic_ptr_cast<tcHwSMPtr>(generator()->standardModel());
}
void OneOneZeroEWSplitFn::getCouplings(Complex & g, const IdList & ids) const {
if(_couplingValueIm!=0||_couplingValueRe!=0) {
double e = sqrt(4.*Constants::pi*generator()->standardModel()
->alphaEM(sqr(getParticleData(ParticleID::Z0)->mass())));
Energy m0 = ids[0]->mass();
g = Complex(_couplingValueRe,_couplingValueIm)*GeV/e/m0;
}
else {
if(abs(ids[0]->id())==ParticleID::Wplus){
g = Complex(0.,gWWH_);
}
else if(ids[0]->id()==ParticleID::Z0){
g = Complex(0.,gZZH_);
}
else
assert(false);
}
}
double OneOneZeroEWSplitFn::P(const double z, const Energy2 t,
const IdList &ids, const bool mass, const RhoDMatrix & rho) const {
Complex gvvh(0.,0.);
getCouplings(gvvh,ids);
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// the splitting in the massless limit
double val = ((1.-z)*(2.*rho11+sqr(z)*(rho00+rho22)))/(4.*z);
// the massive limit
if(mass){
// get the running mass
double mBt = _theSM->mass(t,getParticleData(ids[0]->id()))/sqrt(t);
double mHt = _theSM->mass(t,getParticleData(ids[2]->id()))/sqrt(t);
val += -(sqr(mHt)*(2.*rho11+sqr(z)*(rho00+rho22)))/(4.*z)
- (sqr(mBt)*(2.*rho11+z*(-4.*rho11+z*(2.*rho11+(-1.+(-2.+z)*z)*(rho00+rho22)))))
/(4.*sqr(z));
}
return norm(gvvh)*val;
}
double OneOneZeroEWSplitFn::overestimateP(const double z,
const IdList & ids) const {
Complex gvvh(0.,0.);
getCouplings(gvvh,ids);
return norm(gvvh)/(2.*z);
}
double OneOneZeroEWSplitFn::ratioP(const double z, const Energy2 t,
const IdList & ids, const bool mass,
const RhoDMatrix & rho) const {
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// ratio in the massless limit
double val = ((1.-z)*(2.*rho11+sqr(z)*(rho00+rho22)))/2.;
// the massive limit
if(mass){
// get the running mass
double mBt = _theSM->mass(t,getParticleData(ids[0]->id()))/sqrt(t);
double mHt = _theSM->mass(t,getParticleData(ids[2]->id()))/sqrt(t);
val += -(sqr(mHt)*(2.*rho11+ sqr(z)*(rho00+rho22)))/2.
- (sqr(mBt)*(2.*rho11+z*(-4.*rho11+2.*z*rho11+z*(-1.+(-2.+z)*z)*(rho00+rho22))))/(2.*z);
}
return val;
}
double OneOneZeroEWSplitFn::integOverP(const double z,
const IdList & ids,
unsigned int PDFfactor) const {
Complex gvvh(0.,0.);
getCouplings(gvvh,ids);
double pre = norm(gvvh);
switch (PDFfactor) {
case 0:
return pre*log(z)/2.;
case 1:
case 2:
case 3:
default:
throw Exception() << "OneOneZeroEWSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
double OneOneZeroEWSplitFn::invIntegOverP(const double r, const IdList & ids,
unsigned int PDFfactor) const {
Complex gvvh(0.,0.);
getCouplings(gvvh,ids);
double pre = norm(gvvh);
switch (PDFfactor) {
case 0:
return exp(2.*r/(pre));
case 1:
case 2:
case 3:
default:
throw Exception() << "OneOneZeroEWSplitFn::invIntegOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
bool OneOneZeroEWSplitFn::accept(const IdList &ids) const {
if(ids.size()!=3)
return false;
- if(ids[0]->id()!=ids[1]->id())
- return false;
- if(ids[0]->iSpin()==PDT::Spin1 && ids[1]->iSpin()==PDT::Spin1 && ids[2]->iSpin()==PDT::Spin0)
- return true;
- //if(abs(ids[0]->id())==ParticleID::Wplus && ids[2]->iSpin()==PDT::Spin0)
- // return true;
- //else if(ids[0]->id()==ParticleID::Z0 && ids[2]->iSpin()==PDT::Spin0)
- // return true;
- else
- return false;
+ if(_couplingValueIm==0&&_couplingValueRe==0) {
+ if(abs(ids[0]->id())==ParticleID::Wplus && ids[2]->iSpin()==PDT::Spin0)
+ return true;
+ else if(ids[0]->id()==ParticleID::Z0 && ids[2]->iSpin()==PDT::Spin0)
+ return true;
+ }
+ else {
+ if(ids[0]->iSpin()==PDT::Spin1 && ids[1]->iSpin()==PDT::Spin1 && ids[2]->iSpin()==PDT::Spin0)
+ return true;
+ }
+ return false;
}
vector<pair<int, Complex> >
OneOneZeroEWSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
vector<pair<int, Complex> >
OneOneZeroEWSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
DecayMEPtr OneOneZeroEWSplitFn::matrixElement(const double z, const Energy2 t,
const IdList & ids, const double phi,
bool) {
Complex gvvh(0.,0.);
getCouplings(gvvh,ids);
// calculate the kernal
DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin0)));
Complex phase = exp(Complex(0.,1.)*phi);
Complex cphase = conj(phase);
double r2 = sqrt(2.);
double mBt = _theSM->mass(t,getParticleData(ids[0]->id()))/sqrt(t);
double mHt = _theSM->mass(t,getParticleData(ids[2]->id()))/sqrt(t);
double sqrtmass = sqrt(-(sqr(mBt)*sqr(1.-z))-sqr(mHt)*z+(1.-z)*z);
// assign kernel
(*kernal)(0,0,0) = -gvvh*mBt/r2; // 111
(*kernal)(0,1,0) = -(cphase/2.)*sqrtmass; // 121
(*kernal)(0,2,0) = 0.; // 131
(*kernal)(1,0,0) = ( phase/2.*z)*sqrtmass; // 211
(*kernal)(1,1,0) = 0.; // 221 > 441
(*kernal)(1,2,0) = -(cphase/2.*z)*sqrtmass; // 231
(*kernal)(2,0,0) = 0.; // 311
(*kernal)(2,1,0) = ( phase/2.)*sqrtmass;; // 321
(*kernal)(2,2,0) = -gvvh*mBt/r2; // 331
// return the answer
return kernal;
}
diff --git a/Shower/QTilde/SplittingFunctions/OneZeroZeroEWSplitFn.cc b/Shower/QTilde/SplittingFunctions/OneZeroZeroEWSplitFn.cc
--- a/Shower/QTilde/SplittingFunctions/OneZeroZeroEWSplitFn.cc
+++ b/Shower/QTilde/SplittingFunctions/OneZeroZeroEWSplitFn.cc
@@ -1,216 +1,213 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OneZeroZeroEWSplitFn class.
//
#include "OneZeroZeroEWSplitFn.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/ParticleData.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Models/StandardModel/SMFFHVertex.h"
#include "ThePEG/Interface/Parameter.h"
using namespace Herwig;
IBPtr OneZeroZeroEWSplitFn::clone() const {
return new_ptr(*this);
}
IBPtr OneZeroZeroEWSplitFn::fullclone() const {
return new_ptr(*this);
}
void OneZeroZeroEWSplitFn::persistentOutput(PersistentOStream & os) const {
os << _couplingValueIm << _couplingValueRe;
}
void OneZeroZeroEWSplitFn::persistentInput(PersistentIStream & is, int) {
is >> _couplingValueIm >> _couplingValueRe;
}
// The following static variable is needed for the type description system in ThePEG.
DescribeClass<OneZeroZeroEWSplitFn,SplittingFunction>
describeHerwigOneZeroZeroEWSplitFn("Herwig::OneZeroZeroEWSplitFn", "HwShower.so");
void OneZeroZeroEWSplitFn::Init() {
static ClassDocumentation<OneZeroZeroEWSplitFn> documentation
("The OneZeroZeroEWSplitFn class implements purly beyond SM electroweak splittings V->HH'");
static Parameter<OneZeroZeroEWSplitFn, double> interfaceCouplingValueIm
("CouplingValue.Im",
"The numerical value (imaginary part) of the splitting coupling to be imported for BSM splittings",
&OneZeroZeroEWSplitFn::_couplingValueIm, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
static Parameter<OneZeroZeroEWSplitFn, double> interfaceCouplingValueRe
("CouplingValue.Re",
"The numerical value (real part) of the splitting coupling to be imported for BSM splittings",
&OneZeroZeroEWSplitFn::_couplingValueRe, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
}
void OneZeroZeroEWSplitFn::doinit() {
SplittingFunction::doinit();
}
void OneZeroZeroEWSplitFn::getCouplings(Complex & g, const IdList &) const {
g = Complex(_couplingValueRe,_couplingValueIm);
}
double OneZeroZeroEWSplitFn::P(const double z, const Energy2 t,
const IdList &ids, const bool mass, const RhoDMatrix & rho) const {
Complex gvhh(0.,0.);
getCouplings(gvhh,ids);
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// the splitting in the massless limit
double val = (1.-z)*z*(rho00+rho22);
// the massive limit
if(mass){
// get the running mass
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
val += (m0t2*sqr(-1.+2.*z)*rho11)/2.+(-(m1t2*(1.-z))-m2t2*z+m0t2*(1.-z)*z)
*(rho00+rho22);
}
return norm(gvhh)*val;
}
double OneZeroZeroEWSplitFn::overestimateP(const double z,
const IdList & ids) const {
Complex gvhh(0.,0.);
getCouplings(gvhh,ids);
return norm(gvhh)*(1.-z)*z;
}
double OneZeroZeroEWSplitFn::ratioP(const double z, const Energy2 t,
const IdList & ids, const bool mass,
const RhoDMatrix & rho) const {
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// ratio in the massless limit
double val = rho00+rho22;
// the massive limit
if(mass){
// get the running mass
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
val += ((m0t2*sqr(-1.+2.*z)*rho11)/2.+(-(m1t2*(1.-z))-m2t2*z+m0t2*(1.-z)*z)
*(rho00+rho22))/((1.-z)*z);
}
return val;
}
double OneZeroZeroEWSplitFn::integOverP(const double z,
const IdList & ids,
unsigned int PDFfactor) const {
Complex gvhh(0.,0.);
getCouplings(gvhh,ids);
double pre = norm(gvhh);
switch (PDFfactor) {
case 0:
return pre/6.*(3.-2.*z)*sqr(z);
case 1:
case 2:
case 3:
default:
throw Exception() << "OneZeroZeroEWSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
double OneZeroZeroEWSplitFn::invIntegOverP(const double r, const IdList & ids,
unsigned int PDFfactor) const {
Complex gvhh(0.,0.);
getCouplings(gvhh,ids);
double pre = norm(gvhh);
switch (PDFfactor) {
case 0:
return (1.-pre/pow(-pow(pre,3)+12.*pow(pre,2)*r+2.*sqrt(6.)
*sqrt(-(pow(pre,4)*(pre-6.*r)*r)),1./3.)- pow(-pow(pre,3)+12.
*pow(pre,2)*r+2.*sqrt(6)*sqrt(-(pow(pre,4)*(pre-6.*r)*r)),1./3.)/pre)/2.;
case 1:
case 2:
case 3:
default:
throw Exception() << "OneZeroZeroEWSplitFn::invIntegOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
bool OneZeroZeroEWSplitFn::accept(const IdList &ids) const {
if(ids.size()!=3)
return false;
if(_couplingValueIm==0.&&_couplingValueRe==0.)
return false;
if(ids[0]->iCharge()!=ids[1]->iCharge()+ids[2]->iCharge())
return false;
- bool isGVB = (abs(ids[0]->id())==ParticleID::Wplus
- || abs(ids[0]->id())==ParticleID::Z0
- || abs(ids[0]->id())==ParticleID::gamma);
- if(isGVB && ids[1]->iSpin()==PDT::Spin0 && ids[2]->iSpin()==PDT::Spin0)
+ if(ids[0]->iSpin()==PDT::Spin1 && ids[1]->iSpin()==PDT::Spin0 && ids[2]->iSpin()==PDT::Spin0)
return true;
else
return false;
}
vector<pair<int, Complex> >
OneZeroZeroEWSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
vector<pair<int, Complex> >
OneZeroZeroEWSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
DecayMEPtr OneZeroZeroEWSplitFn::matrixElement(const double z, const Energy2 t,
const IdList & ids, const double phi,
bool) {
Complex gvhh(0.,0.);
getCouplings(gvhh,ids);
// calculate the kernal
DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin0,PDT::Spin0)));
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
Complex phase = exp(Complex(0.,1.)*phi);
Complex cphase = conj(phase);
double sqrtmass = sqrt(m0t2*z*(1.-z)-m1t2*(1.-z)-m2t2*z+z*(1.-z));
// assign kernel
(*kernal)(0,0,0) = -cphase*sqrtmass; // 111
(*kernal)(1,0,0) = sqrt(m0t2)*(1.-2.*z)/sqrt(2.); // 211 -> 411
(*kernal)(2,0,0) = phase*sqrtmass; // 311
// return the answer
return kernal;
}
diff --git a/Shower/QTilde/SplittingFunctions/ZeroZeroOneEWSplitFn.cc b/Shower/QTilde/SplittingFunctions/ZeroZeroOneEWSplitFn.cc
--- a/Shower/QTilde/SplittingFunctions/ZeroZeroOneEWSplitFn.cc
+++ b/Shower/QTilde/SplittingFunctions/ZeroZeroOneEWSplitFn.cc
@@ -1,219 +1,213 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the ZeroZeroOneEWSplitFn class.
//
#include "ZeroZeroOneEWSplitFn.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/ParticleData.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Models/StandardModel/SMFFHVertex.h"
#include "ThePEG/Interface/Parameter.h"
using namespace Herwig;
IBPtr ZeroZeroOneEWSplitFn::clone() const {
return new_ptr(*this);
}
IBPtr ZeroZeroOneEWSplitFn::fullclone() const {
return new_ptr(*this);
}
void ZeroZeroOneEWSplitFn::persistentOutput(PersistentOStream & os) const {
os << _couplingValueIm << _couplingValueRe;
}
void ZeroZeroOneEWSplitFn::persistentInput(PersistentIStream & is, int) {
is >> _couplingValueIm >> _couplingValueRe;
}
// The following static variable is needed for the type description system in ThePEG.
DescribeClass<ZeroZeroOneEWSplitFn,SplittingFunction>
describeHerwigZeroZeroOneEWSplitFn("Herwig::ZeroZeroOneEWSplitFn", "HwShower.so");
void ZeroZeroOneEWSplitFn::Init() {
static ClassDocumentation<ZeroZeroOneEWSplitFn> documentation
("The ZeroZeroOneEWSplitFn class implements purly beyond SM electroweak splittings H->H'V");
static Parameter<ZeroZeroOneEWSplitFn, double> interfaceCouplingValueIm
("CouplingValue.Im",
"The numerical value (imaginary part) of the splitting coupling to be imported for BSM splittings",
&ZeroZeroOneEWSplitFn::_couplingValueIm, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
static Parameter<ZeroZeroOneEWSplitFn, double> interfaceCouplingValueRe
("CouplingValue.Re",
"The numerical value (real part) of the splitting coupling to be imported for BSM splittings",
&ZeroZeroOneEWSplitFn::_couplingValueRe, 0.0, -1.0E6, +1.0E6,
false, false, Interface::limited);
}
void ZeroZeroOneEWSplitFn::doinit() {
SplittingFunction::doinit();
}
void ZeroZeroOneEWSplitFn::getCouplings(Complex & g, const IdList &) const {
g = Complex(_couplingValueRe,_couplingValueIm);
}
double ZeroZeroOneEWSplitFn::P(const double z, const Energy2 t,
const IdList &ids, const bool mass, const RhoDMatrix & rho) const {
Complex ghhv(0.,0.);
getCouplings(ghhv,ids);
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// the splitting in the massless limit
double val = z*(rho00+rho22)/(1.-z);
// the massive limit
if(mass){
// get the running mass
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
val += (m2t2*sqr(1.+z)*rho11)/(2.*sqr(1.-z))+((-(m1t2*(1.-z))
-m2t2*z+m0t2*(1.-z)*z)*(rho00+rho22))/sqr(1.-z);
}
return norm(ghhv)*val;
}
double ZeroZeroOneEWSplitFn::overestimateP(const double z,
const IdList & ids) const {
Complex ghhv(0.,0.);
getCouplings(ghhv,ids);
return norm(ghhv)*z/(1.-z);
}
double ZeroZeroOneEWSplitFn::ratioP(const double z, const Energy2 t,
const IdList & ids, const bool mass,
const RhoDMatrix & rho) const {
double rho00 = abs(rho(0,0));
double rho11 = abs(rho(1,1));
double rho22 = abs(rho(2,2));
// ratio in the massless limit
double val = rho00+rho22;
// the massive limit
if(mass){
// get the running mass
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
val += ((1.-z)*(m2t2*sqr(1.+z)*rho11+2*(m1t2*(-1.+z)
-(m2t2+m0t2*(-1.+z))*z)*(rho00+rho22)))/(2.*sqr(-1.+z)*z);
}
return val;
}
double ZeroZeroOneEWSplitFn::integOverP(const double z,
const IdList & ids,
unsigned int PDFfactor) const {
Complex ghhv(0.,0.);
getCouplings(ghhv,ids);
double pre = norm(ghhv);
switch (PDFfactor) {
case 0:
return -pre*(z+log(1.-z));
case 1:
case 2:
case 3:
default:
throw Exception() << "ZeroZeroOneEWSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
double ZeroZeroOneEWSplitFn::invIntegOverP(const double r, const IdList & ids,
unsigned int PDFfactor) const {
Complex ghhv(0.,0.);
getCouplings(ghhv,ids);
double pre = norm(ghhv);
switch (PDFfactor) {
case 0:
return 1.-exp(-(1+r/pre));;
case 1:
case 2:
case 3:
default:
throw Exception() << "ZeroZeroOneEWSplitFn::invIntegOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
bool ZeroZeroOneEWSplitFn::accept(const IdList &ids) const {
if(ids.size()!=3)
return false;
if(_couplingValueIm==0.&&_couplingValueRe==0.)
return false;
if(ids[0]->iCharge()!=ids[1]->iCharge()+ids[2]->iCharge())
return false;
- bool is1GVB = (abs(ids[1]->id())==ParticleID::Wplus
- || abs(ids[1]->id())==ParticleID::Z0
- || abs(ids[1]->id())==ParticleID::gamma);
- bool is2GVB = (abs(ids[2]->id())==ParticleID::Wplus
- || abs(ids[2]->id())==ParticleID::Z0
- || abs(ids[2]->id())==ParticleID::gamma);
- if(ids[0]->iSpin()==PDT::Spin0 && is1GVB && ids[2]->iSpin()==PDT::Spin0)
+ if(ids[0]->iSpin()==PDT::Spin0 && ids[1]->iSpin()==PDT::Spin1 && ids[2]->iSpin()==PDT::Spin0)
return true;
- else if(ids[0]->iSpin()==PDT::Spin0 && ids[1]->iSpin()==PDT::Spin0 && is2GVB)
+ else if(ids[0]->iSpin()==PDT::Spin0 && ids[1]->iSpin()==PDT::Spin0 && ids[2]->iSpin()==PDT::Spin1)
return true;
else
return false;
}
vector<pair<int, Complex> >
ZeroZeroOneEWSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
vector<pair<int, Complex> >
ZeroZeroOneEWSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
const RhoDMatrix &) {
// no dependence on the spin density matrix, dependence on off-diagonal terms cancels
// and rest = splitting function for Tr(rho)=1 as required by defn
return vector<pair<int, Complex> >(1,make_pair(0,1.));
}
DecayMEPtr ZeroZeroOneEWSplitFn::matrixElement(const double z, const Energy2 t,
const IdList & ids, const double phi,
bool) {
Complex ghhv(0.,0.);
getCouplings(ghhv,ids);
// calculate the kernal
DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin0,PDT::Spin0)));
double m0t2 = sqr(getParticleData(ids[0]->id())->mass())/t;
double m1t2 = sqr(getParticleData(ids[1]->id())->mass())/t;
double m2t2 = sqr(getParticleData(ids[2]->id())->mass())/t;
Complex phase = exp(Complex(0.,1.)*phi);
Complex cphase = conj(phase);
double sqrtmass = sqrt(m0t2*z*(1.-z)-m1t2*(1.-z)-m2t2*z+z*(1.-z));
// assign kernel
(*kernal)(0,0,0) = -phase*ghhv*sqrtmass/(1.-z); // 111
(*kernal)(1,0,0) = -sqrt(m2t2)*(1.+z)/sqrt(2.*(1.-z)); // 211 -> 411
(*kernal)(2,0,0) = cphase*ghhv*sqrtmass/(1.-z); // 311
// return the answer
return kernal;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Dec 21, 5:00 PM (15 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4020363
Default Alt Text
(34 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment