diff --git a/MatrixElement/EW/SoftSudakov.cc b/MatrixElement/EW/SoftSudakov.cc --- a/MatrixElement/EW/SoftSudakov.cc +++ b/MatrixElement/EW/SoftSudakov.cc @@ -1,885 +1,1050 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the SoftSudakov class. // #include "SoftSudakov.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/EventRecord/Particle.h" #include "ThePEG/Repository/UseRandom.h" #include "ThePEG/Repository/EventGenerator.h" #include "ThePEG/Utilities/DescribeClass.h" #include "GroupInvariants.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "expm-1.h" using namespace Herwig; using namespace GroupInvariants; SoftSudakov::SoftSudakov() : K_ORDER_(3), integrator_(0.,1e-5,1000) {} SoftSudakov::~SoftSudakov() {} IBPtr SoftSudakov::clone() const { return new_ptr(*this); } IBPtr SoftSudakov::fullclone() const { return new_ptr(*this); } void SoftSudakov::persistentOutput(PersistentOStream & os) const { os << K_ORDER_; } void SoftSudakov::persistentInput(PersistentIStream & is, int) { is >> K_ORDER_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigSoftSudakov("Herwig::SoftSudakov", "HwMEEW.so"); void SoftSudakov::Init() { static ClassDocumentation documentation ("The SoftSudakov class implements the soft EW Sudakov"); } InvEnergy SoftSudakov::operator ()(Energy mu) const { // Include K-factor Contributions (Cusps): GaugeContributions cusp = cuspContributions(mu,K_ORDER_,high_); Complex gamma = cusp.SU3*G3_(row_,col_) + cusp.SU2*G2_(row_,col_) + cusp.U1*G1_(row_,col_); if (real_) { return gamma.real()/mu; } else { return gamma.imag()/mu; } } boost::numeric::ublas::matrix SoftSudakov::evaluateSoft(boost::numeric::ublas::matrix & G3, boost::numeric::ublas::matrix & G2, boost::numeric::ublas::matrix & G1, Energy mu_h, Energy mu_l, bool high) { assert( G3.size1() == G2.size1() && G3.size1() == G1.size1() && G3.size2() == G2.size2() && G3.size2() == G1.size2() && G3.size1() == G3.size2()); G3_ = G3; G2_ = G2; G1_ = G1; high_ = high; unsigned int NN = G3_.size1(); // gamma is the matrix to be numerically integrated to run the coefficients. boost::numeric::ublas::matrix gamma(NN,NN); for(row_=0;row_ SoftSudakov::lowEnergyRunning(Energy EWScale, Energy lowScale, Energy2 s, Energy2 t, Energy2 u, Herwig::EWProcess::Process process) { using namespace EWProcess; using Constants::pi; static const Complex I(0,1.0); Complex T = getT(s,t), U = getU(s,u); boost::numeric::ublas::matrix G1, G2, G3; unsigned int numBrokenGauge; switch (process) { case QQQQ: case QQQQiden: case QtQtQQ: { numBrokenGauge = 12; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); boost::numeric::ublas::matrix gam3 = Gamma3(U,T); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); boost::numeric::ublas::matrix gam3 = Gamma3(U,T); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); boost::numeric::ublas::matrix gam3 = Gamma3(U,T); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - G1 *= 0.0; G2 *= 0.0; G3 *= 0.0; Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i<2; i++) { G3(i,i) += gam3s; } G1(0,0) = Gamma1(2.0/3.0,-1.0,T,U); G1(1,1) = Gamma1(-1.0/3.0,-1.0,T,U); } break; case UUUU: case UUUUiden: case tRtRUU: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - G1 *= 0.0; G2 *= 0.0; G3 *= 0.0; G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,2.0/3.0,T,U); break; case UUDD: case tRtRDD: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,2.0/3.0,T,U); break; case UULL: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3(0,0) = G3(1,1) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(2.0/3.0,0.0,T,U); G1(1,1) = Gamma1(2.0/3.0,-1.0,T,U); break; case UUEE: numBrokenGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(2.0/3.0,-1.0,T,U); break; case DDDD: case DDDDiden: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,-1.0/3.0,T,U); break; case DDLL: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3(0,0) = G3(1,1) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(-1.0/3.0,0.0,T,U); G1(1,1) = Gamma1(-1.0/3.0,-1.0,T,U); break; case DDEE: numBrokenGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(-1.0/3.0,-1.0,T,U); break; case LLLL: case LLLLiden: numBrokenGauge = 6; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G1(0,0) = Gamma1(0.0,0.0,0.0,0.0,T,U); G1(1,1) = Gamma1(-1.0,-1.0,0.0,0.0,T,U); G1(2,2) = Gamma1(0.0,0.0,-1.0,-1.0,T,U); G1(3,3) = Gamma1(-1.0,-1.0,-1.0,-1.0,T,U); G1(4,4) = Gamma1(-1.0,0.0,0.0,-1.0,T,U); G1(5,5) = Gamma1(0.0,-1.0,-1.0,0.0,T,U); break; case LLEE: numBrokenGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G1(0,0) = Gamma1(0.0,-1.0,T,U); G1(1,1) = Gamma1(-1.0,-1.0,T,U); break; case EEEE: case EEEEiden: numBrokenGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G1(0,0) = Gamma1(-1.0,-1.0,T,U); break; case QQWW: { numBrokenGauge = 20; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); boost::numeric::ublas::matrix gam3g = Gamma3g(U,T); for(unsigned int ix=0;ix<3;++ix) { for(unsigned int iy=0;iy<3;++iy) { G3(ix ,iy ) = gam3g(ix,iy); G3(ix+3,iy+3) = gam3g(ix,iy); } } G1(0,0) = G1(1,1) = G1(2,2) = Gamma1(2./3.,0.,T,U); G1(3,3) = G1(4,4) = G1(5,5) = Gamma1(-1./3.,0.,T,U); } break; case LLWW: numBrokenGauge = 20; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G1(0,0) = Gamma1(0.,0.,-1.,-1.,T,U); G1(1,1) = Gamma1(0.,0.,1.,1.,T,U); G1(2,2) = Gamma1(0.,0.,0.,0.,T,U); G1(3,3) = Gamma1(0.,0.,0.,0.,T,U); G1(4,4) = Gamma1(0.,0.,0.,0.,T,U); G1(5,5) = Gamma1(0.,0.,0.,0.,T,U); G1(6,6) = Gamma1(-1.,-1.,-1.,-1.,T,U); G1(7,7) = Gamma1(-1.,-1.,1.,1.,T,U); G1(8,8) = Gamma1(-1.,-1.,0.,0.,T,U); G1(9,9) = Gamma1(-1.,-1.,0.,0.,T,U); G1(10,10) = Gamma1(-1.,-1.,0.,0.,T,U); G1(11,11) = Gamma1(-1.,-1.,0.,0.,T,U); G1(12,12) = Gamma1(-1.,0.,0.,-1.,T,U); G1(13,13) = Gamma1(-1.,0.,0.,-1.,T,U); G1(14,14) = Gamma1(-1.,0.,1.,0.,T,U); G1(15,15) = Gamma1(-1.,0.,1.,0.,T,U); G1(16,16) = Gamma1(0.,-1.,-1.,0.,T,U); G1(17,17) = Gamma1(0.,-1.,-1.,0.,T,U); G1(18,18) = Gamma1(0.,-1.,0.,1.,T,U); G1(19,19) = Gamma1(0.,-1.,0.,1.,T,U); break; case LLPhiPhi: numBrokenGauge = 14; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - G1 *= 0.0; G2 *= 0.0; G3 *= 0.0; G1(0,0) = Gamma1(0.,0.,1.,1.,T,U); G1(1,1) = Gamma1(0.,0.,0.,0.,T,U); G1(2,2) = Gamma1(0.,0.,0.,0.,T,U); G1(3,3) = Gamma1(0.,0.,0.,0.,T,U); G1(4,4) = Gamma1(0.,0.,0.,0.,T,U); G1(5,5) = Gamma1(-1.,-1.,1.,1.,T,U); G1(6,6) = Gamma1(-1.,-1.,0.,0.,T,U); G1(7,7) = Gamma1(-1.,-1.,0.,0.,T,U); G1(8,8) = Gamma1(-1.,-1.,0.,0.,T,U); G1(9,9) = Gamma1(-1.,-1.,0.,0.,T,U); G1(10,10) = Gamma1(-1.,0.,1.,0.,T,U); G1(11,11) = Gamma1(-1.,0.,1.,0.,T,U); G1(12,12) = Gamma1(0.,-1.,0.,1.,T,U); G1(13,13) = Gamma1(0.,-1.,0.,1.,T,U); break; case UUBB: { numBrokenGauge = 4; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam1 = Gamma1(2./3.,0.,T,U); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = Gamma3g(U,T); G1(0,0) = G1(1,1) = G1(2,2) = Gamma1(2./3.,0.,T,U); break; case DDBB: { numBrokenGauge = 4; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); Complex gam1 = Gamma1(-1./3.,0.,T,U); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = Gamma3g(U,T); G1(0,0) = G1(1,1) = G1(2,2) = Gamma1(-1./3.,0.,T,U); break; case EEBB: { numBrokenGauge = 4; G1 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); Complex gam1 = Gamma1(-1.,0.,T,U); for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); G2 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G3 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); G1(0,0) = Gamma1(-1.,1.,T,U); G1(1,1) = G1(2,2) = G1(3,3) = G1(4,4) = Gamma1(-1.,0.,T,U); break; default: assert(false); } // return the answer if (EWScale==lowScale) { return boost::numeric::ublas::identity_matrix(G1.size1()); } else { return evaluateSoft(G3,G2,G1,EWScale,lowScale,false); } } boost::numeric::ublas::matrix SoftSudakov::highEnergyRunning(Energy highScale, Energy EWScale, Energy2 s, Energy2 t, Energy2 u, Herwig::EWProcess::Process process) { using namespace EWProcess; using Constants::pi; static const Complex I(0,1.0); Complex T = getT(s,t), U = getU(s,u); boost::numeric::ublas::matrix G1,G2,G3; unsigned int numGauge; switch (process) { case QQQQ: case QQQQiden: case QtQtQQ: { numGauge = 4; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); boost::numeric::ublas::matrix gam3 = Gamma3(U,T); G3(0,0) += gam3(0,0); G3(0,2) += gam3(0,1); G3(2,0) += gam3(1,0); G3(2,2) += gam3(1,1); G3(1,1) += gam3(0,0); G3(1,3) += gam3(0,1); G3(3,1) += gam3(1,0); G3(3,3) += gam3(1,1); boost::numeric::ublas::matrix gam2 = Gamma2(U,T); G2(0,0) += gam2(0,0); G2(0,1) += gam2(0,1); G2(1,0) += gam2(1,0); G2(1,1) += gam2(1,1); G2(2,2) += gam2(0,0); G2(2,3) += gam2(0,1); G2(3,2) += gam2(1,0); G2(3,3) += gam2(1,1); G1(0,0) = G1(1,1) = G1(2,2) = G1(3,3) = Gamma1(1.0/6.0,1.0/6.0,T,U); } break; case QQUU: case QtQtUU: case QQtRtR: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3(U,T); G2 = Gamma2Singlet(); G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,1.0/6.0,T,U); break; case QQDD: case QtQtDD: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3(U,T); G2 = Gamma2Singlet(); G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,1.0/6.0,T,U); break; case QQLL: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3Singlet(); G2 = Gamma2(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/2.0,1.0/6.0,T,U); break; case QQEE: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(-1.0,1.0/6.0,T,U); break; case UUUU: case UUUUiden: case tRtRUU: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,2.0/3.0,T,U); break; case UUDD: case tRtRDD: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,2.0/3.0,T,U); break; case UULL: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(-1.0/2.0,2.0/3.0,T,U); break; case UUEE: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(-1.0,2.0/3.0,T,U); break; case DDDD: case DDDDiden: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,-1.0/3.0,T,U); break; case DDLL: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(-1.0/2.0,-1.0/3.0,T,U); break; case DDEE: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(-1.0,-1.0/3.0,T,U); break; case LLLL: case LLLLiden: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = Gamma2(U,T); G1(0,0) = G1(1,1) = Gamma1(-1.0/2.0,-1.0/2.0,T,U); break; case LLEE: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(-1.0,-1.0/2.0,T,U); break; case EEEE: case EEEEiden: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G1(0,0) = Gamma1(-1.0,-1.0,T,U); break; case QQWW: { numGauge = 5; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); Complex gam3s = Gamma3Singlet()(0,0); for (unsigned int i=0; i<5; i++) { G3(i,i) = gam3s; G1(i,i) = Gamma1(1.0/6.0); } G2 = Gamma2w(U,T); } break; case QQPhiPhi: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3Singlet(); G2 = Gamma2(U,T); G1(0,0) = G1(1,1) = Gamma1(1.0/2.0,1.0/6.0,T,U); break; case QQWG: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = -17.0/6.0*I*pi + 3.0/2.0*(U+T); G2(0,0) = -7.0/4.0*I*pi + (U+T); G1(0,0) = Gamma1(1.0/6.0); break; case QQBG: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = -4.0/3.0*I*pi + 3.0/2.0*(U+T-I*pi); G2(0,0) = -3.0/4.0*I*pi; G1(0,0) = Gamma1(1.0/6.0); break; case QQGG: case QtQtGG: { numGauge = 3; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3g(U,T); Complex gam2s = Gamma2Singlet()(0,0); for (unsigned int i=0; i<3; i++) { G2(i,i) = gam2s; G1(i,i) = Gamma1(1.0/6.0); } } break; case LLWW: numGauge = 5; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); for (unsigned int i=0; i<5; i++) { G1(i,i) = Gamma1(-1.0/2.0); } G2 = Gamma2w(U,T); break; case LLPhiPhi: numGauge = 2; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = Gamma2(U,T); G1(0,0) = G1(1,1) = Gamma1(1.0/2.0,-1.0/2.0,T,U); break; case UUBB: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(2.0/3.0); break; case UUPhiPhi: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(1.0/2.0,2.0/3.0,T,U); break; case UUBG: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = -4.0/3.0*I*pi + 3.0/2.0*(U+T-I*pi); G1(0,0) = Gamma1(2.0/3.0); break; case UUGG: case tRtRGG: numGauge = 3; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3g(U,T); for (unsigned int i=0; i<3; i++) { G1(i,i) = Gamma1(2.0/3.0); } break; case DDBB: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G1(0,0) = Gamma1(-1.0/3.0); break; case DDPhiPhi: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = Gamma3Singlet()(0,0); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(1.0/2.0,-1.0/3.0,T,U); break; case DDBG: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3(0,0) = -4.0/3.0*I*pi + 3.0/2.0*(U+T-I*pi); G1(0,0) = Gamma1(-1.0/3.0); break; case DDGG: numGauge = 3; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = Gamma3g(U,T); for (unsigned int i=0; i<3; i++) { G1(i,i) = Gamma1(-1.0/3.0); } break; case EEBB: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G1(0,0) = Gamma1(-1.0); break; case EEPhiPhi: numGauge = 1; G1 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G3 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); G2(0,0) = Gamma2Singlet()(0,0); G1(0,0) = Gamma1(1.0/2.0,-1.0,T,U); break; default: assert(false); } return evaluateSoft(G3,G2,G1,highScale,EWScale,true); } + +unsigned int SoftSudakov::numberGauge(Herwig::EWProcess::Process process) { + using namespace EWProcess; + switch (process) { + case QQQQ: + case QQQQiden: + case QtQtQQ: + return 4; + case QQUU: + case QtQtUU: + case QQtRtR: + return 2; + case QQDD: + case QtQtDD: + return 2; + case QQLL: + return 2; + case QQEE: + return 1; + case UUUU: + case UUUUiden: + case tRtRUU: + return 2; + case UUDD: + case tRtRDD: + return 2; + case UULL: + return 1; + case UUEE: + return 1; + case DDDD: + case DDDDiden: + return 2; + case DDLL: + return 1; + case DDEE: + return 1; + case LLLL: + case LLLLiden: + return 2; + case LLEE: + return 1; + case EEEE: + case EEEEiden: + return 1; + case QQWW: + return 5; + case QQPhiPhi: + return 2; + case QQWG: + return 1; + case QQBG: + return 1; + case QQGG: + case QtQtGG: + return 3; + case LLWW: + return 5; + case LLPhiPhi: + return 2; + case UUBB: + return 1; + case UUPhiPhi: + return 1; + case UUBG: + return 1; + case UUGG: + case tRtRGG: + return 3; + case DDBB: + return 1; + case DDPhiPhi: + return 1; + case DDBG: + return 1; + case DDGG: + return 3; + case EEBB: + return 1; + case EEPhiPhi: + return 1; + default: + assert(false); + } +} + +unsigned int SoftSudakov::numberBrokenGauge(Herwig::EWProcess::Process process) { + using namespace EWProcess; + switch (process) { + case QQQQ: + case QQQQiden: + case QtQtQQ: + return 12; + case QQUU: + case QtQtUU: + case QQtRtR: + return 4; + case QQDD: + case QtQtDD: + return 4; + case QQLL: + return 6; + case QQEE: + return 2; + case UUUU: + case UUUUiden: + case tRtRUU: + return 2; + case UUDD: + case tRtRDD: + return 2; + case UULL: + return 2; + case UUEE: + return 1; + case DDDD: + case DDDDiden: + return 2; + case DDLL: + return 2; + case DDEE: + return 1; + case LLLL: + case LLLLiden: + return 6; + case EEEE: + case EEEEiden: + return 1; + case QQWW: + return 20; + case QQPhiPhi: + return 14; + case QQWG: + return 6; + case QQBG: + return 4; + case QQGG: + case QtQtGG: + return 6; + case LLWW: + return 20; + case LLPhiPhi: + return 14; + case UUBB: + return 4; + case UUPhiPhi: + return 5; + case UUBG: + return 2; + case UUGG: + case tRtRGG: + return 3; + case DDBB: + return 4; + case DDPhiPhi: + return 5; + case DDBG: + return 2; + case DDGG: + return 3; + case EEBB: + return 4; + case EEPhiPhi: + return 5; + default: + assert(false); + } +} diff --git a/MatrixElement/EW/SoftSudakov.h b/MatrixElement/EW/SoftSudakov.h --- a/MatrixElement/EW/SoftSudakov.h +++ b/MatrixElement/EW/SoftSudakov.h @@ -1,181 +1,191 @@ // -*- C++ -*- #ifndef Herwig_SoftSudakov_H #define Herwig_SoftSudakov_H // // This is the declaration of the SoftSudakov class. // #include "ThePEG/Interface/Interfaced.h" #include "Herwig/Utilities/GSLIntegrator.h" #include #include "EWProcess.h" #include "SoftSudakov.fh" namespace Herwig { using namespace ThePEG; /** * Here is the documentation of the SoftSudakov class. * * @see \ref SoftSudakovInterfaces "The interfaces" * defined for SoftSudakov. */ class SoftSudakov: public Interfaced { public: /** @name Standard constructors and destructors. */ //@{ /** * The default constructor. */ SoftSudakov(); /** * The destructor. */ virtual ~SoftSudakov(); //@} public: /** * Low energy soft evolution */ boost::numeric::ublas::matrix lowEnergyRunning(Energy EWScale, Energy lowScale, Energy2 s, Energy2 t, Energy2 u, Herwig::EWProcess::Process process); /** * Evalaute the high energy running as a matrix */ boost::numeric::ublas::matrix highEnergyRunning(Energy highScale, Energy EWScale, Energy2 s, Energy2 t, Energy2 u, Herwig::EWProcess::Process process); + /** + * Number of operators for the broken theory at low energy + */ + unsigned int numberBrokenGauge(Herwig::EWProcess::Process process); + + /** + * Number of operators for the unbroken theory at high energy + */ + unsigned int numberGauge(Herwig::EWProcess::Process process); + protected: /** * Evaluate the soft evolution */ boost::numeric::ublas::matrix evaluateSoft(boost::numeric::ublas::matrix & G3, boost::numeric::ublas::matrix & G2, boost::numeric::ublas::matrix & G1, Energy mu_h, Energy mu_l, bool high); public: /** * The operator to be integrated */ InvEnergy operator ()(Energy mu) const; /** Argument type for GaussianIntegrator */ typedef Energy ArgType; /** Return type for GaussianIntegrator */ typedef InvEnergy ValType; public: /** @name Functions used by the persistent I/O system. */ //@{ /** * Function used to write out object persistently. * @param os the persistent output stream written to. */ void persistentOutput(PersistentOStream & os) const; /** * Function used to read in object persistently. * @param is the persistent input stream read from. * @param version the version number of the object when written. */ void persistentInput(PersistentIStream & is, int version); //@} /** * The standard Init function used to initialize the interfaces. * Called exactly once for each class by the class description system * before the main function starts or * when this class is dynamically loaded. */ static void Init(); protected: /** @name Clone Methods. */ //@{ /** * Make a simple clone of this object. * @return a pointer to the new object. */ virtual IBPtr clone() const; /** Make a clone of this object, possibly modifying the cloned object * to make it sane. * @return a pointer to the new object. */ virtual IBPtr fullclone() const; //@} private: /** * The assignment operator is private and must never be called. * In fact, it should not even be implemented. */ SoftSudakov & operator=(const SoftSudakov &); private: /** * Order for K */ unsigned int K_ORDER_; /** * Integrator */ GSLIntegrator integrator_; /** * Whether doing the high or low scale contribution */ bool high_; /** * Column */ unsigned int row_; /** * Row */ unsigned int col_; /** * */ bool real_; /** * */ boost::numeric::ublas::matrix G1_; /** * */ boost::numeric::ublas::matrix G2_; /** * */ boost::numeric::ublas::matrix G3_; }; } #endif /* Herwig_SoftSudakov_H */