diff --git a/MatrixElement/EW/CollinearSudakov.cc b/MatrixElement/EW/CollinearSudakov.cc deleted file mode 100644 --- a/MatrixElement/EW/CollinearSudakov.cc +++ /dev/null @@ -1,2075 +0,0 @@ -// -*- C++ -*- -// -// This is the implementation of the non-inlined, non-templated member -// functions of the CollinearSudakov class. -// - -#include "CollinearSudakov.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 "ElectroWeakReweighter.h" -#include "ThePEG/Persistency/PersistentOStream.h" -#include "ThePEG/Persistency/PersistentIStream.h" - -using namespace Herwig; - -namespace { - -void DuplicateColumn0(boost::numeric::ublas::matrix &orig) { - for (unsigned int i=0; i> K_ORDER_ >> B_ORDER_; -} - - -// The following static variable is needed for the type -// description system in ThePEG. -DescribeClass -describeHerwigCollinearSudakov("Herwig::CollinearSudakov", "HwMEEW.so"); - -void CollinearSudakov::Init() { - - static ClassDocumentation documentation - ("The CollinearSudakov class implements the collinear evolution"); - - -} - - -Complex CollinearSudakov::highScaleIntegral(bool SU3, bool SU2, double Y, - Energy2 s, Energy mu_h, Energy mu_l, - bool fermion, bool longitudinal, - double yukFactor) { - SU3_ = SU3; - SU2_ = SU2; - Y_ = Y; - s_ = s; - fermion_ = fermion; - longitudinal_ = longitudinal; - yukFactor_ = yukFactor; - // perform the integral - Complex result; - high_ = true; - // real piece - real_ = true; - result.real(integrator_.value(*this,mu_h,mu_l)); - // imaginary piece - real_ = false; - result.imag(integrator_.value(*this,mu_h,mu_l)); - // return the answer - return exp(result); -} - -Complex CollinearSudakov::lowScaleIntegral(bool SU3, double Q, Energy2 s, - Energy mu_h, Energy mu_l, bool fermion, - double boostFactor) { - SU3_ = SU3; - Q_ = Q; - s_ = s; - fermion_ = fermion; - boostFactor_ = boostFactor; - // perform the integral - Complex result; - high_ = false; - // real piece - real_ = true; - result.real(integrator_.value(*this,mu_h,mu_l)); - // imaginary piece - real_ = false; - result.imag(integrator_.value(*this,mu_h,mu_l)); - // return the answer - return exp(result); -} - -InvEnergy CollinearSudakov::highScaleIntegrand(Energy mu) const { - using namespace GroupInvariants; - using Constants::pi; - Complex gamma = 0.0; - // Include K-factor Contributions (Cusps): - GaugeContributions cusp = cuspContributions(mu,K_ORDER_,high_); - // Include B-factors (B1 for U1, B2 for SU2, B3 for SU3): - GaugeContributions nonCusp = BContributions(mu,B_ORDER_,fermion_,longitudinal_); - // common log - Complex plog = PlusLog(s_/sqr(mu)); - // SU(3) - if(SU3_) { - if(fermion_) - gamma += C_F(3)*cusp.SU3*0.5*plog + 0.5*nonCusp.SU3; - else - gamma += (C_A(3))*cusp.SU3*0.5*plog + 0.5*nonCusp.SU3; - } - // SU(2) - if(SU2_) { - if (fermion_ || longitudinal_ ) - gamma += (C_F(2))*cusp.SU2*0.5*plog + 0.5*nonCusp.SU2; - else - gamma += (C_A(2))*cusp.SU2*0.5*plog + 0.5*nonCusp.SU2; - } - - if (fermion_ || longitudinal_ ) { - gamma += sqr(Y_)*(cusp.U1*0.5*plog + 0.5*nonCusp.U1); - } - else { - // U(1) Gauge boson - if (!SU3_ && !SU2_ && abs(Y_)<0.001) { - gamma += 0.5*nonCusp.U1; - } - } - // top Yukawa piece - double y_t = ElectroWeakReweighter::coupling()->y_t(mu); - gamma += yukFactor_*sqr(y_t)/(16.0*sqr(pi)); - // return the answer - return real_ ? gamma.real()/mu : gamma.imag()/mu; -} - -InvEnergy CollinearSudakov::lowScaleIntegrand(Energy mu) const { - using namespace GroupInvariants; - using Constants::pi; - Complex gamma = 0.0; - // Include K-factor Contributions (Cusps): - GaugeContributions cusp = cuspContributions(mu,K_ORDER_,false); - // Include B-factors (B1 for U1, B2 for SU2, B3 for SU3): - GaugeContributions nonCusp = BContributionsLow(mu,B_ORDER_,fermion_,boostFactor_); - // common log - Complex plog = PlusLog(s_/sqr(mu)); - Complex blog(0.); - if(boostFactor_ >0.001) blog = PlusLog(4.0*boostFactor_); - // SU(3) - if (SU3_) { - if (fermion_) { - // not a bHQET top quark field - if (abs(boostFactor_)<0.001) - gamma += C_F(3)*cusp.SU3*0.5*plog + 0.5*nonCusp.SU3; - else - gamma += C_F(3)*cusp.SU3*0.5*blog + 0.5*nonCusp.SU3; - } - else { - gamma += C_A(3)*cusp.SU3*0.5*plog + 0.5*nonCusp.SU3; - } - } - // fermions - if (fermion_) { - // not a bHQET top quark field - if (abs(boostFactor_)<0.001) - gamma += sqr(Q_)*(cusp.U1*0.5*plog + 0.5*nonCusp.U1); - else - gamma += sqr(Q_)*(cusp.U1*0.5*blog + 0.5*nonCusp.U1); - } - else { - // i.e., not a fermion, not a bHQ, not a gluon => photon - if (abs(boostFactor_)<0.001 && !SU3_) - gamma += 0.5*nonCusp.U1; - // i.e., W treated as a bHQET field - else if (abs(boostFactor_)>0.001) - gamma += sqr(Q_)*(cusp.U1*0.5*blog + 0.5*nonCusp.U1); - } - // return the answer - return real_ ? gamma.real()/mu : gamma.imag()/mu; -} - -void CollinearSudakov::evaluateHighScale(Energy highScale, Energy EWScale, Energy2 S) { - double yCoeffQt(0.), yCoefftR(0.), yCoeffPhi(0.); - if (K_ORDER_ >= 1) { - yCoeffQt = 0.5; - yCoefftR = 1.0; - yCoeffPhi = 3.0; - } - highColW_ = highScaleIntegral(false,true ,0.0 ,S,highScale,EWScale,false,false,0.0); - highColB_ = highScaleIntegral(false,false,0.0 ,S,highScale,EWScale,false,false,0.0); - highColG_ = highScaleIntegral(true ,false,0.0 ,S,highScale,EWScale,false,false,0.0); - highColQ_ = highScaleIntegral(true ,true ,1./6. ,S,highScale,EWScale,true,false,0.0); - highColQt_ = highScaleIntegral(true ,true ,1./6. ,S,highScale,EWScale,true,false,yCoeffQt); - highColU_ = highScaleIntegral(true ,false,2./3. ,S,highScale,EWScale,true,false,0.0); - highColtR_ = highScaleIntegral(true ,false,2./3. ,S,highScale,EWScale,true,false,yCoefftR); - highColD_ = highScaleIntegral(true ,false,-1./3.,S,highScale,EWScale,true,false,0.0); - highColL_ = highScaleIntegral(false,true ,-1./2.,S,highScale,EWScale,true,false,0.0); - highColE_ = highScaleIntegral(false,false,-1. ,S,highScale,EWScale,true,false,0.0); - highColPhi_ = highScaleIntegral(false,true ,1./2. ,S,highScale,EWScale,false,true,yCoeffPhi); -} - -void CollinearSudakov::evaluateLowScale(Energy EWScale, Energy lowScale, Energy2 S) { - lowColW_ = lowScaleIntegral(false,1. ,S,EWScale,lowScale,false, - S/sqr(2.*ElectroWeakReweighter::coupling()->mW())); - lowColA_ = lowScaleIntegral(false,0. ,S,EWScale,lowScale,false,0.0); - lowColG_ = lowScaleIntegral(true ,0. ,S,EWScale,lowScale,false,0.0); - lowColU_ = lowScaleIntegral(true ,2./3. ,S,EWScale,lowScale,true,0.0); - lowColt_ = lowScaleIntegral(true ,2./3. ,S,EWScale,lowScale,true, - S/sqr(2.*ElectroWeakReweighter::coupling()->mT())); - lowColD_ = lowScaleIntegral(true ,-1./3.,S,EWScale,lowScale,true,0.0); - lowColE_ = lowScaleIntegral(false,-1. ,S,EWScale,lowScale,true,0.0); -} - -void CollinearSudakov::evaluateMatching(Energy EWScale,Energy2 s) { - using Constants::pi; - using GroupInvariants::PlusLog; - static const Complex I(0,1.0); - // wave function corrections - WaveFunctionCorrections WFC = waveFunctionCorrections(EWScale); - - double aS = ElectroWeakReweighter::coupling()->a3(EWScale); - double aEM = ElectroWeakReweighter::coupling()->aEM(EWScale); - double aW = ElectroWeakReweighter::coupling()->aW(EWScale); - double aZ = ElectroWeakReweighter::coupling()->aZ(EWScale); - double cW2 = ElectroWeakReweighter::coupling()->Cos2thW(EWScale); - double sW2 = ElectroWeakReweighter::coupling()->Sin2thW(EWScale); - Energy mW = ElectroWeakReweighter::coupling()->mW(); - Energy mZ = ElectroWeakReweighter::coupling()->mZ(); - Energy mH = ElectroWeakReweighter::coupling()->mH(); - Energy mT = ElectroWeakReweighter::coupling()->mT(); - double gPHI = ElectroWeakReweighter::coupling()->g_phiPlus(EWScale); - double y_t = ElectroWeakReweighter::coupling()->y_t(EWScale); - - double lz = log(mZ/EWScale); - double lw = log(mW/EWScale); - - complex F_W = 4.0*lw*0.5*PlusLog(s/EWScale/EWScale)-2.0*lw*lw-2.0*lw-5.0*pi*pi/12.0+1.0; - complex F_Z = 4.0*lz*0.5*PlusLog(s/EWScale/EWScale)-2.0*lz*lz-2.0*lz-5.0*pi*pi/12.0+1.0; - - // Taken from Manohar... along with his formulae for F_tL, F_tR, and F_bL (for 3rd/1st Gen. Wavefunction Differences) - complex W1 = WFC.fFW0-0.5*WFC.aW0-0.5*WFC.cW0; - complex W2 = WFC.fF0W-0.5*WFC.a0W; - complex U1 = ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Lu(EWScale)*(WFC.fFZZ-0.5*WFC.aZZ) - - 0.5*WFC.cZZ*(ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Lu(EWScale) + - ElectroWeakReweighter::coupling()->g_Ru(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)) + - ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)*WFC.bZZ; - complex U2 = ElectroWeakReweighter::coupling()->g_Ru(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)*(WFC.fFZZ-0.5*WFC.aZZ) - - 0.5*WFC.cZZ*(ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Lu(EWScale) + - ElectroWeakReweighter::coupling()->g_Ru(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)) + - ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)*WFC.bZZ; - complex HtL = -0.5*y_t*y_t/(16.0*pi*pi)*(0.25-0.5*log(mH/EWScale)-0.5*lz+ - 0.5*WFC.atHH+0.5*WFC.atZZ+WFC.ctHH+WFC.ctZZ+ - WFC.ctW0-WFC.btHH+WFC.btZZ); - complex HtR = HtL-0.5*y_t*y_t/(16.0*pi*pi)*(0.25-lw+WFC.atW0); - complex HbL = -0.5*y_t*y_t/(16.0*pi*pi)*(0.25-lw+WFC.at0W); - - complex F_tL = (4.0/3.0*aS+4.0/9.0*aEM)/(4.0*pi)*(2.0*log(mT/EWScale)*log(mT/EWScale)-log(mT/EWScale)+ - pi*pi/12.0+2.0) + HtL + - aW/(4.0*pi)*0.5*W1 + aZ/(4.0*pi)*U1; - - complex F_tR = (4.0/3.0*aS+4.0/9.0*aEM)/(4.0*pi)*(2.0*log(mT/EWScale)*log(mT/EWScale)-log(mT/EWScale)+ - pi*pi/12.0+2.0) + HtR - - aW/(4.0*pi)*0.25*WFC.cW0 + aZ/(4.0*pi)*U2; - - complex F_bL = HbL + aW/(4.0*pi)*0.5*W2; - - Complex Dw = CollinearDw(s,EWScale); - Complex Dz = CollinearDz(s,EWScale); - - complex D_C_UL = ElectroWeakReweighter::coupling()->g_Lu(EWScale)*ElectroWeakReweighter::coupling()->g_Lu(EWScale)*Dz + 0.5*Dw; - complex D_C_DL = ElectroWeakReweighter::coupling()->g_Ld(EWScale)*ElectroWeakReweighter::coupling()->g_Ld(EWScale)*Dz + 0.5*Dw; - - complex D_C_UR = ElectroWeakReweighter::coupling()->g_Ru(EWScale)*ElectroWeakReweighter::coupling()->g_Ru(EWScale)*Dz; - complex D_C_DR = ElectroWeakReweighter::coupling()->g_Rd(EWScale)*ElectroWeakReweighter::coupling()->g_Rd(EWScale)*Dz; - - complex D_C_nuL = ElectroWeakReweighter::coupling()->g_Lnu(EWScale)*ElectroWeakReweighter::coupling()->g_Lnu(EWScale)*Dz + 0.5*Dw; - complex D_C_EL = ElectroWeakReweighter::coupling()->g_Le(EWScale)*ElectroWeakReweighter::coupling()->g_Le(EWScale)*Dz + 0.5*Dw; - complex D_C_ER = ElectroWeakReweighter::coupling()->g_Re(EWScale)*ElectroWeakReweighter::coupling()->g_Re(EWScale)*Dz; - - complex D_C_WW = aW/(4.0*pi)*cW2*(F_Z+WFC.fsWZWZ) + - aW/(4.0*pi)*cW2*(F_W+WFC.fs1ZW) + aW/(4.0*pi)*sW2*(F_W+WFC.fs10) + - aW/(4.0*pi)*sW2*(2.0*lw*lw- - 2.0*lw+pi*pi/12.0+2.0) + 0.5*WFC.RW; - complex D_C_WZ = aW/(4.0*pi)*2.0*(F_W+WFC.fsZW1) + 0.5*WFC.RZ + sqrt(sW2/cW2)*WFC.RAtoZ; - complex D_C_WA = aW/(4.0*pi)*2.0*(F_W+WFC.fs01) + 0.5*WFC.RA + sqrt(cW2/sW2)*WFC.RZtoA; - complex D_C_BZ = 0.5*WFC.RZ - sqrt(cW2/sW2)*WFC.RAtoZ; - complex D_C_BA = 0.5*WFC.RA - sqrt(sW2/cW2)*WFC.RZtoA; - - // The WFC.RW and WFC.RZ are used on purpose (instead of WFC.RPhi and WFC.RPhi3, respectively): - complex D_C_PhiW = aW/(4.0*pi)*0.25*(F_W+WFC.fs1HW) + - aW/(4.0*pi)*0.25*(F_W+WFC.fs1ZW) + aZ/(4.0*pi)*gPHI*gPHI*(F_Z+WFC.fsWZWZ) + - aW/(4.0*pi)*sW2*(2.0*lw*lw-2.0*lw+pi*pi/12.0+2.0) + - 0.5*WFC.RW + WFC.EW; - complex D_C_PhiZ = aW/(4.0*pi)*0.5*(F_W+WFC.fsZW1) + aZ/(4.0*pi)*0.25*(F_Z+WFC.fs1HZ) + 0.5*WFC.RZ + WFC.EZ; - complex D_C_PhiH = aW/(4.0*pi)*0.5*(F_W+WFC.fsHW1) + aZ/(4.0*pi)*0.25*(F_Z+WFC.fsHZ1) + 0.5*WFC.RH; - - complex D_C_GG = aS/(4.0*pi)*2.0/3.0*log(mT/EWScale); - - ULcollinearCorr_ = exp(D_C_UL); - DLcollinearCorr_ = exp(D_C_DL); - URcollinearCorr_ = exp(D_C_UR); - DRcollinearCorr_ = exp(D_C_DR); - - tLcollinearCorr_ = exp(D_C_UL+F_tL); - tRcollinearCorr_ = exp(D_C_UR+F_tR); - bLcollinearCorr_ = exp(D_C_DL+F_bL); - - nuLcollinearCorr_ = exp(D_C_nuL); - ELcollinearCorr_ = exp(D_C_EL); - ERcollinearCorr_ = exp(D_C_ER); - - WtoWcollinearCorr_ = exp(D_C_WW); - WtoZcollinearCorr_ = exp(D_C_WZ); - WtoAcollinearCorr_ = exp(D_C_WA); - BtoZcollinearCorr_ = exp(D_C_BZ); - BtoAcollinearCorr_ = exp(D_C_BA); - - PhitoWcollinearCorr_ = exp(D_C_PhiW); - PhitoZcollinearCorr_ = exp(D_C_PhiZ); - PhitoHcollinearCorr_ = exp(D_C_PhiH); - - GcollinearCorr_ = exp(D_C_GG); -} - -WaveFunctionCorrections CollinearSudakov::waveFunctionCorrections(Energy EWScale) { - static const Complex I(0.,1.); - using Constants::pi; - double lZ = 2.0*log(ElectroWeakReweighter::coupling()->mZ()/EWScale); - WaveFunctionCorrections WFC; - // From Manohar, 2/12/12: (these assume mH=125, mZ=91.1876, mW=80.399) - WFC.RW = (0.8410283377963967 - 9.424777961271568*I) + 1.2785863646210789*lZ; - WFC.RA = (1.4835982362022198 + 1.855775680704845*pow(10.,-9)*I) - 0.27209907467584415*lZ; - WFC.RZ = (1.5114724841549798 - 9.926944419863688*I) + 1.0834802397165764*lZ; - WFC.RAtoZ = (0.3667485032811715 - 2.2770907130064835*I) - 1.2994544609942593*lZ; - WFC.RZtoA = -0.2095310079712942 + 0.8320191107808546*lZ; - WFC.RH = (12.229832449946716 - 1.7643103462419842*10.0*pow(10.,-12)*I) + 5.309998583664737*lZ; - WFC.RPhi = (5.569012418081201 + 1.5439133581417356*0.10*pow(10.,-9)*I) + 5.309998583664737*lZ; - WFC.RPhi3 = (8.945333042265943 + 5.499309445612249*pow(10.,-12)*I) + 5.309998583664737*lZ; - WFC.EW = (3.967645734304811 + 4.712388980384717*I) + 2.238332625165702*lZ; - WFC.EZ = (5.916079892937651 + 4.96347220970469*I) + 2.1132591719740788*lZ; - - WFC.RW *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RA *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RZ *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RAtoZ *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RZtoA *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RPhi *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.EW *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.EZ *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RPhi3 *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - WFC.RH *= ElectroWeakReweighter::coupling()->a2(EWScale)/(4.0*pi); - - - WFC.RW = WFC.RW.real(); - WFC.RA = WFC.RA.real(); - WFC.RZ = WFC.RZ.real(); - WFC.RAtoZ = WFC.RAtoZ.real(); - WFC.RZtoA = WFC.RZtoA.real(); - WFC.RPhi = WFC.RPhi.real(); - WFC.RPhi3 = WFC.RPhi3.real(); - WFC.RH = WFC.RH.real(); - - // Also from Manohar, 2/10/12 - WFC.fFW0 = -3.7946842553189453 - 4.709019671388589*I; - WFC.fF0W = 3.8181790485161176; - WFC.fFZZ = 1.364503250377989 + 0.*I; - WFC.aHH = -0.474396977740686 + 0.*I; - WFC.aZZ = -0.6806563210877914 + 0.*I; - WFC.aW0 = 0.49036102506811907 + 1.9323351450971642*I; - WFC.a0W = -1.2184776671065072; - WFC.bHH = 1.234775745474991 + 0.*I; - WFC.bZZ = 1.7303526426747613 + 0.*I; - WFC.cHH = 0.33140608274387473 + 0.*I; - WFC.cZZ = 0.4961363208382017 + 0.*I; - WFC.cW0 = -1.005299829777395 + 1.063048500002757*I; - WFC.atHH = -0.237198488870343 + 0.*I; - WFC.atZZ = -0.3403281605438957 + 0.*I; - WFC.atW0 = 0.24518051253405954 + 0.9661675725485821*I; - WFC.at0W = -0.6092388335532536; - WFC.ctHH = 0.16570304137193737 + 0.*I; - WFC.ctZZ = 0.24806816041910085 + 0.*I; - WFC.ctW0 = -0.5026499148886975 + 0.5315242500013785*I; - WFC.btHH = -0.30869393636874776 + 0.*I; - WFC.btZZ = -0.4325881606686903 + 0.*I; - - WFC.fs10 = -2.289868133696459; - WFC.fs1ZW = 1.8627978596240622; - WFC.fsWZWZ = 1.1866922529667008; - WFC.fsZW1 = 1.0840307611156266; - WFC.fs01 = 2.2898681336964595; - WFC.fsHW1 = -0.32306745562682404; - WFC.fsHZ1 = 0.4042992116255279; - WFC.fs1HW = 3.330954543719127; - WFC.fs1HZ = 2.69768201932412; - return WFC; -} - -Complex CollinearSudakov::CollinearDw(Energy2 s, Energy EWScale) { - using Constants::pi; - using GroupInvariants::PlusLog; - double lw = log(ElectroWeakReweighter::coupling()->mW()/EWScale); - //s = s/2.; // This should not be here... I think this is a discrepency with Sascha - return ElectroWeakReweighter::coupling()->aW(EWScale)/(4.0*pi)* - (4.0*lw*0.5*PlusLog(s/EWScale/EWScale) - 2.0*lw*lw - - 3.0*lw - 5.0/12.0*pi*pi + 9.0/4.0); -} - -Complex CollinearSudakov::CollinearDz(Energy2 s, Energy EWScale) { - using Constants::pi; - using GroupInvariants::PlusLog; - double lz = log(ElectroWeakReweighter::coupling()->mZ()/EWScale); - return ElectroWeakReweighter::coupling()->aZ(EWScale)/(4.0*pi)* - (4.0*lz*0.5*PlusLog(s/EWScale/EWScale) - 2.0*lz*lz - - 3.0*lz - 5.0/12.0*pi*pi + 9.0/4.0); -} - -namespace { - -void writeLine(ofstream & file, vector x, vector y, - string name,string title, - string colour, string style) { - file << "# BEGIN HISTO1D "+name +"\n"; - file << "SmoothLine=1\n"; - file << "ErrorBars=0\n"; - file << "Path="+name+"\n"; - file << "Title="+title+"\n"; - file << "LineColor="+colour+"\n"; - file << "LineStyle="+style +"\n"; - file << "# xlow xhigh val errminus errplus\n"; - for(unsigned int ix=0;ix np; - vector uL,uR,tL,tR,dL,dR,bL,bR,nuL,eL,eR,Wgamma,Bgamma,g,WT,WL,WZT,BZT,ZL,H; - Energy mZ = ElectroWeakReweighter::coupling()->mZ(); - for(Energy x=200.*GeV;x<5000.*GeV;x*=1.02) { - Energy2 s(sqr(x)); - np.push_back(x); - evaluateHighScale(x,mZ,s); - evaluateMatching(mZ,s); - uL .push_back(real(highColQ_ * ULcollinearCorr_ )); - uR .push_back(real(highColU_ * URcollinearCorr_ )); - tL .push_back(real(highColQt_ * tLcollinearCorr_ )); - tR .push_back(real(highColtR_ * tRcollinearCorr_ )); - dL .push_back(real(highColQ_ * DLcollinearCorr_ )); - dR .push_back(real(highColD_ * DRcollinearCorr_ )); - bL .push_back(real(highColQt_ * bLcollinearCorr_ )); - bR .push_back(real(highColD_ * DRcollinearCorr_ )); - nuL .push_back(real(highColL_ * nuLcollinearCorr_ )); - eL .push_back(real(highColL_ * ELcollinearCorr_ )); - eR .push_back(real(highColE_ * ERcollinearCorr_ )); - Wgamma.push_back(real(highColW_ * WtoAcollinearCorr_ )); - Bgamma.push_back(real(highColB_ * BtoAcollinearCorr_ )); - g .push_back(real(highColG_ * GcollinearCorr_ )); - WT .push_back(real(highColW_ * WtoWcollinearCorr_ )); - WL .push_back(real(highColPhi_ * PhitoWcollinearCorr_)); - WZT .push_back(real(highColW_ * WtoZcollinearCorr_ )); - BZT .push_back(real(highColB_ * BtoZcollinearCorr_ )); - ZL .push_back(real(highColPhi_ * PhitoZcollinearCorr_)); - H .push_back(real(highColPhi_ * PhitoHcollinearCorr_)); - } - ofstream fig1a("fig1a.dat"); - fig1a << "#BEGIN PLOT\n"; - fig1a << "LegendOnly=/uL /uR /tL /tR\n"; - fig1a << "DrawOnly=/uL /uR /tL /tR\n"; - fig1a << "Title=Figure 1a\n"; - fig1a << "RatioPlot=0\n"; - fig1a << "LogX=1\n"; - fig1a << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig1a << "YLabel=u, t\n"; - fig1a << "Legend=1\n"; - fig1a << "XMin=250.\n"; - fig1a << "YMin=0.7\n"; - fig1a << "YMax=1.05\n"; - fig1a << "# END PLOT\n"; - writeLine(fig1a,np,uL,"/uL","$u_L$","green","dotted" ); - writeLine(fig1a,np,uR,"/uR","$u_R$","cyan" ,"solid" ); - writeLine(fig1a,np,tL,"/tL","$t_L$","red" ,"dashed" ); - writeLine(fig1a,np,tR,"/tR","$t_R$","blue" ,"dotdashed"); - fig1a.close(); - ofstream fig1b("fig1b.dat"); - fig1b << "#BEGIN PLOT\n"; - fig1b << "LegendOnly=/dL /dR /bL /bR\n"; - fig1b << "DrawOnly=/dL /dR /bL /bR\n"; - fig1b << "Title=Figure 1b\n"; - fig1b << "RatioPlot=0\n"; - fig1b << "LogX=1\n"; - fig1b << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig1b << "YLabel=d, b\n"; - fig1b << "Legend=1\n"; - fig1b << "XMin=250.\n"; - fig1b << "YMin=0.7\n"; - fig1b << "YMax=1.05\n"; - fig1b << "# END PLOT\n"; - writeLine(fig1b,np,dL,"/dL","$d_L$","green","dotted" ); - writeLine(fig1b,np,dR,"/dR","$d_R$","cyan" ,"solid" ); - writeLine(fig1b,np,bL,"/bL","$b_L$","red" ,"dashed" ); - writeLine(fig1b,np,bR,"/bR","$b_R$","blue" ,"dotdashed"); - fig1b.close(); - ofstream fig2("fig2.dat"); - fig2 << "#BEGIN PLOT\n"; - fig2 << "LegendOnly=/uL /uR /dL /dR\n"; - fig2 << "DrawOnly=/uL /uR /dL /dR\n"; - fig2 << "Title=Figure 2\n"; - fig2 << "RatioPlot=0\n"; - fig2 << "LogX=1\n"; - fig2 << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig2 << "YLabel=u, d\n"; - fig2 << "Legend=1\n"; - fig2 << "XMin=250.\n"; - fig2 << "YMin=0.7\n"; - fig2 << "YMax=1.05\n"; - fig2 << "# END PLOT\n"; - writeLine(fig2,np,uL,"/uL","$u_L$","green","dotted" ); - writeLine(fig2,np,uR,"/uR","$u_R$","cyan" ,"solid" ); - writeLine(fig2,np,dL,"/dL","$d_L$","red" ,"dashed" ); - writeLine(fig2,np,dR,"/dR","$d_R$","blue" ,"dotdashed"); - fig2.close(); - ofstream fig3("fig3.dat"); - fig3 << "#BEGIN PLOT\n"; - fig3 << "LegendOnly=/nuL /eL /eR\n"; - fig3 << "DrawOnly=/nuL /eL /eR\n"; - fig3 << "Title=Figure 3\n"; - fig3 << "RatioPlot=0\n"; - fig3 << "LogX=1\n"; - fig3 << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig3 << "YLabel=$\\nu$, $e$\n"; - fig3 << "Legend=1\n"; - fig3 << "XMin=250.\n"; - fig3 << "YMin=0.9\n"; - fig3 << "YMax=1.05\n"; - fig3 << "# END PLOT\n"; - writeLine(fig3,np,nuL,"/nuL","$\\nu_L$","blue","dashed"); - writeLine(fig3,np, eL,"/eL" ,"$e_L$" ,"red" ,"dotted"); - writeLine(fig3,np, eR,"/eR" ,"$e_R$" ,"red" ,"solid" ); - fig3.close(); - ofstream fig5("fig5.dat"); - fig5 << "#BEGIN PLOT\n"; - fig5 << "LegendOnly=/g /Wgamma /Bgamma\n"; - fig5 << "DrawOnly=/g /Wgamma /Bgamma\n"; - fig5 << "Title=Figure 5\n"; - fig5 << "RatioPlot=0\n"; - fig5 << "LogX=1\n"; - fig5 << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig5 << "YLabel=$\\gamma$, g\n"; - fig5 << "Legend=1\n"; - fig5 << "XMin=250.\n"; - fig5 << "YMin=0.7\n"; - fig5 << "YMax=1.05\n"; - fig5 << "# END PLOT\n"; - writeLine(fig5,np,g ,"/g" ,"$g$" ,"blue","dashed"); - writeLine(fig5,np,Wgamma,"/Wgamma","$W\\to\\gamma$","red" ,"solid" ); - writeLine(fig5,np,Bgamma,"/Bgamma","$B\\to\\gamma$","red" ,"dotted"); - fig5.close(); - ofstream fig6a("fig6a.dat"); - fig6a << "#BEGIN PLOT\n"; - fig6a << "LegendOnly=/WT /WL\n"; - fig6a << "DrawOnly=/WT /WL\n"; - fig6a << "Title=Figure 6a\n"; - fig6a << "RatioPlot=0\n"; - fig6a << "LogX=1\n"; - fig6a << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig6a << "YLabel=$Z_L$, $Z_T$, $H$\n"; - fig6a << "Legend=1\n"; - fig6a << "XMin=250.\n"; - fig6a << "YMin=0.7\n"; - fig6a << "YMax=1.05\n"; - fig6a << "# END PLOT\n"; - writeLine(fig6a,np,WT,"/WT","$W_T$","red" ,"solid"); - writeLine(fig6a,np,WL,"/WL","$W_L$","blue" ,"dashed" ); - fig6a.close(); - ofstream fig6b("fig6b.dat"); - fig6b << "#BEGIN PLOT\n"; - fig6b << "LegendOnly=/WZT /BZT /ZL /H\n"; - fig6b << "DrawOnly=/WZT /BZT /ZL /H\n"; - fig6b << "Title=Figure 6b\n"; - fig6b << "RatioPlot=0\n"; - fig6b << "LogX=1\n"; - fig6b << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig6b << "YLabel=d, b\n"; - fig6b << "Legend=1\n"; - fig6b << "XMin=250.\n"; - fig6b << "YMin=0.7\n"; - fig6b << "YMax=1.05\n"; - fig6b << "# END PLOT\n"; - writeLine(fig6b,np,WZT,"/WZT","$W\\to Z_T$","red" ,"solid" ); - writeLine(fig6b,np,BZT,"/BZT","$B\\to Z_T$","red" ,"dotted" ); - writeLine(fig6b,np,ZL ,"/ZL ","$Z_L$" ,"blue" ,"dashed" ); - writeLine(fig6b,np,H ,"/H ","$H$" ,"green","dotdashed"); - fig6b.close(); - - - np.clear(); - vector e30,e50,q30,q50,g30,g50; - for(Energy x=200.*GeV;x<5000.*GeV;x*=1.02) { - Energy2 s(sqr(x)); - np.push_back(x); - evaluateLowScale(mZ,30.*GeV,s); - e30.push_back(real(lowColE_)); - q30.push_back(real(lowColU_)); - g30.push_back(real(lowColG_)); - evaluateLowScale(mZ,50.*GeV,s); - e50.push_back(real(lowColE_)); - q50.push_back(real(lowColU_)); - g50.push_back(real(lowColG_)); - } - ofstream fig4a("fig4a.dat"); - fig4a << "#BEGIN PLOT\n"; - fig4a << "LegendOnly=/e30 /e50\n"; - fig4a << "DrawOnly=/e30 /e50\n"; - fig4a << "Title=Figure 4a\n"; - fig4a << "RatioPlot=0\n"; - fig4a << "LogX=1\n"; - fig4a << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig4a << "YLabel=e\n"; - fig4a << "Legend=1\n"; - fig4a << "XMin=250.\n"; - fig4a << "YMin=0.7\n"; - fig4a << "YMax=1.05\n"; - fig4a << "# END PLOT\n"; - writeLine(fig4a,np,e30,"/e30","e $(\\mu_f=30\\,\\mathrm{GeV})$","red" ,"solid" ); - writeLine(fig4a,np,e50,"/e50","e $(\\mu_f=50\\,\\mathrm{GeV})$","blue","dashed"); - fig4a.close(); - ofstream fig4b("fig4b.dat"); - fig4b << "#BEGIN PLOT\n"; - fig4b << "LegendOnly=/q30 /q50 /g30 /g50\n"; - fig4b << "DrawOnly=/q30 /q50 /g30 /g50\n"; - fig4b << "Title=Figure 4a\n"; - fig4b << "RatioPlot=0\n"; - fig4b << "LogX=1\n"; - fig4b << "XLabel=$\\bar{n}\\cdot p$ [GeV]\n"; - fig4b << "YLabel=e\n"; - fig4b << "Legend=1\n"; - fig4b << "XMin=250.\n"; - fig4b << "YMin=0.5\n"; - fig4b << "YMax=1.05\n"; - fig4b << "# END PLOT\n"; - writeLine(fig4b,np,q30,"/q30","q $(\\mu_f=30\\,\\mathrm{GeV})$","red" ,"solid" ); - writeLine(fig4b,np,q50,"/q50","q $(\\mu_f=50\\,\\mathrm{GeV})$","blue","dashed"); - writeLine(fig4b,np,g30,"/g30","g $(\\mu_f=30\\,\\mathrm{GeV})$","green" ,"dotted" ); - writeLine(fig4b,np,g50,"/g50","g $(\\mu_f=50\\,\\mathrm{GeV})$","blue","dotdashed"); - fig4b.close(); -} - -boost::numeric::ublas::matrix -CollinearSudakov::electroWeakMatching(Energy EWScale, Energy2 s, - Herwig::EWProcess::Process process, - bool oneLoop) { - using namespace EWProcess; - // calculate the matching coefficients - evaluateMatching(EWScale,s); - // fill the matrix - boost::numeric::ublas::matrix result(1,1); - switch (process) { - case QQQQ: - case QQQQiden: - { - unsigned int numGauge = 4, numBrokenGauge = 12; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - result(0,0) = result(6,0) = ULcollinearCorr_*ULcollinearCorr_*ULcollinearCorr_*ULcollinearCorr_; - result(3,0) = result(9,0) = DLcollinearCorr_*DLcollinearCorr_*DLcollinearCorr_*DLcollinearCorr_; - for (int i=0; i<12; i++) { - if (i!=0 && i!=3 && i!=6 && i!=9) { - result(i,0) = ULcollinearCorr_*ULcollinearCorr_*DLcollinearCorr_*DLcollinearCorr_; - } - } - DuplicateColumn0(result); - } - break; - case QtQtQQ: - { - unsigned int numGauge = 4, numBrokenGauge = 12; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - result(0,0) = result(6,0) = ULcollinearCorr_*ULcollinearCorr_*tLcollinearCorr_*tLcollinearCorr_; - result(3,0) = result(9,0) = DLcollinearCorr_*DLcollinearCorr_*bLcollinearCorr_*bLcollinearCorr_; - for (int i=0; i<12; i++) { - if (i==4 || i==5 || i==10 || i==11) { - result(i,0) = ULcollinearCorr_*tLcollinearCorr_*DLcollinearCorr_*bLcollinearCorr_; - } - else if (i==1 || i==7) { - result(i,0) = DLcollinearCorr_*DLcollinearCorr_*tLcollinearCorr_*tLcollinearCorr_; - } - else if (i==2 || i==8) { - result(i,0) = ULcollinearCorr_*ULcollinearCorr_*bLcollinearCorr_*bLcollinearCorr_; - } - } - DuplicateColumn0(result); - } - break; - case QQUU: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(2,0) = ULcollinearCorr_*ULcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - result(1,0) = result(3,0) = DLcollinearCorr_*DLcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QtQtUU: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(2,0) = tLcollinearCorr_*tLcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - result(1,0) = result(3,0) = bLcollinearCorr_*bLcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQtRtR: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(2,0) = ULcollinearCorr_*ULcollinearCorr_*tRcollinearCorr_*tRcollinearCorr_; - result(1,0) = result(3,0) = DLcollinearCorr_*DLcollinearCorr_*tRcollinearCorr_*tRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQDD: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(2,0) = ULcollinearCorr_*ULcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - result(1,0) = result(3,0) = DLcollinearCorr_*DLcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QtQtDD: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(2,0) = tLcollinearCorr_*tLcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - result(1,0) = result(3,0) = bLcollinearCorr_*bLcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQLL: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = nuLcollinearCorr_*nuLcollinearCorr_*ULcollinearCorr_*ULcollinearCorr_; - result(1,0) = nuLcollinearCorr_*nuLcollinearCorr_*DLcollinearCorr_*DLcollinearCorr_; - result(2,0) = ELcollinearCorr_*ELcollinearCorr_*ULcollinearCorr_*ULcollinearCorr_; - result(3,0) = ELcollinearCorr_*ELcollinearCorr_*DLcollinearCorr_*DLcollinearCorr_; - result(4,0) = result(5,0) = nuLcollinearCorr_*ELcollinearCorr_*ULcollinearCorr_*DLcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQEE: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = ULcollinearCorr_*ULcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - result(1,0) = DLcollinearCorr_*DLcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUUU: - case UUUUiden: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = URcollinearCorr_*URcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - DuplicateColumn0(result); - } - break; - case tRtRUU: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = tRcollinearCorr_*tRcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUDD: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = URcollinearCorr_*URcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case tRtRDD: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = tRcollinearCorr_*tRcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UULL: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = nuLcollinearCorr_*nuLcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - result(1,0) = ELcollinearCorr_*ELcollinearCorr_*URcollinearCorr_*URcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUEE: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = URcollinearCorr_*URcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDDD: - case DDDDiden: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = DRcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDLL: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = nuLcollinearCorr_*nuLcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - result(1,0) = ELcollinearCorr_*ELcollinearCorr_*DRcollinearCorr_*DRcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDEE: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = DRcollinearCorr_*DRcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - DuplicateColumn0(result); - } - break; - case LLLL: - case LLLLiden: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = nuLcollinearCorr_*nuLcollinearCorr_*nuLcollinearCorr_*nuLcollinearCorr_; - result(1,0) = nuLcollinearCorr_*nuLcollinearCorr_*ELcollinearCorr_*ELcollinearCorr_; - result(2,0) = ELcollinearCorr_*ELcollinearCorr_*nuLcollinearCorr_*nuLcollinearCorr_; - result(3,0) = ELcollinearCorr_*ELcollinearCorr_*ELcollinearCorr_*ELcollinearCorr_; - result(4,0) = result(5,0) = nuLcollinearCorr_*ELcollinearCorr_*nuLcollinearCorr_*ELcollinearCorr_; - DuplicateColumn0(result); - } - break; - case LLEE: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = nuLcollinearCorr_*nuLcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - result(1,0) = ELcollinearCorr_*ELcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - DuplicateColumn0(result); - } - break; - case EEEE: - case EEEEiden: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = ERcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_*ERcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQWW: - case LLWW: - { - unsigned int numGauge = 5; - unsigned int numBrokenGauge = 20; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - for (unsigned int row = 0; row < result.size1(); row++) { - for (unsigned int col = 0; col < result.size2(); col++) { - - // Boson Collinear Corr_ections: - if (col==0 || col==1) { - if (row==0 || row==1 || row==6 || row==7) result(row,col) = (WtoWcollinearCorr_*WtoWcollinearCorr_); - if (row==2 || row==8) result(row,col) = (WtoZcollinearCorr_*WtoZcollinearCorr_); - if (row==3 || row==4 || row==9 || row==10) result(row,col) = (WtoZcollinearCorr_*WtoAcollinearCorr_); - if (row==5 || row==11) result(row,col) = (WtoAcollinearCorr_*WtoAcollinearCorr_); - if (row==12 || row==14) result(row,col) = (WtoWcollinearCorr_*WtoZcollinearCorr_); - if (row==13 || row==15) result(row,col) = (WtoWcollinearCorr_*WtoAcollinearCorr_); - if (row==16 || row==18) result(row,col) = (WtoWcollinearCorr_*WtoZcollinearCorr_); - if (row==17 || row==19) result(row,col) = (WtoWcollinearCorr_*WtoAcollinearCorr_); - } - if (col==2) { - if (row==2 || row==8) result(row,col) = (WtoZcollinearCorr_*BtoZcollinearCorr_); - if (row==3 || row==9) result(row,col) = (WtoZcollinearCorr_*BtoAcollinearCorr_); - if (row==4 || row==10) result(row,col) = (WtoAcollinearCorr_*BtoZcollinearCorr_); - if (row==5 || row==11) result(row,col) = (WtoAcollinearCorr_*BtoAcollinearCorr_); - if (row==14) result(row,col) = (WtoWcollinearCorr_*BtoZcollinearCorr_); - if (row==15) result(row,col) = (WtoWcollinearCorr_*BtoAcollinearCorr_); - if (row==16) result(row,col) = (WtoWcollinearCorr_*BtoZcollinearCorr_); - if (row==17) result(row,col) = (WtoWcollinearCorr_*BtoAcollinearCorr_); - } - if (col==3) { - if (row==2 || row==8) result(row,col) = (WtoZcollinearCorr_*BtoZcollinearCorr_); - if (row==3 || row==9) result(row,col) = (WtoAcollinearCorr_*BtoZcollinearCorr_); - if (row==4 || row==10) result(row,col) = (WtoZcollinearCorr_*BtoAcollinearCorr_); - if (row==5 || row==11) result(row,col) = (WtoAcollinearCorr_*BtoAcollinearCorr_); - if (row==12) result(row,col) = (WtoWcollinearCorr_*BtoZcollinearCorr_); - if (row==13) result(row,col) = (WtoWcollinearCorr_*BtoAcollinearCorr_); - if (row==18) result(row,col) = (WtoWcollinearCorr_*BtoZcollinearCorr_); - if (row==19) result(row,col) = (WtoWcollinearCorr_*BtoAcollinearCorr_); - } - if (col==4) { - if (row==2 || row==8) result(row,col) = (BtoZcollinearCorr_*BtoZcollinearCorr_); - if (row==3 || row==4 || row==9 || row==10) result(row,col) = (BtoZcollinearCorr_*BtoAcollinearCorr_); - if (row==5 || row==11) result(row,col) = (BtoAcollinearCorr_*BtoAcollinearCorr_); - } - - // Particle Collinear Corr_ections: - if (process==QQWW) { - if (row<6) result(row,col) *= (ULcollinearCorr_*ULcollinearCorr_); - if ((row>=6)&&(row<12)) result(row,col) *= (DLcollinearCorr_*DLcollinearCorr_); - if (row>=12) result(row,col) *= (ULcollinearCorr_*DLcollinearCorr_); - } - else if (process==LLWW) { - if (row<6) result(row,col) *= (nuLcollinearCorr_*nuLcollinearCorr_); - if ((row>=6)&&(row<12)) result(row,col) *= (ELcollinearCorr_*ELcollinearCorr_); - if (row>=12) result(row,col) *= (nuLcollinearCorr_*ELcollinearCorr_); - } - } - } - } - break; - case QQPhiPhi: - case LLPhiPhi: - { - unsigned int numGauge = 2; - unsigned int numBrokenGauge = 14; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - for (unsigned int row = 0; row < result.size1(); row++) { - - // Boson Colinear Corr_ections: - if (row==0 || row==5) result(row,0) = (PhitoWcollinearCorr_*PhitoWcollinearCorr_); - if (row==1 || row==6) result(row,0) = (PhitoZcollinearCorr_*PhitoZcollinearCorr_); - if (row==2 || row==3 || row==7 || row==8) result(row,0) = (PhitoZcollinearCorr_*PhitoHcollinearCorr_); - if (row==4 || row==9) result(row,0) = (PhitoHcollinearCorr_*PhitoHcollinearCorr_); - if (row==10) result(row,0) = (PhitoWcollinearCorr_*PhitoZcollinearCorr_); - if (row==11) result(row,0) = (PhitoWcollinearCorr_*PhitoHcollinearCorr_); - if (row==12) result(row,0) = (PhitoWcollinearCorr_*PhitoZcollinearCorr_); - if (row==13) result(row,0) = (PhitoWcollinearCorr_*PhitoHcollinearCorr_); - - // Particle Colinear Corr_ections: - if (process==QQPhiPhi) { - if (row<5) result(row,0) *= (ULcollinearCorr_*ULcollinearCorr_); - if ((row>=5)&&(row<10)) result(row,0) *= (DLcollinearCorr_*DLcollinearCorr_); - if (row>=10) result(row,0) *= (ULcollinearCorr_*DLcollinearCorr_); - } - else if (process==LLPhiPhi) { - if (row<5) result(row,0) *= (nuLcollinearCorr_*nuLcollinearCorr_); - if ((row>=5)&&(row<10)) result(row,0) *= (ELcollinearCorr_*ELcollinearCorr_); - if (row>=10) result(row,0) *= (nuLcollinearCorr_*ELcollinearCorr_); - } - } - DuplicateColumn0(result); - } - break; - case QQWG: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = ULcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*WtoWcollinearCorr_; - result(2,0) = ULcollinearCorr_*ULcollinearCorr_*GcollinearCorr_*WtoZcollinearCorr_; - result(3,0) = ULcollinearCorr_*ULcollinearCorr_*GcollinearCorr_*WtoAcollinearCorr_; - result(4,0) = DLcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*WtoZcollinearCorr_; - result(5,0) = DLcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*WtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQBG: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = ULcollinearCorr_*ULcollinearCorr_*GcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = ULcollinearCorr_*ULcollinearCorr_*GcollinearCorr_*BtoAcollinearCorr_; - result(2,0) = DLcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*BtoZcollinearCorr_; - result(3,0) = DLcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QQGG: - { - unsigned int numGauge = 3; - unsigned int numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = result(2,0) = ULcollinearCorr_*ULcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - result(3,0) = result(4,0) = result(5,0) = DLcollinearCorr_*DLcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - DuplicateColumn0(result); - } - break; - case QtQtGG: - { - unsigned int numGauge = 3; - unsigned int numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = result(2,0) = tLcollinearCorr_*tLcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - result(3,0) = result(4,0) = result(5,0) = bLcollinearCorr_*bLcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUBB: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = URcollinearCorr_*URcollinearCorr_*BtoZcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = URcollinearCorr_*URcollinearCorr_*BtoZcollinearCorr_*BtoAcollinearCorr_; - result(2,0) = URcollinearCorr_*URcollinearCorr_*BtoAcollinearCorr_*BtoZcollinearCorr_; - result(3,0) = URcollinearCorr_*URcollinearCorr_*BtoAcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUPhiPhi: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = URcollinearCorr_*URcollinearCorr_*PhitoWcollinearCorr_*PhitoWcollinearCorr_; - result(1,0) = URcollinearCorr_*URcollinearCorr_*PhitoZcollinearCorr_*PhitoZcollinearCorr_; - result(2,0) = URcollinearCorr_*URcollinearCorr_*PhitoHcollinearCorr_*PhitoZcollinearCorr_; - result(3,0) = URcollinearCorr_*URcollinearCorr_*PhitoZcollinearCorr_*PhitoHcollinearCorr_; - result(4,0) = URcollinearCorr_*URcollinearCorr_*PhitoHcollinearCorr_*PhitoHcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUBG: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = URcollinearCorr_*URcollinearCorr_*GcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = URcollinearCorr_*URcollinearCorr_*GcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case UUGG: - { - unsigned int numGauge = 3; - unsigned int numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = result(2,0) = URcollinearCorr_*URcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - DuplicateColumn0(result); - } - break; - case tRtRGG: - { - unsigned int numGauge = 3; - unsigned int numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = result(2,0) = tRcollinearCorr_*tRcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDBB: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = DRcollinearCorr_*DRcollinearCorr_*BtoZcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = DRcollinearCorr_*DRcollinearCorr_*BtoZcollinearCorr_*BtoAcollinearCorr_; - result(2,0) = DRcollinearCorr_*DRcollinearCorr_*BtoAcollinearCorr_*BtoZcollinearCorr_; - result(3,0) = DRcollinearCorr_*DRcollinearCorr_*BtoAcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDPhiPhi: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = DRcollinearCorr_*DRcollinearCorr_*PhitoWcollinearCorr_*PhitoWcollinearCorr_; - result(1,0) = DRcollinearCorr_*DRcollinearCorr_*PhitoZcollinearCorr_*PhitoZcollinearCorr_; - result(2,0) = DRcollinearCorr_*DRcollinearCorr_*PhitoHcollinearCorr_*PhitoZcollinearCorr_; - result(3,0) = DRcollinearCorr_*DRcollinearCorr_*PhitoZcollinearCorr_*PhitoHcollinearCorr_; - result(4,0) = DRcollinearCorr_*DRcollinearCorr_*PhitoHcollinearCorr_*PhitoHcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDBG: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = DRcollinearCorr_*DRcollinearCorr_*GcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = DRcollinearCorr_*DRcollinearCorr_*GcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case DDGG: - { - unsigned int numGauge = 3; - unsigned int numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = result(1,0) = result(2,0) = DRcollinearCorr_*DRcollinearCorr_*GcollinearCorr_*GcollinearCorr_; - DuplicateColumn0(result); - } - break; - case EEBB: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = ERcollinearCorr_*ERcollinearCorr_*BtoZcollinearCorr_*BtoZcollinearCorr_; - result(1,0) = ERcollinearCorr_*ERcollinearCorr_*BtoZcollinearCorr_*BtoAcollinearCorr_; - result(2,0) = ERcollinearCorr_*ERcollinearCorr_*BtoAcollinearCorr_*BtoZcollinearCorr_; - result(3,0) = ERcollinearCorr_*ERcollinearCorr_*BtoAcollinearCorr_*BtoAcollinearCorr_; - DuplicateColumn0(result); - } - break; - case EEPhiPhi: - { - unsigned int numGauge = 1; - unsigned int numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); result *= 0.0; - result(0,0) = ERcollinearCorr_*ERcollinearCorr_*PhitoWcollinearCorr_*PhitoWcollinearCorr_; - result(1,0) = ERcollinearCorr_*ERcollinearCorr_*PhitoZcollinearCorr_*PhitoZcollinearCorr_; - result(2,0) = ERcollinearCorr_*ERcollinearCorr_*PhitoHcollinearCorr_*PhitoZcollinearCorr_; - result(3,0) = ERcollinearCorr_*ERcollinearCorr_*PhitoZcollinearCorr_*PhitoHcollinearCorr_; - result(4,0) = ERcollinearCorr_*ERcollinearCorr_*PhitoHcollinearCorr_*PhitoHcollinearCorr_; - DuplicateColumn0(result); - } - break; - default: - assert(false); - } - - // This is done at the end instead of the beginning for result.size1() and cols() - if (!oneLoop) { - boost::numeric::ublas::matrix OnesMatrix(result.size1(),result.size2()); - for (unsigned int i=0; i -CollinearSudakov::highEnergyRunning(Energy highScale, Energy EWScale, Energy2 s, - Herwig::EWProcess::Process process, - bool fixedOrder) { - using namespace EWProcess; - // perform the calculation - evaluateHighScale(highScale,EWScale,s); - Complex colW(highColW_); - Complex colB(highColB_); - Complex colG(highColG_); - Complex colQ(highColQ_); - Complex colQt(highColQt_); - Complex colU(highColU_); - Complex coltR(highColtR_); - Complex colD(highColD_); - Complex colL(highColL_); - Complex colE(highColE_); - Complex colPhi(highColPhi_); - if (fixedOrder) { - /* colX not necessarily positive for s = (1000TeV)^2 for the following: - colW = log(colW.real()); - colB = log(colB.real()); - colPhi = log(colPhi.real()); - */ - colG = log(colG.real()); - colQ = log(colQ.real()); - colQt = log(colQt.real()); - colU = log(colU.real()); - coltR = log(coltR.real()); - colD = log(colD.real()); - colL = log(colL.real()); - colE = log(colE.real()); - } - // set up the matrix - boost::numeric::ublas::matrix result; - unsigned int numGauge(0); - switch (process) { - - case QQQQ: - case QQQQiden: - case QtQtQQ: - numGauge = 4; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (process!=QtQtQQ) { - for (unsigned int i=0; i(numGauge,numGauge); - if (process==QQUU) { - for (unsigned int i=0; i(numGauge,numGauge); - if (process==QQDD) { - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - if (process!=tRtRUU) { - for (unsigned int i=0; i(numGauge,numGauge); - if (process==UUDD) { - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - for (unsigned int i=0; i(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = result(1,1) = 1.0+colQ+colQ+colW+colW; - result(2,2) = result(3,3) = 1.0+colQ+colQ+colW+colB; - result(4,4) = 1.0+colQ+colQ+colB+colB; - } - else { - result(0,0) = result(1,1) = colQ*colQ*colW*colW; - result(2,2) = result(3,3) = colQ*colQ*colW*colB; - result(4,4) = colQ*colQ*colB*colB; - } - break; - - case QQPhiPhi: - numGauge = 2; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = result(1,1) = 1.0+colQ+colQ+colPhi+colPhi; - } - else { - result(0,0) = result(1,1) = colQ*colQ*colPhi*colPhi; - } - break; - - case QQWG: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colQ+colQ+colW+colG; - } - else { - result(0,0) = colQ*colQ*colW*colG; - } - break; - - case QQBG: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colQ+colQ+colB+colG; - } - else { - result(0,0) = colQ*colQ*colB*colG; - } - break; - - case QQGG: - case QtQtGG: - numGauge = 3; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (process==QQGG) { - if (fixedOrder) { - result(0,0) = result(1,1) = result(2,2) = 1.0+colQ+colQ+colG+colG; - } - else { - result(0,0) = result(1,1) = result(2,2) = colQ*colQ*colG*colG; - } - } - else { - if (fixedOrder) { - result(0,0) = result(1,1) = result(2,2) = 1.0+colQt+colQt+colG+colG; - } - else { - result(0,0) = result(1,1) = result(2,2) = colQt*colQt*colG*colG; - } - } - break; - - case LLWW: - numGauge = 5; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = result(1,1) = 1.0+colL+colL+colW+colW; - result(2,2) = result(3,3) = 1.0+colL+colL+colW+colB; - result(4,4) = 1.0+colL+colL+colB+colB; - } - else { - result(0,0) = result(1,1) = colL*colL*colW*colW; - result(2,2) = result(3,3) = colL*colL*colW*colB; - result(4,4) = colL*colL*colB*colB; - } - break; - - case LLPhiPhi: - numGauge = 2; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = result(1,1) = 1.0+colL+colL+colPhi+colPhi; - } - else { - result(0,0) = result(1,1) = colL*colL*colPhi*colPhi; - } - break; - - case UUBB: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colU+colU+colB+colB; - } - else { - result(0,0) = colU*colU*colB*colB; - } - break; - - case UUPhiPhi: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colU+colU+colPhi+colPhi; - } - else { - result(0,0) = colU*colU*colPhi*colPhi; - } - break; - - case UUBG: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colU+colU+colB+colG; - } - else { - result(0,0) = colU*colU*colB*colG; - } - break; - - case UUGG: - case tRtRGG: - numGauge = 3; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (process==UUGG) { - if (fixedOrder) { - result(0,0) = result(1,1) = result(2,2) = 1.0+colU+colU+colG+colG; - } - else { - result(0,0) = result(1,1) = result(2,2) = colU*colU*colG*colG; - } - } - else { - if (fixedOrder) { - result(0,0) = result(1,1) = result(2,2) = 1.0+coltR+coltR+colG+colG; - } - else { - result(0,0) = result(1,1) = result(2,2) = coltR*coltR*colG*colG; - } - } - break; - - case DDBB: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colD+colD+colB+colB; - } - else { - result(0,0) = colD*colD*colB*colB; - } - break; - - case DDPhiPhi: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colD+colD+colPhi+colPhi; - } - else { - result(0,0) = colD*colD*colPhi*colPhi; - } - break; - - case DDBG: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colD+colD+colB+colG; - } - else { - result(0,0) = colD*colD*colB*colG; - } - break; - - case DDGG: - numGauge = 3; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = result(1,1) = result(2,2) = 1.0+colD+colD+colG+colG; - } - else { - result(0,0) = result(1,1) = result(2,2) = colD*colD*colG*colG; - } - break; - - case EEBB: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colE+colE+colB+colB; - } - else { - result(0,0) = colE*colE*colB*colB; - } - break; - - case EEPhiPhi: - numGauge = 1; - result = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - if (fixedOrder) { - result(0,0) = 1.0+colE+colE+colPhi+colPhi; - } - else { - result(0,0) = colE*colE*colPhi*colPhi; - } - break; - - default: - assert(false); - } - - return result; -} - -boost::numeric::ublas::matrix -CollinearSudakov::lowEnergyRunning(Energy EWScale, Energy lowScale, Energy2 s, - Herwig::EWProcess::Process process) { - using namespace EWProcess; - // evaluate the running - evaluateLowScale(EWScale,lowScale,s); - - Complex colUL = lowColU_; - Complex colDL = lowColD_; - Complex colUR = lowColU_; - Complex colDR = lowColD_; - - Complex coltL = lowColt_; - Complex coltR = lowColt_; - Complex colbL = lowColD_; - - Complex colnuL = 1.0; - Complex colEL = lowColE_; - Complex colER = lowColE_; - - Complex colW = lowColW_; - Complex colZ = 1.0; - Complex colA = lowColA_; - - Complex colPhi = lowColW_; - Complex colPhi3 = 1.0; - Complex colH = 1.0; - - Complex colG = lowColG_; - - // calculate the matrix - boost::numeric::ublas::matrix result; - unsigned int numBrokenGauge; - switch (process) { - case QQQQ: - case QQQQiden: - numBrokenGauge = 12; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(6,6) = colUL*colUL*colUL*colUL; - result(3,3) = result(9,9) = colDL*colDL*colDL*colDL; - for (unsigned int i=0; i<12; i++) { - if (i!=0 && i!=3 && i!=6 && i!=9) { - result(i,i) = colUL*colUL*colDL*colDL; - } - } - break; - case QtQtQQ: - numBrokenGauge = 12; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(6,6) = colUL*colUL*coltL*coltL; - result(3,3) = result(9,9) = colDL*colDL*colbL*colbL; - for (unsigned int i=0; i<12; i++) { - if (i==4 || i==5 || i==10 || i==11) { - result(i,i) = colUL*coltL*colDL*colbL; - } - else if (i==1 || i==7) { - result(i,i) = colDL*colDL*coltL*coltL; - } - else if (i==2 || i==8) { - result(i,i) = colUL*colUL*colbL*colbL; - } - } - break; - case QQUU: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(2,2) = colUL*colUL*colUR*colUR; - result(1,1) = result(3,3) = colDL*colDL*colUR*colUR; - break; - case QtQtUU: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(2,2) = coltL*coltL*colUR*colUR; - result(1,1) = result(3,3) = colbL*colbL*colUR*colUR; - break; - case QQtRtR: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(2,2) = colUL*colUL*coltR*coltR; - result(1,1) = result(3,3) = colDL*colDL*coltR*coltR; - break; - case QQDD: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(2,2) = colUL*colUL*colDR*colDR; - result(1,1) = result(3,3) = colDL*colDL*colDR*colDR; - break; - case QtQtDD: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(2,2) = coltL*coltL*colDR*colDR; - result(1,1) = result(3,3) = colbL*colbL*colDR*colDR; - break; - case QQLL: - numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colnuL*colnuL*colUL*colUL; - result(1,1) = colnuL*colnuL*colDL*colDL; - result(2,2) = colEL*colEL*colUL*colUL; - result(3,3) = colEL*colEL*colDL*colDL; - result(4,4) = result(5,5) = colnuL*colEL*colUL*colDL; - break; - case QQEE: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUL*colUL*colER*colER; - result(1,1) = colDL*colDL*colER*colER; - break; - case UUUU: - case UUUUiden: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = colUR*colUR*colUR*colUR; - break; - case tRtRUU: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = coltR*coltR*colUR*colUR; - break; - case UUDD: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = colUR*colUR*colDR*colDR; - break; - case tRtRDD: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = coltR*coltR*colDR*colDR; - break; - case UULL: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colnuL*colnuL*colUR*colUR; - result(1,1) = colEL*colEL*colUR*colUR; - break; - case UUEE: - numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUR*colUR*colER*colER; - break; - case DDDD: - case DDDDiden: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = colDR*colDR*colDR*colDR; - break; - case DDLL: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colnuL*colnuL*colDR*colDR; - result(1,1) = colEL*colEL*colDR*colDR; - break; - case DDEE: - numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colDR*colDR*colER*colER; - break; - case LLLL: - case LLLLiden: - numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colnuL*colnuL*colnuL*colnuL; - result(1,1) = colnuL*colnuL*colEL*colEL; - result(2,2) = colEL*colEL*colnuL*colnuL; - result(3,3) = colEL*colEL*colEL*colEL; - result(4,4) = result(5,5) = colnuL*colEL*colnuL*colEL; - break; - case LLEE: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colnuL*colnuL*colER*colER; - result(1,1) = colEL*colEL*colER*colER; - break; - case EEEE: - case EEEEiden: - numBrokenGauge = 1; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colER*colER*colER*colER; - break; - case QQWW: - case LLWW: - numBrokenGauge = 20; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - for (unsigned int row = 0; row < result.size1(); row++) { - // Boson Collinear Corrections: - if (row==0 || row==1 || row==6 || row==7) result(row,row) = (colW*colW); - else if (row==2 || row==8) result(row,row) = (colZ*colZ); - else if (row==3 || row==4 || row==9 || row==10) result(row,row) = (colZ*colA); - else if (row==5 || row==11) result(row,row) = (colA*colA); - else if (row==12 || row==14) result(row,row) = (colW*colZ); - else if (row==13 || row==15) result(row,row) = (colW*colA); - else if (row==16 || row==18) result(row,row) = (colW*colZ); - else if (row==17 || row==19) result(row,row) = (colW*colA); - - // Particle Collinear Corrections: - if (process==QQWW) { - if (row<6) result(row,row) *= (colUL*colUL); - if ((row>=6)&&(row<12)) result(row,row) *= (colDL*colDL); - if (row>=12) result(row,row) *= (colUL*colDL); - } - else if (process==LLWW) { - if (row<6) result(row,row) *= (colnuL*colnuL); - if ((row>=6)&&(row<12)) result(row,row) *= (colEL*colEL); - if (row>=12) result(row,row) *= (colnuL*colEL); - } - } - break; - case QQPhiPhi: - case LLPhiPhi: - numBrokenGauge = 14; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - for (unsigned int row = 0; row < result.size1(); row++) { - - // Boson Colinear Corrections: - if (row==0 || row==5) result(row,row) = (colPhi*colPhi); - else if (row==1 || row==6) result(row,row) = (colPhi3*colPhi3); - else if (row==2 || row==3 || row==7 || row==8) result(row,row) = (colPhi3*colH); - else if (row==4 || row==9) result(row,row) = (colH*colH); - else if (row==10) result(row,row) = (colPhi*colPhi3); - else if (row==11) result(row,row) = (colPhi*colH); - else if (row==12) result(row,row) = (colPhi*colPhi3); - else if (row==13) result(row,row) = (colPhi*colH); - - // Particle Colinear Corrections: - if (process==QQPhiPhi) { - if (row<5) result(row,row) *= (colUL*colUL); - if ((row>=5)&&(row<10)) result(row,row) *= (colDL*colDL); - if (row>=10) result(row,row) *= (colUL*colDL); - } - else if (process==LLPhiPhi) { - if (row<5) result(row,row) *= (colnuL*colnuL); - if ((row>=5)&&(row<10)) result(row,row) *= (colEL*colEL); - if (row>=10) result(row,row) *= (colnuL*colEL); - } - } - break; - case QQWG: - numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = colUL*colDL*colG*colW; - result(2,2) = colUL*colUL*colG*colZ; - result(3,3) = colUL*colUL*colG*colA; - result(4,4) = colDL*colDL*colG*colZ; - result(5,5) = colDL*colDL*colG*colA; - break; - case QQBG: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUL*colUL*colG*colZ; - result(1,1) = colUL*colUL*colG*colA; - result(2,2) = colDL*colDL*colG*colZ; - result(3,3) = colDL*colDL*colG*colA; - break; - case QQGG: - numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = result(2,2) = colUL*colUL*colG*colG; - result(3,3) = result(4,4) = result(5,5) = colDL*colDL*colG*colG; - break; - case QtQtGG: - numBrokenGauge = 6; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = result(2,2) = coltL*coltL*colG*colG; - result(3,3) = result(4,4) = result(5,5) = colbL*colbL*colG*colG; - break; - case UUBB: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUR*colUR*colZ*colZ; - result(1,1) = colUR*colUR*colZ*colA; - result(2,2) = colUR*colUR*colA*colZ; - result(3,3) = colUR*colUR*colA*colA; - break; - case UUPhiPhi: - numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUR*colUR*colPhi*colPhi; - result(1,1) = colUR*colUR*colPhi3*colPhi3; - result(2,2) = colUR*colUR*colH*colPhi3; - result(3,3) = colUR*colUR*colPhi3*colH; - result(4,4) = colUR*colUR*colH*colH; - break; - case UUBG: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colUR*colUR*colG*colZ; - result(1,1) = colUR*colUR*colG*colA; - break; - case UUGG: - numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = result(2,2) = colUR*colUR*colG*colG; - break; - case tRtRGG: - numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = result(2,2) = coltR*coltR*colG*colG; - break; - case DDBB: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colDR*colDR*colZ*colZ; - result(1,1) = colDR*colDR*colZ*colA; - result(2,2) = colDR*colDR*colA*colZ; - result(3,3) = colDR*colDR*colA*colA; - break; - case DDPhiPhi: - numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colDR*colDR*colPhi*colPhi; - result(1,1) = colDR*colDR*colPhi3*colPhi3; - result(2,2) = colDR*colDR*colH*colPhi3; - result(3,3) = colDR*colDR*colPhi3*colH; - result(4,4) = colDR*colDR*colH*colH; - break; - case DDBG: - numBrokenGauge = 2; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colDR*colDR*colG*colZ; - result(1,1) = colDR*colDR*colG*colA; - break; - - case DDGG: - numBrokenGauge = 3; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = result(1,1) = result(2,2) = colDR*colDR*colG*colG; - break; - case EEBB: - numBrokenGauge = 4; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colER*colER*colZ*colZ; - result(1,1) = colER*colER*colZ*colA; - result(2,2) = colER*colER*colA*colZ; - result(3,3) = colER*colER*colA*colA; - break; - case EEPhiPhi: - numBrokenGauge = 5; - result = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - result(0,0) = colER*colER*colPhi*colPhi; - result(1,1) = colER*colER*colPhi3*colPhi3; - result(2,2) = colER*colER*colH*colPhi3; - result(3,3) = colER*colER*colPhi3*colH; - result(4,4) = colER*colER*colH*colH; - break; - default: - assert(false); - } - return result; -} - - - - diff --git a/MatrixElement/EW/CollinearSudakov.fh b/MatrixElement/EW/CollinearSudakov.fh deleted file mode 100644 --- a/MatrixElement/EW/CollinearSudakov.fh +++ /dev/null @@ -1,18 +0,0 @@ -// -*- C++ -*- -// -// This is the forward declaration of the CollinearSudakov class. -// -#ifndef Herwig_CollinearSudakov_FH -#define Herwig_CollinearSudakov_FH - -#include "ThePEG/Config/ThePEG.h" - -namespace Herwig { - -class CollinearSudakov; - -ThePEG_DECLARE_POINTERS(Herwig::CollinearSudakov,CollinearSudakovPtr); - -} - -#endif diff --git a/MatrixElement/EW/CollinearSudakov.h b/MatrixElement/EW/CollinearSudakov.h deleted file mode 100644 --- a/MatrixElement/EW/CollinearSudakov.h +++ /dev/null @@ -1,546 +0,0 @@ -// -*- C++ -*- -#ifndef Herwig_CollinearSudakov_H -#define Herwig_CollinearSudakov_H -// -// This is the declaration of the CollinearSudakov class. -// - -#include "ThePEG/Interface/Interfaced.h" -#include "Herwig/Utilities/GSLIntegrator.h" -// work around a Boost 1.64 bug where ublas headers would fail otherwise -#include -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#include -#include "EWProcess.h" -#include "CollinearSudakov.fh" - -namespace Herwig { - -using namespace ThePEG; - -/** - * Struct for the wavefunction corrections - */ -struct WaveFunctionCorrections { - Complex RW; - Complex RA; - Complex RZ; - Complex RAtoZ; - Complex RZtoA; - Complex RPhi; - Complex EW; - Complex EZ; - Complex RPhi3; - Complex RH; - Complex tLuLDiff; - Complex bLdLDiff; - Complex tRuRDiff; - - // The following are constants from parameter integrals: - - Complex fFW0; - Complex fF0W; - Complex fFZZ; - Complex aHH; - Complex aZZ; - Complex aW0; - Complex a0W; - Complex bHH; - Complex bZZ; - Complex cHH; - Complex cZZ; - Complex cW0; - Complex atHH; - Complex atZZ; - Complex atW0; - Complex at0W; - Complex ctHH; - Complex ctZZ; - Complex ctW0; - Complex btHH; - Complex btZZ; - - Complex fs10; - Complex fs1ZW; - Complex fsWZWZ; - Complex fsZW1; - Complex fs01; - Complex fsHW1; - Complex fsHZ1; - Complex fs1HW; - Complex fs1HZ; -}; - -/** - * Here is the documentation of the CollinearSudakov class. - * - * @see \ref CollinearSudakovInterfaces "The interfaces" - * defined for CollinearSudakov. - */ -class CollinearSudakov: public Interfaced { - -public: - - /** @name Standard constructors and destructors. */ - //@{ - /** - * The default constructor. - */ - CollinearSudakov(); - - /** - * The destructor. - */ - virtual ~CollinearSudakov(); - //@} - -public: - - /** - * Evalaute the electroweak matching as a matrix - */ - boost::numeric::ublas::matrix - electroWeakMatching(Energy EWScale, Energy2 s, - Herwig::EWProcess::Process process, - bool oneLoop); - - /** - * Evalaute the high energy running as a matrix - */ - boost::numeric::ublas::matrix - highEnergyRunning(Energy highScale, Energy EWScale, Energy2 s, - Herwig::EWProcess::Process process, - bool fixedOrder); - - /** - * Evaluate the low energy running as a matrix - */ - boost::numeric::ublas::matrix - lowEnergyRunning(Energy EWScale, Energy lowScale, Energy2 s, - Herwig::EWProcess::Process process); -public: - - /** - * Make plots for tests - */ - void makePlots(); - -protected: - - /** - * Evaluate the high scale contributions - */ - void evaluateHighScale(Energy highScale, Energy EWScale, Energy2 S); - - /** - * Evaluate the low scale contributions - */ - void evaluateLowScale(Energy EWScale, Energy lowScale, Energy2 S); - - /** - * Evaluate the matching - */ - void evaluateMatching(Energy EWScale,Energy2 S); - -public: - - /** - * The operator to be integrated - */ - InvEnergy operator ()(Energy mu) const { - if(high_) return highScaleIntegrand(mu); - else return lowScaleIntegrand(mu); - } - /** 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: - - /** - * The integral of the high scale part of the Sudakov - */ - Complex highScaleIntegral(bool SU3, bool SU2, double Y, - Energy2 s, Energy mu_h, Energy mu_l, bool fermion, - bool longitudinal, double yukFactor); - - /** - * the integral of the low scale part of the Sudakov - */ - Complex lowScaleIntegral(bool SU3, double Q, Energy2 s, - Energy mu_h, Energy mu_l, bool fermion, - double boostFactor); - -protected: - - /** - * High-scale integrand - */ - InvEnergy highScaleIntegrand(Energy mu) const; - - /** - * Low-scale integrand - */ - InvEnergy lowScaleIntegrand(Energy mu) const; - - /** - * Calculate the wavefunction corrections - */ - WaveFunctionCorrections waveFunctionCorrections(Energy EWScale); - - /** - * Collinear matiching for W - */ - Complex CollinearDw(Energy2 s, Energy EWScale); - - /** - * Collinear matching for Z - */ - Complex CollinearDz(Energy2 s, Energy EWScale); - -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; - //@} - - -// If needed, insert declarations of virtual function defined in the -// InterfacedBase class here (using ThePEG-interfaced-decl in Emacs). - - -private: - - /** - * The assignment operator is private and must never be called. - * In fact, it should not even be implemented. - */ - CollinearSudakov & operator=(const CollinearSudakov &) = delete; -private: - - /** - * Parameters for the integrand - */ - //@{ - /** - * Whether high or low scale - */ - bool high_; - - /** - * Whether real of imaginary part - */ - bool real_; - - /** - * \f$SU(3)\f$ - */ - bool SU3_; - - /** - * - */ - bool SU2_; - - /** - * - */ - double Y_; - - /** - * - */ - Energy2 s_; - - /** - * - */ - bool fermion_; - - /** - * - */ - bool longitudinal_; - - /** - * - */ - double yukFactor_; - - /** - * - */ - double boostFactor_; - - /** - * - */ - double Q_; - //@} - - /** - * Parameters - */ - //@{ - /** - * Order for the K terms - */ - int K_ORDER_; - - /** - * Order for the B terms - */ - int B_ORDER_; - //@} - - /** - * Integrator - */ - GSLIntegrator integrator_; - -private: - - /** - * Storage of the high scale pieces - */ - //@{ - /** - * - */ - Complex highColW_; - - /** - * - */ - Complex highColB_; - - /** - * - */ - Complex highColG_; - - /** - * - */ - Complex highColQ_; - - /** - * - */ - Complex highColQt_; - - /** - * - */ - Complex highColU_; - - /** - * - */ - Complex highColtR_; - - /** - * - */ - Complex highColD_; - - /** - * - */ - Complex highColL_; - - /** - * - */ - Complex highColE_; - - /** - * - */ - Complex highColPhi_; - //@} - - /** - * Storage of the low scale pieces - */ - //@{ - /** - * - */ - complex lowColW_; - - /** - * - */ - Complex lowColA_; - - /** - * - */ - Complex lowColG_; - - /** - * - */ - Complex lowColU_; - - /** - * - */ - Complex lowColt_; - - /** - * - */ - Complex lowColD_; - - /** - * - */ - Complex lowColE_; - //@} - - /** - * Storage of the matching parameters - */ - //@{ - /** - * - */ - Complex ULcollinearCorr_; - - /** - * - */ - Complex DLcollinearCorr_; - - /** - * - */ - Complex URcollinearCorr_; - - /** - * - */ - Complex DRcollinearCorr_; - - /** - * - */ - Complex tLcollinearCorr_; - - /** - * - */ - Complex tRcollinearCorr_; - - /** - * - */ - Complex bLcollinearCorr_; - - /** - * - */ - Complex nuLcollinearCorr_; - - /** - * - */ - Complex ELcollinearCorr_; - - /** - * - */ - Complex ERcollinearCorr_; - - /** - * - */ - Complex WtoWcollinearCorr_; - - /** - * - */ - Complex WtoZcollinearCorr_; - - /** - * - */ - Complex WtoAcollinearCorr_; - - /** - * - */ - Complex BtoZcollinearCorr_; - - /** - * - */ - Complex BtoAcollinearCorr_; - - /** - * - */ - Complex PhitoWcollinearCorr_; - - /** - * - */ - Complex PhitoZcollinearCorr_; - - /** - * - */ - Complex PhitoHcollinearCorr_; - - /** - * - */ - Complex GcollinearCorr_; - //@} -}; - -} - -#endif /* Herwig_CollinearSudakov_H */ diff --git a/MatrixElement/EW/EWCouplings.cc b/MatrixElement/EW/EWCouplings.cc deleted file mode 100644 --- a/MatrixElement/EW/EWCouplings.cc +++ /dev/null @@ -1,734 +0,0 @@ -// -*- C++ -*- -// -// This is the implementation of the non-inlined, non-templated member -// functions of the EWCouplings class. -// - -#include "EWCouplings.h" -#include "ThePEG/Interface/ClassDocumentation.h" -#include "ThePEG/Interface/Parameter.h" -#include "ThePEG/Interface/Switch.h" -#include "ThePEG/EventRecord/Particle.h" -#include "ThePEG/Repository/UseRandom.h" -#include "ThePEG/Repository/EventGenerator.h" -#include "ThePEG/Utilities/DescribeClass.h" -#include "ThePEG/Persistency/PersistentOStream.h" -#include "ThePEG/Persistency/PersistentIStream.h" -#include - -using namespace Herwig; - -namespace { - -Complex trace(boost::numeric::ublas::matrix M) { - assert(M.size1()==M.size2()); - Complex output(0.); - for(unsigned int ix=0;ixmaximumCMEnergy(); - // set the particle masses - if(massChoice_) { - mZ_ = getParticleData(ParticleID::Z0 )->mass(); - mW_ = getParticleData(ParticleID::Wplus)->mass(); - mT_ = getParticleData(ParticleID::t )->mass(); - mH_ = getParticleData(ParticleID::h0 )->mass(); - } - // logs of scales - double logEWScale = log(ewScale_/GeV); - double logHighScale = log(highScale_/GeV); - // step size - double stepsize = (logHighScale - logEWScale)/double(highSteps_); - // Initialize parameters at the ewScale - // 32 parameters, mostly zero due massless quarks - unsigned int N = 32; - vector y(N,0.), dydx(N,0.), yout(N,0.); - initializeCouplings(y); - double x = logEWScale; - derivatives(x,y,dydx); - // energy scale + 6 parameters: g1,g2,g3,y_t,lambda,vev - table_ = boost::numeric::ublas::matrix(highSteps_+1,7); - table_(0,0) = logEWScale; - for (unsigned int i=1; i=29) table_(0,i-25) = y[i].real(); - } - int counter = 1; - - // Use 4th order runge-kutta to integrate to highScale - int steps = highSteps_; - while (steps > 0) { - RK4(y,dydx,x,stepsize,yout); - - // Advance x and calculate derivatives at new starting point - for(unsigned int j=0; j=29) table_(counter,i-25) = y[i].real(); - } - - steps--; - counter++; - } - // Initialize couplings at mu < 91.1876 GeV - initializeLow(); -} - -EWCouplings::~EWCouplings() {} - -IBPtr EWCouplings::clone() const { - return new_ptr(*this); -} - -IBPtr EWCouplings::fullclone() const { - return new_ptr(*this); -} - -void EWCouplings::persistentOutput(PersistentOStream & os) const { - os << ounit(ewScale_,GeV) << ounit(highScale_,GeV) << ounit(lowScale_,GeV) - << includeSU3_ << includeEW_ << ounit(mZ_,GeV) << ounit(mW_,GeV) - << ounit(mT_,GeV) << ounit(mH_,GeV) << massChoice_ << initialized_ - << loops_ << highSteps_ << lowSteps_ - << a1MZ_ << a2MZ_ << aSMZ_ << lambdat_; - os << table_.size1() << table_.size2(); - for(unsigned int ix=0;ix> iunit(ewScale_,GeV) >> iunit(highScale_,GeV) >> iunit(lowScale_,GeV) - >> includeSU3_ >> includeEW_ >> iunit(mZ_,GeV) >> iunit(mW_,GeV) - >> iunit(mT_,GeV) >> iunit(mH_,GeV) >> massChoice_ >> initialized_ - >> loops_ >> highSteps_ >> lowSteps_ - >> a1MZ_ >> a2MZ_ >> aSMZ_ >> lambdat_; - unsigned int size1,size2; - is >> size1 >> size2; - table_.resize(size1,size2); - for(unsigned int ix=0;ix> table_(ix,iy); - is >> size1 >> size2; - lowTable_.resize(size1,size2); - for(unsigned int ix=0;ix> lowTable_(ix,iy); -} - - -//The following static variable is needed for the type -// description system in ThePEG. -DescribeClass -describeHerwigEWCouplings("Herwig::EWCouplings", "HwMEEW.so"); - -void EWCouplings::Init() { - - static ClassDocumentation documentation - ("The EWCouplings class implements"); - - static Switch interfaceMassChoice - ("MassChoice", - "Where to get the SM particle masses from", - &EWCouplings::massChoice_, false, false, false); - static SwitchOption interfaceMassChoiceLocal - (interfaceMassChoice, - "Local", - "Use local values", - false); - static SwitchOption interfaceMassChoiceParticleData - (interfaceMassChoice, - "ParticleData", - "Get the values from the ParticleData object", - true); - - static Parameter interfaceEWScale - ("EWScale", - "The electroweak scale for matching between high and low energy running", - &EWCouplings::ewScale_, GeV, 91.1876*GeV, 10.0*GeV, 10000.0*GeV, - false, false, Interface::limited); - - static Parameter interfaceLowScale - ("LowScale", - "The low energy scale at which to stop the running", - &EWCouplings::lowScale_, GeV, 10.*GeV, 1.0*GeV, 100.0*GeV, - false, false, Interface::limited); - - static Parameter interfacemZ - ("mZ", - "The mass of the Z boson", - &EWCouplings::mZ_, 91.1876*GeV, 90.*GeV, 92.*GeV, - false, false, Interface::limited); - - static Parameter interfacemW - ("mW", - "The mass of the W boson", - &EWCouplings::mW_, 80.399*GeV, 75.*GeV, 85.*GeV, - false, false, Interface::limited); - - static Parameter interfacemT - ("mT", - "The mass of the top quark", - &EWCouplings::mT_, 173.1*GeV, 100.*GeV, 1000.*GeV, - false, false, Interface::limited); - - static Parameter interfacemH - ("mH", - "The mass of the Higgs boson", - &EWCouplings::mH_, 125.*GeV, 100.*GeV, 1000.*GeV, - false, false, Interface::limited); - - static Parameter interfaceLoops - ("Loops", - "The number of loops", - &EWCouplings::loops_, 2, 1, 3, - false, false, Interface::limited); - - static Parameter interfaceHighSteps - ("HighSteps", - "The number of steps for the Runga-Kutta and interpolation of the couplings above mZ", - &EWCouplings::highSteps_, 200, 10, 1000000, - false, false, Interface::limited); - - static Parameter interfaceLowSteps - ("LowSteps", - "The number of steps for the Runga-Kutta and interpolation of the couplings below mZ", - &EWCouplings::lowSteps_, 200, 10, 1000000, - false, false, Interface::limited); - - static Parameter interfacea1MZ - ("Alpha1MZ", - "The value of a1(MZ)", - &EWCouplings::a1MZ_, 0.01017054, 0.0, 1., - false, false, Interface::limited); - - static Parameter interfacea2MZ - ("Alpha2MZ", - "The value of a2(MZ)", - &EWCouplings::a2MZ_, 0.03378168, 0.0, 1., - false, false, Interface::limited); - - static Parameter interfaceasMZ - ("AlphasMZ", - "The value of as(MZ)", - &EWCouplings::aSMZ_, 0.1176, 0.0, 1., - false, false, Interface::limited); - - static Parameter interfaceLambdaT - ("LambdaT", - "The top quark Yukawa at the matching scale", - &EWCouplings::lambdat_, 0.991172, 0.5, 2.0, - false, false, Interface::limited); - -} - - - -void EWCouplings::initializeLow() { - using Constants::pi; - // For scales less than ewScale, the only couplings calculated here are those of - // alpha_EW and alpha3: - - double logEWScale = log(ewScale_ /GeV); - double loglowScale = log(lowScale_/GeV); - - double stepsize = (loglowScale - logEWScale)/double(lowSteps_); - int steps = lowSteps_; - - // Initialize parameters at the ewScale - unsigned int N=2; // Total # of parameters = 2 - vector y(N), dydx(N), yout(N); - for (unsigned int i=0; i 0) { - RK4(y,dydx,x,stepsize,yout); - // Advance x and calculate derivatives at new starting point - for(unsigned int j=0; j &y, vector &dydx, - const double x, const double h, vector &yout) { - - unsigned int n = y.size(); - std::vector dym(n), dyt(n), yt(n); - double hh = h*0.5; - double h6 = h/6.0; - double xh = x + hh; - const Complex I(0,1.0); - - for(unsigned int i=0; i & y) { - using Constants::pi; - // \todo make these values parameters so they can be changed - InvEnergy2 gFermi = 1.16637*pow(10.0,-5)/GeV2; - Energy vev = 1.0/(sqrt(sqrt(2.0)*gFermi)); // vev = 246.221 - - y[0] = sqrt(5./3.*4.*pi*a1MZ_); // g1 = Sqrt[5/3] * Sqrt[4*pi*a1] - y[1] = sqrt(4.*pi*a2MZ_); // g2 = Sqrt[4*pi*a2] - y[2] = sqrt(4.*pi*aSMZ_); // g3 = Sqrt[4*pi*as] - // Note lambda_t = sqrt(2.0)*mt/vev only valid for mt(mt); need mt(mZ) here - // Top Yukawa lambda from Manohar - //Complex lambda_t = 1.02858; - // Top Yukawa lambda from Sascha - double lambda_t =lambdat_; - // Quartic coupling lambda (need to multiply by a factor of 2 when accessing the quartic coupling) - double lambda = (mH_/vev)*(mH_/vev); - y[29] = lambda_t; - y[30] = lambda; - y[31] = vev/GeV; -} - -void EWCouplings::derivatives(const double x, vector & y, - vector &dydx) { - // zero the output - for (unsigned int i=0; i &y, vector & dydx) { - using Constants::pi; - using boost::numeric::ublas::axpy_prod; - using boost::numeric::ublas::herm; - const Complex I(0,1.0); - // Yukawa - boost::numeric::ublas::matrix Yuk_u(3,3), Yuk_d(3,3), Yuk_e(3,3); - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - Yuk_u(ix,iy) = y[21+3*ix+iy]; - Yuk_d(ix,iy) = y[12+3*ix+iy]; - Yuk_e(ix,iy) = y[ 3+3*ix+iy]; - } - } - // gauge - boost::numeric::ublas::vector gauge(3); - for(unsigned int l=0; l<3; l++) gauge[l] = y[l]; - // Evaluate beta functions for gauge couplings - double Ng = 0.5*numberOfFlavours(x); - boost::numeric::ublas::vector b(3), g2(3), gc(3), Cu(3), Cd(3), Ce(3); - boost::numeric::ublas::matrix B1(3,3),B2(3,3), B3(3,3), B(3,3); - b[0] = -4.0/3.0*Ng - 1.0/10.0; - b[1] = 22.0/3.0 - 4.0/3.0*Ng - 1.0/6.0; - b[2] = 11.0 - 4.0/3.0*Ng; - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - B1(ix,iy) = 0.; - B2(ix,iy) = 0.; - B3(ix,iy) = 0.; - } - } - B1(1,1) = 136.0/3.0; - B1(2,2) = 102.0; - B2(0,0) = 19.0/15.0; - B2(0,1) = 1.0/5.0; - B2(0,2) = 11.0/30.0; - B2(1,0) = 3.0/5.0; - B2(1,1) = 49.0/3.0; - B2(1,2) = 3.0/2.0 ; - B2(2,0) = 44.0/15.0; - B2(2,1) = 4.0; - B2(2,2) = 76.0/3.0; - B3(0,0) = 9.0/50.0; - B3(0,1) = 3.0/10.0; - B3(1,0) = 9.0/10.0; - B3(1,1) = 13.0/6.0; - B = B1 - Ng*B2 - B3; - Cu[0] = 17.0/10.0; - Cu[1] = 3.0/2.0; - Cu[2] = 2.0; - Cd[0] = 1.0/2.0; - Cd[1] = 3.0/2.0; - Cd[2] = 2.0; - Ce[0] = 3.0/2.0; - Ce[1] = 1.0/2.0; - Ce[2] = 0.0; - for (int i=0; i<3; i++) { - g2(i) = pow(gauge(i),2); - } - // gc = trans(g2) * B - axpy_prod(g2, B, gc, true); - // compute the answer - if(loops_ >= 1) { - for(int l=0; l<3; l++) { - dydx[l] = -b(l)*pow(gauge(l),3)/(16.0*pow(pi,2)); - } - if (loops_ >= 2) { - boost::numeric::ublas::matrix temp(3,3); - axpy_prod(herm(Yuk_u),Yuk_u,temp); - Complex tr1 = trace(temp); - axpy_prod(herm(Yuk_d),Yuk_d,temp); - Complex tr2 = trace(temp); - axpy_prod(herm(Yuk_e),Yuk_e,temp); - Complex tr3 = trace(temp); - for(int l=0; l<3; l++) { - dydx[l] += -pow(gauge(l),3)/pow(16.0*pow(pi,2),2)* - (gc(l) + Cu(l)*tr1 + Cd(l)*tr2 + Ce(l)*tr3 ); - } - } - } -} - -void EWCouplings::lowBetaGauge(const double, vector &y, - vector &dydx) { - using Constants::pi; - const Complex I(0,1.0); - Complex e = y[0], g3 = y[1]; - // Evaluate beta functions for gauge couplings - double Nu = 2.0, Nd = 3.0, Nl = 3.0; - if(loops_ >=1) { - dydx[0] += (16.0/9.0*Nu + 4.0/9.0*Nd + 4.0/3.0*Nl)*pow(e,3)/pow(4.0*pi,2); - dydx[1] += (2.0/3.0*(Nu+Nd)-11.0)*pow(g3,3)/pow(4.0*pi,2); - // Note this also includes the three-loop contribution for alpha_3 - if (loops_ >= 2) { - dydx[0] += (64.0/27.0*Nu+4.0/27.0*Nd+4.0*Nl)*pow(e,5)/pow(4.0*pi,4) + - (64.0/9.0*Nu+16.0/9.0*Nd)*pow(e,3)*pow(g3,2)/pow(4.0*pi,4); - dydx[1] += (38.0/3.0*(Nu+Nd)-102.0)*pow(g3,5)/pow(4.0*pi,4) + - (8.0/9.0*Nu+2.0/9.0*Nd)*pow(g3,3)*pow(e,2)/pow(4.0*pi,4) + - (5033.0/18.0*(Nu+Nd)-325.0/54.0*(Nu+Nd)*(Nu+Nd)-2857.0/2.0)*pow(g3,7)/pow(4.0*pi,6); - } - } -} - -void EWCouplings::betaYukawa(const double x, vector< Complex > &y, vector &dydx) { - using Constants::pi; - const Complex I(0,1.0); - boost::numeric::ublas::identity_matrix Id(3,3); - // Yukawa - boost::numeric::ublas::matrix Yuk_u(3,3), Yuk_d(3,3), Yuk_e(3,3); - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - Yuk_u(ix,iy) = y[21+3*ix+iy]; - Yuk_d(ix,iy) = y[12+3*ix+iy]; - Yuk_e(ix,iy) = y[ 3+3*ix+iy]; - } - } - // gauge - double Ng = 0.5*numberOfFlavours(x); - boost::numeric::ublas::vector gauge(3); - for(unsigned int l=0; l<3; l++) gauge[l] = y[l]; - Complex lambda = y[30]; - // traces of yukawa matrices - boost::numeric::ublas::matrix mTemp(3,3),MUU(3,3),MDD(3,3),MLL(3,3), - MUU2(3,3),MDD2(3,3),MLL2(3,3),MUUDD(3,3),MDDUU(3,3); - axpy_prod(herm(Yuk_u),Yuk_u,MUU); - Complex trU = trace( MUU); - axpy_prod(MUU,MUU,MUU2); - Complex trUU = trace(MUU2); - axpy_prod(herm(Yuk_d),Yuk_d,MDD); - Complex trD = trace( MDD); - axpy_prod(MDD,MDD,MDD2); - Complex trDD = trace(MDD2); - axpy_prod(MUU,MDD,MUUDD); - Complex trUD = trace(MUUDD); - axpy_prod(MDD,MUU,MDDUU); - axpy_prod(herm(Yuk_e),Yuk_e,MLL); - Complex trL = trace( MLL); - axpy_prod(MLL,MLL,MLL2); - Complex trLL = trace(MLL2); - Complex g02 = sqr(gauge[0]); - Complex g12 = sqr(gauge[1]); - Complex g22 = sqr(gauge[2]); - // Evaluate beta functions for yukawa couplings - boost::numeric::ublas::zero_matrix zero3x3(3,3); - boost::numeric::ublas::matrix dYuk_udx(zero3x3), dYuk_ddx(zero3x3), dYuk_edx(zero3x3), beta1_u(zero3x3), - beta1_d(zero3x3), beta1_e(zero3x3), beta2_u(zero3x3), beta2_d(zero3x3), beta2_e(zero3x3); - Complex Y2 = 3.0*trU+3.0*trD + trL; - Complex Y4 = (17.0/20.0*g02 + 9.0/4.0*g12 + 8.0*g22)*trU + - (1.0/4.0*g02 + 9.0/4.0*g12 + 8.0*g22)*trD + 3.0/4.0*(g02 + g12)*trL; - Complex chi4 = 27.0/4.0*trUU + 27.0/4.0*trDD + 9.0/4.0*trLL - 6.0/4.0*trUD; - if(loops_ >= 1) { - beta1_u = 3.0/2.0*(MUU - MDD) + (Y2 - 17.0/20.0*g02 - 9.0/4.0*g12 - 8.0*g22)*Id; - beta1_d = 3.0/2.0*(MDD - MUU) + (Y2 - 1.0/4.0*g02 - 9.0/4.0*g12 - 8.0*g22)*Id; - beta1_e = 3.0/2.0*(MLL) + (Y2 - 9.0/4.0*g02 - 9.0/4.0*g12)*Id; - - axpy_prod(Yuk_u,beta1_u,mTemp); - dYuk_udx += (1.0/(16.0*pow(pi,2)))*mTemp; - axpy_prod(Yuk_d,beta1_d,mTemp); - dYuk_ddx += (1.0/(16.0*pow(pi,2)))*mTemp; - axpy_prod(Yuk_e,beta1_e,mTemp); - dYuk_edx += (1.0/(16.0*pow(pi,2)))*mTemp; - - if (loops_ >= 2) { - Complex l2=sqr(lambda); - beta2_u = 3.0/2.0*MUU2 - MUUDD - 1.0/4.0*MDDUU + 11.0/4.0*MDD2 + Y2*(5.0/4.0*MDD - 9.0/4.0*MUU) + - (-chi4 + 3.0/2.0*l2)*Id - 2.0*lambda*(3.0*MUU + MDD) + - (223.0/80.0*g02 + 135.0/16.0*g12 + 16.0*g22)*(MUU) - - (43.0/80.0*g02 - 9.0/16.0*g12 + 16.0*g22)*(MDD) + 5.0/2.0*Y4*Id + - ((9.0/200.0 + 29.0/45.0*Ng)*pow(gauge[0],4) - 9.0/20.0*pow(gauge[0]*gauge[1],2) + - 19.0/15.0*pow(gauge[0]*gauge[2],2) - (35.0/4.0 - Ng)*pow(gauge[1],4) + 9.0*pow(gauge[1]*gauge[2],2) - - (404.0/3.0 - 80.0/9.0*Ng)*pow(gauge[2],4))*Id; - beta2_d = 3.0/2.0*MDD2 - MDDUU - 1.0/4.0*MUUDD + 11.0/4.0*MUU2 + Y2*(5.0/4.0*MUU - 9.0/4.0*MDD) + (-chi4 + 3.0/2.0*l2)*Id - 2.0*lambda*(3.0*MDD + MUU) + (187.0/80.0*g02 + 135.0/16.0*g12 + 16.0*g22)*(MDD) - (79.0/80.0*g02 - 9.0/16.0*g12 + 16.0*g22)*(MUU) + 5.0/2.0*Y4*Id - ((29.0/200.0 + 1.0/45.0*Ng)*pow(gauge[0],4) - 27.0/20.0*pow(gauge[0]*gauge[1],2) + 31.0/15.0*pow(gauge[0]*gauge[2],2) - (35.0/4.0 - Ng)*pow(gauge[1],4) + 9.0*pow(gauge[1]*gauge[2],2) - (404.0/3.0 - 80.0/9.0*Ng)*pow(gauge[2],4))*Id; - beta2_e = 3.0/2.0*MLL2 - 9.0/4.0*Y2*MLL + (-chi4 + 3.0/2.0*l2)*Id - 6.0*lambda*(MLL) + (387.0/80.0*g02 + 135.0/15.0*g12)*(MLL) + 5.0/2.0*Y4*Id + ((51.0/200.0 + 11.0/5.0*Ng)*pow(gauge[0],4) + 27.0/20.0*pow(gauge[0]*gauge[1],2) - (35.0/4.0 - Ng)*pow(gauge[1],4))*Id; - - axpy_prod(Yuk_u,beta2_u,mTemp); - dYuk_udx += (1.0/pow(16.0*pow(pi,2),2))*mTemp; - axpy_prod(Yuk_d,beta2_d,mTemp); - dYuk_ddx += (1.0/pow(16.0*pow(pi,2),2))*mTemp; - axpy_prod(Yuk_e,beta2_e,mTemp); - dYuk_edx += (1.0/pow(16.0*pow(pi,2),2))*mTemp; - } - } - - boost::numeric::ublas::vector temp(27); - - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - dydx[ 3+ix+3*iy] = dYuk_edx(ix,iy); - dydx[12+ix+3*iy] = dYuk_ddx(ix,iy); - dydx[21+ix+3*iy] = dYuk_udx(ix,iy); - } - } -} - -void EWCouplings::betaHiggs(const double x, vector &y, - vector &dydx) { - using Constants::pi; - const Complex I(0,1.0); - double Ng = 0.5*numberOfFlavours(x); - // Yukawa - boost::numeric::ublas::matrix Yuk_u(3,3), Yuk_d(3,3), Yuk_e(3,3); - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - Yuk_u(ix,iy) = y[21+3*ix+iy]; - Yuk_d(ix,iy) = y[12+3*ix+iy]; - Yuk_e(ix,iy) = y[ 3+3*ix+iy]; - } - } - // gauge - boost::numeric::ublas::vector gauge(3); - for(int l=0; l<3; l++) gauge(l) = y[l]; - Complex lambda = y[30]; - complex vev = y[31]*GeV; - // Evaluate beta functions for higgs coupling - Complex beta1_lambda(0.), beta2_lambda(0.), gamma1_vev(0.), gamma2_vev(0.), - Y2(0.), H(0.), Y4(0.), chi4(0.); - // traces of yukawa matrices - boost::numeric::ublas::matrix temp(3,3),temp2(3,3),MUU(3,3),MDD(3,3),MLL(3,3); - axpy_prod(herm(Yuk_u),Yuk_u,MUU); - Complex trU = trace( MUU); - axpy_prod(MUU,MUU,temp); - Complex trUU = trace(temp); - axpy_prod(MUU,temp,temp2); - Complex trUUU = trace(temp2); - axpy_prod(herm(Yuk_d),Yuk_d,MDD); - Complex trD = trace( MDD); - axpy_prod(MDD,MDD,temp); - Complex trDD = trace(temp); - axpy_prod(MDD,temp,temp2); - Complex trDDD = trace(temp2); - axpy_prod(MUU,MDD,temp); - Complex trUD = trace(temp); - axpy_prod(herm(Yuk_e),Yuk_e,MLL); - Complex trL = trace( MLL); - axpy_prod(MLL,MLL,temp); - Complex trLL = trace(temp); - axpy_prod(MLL,temp,temp2); - Complex trLLL = trace(temp2); - axpy_prod(MUU+MDD,MDD,temp); - axpy_prod(MUU,temp,temp2); - Complex trUUDD = trace(temp2); - - Complex g02 = sqr(gauge[0]); - Complex g12 = sqr(gauge[1]); - Complex g22 = sqr(gauge[2]); - Complex g04 = sqr(g02); - Complex g14 = sqr(g12); - double pi2 = sqr(pi); - Y2 = 3.0*trU+3.0*trD + trL; - Y4 = (17.0/20.0*g02 + 9.0/4.0*g12 + 8.0*g22)*(trU) + (1.0/4.0*g02 + 9.0/4.0*g12 + 8.0*g22)*(trD) + 3.0/4.0*(g02 + g12)*(trL); - chi4 = 27.0/4.0*trUU + 27.0/4.0*trDD + 9.0/4.0*trLL - 6.0/4.0*trUD; - H = 3.0*trUU + 3.0*trDD + trLL; - - if(loops_ >= 1) { - Complex l2=sqr(lambda); - beta1_lambda = 12.0*l2 - (9.0/5.0*g02 + 9.0*g12)*lambda + 9.0/4.0*(3.0/25.0*g04+2.0/5.0*g02*g12 + g14) + 4.0*Y2*lambda - 4.0*H; - gamma1_vev = 9.0/4.0*(1.0/5.0*g02+g12)-Y2; - - dydx[30] += 1.0/(16.0*pi2)*beta1_lambda; - dydx[31] += vev/(16.0*pi2)*gamma1_vev/GeV; - - if (loops_ >= 2) { - beta2_lambda = -78.0*lambda*l2 + 18.0*(3.0/5.0*g02 + 3.0*g12)*l2 - - ( (313.0/8.0 - 10.0*Ng)*g14 - 117.0/20.0*g02*g12 + 9.0/25.0*(229.0/4.0+50.0/9.0*Ng)*g04 )*lambda + - (497.0/8.0 - 8.0*Ng)*g14*g12 - 3.0/5.0*(97.0/24.0 + 8.0/3.0*Ng)*g02*g14 - - 9.0/25.0*(239.0/24.0 + 40.0/9.0*Ng)*g04*g12 - 27.0/125.0*(59.0/24.0 + 40.0/9.0*Ng)*g04*g02 - - 64.0*g22*(trUU + trDD) - 8.0/5.0*g02*(2.0*trUU - trDD + 3.0*trLL) - 3.0/2.0*g14*Y4 + - 10.0*lambda*( (17.0/20.0*g02 + 9.0/4.0*g12 + 8.0*g22)*trU + (1.0/4.0*g02 + 9.0/4.0*g12 + 8.0*g22)*trD + 3.0/4.0*(g02 + g12)*trL ) + - 3.0/5.0*g02*( (-57.0/10.0*g02 + 21.0*g12 )*trU + (3.0/2.0*g02 + 9.0*g12)*trD + (-15.0/2.0*g02 + 11.0*g12)*trL ) - 24.0*l2*Y2 - lambda*H + - 6.0*lambda*trUD + 20.0*(3.0*trUUU + 3.0*trDDD + trLLL) - 12.0*trUUDD; - gamma2_vev = -3.0/2.0*l2 - 5.0/2.0*Y4 + chi4 - 27.0/80.0*g02*g12 - - (93.0/800.0 + 1.0/2.0*Ng)*g04 + (511.0/32.0 - 5.0/2.0*Ng)*g14; - - dydx[30] += 1.0/pow(16.0*pi2,2)*beta2_lambda; - dydx[31] += vev/pow(16.0*pi2,2)*gamma2_vev/GeV; - } - } -} - -double EWCouplings::interpolate(double t, int paramIndex) { - double stepsize = table_(1,0)-table_(0,0); - double tol = 0.001*stepsize; - - double logewScale = log(ewScale_/GeV); - double loghighScale = log(highScale_/GeV); - - if (tloghighScale+tol) { - cerr << "Stepsize: " << stepsize << std::endl; - cerr << "tol: " << tol << std::endl; - cerr << "logewScale: " << logewScale << std::endl; - cerr << "loghighScale: " << loghighScale << std::endl; - cerr << "paramIndex: " << paramIndex << std::endl; - cerr << "t: " << t << std::endl; - - cerr << "Couplings::_Interp(double t, int parmIndex) trying to obtain parameter "; - cerr << "value outside the available range. Returning zero." << std::endl; - assert(false); - } - - // return value at EW scale - if (abs(t-logewScale)logewScale+tol) { - cerr<< "Couplings::_LowInterp(double t, int parmIndex) trying to obtain parameter "; - cerr << "value outside the available range. Returning zero." << std::endl; - assert(false); - } - - if (abs(t-logewScale) -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#include -#include -#include "EWCouplings.fh" - -namespace Herwig { - -using namespace ThePEG; - -/** - * Here is the documentation of the EWCouplings class. - * - * @see \ref EWCouplingsInterfaces "The interfaces" - * defined for EWCouplings. - */ -class EWCouplings: public Interfaced { - -public: - - /** @name Standard constructors and destructors. */ - //@{ - /** - * The default constructor. - */ - EWCouplings(unsigned int loops=2, unsigned int steps=200, Energy lowScale=10.*GeV); - - /** - * The destructor. - */ - virtual ~EWCouplings(); - //@} - - /** - * Initialize the running couplings - */ - void initialize(); - - /** - * Number of dynamical quarks at $\log\mu = x$ (in GeV) - * N.B.Integrate out top quark at Mz, not at Mt. - */ - unsigned int numberOfFlavours(double x) { - return x >= std::log(ewScale_/GeV) ? 6 : 5; - } - -public: - - /** - * Set whether or not to include \f$SU(3)\f$ running - */ - void SU3(bool includeSU3) {includeSU3_ = includeSU3;} - - /** - * Whether or not to include \f$SU(3)\f$ running - */ - bool SU3() { return includeSU3_;} - - /** - * Set whether or not to include EW running - */ - void EW(bool includeEW) {includeEW_ = includeEW;} - - /** - * Whether or not to include EW running - */ - bool EW() { return includeEW_;} - - /** - * alpha for the U1 gauge coupling at energy mu (in GeV): - */ - double a1(Energy mu) { - if (includeEW_) { - if (mu>=ewScale_) { - return (3.0/5.0)*interpolate(log(mu/GeV),1); - } - return interpolateLow(log(mu/GeV),1); - } - else - return 0.0; - } - - /** - * alpha for the SU2 gauge coupling at energy mu (in GeV): - */ - double a2(Energy mu) { - if (includeEW_) { - if (mu=ewScale_) { - return interpolate(log(mu/GeV),3); - } - else { - return interpolateLow(log(mu/GeV),2); - } - } - else - return 0.0; - } - - /** - * alpha for EM - */ - double aEM(Energy mu) { - if (includeEW_) { - if (mu<=ewScale_) { - return interpolateLow(log(mu/GeV),1); - } - else { - double alpha1=a1(mu); - double alpha2=a2(mu); - return alpha1*alpha2/(alpha1+alpha2); - } - } - return 0.0; - } - - double aS(Energy mu) { - if(includeSU3_) { - if (mu<=ewScale_) { - return interpolateLow(log(mu/GeV),2); - } - else { - return interpolate(log(mu/GeV),3); - } - } - else return 0.0; - } - - /** - * Top quark Yukawa coupling - */ - double y_t(Energy mu) { - if (includeEW_) { - if(mu & y); - - /** - * Assigns numerical values to beta functions - * Takes in a point x = log(mu) and the values of y[i] at x and assigns dydx[i] the - * value beta[i](mu). The function Derivs farms out the plugging in to the three - * functions BetaGauge, BetaYukawa, and BetaHiggs, which evaluates the beta functions - * for the gauge couplings, yukawa matrices, and higgs quartic coupling/vev, respectively. - */ - void derivatives(const double x, vector< Complex > &y, - vector< Complex > & dydx); - - /** - * Beta function for the gauge interactions - */ - void betaGauge(const double x, vector &y, vector &dydx); - - /** - * Beta function for the gauge interactions at low scales - */ - void lowBetaGauge(const double x, vector &y, vector &dydx); - - /** - * Beta function for the Yukawa interactions - */ - void betaYukawa(const double x, vector &y, vector &dydx); - - /** - * Beta function for the Higgs interactions - */ - void betaHiggs(const double x, vector &y, vector &dydx); - - /** - * Update the couplings using 4-th order RK - * Takes in a vector y[i] of function values at a point x and the values of the - * first derivatives dydx[i] ( = dy[i]/dx ) alon with a step size stepsize. The - * function then defines assigns the value of y[i](x+stepsize) to the variable yout[i]. - * (Adapted from sample code in Numerical Recipes in C++ Press, Teukolsky, et. al.) - */ - void RK4(vector & y, vector &dydx, const double x, - const double stepsize, vector &yout); - - /** - * Initialize the low energy parameters - */ - void initializeLow(); - - /** - * Interpolate the table, t = ln(mu) - */ - double interpolate(double t, int paramIndex); - - /** - * Interpolate the tabel, t = ln(mu) - */ - double interpolateLow(double t, int paramIndex); - -private: - - /** - * The assignment operator is private and must never be called. - * In fact, it should not even be implemented. - */ - EWCouplings & operator=(const EWCouplings &) = delete; - -private: - - /** - * Electoweak Scale - */ - Energy ewScale_; - - /** - * High Scale - */ - Energy highScale_; - - /** - * Low Scale - */ - Energy lowScale_; - - /** - * Whether or not to include SU3 - */ - bool includeSU3_; - - /** - * Whether or not to include EW - */ - bool includeEW_; - - /** - * Whether or not the running couplings have been initialized - */ - bool initialized_; - - /** - * Masses of Standard Model particles - */ - //@{ - /** - * Mass Choice - */ - bool massChoice_; - - /** - * Z mass - */ - Energy mZ_; - - /** - * W mass - */ - Energy mW_; - - /** - * Top mass - */ - Energy mT_; - - /** - * Higgs boson mass - */ - Energy mH_; - //@} - - /** - * Number of loops - */ - unsigned int loops_; - - /** - * Number of steps for Runga-Kutta (High scale) - */ - unsigned int highSteps_; - - /** - * Number of steps for Runga-Kutta (Low scale) - */ - unsigned int lowSteps_; - - /** - * Matrix to store the parameters - */ - boost::numeric::ublas::matrix table_; - - /** - * Matrix to store the low energy parameters. - * This will hold only aEM and a3 at mu lowTable_; - - /** - * Input values of the couplings - */ - //@{ - /** - * \f%\alpha_1(M_Z)\f$ - */ - double a1MZ_; - - /** - * \f%\alpha_2(M_Z)\f$ - */ - double a2MZ_; - - /** - * \f%\alpha_S(M_Z)\f$ - */ - double aSMZ_; - - /** - * \f$\lambda_t\f$ - */ - double lambdat_; - //@} - -}; - -} - -#endif /* Herwig_EWCouplings_H */ diff --git a/MatrixElement/EW/EWProcess.h b/MatrixElement/EW/EWProcess.h deleted file mode 100644 --- a/MatrixElement/EW/EWProcess.h +++ /dev/null @@ -1,69 +0,0 @@ -// -*- C++ -*- -// -// EWProcess.h is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#ifndef HERWIG_EWProcess_H -#define HERWIG_EWProcess_H - -namespace Herwig { - -namespace EWProcess { - - /** - * Enumerates the processes for which we have SCET Wilson Coefficients - */ - enum Process { QQQQ, - QQQQiden, - QtQtQQ, - QQUU, - QtQtUU, - QQtRtR, - QQDD, - QtQtDD, - QQLL, - QQEE, - UUUU, - UUUUiden, - tRtRUU, - UUDD, - tRtRDD, - UULL, - UUEE, - DDDD, - DDDDiden, - DDLL, - DDEE, - LLLL, - LLLLiden, - LLEE, - EEEE, - EEEEiden, - QQWW, - QQPhiPhi, - QQWG, - QQBG, - QQGG, - QtQtGG, - LLWW, - LLPhiPhi, - UUBB, - UUPhiPhi, - UUBG, - UUGG, - tRtRGG, - DDBB, - DDPhiPhi, - DDBG, - DDGG, - EEBB, - EEPhiPhi, - LAST}; -} -} - -#endif // HERWIG_EWProcess_H diff --git a/MatrixElement/EW/ElectroWeakMatching.cc b/MatrixElement/EW/ElectroWeakMatching.cc deleted file mode 100644 --- a/MatrixElement/EW/ElectroWeakMatching.cc +++ /dev/null @@ -1,1015 +0,0 @@ -// -*- C++ -*- -// -// ElectroWeakMatching.cc is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#include "ElectroWeakMatching.h" -#include "ElectroWeakReweighter.h" -#include "GroupInvariants.h" -#include -#include - -using namespace Herwig; -using namespace ElectroWeakMatching; -using namespace GroupInvariants; -using namespace EWProcess; - -boost::numeric::ublas::matrix -ElectroWeakMatching::electroWeakMatching(Energy mu, - Energy2 s, Energy2 t, Energy2 u, - Herwig::EWProcess::Process process, - bool oneLoop,unsigned int iswap) { - static const Complex I(0,1.0); - using Constants::pi; - Complex T = getT(s,t); - Complex U = getU(s,u); - // Z-Couplings - double g_Lu = ElectroWeakReweighter::coupling()->g_Lu(mu); - double g_Ld = ElectroWeakReweighter::coupling()->g_Ld(mu); - double g_Le = ElectroWeakReweighter::coupling()->g_Le(mu); - double g_Lnu = ElectroWeakReweighter::coupling()->g_Lnu(mu); - double g_Ru = ElectroWeakReweighter::coupling()->g_Ru(mu); - double g_Rd = ElectroWeakReweighter::coupling()->g_Rd(mu); - double g_Re = ElectroWeakReweighter::coupling()->g_Re(mu); - double g_W = ElectroWeakReweighter::coupling()->g_W(mu); - double g_phiPlus = ElectroWeakReweighter::coupling()->g_phiPlus(mu); - // Weinberg Angle: - double cos2 = ElectroWeakReweighter::coupling()->Cos2thW(mu); - double sin2 = 1.0-cos2; - double cos = sqrt(cos2); - double sin = sqrt(sin2); - - boost::numeric::ublas::matrix R0,G2,Dw,Dz; - - switch (process) { - case QQQQ: - case QQQQiden: - case QtQtQQ: - { - unsigned int numGauge = 4, numBrokenGauge = 12; - R0=boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2=boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw=boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz=boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,1) = R0(1,1) = R0(2,1) = R0(3,1) = 1.0; - R0(0,0) = R0(3,0) = 0.25; - R0(1,0) = R0(2,0) = -0.25; - R0(4,0) = R0(5,0) = 0.5; - R0(6,3) = R0(7,3) = R0(8,3) = R0(9,3) = 1.0; - R0(6,2) = R0(9,2) = 0.25; - R0(7,2) = R0(8,2) = -0.25; - R0(10,2) = R0(11,2) = 0.5; - if (oneLoop) { - double g11 = g_Lu; - double g12 = g_Ld; - double g21 = g_Lu; - double g22 = g_Ld; - Complex w0(0.),w1(0.),w2(0.); - Complex z1(0.),z2(0.),z3(0.),z4(0.),z5(0.); - boost::numeric::ublas::matrix gam2; - if(iswap==0) { - w0 = 0.5*I*pi; - w1 = -0.5*(T-U); - w2 = -0.5*(T+U); - z1 = 2.0*g11*g21*(T-U) - I*pi*(g11*g11+g21*g21); - z2 = 2.0*g21*g12*(T-U) - I*pi*(g21*g21+g12*g12); - z3 = 2.0*g22*g11*(T-U) - I*pi*(g22*g22+g11*g11); - z4 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - z5 = (g11*g21+g12*g22)*T - (g21*g12+g11*g22)*U - - 0.5*I*pi*(g11*g11+g12*g12+g21*g21+g22*g22); - gam2 = Gamma2(U,T); - } - else if(iswap==1) { - w0 = -0.5*(T-I*pi); - w1 = 0.5*U; - w2 = -0.5*(U-2.*T); - z1 = 2.0*g11*g21*(-U) + ( T- I*pi)*(g11*g11+g21*g21); - z2 = 2.0*g21*g12*(-U) + ( T- I*pi)*(g21*g21+g12*g12); - z3 = 2.0*g22*g11*(-U) + ( T- I*pi)*(g22*g22+g11*g11); - z4 = 2.0*g12*g22*(-U) + ( T- I*pi)*(g12*g12+g22*g22); - z5 = -(g11*g21+g12*g22)*T - (g21*g12+g11*g22)*(U-T) - + 0.5*(T-I*pi)*(g11*g11+g12*g12+g21*g21+g22*g22); - gam2 = Gamma2ST(U,T); - } - else if(iswap==2) { - w0 = -0.5*(U-I*pi); - w1 = -0.5*T; - w2 = -0.5*(T-2.*U); - z1 = 2.0*g11*g21*T +(U-I*pi)*(g11*g11+g21*g21); - z2 = 2.0*g21*g12*T +(U-I*pi)*(g21*g21+g12*g12); - z3 = 2.0*g22*g11*T +(U-I*pi)*(g22*g22+g11*g11); - z4 = 2.0*g12*g22*T +(U-I*pi)*(g12*g12+g22*g22); - z5 = (g11*g21+g12*g22)*(T-U) + (g21*g12+g11*g22)*U - + 0.5*(U-I*pi)*(g11*g11+g12*g12+g21*g21+g22*g22); - gam2 = Gamma2SU(U,T); - } - else - assert(false); - // Dw - for(unsigned int ix=0;ix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = R0(2,1) = R0(3,1) = 1.0; - if (oneLoop) { - double g11 = g_Lu; - double g12 = g_Ld; - //double g21 = g_Ru; - double g22 = g_Ru; - Complex w1(0.),z1(0.),z2(0.); - if(iswap==0) { - w1 = 0.25*I*pi; - z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - G2 = Gamma2Singlet(); - } - else if(iswap==1) { - w1 = -0.25*(T-I*pi); - z1 = -2.0*g11*g22*U +(T-I*pi)*(g11*g11+g22*g22); - z2 = -2.0*g12*g22*U +(T-I*pi)*(g12*g12+g22*g22); - G2 = Gamma2SingletST(T); - } - else if(iswap==2) { - w1 = -0.25*(U-I*pi); - z1 = 2.0*g11*g22*T +(U-I*pi)*(g11*g11+g22*g22); - z2 = 2.0*g12*g22*T +(U-I*pi)*(g12*g12+g22*g22); - G2 = Gamma2SingletSU(U); - } - else - assert(false); - for(unsigned int ix=0;ix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = R0(2,1) = R0(3,1) = 1.0; - if (oneLoop) { - double g11 = g_Lu; - double g12 = g_Ld; - //double g21 = g_Rd; - double g22 = g_Rd; - Complex w1(0.),z1(0.),z2(0.); - if(iswap==0) { - w1 = 0.25*I*pi; - z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - G2 = Gamma2Singlet(); - } - else if(iswap==1) { - w1 =-0.25*(T-I*pi); - z1 =-2.0*g11*g22*U + (T-I*pi)*(g11*g11+g22*g22); - z2 =-2.0*g12*g22*U + (T-I*pi)*(g12*g12+g22*g22); - G2 = Gamma2SingletST(T); - } - else if(iswap==2) { - w1 =-0.25*(U-I*pi); - z1 = 2.0*g11*g22*T + (U-I*pi)*(g11*g11+g22*g22); - z2 = 2.0*g12*g22*T + (U-I*pi)*(g12*g12+g22*g22); - G2 = Gamma2Singlet(); - } - else - assert(false); - for(unsigned int ix=0;ix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,1) = R0(1,1) = R0(2,1) = R0(3,1) = 1.0; - R0(0,0) = R0(3,0) = 0.25; - R0(1,0) = R0(2,0) = -0.25; - R0(4,0) = R0(5,0) = 0.5; - if (oneLoop) { - double g11 = g_Lu; - double g12 = g_Ld; - double g21 = g_Lnu; - double g22 = g_Le; - - for (unsigned int i=0; i<6; ++i) { - Dw(i,i) = 0.5*I*pi; - } - Complex w1 = (-1.0/2.0)*(T-U); - Complex w2 = (-1.0/2.0)*(T+U); - Dw(0,0) += w1; - Dw(3,3) += w1; - Dw(1,1) += -1.0*w1; - Dw(2,2) += -1.0*w1; - Dw(4,4) += w2; - Dw(5,5) += w2; - - Complex z1 = 2.0*g11*g21*(T-U) - I*pi*(g11*g11+g21*g21); - Complex z2 = 2.0*g21*g12*(T-U) - I*pi*(g21*g21+g12*g12); - Complex z3 = 2.0*g22*g11*(T-U) - I*pi*(g22*g22+g11*g11); - Complex z4 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Complex z5 = (g11*g21+g12*g22)*T - (g21*g12+g11*g22)*U - - 0.5*I*pi*(g11*g11+g12*g12+g21*g21+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - Dz(2,2) = z3; - Dz(3,3) = z4; - Dz(4,4) = Dz(5,5) = z5; - - G2 = Gamma2(U,T); - } - } - break; - case QQEE: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = 1.0; - if (oneLoop) { - double g11 = g_Lu; - double g12 = g_Ld; - //double g21 = g_Re; - double g22 = g_Re; - - Complex w1 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = w1; - - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Complex z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case UUUU: - case UUUUiden: - case tRtRUU: - { - unsigned int numGauge = 2, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,1) = 1.0; - if (oneLoop) { - double g11 = g_Ru; - //double g12 = g_Ru; - //double g21 = g_Ru; - double g22 = g_Ru; - // There is no Dw contribution for two SU(2) singlets. - Complex z1(0.); - if(iswap==0) { - z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - } - else if(iswap==1) { - z1 =-2.0*g11*g22*U + (T-I*pi)*(g11*g11+g22*g22); - } - else if(iswap==2) { - z1 = 2.0*g11*g22*T + (U-I*pi)*(g11*g11+g22*g22); - } - Dz(0,0) = Dz(1,1) = z1; - } - } - break; - case UUDD: - case tRtRDD: - { - unsigned int numGauge = 2, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,1) = 1.0; - if (oneLoop) { - double g11 = g_Ru; - //double g12 = g_Ru; - //double g21 = g_Rd; - double g22 = g_Rd; - // There is no Dw contribution for two SU(2) singlets. - Complex z1(0.); - if(iswap==0) { - z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - } - else if(iswap==1) { - z1 =-2.0*g11*g22*U + (T-I*pi)*(g11*g11+g22*g22); - } - else if(iswap==2) { - z1 = 2.0*g11*g22*T + (U-I*pi)*(g11*g11+g22*g22); - } - else - assert(false); - Dz(0,0) = Dz(1,1) = z1; - } - } - break; - case UULL: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = 1.0; - if (oneLoop) { - double g11 = g_Lnu; - double g12 = g_Le; - //double g21 = g_Ru; - double g22 = g_Ru; - - Complex w1 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = w1; - - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Complex z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case UUEE: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 1; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 1.0; - if (oneLoop) { - double g11 = g_Ru; - //double g12 = g_Ru; - //double g21 = g_Re; - double g22 = g_Re; - // There is no Dw contribution for two SU(2) singlets. - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Dz(0,0) = z1; - } - } - break; - case DDDD: - case DDDDiden: - { - unsigned int numGauge = 2, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,1) = 1.0; - if (oneLoop) { - double g11 = g_Rd; - //double g12 = g_Rd; - //double g21 = g_Rd; - double g22 = g_Rd; - // There is no Dw contribution for two SU(2) singlets. - Complex z1(0.); - if(iswap==0) { - z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - } - else if(iswap==1) { - z1 =-2.0*g11*g22*U +(T-I*pi)*(g11*g11+g22*g22); - } - else if(iswap==2) { - z1 = 2.0*g11*g22*T +(U-I*pi)*(g11*g11+g22*g22); - } - else - assert(false); - Dz(0,0) = Dz(1,1) = z1; - } - } - break; - case DDLL: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = 1.0; - if (oneLoop) { - double g11 = g_Lnu; - double g12 = g_Le; - //double g21 = g_Rd; - double g22 = g_Rd; - - Complex w1 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = w1; - - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Complex z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case DDEE: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 1; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0 *= 0.0; Dw = Dz *= 0.0; - R0(0,0) = 1.0; - if (oneLoop) { - double g11 = g_Rd; - //double g12 = g_Rd; - //double g21 = g_Re; - double g22 = g_Re; - // There is no Dw contribution for two SU(2) singlets. - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Dz(0,0) = z1; - } - } - break; - case LLLL: - case LLLLiden: - { - assert(iswap==0); - unsigned int numGauge = 2, numBrokenGauge = 6; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,1) = R0(1,1) = R0(2,1) = R0(3,1) = 1.0; - R0(0,0) = R0(3,0) = 0.25; - R0(1,0) = R0(2,0) = -0.25; - R0(4,0) = R0(5,0) = 0.5; - if (oneLoop) { - double g11 = g_Lnu; - double g12 = g_Le; - double g21 = g_Lnu; - double g22 = g_Le; - - for (int i=0; i<6; i++) { - Dw(i,i) = 0.5*I*pi; - } - Complex w1 = (-1.0/2.0)*(T-U); - Complex w2 = (-1.0/2.0)*(T+U); - Dw(0,0) += w1; - Dw(3,3) += w1; - Dw(1,1) += -1.0*w1; - Dw(2,2) += -1.0*w1; - Dw(4,4) += w2; - Dw(5,5) += w2; - - Complex z1 = 2.0*g11*g21*(T-U) - I*pi*(g11*g11+g21*g21); - Complex z2 = 2.0*g21*g12*(T-U) - I*pi*(g21*g21+g12*g12); - Complex z3 = 2.0*g22*g11*(T-U) - I*pi*(g22*g22+g11*g11); - Complex z4 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Complex z5 = (g11*g21+g12*g22)*T - (g21*g12+g11*g22)*U - - 0.5*I*pi*(g11*g11+g12*g12+g21*g21+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - Dz(2,2) = z3; - Dz(3,3) = z4; - Dz(4,4) = Dz(5,5) = z5; - - G2 = Gamma2(U,T); - } - } - break; - case LLEE: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,0) = 1.0; - if (oneLoop) { - double g11 = g_Lnu; - double g12 = g_Le; - //double g21 = g_Re; - double g22 = g_Re; - - Complex w1 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = w1; - - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Complex z2 = 2.0*g12*g22*(T-U) - I*pi*(g12*g12+g22*g22); - Dz(0,0) = z1; - Dz(1,1) = z2; - - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case EEEE: - case EEEEiden: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 1; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 1.0; - if (oneLoop) { - double g11 = g_Re; - //double g12 = g_Re; - //double g21 = g_Re; - double g22 = g_Re; - // There is no Dw contribution for two SU(2) singlets. - Complex z1 = 2.0*g11*g22*(T-U) - I*pi*(g11*g11+g22*g22); - Dz(0,0) = z1; - } - } - break; - case QQWW: - case LLWW: - { - assert(iswap==0); - unsigned int numGauge = 5, numBrokenGauge = 20; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 1.0; R0(0,1) = 0.5; - R0(1,0) = 1.0; R0(1,1) = -0.5; - R0(2,0) = cos2; R0(2,2) = -0.5*sin*cos; R0(2,3) = -0.5*sin*cos; R0(2,4) = sin2; - R0(3,0) = sin*cos; R0(3,2) = 0.5*cos2; R0(3,3) = -0.5*sin2; R0(3,4) = -sin*cos; - R0(4,0) = sin*cos; R0(4,2) = -0.5*sin2; R0(4,3) = 0.5*cos2; R0(4,4) = -sin*cos; - R0(5,0) = sin2; R0(5,2) = 0.5*sin*cos; R0(5,3) = 0.5*sin*cos; R0(5,4) = cos2; - R0(6,0) = 1.0; R0(6,1) = -0.5; - R0(7,0) = 1.0; R0(7,1) = 0.5; - R0(8,0) = cos2; R0(8,2) = 0.5*sin*cos; R0(8,3) = 0.5*sin*cos; R0(8,4) = sin2; - R0(9,0) = sin*cos; R0(9,2) = -0.5*cos2; R0(9,3) = 0.5*sin2; R0(9,4) = -sin*cos; - R0(10,0) = sin*cos; R0(10,2) = 0.5*sin2; R0(10,3) = -0.5*cos2; R0(10,4) = -sin*cos; - R0(11,0) = sin2; R0(11,2) = -0.5*sin*cos; R0(11,3) = -0.5*sin*cos; R0(11,4) = cos2; - R0(12,1) = -cos/sqrt(2.0); R0(12,3) = -sin/sqrt(2.0); - R0(13,1) = -sin/sqrt(2.0); R0(13,3) = cos/sqrt(2.0); - R0(14,1) = cos/sqrt(2.0); R0(14,2) = -sin/sqrt(2.0); - R0(15,1) = sin/sqrt(2.0); R0(15,2) = cos/sqrt(2.0); - R0(16,1) = -cos/sqrt(2.0); R0(16,2) = -sin/sqrt(2.0); - R0(17,1) = -sin/sqrt(2.0); R0(17,2) = cos/sqrt(2.0); - R0(18,1) = cos/sqrt(2.0); R0(18,3) = -sin/sqrt(2.0); - R0(19,1) = sin/sqrt(2.0); R0(19,3) = cos/sqrt(2.0); - if (oneLoop) { - double gW = g_W; - double g1(0.),g2(0.); - if (process==QQWW) { - g1 = g_Lu; - g2 = g_Ld; - } - else if (process==LLWW) { - g1 = g_Lnu; - g2 = g_Le; - } - - Complex w1 = T-U+5.0/4.0*I*pi; - Complex w2 = -T+U+5.0/4.0*I*pi; - Complex w3 = -0.5*(T+U) + 3.0/4.0*I*pi; - Complex w4 = 0.25*I*pi; - Dw(0,0) = Dw(7,7) = w1; - Dw(1,1) = Dw(6,6) = w2; - for (unsigned int i=12; i<20; i++) { - Dw(i,i) = w3; - } - Dw(2,2) = Dw(3,3) = Dw(4,4) = Dw(5,5) = w4; - Dw(8,8) = Dw(9,9) = Dw(10,10) = Dw(11,11) = w4; - - Complex z1 = 2.0*g1*gW*(U-T) - I*pi*(g1*g1+gW*gW); - Complex z2 = 2.0*g1*gW*(T-U) - I*pi*(g1*g1+gW*gW); - Complex z3 = 2.0*g2*gW*(U-T) - I*pi*(g2*g2+gW*gW); - Complex z4 = 2.0*g2*gW*(T-U) - I*pi*(g2*g2+gW*gW); - Complex z5 = -(g2*gW)*T + (g1*gW)*U - I*pi*(g1*g2+g1*gW-g2*gW); - Complex z6 = (g1*gW)*T - (g2*gW)*U - I*pi*(g1*g2+g1*gW-g2*gW); - Complex z7 = -I*pi*g1*g1; - Complex z8 = -I*pi*g2*g2; - Dz(0,0) = z1; - Dz(1,1) = z2; - Dz(2,2) = Dz(3,3) = Dz(4,4) = Dz(5,5) = z7; - Dz(6,6) = z3; - Dz(7,7) = z4; - Dz(8,8) = Dz(9,9) = Dz(10,10) = Dz(11,11) = z8; - Dz(12,12) = Dz(13,13) = Dz(16,16) = Dz(17,17) = z5; - Dz(14,14) = Dz(15,15) = Dz(18,18) = Dz(19,19) = z6; - - G2 = Gamma2w(U,T); - } - } - break; - case QQPhiPhi: - case LLPhiPhi: - { - assert(iswap==0); - unsigned int numGauge = 2, numBrokenGauge = 14; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 0.25; R0(0,1) = 1.0; - R0(1,0) = -1.0/8.0; R0(1,1) = 0.5; - R0(2,0) = I/8.0; R0(2,1) = -I/2.0; - R0(3,0) = -I/8.0; R0(3,1) = I/2.0; - R0(4,0) = -1.0/8.0; R0(4,1) = 1.0/2.0; - R0(5,0) = -1.0/4.0; R0(5,1) = 1.0; - R0(6,0) = 1.0/8.0; R0(6,1) = 1.0/2.0; - R0(7,0) = -I/8.0; R0(7,1) = -I/2.0; - R0(8,0) = I/8.0; R0(8,1) = I/2.0; - R0(9,0) = 1.0/8.0; R0(9,1) = 1.0/2.0; - R0(10,0) = -1.0/(2.0*sqrt(2.0)); - R0(11,0) = I/(2.0*sqrt(2.0)); - R0(12,0) = -1.0/(2.0*sqrt(2.0)); - R0(13,0) = -I/(2.0*sqrt(2.0)); - - if (oneLoop) { - double g1(0.),g2(0.); - if (process==QQPhiPhi) { - g1 = g_Lu; - g2 = g_Ld; - } - else if (process==LLPhiPhi) { - g1 = g_Lnu; - g2 = g_Le; - } - else - assert(false); - double g3 = g_phiPlus; - - Complex w0 = 0.25*I*pi; - Complex w1 = 0.5*(T-U) + 0.5*I*pi; - Complex w2 = -0.5*(T-U) + 0.5*I*pi; - Complex w3 = 0.25*I*(T-U); - Complex w4 = -0.25*(T+U) + 0.25*I*pi; - Dw(0,0) = w2; - Dw(1,1) = w0; Dw(1,2) = w3; Dw(1,3) = -w3; Dw(1,4) = w0; - Dw(2,1) = -w3; Dw(2,2) = w0; Dw(2,3) = -w0; Dw(2,4) = -w3; - Dw(3,1) = w3; Dw(3,2) = -w0; Dw(3,3) = w0; Dw(3,4) = w3; - Dw(4,1) = w0; Dw(4,2) = w3; Dw(4,3) = -w3; Dw(4,4) = w0; - Dw(5,5) = w1; - Dw(6,6) = w0; Dw(6,7) = -w3; Dw(6,8) = w3; Dw(6,9) = w0; - Dw(7,6) = w3; Dw(7,7) = w0; Dw(7,8) = -w0; Dw(7,9) = w3; - Dw(8,6) = -w3; Dw(8,7) = -w0; Dw(8,8) = w0; Dw(8,9) = -w3; - Dw(9,6) = w0; Dw(9,7) = -w3; Dw(9,8) = w3; Dw(9,9) = w0; - Dw(10,10) = w4; Dw(10,11) = I*w4; - Dw(11,10) = -I*w4; Dw(11,11) = w4; - Dw(12,12) = w4; Dw(12,13) = -I*w4; - Dw(13,12) = I*w4; Dw(13,13) = w4; - - Complex z1 = 2.0*g3*g1*(T-U) - I*pi*(g3*g3+g1*g1); - Complex z2 = 2.0*g3*g2*(T-U) - I*pi*(g3*g3+g2*g2); - Complex z3 = -I*pi*g1*g1; - Complex z4 = 0.5*I*g1*(T-U); - Complex z5 = 0.25*I*pi; - Complex z6 = -I*pi*g2*g2; - Complex z7 = 0.5*I*g2*(T-U); - Complex z8 = g3*g1*T-g3*g2*U-I*pi*(g1*g2-g2*g3+g1*g3); - Complex z9 = 0.5*I*g2*T-0.5*I*g1*U+pi/2.0*g2-pi/2.0*g1+pi/2.0*g3; - Dz(0,0) = z1; - Dz(1,1) = z3; Dz(1,2) = -z4; Dz(1,3) = z4; Dz(1,4) = -z5; - Dz(2,1) = z4; Dz(2,2) = z3; Dz(2,3) = z5; Dz(2,4) = z4; - Dz(3,1) = -z4; Dz(3,2) = z5; Dz(3,3) = z3; Dz(3,4) = -z4; - Dz(4,1) = -z5; Dz(4,2) = -z4; Dz(4,3) = z4; Dz(4,4) = z3; - Dz(5,5) = z2; - Dz(6,6) = z6; Dz(6,7) = -z7; Dz(6,8) = z7; Dz(6,9) = -z5; - Dz(7,6) = z7; Dz(7,7) = z6; Dz(7,8) = z5; Dz(7,9) = z7; - Dz(8,6) = -z7; Dz(8,7) = z5; Dz(8,8) = z6; Dz(8,9) = -z7; - Dz(9,6) = -z5; Dz(9,7) = -z7; Dz(9,8) = z7; Dz(9,9) = z6; - Dz(10,10) = z8; Dz(10,11) = -z9; - Dz(11,10) = z9; Dz(11,11) = z8; - Dz(12,12) = z8; Dz(12,13) = z9; - Dz(13,12) = -z9; Dz(13,13) = z8; - - G2 = Gamma2(U,T); - } - } - break; - case QQWG: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 6; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 1.0/sqrt(2); - R0(1,0) = 1.0/sqrt(2); - R0(2,0) = cos/2.0; - R0(3,0) = sin/2.0; - R0(4,0) = -cos/2.0; - R0(5,0) = -sin/2.0; - if (oneLoop) { - double g1 = g_Lu; - double g2 = g_Ld; - double gW = g_W; - - Complex w1 = -0.5*(T+U) + 0.75*I*pi; - Complex w2 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = w1; - Dw(2,2) = Dw(3,3) = Dw(4,4) = Dw(5,5) = w2; - - Complex z1 = gW*g1*T - gW*g2*U - I*pi*(g1*g2+g1*gW-g2*gW); - Complex z2 = gW*g1*U - gW*g2*T - I*pi*(g2*g1+g1*gW-g2*gW); - Complex z3 = -I*pi*g1*g1; - Complex z4 = -I*pi*g2*g2; - Dz(0,0) = z1; - Dz(1,1) = z2; - Dz(2,2) = z3; - Dz(3,3) = z3; - Dz(4,4) = z4; - Dz(5,5) = z4; - - G2(0,0) = -7.0/4.0*I*pi + (U+T); - } - } - break; - case QQBG: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 4; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = -sin; - R0(1,0) = cos; - R0(2,0) = -sin; - R0(3,0) = cos; - if (oneLoop) { - double g1 = g_Lu; - double g2 = g_Ld; - Complex w2 = 0.25*I*pi; - Dw(0,0) = Dw(1,1) = Dw(2,2) = Dw(3,3) = w2; - Complex z3 = -I*pi*g1*g1; - Complex z4 = -I*pi*g2*g2; - Dz(0,0) = z3; - Dz(1,1) = z3; - Dz(2,2) = z4; - Dz(3,3) = z4; - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case QQGG: - case QtQtGG: - { - unsigned int numGauge = 3, numBrokenGauge = 6; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(3,0) = 1.0; - R0(1,1) = R0(4,1) = 1.0; - R0(2,2) = R0(5,2) = 1.0; - double g1 = g_Lu; - double g2 = g_Ld; - Complex w2(0.),z3(0.),z4(0.); - if (oneLoop) { - if(iswap==0) { - w2 = 0.25*I*pi; - z3 = -I*pi*g1*g1; - z4 = -I*pi*g2*g2; - G2(0,0) = G2(1,1) = G2(2,2) = Gamma2Singlet()(0,0); - } - else if(iswap==1) { - w2 = 0.25*(-T+I*pi); - z3 = (T-I*pi)*sqr(g1); - z4 = (T-I*pi)*sqr(g2); - G2(0,0) = G2(1,1) = G2(2,2) = Gamma2SingletST(T)(0,0); - } - else if(iswap==2) { - w2 = 0.25*(-U+I*pi); - z3 = (U-I*pi)*g1*g1; - z4 = (U-I*pi)*g2*g2; - G2(0,0) = G2(1,1) = G2(2,2) = Gamma2SingletSU(U)(0,0); - } - else - assert(false); - Dw(0,0) = Dw(1,1) = Dw(2,2) = Dw(3,3) = Dw(4,4) = Dw(5,5) = w2; - Dz(0,0) = Dz(1,1) = Dz(2,2) = z3; - Dz(3,3) = Dz(4,4) = Dz(5,5) = z4; - } - } - break; - case UUBB: - case DDBB: - case EEBB: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 4; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = sin2; - R0(1,0) = -sin*cos; - R0(2,0) = -sin*cos; - R0(3,0) = cos2; - if (oneLoop) { - double g1(0.); - if (process==UUBB) { - g1 = g_Ru; - } - else if (process==DDBB) { - g1 = g_Rd; - } - else if (process==EEBB) { - g1 = g_Re; - } - else - assert(false); - // There is no Dw contribution for two SU(2) singlets. - Complex z1 = -I*pi*g1*g1; - Dz(0,0) = Dz(1,1) = Dz(2,2) = Dz(3,3) = z1; - } - } - break; - case UUPhiPhi: - case DDPhiPhi: - case EEPhiPhi: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 5; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = 1.0; - R0(1,0) = 0.5; - R0(2,0) = -0.5*I; - R0(3,0) = 0.5*I; - R0(4,0) = 0.5; - if (oneLoop) { - double g1(0.); - if (process==UUPhiPhi) { - g1 = g_Ru; - } - else if (process==DDPhiPhi) { - g1 = g_Rd; - } - else if (process==EEPhiPhi) { - g1 = g_Re; - } - double g3 = g_phiPlus; - Dw(0,0) = Dw(1,4) = Dw(4,1) = 0.25*I*pi; - Dw(2,3) = Dw(3,2) = -0.25*I*pi; - Complex z1 = 2.0*g3*g1*(T-U) - I*pi*(g3*g3+g1*g1); - Complex z2 = 0.5*I*g1*g1; - Complex z3 = -I*pi*g1*g1; - Complex z4 = 0.25*I*pi; - Dz(0,0) = z1; - Dz(1,1) = z3; Dz(1,2) = -z2; Dz(1,3) = z2; Dz(1,4) = -z4; - Dz(2,1) = z2; Dz(2,2) = z3; Dz(2,3) = z4; Dz(2,4) = z2; - Dz(3,1) = -z2; Dz(3,2) = z4; Dz(3,3) = z3; Dz(3,4) = -z2; - Dz(4,1) = -z4; Dz(4,2) = -z2; Dz(4,3) = z2; Dz(4,4) = z3; - G2(0,0) = Gamma2Singlet()(0,0); - } - } - break; - case UUBG: - case DDBG: - { - assert(iswap==0); - unsigned int numGauge = 1, numBrokenGauge = 2; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = -sin; - R0(1,0) = cos; - if (oneLoop) { - double g1(0.); - if (process==UUBG) { - g1 = g_Ru; - } - else if (process==DDBG) { - g1 = g_Rd; - } - else - assert(false); - // There is no Dw contribution for two SU(2) singlets. - Complex z1 = -I*pi*g1*g1; - Dz(0,0) = Dz(1,1) = z1; - } - } - break; - case UUGG: - case tRtRGG: - case DDGG: - { - unsigned int numGauge = 3, numBrokenGauge = 3; - R0 = boost::numeric::ublas::zero_matrix(numBrokenGauge,numGauge); - G2 = boost::numeric::ublas::zero_matrix(numGauge,numGauge); - Dw = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - Dz = boost::numeric::ublas::zero_matrix(numBrokenGauge,numBrokenGauge); - R0(0,0) = R0(1,1) = R0(2,2) = 1.0; - if (oneLoop) { - double g1(0.); - if ((process==UUGG)||(process==tRtRGG)) { - g1 = g_Ru; - } - else if (process==DDGG) { - g1 = g_Rd; - } - else - assert(false); - Complex z1(0.); - // There is no Dw contribution for two SU(2) singlets. - if(iswap==0) { - z1 = -I*pi*sqr(g1); - } - else if(iswap==1) { - z1 = (T-I*pi)*sqr(g1); - } - else if(iswap==2) { - z1 = (U-I*pi)*sqr(g1); - } - else - assert(false); - Dz(0,0) = Dz(1,1) = Dz(2,2) = z1; - } - } - break; - default: - assert(false); - } - - double aW = ElectroWeakReweighter::coupling()->aW(mu); - double aZ = ElectroWeakReweighter::coupling()->aZ(mu); - Energy mZ = ElectroWeakReweighter::coupling()->mZ(); - Energy mW = ElectroWeakReweighter::coupling()->mW(); - - if (!oneLoop) { - return R0; - } - boost::numeric::ublas::matrix output(R0); - boost::numeric::ublas::matrix temp(R0.size1(),R0.size2()); - boost::numeric::ublas::axpy_prod(R0,G2,temp); - output+=aW/(4.0*pi)*4.0*log(mW/mu)*temp; - boost::numeric::ublas::axpy_prod(Dw,R0,temp); - output+=aW/(4.0*pi)*4.0*log(mW/mu)*temp; - boost::numeric::ublas::axpy_prod(Dz,R0,temp); - output+=aZ/(4.0*pi)*4.0*log(mZ/mu)*temp; - return output; -} diff --git a/MatrixElement/EW/ElectroWeakMatching.h b/MatrixElement/EW/ElectroWeakMatching.h deleted file mode 100644 --- a/MatrixElement/EW/ElectroWeakMatching.h +++ /dev/null @@ -1,37 +0,0 @@ -// -*- C++ -*- -// -// ElectroWeakMatching.h is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#ifndef HERWIG_ElectroWeakMatching_H -#define HERWIG_ElectroWeakMatching_H -#include "ThePEG/Config/ThePEG.h" -#include "ThePEG/Config/Unitsystem.h" -#include "EWProcess.h" -// work around a Boost 1.64 bug where ublas headers would fail otherwise -#include -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#include - -namespace Herwig { -using namespace ThePEG; - -namespace ElectroWeakMatching { - - /** - * The high energy matching - */ - boost::numeric::ublas::matrix - electroWeakMatching(Energy mu, Energy2 s, Energy2 t, Energy2 u, - Herwig::EWProcess::Process process, - bool oneLoop,unsigned int iswap); -} -} - -#endif // HERWIG_ElectroWeakMatching_H diff --git a/MatrixElement/EW/ElectroWeakReweighter.cc b/MatrixElement/EW/ElectroWeakReweighter.cc deleted file mode 100644 --- a/MatrixElement/EW/ElectroWeakReweighter.cc +++ /dev/null @@ -1,1994 +0,0 @@ -// -*- C++ -*- -// -// This is the implementation of the non-inlined, non-templated member -// functions of the ElectroWeakReweighter class. -// - -#include "ElectroWeakReweighter.h" -#include "ThePEG/Interface/ClassDocumentation.h" -#include "ThePEG/Interface/Reference.h" -#include "ThePEG/Interface/Switch.h" -#include "ThePEG/EventRecord/Particle.h" -#include "ThePEG/Repository/UseRandom.h" -#include "ThePEG/Repository/EventGenerator.h" -#include "ThePEG/Utilities/DescribeClass.h" -#include "ThePEG/Persistency/PersistentOStream.h" -#include "ThePEG/Persistency/PersistentIStream.h" -#include "boost/numeric/ublas/matrix.hpp" -#include "boost/numeric/ublas/operation.hpp" -#include "EWProcess.h" -#include "HighEnergyMatching.h" -#include "ElectroWeakMatching.h" -#include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h" -#include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h" -#include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h" -#include "ThePEG/Helicity/epsilon.h" -#include "Herwig/MatrixElement/Matchbox/Base/SubtractedME.h" -#include "Herwig/MatrixElement/Matchbox/MatchboxFactory.h" -#include "ThePEG/Handlers/StandardXComb.h" - -using namespace Herwig; - -tEWCouplingsPtr ElectroWeakReweighter::staticEWCouplings_ = tEWCouplingsPtr(); - - -ElectroWeakReweighter::ElectroWeakReweighter() : testing_(false) -{} - -ElectroWeakReweighter::~ElectroWeakReweighter() {} - -IBPtr ElectroWeakReweighter::clone() const { - return new_ptr(*this); -} - -IBPtr ElectroWeakReweighter::fullclone() const { - return new_ptr(*this); -} - -void ElectroWeakReweighter::persistentOutput(PersistentOStream & os) const { - os << EWCouplings_ << collinearSudakov_ << softSudakov_ << testing_; -} - -void ElectroWeakReweighter::persistentInput(PersistentIStream & is, int) { - is >> EWCouplings_ >> collinearSudakov_ >> softSudakov_ >> testing_; -} - - -// The following static variable is needed for the type -// description system in ThePEG. -DescribeClass -describeHerwigElectroWeakReweighter("Herwig::ElectroWeakReweighter", "HwMEEW.so"); - -void ElectroWeakReweighter::Init() { - - static ClassDocumentation documentation - ("There is no documentation for the ElectroWeakReweighter class"); - - static Reference interfaceEWCouplings - ("EWCouplings", - "The object to calculate the electroweak couplings", - &ElectroWeakReweighter::EWCouplings_, false, false, true, false, false); - - static Reference interfaceCollinearSudakov - ("CollinearSudakov", - "The collinear Sudakov", - &ElectroWeakReweighter::collinearSudakov_, false, false, true, false, false); - - static Reference interfaceSoftSudakov - ("SoftSudakov", - "The soft Sudakov", - &ElectroWeakReweighter::softSudakov_, false, false, true, false, false); - - static Switch interfaceTesting - ("Testing", - "Whether or not to output testing information", - &ElectroWeakReweighter::testing_, false, false, false); - static SwitchOption interfaceTestingYes - (interfaceTesting, - "Yes", - "Output the information", - true); - static SwitchOption interfaceTestingNo - (interfaceTesting, - "No", - "Don't output the information", - false); - -} - -void ElectroWeakReweighter::doinit() { - ReweightBase::doinit(); - if(!testing_) return; - // testing output - cerr << "aEM\n"; - for(Energy scale=10.*GeV; scale<10*TeV; scale *= 1.1) { - cerr << scale/GeV << " " - << EWCouplings_->aEM(scale) << "\n"; - } - cerr << "aS\n"; - for(Energy scale=10.*GeV; scale<10*TeV; scale *= 1.4) { - cerr << scale/GeV << " " - << EWCouplings_->aS(scale) << "\n"; - } - cerr << "y_t\n"; - for(Energy scale=10.*GeV; scale<10*TeV; scale *= 1.4) { - cerr << scale/GeV << " " - << EWCouplings_->y_t(scale) << "\n"; - } - cerr << "lambda\n"; - for(Energy scale=91.2*GeV; scale<10*TeV; scale *= 1.4) { - cerr << scale/GeV << " " - << EWCouplings_->lambda(scale) << "\n"; - } - cerr << "vev\n"; - for(Energy scale=91.2*GeV; scale<10*TeV; scale *= 1.4) { - cerr << scale/GeV << " " - << EWCouplings_->vev(scale)/GeV << "\n"; - } - collinearSudakov_->makePlots(); - Energy2 s = sqr(5000.*GeV); - Energy2 t = -0.25*s; - Energy2 u = -0.75*s; - testEvolution(s,t,u); -} - -namespace { -// #ifdef ThePEG_HAS_UNITS_CHECKING -void axpy_prod_local(const boost::numeric::ublas::matrix & A, - const boost::numeric::ublas::matrix > & B, - boost::numeric::ublas::matrix > & C) { - assert(A.size2()==B.size1()); - C.resize(A.size1(),B.size2()); - for(unsigned int ix=0;ix > & A, - const boost::numeric::ublas::vector > & B, - boost::numeric::ublas::vector & C) { - assert(A.size2()==B.size()); - C.resize(A.size1()); - for(unsigned int ix=0;ix > & A, - const boost::numeric::ublas::matrix & B, - boost::numeric::ublas::matrix > & C) { - assert(A.size2()==B.size1()); - C.resize(A.size1(),B.size2()); - for(unsigned int ix=0;ix & A, -// const boost::numeric::ublas::matrix & B, -// boost::numeric::ublas::matrix & C) { -// assert(A.size2()==B.size1()); -// C.resize(A.size1(),B.size2()); -// axpy_prod(A,B,C); -// } - -// void axpy_prod_local(const boost::numeric::ublas::matrix & A, -// const boost::numeric::ublas::vector & B, -// boost::numeric::ublas::vector & C) { -// assert(A.size2()==B.size()); -// C.resize(A.size1()); -// axpy_prod(A,B,C); -// } -// #endif - -} - -double ElectroWeakReweighter::weight() const { - EWCouplings_->initialize(); - staticEWCouplings_ = EWCouplings_; - // cast the XComb - Ptr::ptr sxc = dynamic_ptr_cast::ptr>(lastXCombPtr()); - // if the Herwig XComb - if(sxc) { - // get information about the type of event - Ptr::tptr subme = dynamic_ptr_cast::tptr>(sxc->matrixElement()); - Ptr::tptr me = dynamic_ptr_cast::tptr>(sxc->matrixElement()); - Ptr::tptr dipme = dynamic_ptr_cast::tptr>(sxc->matrixElement()); - bool isHEvent(false),isSEvent(false); - if(subme) { - if ( subme->realShowerSubtraction() ) - isHEvent = true; - else if ( subme->virtualShowerSubtraction() || subme->loopSimSubtraction() ) - isSEvent = true; - } - // H or S event of virtual return 1. - if(isHEvent || isSEvent || (me && me->oneLoopNoBorn())) - return 1.; - // cerr << "testing after type check\n"; - // cerr << "testing pointers " << subme << " " << me << " " << dipme << "\n"; - // cerr << "testing event type " << isHEvent << " " << isSEvent << " " << "\n"; - // if(subme) cerr << subme->fullName() << "\n"; - // if( me) { - // cerr << me->fullName() << "\n"; - // cerr << me->oneLoopNoBorn() << " " << me->oneLoopNoLoops() << "\n"; - // } - // if(dipme) cerr << dipme->fullName() << "\n"; - } - // cerr << subProcess() << "\n"; - // cerr << *subProcess() << "\n"; - // only 2->2 processes - if(subProcess()->outgoing().size()!=2) return 1.; - // processes with gg initial-state - if(subProcess()->incoming().first->id()==ParticleID::g && - subProcess()->incoming().second->id()==ParticleID::g) { - if(subProcess()->outgoing()[0]->id()==ParticleID::g && - subProcess()->outgoing()[1]->id()==ParticleID::g) - return 1.; - else if(abs(subProcess()->outgoing()[0]->id())<=6 && - subProcess()->outgoing()[0]->id()==-subProcess()->outgoing()[1]->id()) { - return reweightggqqbar(); - } - else - assert(false); - } - // processes with q qbar initial-state - else if((subProcess()->incoming().first ->id() > 0 && - subProcess()->incoming().first ->id()<= 5 && - subProcess()->incoming().second->id() < 0 && - subProcess()->incoming().second->id()>=-5) || - (subProcess()->incoming().second->id() > 0 && - subProcess()->incoming().second->id()<= 5 && - subProcess()->incoming().first ->id() < 0 && - subProcess()->incoming().first ->id()>=-5)) { - // identical flavour q qbar - if(subProcess()->incoming().first ->id() == -subProcess()->incoming().second->id()) { - // q qbar -> gg - if(subProcess()->outgoing()[0]->id()==ParticleID::g && - subProcess()->outgoing()[1]->id()==ParticleID::g) - return reweightqqbargg(); - // q qbar -> q' q'bar - else if(subProcess()->outgoing()[0]->id() == -subProcess()->outgoing()[1]->id() && - abs(subProcess()->outgoing()[0]->id())<=6) - return reweightqqbarqqbarS(); - } - // different flavour q qbar - else { - if((subProcess()->outgoing()[0]->id() > 0 && - subProcess()->outgoing()[0]->id()<= 5 && - subProcess()->outgoing()[1]->id() < 0 && - subProcess()->outgoing()[1]->id()>=-5) || - (subProcess()->outgoing()[1]->id() > 0 && - subProcess()->outgoing()[1]->id()<= 5 && - subProcess()->outgoing()[0]->id() < 0 && - subProcess()->outgoing()[0]->id()>=-5)) { - return reweightqqbarqqbarT(); - } - else - assert(false); - } - } - // processes with q g initial-state - else if((subProcess()->incoming().first ->id()> 0 && - subProcess()->incoming().first ->id()<=5 && - subProcess()->incoming().second->id()==ParticleID::g) || - (subProcess()->incoming().second->id()> 0 && - subProcess()->incoming().second->id()<=5 && - subProcess()->incoming().first ->id()==ParticleID::g)) { - // qg -> qg - if((subProcess()->outgoing()[0]->id()> 0 && - subProcess()->outgoing()[0]->id()<=5 && - subProcess()->outgoing()[1]->id()==ParticleID::g) || - (subProcess()->outgoing()[1]->id()> 0 && - subProcess()->outgoing()[1]->id()<=5 && - subProcess()->outgoing()[0]->id()==ParticleID::g)) - return reweightqgqg(); - // unknown - else - assert(false); - } - // processes with qbar g initial-state - else if((subProcess()->incoming().first ->id()>=-5 && - subProcess()->incoming().first ->id()< 0 && - subProcess()->incoming().second->id()==ParticleID::g) || - (subProcess()->incoming().second->id()>=-5 && - subProcess()->incoming().second->id()< 0 && - subProcess()->incoming().first ->id()==ParticleID::g)) { - if((subProcess()->outgoing()[0]->id()>=-5 && - subProcess()->outgoing()[0]->id()< 0 && - subProcess()->outgoing()[1]->id()==ParticleID::g) || - (subProcess()->outgoing()[1]->id()>=-5 && - subProcess()->outgoing()[1]->id()< 0 && - subProcess()->outgoing()[0]->id()==ParticleID::g)) - return reweightqbargqbarg(); - else - assert(false); - } - // processes with q q initial-state - else if( subProcess()->incoming().first ->id()> 0 && - subProcess()->incoming().first ->id()<=5 && - subProcess()->incoming().second->id()> 0 && - subProcess()->incoming().second->id()<=5 ) { - if(subProcess()->outgoing()[0]->id()> 0 && - subProcess()->outgoing()[0]->id()<=5 && - subProcess()->outgoing()[1]->id()> 0 && - subProcess()->outgoing()[1]->id()<=5) - return reweightqqqq(); - else - assert(false); - } - // processes with qbar qbar initial-state - else if( subProcess()->incoming().first ->id()< 0 && - subProcess()->incoming().first ->id()>= -5 && - subProcess()->incoming().second->id()< 0 && - subProcess()->incoming().second->id()>= -5 ) { - if(subProcess()->outgoing()[0]->id()< 0 && - subProcess()->outgoing()[0]->id()>= -5 && - subProcess()->outgoing()[1]->id()< 0 && - subProcess()->outgoing()[1]->id()>= -5) - return reweightqbarqbarqbarqbar(); - else - assert(false); - } - // unknown initial-state - else - assert(false); - assert(false); - staticEWCouplings_ = tEWCouplingsPtr(); -} - -void ElectroWeakReweighter::testEvolution(Energy2 s,Energy2 t, Energy2 u) const { - Energy highScale = sqrt(s); - Energy ewScale = coupling()->mZ(); - Energy lowScale = 50.0*GeV; - for (unsigned int i=0; i<45;++i) { - EWProcess::Process process = (EWProcess::Process)i; - cerr << "process " << process << "\n"; - // result for all EW and QCD SCET contributions: - boost::numeric::ublas::matrix > highMatch_val - = HighEnergyMatching::highEnergyMatching(highScale,s,t,u,process,true,true); - boost::numeric::ublas::matrix highRunning_val - = softSudakov_->highEnergyRunning(highScale,ewScale,s,t,u,process,0); - boost::numeric::ublas::matrix ewMatch_val = - ElectroWeakMatching::electroWeakMatching(ewScale,s,t,u,process,true,0); - boost::numeric::ublas::matrix lowRunning_val = - softSudakov_->lowEnergyRunning(ewScale,lowScale,s,t,u,process,0); - boost::numeric::ublas::matrix collinearHighRunning_val = - collinearSudakov_->highEnergyRunning(highScale,ewScale,s,process,false); - boost::numeric::ublas::matrix collinearEWMatch_val = - collinearSudakov_->electroWeakMatching(ewScale,s,process,true); - boost::numeric::ublas::matrix collinearLowRunning_val = - collinearSudakov_->lowEnergyRunning(ewScale,lowScale,s,process); - boost::numeric::ublas::matrix lowMatchTemp_val = - boost::numeric::ublas::zero_matrix(ewMatch_val.size1(),ewMatch_val.size2()); - for (unsigned int ii=0; ii temp(highRunning_val.size1(),collinearHighRunning_val.size2()); - boost::numeric::ublas::axpy_prod(highRunning_val,collinearHighRunning_val,temp); - boost::numeric::ublas::matrix temp2(collinearLowRunning_val.size1(),lowRunning_val.size2()); - boost::numeric::ublas::axpy_prod(collinearLowRunning_val,lowRunning_val,temp2); - boost::numeric::ublas::matrix temp3(temp2.size1(),lowMatchTemp_val.size2()); - boost::numeric::ublas::axpy_prod(temp2,lowMatchTemp_val,temp3); - temp2.resize(temp3.size1(),temp.size2()); - boost::numeric::ublas::axpy_prod(temp3,temp,temp2); - boost::numeric::ublas::matrix > result(temp2.size1(),highMatch_val.size2()); - axpy_prod_local(temp2,highMatch_val,result); - for(unsigned int ix=0;ix > & eps3, - vector > & eps4, - unsigned int iopt) { - static const Complex I(0.,1.); - // p1 is p-, p2 is p+ - // p3 is k-, p4 is k+ - // both final-state - if(iopt==0) { - // swap t and u due Aneesh's defn - Energy3 den1 = sqrt((u*t-sqr(m2))*(s-4.*m2)); - Energy3 den2 = sqrt(s*(u*t-sqr(m2))); - LorentzVector eps3Para = (m2+t)/den1*p1 -(m2+u)/den1*p2 +(u-t)/den1*p3; - LorentzVector eps3Perp = 2./den2*epsilon(p1,p2,p3); - LorentzVector eps4Para = (m2+t)/den1*p2 -(m2+u)/den1*p1 +(u-t)/den1*p4; - LorentzVector eps4Perp = 2./den2*epsilon(p1,p2,p4); - eps3.push_back(sqrt(0.5)*(eps3Para+I*eps3Perp)); - eps3.push_back(sqrt(0.5)*(eps3Para-I*eps3Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para+I*eps4Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para-I*eps4Perp)); - if(m2!=ZERO) assert(false); - } - // both initial-state - else if(iopt==1) { - if(m2!=ZERO) assert(false); - LorentzVector eps3Para( 1., 0.,0.,0.); - LorentzVector eps3Perp( 0.,-1.,0.,0.); - LorentzVector eps4Para(-1.,0.,0., 0.); - LorentzVector eps4Perp( 0., 1.,0.,0.); - eps3.push_back(sqrt(0.5)*(eps3Para+I*eps3Perp)); - eps3.push_back(sqrt(0.5)*(eps3Para-I*eps3Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para+I*eps4Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para-I*eps4Perp)); - } - else if(iopt==2) { - // rotation into the 2,3 Breit frame - Lorentz5Momentum pa = p3-p2; - Axis axis(pa.vect().unit()); - LorentzRotation rot; - double sinth(sqrt(sqr(axis.x())+sqr(axis.y()))); - if ( sinth > 1.e-9 ) - rot.setRotate(-acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.)); - rot.rotateX(Constants::pi); - rot.boostZ( pa.e()/pa.vect().mag()); - Lorentz5Momentum ptemp=rot*p2; - Boost trans = -1./ptemp.e()*ptemp.vect(); - trans.setZ(0.); - rot.boost(trans); - LorentzVector eps3Para( 1., 0.,0.,0.); - LorentzVector eps3Perp( 0.,-1.,0.,0.); - LorentzVector eps4Para(-1.,0.,0., 0.); - LorentzVector eps4Perp( 0., 1.,0.,0.); - eps3.push_back(sqrt(0.5)*(eps3Para+I*eps3Perp)); - eps3.push_back(sqrt(0.5)*(eps3Para-I*eps3Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para+I*eps4Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para-I*eps4Perp)); - rot = rot.invert(); - for(unsigned int ix=0;ix<2;++ix) { - eps3[ix] *=rot; - eps4[ix] *=rot; - } - } - else if(iopt==3) { - // rotation into the 1,4 Breit frame - Lorentz5Momentum pa = p4-p1; - Axis axis(pa.vect().unit()); - LorentzRotation rot; - double sinth(sqrt(sqr(axis.x())+sqr(axis.y()))); - if ( sinth > 1.e-9 ) - rot.setRotate(-acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.)); - rot.rotateX(Constants::pi); - rot.boostZ( pa.e()/pa.vect().mag()); - Lorentz5Momentum ptemp=rot*p1; - Boost trans = -1./ptemp.e()*ptemp.vect(); - trans.setZ(0.); - rot.boost(trans); - LorentzVector eps3Para( 1., 0.,0.,0.); - LorentzVector eps3Perp( 0.,-1.,0.,0.); - LorentzVector eps4Para(-1.,0.,0., 0.); - LorentzVector eps4Perp( 0., 1.,0.,0.); - eps3.push_back(sqrt(0.5)*(eps3Para+I*eps3Perp)); - eps3.push_back(sqrt(0.5)*(eps3Para-I*eps3Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para+I*eps4Perp)); - eps4.push_back(sqrt(0.5)*(eps4Para-I*eps4Perp)); - rot = rot.invert(); - for(unsigned int ix=0;ix<2;++ix) { - eps3[ix] *=rot; - eps4[ix] *=rot; - } - } - else - assert(false); -} - -} - -double ElectroWeakReweighter::reweightqqbargg() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - tcPDPtr q = subProcess()->incoming().first ->dataPtr(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr qbar = subProcess()->incoming().second->dataPtr(); - if(subProcess()->incoming().first->id()<0) { - swap(p1,p2 ); - swap(q ,qbar); - } - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - tcPDPtr g = subProcess()->outgoing()[1]->dataPtr(); - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonci rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornQQGGweights,bornRRGGweights,EWQQGGweights,EWRRGGweights; - // quark left doublet - if(q->id()!=5) { - bornQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,true ,0); - EWQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,false,0); - } - else { - bornQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,true ,0); - EWQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,false,0); - } - // quark right singlet - if(abs(subProcess()->incoming().first->id())%2==0) { - bornRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,true ,0); - EWRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,false,0); - } - else { - bornRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,true ,0); - EWRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,false,0); - } - SpinorWaveFunction qw(p1,q ,incoming); - SpinorBarWaveFunction qbarw(p2,qbar,incoming); - vector > eps3,eps4; - SackGluonPolarizations(p1,p2,p3,p4,s,t,u,ZERO,eps3,eps4,0); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(3,3), - EWME = boost::numeric::ublas::zero_matrix(3,3); - for(unsigned int iq=0;iq<2;++iq) { - if(iq==0) { - qw.reset (0); - qbarw.reset(1); - } - else { - qw.reset (1); - qbarw.reset(0); - } - LorentzVector > current = iq==0 ? - qw.dimensionedWave(). leftCurrent(qbarw.dimensionedWave()) : - qw.dimensionedWave().rightCurrent(qbarw.dimensionedWave()); - for(unsigned int i1=0;i1<2;++i1) { - complex d31 = eps3[i1].dot(p1); - LorentzVector > - temp = qw.dimensionedWave().slash(eps3[i1]).slash(p4-p2).vectorCurrent(qbarw.dimensionedWave()); - for(unsigned int i2=0;i2<2;++i2) { - boost::numeric::ublas::vector > M(5); - Complex d34 = eps3[i1].dot(eps4[i2]); - complex d42 = eps4[i2].dot(p2); - // M0 in paper - M(0) = temp.dot(eps4[i2]); - // M4 in paper - M(2) = current.dot(eps4[i2])*d31; - // M5 in paper - M(3) = -current.dot(eps3[i1])*d42; - // M1 in paper (missing factor) - M(1) = current.dot(p4); - // M6 in paper - M(4) = M(1)*d31*d42/GeV2; - // M1 final factor - M(1) *= d34; - // coefficient of different contributions - boost::numeric::ublas::vector Cborn(3),CEW(3),Ctest(3); - - - // Ctest(0) = 1./6.*( MEU+MET); - // Ctest(1) = 0.5*( MEU+MET); - // Ctest(2) = 0.5*(MEU+MES-MET+MES); - if(iq==0) { - axpy_prod_local(bornQQGGweights,M,Cborn); - axpy_prod_local(EWQQGGweights ,M,CEW ); - } - else { - axpy_prod_local(bornRRGGweights,M,Cborn); - axpy_prod_local(EWRRGGweights ,M,CEW ); - } - unsigned int ioff = (Cborn.size()==6 && q->id()%2!=0) ? 3 : 0; - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - bornME(ix,iy) += Cborn(ix+ioff)*conj(Cborn(iy+ioff)); - EWME (ix,iy) += CEW (ix+ioff)*conj(CEW (iy+ioff)); - } - } - } - } - } - double born = 24.*real(bornME(0,0))+20./3.*real(bornME(1,1))+12.*real(bornME(2,2)); - double EW = 24.*real(EWME(0,0))+20./3.*real(EWME(1,1))+12.*real(EWME(2,2)); - return EW/born; -} - -boost::numeric::ublas::matrix > -ElectroWeakReweighter::evaluateRunning(EWProcess::Process process, Energy2 s, - Energy2 t, Energy2 u, bool born, - unsigned int iswap) const { - using namespace boost::numeric::ublas; - bool SU3save = coupling()->SU3(); - bool EWsave = coupling()-> EW(); - Energy highScale = sqrt(s); - Energy ewScale = coupling()->mZ(); - Energy lowScale = ewScale; - // result for all EW and QCD SCET contributions: - // MATCHING CONTRIBUTIONS - // high energy matching - matrix > highMatch_val; - if(iswap==0) - highMatch_val = HighEnergyMatching::highEnergyMatching(highScale,s,t,u,process,!born,false); - else if(iswap==1) - highMatch_val = HighEnergyMatching::highEnergyMatching(highScale,t,s,u,process,!born,false); - else if(iswap==2) - highMatch_val = HighEnergyMatching::highEnergyMatching(highScale,u,t,s,process,!born,false); - else - assert(false); - // low energy matching - matrix - ewMatch_val = ElectroWeakMatching::electroWeakMatching(ewScale,s,t,u,process,!born,iswap); - matrix collinearEWMatch_val = - collinearSudakov_->electroWeakMatching(ewScale,s,process,!born); - // EVOLUTION - matrix highRunning_val,lowRunning_val, - collinearHighRunning_val,collinearLowRunning_val; - // born process - if(born) { - highRunning_val = identity_matrix(softSudakov_->numberGauge(process)); - lowRunning_val = identity_matrix(softSudakov_->numberBrokenGauge(process)); - collinearHighRunning_val = identity_matrix(softSudakov_->numberGauge(process)); - collinearLowRunning_val = identity_matrix(softSudakov_->numberBrokenGauge(process)); - } - // EW corrected - else { - coupling()->SU3(false); - coupling()-> EW( true); - highRunning_val = softSudakov_->highEnergyRunning(highScale, ewScale,s,t,u,process,iswap); - lowRunning_val = softSudakov_->lowEnergyRunning ( ewScale,lowScale,s,t,u,process,iswap); - collinearHighRunning_val = collinearSudakov_->highEnergyRunning(highScale,ewScale,s,process,false); - collinearLowRunning_val = collinearSudakov_->lowEnergyRunning(ewScale,lowScale,s,process); - }; - matrix lowMatchTemp_val = - zero_matrix(ewMatch_val.size1(),ewMatch_val.size2()); - for (unsigned int ii=0; ii temp(highRunning_val.size1(),collinearHighRunning_val.size2()); - axpy_prod(highRunning_val,collinearHighRunning_val,temp); - matrix temp2(collinearLowRunning_val.size1(),lowRunning_val.size2()); - axpy_prod(collinearLowRunning_val,lowRunning_val,temp2); - matrix temp3(temp2.size1(),lowMatchTemp_val.size2()); - axpy_prod(temp2,lowMatchTemp_val,temp3); - temp2.resize(temp3.size1(),temp.size2()); - axpy_prod(temp3,temp,temp2); - matrix > result(temp2.size1(),highMatch_val.size2()); - axpy_prod_local(temp2,highMatch_val,result); - // reset the couplings - coupling()->SU3(SU3save); - coupling()-> EW( EWsave); - // return the answer - return result; -} - - -double ElectroWeakReweighter::reweightggqqbar() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - tcPDPtr qbar = subProcess()->outgoing()[0]->dataPtr(); - tcPDPtr q = subProcess()->outgoing()[1]->dataPtr(); - if(q->id()<0) { - swap(p3,p4 ); - swap(q ,qbar); - } - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonic rest frame and rescale momenta of outgoing - // so zero mass - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - p3.setMass(ZERO); - p3.rescaleRho(); - p4.setMass(ZERO); - p4.rescaleRho(); - // LO and EW matrix element coefficents - boost::numeric::ublas::matrix > - bornQQGGweights,bornRRGGweights,EWQQGGweights,EWRRGGweights; - // quark left doublet - if(q->id()<5) { - bornQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,true ,0); - EWQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,false,0); - } - else { - bornQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,true ,0); - EWQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,false,0); - } - // quark right singlet - if(q->id()==0) { - if(q->id()==6) { - bornRRGGweights = evaluateRunning(EWProcess::tRtRGG,s,t,u,true ,0); - EWRRGGweights = evaluateRunning(EWProcess::tRtRGG,s,t,u,false,0); - } - else { - bornRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,true ,0); - EWRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,false,0); - } - } - else { - bornRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,true ,0); - EWRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,false,0); - } - SpinorWaveFunction qw(p4,qbar,incoming); - SpinorBarWaveFunction qbarw(p3,q ,incoming); - vector > eps1,eps2; - SackGluonPolarizations(p1,p2,p3,p4,s,t,u,ZERO,eps1,eps2,1); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(3,3), - EWME = boost::numeric::ublas::zero_matrix(3,3); - // helicities of outgoing quarks - for(unsigned int iq=0;iq<2;++iq) { - if(iq==0) { - qw.reset (0); - qbarw.reset(1); - } - else { - qw.reset (1); - qbarw.reset(0); - } - LorentzVector > current = iq==0 ? - qw.dimensionedWave(). leftCurrent(qbarw.dimensionedWave()) : - qw.dimensionedWave().rightCurrent(qbarw.dimensionedWave()); - for(unsigned int i1=0;i1<2;++i1) { - complex d31 = eps1[i1].dot(p3); - LorentzVector > temp = - qw.dimensionedWave().slash(eps1[i1]) - .slash(p2-p4).vectorCurrent(qbarw.dimensionedWave()); - for(unsigned int i2=0;i2<2;++i2) { - boost::numeric::ublas::vector > M(5); - Complex d34 = eps1[i1].dot(eps2[i2]); - complex d42 = eps2[i2].dot(p4); - // M0 in paper - M(0) = temp.dot(eps2[i2]); - // M4 in paper - M(2) = current.dot(eps2[i2])*d31; - // M5 in paper - M(3) = -current.dot(eps1[i1])*d42; - // M1 in paper (missing factor) - M(1) = current.dot(p2); - // M6 in paper - M(4) = M(1)*d31*d42/GeV2; - // M1 final factor - M(1) *= d34; - // coefficient of different contributions - boost::numeric::ublas::vector Cborn(3),CEW(3); - if(iq==0) { - axpy_prod_local(bornQQGGweights,M,Cborn); - axpy_prod_local(EWQQGGweights ,M,CEW ); - } - else { - axpy_prod_local(bornRRGGweights,M,Cborn); - axpy_prod_local(EWRRGGweights ,M,CEW ); - } - unsigned int ioff = (Cborn.size()==6 && q->id()%2!=0) ? 3 : 0; - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - bornME(ix,iy) += Cborn(ix+ioff)*conj(Cborn(iy+ioff)); - EWME (ix,iy) += CEW (ix+ioff)*conj(CEW (iy+ioff)); - } - } - } - } - } - double born = 24.*real(bornME(0,0))+20./3.*real(bornME(1,1))+12.*real(bornME(2,2)); - double EW = 24.*real(EWME(0,0))+20./3.*real(EWME(1,1))+12.*real(EWME(2,2)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqgqg() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr q; - if(subProcess()->incoming().first->id()!=ParticleID::g) { - q = subProcess()->incoming().first ->dataPtr(); - } - else { - q = subProcess()->incoming().second->dataPtr(); - swap(p1,p2); - } - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - if(subProcess()->outgoing()[0]->id()!=ParticleID::g) - swap(p3,p4); - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonic rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornQQGGweights,bornRRGGweights,EWQQGGweights,EWRRGGweights; - // quark left doublet - if(q->id()!=5) { - bornQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,true ,1); - EWQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,false,1); - } - else { - bornQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,true ,1); - EWQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,false,1); - } - // quark right singlet - if(abs(q->id())%2==0) { - bornRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,true ,1); - EWRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,false,1); - } - else { - bornRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,true ,1); - EWRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,false,1); - } - SpinorWaveFunction qw(p1,q,incoming); - SpinorBarWaveFunction qbarw(p4,q,outgoing); - vector > eps2,eps3; - SackGluonPolarizations(p1,p2,p3,p4,s,t,u,ZERO,eps2,eps3,2); - // compute the matrix elements - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(3,3), - EWME = boost::numeric::ublas::zero_matrix(3,3), - testME = boost::numeric::ublas::zero_matrix(3,3); - for(unsigned int iq=0;iq<2;++iq) { - if(iq==0) { - qw.reset (0); - qbarw.reset(0); - } - else { - qw.reset (1); - qbarw.reset(1); - } - LorentzVector > current = iq==0 ? - qw.dimensionedWave(). leftCurrent(qbarw.dimensionedWave()) : - qw.dimensionedWave().rightCurrent(qbarw.dimensionedWave()); - for(unsigned int i1=0;i1<2;++i1) { - complex d31 = eps3[i1].dot(p1); - LorentzVector> temp = - qw.dimensionedWave().slash(eps3[i1]) - .slash(p2-p4).vectorCurrent(qbarw.dimensionedWave()); - for(unsigned int i2=0;i2<2;++i2) { - boost::numeric::ublas::vector > M(5); - Complex d34 = eps3[i1].dot(eps2[i2]); - complex d42 = eps2[i2].dot(p4); - // M0 in paper - M(0) = temp.dot(eps2[i2]); - // M4 in paper - M(2) = current.dot(eps2[i2])*d31; - // M5 in paper - M(3) = -current.dot(eps3[i1])*d42; - // M1 in paper (missing factor) - M(1) = current.dot(p2); - // M6 in paper - M(4) = M(1)*d31*d42/GeV2; - // M1 final factor - M(1) *= d34; - // coefficient of different contributions - boost::numeric::ublas::vector Cborn(3),CEW(3); - if(iq==0) { - axpy_prod_local(bornQQGGweights,M,Cborn); - axpy_prod_local(EWQQGGweights ,M,CEW ); - } - else { - axpy_prod_local(bornRRGGweights,M,Cborn); - axpy_prod_local(EWRRGGweights ,M,CEW ); - } - unsigned int ioff = (Cborn.size()==6 && q->id()%2!=0) ? 3 : 0; - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - bornME(ix,iy) += Cborn(ix+ioff)*conj(Cborn(iy+ioff)); - EWME (ix,iy) += CEW (ix+ioff)*conj(CEW (iy+ioff)); - } - } - } - } - } - double born = 24.*real(bornME(0,0))+20./3.*real(bornME(1,1))+12.*real(bornME(2,2)); - double EW = 24.*real(EWME(0,0))+20./3.*real(EWME(1,1))+12.*real(EWME(2,2)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqbargqbarg() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr qbar; - if(subProcess()->incoming().first->id()==ParticleID::g) { - qbar = subProcess()->incoming().second->dataPtr(); - } - else { - qbar = subProcess()->incoming().first ->dataPtr(); - swap(p1,p2); - } - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - if(subProcess()->outgoing()[0]->id()==ParticleID::g) - swap(p3,p4); - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonci rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornQQGGweights,bornRRGGweights,EWQQGGweights,EWRRGGweights; - // quark left doublet - if(qbar->id()!=-5) { - bornQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,true ,1); - EWQQGGweights = evaluateRunning(EWProcess::QQGG,s,t,u,false,1); - } - else { - bornQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,true ,1); - EWQQGGweights = evaluateRunning(EWProcess::QtQtGG,s,t,u,false,1); - } - // quark right singlet - if(abs(qbar->id())%2==0) { - bornRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,true ,1); - EWRRGGweights = evaluateRunning(EWProcess::UUGG,s,t,u,false,1); - } - else { - bornRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,true ,1); - EWRRGGweights = evaluateRunning(EWProcess::DDGG,s,t,u,false,1); - } - SpinorWaveFunction qw(p3,qbar,outgoing); - SpinorBarWaveFunction qbarw(p2,qbar,incoming); - vector > eps1,eps4; - SackGluonPolarizations(p1,p2,p3,p4,s,t,u,ZERO,eps1,eps4,3); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(3,3), - EWME = boost::numeric::ublas::zero_matrix(3,3); - for(unsigned int iq=0;iq<2;++iq) { - if(iq==0) { - qw.reset (1); - qbarw.reset(1); - } - else { - qw.reset (0); - qbarw.reset(0); - } - LorentzVector > current = iq==0 ? - qw.dimensionedWave(). leftCurrent(qbarw.dimensionedWave()) : - qw.dimensionedWave().rightCurrent(qbarw.dimensionedWave()); - for(unsigned int i1=0;i1<2;++i1) { - complex d31 = eps1[i1].dot(p3); - LorentzVector > temp = - qw.dimensionedWave().slash(eps1[i1]) - .slash(p4-p2).vectorCurrent(qbarw.dimensionedWave()); - for(unsigned int i2=0;i2<2;++i2) { - boost::numeric::ublas::vector > M(5); - Complex d34 = eps1[i1].dot(eps4[i2]); - complex d42 = eps4[i2].dot(p2); - // M0 in paper - M(0) = temp.dot(eps4[i2]); - // M4 in paper - M(2) = current.dot(eps4[i2])*d31; - // M5 in paper - M(3) = -current.dot(eps1[i1])*d42; - // M1 in paper (missing factor) - M(1) = current.dot(p4); - // M6 in paper - M(4) = M(1)*d31*d42/GeV2; - // M1 final factor - M(1) *= d34; - // coefficient of different contributions - boost::numeric::ublas::vector Cborn(3),CEW(3); - if(iq==0) { - axpy_prod_local(bornQQGGweights,M,Cborn); - axpy_prod_local(EWQQGGweights ,M,CEW ); - } - else { - axpy_prod_local(bornRRGGweights,M,Cborn); - axpy_prod_local(EWRRGGweights ,M,CEW ); - } - unsigned int ioff = (Cborn.size()==6 && abs(qbar->id())%2!=0) ? 3 : 0; - for(unsigned int ix=0;ix<3;++ix) { - for(unsigned int iy=0;iy<3;++iy) { - bornME(ix,iy) += Cborn(ix+ioff)*conj(Cborn(iy+ioff)); - EWME (ix,iy) += CEW (ix+ioff)*conj(CEW (iy+ioff)); - } - } - } - } - } - double born = 24.*real(bornME(0,0))+20./3.*real(bornME(1,1))+12.*real(bornME(2,2)); - double EW = 24.*real(EWME(0,0))+20./3.*real(EWME(1,1))+12.*real(EWME(2,2)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqqbarqqbarS() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - tcPDPtr q1 = subProcess()->incoming().first ->dataPtr(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr q1bar = subProcess()->incoming().second->dataPtr(); - if(q1->id()<0) { - swap(p1,p2 ); - swap(q1 ,q1bar); - } - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - tcPDPtr q2bar = subProcess()->outgoing()[0]->dataPtr(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - tcPDPtr q2 = subProcess()->outgoing()[1]->dataPtr(); - if(q2bar->id()>0) { - swap(p3,p4 ); - swap(q2 ,q2bar); - } - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonci rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - p3.setMass(ZERO); - p3.rescaleRho(); - p4.setMass(ZERO); - p4.rescaleRho(); - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornLLLLWeights,bornLLRRWeights,bornRRLLWeights,bornRRRRWeights, - EWLLLLWeights,EWLLRRWeights,EWRRLLWeights,EWRRRRWeights; - bool ident = q1->id()==q2->id(); - // LL -> LL - if((q1->id()<=4&& q2->id()<=4)|| (q1->id()==5 && q2->id()==5)) { - if(!ident) { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,true ,0); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,false,0); - } - else { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,true ,0); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,false,0); - } - } - else if(q1->id()==5 || q2->id()>=5) { - bornLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,true ,0); - EWLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,false,0); - } - else - assert(false); - // RR -> LL - if(q1->id()%2==0) { - if(q2->id()<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,0); - EWRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,0); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,0); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,0); - } - } - else { - if(q2->id()<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,0); - EWRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,0); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,0); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,0); - } - } - // LL -> RR - if(q1->id()<=4) { - if(q2->id()%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,0); - EWLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,0); - } - else if (q2->id()==6) { - bornLLRRWeights = evaluateRunning(EWProcess::QQtRtR,s,t,u,true ,0); - EWLLRRWeights = evaluateRunning(EWProcess::QQtRtR,s,t,u,false,0); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,0); - EWLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,0); - } - } - else { - if(q2->id()%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,0); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,0); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,0); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,0); - } - } - // RR -> RR - if(q1->id()%2==0) { - if(q2->id()==6) { - bornRRRRWeights = evaluateRunning(EWProcess::tRtRUU,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::tRtRUU,s,t,u,false,0); - } - else if(q2->id()%2==0) { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,false,0); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,false,0); - } - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,0); - } - } - else { - if(q2->id()==6) { - bornRRRRWeights = evaluateRunning(EWProcess::tRtRDD,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::tRtRDD,s,t,u,false,0); - } - else if(q2->id()%2==0) { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,0); - } - else { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,false,0); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,true ,0); - EWRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,false,0); - } - } - } - // extra terms for identical particles - boost::numeric::ublas::matrix > - borntChannelWeights,EWtChannelWeights; - if(ident) { - if(q1->id()%2==0) { - borntChannelWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,1); - EWtChannelWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,1); - } - else if(q1->id()==5) { - borntChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,1); - EWtChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,1); - } - else { - borntChannelWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,1); - EWtChannelWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,1); - } - } - SpinorWaveFunction q1w(p1,q1 ,incoming); - SpinorBarWaveFunction q1barw(p2,q1bar,incoming); - SpinorWaveFunction q2barw(p3,q2bar,outgoing); - SpinorBarWaveFunction q2w(p4,q2 ,outgoing); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(2,2), - EWME = boost::numeric::ublas::zero_matrix(2,2); - for(unsigned int iq1=0;iq1<2;++iq1) { - if(iq1==0) { - q1w.reset (0); - q1barw.reset(1); - } - else { - q1w.reset (1); - q1barw.reset(0); - } - LorentzVector > current1 = - q1w.dimensionedWave().vectorCurrent(q1barw.dimensionedWave()); - for(unsigned int iq2=0;iq2<2;++iq2) { - if(iq2==0) { - q2w.reset (0); - q2barw.reset(1); - } - else { - q2w.reset (1); - q2barw.reset(0); - } - LorentzVector > current2 = - q2barw.dimensionedWave().vectorCurrent(q2w.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - // amplitudes - if(iq1==0) { - // LL - if(iq2==0) { - unsigned int ioff; - if(q1->id()%2==0) { - ioff = q2->id()%2==0 ? 0 : 2; - } - else { - ioff = q2->id()%2==0 ? 1 : 3; - } - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLLLWeights(6*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLLLWeights(6*ix+ioff,0)); - } - } - // LR - else { - unsigned int ioff = q1->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLRRWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLRRWeights(2*ix+ioff,0)); - } - } - } - else { - if(iq2==0) { - unsigned int ioff=q2->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRLLWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWRRLLWeights(2*ix+ioff,0)); - } - } - else { - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRRRWeights(ix,0)); - CEW [ix] = Complex(amp* EWRRRRWeights(ix,0)); - } - } - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // extra t-channel pieces if identical flavours - if(ident) { - for(unsigned int iq1=0;iq1<2;++iq1) { - q1w.reset(iq1); - q2w.reset(iq1); - LorentzVector > current1 = - q1w.dimensionedWave().vectorCurrent(q2w.dimensionedWave()); - q1barw.reset(iq1); - q2barw.reset(iq1); - LorentzVector > current2 = - q2barw.dimensionedWave().vectorCurrent(q1barw.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - unsigned int ioff = q1->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*borntChannelWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp*EWtChannelWeights(2*ix+ioff,0)); - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // colour factors - double born = 2.*real(bornME(0,0))+9.*real(bornME(1,1)); - double EW = 2.*real( EWME(0,0))+9.*real( EWME(1,1)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqqbarqqbarT() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - tcPDPtr q1 = subProcess()->incoming().first ->dataPtr(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr q1bar = subProcess()->incoming().second->dataPtr(); - if(q1->id()<0) { - swap(p1,p2 ); - swap(q1 ,q1bar); - } - Lorentz5Momentum p3 = subProcess()->outgoing()[0]->momentum(); - tcPDPtr q2bar = subProcess()->outgoing()[0]->dataPtr(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1]->momentum(); - tcPDPtr q2 = subProcess()->outgoing()[1]->dataPtr(); - if(q2bar->id()>0) { - swap(p3,p4 ); - swap(q2 ,q2bar); - } - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonci rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - p3.setMass(ZERO); - p3.rescaleRho(); - p4.setMass(ZERO); - p4.rescaleRho(); - assert(q1==q2 && q1bar==q2bar); - assert( q1->id() != -q1bar->id() && q2->id() != -q2bar->id() ); - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornLLLLWeights,bornLLRRWeights,bornRRLLWeights,bornRRRRWeights, - EWLLLLWeights,EWLLRRWeights,EWRRLLWeights,EWRRRRWeights; - // LL - if( q1->id() == ParticleID::b || - q1bar->id() == ParticleID::bbar ) { - bornLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,true ,1); - EWLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,false,1); - } - else { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,true ,1); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,false,1); - } - // RR -> LL - if(q1->id()%2==0) { - if(q1bar->id()==ParticleID::bbar) { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,1); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,1); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,1); - EWRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,1); - } - } - else { - if(q1bar->id()==ParticleID::bbar) { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,1); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,1); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,1); - EWRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,1); - } - } - // LL -> RR - if(abs(q1bar->id())%2==0) { - if(q1->id()==ParticleID::b) { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,1); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,1); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,1); - EWLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,1); - } - } - else { - if(q1->id()==ParticleID::b) { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,1); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,1); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,1); - EWLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,1); - } - } - // RR -> RR - if(q1->id()%2==0) { - if(abs(q1bar->id())%2==0) { - bornRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,true ,1); - EWRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,false,1); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,1); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,1); - } - } - else { - if(abs(q1bar->id())%2==0) { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,1); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,1); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,true ,1); - EWRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,false,1); - } - } - // calculate the spinors - SpinorWaveFunction q1w(p1,q1 ,incoming); - SpinorBarWaveFunction q1barw(p2,q1bar,incoming); - SpinorWaveFunction q2barw(p3,q2bar,outgoing); - SpinorBarWaveFunction q2w(p4,q2 ,outgoing); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(2,2), - EWME = boost::numeric::ublas::zero_matrix(2,2); - for(unsigned int iq1=0;iq1<2;++iq1) { - q1w.reset(iq1); - q2w.reset(iq1); - LorentzVector > current1 = - q1w.dimensionedWave().vectorCurrent(q2w.dimensionedWave()); - for(unsigned int iq2=0;iq2<2;++iq2) { - q1barw.reset(iq2); - q2barw.reset(iq2); - LorentzVector > current2 = - q2barw.dimensionedWave().vectorCurrent(q1barw.dimensionedWave()); - // calculate the amplitude - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - if(iq1==0) { - // LL RR - if(iq2==0) { - unsigned int ioff = q1->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLRRWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLRRWeights(2*ix+ioff,0)); - } - } - // LL LL - else { - unsigned int ioff; - if(q1->id()%2==0) { - ioff = abs(q1bar->id())%2==0 ? 0 : 2; - } - else { - ioff = abs(q1bar->id())%2==0 ? 1 : 3; - } - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLLLWeights(6*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLLLWeights(6*ix+ioff,0)); - } - } - } - else { - // RR RR - if(iq2==0) { - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRRRWeights(ix,0)); - CEW [ix] = Complex(amp* EWRRRRWeights(ix,0)); - } - } - // RR LL - else { - unsigned int ioff=abs(q1bar->id())%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRLLWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWRRLLWeights(2*ix+ioff,0)); - } - } - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // colour factors - double born = 2.*real(bornME(0,0))+9.*real(bornME(1,1)); - double EW = 2.*real( EWME(0,0))+9.*real( EWME(1,1)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqqqq() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - tcPDPtr q1 = subProcess()->incoming().first ->dataPtr(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr q2 = subProcess()->incoming().second->dataPtr(); - Lorentz5Momentum p3 = subProcess()->outgoing()[0] ->momentum(); - tcPDPtr q3 = subProcess()->outgoing()[0] ->dataPtr(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1] ->momentum(); - tcPDPtr q4 = subProcess()->outgoing()[1] ->dataPtr(); - if(q1->id()!=q3->id()) { - swap(q3,q4); - swap(p3,p4); - } - assert(q1->id()==q3->id()); - assert(q2->id()==q4->id()); - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonci rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - p3.setMass(ZERO); - p3.rescaleRho(); - p4.setMass(ZERO); - p4.rescaleRho(); - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornLLLLWeights,bornLLRRWeights,bornRRLLWeights,bornRRRRWeights, - EWLLLLWeights,EWLLRRWeights,EWRRLLWeights,EWRRRRWeights; - bool ident = q1->id()==q2->id(); - // LL -> LL - if((q1->id()<=4&& q2->id()<=4)|| (q1->id()==5 && q2->id()==5)) { - if(!ident) { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,false,2); - } - else { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,false,2); - } - } - else if(q1->id()==5 || q2->id()==5) { - bornLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,false,2); - } - else - assert(false); - // RR -> LL - if(q1->id()%2==0) { - if(q2->id()<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,2); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,2); - } - } - else { - if(q2->id()<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,2); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,2); - } - } - // LL -> RR - if(q1->id()<=4) { - if(q2->id()%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,2); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,2); - } - } - else { - if(q2->id()%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,2); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,2); - } - } - // RR -> RR - if(q1->id()%2==0) { - if(q2->id()%2==0) { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,false,2); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,false,2); - } - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,2); - } - } - else { - if(q2->id()%2==0) { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,2); - } - else { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,false,2); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,false,2); - } - } - } - // extra terms for identical particles - boost::numeric::ublas::matrix > - borntChannelWeights,EWtChannelWeights; - if(ident) { - if(q1->id()%2==0) { - borntChannelWeights = evaluateRunning(EWProcess::QQUU,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QQUU,s,u,t,false,2); - } - else if(q1->id()==5) { - borntChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,u,t,false,2); - } - else { - borntChannelWeights = evaluateRunning(EWProcess::QQDD,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QQDD,s,u,t,false,2); - } - } - SpinorWaveFunction q1w(p1,q1,incoming); - SpinorWaveFunction q2w(p2,q2,incoming); - SpinorBarWaveFunction q3w(p3,q3,outgoing); - SpinorBarWaveFunction q4w(p4,q4,outgoing); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(2,2), - EWME = boost::numeric::ublas::zero_matrix(2,2); - for(unsigned int iq1=0;iq1<2;++iq1) { - q1w.reset(iq1); - q3w.reset(iq1); - LorentzVector > current1 = - q1w.dimensionedWave().vectorCurrent(q3w.dimensionedWave()); - for(unsigned int iq2=0;iq2<2;++iq2) { - q2w.reset(iq2); - q4w.reset(iq2); - LorentzVector > current2 = - q2w.dimensionedWave().vectorCurrent(q4w.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - // amplitudes - if(iq1==0) { - // LL - if(iq2==0) { - unsigned int ioff; - if(q1->id()%2==0) { - ioff = q2->id()%2==0 ? 0 : 2; - } - else { - ioff = q2->id()%2==0 ? 1 : 3; - } - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLLLWeights(6*ix+ioff,0)); - CEW [ix] = Complex(amp*EWLLLLWeights(6*ix+ioff,0)); - } - } - // LR - else { - unsigned int ioff = q1->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLRRWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLRRWeights(2*ix+ioff,0)); - } - } - } - else { - if(iq2==0) { - unsigned int ioff=q2->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRLLWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWRRLLWeights(2*ix+ioff,0)); - } - } - else { - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRRRWeights(ix,0)); - CEW [ix] = Complex(amp* EWRRRRWeights(ix,0)); - } - } - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // extra u-channel pieces if identical flavours - if(ident) { - for(unsigned int iq1=0;iq1<2;++iq1) { - q1w.reset(iq1); - q4w.reset(iq1); - LorentzVector > current1 = - q1w.dimensionedWave().vectorCurrent(q4w.dimensionedWave()); - if(iq1==0) { - q2w.reset(1); - q3w.reset(1); - } - else { - q2w.reset(0); - q3w.reset(0); - } - LorentzVector > current2 = - q2w.dimensionedWave().vectorCurrent(q3w.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - unsigned int ioff = q1->id()%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*borntChannelWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp*EWtChannelWeights(2*ix+ioff,0)); - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // colour factors - double born = 2.*real(bornME(0,0))+9.*real(bornME(1,1)); - double EW = 2.*real( EWME(0,0))+9.*real( EWME(1,1)); - return EW/born; -} - -double ElectroWeakReweighter::reweightqbarqbarqbarqbar() const { - // momenta and invariants - Lorentz5Momentum p1 = subProcess()->incoming().first ->momentum(); - tcPDPtr qbar1 = subProcess()->incoming().first ->dataPtr(); - Lorentz5Momentum p2 = subProcess()->incoming().second->momentum(); - tcPDPtr qbar2 = subProcess()->incoming().second->dataPtr(); - Lorentz5Momentum p3 = subProcess()->outgoing()[0] ->momentum(); - tcPDPtr qbar3 = subProcess()->outgoing()[0] ->dataPtr(); - Lorentz5Momentum p4 = subProcess()->outgoing()[1] ->momentum(); - tcPDPtr qbar4 = subProcess()->outgoing()[1] ->dataPtr(); - if(qbar1->id()!=qbar3->id()) { - swap(qbar3,qbar4); - swap(p3,p4); - } - assert(qbar1->id()==qbar3->id()); - assert(qbar2->id()==qbar4->id()); - Energy2 s = (p1+p2).m2(); - Energy2 t = (p1-p4).m2(); - Energy2 u = (p1-p3).m2(); - // boost to partonic rest frame - Lorentz5Momentum psum=p1+p2; - LorentzRotation boost(-psum.boostVector()); - p1 *= boost; - p2 *= boost; - p3 *= boost; - p4 *= boost; - p3.setMass(ZERO); - p3.rescaleRho(); - p4.setMass(ZERO); - p4.rescaleRho(); - // LO and EW corrected matrix element coefficients - boost::numeric::ublas::matrix > - bornLLLLWeights,bornLLRRWeights,bornRRLLWeights,bornRRRRWeights, - EWLLLLWeights,EWLLRRWeights,EWRRLLWeights,EWRRRRWeights; - bool ident = qbar1->id()==qbar2->id(); - // LL -> LL - if((abs(qbar1->id())<=4 && abs(qbar2->id())<=4) || - (abs(qbar1->id())==5 && abs(qbar2->id())==5)) { - if(!ident) { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQ,s,t,u,false,2); - } - else { - bornLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QQQQiden,s,t,u,false,2); - } - } - else if(abs(qbar1->id())==5 || abs(qbar2->id())==5) { - bornLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,true ,2); - EWLLLLWeights = evaluateRunning(EWProcess::QtQtQQ,s,t,u,false,2); - } - else - assert(false); - // RR -> LL - if(abs(qbar1->id())%2==0) { - if(abs(qbar2->id())<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,2); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,2); - } - } - else { - if(abs(qbar2->id())<5) { - bornRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,2); - } - else { - bornRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,2); - EWRRLLWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,2); - } - } - // LL -> RR - if(abs(qbar1->id())<=4) { - if(abs(qbar2->id())%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QQDD,s,t,u,false,2); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QQUU,s,t,u,false,2); - } - } - else { - if(abs(qbar2->id())%2!=0) { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtDD,s,t,u,false,2); - } - else { - bornLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,true ,2); - EWLLRRWeights = evaluateRunning(EWProcess::QtQtUU,s,t,u,false,2); - } - } - // RR -> RR - if(abs(qbar1->id())%2==0) { - if(abs(qbar2->id())%2==0) { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUUUiden,s,t,u,false,2); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUUU,s,t,u,false,2); - } - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,2); - } - } - else { - if(abs(qbar2->id())%2==0) { - bornRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::UUDD,s,t,u,false,2); - } - else { - if(ident) { - bornRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::DDDDiden,s,t,u,false,2); - } - else { - bornRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,true ,2); - EWRRRRWeights = evaluateRunning(EWProcess::DDDD,s,t,u,false,2); - } - } - } - // extra terms for identical particles - boost::numeric::ublas::matrix > - borntChannelWeights,EWtChannelWeights; - if(ident) { - if(abs(qbar1->id())%2==0) { - borntChannelWeights = evaluateRunning(EWProcess::QQUU,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QQUU,s,u,t,false,2); - } - else if(abs(qbar1->id())==5) { - borntChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QtQtDD,s,u,t,false,2); - } - else { - borntChannelWeights = evaluateRunning(EWProcess::QQDD,s,u,t,true ,2); - EWtChannelWeights = evaluateRunning(EWProcess::QQDD,s,u,t,false,2); - } - } - SpinorBarWaveFunction qbar1w(p1,qbar1,incoming); - SpinorBarWaveFunction qbar2w(p2,qbar2,incoming); - SpinorWaveFunction qbar3w(p3,qbar3,outgoing); - SpinorWaveFunction qbar4w(p4,qbar4,outgoing); - boost::numeric::ublas::matrix - bornME = boost::numeric::ublas::zero_matrix(2,2), - EWME = boost::numeric::ublas::zero_matrix(2,2); - for(unsigned int iq1=0;iq1<2;++iq1) { - qbar1w.reset(iq1); - qbar3w.reset(iq1); - LorentzVector > current1 = - qbar3w.dimensionedWave().vectorCurrent(qbar1w.dimensionedWave()); - for(unsigned int iq2=0;iq2<2;++iq2) { - qbar2w.reset(iq2); - qbar4w.reset(iq2); - LorentzVector > current2 = - qbar4w.dimensionedWave().vectorCurrent(qbar2w.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - // amplitudes - if(iq1==1) { - // LL - if(iq2==1) { - unsigned int ioff; - if(abs(qbar1->id())%2==0) { - ioff = abs(qbar2->id())%2==0 ? 0 : 2; - } - else { - ioff = abs(qbar2->id())%2==0 ? 1 : 3; - } - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLLLWeights(6*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLLLWeights(6*ix+ioff,0)); - } - } - // LR - else { - unsigned int ioff = abs(qbar1->id())%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornLLRRWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWLLRRWeights(2*ix+ioff,0)); - } - } - } - else { - if(iq2==1) { - unsigned int ioff=abs(qbar2->id())%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRLLWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp* EWRRLLWeights(2*ix+ioff,0)); - } - } - else { - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*bornRRRRWeights(ix,0)); - CEW [ix] = Complex(amp* EWRRRRWeights(ix,0)); - } - } - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // extra u-channel pieces if identical flavours - if(ident) { - for(unsigned int iq1=0;iq1<2;++iq1) { - qbar1w.reset(iq1); - qbar4w.reset(iq1); - LorentzVector > current1 = - qbar4w.dimensionedWave().vectorCurrent(qbar1w.dimensionedWave()); - if(iq1==0) { - qbar2w.reset(1); - qbar3w.reset(1); - } - else { - qbar2w.reset(0); - qbar3w.reset(0); - } - LorentzVector > current2 = - qbar3w.dimensionedWave().vectorCurrent(qbar2w.dimensionedWave()); - complex amp = current1.dot(current2); - vector Cborn(2),CEW(2); - unsigned int ioff = abs(qbar1->id())%2==0 ? 0 : 1; - for(unsigned int ix=0;ix<2;++ix) { - Cborn[ix] = Complex(amp*borntChannelWeights(2*ix+ioff,0)); - CEW [ix] = Complex(amp*EWtChannelWeights(2*ix+ioff,0)); - } - // square - for(unsigned int ix=0;ix<2;++ix) { - for(unsigned int iy=0;iy<2;++iy) { - bornME(ix,iy) += Cborn[ix]*conj(Cborn[iy]); - EWME (ix,iy) += CEW [ix]*conj(CEW [iy]); - } - } - } - } - // colour factors - double born = 2.*real(bornME(0,0))+9.*real(bornME(1,1)); - double EW = 2.*real( EWME(0,0))+9.*real( EWME(1,1)); - return EW/born; -} diff --git a/MatrixElement/EW/ElectroWeakReweighter.h b/MatrixElement/EW/ElectroWeakReweighter.h deleted file mode 100644 --- a/MatrixElement/EW/ElectroWeakReweighter.h +++ /dev/null @@ -1,212 +0,0 @@ -// -*- C++ -*- -#ifndef Herwig_ElectroWeakReweighter_H -#define Herwig_ElectroWeakReweighter_H -// -// This is the declaration of the ElectroWeakReweighter class. -// - -#include "ThePEG/MatrixElement/ReweightBase.h" -#include "EWCouplings.h" -#include "CollinearSudakov.h" -#include "SoftSudakov.h" - -namespace Herwig { - -using namespace ThePEG; - -/** - * The ElectroWeakReweighter class. - * - * @see \ref ElectroWeakReweighterInterfaces "The interfaces" - * defined for ElectroWeakReweighter. - */ -class ElectroWeakReweighter: public ReweightBase { - -public: - - /** @name Standard constructors and destructors. */ - //@{ - /** - * The default constructor. - */ - ElectroWeakReweighter(); - - /** - * The destructor. - */ - virtual ~ElectroWeakReweighter(); - //@} - -public: - - /** - * Return the weight for the kinematical configuation provided by - * the assigned XComb object (in the LastXCombInfo base class). - */ - virtual double weight() const; - - /** - * - */ - static tEWCouplingsPtr coupling() { - assert(staticEWCouplings_); - return staticEWCouplings_; - } - -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: - - /** - * Functions to reweight specific processes - */ - //@{ - /** - * Reweight \f$g g\to q\bar{q}\f$ - */ - double reweightggqqbar() const; - - /** - * Reweight \f$q\bar{q}\to g g\f$ - */ - double reweightqqbargg() const; - - /** - * Reweight \f$q g\to qg\f$ - */ - double reweightqgqg() const; - - /** - * Reweight \f$q g\to qg\f$ - */ - double reweightqbargqbarg() const; - - /** - * Reweight \f$q\bar{q}\to q'\bar{q'}\f$ (s-channel) - */ - double reweightqqbarqqbarS() const; - - /** - * Reweight \f$q\bar{q}\to q'\bar{q'}\f$ (t-channel) - */ - double reweightqqbarqqbarT() const; - - /** - * Reweight \f$qq \to qq\f$ - */ - double reweightqqqq() const; - - /** - * Reweight \f$\bar{q}\bar{q} \to \bar{q}\bar{q}\f$ - */ - double reweightqbarqbarqbarqbar() const; - //@} - -protected: - - /** - * Check the evolution for a fixed s,t,u - */ - void testEvolution(Energy2 s,Energy2 t, Energy2 u) const; - - /** - * Evalaute the running - */ - boost::numeric::ublas::matrix > - evaluateRunning(EWProcess::Process process, Energy2 s, - Energy2 t, Energy2 u, bool born, - unsigned int iswap) const; - -protected: - - /** @name Standard Interfaced functions. */ - //@{ - /** - * Initialize this object after the setup phase before saving an - * EventGenerator to disk. - * @throws InitException if object could not be initialized properly. - */ - virtual void doinit(); - //@} - -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. - */ - ElectroWeakReweighter & operator=(const ElectroWeakReweighter &) = delete; - -private: - - /** - * The Electroweak Couplings - */ - EWCouplingsPtr EWCouplings_; - - /** - * The Collinear Sudakov - */ - CollinearSudakovPtr collinearSudakov_; - - /** - * The Soft Sudakov - */ - SoftSudakovPtr softSudakov_; - - /** - * The couplings to allow global access - */ - static tEWCouplingsPtr staticEWCouplings_; - - /** - * Whether or not to output testing information - */ - bool testing_; - -}; - -} - -#endif /* Herwig_ElectroWeakReweighter_H */ diff --git a/MatrixElement/EW/GroupInvariants.cc b/MatrixElement/EW/GroupInvariants.cc deleted file mode 100644 --- a/MatrixElement/EW/GroupInvariants.cc +++ /dev/null @@ -1,268 +0,0 @@ -// -*- C++ -*- -// -// GroupInvariants.cc is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#include "GroupInvariants.h" -#include "ElectroWeakReweighter.h" - -using namespace Herwig; -using namespace GroupInvariants; - -double GroupInvariants::K_Factor(unsigned int i, - unsigned int N, bool high) { - using Constants::pi; - using Constants::zeta3; - // Find K_i for SU(N) (or, for U(1) if N==1) - // Relevent for finding the cusp anom. dim. - if (N!=1 && N!=2 && N!=3) { - std::cerr << "Error. In AnomDim, function K_Factor, N!={1,2,3}" - << std::endl; - assert(false); - } - - double CA = C_A(N); - double CF = C_F(N); - double nF = n_F(N,high); - double nS = n_S(N,high); - double TF = T_F(N,high); - double tS = t_S(N,high); - - if (i==1) { - return (67.0/9.0-1.0/3.0*pi*pi)*CA - 20.0/9.0*nF*TF - 8.0/9.0*tS*nS; - } - else if (i==2) { - return (245.0/6.0-134.0/27.0*pi*pi+22.0/3.0*zeta3+11.0/45.0*pi*pi*pi*pi)*CA*CA + - (-418.0/27.0+40.0/27.0*pi*pi-56.0/3.0*zeta3)*CA*TF*nF + - (-55.0/3.0+16.0*zeta3)*CF*TF*nF - 16.0/27.0*TF*TF*nF*nF; - } - else { - std::cerr << "Error. In AnomDim, function K_Factor, i!={1,2}" << std::endl; - assert(false); - } -} - -GaugeContributions GroupInvariants::cuspContributions(Energy mu, int K_ORDER, - bool high) { - using ThePEG::Constants::pi; - if (K_ORDER > 3) { - std::cerr << "Cusp anom dim. requested for K_ORDER>3.\n"; - assert(false); - } - // couplings (alphas) for U1, SU2, and SU3 - double a[3]; - if (high) { - a[0] = ElectroWeakReweighter::coupling()->a1(mu)/(4.0*pi); - a[1] = ElectroWeakReweighter::coupling()->a2(mu)/(4.0*pi); - a[2] = ElectroWeakReweighter::coupling()->a3(mu)/(4.0*pi); - } - else { - a[0] = ElectroWeakReweighter::coupling()->aEM(mu)/(4.0*pi); - a[1] = 0.0; - a[2] = ElectroWeakReweighter::coupling()->aS(mu)/(4.0*pi); - } - - // gammaN[0] is really 4.0*C_F, but there is a factor of C_F included in the - // G1-G3 matrices passed from HighRunning.h to the soft integrator. - double gamma1[3]; - gamma1[0] = 4.0; - gamma1[1] = K_Factor(1,1,high)*gamma1[0]; - gamma1[2] = K_Factor(2,1,high)*gamma1[0]; - double gamma2[3]; - gamma2[0] = 4.0; - gamma2[1] = K_Factor(1,2,high)*gamma2[0]; - gamma2[2] = K_Factor(2,2,high)*gamma2[0]; - double gamma3[3]; - gamma3[0] = 4.0; - gamma3[1] = K_Factor(1,3,high)*gamma3[0]; - gamma3[2] = K_Factor(2,3,high)*gamma3[0]; - - GaugeContributions result; - if (K_ORDER==0) { - return result; - } - // LO bit - if (K_ORDER>=1) { - result.U1 += a[0]*gamma1[0]; - result.SU2 += a[1]*gamma2[0]; - result.SU3 += a[2]*gamma3[0]; - } - // NLO bit - if (K_ORDER>=2) { - result.U1 += a[0]*a[0]*gamma1[1]; - result.SU2 += a[1]*a[1]*gamma2[1]; - result.SU3 += a[2]*a[2]*gamma3[1]; - } - // NNLO bit - if (K_ORDER>=3) { - result.U1 += a[0]*a[0]*a[0]*gamma1[2]; - result.SU2 += a[1]*a[1]*a[1]*gamma2[2]; - result.SU3 += a[2]*a[2]*a[2]*gamma3[2]; - } - return result; -} - -double GroupInvariants::B_Factor(int i, int N, bool fermion, - bool longitudinal) { - using Constants::pi; - using Constants::zeta3; - // Find B_i for SU(N) (or, for U(1) if N==1) - // Relevent for finding the collinear non-cusp anom. dim. - if (N!=1 && N!=2 && N!=3) { - std::cerr << "Error. In AnomDim, function B_Factor, N!={1,2,3}\n"; - assert(false); - } - - double CA = C_A(N); - double CF = C_F(N); - double nF = n_F(N,true); - double nS = n_S(N,true); - double TF = T_F(N,true); - double tS = t_S(N,true); - - if (longitudinal) { - if (i==1) return -8.0*CF; - // Two loop non-cusp not known for scalars - else if (i==2) return 0.0; - else assert(false); - } - else if (fermion) { - if (i==1) return -6.0*CF; - else if (i==2) { - return (4.0*pi*pi - 48.0*zeta3 - 3.0)*CF*CF + - (52.0*zeta3 - 11.0*pi*pi/3.0 - 961.0/27.0)*CA*CF + - (4.0*pi*pi/3.0 + 260.0/27.0)*CF*TF*nF + - (pi*pi/6.0 + 167.0/54.0)*CF*nS*tS*2.0; - } - else - assert(false); - } - else { - if (i==1) { - return -2.0*( 11.0*CA/3.0 - 4.0*TF*nF/3.0 - nS*tS/3.0 ); - } - else if (i==2) { - return CA*CA*(11.0*pi*pi/9.0+4.0*zeta3-1384.0/27.0) + - 2.0*CA*nF*TF*(256.0/27.0-2.0*pi*pi/9.0) + 8.0*CF*nF*TF; - } - else assert(false); - } -} - -double GroupInvariants::B_Factor_Low(int i, int N, bool fermion, - double boostFactor) { - using Constants::pi; - using Constants::zeta3; - // Find B_i for SU(N) (or, for U(1) if N==1) - // Relevent for finding the collinear non-cusp anom. dim. - if (N!=1 && N!=2 && N!=3) { - std::cerr << "Error. In AnomDim, function B_Factor, N!={1,2,3}\n"; - assert(false); - } - - double CA = C_A(N); - double CF = C_F(N); - double nF = n_F(N,false); - double nS = n_S(N,false); - double TF = T_F(N,false); - double tS = t_S(N,false); - - if (abs(boostFactor)>0.001) { - if (i==1) return -4.0*CF; - // Two loop non-cusp not known for bHQET top, W_L, and W_T fields. - else if (i==2) return 0.0; - else assert(false); - } - else if (fermion) { - if (i==1) return -6.0*CF; - else if (i==2) { - return (4.0*pi*pi - 48.0*zeta3 - 3.0)*CF*CF + - (52.0*zeta3 - 11.0*pi*pi/3.0 - 961.0/27.0)*CA*CF + - (4.0*pi*pi/3.0 + 260.0/27.0)*CF*TF*nF + - (pi*pi/6.0 + 167.0/54.0)*CF*nS*tS*2.0; - } - else - assert(false); - } - // Gluon and Photon are the only things left... use Gauge Boson NonCusps: - else { - if (i==1) return -2.0*( 11.0*CA/3.0 - 4.0*TF*nF/3.0 - nS*tS/3.0 ); - else if (i==2) { - return CA*CA*(11.0*pi*pi/9.0+4.0*zeta3-1384.0/27.0) + - 2.0*CA*nF*TF*(256.0/27.0-2.0*pi*pi/9.0) + 8.0*CF*nF*TF; - } - else - assert(false); - } -} - -GaugeContributions GroupInvariants::BContributions(Energy mu, - int B_ORDER, - bool fermion, - bool longitudinal) { - using Constants::pi; - // NOTE! THIS RETURNS 2*Gamma+sigma, AND SHOULD BE MULTIPLIED BY 1/2 IN - // THE COLLINEAR ANOMALOUS DIMENSION INTEGRAND - if (B_ORDER>2) { - std::cerr << "Non-cusp collinear anom dim. requested for B_ORDER>2.\n"; - assert(false); - } - - double a[3]; // alpha/(4pi) for U1, SU2, and SU3 - - a[0] = ElectroWeakReweighter::coupling()->a1(mu)/(4.0*pi); - a[1] = ElectroWeakReweighter::coupling()->a2(mu)/(4.0*pi); - a[2] = ElectroWeakReweighter::coupling()->a3(mu)/(4.0*pi); - - GaugeContributions result; - if (B_ORDER==0) { - return result; - } - if (B_ORDER>=1) { - result.SU3 += a[2]*B_Factor(1,3,fermion,longitudinal); - result.SU2 += a[1]*B_Factor(1,2,fermion,longitudinal); - result.U1 += a[0]*B_Factor(1,1,fermion,longitudinal); - } - if (B_ORDER>=2) { - result.SU3 += a[2]*a[2]*B_Factor(2,3,fermion,longitudinal); - result.SU2 += a[1]*a[1]*B_Factor(2,2,fermion,longitudinal); - result.U1 += a[0]*a[0]*B_Factor(2,1,fermion,longitudinal); - } - return result; -} - -GaugeContributions GroupInvariants::BContributionsLow(Energy mu, - int B_ORDER, - bool fermion, - double boostFactor) { - using Constants::pi; - // NOTE! THIS RETURNS 2*Gamma+sigma, AND SHOULD BE MULTIPLIED BY 1/2 IN - // THE COLLINEAR ANOMALOUS DIMENSION INTEGRAND - if (B_ORDER>2) { - std::cerr << "Non-cusp collinear anom dim. requested for B_ORDER>2.\n"; - } - // alpha/(4pi) for U1, SU2, and SU3 - double a[3]; - a[0] = ElectroWeakReweighter::coupling()->aEM(mu)/(4.0*pi); - a[1] = 0.0; - a[2] = ElectroWeakReweighter::coupling()->aS(mu)/(4.0*pi); - GaugeContributions result; - if (B_ORDER==0) { - return result; - } - if (B_ORDER>=1) { - result.SU3 += a[2]*B_Factor_Low(1,3,fermion,boostFactor); - result.SU2 += a[1]*B_Factor_Low(1,2,fermion,boostFactor); - result.U1 += a[0]*B_Factor_Low(1,1,fermion,boostFactor); - } - if (B_ORDER>=2) { - result.SU3 += a[2]*a[2]*B_Factor_Low(2,3,fermion,boostFactor); - result.SU2 += a[1]*a[1]*B_Factor_Low(2,2,fermion,boostFactor); - result.U1 += a[0]*a[0]*B_Factor_Low(2,1,fermion,boostFactor); - } - return result; -} diff --git a/MatrixElement/EW/GroupInvariants.h b/MatrixElement/EW/GroupInvariants.h deleted file mode 100644 --- a/MatrixElement/EW/GroupInvariants.h +++ /dev/null @@ -1,500 +0,0 @@ -// -*- C++ -*- -// -// GroupInvariants.h is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#ifndef HERWIG_GroupInvariants_H -#define HERWIG_GroupInvariants_H -#include "ThePEG/Config/ThePEG.h" -#include "ThePEG/Config/Unitsystem.h" -#include -// work around a Boost 1.64 bug where ublas headers would fail otherwise -#include -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#include - -namespace Herwig { -using namespace ThePEG; - -namespace GroupInvariants { - - /** - * Simple struct for storing the different gauge contributions - */ - struct GaugeContributions { - - /** - * Default Constructor - */ - GaugeContributions(double inSU3=0., - double inSU2=0., double inU1=0.) - : SU3(inSU3),SU2(inSU2),U1(inU1) - {} - /** - * \f$SU(3)\f$ - */ - double SU3; - - /** - * \f$SU(2)\f$ - */ - double SU2; - - /** - * \f$U(1)\f$ - */ - double U1; - }; - - - /** - * The \f$SU(N)\f$ \f$C_A\f$ - */ - inline double C_A(unsigned int N) { - return N !=1 ? double(N) : 0.; - } - - /** - * The \f$SU(N)\f$ \f$C_F\f$ - */ - inline double C_F(unsigned int N) { - return N !=1 ? 0.5*(double(N*N)-1.)/double(N) : 1.; - } - - /* - * The \f$SU(N)\f$ \f$C_d\f$ - */ - inline double C_d(unsigned int N) { - return (double(N*N)-4.)/double(N); - } - - /** - * The \f$SU(N)\f$\f$C_1\f$ - */ - inline double C_1(unsigned int N) { - double N2(N*N); - return 0.25*(N2-1.0)/N2; - } - - /** - * \f$T_F\f$ - */ - inline double T_F(unsigned int N, bool high) { - if(high) { - return N !=1 ? 0.5 : 5.0/3.0; - } - else { - return N !=1 ? 0.5 : 20.0/3.0; - } - } - - /** - * \f$t_S\f$ - */ - inline double t_S(unsigned int, bool ) { - return 0.5; - } - - /** - * / Number of complex scalars in the fundamental rep. of SU(N)/U(1) - */ - inline double n_S(unsigned int N, bool high) { - if(high) { - if(N==2 || N==1) return 1.0; - else if(N==3) return 0.0; - else assert(false); - } - else { - if(N>=1&&N<=3) return 0.; - else assert(false); - } - } - - /** - * Number of Dirac Fermions in the fund. rep. of SU(N) (or U(1) for N==1) - */ - inline double n_F(unsigned int N, bool high) { - if(high) { - if(N==1) return 3.0; - else if(N==2 || N==3) return 6.0; - else assert(false); - } - else { - if(N==1) return 1.0; - else if(N==2) return 0.0; - else if(N==3) return 5.0; - else assert(false); - } - } - - /** - * Find K_i for gauge group N. high=false for running at mu0.0) - return log(arg); - else if (arg<0.0) - return log(-arg)+I*Constants::pi; - else - assert(false); - } - - inline Complex MinusLog(double arg) { - static const Complex I(0,1.0); - if (arg>0.0) - return log(arg); - else if (arg<0.0) - return log(-arg)-I*Constants::pi; - else - assert(false); - } - - inline Complex getT(Energy2 s, Energy2 t) { - return MinusLog(-t/GeV2) - MinusLog(-s/GeV2); - } - - inline Complex getU(Energy2 s, Energy2 u) { - return MinusLog(-u/GeV2) - MinusLog(-s/GeV2); - } - - inline boost::numeric::ublas::matrix Gamma2(Complex U, Complex T) { - boost::numeric::ublas::matrix output(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = (-3.0/2.0)*I*pi + (T+U); - output(1,1) = (-3.0/2.0)*I*pi; - output(0,1) = 2.0*(T-U); - output(1,0) = (3.0/8.0)*(T-U); - return output; - } - - inline boost::numeric::ublas::matrix Gamma2ST(Complex U, Complex T) { - boost::numeric::ublas::matrix output(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = 3./2.*(T-I*pi) + U -2.*T; - output(1,1) = 3./2.*(T-I*pi); - output(0,1) = -2.0*U; - output(1,0) = -(3.0/8.0)*U; - return output; - } - - inline boost::numeric::ublas::matrix Gamma2SU(Complex U, Complex T) { - boost::numeric::ublas::matrix output(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = 3./2.*(U-I*pi) + T - 2.*U; - output(1,1) = 3./2.*(U-I*pi); - output(0,1) = 2.0*T; - output(1,0) = (3.0/8.0)*T; - return output; - } - - inline boost::numeric::ublas::matrix Gamma2w(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(5,5); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) += -I*pi*11.0/4.0; - output(0,1) += U-T; - output(1,0) += 2.0*(U-T); - output(1,1) += -I*pi*11.0/4.0 + (T+U); - output(2,2) += -7.0/4.0*I*pi + (U+T); - output(3,3) += -7.0/4.0*I*pi + (U+T); - output(4,4) += -3.0/4.0*I*pi; - return output; - } - - inline boost::numeric::ublas::matrix Gamma2Singlet() { - using namespace boost::numeric::ublas; - matrix output = zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = output(1,1) = -0.75*I*pi; - return output; - } - - inline boost::numeric::ublas::matrix Gamma2SingletST(Complex T) { - using namespace boost::numeric::ublas; - matrix output = zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = output(1,1) = 0.75*(T-I*pi); - return output; - } - - inline boost::numeric::ublas::matrix Gamma2SingletSU(Complex U) { - using namespace boost::numeric::ublas; - matrix output = zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = output(1,1) = 0.75*(U-I*pi); - return output; - } - - inline Complex Gamma1(double hypercharge) { - Complex I(0,1.0); - return -I*Constants::pi*sqr(hypercharge); - } - - inline Complex Gamma1ST(double hypercharge,Complex T) { - Complex I(0,1.0); - return (T-I*Constants::pi)*sqr(hypercharge); - } - - inline Complex Gamma1SU(double hypercharge,Complex U) { - Complex I(0,1.0); - return (U-I*Constants::pi)*sqr(hypercharge); - } - - inline Complex Gamma1(double y1, double y2, Complex T, Complex U) { - Complex I(0,1.0); - return -I*Constants::pi*(y1*y1+y2*y2) + 2.0*y1*y2*(T-U); - } - - inline Complex Gamma1ST(double y1, double y2, Complex T, Complex U) { - Complex I(0,1.0); - return (T-I*Constants::pi)*(y1*y1+y2*y2) - 2.0*y1*y2*U; - } - - inline Complex Gamma1SU(double y1, double y2, Complex T, Complex U) { - Complex I(0,1.0); - return (U-I*Constants::pi)*(y1*y1+y2*y2) + 2.0*y1*y2*T; - } - - inline Complex Gamma1(double y1, double y2, double y3, double y4, - Complex T, Complex U) { - Complex I(0,1.0); - return -I*Constants::pi*(y1*y1+y2*y2+y3*y3+y4*y4)/2.0 + - (y1*y4+y2*y3)*T - (y1*y3+y2*y4)*U; - } - - inline Complex Gamma1ST(double y1, double y2, double y3, double y4, - Complex T, Complex U) { - Complex I(0,1.0); - return (T-I*Constants::pi)*(y1*y1+y2*y2+y3*y3+y4*y4)/2.0 - - (y1*y4+y2*y3)*T - (y1*y3+y2*y4)*(U-T); - } - - inline Complex Gamma1SU(double y1, double y2, double y3, double y4, - Complex T, Complex U) { - Complex I(0,1.0); - return (U-I*Constants::pi)*(y1*y1+y2*y2+y3*y3+y4*y4)/2.0 + - (y1*y4+y2*y3)*(T-U) + (y1*y3+y2*y4)*U; - } - - inline boost::numeric::ublas::matrix Gamma3(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = -(8.0/3.0)*I*pi; - output(1,1) = -(8.0/3.0)*I*pi; - output(0,0) += (7.0/3.0)*T + (2.0/3.0)*U; - output(0,1) = 2.0*(T-U); - output(1,0) = (4.0/9.0)*(T-U); - return output; - } - - inline boost::numeric::ublas::matrix Gamma3ST(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = 8./3.*(T-I*pi); - output(1,1) = 8./3.*(T-I*pi); - output(0,0) += -3.*T + 2./3.*U; - output(0,1) = -2.*U; - output(1,0) = -4./9.*U; - return output; - } - - inline boost::numeric::ublas::matrix Gamma3SU(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = 8./3.*(U-I*pi); - output(1,1) = 8./3.*(U-I*pi); - output(0,0) += 7./3.*T -3.*U; - output(0,1) = 2.*T; - output(1,0) = 4./9.*T; - return output; - } - - inline boost::numeric::ublas::matrix Gamma3g(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(3,3); - static const Complex I(0,1.0); - using Constants::pi; - output(0,2) = U-T; - output(1,1) = 3.0/2.0*(T+U); - output(1,2) = 3.0/2.0*(U-T); - output(2,0) = 2.0*(U-T); - output(2,1) = 5.0/6.0*(U-T); - output(2,2) = 3.0/2.0*(T+U); - for (unsigned int i=0; i<3; i++) { - output(i,i) += -13.0/3.0*I*pi; - } - return output; - } - - inline boost::numeric::ublas::matrix Gamma3gST(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(3,3); - static const Complex I(0,1.0); - using Constants::pi; - output(0,2) = U; - output(1,1) = 3.0/2.0*(U-2.*T); - output(1,2) = 3.0/2.0*U; - output(2,0) = 2.0*U; - output(2,1) = 5.0/6.0*U; - output(2,2) = 3.0/2.0*(U-2.*T); - for (unsigned int i=0; i<3; i++) { - output(i,i) += 13.0/3.0*(T-I*pi); - } - return output; - } - - inline boost::numeric::ublas::matrix Gamma3gSU(Complex U, Complex T) { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(3,3); - static const Complex I(0,1.0); - using Constants::pi; - output(0,2) = -T; - output(1,1) = 3./2.*(T-2.*U); - output(1,2) = -3./2.*T; - output(2,0) = -2.0*T; - output(2,1) =-5./6.*T; - output(2,2) = 3./2.*(T-2.*U); - for (unsigned int i=0; i<3; i++) { - output(i,i) += 13./3.*(U-I*pi); - } - return output; - } - - inline boost::numeric::ublas::matrix Gamma3Singlet() { - boost::numeric::ublas::matrix output = boost::numeric::ublas::zero_matrix(2,2); - static const Complex I(0,1.0); - using Constants::pi; - output(0,0) = output(1,1) = -4.0/3.0*I*pi; - return output; - } - - /** - * Number of fermion generations (only used in gauge boson HighCMatching) - */ - inline double n_g() { return 3.0; } - - /** - * Number of complex scalars in the fundamental rep. of SU(N) - */ - inline double nSWeyl(unsigned int N, bool high) { - if(high) { - if(N==2 || N==1) return 1.0; - else if (N==3) return 0.0; - else assert(false); - } - else { - if( N==1 || N==3 ) return 0.0; - else assert(false); - } - } - - /** - * Number of Weyl Fermions in the fundamental rep. of SU(N) - */ - inline double nFWeyl(unsigned int N, bool high) { - if(high) { - if(N==2 || N==3) return 12.0; - else assert(false); - } - else { - if(N==3) return 10.0; - else if(N==1) return 2.0; - else assert(false); - } - } - - inline double TFWeyl(unsigned int) { - return 0.5; - } - - inline double tSWeyl(unsigned int) { - return 0.5; - } - - inline Complex WFunction(Energy mu, Energy2 s) { - using Constants::pi; - assert(abs(s)>ZERO); - Complex ln = MinusLog(-s/(mu*mu)); - return (-1.0*ln*ln + 3.0*ln+pi*pi/6.0-8.0); - } - - /** - * \fX_N\f% function, v is either t or u - */ - inline Complex XNFunction(unsigned int N, Energy mu, Energy2 s, Energy2 v) { - using Constants::pi; - assert(abs(s)>ZERO); - Complex ls = MinusLog(-s/(mu*mu)); - return (2.0*C_F(N)*WFunction(mu,s) + - C_A(N)*(2.0*ls*ls - 2.0*MinusLog((s+v)/(mu*mu))*ls - - 11.0/3.0*ls + pi*pi + 85.0/9.0) + - (2.0/3.0*ls - 10.0/9.0) * TFWeyl(N) * nFWeyl(N,true) + - (1.0/3.0*ls - 8.0/9.0) * TFWeyl(N) * nSWeyl(N,true)); - } - - /** - * \f$\Pi_1\f$ function - */ - inline Complex PI1_function(Energy mu, Energy2 s) { - assert(abs(s)>ZERO); - return ((41.0/6.0)*MinusLog(-s/(mu*mu))-104.0/9.0); - } - - /** - * \f$\tilde{f}\f$ function, v is either t or u - */ - inline Complex fTildeFunction(Energy mu, Energy2 s, Energy2 v) { - using Constants::pi; - assert(abs(s)>ZERO); - Complex ls = MinusLog(-s/GeV2), lv = MinusLog(-v/GeV2); - Complex lsv = MinusLog((s+v)/GeV2); - return (-2.0*double(s/(s+v))*(lv-ls) + - double(s*(s+2.0*v)/((s+v)*(s+v))) * ((lv-ls)*(lv-ls) + pi*pi) + - 4.0*MinusLog(-s/(mu*mu))*(lv-lsv)); - } -} -} - -#endif // HERWIG_GroupInvariants_H diff --git a/MatrixElement/EW/HighEnergyMatching.cc b/MatrixElement/EW/HighEnergyMatching.cc deleted file mode 100644 --- a/MatrixElement/EW/HighEnergyMatching.cc +++ /dev/null @@ -1,1181 +0,0 @@ -// -*- C++ -*- -// -// HighEnergyMatching.cc is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#include "HighEnergyMatching.h" -#include "ElectroWeakReweighter.h" -#include "GroupInvariants.h" -#include -#include - -using namespace Herwig; -using namespace HighEnergyMatching; -using namespace GroupInvariants; -using namespace EWProcess; - -namespace { - -/** - * \f$M_N\f$, this matrix is used for identical particle scattering - */ -boost::numeric::ublas::matrix M_N(unsigned int suN) { - double N(suN); - boost::numeric::ublas::matrix M(2,2); - M(0,0) = -1.0/N; - M(0,1) = 2.0; - M(1,0) = 0.5 - 1.0/(2.0*N*N); - M(1,1) = 1.0/N; - return M; -} - -// #ifdef ThePEG_HAS_UNITS_CHECKING -void axpy_prod_local(const boost::numeric::ublas::matrix & A, - const boost::numeric::ublas::matrix > & B, - boost::numeric::ublas::matrix > & C) { - assert(A.size2()==B.size1()); - C.resize(A.size1(),B.size2()); - for(unsigned int ix=0;ix > & A, - const boost::numeric::ublas::matrix & B, - boost::numeric::ublas::matrix > & C) { - assert(A.size2()==B.size1()); - C.resize(A.size1(),B.size2()); - for(unsigned int ix=0;ix & A, -// const boost::numeric::ublas::matrix & B, -// boost::numeric::ublas::matrix & C) { -// assert(A.size2()==B.size1()); -// C.resize(A.size1(),B.size2()); -// axpy_prod(A,B,C); -// } -// #endif - -} - -boost::numeric::ublas::matrix > -HighEnergyMatching::highEnergyMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2) { - switch (process) { - case QQQQ: case QQQQiden: - case QtQtQQ: case QQUU: - case QtQtUU: case QQtRtR: - case QQDD: case QtQtDD: - case QQLL: case QQEE: - case UUUU: case UUUUiden: - case tRtRUU: case UUDD: - case tRtRDD: case UULL: - case UUEE: case DDDD: - case DDDDiden: case DDLL: - case DDEE: case LLLL: - case LLLLiden: case LLEE: - case EEEE: case EEEEiden: - return SpinHalfMatching(highScale,s,t,u,process,oneLoop,includeAlphaS2); - break; - case QQWW: - case QQWG: - case QQBG: - case QQGG: - case QtQtGG: - case LLWW: - case UUBB: - case UUBG: - case UUGG: - case tRtRGG: - case DDBB: - case DDBG: - case DDGG: - case EEBB: - return Spin1HighMatching(highScale,s,t,u,process,oneLoop,includeAlphaS2); - break; - case QQPhiPhi: - case LLPhiPhi: - case UUPhiPhi: - case DDPhiPhi: - case EEPhiPhi: - return Spin0HighMatching(highScale,s,t,u,process,oneLoop,includeAlphaS2); - break; - default: - assert(false); - break; - } -} - -boost::numeric::ublas::matrix > -HighEnergyMatching::SpinHalfMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2) { - using Constants::pi; - boost::numeric::ublas::matrix > highC; - Energy Q = highScale; - double a1 = ElectroWeakReweighter::coupling()->a1(Q); - double a2 = ElectroWeakReweighter::coupling()->a2(Q); - double a3 = ElectroWeakReweighter::coupling()->a3(Q); - double y_t = ElectroWeakReweighter::coupling()->y_t(Q); - unsigned int order = !oneLoop ? 0 : 1; - double Yi(0.),Yf(0.); - - Complex Ls = MinusLog(-s/(Q*Q)); - - double C_A_2 = C_A(2); - double C_A_3 = C_A(3); - double C_F_2 = C_F(2); - double C_F_3 = C_F(3); - double C_d_2 = C_d(2); - double C_d_3 = C_d(3); - double C_1_2 = C_1(2); - double C_1_3 = C_1(3); - Complex W = WFunction(Q,s); - Complex X_2_st = XNFunction(2,Q,s,t); - //Complex X_2_su = XNFunction(2,Q,s,u); - Complex X_3_st = XNFunction(3,Q,s,t); - Complex X_3_su = XNFunction(3,Q,s,u); - Complex PI1 = PI1_function(Q,s); - Complex fTilde_st = fTildeFunction(Q,s,t); - Complex fTilde_su = fTildeFunction(Q,s,u); - - switch (process) { - - case QQQQ: - // NOTE this 4x1 column vector highC is given by (C_11,C_21,C_12,C_22), - // where C_12 is the coeff. for the term that transforms under SU(2) but not SU(3) - Yi = Yf = 1./6.; - highC.resize(4,1); - highC(0,0) = ZERO; - highC(2,0) = 4.0*pi*a2 / s; - highC(1,0) = 4.0*pi*a3 / s; - highC(3,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-2.0*a2*a3*fTilde_st); - highC(2,0) += (1.0/s)*(a2*a2*(X_2_st-(C_d_2+C_A_2)/4.0*fTilde_st) + - 2.0*(a1*a2*Yi*Yf+a2*a3*C_F_3)*W - - 2.0*a1*a2*Yi*Yf*fTilde_st); - highC(1,0) += (1.0/s)*(2.0*(a1*a3*Yi*Yf+a2*a3*C_F_2)*W - - 2.0*a1*a3*Yi*Yf*fTilde_st); - highC(3,0) += (1.0/s)*(-1.0*(a2*a2*C_1_2+a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - 2.0*(a1*a3*Yi*Yf*C_F_3+a1*a2*Yi*Yf*C_F_2+a1*a1*Yi*Yi*Yf*Yf)*W); - if (includeAlphaS2) { - highC(1,0) += (1.0/s)*(a3*a3*(X_3_st-(C_d_3+C_A_3)/4.0*fTilde_st)); - - highC(3,0) += (1.0/s)*(-1.0*(a3*a3*C_1_3)*fTilde_st); - } - } - break; - - case QQQQiden: - { - Process parentCase = QQQQ; - boost::numeric::ublas::matrix > - highCs_st = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCs_ts = highEnergyMatching(Q,t,s,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > highCt_st(4,1); - boost::numeric::ublas::matrix > highCs_ts_2x2(2,2); - highCs_ts_2x2(0,0) = highCs_ts(0,0); - highCs_ts_2x2(1,0) = highCs_ts(1,0); - highCs_ts_2x2(0,1) = highCs_ts(2,0); - highCs_ts_2x2(1,1) = highCs_ts(3,0); - boost::numeric::ublas::matrix temp(2,2); - temp = boost::numeric::ublas::trans(M_N(3)); - boost::numeric::ublas::matrix > highCt_st_2x2(2,2),temp2(2,2); - axpy_prod_local(highCs_ts_2x2,temp,temp2); - axpy_prod_local(M_N(2),temp2,highCt_st_2x2); - highCt_st(0,0) = highCt_st_2x2(0,0); - highCt_st(1,0) = highCt_st_2x2(1,0); - highCt_st(2,0) = highCt_st_2x2(0,1); - highCt_st(3,0) = highCt_st_2x2(1,1); - highC = highCs_st + highCt_st; - } - break; - case QtQtQQ: - { - highC.resize(4,1); - Process parentCase = QQQQ; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = 1.0/6.0; // Hypercharge of the non-3rd-gen doublet (still a quark doublet). - if (order >= 1) { - highC(2,0) += y_t*y_t*a2/(4.0*pi*s)*(3.0/2.0-0.5*Ls); - highC(1,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0/2.0-0.5*Ls); - highC(3,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(-5.0/12.0-1.0/12.0*Ls); - } - } - break; - case QQUU: - Yi = 1./6.; Yf = 2./3.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a3 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*((a1*a3*(Yi*Yi+Yf*Yf)+a2*a3*C_F_2)*W + - 2.0*a1*a3*Yi*Yf*fTilde_su); - highC(1,0) += (1.0/s)*(a1*a1*Yi*Yf*PI1 + - (a1*a2*Yi*Yf*C_F_2+2.0*a1*a3*Yi*Yf*C_F_3+ - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - if (includeAlphaS2) { - highC(0,0) += (1.0/s)*(a3*a3*(X_3_su+(C_d_3-C_A_3)/4.0*fTilde_su)); - highC(1,0) += (1.0/s)*((a3*a3*C_1_3+a1*a1*Yi*Yi*Yf*Yf)*fTilde_su); - } - } - break; - case QtQtUU: - { - highC.resize(2,1); - Process parentCase = QQUU; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = 2./3.; - if (order >= 1) { - highC(0,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0/2.0-0.5*Ls); - highC(1,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(-5.0/12.0-1.0/12.0*Ls); - } - } - break; - case QQtRtR: - { - highC.resize(2,1); - Process parentCase = QQUU; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = 1.0/6.0; - if (order >= 1) { - highC(0,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0-Ls); - highC(1,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(5.0/3.0-2.0/3.0*Ls); - } - } - break; - case QQDD: - Yi = 1./6.; Yf = -1./3.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a3 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*((a1*a3*(Yi*Yi+Yf*Yf)+a2*a3*C_F_2)*W + - 2.0*a1*a3*Yi*Yf*fTilde_su); - highC(1,0) += (1.0/s)*(a1*a1*Yi*Yf*PI1 + - (a1*a2*Yi*Yf*C_F_2+2.0*a1*a3*Yi*Yf*C_F_3+ - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - if (includeAlphaS2) { - highC(0,0) += (1.0/s)*(a3*a3*(X_3_su+(C_d_3-C_A_3)/4.0*fTilde_su)); - highC(1,0) += (1.0/s)*((a3*a3*C_1_3+a1*a1*Yi*Yi*Yf*Yf)*fTilde_su); - } - } - break; - case QtQtDD: - { - highC.resize(2,1); - Process parentCase = QQDD; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = -1./3.; - if (order >= 1) { - highC(0,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0/2.0-0.5*Ls); - highC(1,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(-5.0/12.0-1.0/12.0*Ls); - } - } - break; - case QQLL: - Yi = 1./6.; Yf = -1./2.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a2 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a2*a2*(X_2_st-(C_d_2+C_A_2)/4.0*fTilde_st) + - (a2*a3*C_F_3 + a1*a2*(Yi*Yi+Yf*Yf))*W - - 2.0*a1*a2*Yi*Yf*fTilde_st); - highC(1,0) += (1.0/s)*(-1.0*(a2*a2*C_1_2+a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3+2.0*a1*a2*Yi*Yf*C_F_2+ - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case QQEE: - Yi = 1./6.; Yf = -1.; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a1*a1*Yi*Yi*Yf*Yf*fTilde_su + a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3 + a1*a2*Yi*Yf*C_F_2 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case UUUU: - Yi = Yf = 2./3.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a3 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-2.0*a1*a3*Yi*Yf*fTilde_st + - a1*a3*(Yi*Yi+Yf*Yf)*W); - highC(1,0) += (1.0/s)*(-1.0*(a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - (2.0*a1*a3*Yi*Yf*C_F_3+a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - if (includeAlphaS2) { - highC(0,0) += (1.0/s)*(a3*a3*(X_3_st-(C_d_3+C_A_3)/4.0*fTilde_st)); - highC(1,0) += (1.0/s)*(-1.0*(a3*a3*C_1_3)*fTilde_st); - } - } - break; - case UUUUiden: - { - Process parentCase = UUUU; - boost::numeric::ublas::matrix > - highCs_st = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCs_ts = highEnergyMatching(Q,t,s,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > highCt_st; - axpy_prod_local(M_N(3),highCs_ts,highCt_st); - highC = highCs_st + highCt_st; - } - break; - case tRtRUU: - { - highC.resize(2,1); - Process parentCase = UUUU; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = 2./3.; - if (order >= 1) { - highC(0,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0-Ls); - highC(1,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(5.0/3.0-2.0/3.0*Ls); - } - } - break; - case UUDD: - Yi = 2./3.; Yf = -1./3.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a3 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-2.0*a1*a3*Yi*Yf*fTilde_st + - a1*a3*(Yi*Yi+Yf*Yf)*W); - highC(1,0) += (1.0/s)*(-1.0*(a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - (2.0*a1*a3*Yi*Yf*C_F_3+a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - if (includeAlphaS2) { - highC(0,0) += (1.0/s)*(a3*a3*(X_3_st-(C_d_3+C_A_3)/4.0*fTilde_st)); - highC(1,0) += (1.0/s)*(-1.0*(a3*a3*C_1_3)*fTilde_st); - } - } - break; - case tRtRDD: - { - highC.resize(2,1); - Process parentCase = UUDD; - highC = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - double Y = -1./3.; - if (order >= 1) { - highC(0,0) += y_t*y_t*a3/(4.0*pi*s)*(1.0-Ls); - highC(1,0) += y_t*y_t*a1*Y/(4.0*pi*s)*(5.0/3.0-2.0/3.0*Ls); - } - } - break; - case UULL: - Yi = 2./3.; Yf = -0.5; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a1*a1*Yi*Yi*Yf*Yf*fTilde_su + a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3 + a1*a2*Yi*Yf*C_F_2 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case UUEE: - Yi = 2./3.; Yf = -1.; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-1.0*a1*a1*Yi*Yi*Yf*Yf*fTilde_st + a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case DDDD: - Yi = Yf = -1./3.; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a3 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-2.0*a1*a3*Yi*Yf*fTilde_st + - a1*a3*(Yi*Yi+Yf*Yf)*W); - highC(1,0) += (1.0/s)*(-1.0*(a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - (2.0*a1*a3*Yi*Yf*C_F_3+a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - if (includeAlphaS2) { - highC(0,0) += (1.0/s)*(a3*a3*(X_3_st-(C_d_3+C_A_3)/4.0*fTilde_st)); - highC(1,0) += (1.0/s)*(-1.0*(a3*a3*C_1_3)*fTilde_st); - } - } - break; - case DDDDiden: - { - Process parentCase = DDDD; - boost::numeric::ublas::matrix > - highCs_st = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCs_ts = highEnergyMatching(Q,t,s,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > highCt_st; - axpy_prod_local(M_N(3),highCs_ts,highCt_st); - highC = highCs_st + highCt_st; - } - break; - case DDLL: - Yi = -1./3.; Yf = -0.5; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a1*a1*Yi*Yi*Yf*Yf*fTilde_su + a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3 + a1*a2*Yi*Yf*C_F_2 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case DDEE: - Yi = -1./3.; Yf = -1.; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-1.0*a1*a1*Yi*Yi*Yf*Yf*fTilde_st + a1*a1*Yi*Yf*PI1 + - (a1*a3*Yi*Yf*C_F_3 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case LLLL: - Yi = Yf = -0.5; - highC.resize(2,1); - highC(0,0) = 4.0*pi*a2 / s; - highC(1,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a2*a2*(X_2_st-(C_d_2+C_A_2)/4.0*fTilde_st) + - 2.0*a1*a2*Yi*Yf*W - - 2.0*a1*a2*Yi*Yf*fTilde_st); - highC(1,0) += (1.0/s)*(-1.0*(a2*a2*C_1_2+a1*a1*Yi*Yi*Yf*Yf)*fTilde_st + - a1*a1*Yi*Yf*PI1 + - 2.0*(a1*a2*Yi*Yf*C_F_2+a1*a1*Yi*Yi*Yf*Yf)*W); - } - break; - case LLLLiden: - { - Process parentCase = LLLL; - boost::numeric::ublas::matrix > - highCs_st = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCs_ts = highEnergyMatching(Q,t,s,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > highCt_st; - axpy_prod_local(M_N(2), highCs_ts, highCt_st); - highC = highCs_st + highCt_st; - } - break; - case LLEE: - Yi = -0.5; Yf = -1.; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(a1*a1*Yi*Yi*Yf*Yf*fTilde_su + a1*a1*Yi*Yf*PI1 + - (a1*a2*Yi*Yf*C_F_2 + - a1*a1*(Yi*Yi*Yi*Yf+Yf*Yf*Yf*Yi))*W); - } - break; - case EEEE: - Yi = Yf = -1.; - highC.resize(1,1); - highC(0,0) = 4.0*pi*a1*Yi*Yf / s; - if (order >= 1) { - highC(0,0) += (1.0/s)*(-1.0*a1*a1*Yi*Yi*Yf*Yf*fTilde_st + a1*a1*Yi*Yf*PI1 + - 2.0*a1*a1*Yi*Yi*Yf*Yf*W); - } - break; - case EEEEiden: - { - Process parentCase = EEEE; - boost::numeric::ublas::matrix > - highCs_st = highEnergyMatching(Q,s,t,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCs_ts = highEnergyMatching(Q,t,s,u,parentCase,oneLoop,includeAlphaS2); - boost::numeric::ublas::matrix > - highCt_st = highCs_ts; - highC = highCs_st + highCt_st; - } - break; - default: - assert(false); - } - return highC; -} - -boost::numeric::ublas::matrix > -HighEnergyMatching::Spin1HighMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2) { - using Constants::pi; - - unsigned int order = !oneLoop ? 0 : 1; - // (If crossed graphs, swap s and t here) - Complex L_s = MinusLog(-s/(highScale*highScale)); - Complex L_t = MinusLog(-t/(highScale*highScale)); - Complex L_u = MinusLog(-u/(highScale*highScale)); - Complex L_s2 = L_s*L_s; - Complex L_t2 = L_t*L_t; - Complex L_u2 = L_u*L_u; - - // Tree-Level: - // Topology types defined. Note each of these is a vector of 5 entries. They are the coefficients - // for the dirac structures M_0, M_1, M_4, M_5, and M_6 for vector boson production. - boost::numeric::ublas::vector > R1(5); - for(unsigned int ix=0;ix<5;++ix) R1[ix] = ZERO; - R1[0] = -1.0/t; - R1[1] = -2.0/t; - R1[2] = ZERO; - R1[3] = ZERO; - R1[4] = ZERO; - boost::numeric::ublas::vector > R1_bar(5); - for(unsigned int ix=0;ix<5;++ix) R1_bar[ix] = ZERO; - R1_bar[0] = -1.0/u; - boost::numeric::ublas::vector > R2(5); - for(unsigned int ix=0;ix<5;++ix) R2[ix] = ZERO; - R2[1] = -1.0/s*2.0; - // Topologies T1: - boost::numeric::ublas::vector > T1a(5); - for(unsigned int ix=0;ix<5;++ix) T1a[ix] = ZERO; - T1a[0] = 1.0/(t*u)*(-3.0*t*L_s2-(s+4.0*t)*L_t2+2.0*(s+4.0*t)*L_s*L_t+2.0*u*L_t- - pi*pi*(7.0/6.0*s+25.0/6.0*t)-4.0*u); - T1a[1] = 1.0/(u*u*t*s)*(0.5*t*(9.0*s*s+14.0*s*t+7.0*t*t)*L_s2+s*(2.0*s+t)*(s+2.0*t)*L_t2- - 2.0*(2.0*s*s*s+9.0*s*s*t+10.0*s*t*t+4.0*t*t*t)*L_s*L_t- - 2.0*t*t*u*L_s-2.0*u*s*(2.0*s+3.0*t)*L_t+ - pi*pi*(7.0/3.0*s*s*s+125.0/12.0*s*s*t+71.0/6.0*s*t*t+ - 19.0/4.0*t*t*t)- - 8.0*s*s*s-20.0*s*s*t-16.0*s*t*t-4.0*t*t*t); - T1a[2] = 1.0/(t*u*u)*(-t*(3.0*s+4.0*t)*L_s2-(s*s+5.0*s*t+5.0*t*t)*L_t2+ - 2.0*t*(3.0*s+4.0*t)*L_s*L_t+2.0*u*t*(2.0*s+t)*L_s/s- - 2.0*u*t*L_t+pi*pi*(s*s/6.0-8.0/3.0*s*t-23.0/6.0*t*t)+ - 4.0*t*t*t/s+4.0*s*t+8.0*t*t); - T1a[3] = T1a[2]; - T1a[4] = GeV2/(t*u*u*u)*(-4.0*t*(s+2.0*t)*(L_s-L_t)*(L_s-L_t)+ - 4.0*u*(3.0*s+5.0*t)*(L_s-L_t)-4.0*pi*pi*t*(s+2.0*t)-4.0*u*u); - boost::numeric::ublas::vector > T1b(5); - for(unsigned int ix=0;ix<5;++ix) T1b[ix] = ZERO; - T1b[0] = 1.0/(t*u*s*s)*(-s*t*(2.0*s+3.0*t)*L_u2+s*u*(s+3.0*t)*L_t2+ - 2.0*s*(s*s+3.0*s*t+3.0*t*t)*L_u*L_t+s*s*t*L_u+s*s*u*L_t- - pi*pi*(7.0/6.0*s*s*s+3.0*s*s*t+3.0*s*t*t)+2.0*s*s*s); - T1b[1] = 1.0/(t*s*s*u)*(3.0*s*t*u*L_u2+s*u*(2.0*s+3.0*t)*L_t2- - 2.0*s*u*(2.0*s+3.0*t)*L_u*L_t+2.0*s*s*u*L_t- - pi*pi*(7.0/3.0*s*s*s+16.0/3.0*s*s*t+3.0*s*t*t)+ - 4.0*s*s*s+4.0*s*s*t); - T1b[2] = 1.0/(t*u*s*s)*(-3.0*s*t*u*(L_u-L_t)*(L_u-L_t)+4.0*s*s*t*L_u+4.0*s*s*u*L_t+ - pi*pi*(3.0*s*s*t+3.0*s*t*t)+8.0*s*s*s); - T1b[3] = 1.0/(t*u*s*s)*(s*t*(2.0*s+3.0*t)*L_u2-s*u*(s+3.0*t)*L_t2+6.0*s*t*u*L_u*L_t+ - pi*pi*(-1.0/6.0*s*s*s+3.0*s*s*t+3.0*s*t*t)); - T1b[4] = 12.0*GeV2/(t*u)*(L_t-L_u); - boost::numeric::ublas::vector > T1c(5); - for(unsigned int ix=0;ix<5;++ix) T1c[ix] = ZERO; - T1c[0] = 1.0/t*(2.0*L_s*L_t-7.0*pi*pi/6.0-L_t2); - T1c[1] = 1.0/(t*u*u)*(s*t*L_s2-(2.0*s*s+3.0*s*t+2.0*t*t)*L_t2+ - 2.0*(2.0*s*s+3.0*s*t+2.0*t*t)*L_s*L_t+2.0*t*u*(L_s-L_t)- - pi*pi*(7.0/3.0*s*s+11.0/3.0*s*t+7.0/3.0*t*t)); - T1c[2] = 1.0/(t*u*u)*(t*(3.0*s+2.0*t)*(L_s-L_t)*(L_s-L_t)+2.0*u*t*L_s+ - 2.0*u*(2.0*s+t)*L_t+pi*pi*t*(3.0*s+2.0*t)+8.0*u*u); - T1c[3] = T1c[2]; - T1c[4] = GeV2/(t*u*u*u)*(4.0*t*(2.0*s+t)*(L_s-L_t)*(L_s-L_t)-4.0*u*(3.0*s+t)*(L_s-L_t)+ - 4.0*pi*pi*t*(2.0*s+t)-4.0*u*u); - boost::numeric::ublas::vector > T1d(5); - for(unsigned int ix=0;ix<5;++ix) T1d[ix] = ZERO; - T1d[2] = 1.0/s*(-2.0*L_s+4.0); - T1d[3] = T1d[2]; - boost::numeric::ublas::vector > T1a_bar(5); - for(unsigned int ix=0;ix<5;++ix) T1a_bar[ix] = ZERO; - T1a_bar[0] = 1.0/(u*t)*(-3.0*u*L_s2-(s+4.0*u)*L_u2+2.0*(s+4.0*u)*L_s*L_u+2.0*t*L_u- - pi*pi*(7.0/6.0*s+25.0/6.0*u)-4.0*t); - T1a_bar[1] = 2.0*T1a_bar[0] - - 1.0/(t*t*u*s)*(0.5*u*(9.0*s*s+14.0*s*u+7.0*u*u)*L_s2+s*(2.0*s+u)*(s+2.0*u)*L_u2- - 2.0*(2.0*s*s*s+9.0*s*s*u+10.0*s*u*u+4.0*u*u*u)*L_s*L_u- - 2.0*u*u*t*L_s-2.0*t*s*(2.0*s+3.0*u)*L_u+ - pi*pi*(7.0/3.0*s*s*s+125.0/12.0*s*s*u+71.0/6.0*s*u*u+ - 19.0/4.0*u*u*u)- - 8.0*s*s*s-20.0*s*s*u-16.0*s*u*u-4.0*u*u*u); - T1a_bar[2] = 1.0/(u*t*t)*(-u*(3.0*s+4.0*u)*L_s2-(s*s+5.0*s*u+5.0*u*u)*L_u2+ - 2.0*u*(3.0*s+4.0*u)*L_s*L_u+2.0*t*u*(2.0*s+u)*L_s/s- - 2.0*t*u*L_u+pi*pi*(s*s/6.0-8.0/3.0*s*u-23.0/6.0*u*u)+ - 4.0*u*u*u/s+4.0*s*u+8.0*u*u); - T1a_bar[3] = T1a_bar[2]; - T1a_bar[4] = -GeV2/(u*t*t*t)*(-4.0*u*(s+2.0*u)*(L_s-L_u)*(L_s-L_u)+ - 4.0*t*(3.0*s+5.0*u)*(L_s-L_u)-4.0*pi*pi*u*(s+2.0*u)-4.0*t*t); - boost::numeric::ublas::vector > T1b_bar(5); - for(unsigned int ix=0;ix<5;++ix) T1b_bar[ix] = ZERO; - T1b_bar[0] = 1.0/(u*t*s*s)*(-s*u*(2.0*s+3.0*u)*L_t2+s*t*(s+3.0*u)*L_u2+ - 2.0*s*(s*s+3.0*s*u+3.0*u*u)*L_t*L_u+ - s*s*u*L_t+s*s*t*L_u- - pi*pi*(7.0/6.0*s*s*s+3.0*s*s*u+3.0*s*u*u)+2.0*s*s*s); - T1b_bar[1] = 2.0*T1b_bar[0] - - 1.0/(u*s*s*t)*(3.0*s*u*t*L_t2+s*t*(2.0*s+3.0*u)*L_u2- - 2.0*s*t*(2.0*s+3.0*u)*L_t*L_u+2.0*s*s*t*L_u- - pi*pi*(7.0/3.0*s*s*s+16.0/3.0*s*s*u+3.0*s*u*u)+ - 4.0*s*s*s+4.0*s*s*u); - T1b_bar[3] = 1.0/(u*t*s*s)*(-3.0*s*u*t*(L_t-L_u)*(L_t-L_u)+4.0*s*s*u*L_t+4.0*s*s*t*L_u+ - pi*pi*(3.0*s*s*u+3.0*s*u*u)+8.0*s*s*s); - T1b_bar[2] = 1.0/(u*t*s*s)*(s*u*(2.0*s+3.0*u)*L_t2-s*t*(s+3.0*u)*L_u2+6.0*s*u*t*L_t*L_u+ - pi*pi*(-1.0/6.0*s*s*s+3.0*s*s*u+3.0*s*u*u)); - T1b_bar[4] = -12.0*GeV2/(u*t)*(L_u-L_t); - boost::numeric::ublas::vector > T1c_bar(5); - for(unsigned int ix=0;ix<5;++ix) T1c_bar[ix] = ZERO; - T1c_bar[0] = 1.0/u*(2.0*L_s*L_u-7.0*pi*pi/6.0-L_u2); - T1c_bar[1] = 2.0*T1c_bar[0] - - 1.0/(u*t*t)*(s*u*L_s2-(2.0*s*s+3.0*s*u+2.0*u*u)*L_u2+ - 2.0*(2.0*s*s+3.0*s*u+2.0*u*u)*L_s*L_u+2.0*u*t*(L_s-L_u)- - pi*pi*(7.0/3.0*s*s+11.0/3.0*s*u+7.0/3.0*u*u)); - T1c_bar[2] = 1.0/(u*t*t)*(u*(3.0*s+2.0*u)*(L_s-L_u)*(L_s-L_u)+2.0*t*u*L_s+ - 2.0*t*(2.0*s+u)*L_u+pi*pi*u*(3.0*s+2.0*u)+8.0*t*t); - T1c_bar[3] = T1c_bar[2]; - T1c_bar[4] = -GeV2/(u*t*t*t)*(4.0*u*(2.0*s+u)*(L_s-L_u)*(L_s-L_u)-4.0*t*(3.0*s+u)*(L_s-L_u)+ - 4.0*pi*pi*u*(2.0*s+u)-4.0*t*t); - // Topologies T2: - boost::numeric::ublas::vector > T2a(5); - for(unsigned int ix=0;ix<5;++ix) T2a[ix] = ZERO; - T2a[1] = 1.0/s*(L_s/6.0-11.0/18.0); - boost::numeric::ublas::vector > T2b(5); - for(unsigned int ix=0;ix<5;++ix) T2b[ix] = ZERO; - T2b[1] = 1.0/s*(-2.0/3.0*L_s+22.0/9.0); - boost::numeric::ublas::vector > T2c(5); - for(unsigned int ix=0;ix<5;++ix) T2c[ix] = ZERO; - T2c[1] = 1.0/s*(3.0/2.0*L_s2-17.0/2.0*L_s-pi*pi/4.0+95.0/6.0); - boost::numeric::ublas::vector > T2d(5); - for(unsigned int ix=0;ix<5;++ix) T2d[ix] = ZERO; - T2d[1] = 1.0/s*(-4.0/3.0*L_s+14.0/9.0); - // Topologies T3: - boost::numeric::ublas::vector > T3a(5); - for(unsigned int ix=0;ix<5;++ix) T3a[ix] = ZERO; - T3a[0] = 1.0/t*(L_t2-pi*pi/6.0); - T3a[1] = 2.0*T3a[0]; - T3a[3] = 1.0/t*(-L_t2+pi*pi/6.0+2.0); - boost::numeric::ublas::vector > T3b(5); - for(unsigned int ix=0;ix<5;++ix) T3b[ix] = ZERO; - T3b[0] = 1.0/t*(-L_t+4.0); - T3b[1] = 2.0*T3b[0]; - T3b[3] = 1.0/t*(4.0*L_t-10.0); - boost::numeric::ublas::vector > T3a_bar(5); - for(unsigned int ix=0;ix<5;++ix) T3a_bar[ix] = ZERO; - T3a_bar[0] = 1.0/u*(L_u2-pi*pi/6.0); - T3a_bar[2] = 1.0/u*(-L_u2+pi*pi/6.0+2.0); - boost::numeric::ublas::vector > T3b_bar(5); - for(unsigned int ix=0;ix<5;++ix) T3b_bar[ix] = ZERO; - T3b_bar[0] = 1.0/u*(-L_u+4.0); - T3b_bar[2] = 1.0/u*(4.0*L_u-10.0); - // Topologies T4: - boost::numeric::ublas::vector > T4a(5); - for(unsigned int ix=0;ix<5;++ix) T4a[ix] = ZERO; - T4a[0] = 1.0/t*(L_t2-pi*pi/6.0); - T4a[1] = 2.0*T4a[0]; - T4a[2] = 1.0/t*(-L_t2+pi*pi/6.0+2.0); - boost::numeric::ublas::vector > T4b(5); - for(unsigned int ix=0;ix<5;++ix) T4b[ix] = ZERO; - T4b[0] = 1.0/t*(-L_t+4.0); - T4b[1] = 2.0*T4b[0]; - T4b[2] = 1.0/t*(4.0*L_t-10.0); - boost::numeric::ublas::vector > T4a_bar(5); - for(unsigned int ix=0;ix<5;++ix) T4a_bar[ix] = ZERO; - T4a_bar[0] = 1.0/u*(L_u2-pi*pi/6.0); - T4a_bar[3] = 1.0/u*(-L_u2+pi*pi/6.0+2.0); - boost::numeric::ublas::vector > T4b_bar(5); - for(unsigned int ix=0;ix<5;++ix) T4b_bar[ix] = ZERO; - T4b_bar[0] = 1.0/u*(-L_u+4.0); - T4b_bar[3] = 1.0/u*(4.0*L_u-10.0); - // Topologies T5: - boost::numeric::ublas::vector > T5a(5); - for(unsigned int ix=0;ix<5;++ix) T5a[ix] = ZERO; - T5a[1] = 1.0/s*(2.0*L_s-4.0); - boost::numeric::ublas::vector > T5b(5); - for(unsigned int ix=0;ix<5;++ix) T5b[ix] = ZERO; - T5b[1] = 1.0/s*(-2.0*L_s2+6.0*L_s-16.0+pi*pi/3.0); - // Topologies T6: - boost::numeric::ublas::vector > T6a(5); - for(unsigned int ix=0;ix<5;++ix) T6a[ix] = ZERO; - T6a[1] = 1.0/s*(-19.0/6.0*L_s+58.0/9.0); - boost::numeric::ublas::vector > T6b(5); - for(unsigned int ix=0;ix<5;++ix) T6b[ix] = ZERO; - T6b[1] = 1.0/s*(-1.0/6.0*L_s+4.0/9.0); - boost::numeric::ublas::vector > T6c(5); - for(unsigned int ix=0;ix<5;++ix) T6c[ix] = ZERO; - T6c[1] = 1.0/s*(2.0/3.0*L_s-16.0/9.0); - boost::numeric::ublas::vector > T6d(5); - for(unsigned int ix=0;ix<5;++ix) T6d[ix] = ZERO; - T6d[1] = 1.0/s*(4.0/3.0*L_s-20.0/9.0); - // Topology T7: - boost::numeric::ublas::vector > T7(5); - for(unsigned int ix=0;ix<5;++ix) T7[ix] = ZERO; - T7[0] = 1.0/t*(-L_t+1.0); - T7[1] = 2.0*T7[0]; - boost::numeric::ublas::vector > T7_bar(5); - for(unsigned int ix=0;ix<5;++ix) T7_bar[ix] = ZERO; - T7_bar[0] = 1.0/u*(-L_u+1.0); - // Group Theory Factors / SM parameters needed for matrix elements: - double a1 = ElectroWeakReweighter::coupling()->a1(highScale); - double a2 = ElectroWeakReweighter::coupling()->a2(highScale); - double a3 = ElectroWeakReweighter::coupling()->a3(highScale); - double y_t = ElectroWeakReweighter::coupling()->y_t(highScale); - // Traces over complex scalars and weyl fermions. - double T_CS_3 = 0.0; - double T_CS_2 = 0.5; - //double T_CS_1 = 0.5; - double T_WF_3 = 2.0*3.0; - double T_WF_2 = 2.0*3.0; - //double T_WF_1 = 10.0/3.0*3.0; - double C_A_3 = 3.0; - double C_A_2 = 2.0; - double C_A_1 = 0.0; - double C_F_3 = 4.0/3.0; - double C_F_2 = 3.0/4.0; - double C_F_1 = 1.0; - // This is the coefficient of the delta term in G_TT - double G_TT = 0.5; - // This is the coeffidient of d^ABC in G_TT (non-zero for SU(3)) - double G_TT_3_D = 0.25*C_A_3; - double G_f = 1.0; - // Factors TBD after fermion helicity is specified: - double Y_Q(0.), G_Plus_U1(0.); - double G_Plus_SU2 = 0.25; - double G_Plus_SU3 = 1./6.; - double G_Plus_SU3_D = 0.5; - double Lambda_Q(0.); - // the _s and _ew are the alpha3 and alpha1/2 parts of Lambda_Q - double Lambda_Q_s(0.); - double Lambda_Q_ew(0.); - double rho12(0.), rho13(0.); - double rho23 = sqrt(a2*a3); - double tRorQ = 1.0; - boost::numeric::ublas::matrix > highC(1,1); - switch (process) { - case QQWW: case LLWW: - { - // Finish Group Theory Factors: - if (process==QQWW) { - Y_Q = 1.0/6.0; - G_Plus_U1 = Y_Q*Y_Q; - Lambda_Q = C_F_3*a3 + C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - rho12 = Y_Q*sqrt(a1*a2); - } - else if (process==LLWW) { - Y_Q = -1.0/2.0; - G_Plus_U1 = Y_Q*Y_Q; - Lambda_Q = C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - rho12 = Y_Q*sqrt(a1*a2); - } - highC.resize(5,5); - for (int i=0; i<5; i++) { - highC(0,i) = G_Plus_SU2*(4.0*pi*a2)*(R1[i]+R1_bar[i]); - highC(1,i) = G_f*4.0*pi*a2*(-0.5*R1[i]+0.5*R1_bar[i]-R2[i]); - highC(2,i) = rho12*4.0*pi*(R1[i]+R1_bar[i]); - highC(3,i) = rho12*4.0*pi*(R1[i]+R1_bar[i]); - highC(4,i) = G_Plus_U1*(4.0*pi*a1)*(R1[i]+R1_bar[i]); - if (order>=1) { - highC(0,i) += G_Plus_SU2*((-0.5*a2*a2*C_A_2)*(T1b[i]+T1b_bar[i])+ - a2*(Lambda_Q-a2*C_A_2)*(T1c[i]+T1c_bar[i])+ - 0.5*a2*a2*C_A_2*(T3a[i]+T3a_bar[i])+ - a2*(Lambda_Q-0.5*a2*C_A_2)*(T3b[i]+T3b_bar[i])+ - 0.5*a2*a2*C_A_2*(T4a[i]+T4a_bar[i])+ - a2*(Lambda_Q-0.5*a2*C_A_2)*(T4b[i]+T4b_bar[i])+ - a2*Lambda_Q*(T7[i]+T7_bar[i])) + - G_TT*(-a2*a2*(T1a[i]+T1a_bar[i])+a2*a2*(T1b[i]+T1b_bar[i])+ - a2*a2*(T1c[i]+T1c_bar[i])+2.0*a2*a2*T1d[i]); - highC(1,i) += G_f*(0.25*a2*a2*C_A_2*(T1a[i]-T1a_bar[i])+ - a2*(0.25*a2*C_A_2-0.5*Lambda_Q)*(T1c[i]-T1c_bar[i])+ - 0.5*a2*a2*C_A_2*T2a[i]+a2*a2*T_CS_2*T2b[i]- - 0.5*a2*a2*C_A_2*T2c[i]+a2*a2*T_WF_2*T2d[i]- - 0.25*a2*a2*C_A_2*(T3a[i]-T3a_bar[i])- - 0.5*a2*(Lambda_Q-0.5*a2*C_A_2)*(T3b[i]-T3b_bar[i])- - 0.25*a2*a2*C_A_2*(T4a[i]-T4a_bar[i])- - 0.5*a2*(Lambda_Q-0.5*a2*C_A_2)*(T4b[i]-T4b_bar[i])+ - 0.5*a2*a2*C_A_2*T5a[i]+a2*(Lambda_Q-0.5*a2*C_A_2)*T5b[i]+ - a2*a2*C_A_2*T6a[i]+a2*a2*C_A_2*T6b[i]+ - a2*a2*T_CS_2*T6c[i]+a2*a2*T_WF_2*T6d[i]- - 0.5*a2*Lambda_Q*(T7[i]-T7_bar[i])); - highC(2,i) += rho12*(-0.5*a1*C_A_1*T1b[i]-0.5*a2*C_A_2*T1b_bar[i]+ - (Lambda_Q-0.5*a1*C_A_1-0.5*a2*C_A_2)*(T1c[i]+T1c_bar[i])+ - 0.5*a1*C_A_1*T3a[i]+0.5*a2*C_A_2*T3a_bar[i]+ - (Lambda_Q-0.5*a1*C_A_1)*T3b[i]+(Lambda_Q-0.5*a2*C_A_2)*T3b_bar[i]+ - 0.5*a2*C_A_2*T4a[i]+0.5*a1*C_A_1*T4a_bar[i]+ - (Lambda_Q-0.5*a2*C_A_2)*T4b[i]+(Lambda_Q-0.5*a1*C_A_1)*T4b_bar[i]+ - Lambda_Q*(T7[i]+T7_bar[i])); - highC(3,i) += rho12*(-0.5*a2*C_A_2*T1b[i]-0.5*a1*C_A_1*T1b_bar[i]+ - (Lambda_Q-0.5*a2*C_A_2-0.5*a1*C_A_1)*(T1c[i]+T1c_bar[i])+ - 0.5*a2*C_A_2*T3a[i]+0.5*a1*C_A_1*T3a_bar[i]+ - (Lambda_Q-0.5*a2*C_A_2)*T3b[i]+(Lambda_Q-0.5*a1*C_A_1)*T3b_bar[i]+ - 0.5*a1*C_A_1*T4a[i]+0.5*a2*C_A_2*T4a_bar[i]+ - (Lambda_Q-0.5*a1*C_A_1)*T4b[i]+(Lambda_Q-0.5*a2*C_A_2)*T4b_bar[i]+ - Lambda_Q*(T7[i]+T7_bar[i])); - highC(4,i) += G_Plus_U1*((-0.5*a1*a1*C_A_1)*(T1b[i]+T1b_bar[i])+ - a1*(Lambda_Q-a1*C_A_1)*(T1c[i]+T1c_bar[i])+ - 0.5*a1*a1*C_A_1*(T3a[i]+T3a_bar[i])+ - a1*(Lambda_Q-0.5*a1*C_A_1)*(T3b[i]+T3b_bar[i])+ - 0.5*a1*a1*C_A_1*(T4a[i]+T4a_bar[i])+ - a1*(Lambda_Q-0.5*a1*C_A_1)*(T4b[i]+T4b_bar[i])+ - a1*Lambda_Q*(T7[i]+T7_bar[i])); - } - } - } - break; - case UUBB: case DDBB: case EEBB: - { - // Finish Group Theory Factors: - if (process==UUBB) { - Y_Q = 2.0/3.0; - G_Plus_U1 = Y_Q*Y_Q; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - } - else if (process==DDBB) { - Y_Q = -1.0/3.0; - G_Plus_U1 = Y_Q*Y_Q; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - } - else if (process==EEBB) { - Y_Q = -1.0; - G_Plus_U1 = Y_Q*Y_Q; - Lambda_Q = Y_Q*Y_Q*C_F_1*a1; - } - highC.resize(1,5); - for (int i=0; i<5; i++) { - highC(0,i) = G_Plus_U1*(4.0*pi*a1)*(R1[i]+R1_bar[i]); - if (order>=1) { - highC(0,i) += G_Plus_U1*((-0.5*a1*a1*C_A_1)*(T1b[i]+T1b_bar[i])+ - a1*(Lambda_Q-a1*C_A_1)*(T1c[i]+T1c_bar[i])+ - 0.5*a1*a1*C_A_1*(T3a[i]+T3a_bar[i])+ - a1*(Lambda_Q-0.5*a1*C_A_1)*(T3b[i]+T3b_bar[i])+ - 0.5*a1*a1*C_A_1*(T4a[i]+T4a_bar[i])+ - a1*(Lambda_Q-0.5*a1*C_A_1)*(T4b[i]+T4b_bar[i])+ - a1*Lambda_Q*(T7[i]+T7_bar[i])); - } - } - } - break; - case QQWG: - { - // Finish Group Theory Factors: - Y_Q = 1./6.; - Lambda_Q = C_F_3*a3 + C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - - highC.resize(1,5); - - for (int i=0; i<5; i++) { - highC(0,i) = rho23*4.0*pi*(R1[i]+R1_bar[i]); - - if (order>=1) { - - highC(0,i) += rho23*(-0.5*a3*C_A_3*T1b[i]-0.5*a2*C_A_2*T1b_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3-0.5*a2*C_A_2)*(T1c[i]+T1c_bar[i])+ - 0.5*a3*C_A_3*T3a[i]+0.5*a2*C_A_2*T3a_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3)*T3b[i]+(Lambda_Q-0.5*a2*C_A_2)*T3b_bar[i]+ - 0.5*a2*C_A_2*T4a[i]+0.5*a3*C_A_3*T4a_bar[i]+ - (Lambda_Q-0.5*a2*C_A_2)*T4b[i]+(Lambda_Q-0.5*a3*C_A_3)*T4b_bar[i]+ - Lambda_Q*(T7[i]+T7_bar[i])); - } - } - } - break; - case QQBG: - { - // Finish Group Theory Factors: - Y_Q = 1.0/6.0; - Lambda_Q = C_F_3*a3 + C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - rho13 = Y_Q*sqrt(a1*a3); - - highC.resize(1,5); - - for (int i=0; i<5; i++) { - highC(0,i) = rho13*4.0*pi*(R1[i]+R1_bar[i]); - - if (order>=1) { - - highC(0,i) += rho13*(-0.5*a3*C_A_3*T1b[i]-0.5*a1*C_A_1*T1b_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3-0.5*a1*C_A_1)*(T1c[i]+T1c_bar[i])+ - 0.5*a3*C_A_3*T3a[i]+0.5*a1*C_A_1*T3a_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3)*T3b[i]+(Lambda_Q-0.5*a1*C_A_1)*T3b_bar[i]+ - 0.5*a1*C_A_1*T4a[i]+0.5*a3*C_A_3*T4a_bar[i]+ - (Lambda_Q-0.5*a1*C_A_1)*T4b[i]+(Lambda_Q-0.5*a3*C_A_3)*T4b_bar[i]+ - Lambda_Q*(T7[i]+T7_bar[i])); - } - } - } - break; - case UUBG: case DDBG: - { - // Finish Group Theory Factors: - if (process==UUBG) { - Y_Q = 2.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - rho13 = Y_Q*sqrt(a1*a3); - } - else if (process==DDBG) { - Y_Q = -1.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - rho13 = Y_Q*sqrt(a1*a3); - } - - highC.resize(1,5); - - for (int i=0; i<5; i++) { - highC(0,i) = rho13*4.0*pi*(R1[i]+R1_bar[i]); - - if (order>=1) { - - highC(0,i) += rho13*(-0.5*a3*C_A_3*T1b[i]-0.5*a1*C_A_1*T1b_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3-0.5*a1*C_A_1)*(T1c[i]+T1c_bar[i])+ - 0.5*a3*C_A_3*T3a[i]+0.5*a1*C_A_1*T3a_bar[i]+ - (Lambda_Q-0.5*a3*C_A_3)*T3b[i]+(Lambda_Q-0.5*a1*C_A_1)*T3b_bar[i]+ - 0.5*a1*C_A_1*T4a[i]+0.5*a3*C_A_3*T4a_bar[i]+ - (Lambda_Q-0.5*a1*C_A_1)*T4b[i]+(Lambda_Q-0.5*a3*C_A_3)*T4b_bar[i]+ - Lambda_Q*(T7[i]+T7_bar[i])); - } - } - } - break; - case QQGG: case QtQtGG: case UUGG: - case tRtRGG: case DDGG: - { - // Finish Group Theory Factors: - if (process==QQGG || process==QtQtGG) { - Y_Q = 1.0/6.0; - Lambda_Q = C_F_3*a3 + C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - Lambda_Q_s = C_F_3*a3; - Lambda_Q_ew = C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - } - else if (process==UUGG || process==tRtRGG) { - Y_Q = 2.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - Lambda_Q_s = C_F_3*a3; - Lambda_Q_ew = Y_Q*Y_Q*C_F_1*a1; - } - else if (process==DDGG || process==tRtRGG) { - Y_Q = -1.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - Lambda_Q_s = C_F_3*a3; - Lambda_Q_ew = Y_Q*Y_Q*C_F_1*a1; - } - - highC.resize(3,5); - - for (int i=0; i<5; i++) { - highC(0,i) = G_Plus_SU3*(4.0*pi*a3)*(R1[i]+R1_bar[i]); - highC(1,i) = G_Plus_SU3_D*(4.0*pi*a3)*(R1[i]+R1_bar[i]); - highC(2,i) = G_f*4.0*pi*a3*(-0.5*R1[i]+0.5*R1_bar[i]-R2[i]); - - if (order>=1) { - highC(0,i) += G_Plus_SU3*(a3*(Lambda_Q_ew)*(T1c[i]+T1c_bar[i])+ - a3*(Lambda_Q_ew)*(T3b[i]+T3b_bar[i])+ - a3*(Lambda_Q_ew)*(T4b[i]+T4b_bar[i])+ - a3*Lambda_Q_ew*(T7[i]+T7_bar[i])); - highC(1,i) += G_Plus_SU3_D*(a3*(Lambda_Q_ew)*(T1c[i]+T1c_bar[i])+ - a3*(Lambda_Q_ew)*(T3b[i]+T3b_bar[i])+ - a3*(Lambda_Q_ew)*(T4b[i]+T4b_bar[i])+ - a3*Lambda_Q_ew*(T7[i]+T7_bar[i])); - highC(2,i) += G_f*(a3*(-0.5*Lambda_Q_ew)*(T1c[i]-T1c_bar[i])- - 0.5*a3*(Lambda_Q_ew)*(T3b[i]-T3b_bar[i])- - 0.5*a3*(Lambda_Q_ew)*(T4b[i]-T4b_bar[i])+ - a3*(Lambda_Q_ew)*T5b[i]- - 0.5*a3*Lambda_Q_ew*(T7[i]-T7_bar[i])); - if (includeAlphaS2) { - highC(0,i) += G_Plus_SU3*((-0.5*a3*a3*C_A_3)*(T1b[i]+T1b_bar[i])+ - a3*(Lambda_Q_s-a3*C_A_3)*(T1c[i]+T1c_bar[i])+ - 0.5*a3*a3*C_A_3*(T3a[i]+T3a_bar[i])+ - a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T3b[i]+T3b_bar[i])+ - 0.5*a3*a3*C_A_3*(T4a[i]+T4a_bar[i])+ - a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T4b[i]+T4b_bar[i])+ - a3*Lambda_Q_s*(T7[i]+T7_bar[i])) + - G_TT*(-a3*a3*(T1a[i]+T1a_bar[i])+a3*a3*(T1b[i]+T1b_bar[i])+ - a3*a3*(T1c[i]+T1c_bar[i])+2.0*a3*a3*T1d[i]); - highC(1,i) += G_Plus_SU3_D*((-0.5*a3*a3*C_A_3)*(T1b[i]+T1b_bar[i])+ - a3*(Lambda_Q_s-a3*C_A_3)*(T1c[i]+T1c_bar[i])+ - 0.5*a3*a3*C_A_3*(T3a[i]+T3a_bar[i])+ - a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T3b[i]+T3b_bar[i])+ - 0.5*a3*a3*C_A_3*(T4a[i]+T4a_bar[i])+ - a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T4b[i]+T4b_bar[i])+ - a3*Lambda_Q_s*(T7[i]+T7_bar[i])) + - G_TT_3_D*(-a3*a3*(T1a[i]+T1a_bar[i])+a3*a3*(T1b[i]+T1b_bar[i])+ - a3*a3*(T1c[i]+T1c_bar[i])+2.0*a3*a3*T1d[i]); - highC(2,i) += G_f*(0.25*a3*a3*C_A_3*(T1a[i]-T1a_bar[i])+ - a3*(0.25*a3*C_A_3-0.5*Lambda_Q_s)*(T1c[i]-T1c_bar[i])+ - 0.5*a3*a3*C_A_3*T2a[i]+a3*a3*T_CS_3*T2b[i]- - 0.5*a3*a3*C_A_3*T2c[i]+a3*a3*T_WF_3*T2d[i]- - 0.25*a3*a3*C_A_3*(T3a[i]-T3a_bar[i])- - 0.5*a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T3b[i]-T3b_bar[i])- - 0.25*a3*a3*C_A_3*(T4a[i]-T4a_bar[i])- - 0.5*a3*(Lambda_Q_s-0.5*a3*C_A_3)*(T4b[i]-T4b_bar[i])+ - 0.5*a3*a3*C_A_3*T5a[i]+a3*(Lambda_Q_s-0.5*a3*C_A_3)*T5b[i]+ - a3*a3*C_A_3*T6a[i]+a3*a3*C_A_3*T6b[i]+ - a3*a3*T_CS_3*T6c[i]+a3*a3*T_WF_3*T6d[i]- - 0.5*a3*Lambda_Q_s*(T7[i]-T7_bar[i])); - } - } - } - - if ( (process==QtQtGG||process==tRtRGG) && order>=1) { - - if (process==tRtRGG) { - tRorQ = 2.0; - } - else { - tRorQ = 1.0; - } - highC(0,0) += tRorQ*(-1.0*(s*((s+t)*L_t - t*L_u)*y_t*y_t*a3)/(48.*pi*t*u*s)); - highC(0,1) += tRorQ*((s*L_t*y_t*y_t*a3)/(24.*pi*t*s)); - highC(0,2) += tRorQ*(-(s*s*y_t*y_t*a3)/((24.*pi*s*t+24.*pi*t*t)*s)); - highC(0,3) += tRorQ*(-(s*s*y_t*y_t*a3)/((24.*pi*s*t+24.*pi*t*t)*s)); - highC(1,0) += tRorQ*(-1.0*(s*((s+t)*L_t - t*L_u)*y_t*y_t*a3)/(16.*pi*t*u*s)); - highC(1,1) += tRorQ*((s*L_t*y_t*y_t*a3)/(8.*pi*t*s)); - highC(1,2) += tRorQ*(-(s*s*y_t*y_t*a3)/((8.*pi*s*t+8.*pi*t*t)*s)); - highC(1,3) += tRorQ*(-(s*s*y_t*y_t*a3)/((8.*pi*s*t+8.*pi*t*t)*s)); - highC(2,0) += tRorQ*((s*((s+t)*L_t + t*L_u)*y_t*y_t*a3)/(16.*pi*t*u*s)); - highC(2,1) += tRorQ*(((2.*t-2.*t*L_s-s*L_t)*y_t*y_t*a3)/(8.*pi*t*s)); - highC(2,2) += tRorQ*(-1.0*(s*(s+2.*t)*y_t*y_t*a3)/(8.*pi*t*u*s)); - highC(2,3) += tRorQ*(-1.0*(s*(s+2.*t)*y_t*y_t*a3)/(8.*pi*t*u*s)); - } - } - break; - default: - assert(false); - } - return highC; -} - -boost::numeric::ublas::matrix > -HighEnergyMatching::Spin0HighMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool ) { - using Constants::pi; - unsigned int order = !oneLoop? 0 : 1; - // (If crossed graphs, swap s and t here) - Complex L_s = MinusLog(-s/(highScale*highScale)); - Complex L_t = MinusLog(-t/(highScale*highScale)); - Complex L_u = MinusLog(-u/(highScale*highScale)); - Complex L_s2 = L_s*L_s; - Complex L_t2 = L_t*L_t; - Complex L_u2 = L_u*L_u; - - // Tree-Level: - complex S1 = 2.0/s; - - // Topology T1: - complex T1b = (-L_s2/(2.0*u)*(7.0*t/s+3.0)+2.0/u*L_t2+L_s*L_t*4.0/u*(t-u)/s+ - L_s*2.0/s-4.0/s-pi*pi/(4.0*u)*(11.0+19.0*t/s)); - complex T1b_bar = -1.0*(-L_s2/(2.0*t)*(7.0*u/s+3.0)+2.0/t*L_u2+L_s*L_u*4.0/t*(u-t)/s+ - L_s*2.0/s-4.0/s-pi*pi/(4.0*t)*(11.0+19.0*u/s)); - - // Topologies T2: - complex T2a = 1.0/s*(-2.0*L_s2+8.0*L_s-16.0+pi*pi/3.0); - complex T2b = 1.0/s*(0.5*L_s2+2.0*L_s-4.0-pi*pi/12.0); - - // Topologies T5: - complex T5a = 1.0/s*(-2.0*L_s2+6.0*L_s+pi*pi/3.0-16.0); - complex T5b = 1.0/s*(2.0*L_s-4.0); - - // Topologies T6: - complex T6a = 1.0/s*(-19.0/6.0*L_s+58.0/9.0); - complex T6b = 1.0/s*(-1.0/6.0*L_s+4.0/9.0); - complex T6c = 1.0/s*(2.0/3.0*L_s-16.0/9.0); - complex T6d = 1.0/s*(4.0/3.0*L_s-20.0/9.0); - - // Group Theory Factors / SM parameters needed for matrix elements: - double a1 = ElectroWeakReweighter::coupling()->a1(highScale); - double a2 = ElectroWeakReweighter::coupling()->a2(highScale); - double a3 = ElectroWeakReweighter::coupling()->a3(highScale); - double y_t = ElectroWeakReweighter::coupling()->y_t(highScale); - double Y_phi = 1.0/2.0; - double C_F_3 = 4.0/3.0; - double C_F_2 = 3.0/4.0; - double C_F_1 = 1.0; - double n_g = 3.0; - double n_S = 1.0; - // Factors TBD after fermion helicity is specified: - double Y_Q(0.), Lambda_Q(0.), Lambda_phi(0.); - boost::numeric::ublas::matrix > highC(1,1); - switch (process) { - - case QQPhiPhi: case LLPhiPhi: - // Finish Group Theory Factors: - if (process==QQPhiPhi) { - Y_Q = 1.0/6.0; - Lambda_Q = C_F_3*a3 + C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - Lambda_phi = C_F_2*a2+Y_phi*Y_phi*a1; - } - else if (process==LLPhiPhi) { - Y_Q = -1.0/2.0; - Lambda_Q = C_F_2*a2 + Y_Q*Y_Q*C_F_1*a1; - Lambda_phi = C_F_2*a2+Y_phi*Y_phi*a1; - } - highC.resize(2,1); - highC(0,0) = S1*(4.0*pi*a2); - highC(1,0) = S1*(4.0*pi*a1*Y_Q*Y_phi); - if (order>=1) { - highC(0,0) += T1b*(0.5*a2*a2+2.0*a1*a2*Y_Q*Y_phi) + - T1b_bar*(-0.5*a2*a2+2.0*a1*a2*Y_Q*Y_phi) + - T2a*(-a2*a2+Lambda_phi*a2) + T2b*a2*a2 + - T5a*(-a2*a2+Lambda_Q*a2) + T5b*a2*a2 + - T6a*2.0*a2*a2 + T6b*2.0*a2*a2 + - T6c*0.5*a2*a2*n_S + T6d*2.0*a2*a2*n_g; - highC(1,0) += T1b*(3.0/16.0*a2*a2+a1*a1*Y_Q*Y_Q*Y_phi*Y_phi) + - T1b_bar*(3.0/16.0*a2*a2+a1*a1*Y_Q*Y_Q*Y_phi*Y_phi) + - T2a*(Lambda_phi*a1*Y_Q*Y_phi) + T5a*(Lambda_Q*a1*Y_Q*Y_phi) + - T6c*(2.0*a1*a1*n_S*Y_Q*Y_phi*Y_phi*Y_phi) + - T6d*(10.0/3.0*a1*a1*n_g*Y_Q*Y_phi); - // Top Quark contributions: - highC(0,0) += -3.0*y_t*y_t*a2/(4.0*pi)/s*(2.0*L_s-4.0); - highC(1,0) += -3.0*y_t*y_t*a1/(4.0*pi)*(Y_Q*Y_phi)/s*(2.0*L_s-4.0); - } - break; - case UUPhiPhi: case DDPhiPhi: case EEPhiPhi: - // Finish Group Theory Factors: - if (process==UUPhiPhi) { - Y_Q = 2.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - Lambda_phi = C_F_2*a2 + Y_phi*Y_phi*a1; - } - else if (process==DDPhiPhi) { - Y_Q = -1.0/3.0; - Lambda_Q = C_F_3*a3 + Y_Q*Y_Q*C_F_1*a1; - Lambda_phi = C_F_2*a2 + Y_phi*Y_phi*a1; - } - else if (process==EEPhiPhi) { - Y_Q = -1.0; - Lambda_Q = Y_Q*Y_Q*C_F_1*a1; - Lambda_phi = C_F_2*a2 + Y_phi*Y_phi*a1; - } - - highC.resize(1,1); - highC(0,0) = ZERO; - - highC(0,0) = S1*(4.0*pi*a1*Y_Q*Y_phi); - - if (order>=1) { - highC(0,0) += T1b*(a1*a1*Y_Q*Y_Q*Y_phi*Y_phi) + - T1b_bar*(a1*a1*Y_Q*Y_Q*Y_phi*Y_phi) + - T2a*(Lambda_phi*a1*Y_Q*Y_phi) + T5a*(Lambda_Q*a1*Y_Q*Y_phi) + - T6c*(2.0*a1*a1*n_S*Y_Q*Y_phi*Y_phi*Y_phi) + - T6d*(10.0/3.0*a1*a1*n_g*Y_Q*Y_phi); - // Top Quark Contribution: - highC(0,0) += -3.0*y_t*y_t*a1/(4.0*pi)*(Y_Q*Y_phi)/s*(2.0*L_s-4.0); - } - break; - default: - assert(false); - } - return highC; -} diff --git a/MatrixElement/EW/HighEnergyMatching.h b/MatrixElement/EW/HighEnergyMatching.h deleted file mode 100644 --- a/MatrixElement/EW/HighEnergyMatching.h +++ /dev/null @@ -1,64 +0,0 @@ -// -*- C++ -*- -// -// HighEnergyMatching.h is a part of Herwig - A multi-purpose Monte Carlo event generator -// -// Herwig is licenced under version 2 of the GPL, see COPYING for details. -// Please respect the MCnet academic guidelines, see GUIDELINES for details. -// -// -// -#ifndef HERWIG_HighEnergyMatching_H -#define HERWIG_HighEnergyMatching_H -#include "ThePEG/Config/ThePEG.h" -#include "ThePEG/Config/Unitsystem.h" -#include "EWProcess.h" -// work around a Boost 1.64 bug where ublas headers would fail otherwise -#include -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#include - -namespace Herwig { -using namespace ThePEG; - -namespace HighEnergyMatching { - - /** - * The high energy matching - */ - boost::numeric::ublas::matrix > - highEnergyMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - Herwig::EWProcess::Process process, - bool oneLoop, bool includeAlphaS2); - - /** - * Spin\f$\frac12\f$ - */ - boost::numeric::ublas::matrix > - SpinHalfMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2); - - /** - * Spin\f$1\f$ - */ - boost::numeric::ublas::matrix > - Spin1HighMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2); - /** - * Spin\f$0\f$ - */ - boost::numeric::ublas::matrix > - Spin0HighMatching(Energy highScale, - Energy2 s, Energy2 t, Energy2 u, - EWProcess::Process process, - bool oneLoop, bool includeAlphaS2); -} -} - -#endif // HERWIG_HighEnergyMatching_H diff --git a/MatrixElement/EW/Makefile.am b/MatrixElement/EW/Makefile.am deleted file mode 100644 --- a/MatrixElement/EW/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -pkglib_LTLIBRARIES = HwMEEW.la -HwMEEW_la_SOURCES = EWProcess.h GroupInvariants.h GroupInvariants.cc \ -ElectroWeakReweigter.h ElectroWeakReweighter.cc \ -SoftSudakov.h SoftSudakov.cc \ -CollinearSudakov.h CollinearSudakov.cc \ -HighEnergyMatching.h HighEnergyMatching.cc \ -ElectroWeakMatching.h ElectroWeakMatching.cc \ -EWCouplings.h EWCouplings.fh EWCouplings.cc \ -expm-1.hpp -HwMEEW_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 1:0:0 diff --git a/MatrixElement/EW/SoftSudakov.cc b/MatrixElement/EW/SoftSudakov.cc deleted file mode 100644 --- a/MatrixElement/EW/SoftSudakov.cc +++ /dev/null @@ -1,1321 +0,0 @@ -// -*- 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, - unsigned int iswap) { - using namespace EWProcess; - using namespace boost::numeric::ublas; - using Constants::pi; - static const Complex I(0,1.0); - Complex T = getT(s,t), U = getU(s,u); - matrix G1, G2, G3; - unsigned int numBrokenGauge; - switch (process) { - case QQQQ: - case QQQQiden: - case QtQtQQ: - { - numBrokenGauge = 12; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - matrix gam3; - if(iswap==0) { - gam3 = Gamma3(U,T); - G1(0,0) = G1(6,6) = Gamma1(2.0/3.0,2.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(7,7) = Gamma1(-1.0/3.0,-1.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(2,2) = G1(8,8) = Gamma1(2.0/3.0,2.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(3,3) = G1(9,9) = Gamma1(-1.0/3.0,-1.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(4,4) = G1(10,10) = Gamma1(-1.0/3.0,2.0/3.0,2.0/3.0,-1.0/3.0,T,U); - G1(5,5) = G1(11,11) = Gamma1(2.0/3.0,-1.0/3.0,-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==1) { - gam3 = Gamma3ST(U,T); - G1(0,0) = G1(6,6) = Gamma1ST(2.0/3.0,2.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(7,7) = Gamma1ST(-1.0/3.0,-1.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(2,2) = G1(8,8) = Gamma1ST(2.0/3.0,2.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(3,3) = G1(9,9) = Gamma1ST(-1.0/3.0,-1.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(4,4) = G1(10,10) = Gamma1ST(-1.0/3.0,2.0/3.0,2.0/3.0,-1.0/3.0,T,U); - G1(5,5) = G1(11,11) = Gamma1ST(2.0/3.0,-1.0/3.0,-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==2) { - gam3 = Gamma3SU(U,T); - G1(0,0) = G1(6,6) = Gamma1SU( 2.0/3.0,2.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(7,7) = Gamma1SU(-1.0/3.0,-1.0/3.0,2.0/3.0,2.0/3.0,T,U); - G1(2,2) = G1(8,8) = Gamma1SU( 2.0/3.0,2.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(3,3) = G1(9,9) = Gamma1SU(-1.0/3.0,-1.0/3.0,-1.0/3.0,-1.0/3.0,T,U); - G1(4,4) = G1(10,10) = Gamma1SU(-1.0/3.0,2.0/3.0,2.0/3.0,-1.0/3.0,T,U); - G1(5,5) = G1(11,11) = Gamma1SU( 2.0/3.0,-1.0/3.0,-1.0/3.0,2.0/3.0,T,U); - } - else - assert(false); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - matrix gam3; - if(iswap==0) { - gam3 = Gamma3(U,T); - G1(0,0) = G1(2,2) = Gamma1(2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1(2.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==1) { - gam3 = Gamma3ST(U,T); - G1(0,0) = G1(2,2) = Gamma1ST(2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1ST(2.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==2) { - gam3 = Gamma3SU(U,T); - G1(0,0) = G1(2,2) = Gamma1SU(2.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1SU(2.0/3.0,-1.0/3.0,T,U); - } - else - assert(false); - - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - matrix gam3; - if(iswap==0) { - gam3 = Gamma3(U,T); - G1(0,0) = G1(2,2) = Gamma1(-1.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==1) { - gam3 = Gamma3ST(U,T); - G1(0,0) = G1(2,2) = Gamma1ST(-1.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1ST(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==2) { - gam3 = Gamma3SU(U,T); - G1(0,0) = G1(2,2) = Gamma1SU(-1.0/3.0,2.0/3.0,T,U); - G1(1,1) = G1(3,3) = Gamma1SU(-1.0/3.0,-1.0/3.0,T,U); - } - else - assert(false); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - 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 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,2.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(2.0/3.0,2.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(2.0/3.0,2.0/3.0,T,U); - } - else - assert(false); - break; - case UUDD: - case tRtRDD: - numBrokenGauge = 2; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(-1.0/3.0,2.0/3.0,T,U); - } - else - assert(false); - break; - case UULL: - assert(iswap==0); - numBrokenGauge = 2; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 1; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(-1.0/3.0,-1.0/3.0,T,U); - } - else - assert(false); - break; - case DDLL: - assert(iswap==0); - numBrokenGauge = 2; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 1; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 6; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 2; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 1; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - G1(0,0) = Gamma1(-1.0,-1.0,T,U); - break; - case QQWW: - { - assert(iswap==0); - numBrokenGauge = 20; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - matrix gam3g; - Complex gam1a(0.),gam1b(0.); - if(iswap==0) { - gam3g = Gamma3g(U,T); - gam1a = Gamma1( 2./3.,0.,T,U); - gam1b = Gamma1(-1./3.,0.,T,U); - } - else if(iswap==1) { - gam3g = Gamma3gST(U,T); - gam1a = Gamma1ST( 2./3.,0.,T,U); - gam1b = Gamma1ST(-1./3.,0.,T,U); - } - else if(iswap==2) { - gam3g = Gamma3gSU(U,T); - gam1a = Gamma1SU( 2./3.,0.,T,U); - gam1b = Gamma1SU(-1./3.,0.,T,U); - } - else - assert(false); - 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) = gam1a; - G1(3,3) = G1(4,4) = G1(5,5) = gam1b; - } - break; - case LLWW: - assert(iswap==0); - numBrokenGauge = 20; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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: - assert(iswap==0); - numBrokenGauge = 14; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - 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: - { - assert(iswap==0); - numBrokenGauge = 4; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam1 = Gamma1(2./3.,0.,T,U); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam1(0.); - double Y = process==DDGG ? -1./3. : 2./3.; - if(iswap==0) { - G3 = Gamma3g(U,T); - gam1 = Gamma1(Y,0.,T,U); - } - else if(iswap==1) { - G3 = Gamma3gST(U,T); - gam1 = Gamma1ST(Y,0.,T,U); - } - else if(iswap==2) { - G3 = Gamma3gSU(U,T); - gam1 = Gamma1SU(Y,0.,T,U); - } - else - assert(false); - G1(0,0) = G1(1,1) = G1(2,2) = gam1; - } - break; - case DDBB: - { - assert(iswap==0); - numBrokenGauge = 4; - G1 = zero_matrix(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam3s = Gamma3Singlet()(0,0); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = zero_matrix(numBrokenGauge,numBrokenGauge); - Complex gam1 = Gamma1(-1.,0.,T,U); - for (unsigned int i=0; i(numBrokenGauge,numBrokenGauge); - G2 = zero_matrix(numBrokenGauge,numBrokenGauge); - G3 = 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 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, - unsigned int iswap) { - using namespace EWProcess; - using namespace boost::numeric::ublas; - using Constants::pi; - static const Complex I(0,1.0); - Complex T = getT(s,t), U = getU(s,u); - matrix G1,G2,G3; - unsigned int numGauge; - switch (process) { - case QQQQ: - case QQQQiden: - case QtQtQQ: - { - numGauge = 4; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = zero_matrix(numGauge,numGauge); - matrix gam3,gam2; - if(iswap==0) { - gam3 = Gamma3(U,T); - gam2 = Gamma2(U,T); - G1(0,0) = G1(1,1) = G1(2,2) = G1(3,3) = Gamma1(1.0/6.0,1.0/6.0,T,U); - } - else if(iswap==1) { - gam3 = Gamma3ST(U,T); - gam2 = Gamma2ST(U,T); - G1(0,0) = G1(1,1) = G1(2,2) = G1(3,3) = Gamma1ST(1.0/6.0,1.0/6.0,T,U); - } - else if(iswap==2) { - gam3 = Gamma3SU(U,T); - gam2 = Gamma2SU(U,T); - G1(0,0) = G1(1,1) = G1(2,2) = G1(3,3) = Gamma1SU(1.0/6.0,1.0/6.0,T,U); - } - else - assert(false); - 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); - 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); - } - break; - case QQUU: - case QtQtUU: - case QQtRtR: - numGauge = 2; - G1 = zero_matrix(numGauge,numGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G2 = Gamma2Singlet(); - G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,1.0/6.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G2 = Gamma2SingletST(T); - G1(0,0) = G1(1,1) = Gamma1ST(2.0/3.0,1.0/6.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G2 = Gamma2SingletSU(U); - G1(0,0) = G1(1,1) = Gamma1SU(2.0/3.0,1.0/6.0,T,U); - } - else - assert(false); - break; - case QQDD: - case QtQtDD: - numGauge = 2; - G1 = zero_matrix(numGauge,numGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G2 = Gamma2Singlet(); - G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,1.0/6.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G2 = Gamma2SingletST(T); - G1(0,0) = G1(1,1) = Gamma1ST(-1.0/3.0,1.0/6.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G2 = Gamma2SingletSU(U); - G1(0,0) = G1(1,1) = Gamma1SU(-1.0/3.0,1.0/6.0,T,U); - } - else - assert(false); - break; - case QQLL: - assert(iswap==0); - numGauge = 2; - G1 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(2.0/3.0,2.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(2.0/3.0,2.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(2.0/3.0,2.0/3.0,T,U); - } - else - assert(false); - break; - case UUDD: - case tRtRDD: - numGauge = 2; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(-1.0/3.0,2.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(-1.0/3.0,2.0/3.0,T,U); - } - else - assert(false); - break; - case UULL: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - if(iswap==0) { - G3 = Gamma3(U,T); - G1(0,0) = G1(1,1) = Gamma1(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==1) { - G3 = Gamma3ST(U,T); - G1(0,0) = G1(1,1) = Gamma1ST(-1.0/3.0,-1.0/3.0,T,U); - } - else if(iswap==2) { - G3 = Gamma3SU(U,T); - G1(0,0) = G1(1,1) = Gamma1SU(-1.0/3.0,-1.0/3.0,T,U); - } - else - assert(false); - break; - case DDLL: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 2; - G1 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = zero_matrix(numGauge,numGauge); - G1(0,0) = Gamma1(-1.0,-1.0,T,U); - break; - case QQWW: - { - assert(iswap==0); - numGauge = 5; - G1 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 2; - G1 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - Complex gam2s,gam1; - if(iswap==0) { - G3 = Gamma3g(U,T); - gam2s = Gamma2Singlet()(0,0); - gam1 = Gamma1(1.0/6.0); - } - else if(iswap==1) { - G3 = Gamma3gST(U,T); - gam2s = Gamma2SingletST(T)(0,0); - gam1 = Gamma1ST(1.0/6.0,T); - } - else if(iswap==2) { - G3 = Gamma3gSU(U,T); - gam2s = Gamma2SingletSU(U)(0,0); - gam1 = Gamma1SU(1.0/6.0,U); - } - else - assert(false); - for (unsigned int i=0; i<3; i++) { - G2(i,i) = gam2s; - G1(i,i) = gam1; - } - } - break; - case LLWW: - assert(iswap==0); - numGauge = 5; - G1 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 2; - G1 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = zero_matrix(numGauge,numGauge); - G3(0,0) = Gamma3Singlet()(0,0); - G1(0,0) = Gamma1(2.0/3.0); - break; - case UUPhiPhi: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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 DDGG: - case UUGG: - case tRtRGG: - { - numGauge = 3; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - double Y = process==DDGG ? -1./3. : 2./3.; - Complex gam1(0.); - if(iswap==0) { - G3 = Gamma3g(U,T); - gam1 = Gamma1(Y); - } - else if(iswap==1) { - G3 = Gamma3gST(U,T); - gam1 = Gamma1ST(Y,T); - } - else if(iswap==2) { - G3 = Gamma3gSU(U,T); - gam1 = Gamma1SU(Y,U); - } - else - assert(false); - for (unsigned int i=0; i<3; i++) { - G1(i,i) = gam1; - } - } - break; - case DDBB: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = zero_matrix(numGauge,numGauge); - G3(0,0) = Gamma3Singlet()(0,0); - G1(0,0) = Gamma1(-1.0/3.0); - break; - case DDPhiPhi: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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 EEBB: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = zero_matrix(numGauge,numGauge); - G1(0,0) = Gamma1(-1.0); - break; - case EEPhiPhi: - assert(iswap==0); - numGauge = 1; - G1 = zero_matrix(numGauge,numGauge); - G2 = zero_matrix(numGauge,numGauge); - G3 = 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.fh b/MatrixElement/EW/SoftSudakov.fh deleted file mode 100644 --- a/MatrixElement/EW/SoftSudakov.fh +++ /dev/null @@ -1,18 +0,0 @@ -// -*- C++ -*- -// -// This is the forward declaration of the SoftSudakov class. -// -#ifndef Herwig_SoftSudakov_FH -#define Herwig_SoftSudakov_FH - -#include "ThePEG/Config/ThePEG.h" - -namespace Herwig { - -class SoftSudakov; - -ThePEG_DECLARE_POINTERS(Herwig::SoftSudakov,SoftSudakovPtr); - -} - -#endif diff --git a/MatrixElement/EW/SoftSudakov.h b/MatrixElement/EW/SoftSudakov.h deleted file mode 100644 --- a/MatrixElement/EW/SoftSudakov.h +++ /dev/null @@ -1,198 +0,0 @@ -// -*- 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" -// work around a Boost 1.64 bug where ublas headers would fail otherwise -#include -#if (BOOST_VERSION / 100 >= 1064) -#include -#endif -#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, - unsigned int iswap); - - /** - * 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, - unsigned int iswap); - - /** - * 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 &) = delete; - -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 */ diff --git a/MatrixElement/EW/expm-1.h b/MatrixElement/EW/expm-1.h deleted file mode 100644 --- a/MatrixElement/EW/expm-1.h +++ /dev/null @@ -1,148 +0,0 @@ -// -// Copyright (c) 2007 -// Tsai, Dung-Bang -// National Taiwan University, Department of Physics -// -// E-Mail : dbtsai (at) gmail.com -// Begine : 2007/11/20 -// Last modify : 2007/11/22 -// Version : v0.1 -// -// EXPGM_PAD computes the matrix exponential exp(H) for general matrixs, -// including complex and real matrixs using the irreducible (p,p) degree -// rational Pade approximation to the exponential -// exp(z) = r(z)=(+/-)( I+2*(Q(z)/P(z))). -// -// Usage : -// -// U = expm_pad(H) -// U = expm_pad(H, p) -// -// where p is internally set to 6 (recommended and gererally satisfactory). -// -// See also MATLAB supplied functions, EXPM and EXPM1. -// -// Reference : -// EXPOKIT, Software Package for Computing Matrix Exponentials. -// ACM - Transactions On Mathematical Software, 24(1):130-156, 1998 -// -// Permission to use, copy, modify, distribute and sell this software -// and its documentation for any purpose is hereby granted without fee, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. The authors make no representations -// about the suitability of this software for any purpose. -// It is provided "as is" without express or implied warranty. -// - -#ifndef _BOOST_UBLAS_EXPM_ -#define _BOOST_UBLAS_EXPM_ -#include -#include -#include -#include -#include - -namespace boost { namespace numeric { namespace ublas { - -template MATRIX expm_pad(const MATRIX &H, const int p = 6) { - typedef typename MATRIX::value_type value_type; - typedef typename MATRIX::size_type size_type; - typedef double real_value_type; // Correct me. Need to modify. - assert(H.size1() == H.size2()); - const size_type n = H.size1(); - const identity_matrix I(n); - matrix U(n,n),H2(n,n),P(n,n),Q(n,n); - real_value_type norm = 0.0; - - // Calcuate Pade coefficients (1-based instead of 0-based as in the c vector) - vector c(p+2); - c(1)=1; - for(size_type i = 1; i <= p; ++i) - c(i+1) = c(i) * ((p + 1.0 - i)/(i * (2.0 * p + 1 - i))); - // Calcuate the infinty norm of H, which is defined as the largest row sum of a matrix - for(size_type i=0; i(H(j,i)); // Correct me, if H is complex, can I use that abs? - norm = std::max(norm, temp); - } - if (norm == 0.0) - { - boost::throw_exception(boost::numeric::ublas::bad_argument()); - std::cerr<<"Error! Null input in the routine EXPM_PAD.\n"; - exit(0); - } - // Scaling, seek s such that || H*2^(-s) || < 1/2, and set scale = 2^(-s) - int s = 0; - real_value_type scale = 1.0; - if(norm > 0.5) { - s = std::max(0, static_cast((log(norm) / log(2.0) + 2.0))); - scale /= static_cast(std::pow(2.0, s)); - U.assign(scale * H); // Here U is used as temp value due to that H is const - } - else - U.assign(H); - // Horner evaluation of the irreducible fraction, see the following ref above. - // Initialise P (numerator) and Q (denominator) - H2.assign( prod(U, U) ); - Q.assign( c(p+1)*I ); - P.assign( c(p)*I ); - size_type odd = 1; - for( size_type k = p - 1; k > 0; --k) - { - if( odd == 1) - { - Q = ( prod(Q, H2) + c(k) * I ); - } - else - { - P = ( prod(P, H2) + c(k) * I ); - } - odd = 1 - odd; - } - if( odd == 1) - { - Q = ( prod(Q, U) ); - Q -= P ; - //U.assign( -(I + 2*(Q\P))); - } - else - { - P = (prod(P, U)); - Q -= P; - //U.assign( I + 2*(Q\P)); - } - // In origine expokit package, they use lapack ZGESV to obtain inverse matrix, - // and in that ZGESV routine, it uses LU decomposition for obtaing inverse matrix. - // Since in ublas, there is no matrix inversion template, I simply use the build-in - // LU decompostion package in ublas, and back substitute by myself. - // - //////////////// Implement Matrix Inversion /////////////////////// - permutation_matrix pm(n); - int res = lu_factorize(Q, pm); - if( res != 0) - { - std::cerr << "Error in the matrix inversion in template expm_pad.\n"; - exit(0); - } - H2 = I; // H2 is not needed anymore, so it is temporary used as identity matrix for substituting. - - lu_substitute(Q, pm, H2); - if( odd == 1) - U.assign( -(I + 2.0 * prod(H2, P))); - else - U.assign( I + 2.0 * prod(H2, P)); - // Squaring - for(size_t i = 0; i < s; ++i) - { - U = (prod(U,U)); - } - return U; - } - -}}} - - -#endif diff --git a/MatrixElement/Makefile.am b/MatrixElement/Makefile.am --- a/MatrixElement/Makefile.am +++ b/MatrixElement/Makefile.am @@ -1,18 +1,18 @@ -SUBDIRS = General Lepton Hadron DIS Powheg Gamma Matchbox Reweighters EW +SUBDIRS = General Lepton Hadron DIS Powheg Gamma Matchbox Reweighters if WANT_LIBFASTJET SUBDIRS += FxFx endif noinst_LTLIBRARIES = libHwME.la libHwME_la_SOURCES = \ HwMEBase.h HwMEBase.fh HwMEBase.cc \ MEMultiChannel.h MEMultiChannel.cc \ MEfftoVH.h MEfftoVH.cc \ MEfftoffH.h MEfftoffH.cc \ HardVertex.fh HardVertex.h HardVertex.cc \ ProductionMatrixElement.h ProductionMatrixElement.cc \ DrellYanBase.h DrellYanBase.cc \ BlobME.h BlobME.cc \ MEMinBias.h MEMinBias.cc diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -1,271 +1,270 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) AC_INIT([Herwig],[devel],[herwig@projects.hepforge.org],[Herwig]) AC_CONFIG_SRCDIR([Utilities/HerwigStrategy.cc]) AC_CONFIG_AUX_DIR([Config]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([Config/config.h]) dnl AC_PRESERVE_HELP_ORDER AC_CANONICAL_HOST dnl === disable debug symbols by default ===== if test "x$CXXFLAGS" = "x"; then CXXFLAGS="-O2 -DBOOST_UBLAS_NDEBUG" fi if test "x$CFLAGS" = "x"; then CFLAGS=-O2 fi AC_LANG([C++]) AM_INIT_AUTOMAKE([1.11 subdir-objects gnu dist-bzip2 no-dist-gzip -Wall -Wno-portability]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl Checks for C++ compiler. Handle C++11 flags. AC_PROG_CXX AX_CXX_COMPILE_STDCXX([11],[noext],[mandatory]) dnl check for POSIX AC_CHECK_HEADER([unistd.h],[], [AC_MSG_ERROR([Herwig needs "unistd.h". Non-POSIX systems are not supported.])]) AC_CHECK_HEADER([sys/stat.h],[], [AC_MSG_ERROR([Herwig needs "sys/stat.h". Non-POSIX systems are not supported.])]) dnl Checks for programs. AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_LN_S dnl modified search order AC_PROG_FC([gfortran g95 g77]) dnl xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn xlf90 f90 pgf90 pghpf epcf90 xlf f77 frt pgf77 cf77 fort77 fl32 af77]) AC_LANG_PUSH([Fortran]) AC_MSG_CHECKING([if the Fortran compiler ($FC) works]) AC_COMPILE_IFELSE( AC_LANG_PROGRAM([],[ print *[,]"Hello"]), [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([A Fortran compiler is required to build Herwig.]) ] ) AC_LANG_POP([Fortran]) AC_FC_WRAPPERS LT_PREREQ([2.2.6]) LT_INIT([disable-static dlopen pic-only]) dnl #################################### dnl #################################### dnl for Doc/fixinterfaces.pl AC_PATH_PROG(PERL, perl) dnl for Models/Feynrules AM_PATH_PYTHON([2.6],, [:]) AM_CONDITIONAL([HAVE_PYTHON], [test "x$PYTHON" != "x:"]) HERWIG_CHECK_GSL HERWIG_CHECK_THEPEG BOOST_REQUIRE([1.41]) BOOST_FIND_HEADER([boost/numeric/ublas/io.hpp]) dnl Boost 1.64 is missing a required header to make these work dnl we just assume they're there if io.hpp has been found OK above dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix.hpp]) dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix_proxy.hpp]) dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix_sparse.hpp]) dnl BOOST_FIND_HEADER([boost/numeric/ublas/symmetric.hpp]) dnl BOOST_FIND_HEADER([boost/numeric/ublas/vector.hpp]) BOOST_FIND_HEADER([boost/operators.hpp]) BOOST_TEST() HERWIG_CHECK_VBFNLO HERWIG_CHECK_NJET HERWIG_CHECK_GOSAM HERWIG_CHECK_GOSAM_CONTRIB HERWIG_CHECK_OPENLOOPS HERWIG_CHECK_MADGRAPH HERWIG_CHECK_EVTGEN HERWIG_CHECK_PYTHIA HERWIG_COMPILERFLAGS HERWIG_LOOPTOOLS FASTJET_CHECK_FASTJET HERWIG_ENABLE_MODELS SHARED_FLAG=-shared AM_CONDITIONAL(NEED_APPLE_FIXES, [test "xx${host/darwin/foundit}xx" != "xx${host}xx"]) if test "xx${host/darwin/foundit}xx" != "xx${host}xx"; then APPLE_DSO_FLAGS=-Wl,-undefined,dynamic_lookup SHARED_FLAG=-bundle fi AC_SUBST([APPLE_DSO_FLAGS]) AC_SUBST([SHARED_FLAG]) AC_SUBST([PYTHON]) AC_CONFIG_FILES([UnderlyingEvent/Makefile Models/Makefile Models/StandardModel/Makefile Models/RSModel/Makefile Models/General/Makefile Models/Susy/Makefile Models/Susy/NMSSM/Makefile Models/Susy/RPV/Makefile Models/UED/Makefile Models/LH/Makefile Models/DarkMatter/Makefile Models/LHTP/Makefile Models/Transplanckian/Makefile Models/Leptoquarks/Makefile Models/Zprime/Makefile Models/TTbAsymm/Makefile Models/Feynrules/Makefile Models/Feynrules/python/Makefile-FR Models/ADD/Makefile Models/Sextet/Makefile Decay/Makefile Decay/FormFactors/Makefile Decay/Tau/Makefile Decay/Baryon/Makefile Decay/VectorMeson/Makefile Decay/Perturbative/Makefile Decay/HeavyMeson/Makefile Decay/ScalarMeson/Makefile Decay/Dalitz/Makefile Decay/TensorMeson/Makefile Decay/WeakCurrents/Makefile Decay/Partonic/Makefile Decay/General/Makefile Decay/Radiation/Makefile Decay/EvtGen/Makefile Doc/refman.conf Doc/refman.h PDT/Makefile PDF/Makefile MatrixElement/Makefile MatrixElement/General/Makefile MatrixElement/Lepton/Makefile MatrixElement/Hadron/Makefile MatrixElement/DIS/Makefile MatrixElement/Powheg/Makefile MatrixElement/Gamma/Makefile MatrixElement/Reweighters/Makefile - MatrixElement/EW/Makefile MatrixElement/Matchbox/Makefile MatrixElement/Matchbox/Base/Makefile MatrixElement/Matchbox/Utility/Makefile MatrixElement/Matchbox/Phasespace/Makefile MatrixElement/Matchbox/Dipoles/Makefile MatrixElement/Matchbox/InsertionOperators/Makefile MatrixElement/Matchbox/Matching/Makefile MatrixElement/Matchbox/Cuts/Makefile MatrixElement/Matchbox/Scales/Makefile MatrixElement/Matchbox/ColorFull/Makefile MatrixElement/Matchbox/CVolver/Makefile MatrixElement/Matchbox/Builtin/Makefile MatrixElement/Matchbox/Builtin/Amplitudes/Makefile MatrixElement/Matchbox/Tests/Makefile MatrixElement/Matchbox/External/Makefile MatrixElement/Matchbox/External/BLHAGeneric/Makefile MatrixElement/Matchbox/External/VBFNLO/Makefile MatrixElement/Matchbox/External/NJet/Makefile MatrixElement/Matchbox/External/GoSam/Makefile MatrixElement/Matchbox/External/OpenLoops/Makefile MatrixElement/Matchbox/External/MadGraph/Makefile MatrixElement/Matchbox/External/MadGraph/mg2herwig MatrixElement/Matchbox/External/GoSam/gosam2herwig.py MatrixElement/FxFx/Makefile Sampling/Makefile Sampling/CellGrids/Makefile Shower/Makefile Shower/QTilde/Makefile Shower/QTilde/Matching/Makefile Shower/Dipole/Makefile Shower/Dipole/Base/Makefile Shower/Dipole/Kernels/Makefile Shower/Dipole/Kinematics/Makefile Shower/Dipole/Utility/Makefile Shower/Dipole/AlphaS/Makefile Shower/Dipole/SpinCorrelations/Makefile Utilities/Makefile Utilities/XML/Makefile Utilities/Statistics/Makefile Hadronization/Makefile lib/Makefile include/Makefile src/Makefile src/defaults/Makefile src/snippets/Makefile src/Matchbox/Makefile src/herwig-config Doc/Makefile Doc/HerwigDefaults.in Looptools/Makefile Analysis/Makefile API/Makefile src/Makefile-UserModules src/defaults/Analysis.in src/defaults/MatchboxDefaults.in src/defaults/Decays.in src/defaults/decayers.in src/defaults/setup.gosam.in src/Matchbox/LO-DefaultShower.in src/Matchbox/LO-DipoleShower.in src/Matchbox/MCatLO-DefaultShower.in src/Matchbox/MCatLO-DipoleShower.in src/Matchbox/LO-NoShower.in src/Matchbox/MCatNLO-DefaultShower.in src/Matchbox/MCatNLO-DipoleShower.in src/Matchbox/NLO-NoShower.in src/Matchbox/Powheg-DefaultShower.in src/Matchbox/Powheg-DipoleShower.in src/Merging/Makefile Shower/Dipole/Merging/Makefile src/defaults/MatchboxMergingDefaults.in Contrib/Makefile Contrib/make_makefiles.sh Tests/Makefile Makefile]) AC_CONFIG_FILES([Tests/python/rivet_check ],[chmod +x Tests/python/rivet_check ]) AC_CONFIG_FILES([Tests/python/LowEnergy-EE.py ],[chmod +x Tests/python/LowEnergy-EE.py ]) AC_CONFIG_FILES([Tests/python/LowEnergy-Photon.py],[chmod +x Tests/python/LowEnergy-Photon.py]) AC_CONFIG_FILES([Tests/python/make_input_files.py],[chmod +x Tests/python/make_input_files.py]) AC_CONFIG_FILES([Tests/python/merge-DIS ],[chmod +x Tests/python/merge-DIS ]) AC_CONFIG_FILES([Tests/python/merge-EE ],[chmod +x Tests/python/merge-EE ]) AC_CONFIG_FILES([Tests/python/merge-EE-Gamma ],[chmod +x Tests/python/merge-EE-Gamma ]) AC_CONFIG_FILES([Tests/python/merge-Fixed ],[chmod +x Tests/python/merge-Fixed ]) AC_CONFIG_FILES([Tests/python/merge-GammaGamma ],[chmod +x Tests/python/merge-GammaGamma ]) AC_CONFIG_FILES([Tests/python/merge-LHC-EW ],[chmod +x Tests/python/merge-LHC-EW ]) AC_CONFIG_FILES([Tests/python/merge-LHC-Jets ],[chmod +x Tests/python/merge-LHC-Jets ]) AC_CONFIG_FILES([Tests/python/merge-LHC-Photon ],[chmod +x Tests/python/merge-LHC-Photon ]) AC_CONFIG_FILES([Tests/python/mergeLowEnergy.py ],[chmod +x Tests/python/mergeLowEnergy.py ]) AC_CONFIG_FILES([Tests/python/merge-Star ],[chmod +x Tests/python/merge-Star ]) AC_CONFIG_FILES([Tests/python/merge-TVT-EW ],[chmod +x Tests/python/merge-TVT-EW ]) AC_CONFIG_FILES([Tests/python/merge-TVT-Jets ],[chmod +x Tests/python/merge-TVT-Jets ]) AC_CONFIG_FILES([Tests/python/merge-TVT-Photon ],[chmod +x Tests/python/merge-TVT-Photon ]) AC_CONFIG_FILES([Tests/python/plot-EE ],[chmod +x Tests/python/plot-EE ]) AC_CONFIG_FILES([Tests/python/R.py ],[chmod +x Tests/python/R.py ]) AC_CONFIG_FILES([Sampling/herwig-mergegrids.py ],[chmod +x Sampling/herwig-mergegrids.py ]) AC_CONFIG_LINKS([Doc/BSMlibs.in:Doc/BSMlibs.in]) AC_CONFIG_FILES([Doc/fixinterfaces.pl],[chmod +x Doc/fixinterfaces.pl]) AC_CONFIG_HEADERS([PDF/SaSPhotonPDF.cc]) HERWIG_OVERVIEW AC_CONFIG_COMMANDS([summary],[cat config.herwig]) AC_OUTPUT