Page MenuHomeHEPForge

No OneTemporary

diff --git a/Models/LH/LHFFGVertex.cc b/Models/LH/LHFFGVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFGVertex.cc
@@ -0,0 +1,53 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHFFGVertex class.
+//
+
+#include "LHFFGVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/StandardModel/StandardModelBase.h"
+
+using namespace Herwig;
+
+// Static variable needed for the type description system in ThePEG.
+DescribeNoPIOClass<LHFFGVertex,FFVVertex>
+describeHerwigLHFFGVertex("Herwig::LHFFGVertex", "HwLHModel.so");
+
+void LHFFGVertex::Init() {
+
+ static ClassDocumentation<LHFFGVertex> documentation
+ ("The LHFFGVertex class implements the coupling of the quarks"
+ " to the gluon in the Little Higgs model");
+
+}
+
+// coupling for FFG vertex
+void LHFFGVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr,tcPDPtr) {
+ // check allowed
+ int iferm=abs(a->id());
+ assert((iferm>=1 && iferm<=6) || iferm==8);
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = -strongCoupling(q2);
+ _q2last=q2;
+ }
+ norm(_couplast);
+ left(1.);
+ right(1.);
+}
+
+void LHFFGVertex::doinit() {
+ // PDG codes for the particles
+ for(int ix=1;ix<7;++ix) {
+ addToList(-ix, ix, 21);
+ }
+ addToList(-8, 8, 21);
+ FFVVertex::doinit();
+}
+
+LHFFGVertex::LHFFGVertex() : _couplast(0.), _q2last(0.*GeV2) {
+ orderInGs(1);
+ orderInGem(0);
+}
diff --git a/Models/LH/LHFFGVertex.h b/Models/LH/LHFFGVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFGVertex.h
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHFFGVertex_H
+#define HERWIG_LHFFGVertex_H
+//
+// This is the declaration of the LHFFGVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHFFGVertex class implements the couplings of the
+ * quarks and additional heavy top to the gluon in the Little Higgs
+ * model.
+ */
+class LHFFGVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHFFGVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /**
+ * 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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHFFGVertex & operator=(const LHFFGVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The last value of the strong coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHFFGVertex_H */
diff --git a/Models/LH/LHFFHVertex.cc b/Models/LH/LHFFHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFHVertex.cc
@@ -0,0 +1,288 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHFFHVertex class.
+//
+
+#include "LHFFHVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void LHFFHVertex::persistentOutput(PersistentOStream & os) const {
+ os << ounit(_coup,1./GeV) << _model;
+}
+
+void LHFFHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(_coup,1./GeV) >> _model;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHFFHVertex,FFSVertex>
+describeHerwigLHFFHVertex("Herwig::LHFFHVertex", "HwLHModel.so");
+
+void LHFFHVertex::Init() {
+
+ static ClassDocumentation<LHFFHVertex> documentation
+ ("The LHFFHVertex class implements the interaction of the fermions"
+ " and the Higgs bosons in the Little Higgs model");
+
+}
+
+LHFFHVertex::LHFFHVertex()
+ : _q2last(0.*GeV2) {
+ orderInGem(1);
+ orderInGs(0);
+ _masslast[0] = 0.*GeV;
+ _masslast[1] = 0.*GeV;
+ _idlast[0] = 0;
+ _idlast[1] = 0;
+}
+
+void LHFFHVertex::doinit() {
+ // SM like higgs
+ for (int ix=1;ix<=6;++ix) {
+ addToList( -ix, ix, 25);
+ }
+ addToList( -6, 8, 25);
+ addToList( -8, 6, 25);
+ addToList( -8, 8, 25);
+ for(int ix=11;ix<16;ix+=2) {
+ addToList( -ix, ix, 25);
+ }
+ // phi0
+ for (int ix=1;ix<=6;++ix) {
+ addToList( -ix, ix, 35);
+ }
+ addToList( -6, 8, 35);
+ addToList( -8, 6, 35);
+ for(int ix=11;ix<16;ix+=2) {
+ addToList( -ix, ix, 35);
+ }
+ // phiP
+ for (int ix=1;ix<=6;++ix) {
+ addToList( -ix, ix, 36);
+ }
+ addToList( -6, 8, 36);
+ addToList( -8, 6, 36);
+ for(int ix=11;ix<16;ix+=2) {
+ addToList( -ix, ix, 36);
+ }
+ // phi +/-
+ for(int ix=1;ix<6;ix+=2) {
+ addToList( -ix-1, ix, 37);
+ addToList( -ix , ix+1, -37);
+ }
+ addToList( -8 , 5, 37);
+ addToList( -5 , 8, -37);
+ for(int ix=11;ix<16;ix+=2) {
+ addToList( -ix-1, ix, 37);
+ addToList( -ix , ix+1, -37);
+ }
+ _model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!_model) throw InitException() << "Must be using the LHModel "
+ << " in LHFFPVertex::doinit()"
+ << Exception::runerror;
+ _coup.resize(11);
+ Energy v = _model->vev();
+ double s0 = _model->sinTheta0();
+ double sP = _model->sinThetaP();
+ double sPlus = _model->sinThetaPlus();
+ double s02 = sqr(s0);
+ double vf = _model->vev()/_model->f();
+ double xL = sqr(_model->lambda1())/(sqr(_model->lambda1())+sqr(_model->lambda2()));
+ double xR = sqr(_model->lambda1())/sqrt(sqr(_model->lambda1())+sqr(_model->lambda2()));
+ Energy mT = getParticleData(8)->mass();
+ // lightest higgs couplings
+ // coupling of light SM fermions
+ _coup[0] = (1.-0.5*s02+vf*s0/sqrt(2.)-2./3.*sqr(vf))/v;
+ // couplings to top quark
+ _coup[1] = (1.-0.5*s02+vf*s0/sqrt(2.)-2./3.*sqr(vf)+sqr(vf)*xL*(1.+xL))/v;
+ // couplings to the T quark
+ _coup[2] =-xR*(1.+xL)*vf/mT;
+ // couplings to tT
+ _coup[3] = xR/mT;
+ _coup[4] = vf/v*(1.+xL);
+ // phi 0
+ // light particles
+ _coup[5] = sqrt(0.5)/v*(vf-sqrt(2.)*s0);
+ // mixed
+ _coup[6] = sqrt(0.5)/v*(vf-sqrt(2.)*s0)*_model->lambda1()/_model->lambda2();
+ // phi P
+ _coup[7] = Complex(0.,1.)*sqrt(0.5)/v*(vf-sqrt(2.)*sP);
+ _coup[8] = Complex(0.,1.)*sqrt(0.5)/v*(vf-sqrt(2.)*sP)*_model->lambda1()/_model->lambda2();
+ // phi +/-
+ _coup[9] = -sqrt(0.5)/v*(vf-2.*sPlus);
+ _coup[9] = -sqrt(0.5)/v*(vf-2.*sPlus)*_model->lambda1()/_model->lambda2();
+ FFSVertex::doinit();
+}
+
+void LHFFHVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) {
+ int iferm=abs(a->id());
+ int ianti=abs(b->id());
+ // left and right couplings set to one
+ left (1.);
+ right(1.);
+ // first the overall normalisation
+ if(q2!=_q2last||_idlast[0]!=iferm||_idlast[1]!=ianti) {
+ _q2last = q2;
+ _idlast[0] = iferm;
+ if(_idlast[0]==8) _idlast[0]=6;
+ assert((_idlast[0]>=1 && _idlast[0]<=6 ) ||
+ (_idlast[0]>=11 && _idlast[0]<=16));
+ if(iferm==_idlast[0])
+ _masslast[0] = _model->mass(q2,a);
+ else
+ _masslast[0] = _model->mass(q2,getParticleData(ParticleID::t));
+ _idlast[1] = ianti;
+ if(_idlast[1]==8) _idlast[1]=6;
+ assert((_idlast[1]>=1 && _idlast[1]<=6 ) ||
+ (_idlast[1]>=11 && _idlast[1]<=16));
+ if(_idlast[0]!=_idlast[1]) {
+ if(ianti==_idlast[1])
+ _masslast[1] = _model->mass(q2,a);
+ else
+ _masslast[1] = _model->mass(q2,getParticleData(ParticleID::t));
+ }
+ else {
+ _masslast[1] = _masslast[0];
+ }
+ }
+ // SM like higgs
+ if(c->id()==ParticleID::h0) {
+ if(iferm==ianti) {
+ if((iferm>=1 && iferm<=5 ) ||
+ (iferm>=11 && iferm<=16)) {
+ norm(-Complex(_coup[0]*_masslast[0]));
+ }
+ else if(iferm==6) {
+ norm(-Complex(_coup[1]*_masslast[0]));
+ }
+ else if(iferm==8) {
+ norm(-Complex(_coup[2]*a->mass()));
+ }
+ else assert(false);
+ }
+ else {
+ assert( (iferm == 6 && ianti == 8 ) ||
+ (ianti == 6 && iferm == 8 ));
+ Complex cleft,cright;
+ if(iferm==6) {
+ cleft = -_coup[3]*b->mass();
+ cright = -_coup[4]*_masslast[0];
+ }
+ else {
+ cleft = -_coup[3]*a->mass();
+ cright = -_coup[4]*_masslast[0];
+ }
+ if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) {
+ cright = conj(cleft);
+ cleft = 0.;
+ }
+ left (cleft );
+ right(cright);
+ norm(1.);
+ }
+ }
+ else if(c->id()==ParticleID::H0) {
+ if(iferm==ianti) {
+ if((iferm>=1 && iferm<=6 ) ||
+ (iferm>=11 && iferm<=16)) {
+ norm(-Complex(_coup[5]*_masslast[0]));
+ }
+ else assert(false);
+ }
+ else {
+ assert( (iferm == 6 && ianti == 8 ) ||
+ (iferm == 8 && ianti == 6 ) );
+ Complex cleft = Complex(_coup[6]*_masslast[0]);
+ Complex cright = 0.;
+ if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) {
+ cright = conj(cleft);
+ cleft = 0.;
+ }
+ left (cleft );
+ right(cright);
+ norm(1.);
+ }
+ }
+ else if(c->id()==ParticleID::A0) {
+ left(-1.);
+ right(1.);
+ if(iferm==ianti) {
+ if((iferm>=1 && iferm<=6 ) ||
+ (iferm>=11 && iferm<=16)) {
+ if(iferm%2==0)
+ norm(-Complex( _coup[7]*_masslast[0]));
+ else
+ norm(-Complex(-_coup[7]*_masslast[0]));
+ }
+ else assert(false);
+ }
+ else {
+ assert( (iferm == 6 && ianti == 8 ) ||
+ (iferm == 8 && ianti == 6 ));
+ Complex cleft = Complex(_coup[8]*_masslast[0]);
+ Complex cright = 0.;
+ if(b->id()==ParticleID::tbar || c->id()==ParticleID::tbar) {
+ cright = conj(cleft);
+ cleft = 0.;
+ }
+ left (cleft );
+ right(cright);
+ norm(1.);
+ }
+ }
+ else if(c->id()==ParticleID::Hplus) {
+ norm(1.);
+ Complex cleft(0.),cright(0.);
+ if(iferm%2==0) {
+ if(iferm==ParticleID::t) {
+ cleft = _masslast[0]*_coup[ 9];
+ }
+ else {
+ cleft = _masslast[0]*_coup[10];
+ cright = _masslast[1]*_coup[10];
+ }
+ }
+ else {
+ if(ianti==ParticleID::t) {
+ cleft = _masslast[1]*_coup[ 9];
+ }
+ else {
+ cleft = _masslast[1]*_coup[10];
+ cright = _masslast[0]*_coup[10];
+ }
+ }
+ left ( cleft);
+ right(cright);
+ }
+ else if(c->id()==ParticleID::Hminus) {
+ norm(1.);
+ Complex cleft(0.),cright(0.);
+ if(iferm%2==0) {
+ if(iferm==ParticleID::t) {
+ cright = _masslast[0]*_coup[ 9];
+ }
+ else {
+ cright = _masslast[0]*_coup[10];
+ cleft = _masslast[1]*_coup[10];
+ }
+ }
+ else {
+ if(ianti==ParticleID::t) {
+ cright = _masslast[1]*_coup[ 9];
+ }
+ else {
+ cright = _masslast[1]*_coup[10];
+ cleft = _masslast[0]*_coup[10];
+ }
+ }
+ left ( cleft);
+ right(cright);
+ }
+}
diff --git a/Models/LH/LHFFHVertex.h b/Models/LH/LHFFHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFHVertex.h
@@ -0,0 +1,133 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHFFHVertex_H
+#define HERWIG_LHFFHVertex_H
+//
+// This is the declaration of the LHFFHVertex class.
+//
+
+#include "LHModel.h"
+#include "ThePEG/Helicity/Vertex/Scalar/FFSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHFFHVertex class implements the couplings of the fermions to
+ * the Higgs bosons of the Little Higgs model.
+ */
+class LHFFHVertex: public Helicity::FFSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHFFHVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ * @param ioff Which particle is off-shell
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+protected:
+
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHFFHVertex & operator=(const LHFFHVertex &);
+
+private:
+
+ /**
+ * Pointer to the SM object.
+ */
+ tcLHModelPtr _model;
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The PDG code of the last fermion the coupling was evaluated for.
+ */
+ int _idlast[2];
+
+ /**
+ * The last \f$q^2\f$ the coupling was evaluated at.
+ */
+ Energy2 _q2last;
+
+ /**
+ * The mass of the last fermion for which the coupling was evaluated.
+ */
+ Energy _masslast[2];
+
+ /**
+ * The factors for the individual interactions
+ */
+ vector<complex<InvEnergy> > _coup;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHFFHVertex_H */
diff --git a/Models/LH/LHFFPVertex.cc b/Models/LH/LHFFPVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFPVertex.cc
@@ -0,0 +1,156 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHFFPVertex class.
+//
+
+#include "LHFFPVertex.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHFFPVertex::LHFFPVertex()
+ : _couplast(0.), _q2last(-1.*GeV2) {
+ // order in strong and em coupling
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHFFPVertex::persistentOutput(PersistentOStream & os) const {
+ os << _charge << _gl << _gr;
+}
+
+void LHFFPVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _charge >> _gl >> _gr;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHFFPVertex,FFVVertex>
+describeHerwigLHFFPVertex("Herwig::LHFFPVertex", "HwLHModel.so");
+
+void LHFFPVertex::Init() {
+
+ static ClassDocumentation<LHFFPVertex> documentation
+ ("The LHFFPVertex class implements the couplings of the fermions to"
+ " the photon and A_H in the Little Higgs model");
+
+}
+
+void LHFFPVertex::doinit() {
+ // the quarks
+ for(int ix=1;ix<7;++ix) {
+ addToList(-ix, ix, 22);
+ addToList(-ix, ix, 32);
+ }
+ addToList( -8, 8, 22);
+ addToList( -8, 8, 32);
+ addToList( -6, 8, 32);
+ addToList( -8, 6, 32);
+ // the leptons
+ for(int ix=11;ix<17;++ix) {
+ if(ix%2!=0) addToList(-ix, ix, 22);
+ addToList(-ix, ix, 32);
+ }
+ FFVVertex::doinit();
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHFFPVertex::doinit()"
+ << Exception::runerror;
+ // charges
+ _charge.resize(17);
+ for(int ix=1;ix<4;++ix) {
+ _charge[2*ix-1] = model->ed();
+ _charge[2*ix ] = model->eu();
+ _charge[2*ix+9 ] = model->ee();
+ _charge[2*ix+10] = model->enu();
+ }
+ _charge[8] = model->eu();
+ // couplings for the heavy photon taken from table IX
+ double cw = sqrt(1.-sin2ThetaW());
+ double xL = sqr(model->lambda1())/(sqr(model->lambda1())+sqr(model->lambda2()));
+ double cp2 = sqr(model->cosThetaPrime());
+ double yu = -0.4;
+ double ye = 0.6;
+ // prefactor after removal of -e
+ double pre = -0.5/cw/model->cosThetaPrime()/model->sinThetaPrime();
+ // down type quarks
+ double gvd = pre*(2.*yu+11./15.+cp2/6);
+ double gad = pre*(-0.2+0.5*cp2);
+ // up type quarks
+ double gvu = pre*(2.*yu+17./15.-5./6.*cp2);
+ double gau = pre*( 0.2-0.5*cp2);
+ // charged leptons
+ double gve = pre*(2.*ye-9./5.+1.5*cp2);
+ double gae = pre*(-0.2+0.5*cp2);
+ // neutrinos
+ double gvv = pre*(-0.2+0.5*cp2);
+ double gav = pre*( 0.2-0.5*cp2);
+ // light top
+ double gvtll = pre*(2.*yu+17./15.-5./6.*cp2-0.2*xL);
+ double gatll = pre*(0.2-0.5*cp2-0.2*xL);
+ // mixed top
+ double gvtlh = pre*0.2*model->lambda1()*model->lambda2()/
+ (sqr(model->lambda1())+sqr(model->lambda2()));
+ double gatlh = gvtlh;
+ // heavy top
+ double gvthh = pre*(2.*yu+14./15.-4./3.*cp2+0.2*xL);
+ double gathh = pre*0.2*xL;
+ _gl.resize(17);
+ _gr.resize(17);
+ for(unsigned int ix=1;ix<4;++ix) {
+ _gr[2*ix-1] = gvd+gad;
+ _gl[2*ix-1] = gvd-gad;
+ _gr[2*ix ] = gvu+gau;
+ _gl[2*ix ] = gvu-gau;
+ _gr[2*ix+9 ] = gve+gae;
+ _gl[2*ix+9 ] = gve-gae;
+ _gr[2*ix+10] = gvv+gav;
+ _gl[2*ix+10] = gvv-gav;
+ }
+ // light top
+ _gr[6] = gvtll+gatll;
+ _gl[6] = gvtll-gatll;
+ // mixed top
+ _gr[7] = gvtlh+gatlh;
+ _gl[7] = gvtlh-gatlh;
+ // heavy top
+ _gr[8] = gvthh+gathh;
+ _gl[8] = gvthh-gathh;
+}
+
+// coupling for FFP vertex
+void LHFFPVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) {
+ int iferm=abs(a->id());
+ assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)||iferm==8);
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = -electroMagneticCoupling(q2);
+ _q2last=q2;
+ }
+ norm(_couplast);
+ // the left and right couplings
+ // photon
+ if(c->id()==ParticleID::gamma) {
+ left (_charge[iferm]);
+ right(_charge[iferm]);
+ }
+ // heavy photon
+ else {
+ assert(c->id()==32);
+ int ianti = abs(b->id());
+ if(ianti==iferm) {
+ left (_gl[iferm]);
+ right(_gr[iferm]);
+ }
+ else {
+ left (_gl[7]);
+ right(_gr[7]);
+ }
+ }
+}
diff --git a/Models/LH/LHFFPVertex.h b/Models/LH/LHFFPVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFPVertex.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHFFPVertex_H
+#define HERWIG_LHFFPVertex_H
+//
+// This is the declaration of the LHFFPVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+#include "LHModel.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHFFPVertex class implements the couplings of the fermions,
+ * both of the Standard Model and the additional heavy top to the
+ * photon and \f$A_H\f$ bosons in the Little Higgs model.
+ */
+class LHFFPVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHFFPVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /** @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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHFFPVertex & operator=(const LHFFPVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The charge of the Standard Model fermions.
+ */
+ vector<double> _charge;
+
+ /**
+ * The last value of the coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+
+ /**
+ * Left couplings for the heavy photon
+ */
+ vector<double> _gl;
+
+ /**
+ * Right couplings for the heavy photon
+ */
+ vector<double> _gr;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHFFPVertex_H */
diff --git a/Models/LH/LHFFWVertex.cc b/Models/LH/LHFFWVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFWVertex.cc
@@ -0,0 +1,180 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHFFWVertex class.
+//
+
+#include "LHFFWVertex.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "Herwig++/Models/StandardModel/StandardCKM.h"
+
+using namespace Herwig;
+
+LHFFWVertex::LHFFWVertex()
+ : _ckm(3,vector<Complex>(3,0.0)), _couplast(0.), _q2last(0.*GeV2),
+ _corrL(0.),_corrH(0.),_tcorrL(0.),_tcorrH(0.),_tHcorrL(0.), _tHcorrH(0.) {
+ // order of vertex in couplings
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHFFWVertex::persistentOutput(PersistentOStream & os) const {
+ os << _ckm << _corrL << _corrH << _tcorrL << _tcorrH << _tHcorrL << _tHcorrH;
+}
+
+void LHFFWVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _ckm >> _corrL >> _corrH >> _tcorrL >> _tcorrH >> _tHcorrL >> _tHcorrH;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHFFWVertex,FFVVertex>
+describeHerwigLHFFWVertex("Herwig::LHFFWVertex", "HwLHModel.so");
+
+void LHFFWVertex::Init() {
+
+ static ClassDocumentation<LHFFWVertex> documentation
+ ("The LHFFWVertex class implements the vertices for"
+ " the coupling of the W and heavy W to the Standard Model "
+ "fermions and the heavy top quark in the Little Higgs model");
+
+}
+
+void LHFFWVertex::doinit() {
+ // particles for outgoing W-
+ // quarks
+ for(int ix=1;ix<6;ix+=2) {
+ for(int iy=2;iy<7;iy+=2) {
+ addToList(-ix, iy, -24);
+ addToList(-ix, iy, -34);
+ }
+ }
+ // leptons
+ for(int ix=11;ix<17;ix+=2) {
+ addToList(-ix, ix+1, -24);
+ addToList(-ix, ix+1, -34);
+ }
+ // particles for outgoing W+
+ // quarks
+ for(int ix=2;ix<7;ix+=2) {
+ for(int iy=1;iy<6;iy+=2) {
+ addToList(-ix, iy, 24);
+ addToList(-ix, iy, 34);
+ }
+ }
+ // leptons
+ for(int ix=11;ix<17;ix+=2) {
+ addToList(-ix-1, ix, 24);
+ addToList(-ix-1, ix, 34);
+ }
+ // couplings to new heavy quark
+ addToList(-5, 8, -24);
+ addToList(-5, 8, -34);
+ addToList(-8, 5, 24);
+ addToList(-8, 5, 34);
+ ThePEG::Helicity::FFVVertex::doinit();
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHFFWVertex::doinit()"
+ << Exception::runerror;
+ // cast the CKM object to the HERWIG one
+ ThePEG::Ptr<Herwig::StandardCKM>::transient_const_pointer
+ hwCKM=ThePEG::dynamic_ptr_cast< ThePEG::Ptr<Herwig::StandardCKM>::
+ transient_const_pointer>(generator()->standardModel()->CKM());
+ if(!hwCKM)
+ throw InitException() << "Must have access to the Herwig::StandardCKM object"
+ << "for the CKM matrix in LHFFWVertex::doinit()"
+ << Exception::runerror;
+ _ckm = hwCKM->getUnsquaredMatrix(model->families());
+ // compute the correction factors
+ double s2(sqr(model->sinTheta())),c2(sqr(model->cosTheta()));
+ double vf(model->vev()/model->f());
+ double xL = sqr(model->lambda1())/(sqr(model->lambda1())+sqr(model->lambda2()));
+ // from Table VIII with -sign to agree with our SM conventions
+ _corrL = 1.-0.5*sqr(vf)*c2*(c2-s2);
+ _corrH = -model->cosTheta()/model->sinTheta();
+ _tcorrL = 1.-0.5*sqr(vf)*(c2*(c2-s2)+sqr(xL));
+ _tcorrH = -model->cosTheta()/model->sinTheta();
+ _tHcorrL = -vf*xL;
+ _tHcorrH = vf*xL*model->cosTheta()/model->sinTheta();
+}
+
+void LHFFWVertex::setCoupling(Energy2 q2, tcPDPtr a,
+ tcPDPtr b, tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = -sqrt(0.5)*weakCoupling(q2);
+ _q2last=q2;
+ }
+ norm(_couplast);
+ right(0.);
+ // the left and right couplings
+ int iferm=abs(a->id());
+ int ianti=abs(b->id());
+ bool heavy(false);
+ if(iferm==8) {
+ iferm = 6;
+ heavy = true;
+ }
+ if(ianti==8) {
+ ianti = 6;
+ heavy = true;
+ }
+ // quarks
+ if(iferm>=1 && iferm <=6) {
+ int iu,id;
+ // up type first
+ if(iferm%2==0) {
+ iu = iferm/2;
+ id = (ianti+1)/2;
+ }
+ // down type first
+ else {
+ iu = ianti/2;
+ id = (iferm+1)/2;
+ }
+ assert( iu>=1 && iu<=3 && id>=1 && id<=3);
+ left(_ckm[iu-1][id-1]);
+ }
+ // leptons
+ else if(iferm>=11 && iferm <=16) {
+ left(1.);
+ }
+ else assert(false);
+ // correction factors
+ // light W
+ if(abs(c->id())==ParticleID::Wplus) {
+ // light quarks or leptons
+ if(iferm<6&&ianti<6) {
+ left(_corrL*left());
+ }
+ // light top quark
+ else if(!heavy) {
+ left(_tcorrL*left());
+ }
+ // heavy top quark
+ else {
+ left(_tHcorrL*left());
+ }
+ }
+ // heavy W
+ else {
+ // light quarks or leptons
+ if(iferm<6&&ianti<6) {
+ left(_corrH*left());
+ }
+ // light top quark
+ else if(!heavy) {
+ left(_tcorrH*left());
+ }
+ // heavy top quark
+ else {
+ left(_tHcorrH*left());
+ }
+ }
+}
diff --git a/Models/LH/LHFFWVertex.h b/Models/LH/LHFFWVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFWVertex.h
@@ -0,0 +1,155 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHFFWVertex_H
+#define HERWIG_LHFFWVertex_H
+//
+// This is the declaration of the LHFFWVertex class.
+//
+
+#include "LHModel.h"
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHFFWVertex class implements the couplings of the fermions, both of
+ * the Standard Model and the additional heavy top, to the \f$W^\pm\f$ and
+ * \f$W_H^\pm\f$ bosons in the Little Higgs model.
+ */
+class LHFFWVertex: public ThePEG::Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHFFWVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /** @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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHFFWVertex & operator=(const LHFFWVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The elements of the CKM matrix.
+ */
+ vector<vector<Complex> > _ckm;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+
+ /**
+ * The correction factor for the Standard Model pieces
+ */
+ double _corrL;
+
+ /**
+ * The correction factor for the heavy W
+ */
+ double _corrH;
+
+ /**
+ * The correction factor for the top quark pieces for the SM W
+ */
+ double _tcorrL;
+
+ /**
+ * The correction factor for the top quark pieces for the heavy W
+ */
+ double _tcorrH;
+
+ /**
+ * The correction factor for the coupling of the heavy top and SM W
+ */
+ double _tHcorrL;
+
+ /**
+ * The correction factor for the coupling of the heavy top and the heavy W
+ */
+ double _tHcorrH;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHFFWVertex_H */
diff --git a/Models/LH/LHFFZVertex.cc b/Models/LH/LHFFZVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFZVertex.cc
@@ -0,0 +1,181 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHFFZVertex class.
+//
+
+#include "LHFFZVertex.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void LHFFZVertex::persistentOutput(PersistentOStream & os) const {
+ os << _gl << _gr << _glH << _grH;
+}
+
+void LHFFZVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _gl >> _gr >> _glH >> _grH;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHFFZVertex,FFVVertex>
+describeHerwigLHFFZVertex("Herwig::LHFFZVertex", "HwLHModel.so");
+
+void LHFFZVertex::Init() {
+
+ static ClassDocumentation<LHFFZVertex> documentation
+ ("The LHFFZVertex class implements the couplings of the Z and Z_H in"
+ " the Little Higgs model to the fermions, both of the Standard Model"
+ " and the additional heavy top.");
+
+}
+
+LHFFZVertex::LHFFZVertex() : _couplast(0.0), _q2last(0.*GeV2) {
+ // set order in the couplings
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHFFZVertex::doinit() {
+ for(int ib=23;ib<34;ib+=10) {
+ // the quarks
+ for(int ix=1;ix<7;++ix) {
+ addToList(-ix, ix, ib);
+ }
+ addToList( -8, 8, ib);
+ addToList( -6, 8, ib);
+ addToList( -8, 6, ib);
+ // the leptons
+ for(int ix=11;ix<17;++ix) {
+ addToList(-ix, ix, ib);
+ }
+ }
+ FFVVertex::doinit();
+ cLHModelPtr model = dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the LHModel "
+ << " in LHFFZVertex::doinit()"
+ << Exception::runerror;
+ double sw2(sin2ThetaW());
+ double sw(sqrt(sw2)),cw(sqrt(1.-sw2));
+ double pre =-0.5/sw/cw;
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double sp2(sqr(sp)),cp2(sqr(cp));
+ // from Eqn A35
+ double xW(-0.5/cw*s*c*(sqr(c)-sqr(s)));
+ double xB(-2.5/sw*sp*cp*(cp2-sp2));
+ double yu = -0.4, ye = 0.6;
+ double vf(model->vev()/model->f());
+ double xL(sqr(model->lambda1())/(sqr(model->lambda1())+sqr(model->lambda2())));
+ double vu = pre*( 0.5-4./3.*sw2-sqr(vf)*(+0.5*cw*xW*c/s
+ +sw*xB/sp/cp*(2.*yu+7./15. -cp2/6.)));
+ double vd = pre*(-0.5+2./3.*sw2-sqr(vf)*(-0.5*cw*xW*c/s
+ +sw*xB/sp/cp*(2.*yu+11./15. +cp2/6.)));
+ double ve = pre*(-0.5+2.* sw2-sqr(vf)*(-0.5*cw*xW*c/s
+ +sw*xB/sp/cp*(2.*ye-9./5. +1.5*cp2)));
+ double vv = pre*(+0.5 -sqr(vf)*(+0.5*cw*xW*c/s
+ +sw*xB/sp/cp*( ye-4./5. +0.5*cp2)));
+ double au = pre*(-0.5-sqr(vf)*(-0.5*cw*xW*c/s+sw*xB/sp/cp*(0.2-0.5*cp2)));
+ double ad = pre*( 0.5-sqr(vf)*(+0.5*cw*xW*c/s-sw*xB/sp/cp*(0.2-0.5*cp2)));
+ double ae = pre*( 0.5-sqr(vf)*(+0.5*cw*xW*c/s-sw*xB/sp/cp*(0.2-0.5*cp2)));
+ double av = pre*(-0.5-sqr(vf)*(-0.5*cw*xW*c/s+sw*xB/sp/cp*(0.2-0.5*cp2)));
+ double vtl = pre*( 0.5-4./3.*sw2-sqr(vf)*(-0.5*sqr(xL)+0.5*cw*xW*c/s
+ +sw*xB/sp/cp*(2.*yu+9./5.-1.5*cp2
+ +(7./15.-2.*cp2/3.)*xL)));
+ double atl = pre*(-0.5 -sqr(vf)*(+0.5*sqr(xL)-0.5*cw*xW*c/s
+ +sw*xB/sp/cp*(+0.2-0.5*cp2-0.2*xL)));
+ double vth = 2./3.*sw/cw;
+ double ath = 0.;
+ double vtm = 0.25*xL*vf/cw/sw;
+ double atm = -vtm;
+ _gl.resize(17);
+ _gr.resize(17);
+ for(unsigned ix=1;ix<4;++ix) {
+ _gl[2*ix-1] = vd - ad;
+ _gl[2*ix ] = vu - au;
+ _gl[2*ix+9 ] = ve - ae;
+ _gl[2*ix+10] = vv - av;
+ _gr[2*ix-1] = vd + ad;
+ _gr[2*ix ] = vu + au;
+ _gr[2*ix+9 ] = ve + ae;
+ _gr[2*ix+10] = vv + av;
+ }
+ _gl[6] = vtl - atl;
+ _gr[6] = vtl + atl;
+ _gl[7] = vtm - atm;
+ _gr[7] = vtm + atm;
+ _gl[8] = vth - ath;
+ _gr[8] = vth + ath;
+ // heavy Z
+ double fact = 0.25*c/s/sw;
+ vu = fact;
+ vd = -fact;
+ ve = -fact;
+ vv = fact;
+ au = -fact;
+ ad = fact;
+ ae = fact;
+ av = -fact;
+ vtl = fact;
+ atl = -fact;
+ vth = 0.;
+ ath = 0.;
+ vtm = -0.25*xL*vf*c/s/sw;
+ atm = -vtm;
+ _glH.resize(17);
+ _grH.resize(17);
+ for(unsigned ix=1;ix<4;++ix) {
+ _glH[2*ix-1] = vd - ad;
+ _glH[2*ix ] = vu - au;
+ _glH[2*ix+9 ] = ve - ae;
+ _glH[2*ix+10] = vv - av;
+ _grH[2*ix-1] = vd + ad;
+ _grH[2*ix ] = vu + au;
+ _grH[2*ix+9 ] = ve + ae;
+ _grH[2*ix+10] = vv + av;
+ }
+ _glH[6] = vtl - atl;
+ _grH[6] = vtl + atl;
+ _glH[7] = vtm - atm;
+ _grH[7] = vtm + atm;
+ _glH[8] = vth - ath;
+ _grH[8] = vth + ath;
+}
+
+void LHFFZVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = electroMagneticCoupling(q2);
+ _q2last=q2;
+ }
+ norm(_couplast);
+ // the left and right couplings
+ int iferm = abs(a->id());
+ int ianti = abs(b->id());
+ assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)|| iferm == 8);
+ // Z0
+ if(c->id()==ParticleID::Z0) {
+ if(ianti==iferm) {
+ left (_gl[iferm]);
+ right(_gr[iferm]);
+ }
+ else {
+ left (_gl[7]);
+ right(_gr[7]);
+ }
+ }
+ else {
+ if(ianti==iferm) {
+ left (_glH[iferm]);
+ right(_grH[iferm]);
+ }
+ else {
+ left (_glH[7]);
+ right(_grH[7]);
+ }
+ }
+}
diff --git a/Models/LH/LHFFZVertex.h b/Models/LH/LHFFZVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHFFZVertex.h
@@ -0,0 +1,137 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHFFZVertex_H
+#define HERWIG_LHFFZVertex_H
+//
+// This is the declaration of the LHFFZVertex class.
+//
+
+#include "LHModel.h"
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+/**
+ * The LHFFZVertex class implements the couplings of the fermion,
+ * both of the Standard Model and the additional heavy top to the
+ * \f$Z^0\f$ and \f$Z_H\f$ bosons in the Little Higgs model.
+ */
+class LHFFZVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHFFZVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /** @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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHFFZVertex & operator=(const LHFFZVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The left couplings of the Standard Model fermions to the Z.
+ */
+ vector<double> _gl;
+
+ /**
+ * The right couplings of the Standard Model fermions to the Z.
+ */
+ vector<double> _gr;
+
+ /**
+ * The left couplings of the Standard Model fermions to the heavy Z.
+ */
+ vector<double> _glH;
+
+ /**
+ * The right couplings of the Standard Model fermions to the heavy Z.
+ */
+ vector<double> _grH;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHFFZVertex_H */
diff --git a/Models/LH/LHModel.cc b/Models/LH/LHModel.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHModel.cc
@@ -0,0 +1,158 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHModel class.
+//
+
+#include "LHModel.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/Switch.h"
+#include "ThePEG/Interface/Parameter.h"
+#include "ThePEG/Interface/Reference.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHModel::LHModel()
+ : _cott(1.), _tantp(1.),
+ _v(246.*GeV), _lamratio(1.), _mH(120.*GeV), _vacratio(0.05),
+ _f(3.*TeV), _lambda1(0.), _lambda2(0.),
+ _s(0.), _c(0.), _sp(0.), _cp(0.)
+{}
+
+void LHModel::persistentOutput(PersistentOStream & os) const {
+ os << _cott << _tantp << ounit(_v,GeV) << _lamratio
+ << ounit(_mH,GeV) << _vacratio << ounit(_f,GeV)
+ << _s0 << _c0 << _sP << _cP << _sPlus << _cPlus
+ << _lambda1 << _lambda2 << _s << _c << _sp << _cp
+ << WHHVertex_;
+}
+
+void LHModel::persistentInput(PersistentIStream & is, int) {
+ is >> _cott >> _tantp >> iunit(_v,GeV) >> _lamratio
+ >> iunit(_mH,GeV) >> _vacratio >> iunit(_f,GeV)
+ >> _s0 >> _c0 >> _sP >> _cP >> _sPlus >> _cPlus
+ >> _lambda1 >> _lambda2 >> _s >> _c >> _sp >> _cp
+ >> WHHVertex_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHModel,StandardModel>
+describeThePEGLHModel("Herwig::LHModel", "HwLHModel.so");
+
+void LHModel::Init() {
+
+ static ClassDocumentation<LHModel> documentation
+ ("The LHModel class");
+
+ static Parameter<LHModel,double> interfaceCotTheta
+ ("CotTheta",
+ "The cotangent of the theta mixing angle",
+ &LHModel::_cott, 1.0, 0.1, 10.,
+ false, false, Interface::limited);
+
+ static Parameter<LHModel,double> interfaceTanThetaPrime
+ ("TanThetaPrime",
+ "The tangent of the theta' mixing angle",
+ &LHModel::_tantp, 1.0, 0.1, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<LHModel,Energy> interfacef
+ ("f",
+ "The scale of the non-linear sigma-model",
+ &LHModel::_f, TeV, 3.*TeV, 0.0*TeV, 100.0*TeV,
+ true, false, Interface::limited);
+
+ static Parameter<LHModel,double> interfaceLambdaRatio
+ ("LambdaRatio",
+ "The ratio lambda_1/lambda_2 of the top Yukawa couplings.",
+ &LHModel::_lamratio, 1.0, 0.01, 100.,
+ false, false, Interface::limited);
+
+ static Parameter<LHModel,double> interfaceVEVRatio
+ ("VEVRatio",
+ "The ratio of the vacuum expection values v'/v",
+ &LHModel::_vacratio, 0.05, 0.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<LHModel,Energy> interfacemH
+ ("mH",
+ "The mass of the lightest Higgs",
+ &LHModel::_mH, GeV, 120.0*GeV, 100.0*GeV, 1000.0*GeV,
+ false, false, Interface::limited);
+
+ static Reference<LHModel,AbstractVSSVertex> interfaceVertexWHH
+ ("Vertex/WHH",
+ "Pointer to the WHH vertex",
+ &LHModel::WHHVertex_, false, false, true, false, false);
+
+}
+
+void LHModel::doinit() {
+ // stuff from the base class
+ StandardModel::doinit();
+ // compute the parameters of the model
+ // W and Z masses
+ Energy mw(getParticleData(ParticleID::Wplus)->mass());
+ Energy mz(getParticleData(ParticleID::Z0) ->mass());
+ // SM couplings
+ double e = sqrt(4.*Constants::pi*alphaEM(sqr(mz)));
+ double sw2(sin2ThetaW()),cw2(1.-sin2ThetaW());
+ double g = e/sqrt(sw2);
+ double gp = e/sqrt(cw2);
+ // vev
+ _v = 2.*mw/g;
+ // cos and sin of mixing angles
+ double theta (atan(1./_cott));
+ _c = cos(theta );
+ _s = sin(theta );
+ double thetap(atan(_tantp ));
+ _cp = cos(thetap);
+ _sp = sin(thetap);
+ // xH (Eqn A35)
+ double xH = 2.5*g*gp*_s*_c*_sp*_cp*(sqr(_c*_sp)+sqr(_s*_cp))/
+ (5.*sqr(g*_sp*_cp)-sqr(gp*_s*_c));
+ double vf(sqr(_v/_f));
+ // masses of the neutral gauge bosons (Eqn 21,22,A37)
+ Energy2 MAH2 = sqr(mz)*sw2*(0.2/sqr(_sp*_cp)/vf-1.+0.25*xH*cw2/sqr(_s*_c)/sw2);
+ Energy2 MZH2 = sqr(mw)*(1./sqr(_s*_c)/vf-1.-xH*sw2/sqr(_sp*_cp)/cw2);
+ // mass of the heavy charged gauge boson (Eqn. 19/A33)
+ Energy2 MWH2 = sqr(mw)*(1./sqr(_s*_c)/vf-1.);
+ // top and heavy top yukawas (from Eqns 26,27)
+ Energy mt = getParticleData(ParticleID::t)->mass();
+ Energy MT = _f/_v*(1.+sqr(_lamratio))/_lamratio*mt;
+ _lambda2 = MT/sqrt(1.+sqr(_lamratio))/_f;
+ _lambda1 = _lamratio*_lambda2;
+ // masses of the Higgs bosons (Eqns 12 and 13)
+ double r = 8.*_f/_v*_vacratio;
+ double lamh = 2.*sqr(_mH/_v)/(1.-0.25*sqr(r));
+ if(lamh<0.) {
+ throw Exception() << "Higgs trilinear coupling negative, reduce f or v'\n"
+ << Exception::runerror;
+ }
+ Energy2 MPhi2 = lamh*sqr(_f);
+ // from Eqn A27
+ _sP = 2.*sqrt(2.)*_vacratio;
+ _cP = 1.-4.*sqr(_vacratio);
+ _sPlus = 2.*_vacratio;
+ _cPlus = 1.-2.*sqr(_vacratio);
+ // from Eqn A28
+ _s0 = 2.*sqrt(2.)*_vacratio;
+ _c0 = 1.-4.*sqr(_vacratio);
+ // set the masses of the new particles
+ resetMass( 32,sqrt(MAH2));
+ resetMass( 33,sqrt(MZH2));
+ resetMass( 34,sqrt(MWH2));
+ resetMass(-34,sqrt(MWH2));
+ resetMass( 8,MT);
+ resetMass( -8,MT);
+ resetMass( 35,sqrt(MPhi2));
+ resetMass( 36,sqrt(MPhi2));
+ resetMass( 37,sqrt(MPhi2));
+ resetMass(-37,sqrt(MPhi2));
+ resetMass( 38,sqrt(MPhi2));
+ resetMass(-38,sqrt(MPhi2));
+}
diff --git a/Models/LH/LHModel.fh b/Models/LH/LHModel.fh
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHModel.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHModel class.
+//
+#ifndef HERWIG_LHModel_FH
+#define HERWIG_LHModel_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHModel;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHModel,LHModelPtr);
+
+}
+
+#endif
diff --git a/Models/LH/LHModel.h b/Models/LH/LHModel.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHModel.h
@@ -0,0 +1,289 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHModel_H
+#define HERWIG_LHModel_H
+//
+// This is the declaration of the LHModel class.
+//
+
+#include "Herwig++/Models/StandardModel/StandardModel.h"
+#include "ThePEG/Helicity/Vertex/AbstractVSSVertex.h"
+#include "ThePEG/Helicity/Vertex/AbstractVVSSVertex.h"
+#include "LHModel.fh"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHModel class is the main class for the implementation of the Little Higgs model in Herwig++.
+ * In inherits from the StandardModel class and implements the calcuation of the couplings
+ * and masses in the Little Higgs model and storage of the additional couplings.
+ *
+ * @see \ref LHModelInterfaces "The interfaces"
+ * defined for LHModel.
+ */
+class LHModel: public StandardModel {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHModel();
+
+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();
+
+public:
+
+ /**
+ * Access to the parameters of the model
+ */
+ //@{
+ /**
+ * The \f$\lambda_1\f$ top Yukawa coupling
+ */
+ double lambda1() const {return _lambda1;}
+
+ /**
+ * The \f$\lambda_2\f$ top Yukawa coupling
+ */
+ double lambda2() const {return _lambda2;}
+
+ /**
+ * The sine of the \f$\theta\f$ mixing angle
+ */
+ double sinTheta() const {return _s;}
+
+ /**
+ * The cosine of the \f$\theta\f$ mixing angle
+ */
+ double cosTheta() const {return _c;}
+
+ /**
+ * The sine of the \f$\theta'\f$ mixing angle
+ */
+ double sinThetaPrime() const {return _sp;}
+
+ /**
+ * The cosine of the \f$\theta'\f$ mixing angle
+ */
+ double cosThetaPrime() const {return _cp;}
+
+ /**
+ * The sine of the Higgs mixing angle
+ */
+ double sinTheta0() const {return _s0;}
+
+ /**
+ * The cosine of the Higgs mixing angle
+ */
+ double cosTheta0() const {return _c0;}
+
+ /**
+ * The sine of the pseudoscalar Higgs mixing angle
+ */
+ double sinThetaP() const {return _sP;}
+
+ /**
+ * The cosine of the pseudoscalar Higgs mixing angle
+ */
+ double cosThetaP() const {return _cP;}
+
+ /**
+ * The sine of the charged Higgs mixing angle
+ */
+ double sinThetaPlus() const {return _sPlus;}
+
+ /**
+ * The cosine of the charged Higgs mixing angle
+ */
+ double cosThetaPlus() const {return _cPlus;}
+
+ /**
+ * The vacuum expection value
+ */
+ Energy vev() const {return _v;}
+
+ /**
+ * The vacuum expection value
+ */
+ Energy vevPrime() const {return _v*_vacratio;}
+
+ /**
+ * The \f$f\f$ scale of the non-linear \f$\sigma\f$-model
+ */
+ Energy f() const {return _f;}
+ //@}
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHModel & operator=(const LHModel &);
+
+private:
+
+ /**
+ * Parameters for the model
+ */
+ //@{
+ /**
+ * The value of \f$\cot\theta\f$ for the mixing with the \f$g\f$ coupling
+ */
+ double _cott;
+
+ /**
+ * The value of \f$\tan\theta'\f$ for the mixing with the \f$g'\f$ coupling
+ */
+ double _tantp;
+
+ /**
+ * The vacuum expection valve
+ */
+ Energy _v;
+
+ /**
+ * The ratio \f$\lambda_2/\lambda_1\f$
+ */
+ double _lamratio;
+
+ /**
+ * The mass of the lightest Higgs boson
+ */
+ Energy _mH;
+
+ /**
+ * The ratio of the vacuum exception values \f$v'/v\f$
+ */
+ double _vacratio;
+
+ /**
+ * The scale for the non-linear \f$\sigma\f$-model
+ */
+ Energy _f;
+
+ /**
+ * The top Yukawa couplings
+ */
+ double _lambda1,_lambda2;
+
+ /**
+ * The sine of the \f$\theta\f$ mixing angle
+ */
+ double _s;
+
+ /**
+ * The cosine of the \f$\theta\f$ mixing angle
+ */
+ double _c;
+
+ /**
+ * The sine of the \f$\theta'\f$ mixing angle
+ */
+ double _sp;
+
+ /**
+ * The cosine of the \f$\theta'\f$ mixing angle
+ */
+ double _cp;
+
+ /**
+ * The sine of the Higgs mixing angle
+ */
+ double _s0;
+
+ /**
+ * The cosine of the Higgs mixing angle
+ */
+ double _c0;
+
+ /**
+ * The sine of the pseudoscalar Higgs mixing angle
+ */
+ double _sP;
+
+ /**
+ * The cosine of the pseudoscalar Higgs mixing angle
+ */
+ double _cP;
+
+ /**
+ * The sine of the charged Higgs mixing angle
+ */
+ double _sPlus;
+
+ /**
+ * The cosine of the charged Higgs mixing angle
+ */
+ double _cPlus;
+ //@}
+
+ /**
+ * Additional vertices
+ */
+ //@{
+ /**
+ * WHH Vertex
+ */
+ AbstractVSSVertexPtr WHHVertex_;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHModel_H */
diff --git a/Models/LH/LHWHHVertex.cc b/Models/LH/LHWHHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWHHVertex.cc
@@ -0,0 +1,286 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHWHHVertex class.
+//
+
+#include "LHWHHVertex.h"
+#include "LHModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHWHHVertex::LHWHHVertex() :
+ couplast_(0.), q2last_(ZERO), coup_(24) {
+ orderInGs(0);
+ orderInGem(1);
+ // neutral
+ addToList( 22, 37,-37);
+ addToList( 22, 38,-38);
+ addToList( 32, 37,-37);
+ addToList( 32, 38,-38);
+ addToList( 23, 37,-37);
+ addToList( 23, 38,-38);
+ addToList( 33, 37,-37);
+ addToList( 33, 38,-38);
+ addToList( 32, 25, 36);
+ addToList( 32, 35, 36);
+ addToList( 23, 25, 36);
+ addToList( 23, 35, 36);
+ addToList( 33, 25, 36);
+ addToList( 33, 35, 36);
+ // W+
+ addToList( 24, 25,-37);
+ addToList( 24, 35,-37);
+ addToList( 24, 36,-37);
+ addToList( 24, 37,-38);
+ addToList( 34, 25,-37);
+ addToList( 34, 35,-37);
+ addToList( 34, 36,-37);
+ addToList( 34, 37,-38);
+ // W-
+ addToList(-24, 25, 37);
+ addToList(-24, 35, 37);
+ addToList(-24, 36, 37);
+ addToList(-24,-37, 38);
+ addToList(-34, 25, 37);
+ addToList(-34, 35, 37);
+ addToList(-34, 36, 37);
+ addToList(-34,-37, 38);
+}
+
+IBPtr LHWHHVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHWHHVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHWHHVertex::persistentOutput(PersistentOStream & os) const {
+ os << coup_;
+}
+
+void LHWHHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> coup_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHWHHVertex,VSSVertex>
+describeHerwigLHWHHVertex("Herwig::LHWHHVertex", "HwLHModel.so");
+
+void LHWHHVertex::Init() {
+
+ static ClassDocumentation<LHWHHVertex> documentation
+ ("The LHWHHVertex class implements the coupling of a pair of Higgs"
+ " bosons to an electroweak gauge boson in the Little Higgs model.");
+
+}
+
+void LHWHHVertex::doinit() {
+ VSSVertex::doinit();
+ // model
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHWWWWVertex::doinit()"
+ << Exception::runerror;
+ double sw2(sin2ThetaW());
+ double sw(sqrt(sw2)),cw(sqrt(1.-sw2));
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double s0 (model->sinTheta0());
+ double sP (model->sinThetaP());
+ double sPlus(model->sinThetaPlus());
+ coup_[ 0] = 0.5/sw*(sqrt(2.)*s0-sPlus);
+ coup_[ 1] = sqrt(0.5)/sw;
+ coup_[ 2] = Complex(0.,1.)/sw*sqrt(0.5);
+ coup_[ 3] = 1./sw;
+ coup_[ 4] = 0.;
+ coup_[ 5] = 0.;
+ coup_[ 6] = 1.;
+ coup_[ 7] = 2.;
+ coup_[ 8] = Complex(0.,0.5)/cw/sw*(sP-2.*s0);
+ coup_[ 9] =-Complex(0.,1.)/cw/sw;
+ coup_[10] =-sw/cw;
+ coup_[11] = (1.-2.*sw2)/cw/sw;
+ coup_[12] =-0.25/sw*(sqr(c)-sqr(s))/s/c*(sqrt(2.)*s0-sPlus);
+ coup_[13] =-sqrt(0.5)/sw*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[14] =-Complex(0.,1.)*sqrt(0.5)*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[15] =-0.5*(sqr(c)-sqr(s))/s/c/sw;
+ coup_[16] =-Complex(0.,0.5)/cw*0.5*(sqr(cp)-sqr(sp))/sp/cp*(sP-2.*s0);
+ coup_[17] = Complex(0.,1.)/cw*0.5*(sqr(cp)-sqr(sp))/sp/cp;
+ coup_[18] =-0.5*(sqr(cp)-sqr(sp))/sp/cp/cw;
+ coup_[19] =-0.5*(sqr(cp)-sqr(sp))/sp/cp/cw;
+ coup_[20] =-Complex(0.,0.5)/sw*0.5*(sqr(c)-sqr(s))/s/c*(sP-2.*s0);
+ coup_[21] = Complex(0.,1.)/sw*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[22] = 0.;
+ coup_[23] =-0.5/sw*(sqr(c)-sqr(s))/s/c;
+}
+
+void LHWHHVertex::setCoupling(Energy2 q2, tcPDPtr particle1,
+ tcPDPtr particle2, tcPDPtr particle3) {
+ if( q2 != q2last_ || couplast_==0.) {
+ q2last_ = q2;
+ couplast_ = electroMagneticCoupling(q2);
+ }
+ int ibos = particle1->id();
+ int isc1 = particle2->id();
+ int isc2 = particle3->id();
+ if(ibos==ParticleID::gamma) {
+ if(isc1==37)
+ norm(coup_[6]*couplast_);
+ else if(isc1==38)
+ norm(coup_[7]*couplast_);
+ else if(isc1==-37)
+ norm(-coup_[6]*couplast_);
+ else if(isc1==-38)
+ norm(-coup_[7]*couplast_);
+ else
+ assert(false);
+ }
+ if(ibos==32) {
+ if(isc1==37)
+ norm(coup_[18]*couplast_);
+ else if(isc1==38)
+ norm(coup_[19]*couplast_);
+ else if(isc1==-37)
+ norm(-coup_[18]*couplast_);
+ else if(isc1==-38)
+ norm(-coup_[19]*couplast_);
+ else if(isc1==25)
+ norm(coup_[16]*couplast_);
+ else if(isc1==35)
+ norm(coup_[17]*couplast_);
+ else if(isc2==25)
+ norm(-coup_[16]*couplast_);
+ else if(isc2==35)
+ norm(-coup_[17]*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Z0) {
+ if(isc1==37)
+ norm(coup_[10]*couplast_);
+ else if(isc1==38)
+ norm(coup_[11]*couplast_);
+ else if(isc1==-37)
+ norm(-coup_[10]*couplast_);
+ else if(isc1==-38)
+ norm(-coup_[11]*couplast_);
+ else if(isc1==25)
+ norm(coup_[8]*couplast_);
+ else if(isc1==35)
+ norm(coup_[9]*couplast_);
+ else if(isc2==25)
+ norm(-coup_[8]*couplast_);
+ else if(isc2==35)
+ norm(-coup_[9]*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==33) {
+ if(isc1==37)
+ norm(coup_[22]*couplast_);
+ else if(isc1==38)
+ norm(coup_[23]*couplast_);
+ else if(isc1==-37)
+ norm(-coup_[22]*couplast_);
+ else if(isc1==-38)
+ norm(-coup_[23]*couplast_);
+ else if(isc1==25)
+ norm(coup_[20]*couplast_);
+ else if(isc1==35)
+ norm(coup_[21]*couplast_);
+ else if(isc2==25)
+ norm(-coup_[20]*couplast_);
+ else if(isc2==35)
+ norm(-coup_[21]*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Wplus) {
+ if(isc1==25)
+ norm(coup_[0]*couplast_);
+ else if(isc1==35)
+ norm(coup_[1]*couplast_);
+ else if(isc1==36)
+ norm(coup_[2]*couplast_);
+ else if(isc1==37)
+ norm(coup_[3]*couplast_);
+ else if(isc2==25)
+ norm(-coup_[0]*couplast_);
+ else if(isc2==35)
+ norm(-coup_[1]*couplast_);
+ else if(isc2==36)
+ norm(-coup_[2]*couplast_);
+ else if(isc2==37)
+ norm(-coup_[3]*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==34) {
+ if(isc1==25)
+ norm(coup_[12]*couplast_);
+ else if(isc1==35)
+ norm(coup_[13]*couplast_);
+ else if(isc1==36)
+ norm(coup_[14]*couplast_);
+ else if(isc1==37)
+ norm(coup_[15]*couplast_);
+ else if(isc2==25)
+ norm(-coup_[12]*couplast_);
+ else if(isc2==35)
+ norm(-coup_[13]*couplast_);
+ else if(isc2==36)
+ norm(-coup_[14]*couplast_);
+ else if(isc2==37)
+ norm(-coup_[15]*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Wminus) {
+ if(isc1==25)
+ norm(conj(coup_[0])*couplast_);
+ else if(isc1==35)
+ norm(conj(coup_[1])*couplast_);
+ else if(isc1==36)
+ norm(conj(coup_[2])*couplast_);
+ else if(isc1==37)
+ norm(conj(coup_[3])*couplast_);
+ else if(isc2==25)
+ norm(-conj(coup_[0])*couplast_);
+ else if(isc2==35)
+ norm(-conj(coup_[1])*couplast_);
+ else if(isc2==36)
+ norm(-conj(coup_[2])*couplast_);
+ else if(isc2==37)
+ norm(-conj(coup_[3])*couplast_);
+ else
+ assert(false);
+ }
+ else if(ibos==-34) {
+ if(isc1==25)
+ norm(conj(coup_[12])*couplast_);
+ else if(isc1==35)
+ norm(conj(coup_[13])*couplast_);
+ else if(isc1==36)
+ norm(conj(coup_[14])*couplast_);
+ else if(isc1==37)
+ norm(conj(coup_[15])*couplast_);
+ else if(isc2==25)
+ norm(-conj(coup_[12])*couplast_);
+ else if(isc2==35)
+ norm(-conj(coup_[13])*couplast_);
+ else if(isc2==36)
+ norm(-conj(coup_[14])*couplast_);
+ else if(isc2==37)
+ norm(-conj(coup_[15])*couplast_);
+ else
+ assert(false);
+ }
+}
diff --git a/Models/LH/LHWHHVertex.h b/Models/LH/LHWHHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWHHVertex.h
@@ -0,0 +1,118 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHWHHVertex_H
+#define HERWIG_LHWHHVertex_H
+//
+// This is the declaration of the LHWHHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/VSSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHWHHVertex class implements the coupling of an electroweak gauge
+ * boson to a pair of Higgs bosons in the Little Higgs model.
+ */
+class LHWHHVertex: public Helicity::VSSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHWHHVertex();
+
+ /** @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();
+
+ /**
+ * Calculate the coupling for the vertex
+ * @param q2 The scale to at which evaluate the coupling.
+ * @param particle1 The first particle in the vertex.
+ * @param particle2 The second particle in the vertex.
+ * @param particle3 The third particle in the vertex.
+ */
+ virtual void setCoupling(Energy2 q2, tcPDPtr particle1, tcPDPtr particle2,
+ tcPDPtr particle3);
+
+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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHWHHVertex & operator=(const LHWHHVertex &);
+
+private:
+
+ /**
+ * The value of the coupling when last evaluated
+ */
+ Complex couplast_;
+
+ /**
+ * The scale at which the coupling was last evaluated.
+ */
+ Energy2 q2last_;
+
+ /**
+ * Couplings
+ */
+ vector<Complex> coup_;
+};
+
+}
+
+#endif /* HERWIG_LHWHHVertex_H */
diff --git a/Models/LH/LHWWHHVertex.cc b/Models/LH/LHWWHHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWHHVertex.cc
@@ -0,0 +1,496 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHWWHHVertex class.
+//
+
+#include "LHWWHHVertex.h"
+#include "LHModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHWWHHVertex::LHWWHHVertex() :
+ couplast_(0.), q2last_(ZERO), coup_(107) {
+ orderInGs(0);
+ orderInGem(2);
+}
+
+IBPtr LHWWHHVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHWWHHVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHWWHHVertex::persistentOutput(PersistentOStream & os) const {
+ os << coup_;
+}
+
+void LHWWHHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> coup_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHWWHHVertex,VVSSVertex>
+describeHerwigLHWWHHVertex("Herwig::LHWWHHVertex", "HwLHModel.so");
+
+void LHWWHHVertex::Init() {
+
+ static ClassDocumentation<LHWWHHVertex> documentation
+ ("The LHWWHHVertex class implements the couplings of a pair"
+ " of electroweak gauge bosons and a pair of Higgs bosons in"
+ " the Little Higgs model.");
+
+}
+
+void LHWWHHVertex::doinit() {
+ // VVHH
+ addToList( 24, -24, 25, 25);
+ addToList( 23, 23, 25, 25);
+ addToList( 24, -34, 25, 25);
+ addToList( 34, -24, 25, 25);
+ addToList( 23, 32, 25, 25);
+ addToList( 34, -34, 25, 25);
+ addToList( 33, 33, 25, 25);
+ addToList( 32, 32, 25, 25);
+ addToList( 23, 33, 25, 25);
+ addToList( 32, 33, 25, 25);
+ // VVH Phi_0
+ addToList( 24, -24, 25, 35);
+ addToList( 23, 23, 25, 35);
+ addToList( 24, -34, 25, 35);
+ addToList( 34, -24, 25, 35);
+ addToList( 23, 32, 25, 35);
+ addToList( 34, -34, 25, 35);
+ addToList( 33, 33, 25, 35);
+ addToList( 32, 32, 25, 35);
+ addToList( 23, 33, 25, 35);
+ addToList( 32, 33, 25, 35);
+ // VV Phi_0 Phi_0
+ addToList( 24, -24, 35, 35);
+ addToList( 23, 23, 35, 35);
+ addToList( 24, -34, 35, 35);
+ addToList( 34, -24, 35, 35);
+ addToList( 23, 32, 35, 35);
+ addToList( 34, -34, 35, 35);
+ addToList( 33, 33, 35, 35);
+ addToList( 32, 32, 35, 35);
+ addToList( 23, 33, 35, 35);
+ addToList( 32, 33, 35, 35);
+ // VV Phi_P Phi_P
+ addToList( 24, -24, 36, 36);
+ addToList( 23, 23, 36, 36);
+ addToList( 24, -34, 36, 36);
+ addToList( 34, -24, 36, 36);
+ addToList( 23, 32, 36, 36);
+ addToList( 34, -34, 36, 36);
+ addToList( 33, 33, 36, 36);
+ addToList( 32, 32, 36, 36);
+ addToList( 23, 33, 36, 36);
+ addToList( 32, 33, 36, 36);
+ // VV Phi+ Phi-
+ addToList( 24, -24, 37, -37);
+ addToList( 23, 23, 37, -37);
+ addToList( 22, 22, 37, -37);
+ addToList( 22, 23, 37, -37);
+ addToList( 24, -34, 37, -37);
+ addToList( 34, -24, 37, -37);
+ addToList( 34, -34, 37, -37);
+ addToList( 33, 33, 37, -37);
+ addToList( 32, 32, 37, -37);
+ addToList( 32, 33, 37, -37);
+ addToList( 22, 32, 37, -37);
+ addToList( 23, 33, 37, -37);
+ addToList( 23, 32, 37, -37);
+ // VV Phi++ Phi--
+ addToList( 24, -24, 38, -38);
+ addToList( 23, 23, 38, -38);
+ addToList( 22, 22, 38, -38);
+ addToList( 22, 23, 38, -38);
+ addToList( 24, -34, 38, -38);
+ addToList( 34, -24, 38, -38);
+ addToList( 34, -34, 38, -38);
+ addToList( 33, 33, 38, -38);
+ addToList( 32, 32, 38, -38);
+ addToList( 32, 33, 38, -38);
+ addToList( 22, 32, 38, -38);
+ addToList( 23, 33, 38, -38);
+ addToList( 23, 32, 38, -38);
+ // VV H phi- + cc
+ addToList( 24, 22, 25, -37);
+ addToList( 24, 23, 25, -37);
+ addToList( 24, 32, 25, -37);
+ addToList( 24, 33, 25, -37);
+ addToList( 34, 22, 25, -37);
+ addToList( 34, 23, 25, -37);
+ addToList( 34, 32, 25, -37);
+ addToList( 34, 33, 25, -37);
+ addToList( -24, 22, 25, 37);
+ addToList( -24, 23, 25, 37);
+ addToList( -24, 32, 25, 37);
+ addToList( -24, 33, 25, 37);
+ addToList( -34, 22, 25, 37);
+ addToList( -34, 23, 25, 37);
+ addToList( -34, 32, 25, 37);
+ addToList( -34, 33, 25, 37);
+ // VV phi0 phi- + cc
+ addToList( 24, 22, 35, -37);
+ addToList( 24, 23, 35, -37);
+ addToList( 24, 32, 35, -37);
+ addToList( 24, 33, 35, -37);
+ addToList( 34, 22, 35, -37);
+ addToList( 34, 23, 35, -37);
+ addToList( 34, 32, 35, -37);
+ addToList( 34, 33, 35, -37);
+ addToList( -24, 22, 35, 37);
+ addToList( -24, 23, 35, 37);
+ addToList( -24, 32, 35, 37);
+ addToList( -24, 33, 35, 37);
+ addToList( -34, 22, 35, 37);
+ addToList( -34, 23, 35, 37);
+ addToList( -34, 32, 35, 37);
+ addToList( -34, 33, 35, 37);
+ // VV phiP phi- + cc
+ addToList( 24, 22, 36, -37);
+ addToList( 24, 23, 36, -37);
+ addToList( 24, 32, 36, -37);
+ addToList( 24, 33, 36, -37);
+ addToList( 34, 22, 36, -37);
+ addToList( 34, 23, 36, -37);
+ addToList( 34, 32, 36, -37);
+ addToList( 34, 33, 36, -37);
+ addToList( -24, 22, 36, 37);
+ addToList( -24, 23, 36, 37);
+ addToList( -24, 32, 36, 37);
+ addToList( -24, 33, 36, 37);
+ addToList( -34, 22, 36, 37);
+ addToList( -34, 23, 36, 37);
+ addToList( -34, 32, 36, 37);
+ addToList( -34, 33, 36, 37);
+ // VV phi+ phi -- + cc
+ addToList( 24, 22, 37, -38);
+ addToList( 24, 23, 37, -38);
+ addToList( 24, 32, 37, -38);
+ addToList( 24, 33, 37, -38);
+ addToList( 34, 22, 37, -38);
+ addToList( 34, 23, 37, -38);
+ addToList( 34, 32, 37, -38);
+ addToList( 34, 33, 37, -38);
+ addToList( -24, 22, -37, 38);
+ addToList( -24, 23, -37, 38);
+ addToList( -24, 32, -37, 38);
+ addToList( -24, 33, -37, 38);
+ addToList( -34, 22, -37, 38);
+ addToList( -34, 23, -37, 38);
+ addToList( -34, 32, -37, 38);
+ addToList( -34, 33, -37, 38);
+ // VV H phi-- + cc
+ addToList( 24, 24, 25, -38);
+ addToList( -24, -24, 25, 38);
+ addToList( 24, 34, 25, -38);
+ addToList( -24, -34, 25, 38);
+ addToList( 34, 34, 25, -38);
+ addToList( -34, -34, 25, 38);
+ // VV phi0 phi-- + cc
+ addToList( 24, 24, 35, -38);
+ addToList( -24, -24, 35, 38);
+ addToList( 24, 34, 35, -38);
+ addToList( -24, -34, 35, 38);
+ addToList( 34, 34, 35, -38);
+ addToList( -34, -34, 35, 38);
+ // VV phiP phi-- + cc
+ addToList( 24, 24, 36, -38);
+ addToList( -24, -24, 36, 38);
+ addToList( 24, 34, 36, -38);
+ addToList( -24, -34, 36, 38);
+ addToList( 34, 34, 36, -38);
+ addToList( -34, -34, 36, 38);
+ VVSSVertex::doinit();
+ // model
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHWWWWVertex::doinit()"
+ << Exception::runerror;
+ double sw2(sin2ThetaW()),cw2(1.-sw2);
+ double sw(sqrt(sw2)),cw(sqrt(cw2));
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double s0 (model->sinTheta0());
+ double sPlus(model->sinThetaPlus());
+ // VV HH
+ coup_[ 0] = 0.5/sw2;
+ coup_[ 1] = 0.5/sw2/cw2;
+ coup_[ 2] = 0.;
+ coup_[ 3] =-0.25/sw2*(sqr(c)-sqr(s))/c/s;
+ coup_[ 4] =-0.25/sw/cw2*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 5] =-0.5/sw2;
+ coup_[ 6] =-0.5/sw2;
+ coup_[ 7] =-0.5/cw2;
+ coup_[ 8] =-0.25/sw2/cw*(sqr(c)-sqr(s))/c/s;
+ coup_[ 9] =-0.25/sw/cw*(sqr(c*sp)+sqr(s*cp))/c/s/sp/cp;
+ // VV H Phi_0
+ coup_[ 10] = 0.5*s0/sw2;
+ coup_[ 11] = 1.5*s0/sw2/cw2;
+ coup_[ 12] = 0.;
+ coup_[ 13] =-0.25/sw2*(sqr(c)-sqr(s))/c/s*s0;
+ coup_[ 14] =-0.75/sw/cw2*(sqr(cp)-sqr(sp))/cp/sp*s0;
+ coup_[ 15] = -0.5/sw2*s0;
+ coup_[ 16] = 0.5/sw2*(1.+sqr(sqr(c)-sqr(s))/sqr(s*c))*s0;
+ coup_[ 17] = 0.5/cw2*(1.+sqr(sqr(cp)-sqr(sp))/sqr(sp*cp))*s0;
+ coup_[ 18] =-0.75/cw/sw2*(sqr(c)-sqr(s))/c/s*s0;
+ coup_[ 19] = 0.25/sw/cw/c/s/sp/cp*((sqr(c*sp)+sqr(s*cp))
+ +2.*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp)))*s0;
+ // VV phi0 phi0
+ coup_[ 20] = 1./sw2;
+ coup_[ 21] = 2./cw2/sw2;
+ coup_[ 22] = 0.;
+ coup_[ 23] =-0.5/sw2*(sqr(c)-sqr(s))/c/s;
+ coup_[ 24] =-1./sw/cw2*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 25] =-1./sw2;
+ coup_[ 26] = 0.5/sw2*sqr(sqr(c)-sqr(s))/sqr(s*c);
+ coup_[ 26] = 0.5/cw2*sqr(sqr(cp)-sqr(sp))/sqr(sp*cp);
+ coup_[ 28] =-1./cw/sw2*(sqr(c)-sqr(s))/c/s;
+ coup_[ 29] = 0.5/cw/sw*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp))/s/c/sp/cp;
+ // VV phi_P phi_P
+ coup_[ 30] = 1./sw2;
+ coup_[ 31] = 2./sw2/cw2;
+ coup_[ 32] = 0.;
+ coup_[ 33] =-0.5/sw2*(sqr(c)-sqr(s))/c/s;
+ coup_[ 34] =-1./sw/cw2*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 35] =-1./sw2;
+ coup_[ 36] = 0.5/sw2*sqr(sqr(c)-sqr(s))/sqr(s*c);
+ coup_[ 37] = 0.5/cw2*sqr(sqr(cp)-sqr(sp))/sqr(sp*cp);
+ coup_[ 38] =-1./cw/sw2*(sqr(c)-sqr(s))/s/c;
+ coup_[ 39] = 0.5/cw/sw*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp))/s/c/sp/cp;
+ // VV phi+ phi-
+ coup_[ 40] = 2./sw2;
+ coup_[ 41] = 2.*sw2/cw2;
+ coup_[ 42] = 2.;
+ coup_[ 43] =-2.*sw/cw;
+ coup_[ 44] =-1./sw2*(sqr(c)-sqr(s))/s/c;
+ coup_[ 45] = 0.;
+ coup_[ 46] = 0.5/sw2*sqr(sqr(c)-sqr(s))/sqr(s*c);
+ coup_[ 47] =-0.5/sw2/sqr(s*c);
+ coup_[ 48] = 0.5/cw2*sqr(sqr(cp)-sqr(sp))/sqr(sp*cp);
+ coup_[ 49] = 0.;
+ coup_[ 50] =-1./cw*(sqr(cp)-sqr(sp))/sp/cp;
+ coup_[ 51] = 0.;
+ coup_[ 52] = sw/cw2*(sqr(cp)-sqr(sp))/sp/cp;
+ // VV phi++ phi--
+ coup_[ 53] = 1./sw2;
+ coup_[ 54] = 2./cw2/sw2*sqr(1.-2.*sw2);
+ coup_[ 55] = 8.;
+ coup_[ 56] = 4./sw/cw*(1.-2.*sw2);
+ coup_[ 57] =-0.5/sw2*(sqr(c)-sqr(s))/s/c;
+ coup_[ 58] = 2./sw*(sqr(c)-sqr(s))/s/c;
+ coup_[ 59] =-1./sw2;
+ coup_[ 60] = 0.5/sw2*sqr(sqr(c)-sqr(s))/sqr(s*c);
+ coup_[ 61] = 0.5/cw2*sqr(sqr(cp)-sqr(sp))/sqr(sp*cp);
+ coup_[ 62] =-0.5/cw/sw*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp))/s/c/sp/cp;
+ coup_[ 63] =-2./cw*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 64] = 1./sw2/cw*(sqr(c )-sqr(s ))/s /c *(1.-2.*sw2);
+ coup_[ 65] =-1./cw2/sw*(sqr(cp)-sqr(sp))/sp/cp*(1.-2.*sw2);
+ // VV h phi-
+ coup_[ 66] =-0.5/sw*(sPlus-sqrt(2.)*s0);
+ coup_[ 67] = 0.5/cw/sw2*(sPlus*sw2-sqrt(2.)*s0*(1.+sw2));
+ coup_[ 68] =-0.25/sw/cw*(sqr(cp)-sqr(sp))/cp/sp*(sPlus-2.*sqrt(2.)*s0);
+ coup_[ 69] = 0.25/sw2*(sqr(c)-sqr(s))/s/c*s0;
+ coup_[ 70] = 0.25/sw*(sqr(c)-sqr(s))/s/c*(sPlus-sqrt(2.)*s0);
+ coup_[ 71] =-0.25/sw2/cw*(sqr(c)-sqr(s))/s/c*(sPlus*sw2-sqrt(2.)*s0*(1.+sw2));
+ coup_[ 72] =-0.25/sw/cw/s/c/sp/cp*(sPlus*(sqr(c*sp)+sqr(s*cp))
+ +sqrt(2.)*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp)));
+ coup_[ 73] =-0.25/sw2*s0*(pow(c,4)+pow(s,4))/sqr(s*c);
+ // VV phi0 phi-
+ coup_[ 74] =-sqrt(0.5)/sw;
+ coup_[ 75] =-sqrt(0.5)/sw2/cw*(1.+sw2);
+ coup_[ 76] = sqrt(0.5)/sw/cw*(sqr(cp)-sqr(sp))/sp/cp;
+ coup_[ 77] = 0.5*sqrt(0.5)/sw2*(sqr(c)-sqr(s))/c/s;
+ coup_[ 78] = 0.5*sqrt(0.5)/sw*(sqr(c)-sqr(s))/c/s;
+ coup_[ 79] = 0.5*sqrt(0.5)/sw2/cw*(sqr(c)-sqr(s))/c/s*(1.+sw2);
+ coup_[ 80] =-0.5*sqrt(0.5)/sw/cw*(sqr(cp)-sqr(sp))/cp/sp*(sqr(c)-sqr(s))/c/s;
+ coup_[ 81] =-0.5*sqrt(0.5)/sw2*(pow(c,4)+pow(s,4))/sqr(s*c);
+ // VV phi+ phi--
+ coup_[ 82] = 3./sw;
+ coup_[ 83] = (1.-3.*sw2)/cw/sw2;
+ coup_[ 84] = 1./sw/cw*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 85] = Complex(0.,1.)*0.5*sqrt(0.5)/sw2*(sqr(c)-sqr(s))/s/c;
+ coup_[ 86] =-3./sw*(sqr(c)-sqr(s))/s/c;
+ coup_[ 87] =-0.5/sw2/cw*(sqr(c)-sqr(s))/s/c*(1.-3.*sw2);
+ coup_[ 88] =-0.5/sw/cw*(sqr(c)-sqr(s))/s/c*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 89] =-Complex(0.,1.)*0.5*sqrt(0.5)/sw2*(pow(c,4)+pow(s,4))/sqr(s*c);
+ // VV phip phi-
+ coup_[ 90] =-Complex(0.,1.)/sw*sqrt(0.5);
+ coup_[ 91] =-Complex(0.,1.)/sw2/cw*(1.+sw2);
+ coup_[ 92] = Complex(0.,1.)/sw/cw*sqrt(0.5)*(sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 93] = Complex(0.,1.)/sw2*sqrt(0.5)*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[ 94] =-Complex(0.,1.)*sqrt(0.5)*0.5/sw*(sqr(c)-sqr(s))/s/c;
+ coup_[ 95] = Complex(0.,1.)*sqrt(0.5)*0.5/sw2/cw*(sqr(c)-sqr(s))/s/c*(1.+sw2);
+ coup_[ 96] =-Complex(0.,1.)*sqrt(0.5)*0.5/sw/cw*(sqr(c )-sqr(s ))/s/c*
+ (sqr(cp)-sqr(sp))/cp/sp;
+ coup_[ 97] =-Complex(0.,1.)/sw2*sqrt(0.5)*0.5*(pow(c,4)+pow(s,4))/sqr(s*c);
+ // VV H phi--
+ coup_[ 98] = sqrt(2.)/sw2*s0;
+ coup_[ 99] =-sqrt(2.)/sw2*0.5*(sqr(c)-sqr(s))/s/c*s0;
+ coup_[100] = sqrt(2.)/sw2*0.5*(pow(c,4)+pow(s,4))/sqr(s*c)*s0;
+ // VV phi0 phi--
+ coup_[101] = sqrt(2.)/sw2;
+ coup_[102] =-sqrt(2.)/sw2*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[103] = sqrt(2.)/sw2*0.5*(pow(c,4)+pow(s,4))/sqr(s*c);
+ // VV phip phi--
+ coup_[104] = Complex(0.,1.)*sqrt(2.)/sw2;
+ coup_[105] =-Complex(0.,1.)*sqrt(2.)/sw2*0.5*(sqr(c)-sqr(s))/s/c;
+ coup_[106] = Complex(0.,1.)*sqrt(2.)/sw2*0.5*(pow(c,4)+pow(s,4))/sqr(s*c);
+}
+
+void LHWWHHVertex::setCoupling(Energy2 q2,
+ tcPDPtr part1,tcPDPtr part2,
+ tcPDPtr part3,tcPDPtr part4) {
+ if( q2 != q2last_ || couplast_==0.) {
+ q2last_ = q2;
+ couplast_ = sqr(electroMagneticCoupling(q2));
+ }
+ int ibos1 = part1->id();
+ int ibos2 = part2->id();
+ int isca1 = part3->id();
+ int isca2 = part4->id();
+ if( isca1 == isca2 ||
+ (isca1==25&&isca2==35) || (isca1==35&&isca2==25)) {
+ unsigned int ioff = 0;
+ if (isca1!=isca2) ioff = 10;
+ else if(isca1==35 ) ioff = 20;
+ else if(isca1==36 ) ioff = 30;
+ if(ibos1==23&&ibos2==23)
+ norm(coup_[1+ioff]*couplast_);
+ else if(ibos1==33&&ibos2==33)
+ norm(coup_[6+ioff]*couplast_);
+ else if(ibos1==33&&ibos2==33)
+ norm(coup_[7+ioff]*couplast_);
+ else if(abs(ibos1)==24&&abs(ibos2)==24)
+ norm(coup_[0+ioff]*couplast_);
+ else if(abs(ibos1)==34&&abs(ibos2)==34)
+ norm(coup_[5+ioff]*couplast_);
+ else if(( abs(ibos1) == 24 && abs(ibos2) == 34) ||
+ ( abs(ibos1) == 34 && abs(ibos2) == 24))
+ norm(coup_[3+ioff]*couplast_);
+ else if(( ibos1 == 23 && ibos2 == 32) ||
+ ( ibos1 == 32 && ibos2 == 23))
+ norm(coup_[4+ioff]*couplast_);
+ else if(( ibos1 == 23 && ibos2 == 33) ||
+ ( ibos1 == 33 && ibos2 == 23))
+ norm(coup_[8+ioff]*couplast_);
+ else if(( ibos1 == 32 && ibos2 == 33) ||
+ ( ibos1 == 33 && ibos2 == 32))
+ norm(coup_[9+ioff]*couplast_);
+ else
+ assert(false);
+ }
+ else if(isca1==-isca2) {
+ unsigned int ioff = abs(isca1) == 37 ? 40 : 53;
+ if(abs(ibos1)==24&&abs(ibos2)==24)
+ norm(coup_[0+ioff]*couplast_);
+ else if(ibos1==23&&ibos2==23)
+ norm(coup_[1+ioff]*couplast_);
+ else if(ibos1==22&&ibos2==22)
+ norm(coup_[2+ioff]*couplast_);
+ else if(( ibos1 == 22 && ibos2 == 23) ||
+ ( ibos1 == 23 && ibos2 == 22))
+ norm(coup_[3+ioff]*couplast_);
+ else if(( abs(ibos1) == 24 && abs(ibos2) == 34) ||
+ ( abs(ibos1) == 34 && abs(ibos2) == 24))
+ norm(coup_[4+ioff]*couplast_);
+ else if(( ibos1 == 22 && ibos2 == 33) ||
+ ( ibos1 == 33 && ibos2 == 22))
+ norm(coup_[5+ioff]*couplast_);
+ else if(abs(ibos1)==34&&abs(ibos2)==34)
+ norm(coup_[6+ioff]*couplast_);
+ else if(ibos1==33&&ibos2==33)
+ norm(coup_[7+ioff]*couplast_);
+ else if(ibos1==32&&ibos2==32)
+ norm(coup_[8+ioff]*couplast_);
+ else if(( ibos1 == 32 && ibos2 == 33) ||
+ ( ibos1 == 33 && ibos2 == 32))
+ norm(coup_[9+ioff]*couplast_);
+ else if(( ibos1 == 22 && ibos2 == 32) ||
+ ( ibos1 == 32 && ibos2 == 22))
+ norm(coup_[10+ioff]*couplast_);
+ else if(( ibos1 == 23 && ibos2 == 33) ||
+ ( ibos1 == 33 && ibos2 == 23))
+ norm(coup_[11+ioff]*couplast_);
+ else if(( ibos1 == 23 && ibos2 == 32) ||
+ ( ibos1 == 32 && ibos2 == 23))
+ norm(coup_[12+ioff]*couplast_);
+ else
+ assert(false);
+ }
+ else if(((abs(ibos1) == 24 || abs(ibos1) == 34) &&
+ (abs(ibos2) != 24 && abs(ibos2) != 34)) ||
+ ((abs(ibos2) == 24 || abs(ibos2) == 34) &&
+ (abs(ibos1) != 24 && abs(ibos1) != 34))) {
+ int iw,ineut;
+ if(abs(ibos1) == 24 || abs(ibos1) == 34) {
+ iw = abs(ibos1);
+ ineut = ibos2;
+ }
+ else {
+ iw = abs(ibos2);
+ ineut = ibos1;
+ }
+ unsigned int ioff = 66;
+ if((isca1 == 35 && abs(isca2) == 37) ||
+ (isca2 == 35 && abs(isca1) == 37)) {
+ ioff += 8;
+ }
+ else if ((abs(isca1) == 37 && abs(isca2) == 38) ||
+ (abs(isca2) == 37 && abs(isca1) == 38)) {
+ ioff += 16;
+ }
+ else if ((isca1 == 35 && abs(isca2) == 37) ||
+ (isca2 == 35 && abs(isca1) == 37)) {
+ ioff += 24;
+ }
+ else
+ assert(false);
+ if(iw==34) ioff += 4;
+ if(ineut==22)
+ norm(coup_[0+ioff]*couplast_);
+ else if(ineut==23)
+ norm(coup_[1+ioff]*couplast_);
+ else if(ineut==32)
+ norm(coup_[2+ioff]*couplast_);
+ else if(ineut==33)
+ norm(coup_[3+ioff]*couplast_);
+ else
+ assert(false);
+ }
+ else {
+ unsigned int ioff = 98;
+ if(isca1==25||isca2==25)
+ ioff += 0;
+ else if(isca1==35||isca2==35)
+ ioff += 3;
+ else if(isca1==36||isca2==36)
+ ioff += 6;
+ else
+ assert(false);
+ if(ibos1==ibos2) {
+ if(abs(ibos1)==24) {
+ norm(coup_[0+ioff]*couplast_);
+ }
+ else if(abs(ibos1)==34) {
+ norm(coup_[1+ioff]*couplast_);
+ }
+ else
+ assert(false);
+ }
+ else {
+ norm(coup_[2+ioff]*couplast_);
+ }
+ }
+}
diff --git a/Models/LH/LHWWHHVertex.h b/Models/LH/LHWWHHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWHHVertex.h
@@ -0,0 +1,121 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHWWHHVertex_H
+#define HERWIG_LHWWHHVertex_H
+//
+// This is the declaration of the LHWWHHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/VVSSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHWWHHVertex class implements the coupling of a pair of
+ * electroweak gauge bosons and a pair of Higgs bosons in the Little Higgs model.
+ */
+class LHWWHHVertex: public Helicity::VVSSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHWWHHVertex();
+
+ /** @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();
+
+ /**
+ * Calculate the couplings. This method is virtual and must be implemented in
+ * classes inheriting from this.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ * @param part4 The ParticleData pointer for the fourth particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3,
+ tcPDPtr part4);
+
+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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHWWHHVertex & operator=(const LHWWHHVertex &);
+
+private:
+
+ /**
+ * The value of the coupling when last evaluated
+ */
+ Complex couplast_;
+
+ /**
+ * The scale at which the coupling was last evaluated.
+ */
+ Energy2 q2last_;
+
+ /**
+ * Couplings
+ */
+ vector<Complex> coup_;
+
+};
+
+}
+
+#endif /* HERWIG_LHWWHHVertex_H */
diff --git a/Models/LH/LHWWHVertex.cc b/Models/LH/LHWWHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWHVertex.cc
@@ -0,0 +1,224 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHWWHVertex class.
+//
+
+#include "LHWWHVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void LHWWHVertex::persistentOutput(PersistentOStream & os) const {
+ os << ounit(_coup,GeV);
+}
+
+void LHWWHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(_coup,GeV);
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHWWHVertex,VVSVertex>
+describeHerwigLHWWHVertex("Herwig::LHWWHVertex", "HwLHModel.so");
+
+void LHWWHVertex::Init() {
+
+ static ClassDocumentation<LHWWHVertex> documentation
+ ("The LHWWHVertex class implements the coupling of two electroweak"
+ " gauge bosons to a Higgs boson in the Little Higgs Model including the "
+ "additional heavy photon, Z and W bosons and the triplet Higgs bosons.");
+
+}
+
+LHWWHVertex::LHWWHVertex()
+ : _couplast(0.), _q2last(0.*GeV2) {
+ // order in the couplings
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHWWHVertex::doinit() {
+ // W_L W_L H
+ addToList( 24, -24, 25);
+ // Z_L Z_L H
+ addToList( 23, 23, 25);
+ // W_L W_H H
+ addToList( 24, -34, 25);
+ addToList( 34, -24, 25);
+ // Z_L A_H H
+ addToList( 23, 32, 25);
+ // W_H W_H H
+ addToList( 34, -34, 25);
+ // Z_H Z_H H
+ addToList( 33, 33, 25);
+ // A_H A_H H
+ addToList( 32, 32, 25);
+ // Z_H Z_L H
+ addToList( 23, 33, 25);
+ // Z_H A_H H
+ addToList( 33, 32, 25);
+ // W_L W_L Phi0
+ addToList( 24, -24, 35);
+ // W_L W_H Phi0
+ addToList( 24, -34, 35);
+ addToList( 34, -24, 35);
+ // Z_L Z_L Phi0
+ addToList( 23, 23, 35);
+ // Z_L Z_H Phi0
+ addToList( 23, 33, 35);
+ // W_H W_H Phi0
+ addToList( 34, -34, 35);
+ // Z_H Z_H Phi0
+ addToList( 33, 33, 35);
+ // A_H Z_H Phi0
+ addToList( 32, 33, 35);
+ // A_H Z_L Phi0
+ addToList( 32, 23, 35);
+ // A_H A_H Phi0
+ addToList( 32, 32, 35);
+ // W_L Z_L Phi-
+ addToList( 24, 23, -37);
+ addToList( -24, 23, 37);
+ // W_L A_H Phi-
+ addToList( 24, 32, -37);
+ addToList( -24, 32, 37);
+ // W_L Z_H Phi-
+ addToList( 24, 33, -37);
+ addToList( -24, 33, 37);
+ // W_H Z_L Phi-
+ addToList( 34, 23, -37);
+ addToList( -34, 23, 37);
+ // W_H A_H Phi-
+ addToList( 34, 32, -37);
+ addToList( -34, 32, 37);
+ // W_H Z_H Phi-
+ addToList( 34, 33, -37);
+ addToList( -34, 33, 37);
+ // W_L W_L Phi--
+ addToList( 24, 24, -38);
+ addToList( -24, -24, 38);
+ // W_H W_H Phi--
+ addToList( 34, 34, -38);
+ addToList( -34, -34, 38);
+ // W_L W_H Phi--
+ addToList( 24, 34, -38);
+ addToList( -24, -34, 38);
+ // model
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the LHModel "
+ << " in LHWWHVertex::doinit()"
+ << Exception::runerror;
+ // base class
+ VVSVertex::doinit();
+ // calculate the couplings for the different combinations of particles
+ double sw(sqrt(sin2ThetaW())),cw(sqrt(1.-sin2ThetaW()));
+ Energy fact = getParticleData(ParticleID::Wplus)->mass()/sw;
+ double vf(sqr(model->vev()/model->f()));
+ double vr(model->vevPrime()/model->vev());
+ double r2(sqrt(2.));
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double sPlus(model->sinTheta0());
+ double s0(model->sinTheta0());
+ _coup.resize(27);
+ // couplings to SM higgs
+ _coup[ 0] = fact *(1.-vf/3.+0.5*vf* sqr(sqr(c)-sqr(s))
+ -0.5*sqr(s0)-2.*r2*s0*vr);
+ _coup[ 1] = fact/sqr(cw)*(1.-vf/3.-0.5*vf*(sqr(sqr(c)-sqr(s))+5.*sqr(sqr(cp)-sqr(sp)))
+ -0.5*sqr(s0)+4.*r2*s0*vr);
+ _coup[ 2] =-fact;
+ _coup[ 3] =-fact;
+ _coup[ 4] =-fact*sqr(sw/cw);
+ _coup[ 5] =-fact* 0.5*(sqr(c)-sqr(s))/s/c;
+ _coup[ 6] =-fact/cw*0.5*(sqr(c)-sqr(s))/s/c;
+ _coup[ 7] =-fact/sqr(cw)*sw*0.5*(sqr(cp)-sqr(sp))/sp/cp;
+ _coup[ 8] =-fact/cw*sw*0.5/s/c/sp/cp*(sqr(c*sp)+sqr(s*cp));
+ _coup[ 9] =-fact*(s0-2.*r2*vr);
+ _coup[10] = fact*(s0-2.*r2*vr);
+ _coup[11] = fact*(s0-2.*r2*vr)*0.5*(sqr(c)-sqr(s))/s/c;
+ _coup[12] =-fact/sqr(cw)*(s0-4.*r2*vr);
+ _coup[13] = fact*(s0+sqr(sqr(c)-sqr(s))/sqr(s*c)*r2*vr);
+ _coup[14] = fact/cw*0.5*(sqr(c)-sqr(s))/s/c*(s0-4.*r2*vr);
+ _coup[15] = fact*sw/sqr(cw)*0.5*(sqr(cp)-sqr(sp))/sp/cp*(s0-4.*r2*vr);
+ _coup[16] = fact*sw/cw*0.5/s/c/sp/cp*(s0*(sqr(c*sp)+sqr(s*cp))
+ +2.*r2*(sqr(c)-sqr(s))*(sqr(cp)-sqr(sp))*vr);
+ _coup[17] = fact*sqr(sw/cw)*(s0+r2*vr*sqr(sqr(cp)-sqr(sp))/sqr(sp*cp));
+ _coup[18] =-2.*fact/cw*vr;
+ _coup[19] = fact/cw*(sqr(c)-sqr(s))/s/c*vr;
+ _coup[20] =-fact*sw/cw*0.5*(sqr(cp)-sqr(sp))/sp/cp*(sPlus-4.*vr);
+ _coup[21] =-fact*sw/cw*(sqr(c*cp)+sqr(s*sp))/s/c/sp/cp*vr;
+ _coup[22] = fact*(sqr(c)-sqr(s))/s/c*vr;
+ _coup[23] =-fact*(pow(c,4)+pow(s,4))/sqr(s*c)*vr;
+ _coup[24] = fact*4.*vr;
+ _coup[25] = fact*2.*(pow(c,4)+pow(s,4))/sqr(s*c)*vr;
+ _coup[26] =-fact*2.*vr*(sqr(c)-sqr(s))/s/c;
+}
+
+void LHWWHVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = electroMagneticCoupling(q2);
+ _q2last=q2;
+ }
+ int ih = abs(c->id());
+ int ibos[2]={abs(a->id()),abs(b->id())};
+ if(ih==25) {
+ if ( ibos[0]==24&&ibos[1]==24 ) norm(UnitRemoval::InvE *_couplast*_coup[0]);
+ else if( ibos[0]==23&&ibos[1]==23 ) norm(UnitRemoval::InvE *_couplast*_coup[1]);
+ else if( ibos[0]==34&&ibos[1]==34 ) norm(UnitRemoval::InvE *_couplast*_coup[2]);
+ else if( ibos[0]==33&&ibos[1]==33 ) norm(UnitRemoval::InvE *_couplast*_coup[3]);
+ else if( ibos[0]==32&&ibos[1]==32 ) norm(UnitRemoval::InvE *_couplast*_coup[4]);
+ else if((ibos[0]==24&&ibos[1]==34) ||
+ (ibos[0]==34&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[5]);
+ else if((ibos[0]==23&&ibos[1]==33) ||
+ (ibos[0]==33&&ibos[1]==23) ) norm(UnitRemoval::InvE *_couplast*_coup[6]);
+ else if((ibos[0]==23&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==23) ) norm(UnitRemoval::InvE *_couplast*_coup[7]);
+ else if((ibos[0]==33&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==33) ) norm(UnitRemoval::InvE *_couplast*_coup[8]);
+ else assert(false);
+ }
+ else if(ih==35) {
+ if ( ibos[0]==24&&ibos[1]==24 ) norm(UnitRemoval::InvE *_couplast*_coup[ 9]);
+ else if( ibos[0]==34&&ibos[1]==34 ) norm(UnitRemoval::InvE *_couplast*_coup[10]);
+ else if((ibos[0]==24&&ibos[1]==34) ||
+ (ibos[0]==34&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[11]);
+ else if( ibos[0]==23&&ibos[1]==23 ) norm(UnitRemoval::InvE *_couplast*_coup[12]);
+ else if( ibos[0]==33&&ibos[1]==33 ) norm(UnitRemoval::InvE *_couplast*_coup[13]);
+ else if((ibos[0]==23&&ibos[1]==33) ||
+ (ibos[0]==33&&ibos[1]==23) ) norm(UnitRemoval::InvE *_couplast*_coup[14]);
+ else if((ibos[0]==23&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==23) ) norm(UnitRemoval::InvE *_couplast*_coup[15]);
+ else if((ibos[0]==33&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==33) ) norm(UnitRemoval::InvE *_couplast*_coup[16]);
+ else if((ibos[0]==32&&ibos[1]==32) ) norm(UnitRemoval::InvE *_couplast*_coup[17]);
+ else assert(false);
+ }
+ else if(ih==37) {
+ if ((ibos[0]==24&&ibos[1]==23) ||
+ (ibos[0]==23&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[18]);
+ else if((ibos[0]==34&&ibos[1]==23) ||
+ (ibos[0]==23&&ibos[1]==34) ) norm(UnitRemoval::InvE *_couplast*_coup[19]);
+ else if((ibos[0]==24&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[20]);
+ else if((ibos[0]==34&&ibos[1]==32) ||
+ (ibos[0]==32&&ibos[1]==34) ) norm(UnitRemoval::InvE *_couplast*_coup[21]);
+ else if((ibos[0]==24&&ibos[1]==33) ||
+ (ibos[0]==33&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[22]);
+ else if((ibos[0]==34&&ibos[1]==33) ||
+ (ibos[0]==33&&ibos[1]==34) ) norm(UnitRemoval::InvE *_couplast*_coup[23]);
+ else assert(false);
+ }
+ else if(ih==38) {
+ if ((ibos[0]==24&&ibos[1]==24) ) norm(UnitRemoval::InvE *_couplast*_coup[24]);
+ else if((ibos[0]==34&&ibos[1]==34) ) norm(UnitRemoval::InvE *_couplast*_coup[24]);
+ else if((ibos[0]==34&&ibos[1]==24) ||
+ (ibos[0]==24&&ibos[1]==34) ) norm(UnitRemoval::InvE *_couplast*_coup[24]);
+ else assert(false);
+ }
+ else assert(false);
+}
diff --git a/Models/LH/LHWWHVertex.h b/Models/LH/LHWWHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWHVertex.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHWWHVertex_H
+#define HERWIG_LHWWHVertex_H
+//
+// This is the declaration of the LHWWHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/VVSVertex.h"
+#include "LHModel.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHWWHVertex class implements the couplings of two electroweak
+ * gauge bosons to a Higgs boson in the Little Higgs model including the additional
+ * heavy photon, Z and W bosons in the model and the triplet Higgs bosons.
+ */
+class LHWWHVertex: public Helicity::VVSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHWWHVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHWWHVertex & operator=(const LHWWHVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+
+ /**
+ * Couplings for the different interactions
+ */
+ vector<Energy> _coup;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHWWHVertex_H */
diff --git a/Models/LH/LHWWWVertex.cc b/Models/LH/LHWWWVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWWVertex.cc
@@ -0,0 +1,151 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHWWWVertex class.
+//
+
+#include "LHWWWVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void LHWWWVertex::persistentOutput(PersistentOStream & os) const {
+ os << _corr;
+}
+
+void LHWWWVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _corr;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHWWWVertex,VVVVertex>
+describeHerwigLHWWWVertex("Herwig::LHWWWVertex", "HwLHModel.so");
+
+void LHWWWVertex::Init() {
+
+ static ClassDocumentation<LHWWWVertex> documentation
+ ("The LHWWWVertex class implements the triple electroweak"
+ " gauge boson couplings in the Little Higgs model.");
+
+}
+
+LHWWWVertex::LHWWWVertex() : _couplast(0.),_q2last(ZERO) {
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHWWWVertex::doinit() {
+ // particles
+ addToList(24, -24, 22);
+ addToList(24, -24, 23);
+ addToList(24, -24, 32);
+ addToList(24, -24, 33);
+
+ addToList(34, -24, 23);
+ addToList(34, -24, 32);
+ addToList(34, -24, 33);
+
+ addToList(24, -34, 23);
+ addToList(24, -34, 32);
+ addToList(24, -34, 33);
+
+ addToList(34, -34, 22);
+ addToList(34, -34, 23);
+ addToList(34, -34, 32);
+ addToList(34, -34, 33);
+ // model
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHWWWVertex::doinit()"
+ << Exception::runerror;
+ // correction factors for the different interactions
+ double sw(sqrt(model->sin2ThetaW())),cw(sqrt(1.-model->sin2ThetaW()));
+ double vf(sqr(model->vev()/model->f()));
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double xB(-2.5/sw*sp*cp*(sqr(cp)-sqr(sp)));
+ double xH(2.5/sw/cw*s*c*sp*cp*(sqr(c*sp)+sqr(s*cp))/
+ (5.*sqr(sp*cp/sw)-sqr(s*c/cw)));
+ double xW(-0.5/cw*s*c*(sqr(c)-sqr(s)));
+ _corr.resize(12);
+ // W_L W_L A_L
+ _corr[ 0] = -1.;
+ // W_L W_L A_H
+ _corr[ 1] = cw/sw*vf*xB;
+ // W_L W_H A_L
+ _corr[ 2] = 0.;
+ // W_L W_H A_H
+ _corr[ 3] = -vf/sw*xH;
+ // W_H W_H A_L
+ _corr[ 4] = -1.;
+ // W_H W_H A_H
+ _corr[ 5] = vf/sw*(xH*(sqr(c)-sqr(s))/s/c+cw*xB);
+ // W_L W_L Z_L
+ _corr[ 6] = -cw/sw;
+ // W_L W_L Z_H
+ _corr[ 7] = vf/sw*(cw*xW+s*c*(sqr(c)-sqr(s)));
+ // W_L W_H Z_L
+ _corr[ 8] = -vf/sw*xW;
+ // W_L W_H Z_H
+ _corr[ 9] = -1./sw;
+ // W_H W_H Z_L
+ _corr[10] = -cw/sw;
+ // W_H W_H Z_H
+ _corr[11] = (sqr(c)-sqr(s))/s/c/sw;
+ VVVVertex::doinit();
+}
+
+// couplings for the WWW vertex
+void LHWWWVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=_q2last) {
+ _couplast = electroMagneticCoupling(q2);
+ _q2last=q2;
+ }
+ int ia(a->iCharge()/3),ib(b->iCharge()/3),ic(c->iCharge()/3);
+ int ida(a->id()), idb(b->id()), idc(c->id());
+ // get the particles in the interaction
+ int ineut,nh(0);
+ if(ia==0) {
+ ineut=ida;
+ if(abs(idb)==34) ++nh;
+ if(abs(idc)==34) ++nh;
+ }
+ else if(ib==0) {
+ ineut=idb;
+ if(abs(ida)==34) ++nh;
+ if(abs(idc)==34) ++nh;
+ }
+ else {
+ ineut=idc;
+ if(abs(ida)==34) ++nh;
+ if(abs(idb)==34) ++nh;
+ }
+ if(nh==0) {
+ if (ineut==22) norm(_corr[ 0]*_couplast);
+ else if(ineut==23) norm(_corr[ 6]*_couplast);
+ else if(ineut==32) norm(_corr[ 1]*_couplast);
+ else if(ineut==33) norm(_corr[ 7]*_couplast);
+ }
+ else if(nh==1) {
+ if (ineut==22) norm(_corr[ 2]*_couplast);
+ else if(ineut==23) norm(_corr[ 8]*_couplast);
+ else if(ineut==32) norm(_corr[ 3]*_couplast);
+ else if(ineut==33) norm(_corr[ 9]*_couplast);
+ }
+ else if(nh==2) {
+ if (ineut==22) norm(_corr[ 4]*_couplast);
+ else if(ineut==23) norm(_corr[10]*_couplast);
+ else if(ineut==32) norm(_corr[ 5]*_couplast);
+ else if(ineut==33) norm(_corr[11]*_couplast);
+ }
+ // check the order for the overall sign
+ if((ia<0 && ib>0 && ic==0) ||
+ (ia==0 && ib<0 && ic>0 ) ||
+ (ia>0 && ib==0 && ic<0 ) ) norm(-norm());
+}
diff --git a/Models/LH/LHWWWVertex.h b/Models/LH/LHWWWVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWWVertex.h
@@ -0,0 +1,131 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHWWWVertex_H
+#define HERWIG_LHWWWVertex_H
+//
+// This is the declaration of the LHWWWVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/VVVVertex.h"
+#include "LHModel.h"
+
+namespace Herwig {
+using namespace ThePEG;
+using ThePEG::Helicity::Direction;
+
+/**
+ * The LHWWWVertex class implements the triple boson coupling in the Little
+ * Higgs model for the electroweak bosons of the Standard Model and the
+ * additional \f$A_H\f$, \f$Z_H\f$ and \f$W_H^\pm\f$ bosons.
+ */
+class LHWWWVertex: public Helicity::VVVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ inline LHWWWVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ * @param d1 The direction for the first particle.
+ * @param d2 The direction for the second particle.
+ * @param d3 The direction for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHWWWVertex & operator=(const LHWWWVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The correction factors for the different interacting particles
+ */
+ vector<double> _corr;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHWWWVertex_H */
diff --git a/Models/LH/LHWWWWVertex.cc b/Models/LH/LHWWWWVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWWWVertex.cc
@@ -0,0 +1,308 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHWWWWVertex class.
+//
+
+#include "LHWWWWVertex.h"
+#include "LHModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHWWWWVertex::LHWWWWVertex() :
+ _couplast(0.0), _q2last(sqr(Constants::MaxEnergy)), _coup(36,0.) {
+ // order in the couplings
+ orderInGem(2);
+ orderInGs(0);
+}
+
+IBPtr LHWWWWVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHWWWWVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHWWWWVertex::persistentOutput(PersistentOStream & os) const {
+ os << _coup;
+}
+
+void LHWWWWVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _coup;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHWWWWVertex,VVVVVertex>
+describeHerwigLHWWWWVertex("Herwig::LHWWWWVertex", "HwLHModel.so");
+
+void LHWWWWVertex::Init() {
+
+ static ClassDocumentation<LHWWWWVertex> documentation
+ ("The LHWWWWVertex class implements the quartic electroweak"
+ " boson couplings in the Little Higgs Model");
+
+}
+
+void LHWWWWVertex::doinit() {
+ // all charge W's
+ addToList(24, -24, 24, -24);
+ addToList(34, -34, 34, -34);
+ addToList(24, -24, 34, -34);
+ addToList(24, -24, 24, -34);
+ addToList(24, -24, 34, -24);
+ addToList(34, -24, 34, -24);
+ addToList(24, -34, 24, -34);
+ addToList(34, -34, 24, -34);
+ addToList(34, -34, 34, -24);
+ // two neutral and 2 W_L
+ addToList(22, 24, 22, -24);
+ addToList(23, 24, 23, -24);
+ addToList(22, 24, 23, -24);
+ addToList(22, 24, 32, -24);
+ addToList(22, 24, 33, -24);
+ addToList(23, 24, 33, -24);
+ addToList(23, 24, 32, -24);
+ addToList(33, 24, 33, -24);
+ addToList(33, 24, 32, -24);
+ // two neutral and 2 W_H
+ addToList(22, 34, 22, -34);
+ addToList(23, 34, 23, -34);
+ addToList(22, 34, 23, -34);
+ addToList(22, 34, 32, -34);
+ addToList(22, 34, 33, -34);
+ addToList(23, 34, 33, -34);
+ addToList(23, 34, 32, -34);
+ addToList(33, 34, 33, -34);
+ addToList(33, 34, 32, -34);
+ // two neutral W_L W_H
+ addToList(23, 24, 23, -34);
+ addToList(23, 24, 22, -34);
+ addToList(22, 24, 32, -34);
+ addToList(23, 24, 32, -34);
+ addToList(33, 24, 33, -34);
+ addToList(33, 24, 32, -34);
+ addToList(22, 24, 33, -34);
+ addToList(23, 24, 33, -34);
+ addToList(23, 34, 23, -24);
+ addToList(23, 34, 22, -24);
+ addToList(22, 34, 32, -24);
+ addToList(23, 34, 32, -24);
+ addToList(33, 34, 33, -24);
+ addToList(33, 34, 32, -24);
+ addToList(22, 34, 33, -24);
+ addToList(23, 34, 33, -24);
+ // model
+ cLHModelPtr model =
+ dynamic_ptr_cast<cLHModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHWWWWVertex::doinit()"
+ << Exception::runerror;
+ // correction factors for the different interactions
+ double sw2(sin2ThetaW());
+ double sw(sqrt(sw2)),cw(sqrt(1.-sw2));
+ double s (model->sinTheta() ),c (model->cosTheta() );
+ double sp(model->sinThetaPrime()),cp(model->cosThetaPrime());
+ double vf(sqr(model->vev()/model->f()));
+ double xB(-2.5/sw*sp*cp*(sqr(cp)-sqr(sp)));
+ double xW(-0.5/cw*s*c*(sqr(c)-sqr(s)));
+ double xH(2.5/sw/cw*s*c*sp*cp*(sqr(c*sp)+sqr(s*cp))/
+ (5.*sqr(sp*cp/sw)-sqr(s*c/cw)));
+ // 4 W's
+ _coup[ 0] =-1./sw2;
+ _coup[ 1] =-1./sw2;
+ _coup[ 2] = 0.5/sw2*(sqr(c)-sqr(s))/c/s;
+ _coup[ 3] =-0.25/sw2*vf*s*c*(sqr(c)-sqr(s));
+ _coup[ 4] =-0.25/sw2;
+ _coup[ 5] =-1./sw2*(pow(c,6)+pow(s,c))/sqr(s*c);
+ // 2 W_L
+ _coup[ 6] = 1.;
+ _coup[ 7] = sqr(cw/sw);
+ _coup[ 8] = cw/sw;
+ _coup[ 9] =-cw/sw*xB*vf;
+ _coup[10] =-cw/sw*xW*vf+0.5/sw*s*c*(sqr(c)-sqr(s))*vf;
+ _coup[11] =-(sqr(cw)-sw2)/sw2*xW*vf;
+ _coup[12] =-sqr(cw/sw)*xB*vf;
+ _coup[13] = 0.;
+ _coup[14] = 1./sw2;
+ _coup[15] = xH*vf/sw2;
+ _coup[16] = 1.;
+ _coup[17] = sqr(cw/sw);
+ _coup[18] = cw/sw;
+ _coup[19] =-cw/sw*xB*vf-xH/sw*vf*(sqr(c)-sqr(s))/s/c;
+ _coup[20] =-1./sw*(sqr(c)-sqr(s))/s/c;
+ _coup[21] =-cw/sw2*(sqr(c)-sqr(s))/s/c;
+ _coup[22] =-sqr(cw/sw)*xB*vf-cw/sw2*xH*vf*(sqr(c)-sqr(s))/c/s;
+ _coup[23] = 0.;
+ _coup[24] = (pow(c,6)+pow(s,6))/sqr(s*c)/sw2;
+ _coup[25] = xH/sw2*vf*(pow(c,6)+pow(s,6))/sqr(s*c)
+ +cw/sw2*xB*vf*(sqr(c)-sqr(s))/s/c;
+ _coup[26] = 0.;
+ _coup[27] = 2.*cw/sw2*xW*vf;
+ _coup[28] = 0.;
+ _coup[29] = xH*vf/sw;
+ _coup[30] = xH*vf*cw/sw2;
+ _coup[31] = xW*vf/sw;
+ _coup[32] =-(sqr(c)-sqr(s))/s/c/sw2;
+ _coup[33] =-xH*vf*(sqr(c)-sqr(s))/s/c-cw/sw2*xB*vf;
+ _coup[34] = 1./sw;
+ _coup[35] = cw/sw2;
+}
+
+void LHWWWWVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,
+ tcPDPtr c,tcPDPtr d) {
+ // id's of the particles
+ int id[4]={a->id(),b->id(),c->id(),d->id()};
+ // order the particles
+ int ngamma(0),nz(0);
+ int iorder[4];
+ for(int ix=0;ix<4;++ix) {
+ if (id[ix]==22||id[ix]==32) ++ngamma;
+ else if (id[ix]==23||id[ix]==33) ++nz;
+ }
+ // if photons or Z's
+ if(ngamma!=0 || nz!=0) {
+ int iy=0;
+ // put the photons first
+ for(int ix=0;iy<ngamma&&ix<4;++ix) {
+ if(id[ix]==22||id[ix]==32) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ // then the Z bosons
+ for(int ix=0;iy<ngamma+nz&&ix<4;++ix) {
+ if(id[ix]==23||id[ix]==33) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ // then the W+
+ for(int ix=0;iy<3&&ix<4;++ix) {
+ if(id[ix]==24||id[ix]==34) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ assert(iy==3);
+ // finally the W-
+ for(int ix=0;iy<4&&ix<4;++ix) {
+ if(id[ix]==-24||id[ix]==-34) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ assert(iy==4);
+ }
+ else {
+ int iy=0;
+ // first the W+
+ for(int ix=0;iy<3&&ix<4;++ix) {
+ if(id[ix]==24||id[ix]==34) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ assert(iy==2);
+ // finally the W-
+ for(int ix=0;iy<4&&ix<4;++ix) {
+ if(id[ix]==-24||id[ix]==-34) {
+ iorder[iy]=ix;
+ ++iy;
+ }
+ }
+ assert(iy==4);
+ }
+ setOrder(iorder[0],iorder[1],iorder[2],iorder[3]);
+ setType(2);
+ // first the overall normalisation
+ if(q2!=_q2last||_couplast==0.) {
+ _couplast = sqr(electroMagneticCoupling(q2));
+ _q2last=q2;
+ }
+ // ids of the particles
+ for(unsigned int ix=0;ix<4;++ix) {
+ if (iorder[ix]==0) id[ix] = abs(a->id());
+ else if(iorder[ix]==1) id[ix] = abs(b->id());
+ else if(iorder[ix]==2) id[ix] = abs(c->id());
+ else if(iorder[ix]==3) id[ix] = abs(d->id());
+ }
+ if( ngamma == 0 && nz == 0 ) {
+ if(id[0]==id[1]) {
+ if(id[2]==id[3]) {
+ if(id[0]==24&&id[2]==24)
+ norm(_couplast*_coup[0]);
+ else if(id[0]==34&&id[2]==34)
+ norm(_couplast*_coup[5]);
+ else
+ norm(_couplast*_coup[1]);
+ }
+ else {
+ if(id[0]==24)
+ norm(_couplast*_coup[3]);
+ else
+ norm(_couplast*_coup[2]);
+ }
+ }
+ else {
+ if(id[2]==id[3]) {
+ if(id[2]==24)
+ norm(_couplast*_coup[3]);
+ else
+ norm(_couplast*_coup[2]);
+ }
+ else
+ norm(_couplast*_coup[4]);
+ }
+ }
+ else {
+ if(id[2]==id[3]) {
+ unsigned int ioff = id[2]==24 ? 0 : 10;
+ if(id[0]==22&&id[1]==22)
+ norm(_couplast*_coup[6+ioff]);
+ else if(id[0]==23&&id[1]==23)
+ norm(_couplast*_coup[7+ioff]);
+ else if((id[0]==22&&id[1]==23) || (id[0]==23&&id[1]==22))
+ norm(_couplast*_coup[8+ioff]);
+ else if((id[0]==22&&id[1]==32) || (id[0]==32&&id[1]==22))
+ norm(_couplast*_coup[9+ioff]);
+ else if((id[0]==22&&id[1]==33) || (id[0]==33&&id[1]==22))
+ norm(_couplast*_coup[10+ioff]);
+ else if((id[0]==23&&id[1]==33) || (id[0]==33&&id[1]==22))
+ norm(_couplast*_coup[11+ioff]);
+ else if((id[0]==23&&id[1]==32) || (id[0]==32&&id[1]==23))
+ norm(_couplast*_coup[12+ioff]);
+ else if( id[0]==33&&id[1]==33)
+ norm(_couplast*_coup[14+ioff]);
+ else if((id[0]==32&&id[1]==33) || (id[0]==33&&id[1]==32))
+ norm(_couplast*_coup[15+ioff]);
+ else
+ assert(false);
+ }
+ else {
+ if(id[0]==23&&id[1]==23)
+ norm(_couplast*_coup[27]);
+ else if((id[0]==22&&id[1]==23) || (id[0]==23&&id[1]==22))
+ norm(_couplast*_coup[28]);
+ else if((id[0]==22&&id[1]==32) || (id[0]==32&&id[1]==22))
+ norm(_couplast*_coup[29]);
+ else if((id[0]==23&&id[1]==32) || (id[0]==32&&id[1]==23))
+ norm(_couplast*_coup[30]);
+ else if( id[0]==33&&id[1]==33)
+ norm(_couplast*_coup[31]);
+ else if((id[0]==32&&id[1]==33) || (id[0]==33&&id[1]==32))
+ norm(_couplast*_coup[32]);
+ else if((id[0]==22&&id[1]==33) || (id[0]==33&&id[1]==22))
+ norm(_couplast*_coup[33]);
+ else if((id[0]==23&&id[1]==33) || (id[0]==33&&id[1]==22))
+ norm(_couplast*_coup[34]);
+ else
+ assert(false);
+ }
+ }
+}
diff --git a/Models/LH/LHWWWWVertex.h b/Models/LH/LHWWWWVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LH/LHWWWWVertex.h
@@ -0,0 +1,126 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHWWWWVertex_H
+#define HERWIG_LHWWWWVertex_H
+//
+// This is the declaration of the LHWWWWVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/VVVVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+ using namespace ThePEG::Helicity;
+
+/**
+ * The LHWWWWVertex class implements the quartic self-couplings of electroweak
+ * gauge bosons in the Little Higgs model.
+ */
+class LHWWWWVertex: public VVVVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHWWWWVertex();
+
+ /** @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();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ * @param part4 The ParticleData pointer for the fourth particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3,
+ tcPDPtr part4);
+
+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;
+ //@}
+
+protected:
+
+ /** @name Standard Interfaced functions. */
+ //@{
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHWWWWVertex & operator=(const LHWWWWVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex _couplast;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 _q2last;
+
+ /**
+ * Couplings for the different bosons
+ */
+ vector<double> _coup;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHWWWWVertex_H */
diff --git a/Models/LH/Makefile.am b/Models/LH/Makefile.am
new file mode 100644
--- /dev/null
+++ b/Models/LH/Makefile.am
@@ -0,0 +1,16 @@
+if WANT_LH
+pkglib_LTLIBRARIES = HwLHModel.la
+endif
+HwLHModel_la_SOURCES = \
+LHModel.h LHModel.cc \
+LHFFZVertex.h LHFFZVertex.cc \
+LHFFPVertex.h LHFFPVertex.cc \
+LHFFGVertex.h LHFFGVertex.cc \
+LHFFWVertex.h LHFFWVertex.cc \
+LHWWWVertex.h LHWWWVertex.cc \
+LHWWWWVertex.h LHWWWWVertex.cc \
+LHFFHVertex.h LHFFHVertex.cc \
+LHWWHVertex.h LHWWHVertex.cc \
+LHWHHVertex.h LHWHHVertex.cc \
+LHWWHHVertex.h LHWWHHVertex.cc
+HwLHModel_la_LDFLAGS = -module -version-info 3:0:0
diff --git a/Models/LHTP/LHTPFFGVertex.cc b/Models/LHTP/LHTPFFGVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFGVertex.cc
@@ -0,0 +1,73 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPFFGVertex class.
+//
+
+#include "LHTPFFGVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+IBPtr LHTPFFGVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPFFGVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeNoPIOClass<LHTPFFGVertex,FFVVertex>
+describeHerwigLHTPFFGVertex("Herwig::LHTPFFGVertex", "HwLHTPModel.so");
+
+void LHTPFFGVertex::Init() {
+
+ static ClassDocumentation<LHTPFFGVertex> documentation
+ ("The LHTPFFGVertex class implements the couples of the fermions "
+ "to the gluons in the Little Higgs model with T-parity.");
+
+}
+
+LHTPFFGVertex::LHTPFFGVertex()
+ : coupLast_(0.), q2Last_(0.*GeV2) {
+ orderInGs(1);
+ orderInGem(0);
+}
+
+void LHTPFFGVertex::doinit() {
+ // SM quarks
+ for(int ix = 1; ix < 7; ++ix) {
+ addToList(-ix, ix, 21);
+ }
+ // additional top quark
+ addToList(-8, 8, 21);
+ // T odd quarks
+ for(long ix = 4000001; ix <= 4000006; ++ix) {
+ addToList(-ix, ix, 21);
+ }
+ addToList(-4000008, 4000008, 21);
+ FFVVertex::doinit();
+}
+
+// coupling for FFG vertex
+void LHTPFFGVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr,tcPDPtr) {
+ // first the overall normalisation
+ if(q2!=q2Last_) {
+ coupLast_ = -strongCoupling(q2);
+ q2Last_=q2;
+ }
+ norm(coupLast_);
+ // the left and right couplings
+ int iferm=abs(a->id());
+ if( iferm > 8 ) iferm -= 4000000;
+ if((iferm>=1 && iferm<=8)) {
+ left (1.);
+ right(1.);
+ }
+ else
+ assert(false);
+}
diff --git a/Models/LHTP/LHTPFFGVertex.fh b/Models/LHTP/LHTPFFGVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFGVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPFFGVertex class.
+//
+#ifndef HERWIG_LHTPFFGVertex_FH
+#define HERWIG_LHTPFFGVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPFFGVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPFFGVertex,LHTPFFGVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPFFGVertex.h b/Models/LHTP/LHTPFFGVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFGVertex.h
@@ -0,0 +1,103 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPFFGVertex_H
+#define HERWIG_LHTPFFGVertex_H
+//
+// This is the declaration of the LHTPFFGVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPFFGVertex class implements the coupling of the
+ * gluon to the coloured fermions, the SM quarks, the extra top-like quark
+ * and the T-parity odd quarks of the Little Higgs model with T-parity.
+ */
+class LHTPFFGVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPFFGVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /**
+ * 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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPFFGVertex & operator=(const LHTPFFGVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The last value of the strong coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHTPFFGVertex_H */
diff --git a/Models/LHTP/LHTPFFHVertex.cc b/Models/LHTP/LHTPFFHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFHVertex.cc
@@ -0,0 +1,387 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPFFHVertex class.
+//
+
+#include "LHTPFFHVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+void LHTPFFHVertex::persistentOutput(PersistentOStream & os) const {
+ os << ounit(cL_,1./GeV) << ounit(cR_,1./GeV) << model_;
+}
+
+void LHTPFFHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(cL_,1./GeV) >> iunit(cR_,1./GeV) >> model_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPFFHVertex,FFSVertex>
+describeHerwigLHTPFFHVertex("Herwig::LHTPFFHVertex", "HwLHTPModel.so");
+
+void LHTPFFHVertex::Init() {
+
+ static ClassDocumentation<LHTPFFHVertex> documentation
+ ("The LHTPFFHVertex class implements the interaction of the fermions"
+ " and the Higgs bosons in the Little Higgs model with T-parity");
+
+}
+
+LHTPFFHVertex::LHTPFFHVertex()
+ : q2Last_(ZERO) {
+ orderInGem(1);
+ orderInGs(0);
+ massLast_[0] = 0.*GeV;
+ massLast_[1] = 0.*GeV;
+ idLast_[0] = 0;
+ idLast_[1] = 0;
+}
+
+void LHTPFFHVertex::doinit() {
+ // SM like higgs
+ addToList( -3, 3, 25);
+ addToList( -4, 4, 25);
+ addToList( -5, 5, 25);
+ addToList( -6, 6, 25);
+ addToList( -6, 8, 25);
+ addToList( -8, 6, 25);
+ addToList( -8, 8, 25);
+ addToList( -13, 13, 25);
+ addToList( -15, 15, 25);
+ addToList( -4000002, 4000002, 25);
+ addToList( -4000004, 4000004, 25);
+ addToList( -4000006, 4000006, 25);
+ addToList( -4000012, 4000012, 25);
+ addToList( -4000014, 4000014, 25);
+ addToList( -4000016, 4000016, 25);
+ // phi0
+ addToList( -3 , 4000003, 35);
+ addToList( -4 , 4000004, 35);
+ addToList( -5 , 4000005, 35);
+ addToList( -4000003, 3, 35);
+ addToList( -4000004, 4, 35);
+ addToList( -4000005, 5, 35);
+ addToList( -6 , 4000006, 35);
+ addToList( -8 , 4000006, 35);
+ addToList( -4000006, 6, 35);
+ addToList( -4000006, 8, 35);
+ // phiP
+ addToList( -2 , 4000002, 36);
+ addToList( -3 , 4000003, 36);
+ addToList( -4 , 4000004, 36);
+ addToList( -5 , 4000005, 36);
+ addToList( -4000002, 2, 36);
+ addToList( -4000003, 3, 36);
+ addToList( -4000004, 4, 36);
+ addToList( -4000005, 5, 36);
+ addToList( -12 , 4000012, 36);
+ addToList( -14 , 4000014, 36);
+ addToList( -16 , 4000016, 36);
+ addToList( -4000012, 12, 36);
+ addToList( -4000014, 14, 36);
+ addToList( -4000016, 16, 36);
+ addToList( -6 , 4000006, 36);
+ addToList( -6 , 4000008, 36);
+ addToList( -8 , 4000006, 36);
+ addToList( -8 , 4000008, 36);
+ addToList( -4000006, 6, 36);
+ addToList( -4000008, 6, 36);
+ addToList( -4000006, 8, 36);
+ addToList( -4000008, 8, 36);
+ // phi +/-
+ addToList( -1 , 4000002, -37);
+ addToList( -3 , 4000004, -37);
+ addToList( -5 , 4000006, -37);
+ addToList( -4000001, 2, -37);
+ addToList( -4000003, 4, -37);
+ addToList( -4000005, 6, -37);
+ addToList( -4000005, 8, -37);
+ addToList( -4000002, 1, 37);
+ addToList( -4000004, 3, 37);
+ addToList( -4000006, 5, 37);
+ addToList( -2 , 4000001, 37);
+ addToList( -4 , 4000003, 37);
+ addToList( -6 , 4000005, 37);
+ addToList( -8 , 4000005, 37);
+ addToList( -11 , 4000012, -37);
+ addToList( -13 , 4000014, -37);
+ addToList( -15 , 4000016, -37);
+ addToList( -4000011, 12, -37);
+ addToList( -4000013, 14, -37);
+ addToList( -4000015, 16, -37);
+ addToList( -4000012, 11 , 37);
+ addToList( -4000014, 13 , 37);
+ addToList( -4000016, 15 , 37);
+ addToList( -12, 4000011, 37);
+ addToList( -14, 4000013, 37);
+ addToList( -16, 4000015, 37);
+ model_ =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model_) throw InitException() << "Must be using the LHModel "
+ << " in LHFFPVertex::doinit()"
+ << Exception::runerror;
+ cL_ .resize(18);
+ cR_ .resize(18);
+ Energy v = model_->vev();
+ Energy f = model_->f();
+ double vf = model_->vev()/model_->f();
+ double sa = model_->sinAlpha();
+ double ca = model_->cosAlpha();
+ // lightest higgs couplings
+ // coupling of light SM fermions
+ cL_[0] = cR_[0] = 1./v;
+ // couplings to top quarks
+ cL_[1] = cR_[1] = sa*ca/f;
+ cL_[2] = -sa/ca/v;
+ cR_[2] = sqr(ca)*vf/v;
+ // couplings to T-odd quarks
+ cL_[3] = cR_[3] = 0.5*sqrt(0.5)/f*model_->kappaQuark();
+ // couplings to T-odd leptons
+ cL_[4] = cR_[4] = 0.5*sqrt(0.5)/f*model_->kappaLepton();
+ // Phi0
+ // quark, T-odd quark
+ cL_[5] = sqrt(0.5)/f;
+ cR_[5] = ZERO;
+ // and top quarks
+ cL_[6] = sqrt(0.5)*model_->cosThetaR()/f/ca;
+ cR_[6] = ZERO;
+ cL_[7] = sqrt(0.5)*model_->sinThetaR()/f/ca;
+ cR_[7] = ZERO;
+ // PhiP
+ // quark, T-odd quark
+ cL_[8] = vf/f*model_->kappaQuark()/12;
+ cR_[8] = sqrt(0.5)/f;
+ // lepton, T-odd lepton
+ cL_[9] = vf/f*model_->kappaLepton()/12;
+ cR_[9] = ZERO;
+ // top, T_-
+ cL_[10] = model_->cosThetaR()*sqrt(2.)*vf/f/ca/3;
+ cR_[10] = ZERO;
+ cL_[11] = model_->sinThetaR()*sqrt(2.)*vf/f/ca/3;
+ cR_[11] = ZERO;
+ // top, t_-
+ cL_[12] = model_->cosThetaL()*vf/f/12.*model_->kappaQuark();
+ cR_[12] = model_->cosThetaR()*sqrt(0.5)/f/ca;
+ cL_[13] = model_->sinThetaL()*vf/f/12.*model_->kappaQuark();
+ cR_[13] = model_->sinThetaR()*sqrt(0.5)/f/ca;
+ // Phi +/-
+ cL_[14] = vf/f*model_->kappaLepton()/24.;
+ cR_[14] = ZERO;
+ // quark T-odd quark
+ cL_[15] = vf/f*model_->kappaQuark() /24.;
+ cR_[15] =-vf*sqrt(0.5)/v;
+ cL_[16] = model_->cosThetaL()*vf/f*model_->kappaQuark() /24.;
+ cR_[16] =-model_->cosThetaR()*vf*sqrt(0.5)/v/ca;
+ cL_[17] = model_->sinThetaL()*vf/f*model_->kappaQuark() /24.;
+ cR_[17] =-model_->sinThetaR()*vf*sqrt(0.5)/v/ca;
+ FFSVertex::doinit();
+}
+
+void LHTPFFHVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b, tcPDPtr c) {
+ norm(1.);
+ int iferm=abs(a->id());
+ int ianti=abs(b->id());
+ // int ihigg=abs(c->id());
+ // left and right couplings set to one
+ // SM like higgs
+ if(c->id()==ParticleID::h0) {
+ // to SM fermions and T
+ if(iferm<=16&&ianti<=16) {
+ // running masses
+ if(q2!=q2Last_||idLast_[0]!=iferm||idLast_[1]!=ianti) {
+ q2Last_ = q2;
+ idLast_[0] = iferm;
+ assert((idLast_[0]>=1 && idLast_[0]<=8 ) ||
+ (idLast_[0]>=11 && idLast_[0]<=16));
+ if(idLast_[0]!=8)
+ massLast_[0] = model_->mass(q2,a);
+ else
+ massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t));
+ idLast_[1] = ianti;
+ assert((idLast_[1]>=1 && idLast_[1]<=8 ) ||
+ (idLast_[1]>=11 && idLast_[1]<=16));
+ if(idLast_[0]!=idLast_[1]) {
+ if(idLast_[1]!=8)
+ massLast_[1] = model_->mass(q2,a);
+ else
+ massLast_[1] = model_->mass(q2,getParticleData(ParticleID::t));
+ }
+ else {
+ massLast_[1] = massLast_[0];
+ }
+ }
+ if(iferm<6||iferm>8) {
+ left (-Complex(cL_[0]*massLast_[0]));
+ right(-Complex(cR_[0]*massLast_[0]));
+ }
+ else {
+ if(iferm==8&&ianti==8) {
+ left ( Complex(cL_[1]*massLast_[0]));
+ right( Complex(cR_[1]*massLast_[0]));
+ }
+ else {
+ if(a->id()==ParticleID::tbar||b->id()==ParticleID::tbar) {
+ left (-Complex(cL_[2]*massLast_[0]));
+ right(-Complex(cR_[2]*massLast_[0]));
+ }
+ else {
+ left (-Complex(cR_[2]*massLast_[0]));
+ right(-Complex(cL_[2]*massLast_[0]));
+ }
+ }
+ }
+ }
+ else {
+ if(iferm<=4000006) {
+ left ( Complex(cL_[3]*model_->vev()));
+ right( Complex(cR_[3]*model_->vev()));
+ }
+ else {
+ left ( Complex(cL_[4]*model_->vev()));
+ right( Complex(cR_[4]*model_->vev()));
+ }
+ }
+ }
+ // Phi0
+ else if(c->id()==ParticleID::H0 ||
+ c->id()==ParticleID::A0) {
+ tcPDPtr ferm = a;
+ if(iferm>4000000) {
+ swap(iferm,ianti);
+ ferm = b;
+ }
+ if(q2!=q2Last_||idLast_[0]!=iferm) {
+ q2Last_ = q2;
+ idLast_[0] = iferm;
+ assert((idLast_[0]>=1 && idLast_[0]<=8 ) ||
+ (idLast_[0]>=11 && idLast_[0]<=16));
+ if(idLast_[0]!=8)
+ massLast_[0] = model_->mass(q2,ferm);
+ else
+ massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t));
+ }
+ if(c->id()==ParticleID::H0 ) {
+ unsigned int iloc = 5;
+ if(iferm==6) iloc = 6;
+ else if(iferm==8) iloc = 7;
+ if( (a->id()>=1&&a->id()<=8) || (b->id()>=1&&b->id()<=8) ) {
+ left ( Complex(cR_[iloc]*massLast_[0]));
+ right( Complex(cL_[iloc]*massLast_[0]));
+ }
+ else {
+ left ( Complex(cL_[iloc]*massLast_[0]));
+ right( Complex(cR_[iloc]*massLast_[0]));
+ }
+ }
+ // PhiP
+ else if(c->id()==ParticleID::A0) {
+ if(iferm<=5) {
+ if( (a->id()>=1&&a->id()<=5) || (b->id()>=1&&b->id()<=5) ) {
+ if(iferm%2==0) {
+ right(Complex(0., 1.)*model_->vev()*cL_[8]);
+ left (Complex(0.,-1.)*massLast_[0] *cR_[8]);
+ }
+ else {
+ right(Complex(ZERO));
+ left (Complex(0., 1.)*massLast_[0] *cR_[8]);
+ }
+ }
+ else {
+ if(iferm%2==0) {
+ left (Complex(0.,-1.)*model_->vev()*cL_[8]);
+ right(Complex(0., 1.)*massLast_[0] *cR_[8]);
+ }
+ else {
+ left (Complex(ZERO));
+ right(Complex(0.,-1.)*massLast_[0] *cR_[8]);
+ }
+ }
+ }
+ else if(iferm>=12) {
+ if( (a->id()>=11&&a->id()<=16) || (b->id()>=11&&b->id()<=16) ) {
+ right(Complex(0., 1.)*model_->vev()*cL_[9]);
+ left (Complex(0.,-1.)*massLast_[0] *cR_[9]);
+ }
+ else {
+ right(Complex(0.,-1.)*massLast_[0] *cR_[9]);
+ left (Complex(0., 1.)*model_->vev()*cL_[9]);
+ }
+ }
+ else {
+ if(ianti==4000008) {
+ unsigned int iloc = (iferm+14)/2;
+ if( (a->id()==6||a->id()==8) || (b->id()==6||b->id()==8) ) {
+ left (Complex(0., 1.)*massLast_[0]*cR_[iloc]);
+ right(Complex(0., 1.)*massLast_[0]*cL_[iloc]);
+ }
+ else {
+ left (Complex(0.,-1.)*massLast_[0]*cL_[iloc]);
+ right(Complex(0.,-1.)*massLast_[0]*cR_[iloc]);
+ }
+ }
+ else {
+ unsigned int iloc = (iferm+18)/2;
+ if( (a->id()==6||a->id()==8) || (b->id()==6||b->id()==8) ) {
+ left (Complex(0., 1.)*model_->vev()*cL_[iloc]);
+ right(Complex(0.,-1.)*massLast_[0] *cR_[iloc]);
+ }
+ else {
+ left (Complex(0., 1.)*massLast_[0] *cR_[iloc]);
+ right(Complex(0.,-1.)*model_->vev()*cL_[iloc]);
+ }
+ }
+ }
+ }
+ }
+ else if(abs(c->id())==ParticleID::Hplus) {
+ tcPDPtr ferm = a;
+ if(iferm>4000000) {
+ swap(iferm,ianti);
+ ferm = b;
+ }
+ if(q2!=q2Last_||idLast_[0]!=iferm) {
+ q2Last_ = q2;
+ idLast_[0] = iferm;
+ assert((idLast_[0]>=1 && idLast_[0]<=8 ) ||
+ (idLast_[0]>=11 && idLast_[0]<=16));
+ if(idLast_[0]!=8)
+ massLast_[0] = model_->mass(q2,ferm);
+ else
+ massLast_[0] = model_->mass(q2,getParticleData(ParticleID::t));
+ }
+ Complex cleft(0.),cright(0.);
+ // lepton and T-odd lepton
+ if(iferm>=11&&iferm<=16) {
+ cright = cR_[14]*massLast_[0];
+ cleft = cL_[14]*model_->vev();
+ }
+ else if(iferm>=1&&iferm<=6) {
+ cright = cR_[15]*massLast_[0];
+ cleft = cL_[15]*model_->vev();
+ }
+ else if(iferm==6) {
+ cright = cR_[16]*massLast_[0];
+ cleft = cL_[16]*model_->vev();
+ }
+ else if(iferm==8) {
+ cright = cR_[17]*massLast_[0];
+ cleft = cL_[17]*model_->vev();
+ }
+ if((a->id()>=1&&a->id()<=16) ||(b->id()>=1&&b->id()<=16) ) {
+ swap(cleft,cright);
+ cleft *= -1.;
+ cright *= -1.;
+ }
+ if(c->id()==ParticleID::Hminus) {
+ cleft *= -1.;
+ cright *= -1.;
+ }
+ left (cleft );
+ right(cright);
+ }
+}
diff --git a/Models/LHTP/LHTPFFHVertex.h b/Models/LHTP/LHTPFFHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFHVertex.h
@@ -0,0 +1,143 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPFFHVertex_H
+#define HERWIG_LHTPFFHVertex_H
+//
+// This is the declaration of the LHTPFFHVertex class.
+//
+
+#include "LHTPModel.h"
+#include "ThePEG/Helicity/Vertex/Scalar/FFSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPFFHVertex class implements the couplings of the fermions to
+ * the Higgs bosons of the Little Higgs model with T-parity.
+ */
+class LHTPFFHVertex: public Helicity::FFSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPFFHVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ * @param ioff Which particle is off-shell
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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 {return new_ptr(*this);}
+
+ /** 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 {return new_ptr(*this);}
+ //@}
+
+protected:
+
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPFFHVertex & operator=(const LHTPFFHVertex &);
+
+private:
+
+ /**
+ * Pointer to the SM object.
+ */
+ tcLHTPModelPtr model_;
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The PDG code of the last fermion the coupling was evaluated for.
+ */
+ int idLast_[2];
+
+ /**
+ * The last \f$q^2\f$ the coupling was evaluated at.
+ */
+ Energy2 q2Last_;
+
+ /**
+ * The mass of the last fermion for which the coupling was evaluated.
+ */
+ Energy massLast_[2];
+
+ /**
+ * The factors for the individual interactions
+ */
+ vector<complex<InvEnergy> > coup_;
+
+ /**
+ * Left coupling
+ */
+ vector<complex<InvEnergy> > cL_;
+
+ /**
+ * Right coupling
+ */
+ vector<complex<InvEnergy> > cR_;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHTPFFHVertex_H */
diff --git a/Models/LHTP/LHTPFFPVertex.cc b/Models/LHTP/LHTPFFPVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFPVertex.cc
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPFFPVertex class.
+//
+
+#include "LHTPFFPVertex.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "LHTPModel.h"
+
+using namespace Herwig;
+
+IBPtr LHTPFFPVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPFFPVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPFFPVertex::persistentOutput(PersistentOStream & os) const {
+ os << charge_ << coupd_ << coupu_ << coupe_ << coupnu_
+ << TPreFactor_ << sL_ << cL_ << sR_ << cR_;
+}
+
+void LHTPFFPVertex::persistentInput(PersistentIStream & is, int) {
+ is >> charge_ >> coupd_ >> coupu_ >> coupe_ >> coupnu_
+ >> TPreFactor_ >> sL_ >> cL_ >> sR_ >> cR_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPFFPVertex,FFVVertex>
+describeHerwigLHTPFFPVertex("Herwig::LHTPFFPVertex", "HwLHTPModel.so");
+
+void LHTPFFPVertex::Init() {
+
+ static ClassDocumentation<LHTPFFPVertex> documentation
+ ("The LHTPFFPVertex class implements the coupling"
+ " of the charged fermions to the photon in the Little Higgs"
+ " model with T-parity.");
+
+}
+
+LHTPFFPVertex::LHTPFFPVertex() :
+ charge_(37,0.0), coupLast_(0.), q2Last_(-1.*GeV2),
+ coupd_(0.), coupu_(0.), coupe_(0.), coupnu_(0.),
+ TPreFactor_(0.), sL_(0.), cL_(1.), sR_(0.), cR_(1.) {
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHTPFFPVertex::doinit() {
+ // interactions with the photon
+ // the quarks
+ for(int ix = 1; ix < 7; ++ix) {
+ addToList(-ix, ix, 22);
+ }
+ // the leptons
+ for(int ix = 11; ix < 17; ix += 2) {
+ addToList(-ix, ix, 22);
+ }
+ // extra top quark
+ addToList(-8, 8, 22);
+ // the T-odd quarks
+ for(long ix = 4000001;ix < 4000007; ++ix) {
+ addToList(-ix, ix, 22);
+ }
+ // the T-odd leptons
+ for(long ix = 4000011; ix < 4000017; ix += 2) {
+ addToList(-ix, ix, 22);
+ }
+ // extra top quark
+ addToList(-4000008, 4000008, 22);
+ // interactions with A_H
+ // quarks and T-odd quark
+ for(int ix = 1; ix < 7; ++ix) {
+ addToList(-ix - 4000000, ix , 32);
+ addToList(-ix , ix + 4000000, 32);
+ }
+ // leptons and T-odd leptons (both charged leptons and neutrinos)
+ for(int ix = 11; ix < 17; ++ix ) {
+ addToList(-ix - 4000000, ix , 32);
+ addToList(-ix , ix + 4000000, 32);
+ }
+ // T+T-A_H
+ addToList(-4000008, 8, 32);
+ addToList( -8, 4000008, 32);
+ // T-tA_H
+ addToList(-4000008, 6, 32);
+ addToList( -6, 4000008, 32);
+ // T-tA_H
+ addToList(-4000006, 8, 32);
+ addToList( -8, 4000006, 32);
+ // charges
+ for(int ix = 1; ix < 16; ++ix) {
+ tcPDPtr ptemp = getParticleData(ix);
+ if(ptemp) charge_[ix] = double(ptemp->iCharge())/3.;
+ }
+ for(int ix = 4000001; ix < 4000016; ++ix) {
+ tcPDPtr ptemp = getParticleData(ix);
+ if(ptemp) charge_[ix-3999980] = double(ptemp->iCharge())/3.;
+ }
+ // couplings to A_H
+ double sw = generator()->standardModel()->sin2ThetaW();
+ double cw = sqrt(1.-sw);
+ sw = sqrt(sw);
+ // model
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the LHTPModel "
+ << " in LHTPFFPVertex::doinit()"
+ << Exception::runerror;
+ double cH = model->cosThetaH();
+ double sH = model->sinThetaH();
+ sL_ = model->sinThetaL();
+ cL_ = model->cosThetaL();
+ sR_ = model->sinThetaR();
+ cR_ = model->cosThetaR();
+ // couplings of fermion T-odd fermion A_H
+ coupd_ = -0.1*(cH/cw-5.*sH/sw);
+ coupu_ = -0.1*(cH/cw+5.*sH/sw);
+ coupe_ = -0.1*(cH/cw-5.*sH/sw);
+ coupnu_ = -0.1*(cH/cw+5.*sH/sw);
+ // couplings of T+T- A_H
+ TPreFactor_ = 0.4*cH/cw;
+ FFVVertex::doinit();
+}
+
+// coupling for FFP vertex
+void LHTPFFPVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=q2Last_) {
+ coupLast_ = -electroMagneticCoupling(q2);
+ q2Last_=q2;
+ }
+ norm(coupLast_);
+ // the left and right couplings
+ long iferm=abs(a->id()),ibos(c->id());
+ if(ibos == ParticleID::gamma) {
+ if(iferm < 20) {
+ left (charge_[iferm]);
+ right(charge_[iferm]);
+ }
+ else {
+ iferm-=3999980;
+ left (charge_[iferm]);
+ right(charge_[iferm]);
+ }
+ }
+ else if(ibos == 32) {
+ long ianti = abs(b->id());
+ if(iferm>4000000) swap(iferm,ianti);
+ assert(iferm<4000000&&ianti>4000000);
+ if( iferm == 6 || iferm == 8 ) {
+ if (iferm==6&&ianti==4000006) {
+ left (cL_*coupu_);
+ right(0.);
+ }
+ else if(iferm==6&&ianti==4000008) {
+ left (-TPreFactor_*sL_);
+ right(-TPreFactor_*sR_);
+ }
+ else if(iferm==8&&ianti==4000006) {
+ left (sL_*coupu_);
+ right(0.);
+ }
+ else if(iferm==8&&ianti==4000008) {
+ left ( TPreFactor_*cL_);
+ right( TPreFactor_*cR_);
+ }
+ else
+ assert(false);
+ }
+ // quarks (inclding top)
+ else if(iferm <= 5) {
+ if(iferm % 2 == 0) left(coupu_);
+ else left(coupd_);
+ right(0.);
+ }
+ // leptons
+ else {
+ if(iferm %2 == 0) left(coupnu_);
+ else left(coupe_ );
+ right(0.);
+ }
+ }
+ else
+ assert(false);
+}
diff --git a/Models/LHTP/LHTPFFPVertex.fh b/Models/LHTP/LHTPFFPVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFPVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPFFPVertex class.
+//
+#ifndef HERWIG_LHTPFFPVertex_FH
+#define HERWIG_LHTPFFPVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPFFPVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPFFPVertex,LHTPFFPVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPFFPVertex.h b/Models/LHTP/LHTPFFPVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFPVertex.h
@@ -0,0 +1,161 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPFFPVertex_H
+#define HERWIG_LHTPFFPVertex_H
+//
+// This is the declaration of the LHTPFFPVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPFFPVertex class implements the couplings of the photon
+ * and its heavy partner \f$A_H\f$ in the Little Higgs model with T-parity.
+ */
+class LHTPFFPVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPFFPVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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;
+ //@}
+
+protected:
+
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPFFPVertex & operator=(const LHTPFFPVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The charge of the Standard Model fermions.
+ */
+ vector<double> charge_;
+
+ /**
+ * The last value of the coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+ //@}
+
+ /**
+ * Couplings of the fermion and T-fermions to the \f$A_H\f$
+ */
+ //@{
+ /**
+ * Coupling of \f$dd_-A_H\f$
+ */
+ double coupd_;
+
+ /**
+ * Coupling of \f$uu_-A_H\f$
+ */
+ double coupu_;
+
+ /**
+ * Coupling of \f$ee_-A_H\f$
+ */
+ double coupe_;
+
+ /**
+ * Coupling of \f$\nu\nu_-A_H\f$
+ */
+ double coupnu_;
+
+ /**
+ * Coupling of heavy top
+ */
+ double TPreFactor_;
+
+ /**
+ * Left mixings
+ */
+ double sL_,cL_;
+
+ /**
+ * Right mixings
+ */
+ double sR_,cR_;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHTPFFPVertex_H */
diff --git a/Models/LHTP/LHTPFFWVertex.cc b/Models/LHTP/LHTPFFWVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFWVertex.cc
@@ -0,0 +1,199 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPFFWVertex class.
+//
+
+#include "LHTPFFWVertex.h"
+#include "LHTPModel.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "ThePEG/StandardModel/CKMBase.h"
+#include "Herwig++/Models/StandardModel/StandardCKM.h"
+
+using namespace Herwig;
+
+IBPtr LHTPFFWVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPFFWVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPFFWVertex::persistentOutput(PersistentOStream & os) const {
+ os << ckm_ << sL_ << cL_;
+}
+
+void LHTPFFWVertex::persistentInput(PersistentIStream & is, int) {
+ is >> ckm_ >> sL_ >> cL_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPFFWVertex,FFVVertex>
+describeHerwigLHTPFFWVertex("Herwig::LHTPFFWVertex", "HwLHTPModel.so");
+
+void LHTPFFWVertex::Init() {
+
+ static ClassDocumentation<LHTPFFWVertex> documentation
+ ("The LHTPFFWVertex class implements the couplings of the W"
+ " and W_H bosons of the Little Higgss model with T-parity to the fermions.");
+
+}
+
+void LHTPFFWVertex::doinit() {
+ // particles for outgoing W-
+ // quarks
+ for(int ix = 1; ix < 6; ix += 2) {
+ for(int iy = 2; iy < 7; iy += 2) {
+ addToList(-ix, iy, -24);
+ }
+ }
+ // additional T quark
+ addToList(-5, 8, -24);
+ // leptons
+ for(int ix = 11; ix < 17; ix += 2) {
+ addToList(-ix, ix + 1, -24);
+ }
+ // T-odd quarks
+ for(long ix = 4000002; ix < 4000007; ix += 2) {
+ addToList(-ix + 1, ix, -24);
+ }
+ // T-odd leptons
+ for(long ix = 4000011; ix < 4000017; ix += 2) {
+ addToList(-ix, ix + 1, -24);
+ }
+ // particles for outgoing W+
+ // quarks
+ for(int ix = 2; ix < 7; ix += 2) {
+ for(int iy = 1; iy < 6; iy += 2) {
+ addToList(-ix, iy, 24);
+ }
+ }
+ // additional T quark
+ addToList(-8, 5, 24);
+ // leptons
+ for(int ix = 11; ix < 17; ix += 2) {
+ addToList(-ix - 1, ix, 24);
+ }
+ // T-odd quarks
+ for(long ix = 4000002; ix < 4000009; ix += 2) {
+ addToList(-ix, ix-1, 24);
+ }
+ // T-odd leptons
+ for(long ix = 4000011; ix < 4000017; ix += 2) {
+ addToList(-ix-1, ix, 24);
+ }
+ // particles for W_H-
+ // quark and T-odd quark
+ for(int ix = 1; ix < 6; ix += 2) {
+ addToList(-ix-4000000, ix+1, -34);
+ addToList(-ix, ix+1+4000000, -34);
+ }
+ addToList(-4000005, 8, -34);
+ // lepton and T-odd lepton
+ for(int ix = 11;ix < 17; ix += 2) {
+ addToList(-ix-4000000, ix+1, -34);
+ addToList(-ix, ix+1+4000000, -34);
+ }
+ // particles for w_h+
+ // quark and T-odd quark
+ for(int ix = 1;ix < 6;ix += 2) {
+ addToList(ix + 4000000, -ix - 1, 34);
+ addToList(ix, -ix - 4000001, 34);
+ }
+ addToList(4000005, -8, 34);
+ // leptons and T-odd lepton
+ for(int ix = 11; ix < 17; ix += 2) {
+ addToList(-ix - 4000001, ix, 34);
+ addToList(-ix - 1, ix + 4000000, 34);
+ }
+ ThePEG::Helicity::FFVVertex::doinit();
+ Ptr<CKMBase>::transient_pointer CKM = generator()->standardModel()->CKM();
+ // cast the CKM object to the HERWIG one
+ ThePEG::Ptr<Herwig::StandardCKM>::transient_const_pointer
+ hwCKM = ThePEG::dynamic_ptr_cast< ThePEG::Ptr<Herwig::StandardCKM>::
+ transient_const_pointer>(CKM);
+ if(hwCKM) {
+ vector< vector<Complex > > CKM;
+ CKM = hwCKM->getUnsquaredMatrix(generator()->standardModel()->families());
+ for(unsigned int ix=0;ix<3;++ix) {
+ for(unsigned int iy=0;iy<3;++iy) {
+ ckm_[ix][iy]=CKM[ix][iy];
+ }
+ }
+ }
+ else {
+ throw InitException() << "Must have access to the Herwig::StandardCKM object"
+ << "for the CKM matrix in LHTPFFWVertex::doinit()"
+ << Exception::runerror;
+ }
+ // model
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the LHTPModel "
+ << " in LHTPFFWVertex::doinit()"
+ << Exception::runerror;
+ sL_ = model->sinThetaL();
+ cL_ = model->cosThetaL();
+}
+
+LHTPFFWVertex::LHTPFFWVertex()
+ : sL_(0.), cL_(1.), ckm_(3,vector<Complex>(3,0.0)),
+ coupLast_(0.),q2Last_(ZERO) {
+ orderInGem(1);
+ orderInGs(0);
+}
+
+// coupling for FFW vertex
+void LHTPFFWVertex::setCoupling(Energy2 q2, tcPDPtr a,
+ tcPDPtr b, tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=q2Last_) {
+ coupLast_ = -sqrt(0.5)*weakCoupling(q2);
+ q2Last_ = q2;
+ }
+ norm(coupLast_);
+ long ia(abs(a->id())),ib(abs(b->id()));
+ // SM W boson
+ if(abs(c->id())==ParticleID::Wplus) {
+ // quarks
+ if(ia >= 1 && ia <= 8 && ib >= 1 && ib <= 8 ) {
+ int iu,id;
+ // up type first
+ if(ia % 2 == 0) {
+ iu = ia/2;
+ id = (ib+1)/2;
+ }
+ // down type first
+ else {
+ iu = ib/2;
+ id = (ia+1)/2;
+ }
+ if(iu==4) iu=3;
+ assert( iu>=1 && iu<=3 && id>=1 && id<=3);
+ if ( ia==6 || ib==6 ) left(ckm_[iu-1][id-1]*cL_);
+ else if ( ia==8 || ib==8 ) left(ckm_[iu-1][id-1]*sL_);
+ else left(ckm_[iu-1][id-1] );
+ right(0.);
+ }
+ // leptons
+ else if( ia >= 11 && ia <= 16) {
+ left(1.);
+ right(0.);
+ }
+ else {
+ left (1.);
+ right(1.);
+ }
+ }
+ else {
+ if(ia==6||ib==6) left(-cL_);
+ else if(ia==8||ib==8) left(-sL_);
+ else left(-1. );
+ right(0.);
+ }
+}
diff --git a/Models/LHTP/LHTPFFWVertex.fh b/Models/LHTP/LHTPFFWVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFWVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPFFWVertex class.
+//
+#ifndef HERWIG_LHTPFFWVertex_FH
+#define HERWIG_LHTPFFWVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPFFWVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPFFWVertex,LHTPFFWVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPFFWVertex.h b/Models/LHTP/LHTPFFWVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFWVertex.h
@@ -0,0 +1,128 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPFFWVertex_H
+#define HERWIG_LHTPFFWVertex_H
+//
+// This is the declaration of the LHTPFFWVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+#include "ThePEG/StandardModel/StandardModelBase.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPFFWVertex class implements the coupling of the \f$W^\pm\f$
+ * and \f$W^\pm_H\f$ bosons of the Little Higgs model with T-parity to fermions.
+ * For simplicity the coupling are assumed to be flavour diagonal.
+ */
+class LHTPFFWVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPFFWVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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;
+ //@}
+
+protected:
+
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPFFWVertex & operator=(const LHTPFFWVertex &);
+
+private:
+
+ /**
+ * @name Storage of the couplings.
+ */
+ //@{
+ /**
+ * Left mixings
+ */
+ double sL_,cL_;
+
+ /**
+ * The elements of the CKM matrix.
+ */
+ vector<vector<Complex> > ckm_;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+ //@}
+};
+
+}
+
+#endif /* HERWIG_LHTPFFWVertex_H */
diff --git a/Models/LHTP/LHTPFFZVertex.cc b/Models/LHTP/LHTPFFZVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFZVertex.cc
@@ -0,0 +1,232 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPFFZVertex class.
+//
+
+#include "LHTPFFZVertex.h"
+#include "LHTPModel.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+IBPtr LHTPFFZVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPFFZVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPFFZVertex::persistentOutput(PersistentOStream & os) const {
+ os << gl_ << gr_ << tl_ << tr_ << coupd_ << coupu_ << coupe_ << coupnu_
+ << sL_ << cL_ << sR_ << cR_;
+}
+
+void LHTPFFZVertex::persistentInput(PersistentIStream & is, int) {
+ is >> gl_ >> gr_ >> tl_ >> tr_ >> coupd_ >> coupu_ >> coupe_ >> coupnu_
+ >> sL_ >> cL_ >> sR_ >> cR_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPFFZVertex,FFVVertex>
+describeHerwigLHTPFFZVertex("Herwig::LHTPFFZVertex", "HwLHTPModel.so");
+
+void LHTPFFZVertex::Init() {
+
+ static ClassDocumentation<LHTPFFZVertex> documentation
+ ("The LHTPFFZVertex class implements the couplings of "
+ "the fermions to the Z boson and its heavy partner in the"
+ " Little Higgs model with T-parity.");
+
+}
+
+LHTPFFZVertex::LHTPFFZVertex()
+ : gl_(37,0.0), gr_(37,0.0), tl_( 6,0.0), tr_( 6,0.0),
+ coupd_(0.), coupu_(0.), coupe_(0.), coupnu_(0.),
+ sL_(0.), cL_(1.), sR_(0.), cR_(1.),
+ coupLast_(0.0), q2Last_(0.*GeV2) {
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHTPFFZVertex::doinit() {
+ // Z
+ // the quarks
+ for(int ix = 1; ix < 7; ++ix) {
+ addToList(-ix, ix, 23);
+ }
+ // T+T+
+ addToList(-8, +8, 23);
+ //T+t
+ addToList(-6, +8, 23);
+ addToList(-8, +6, 23);
+ // the leptons
+ for(int ix = 11; ix < 17; ++ix) {
+ addToList(-ix, ix, 23);
+ }
+ // the T-odd quarks
+ for(long ix = 4000001; ix < 4000007; ++ix) {
+ addToList(-ix, ix, 23);
+ }
+ addToList(-4000008, +4000008, 23);
+ // the T-odd leptons
+ for(long ix = 11;ix<17;++ix) {
+ addToList(-ix-4000000, ix+4000000, 23);
+ }
+ // Z_H
+ // the quarks
+ for(int ix=1;ix<7;++ix) {
+ addToList(-ix-4000000, ix, 33);
+ addToList(-ix, ix+4000000, 33);
+ }
+ addToList( -8, +4000008, 33);
+ addToList( 8, -4000008, 33);
+ addToList( -6, +4000008, 33);
+ addToList( 6, -4000008, 33);
+ // the leptons
+ for(int ix=11;ix<17;++ix) {
+ addToList(-ix-4000000, ix, 33);
+ addToList(-ix, ix+4000000, 33);
+ }
+ // model
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the LHTPModel "
+ << " in LHTPFFPVertex::doinit()"
+ << Exception::runerror;
+ double sw = model->sin2ThetaW();
+ double cw = sqrt(1.-sw);
+ sw = sqrt(sw);
+ double fact = 0.25/sw/cw;
+ for(int ix=1;ix<4;++ix) {
+ // SM fermions
+ gl_[2*ix-1] = fact*(model->vd() + model->ad() );
+ gl_[2*ix ] = fact*(model->vu() + model->au() );
+ gl_[2*ix+9 ] = fact*(model->ve() + model->ae() );
+ gl_[2*ix+10] = fact*(model->vnu() + model->anu());
+ gr_[2*ix-1] = fact*(model->vd() - model->ad() );
+ gr_[2*ix ] = fact*(model->vu() - model->au() );
+ gr_[2*ix+9 ] = fact*(model->ve() - model->ae() );
+ gr_[2*ix+10] = fact*(model->vnu() - model->anu());
+ // T-odd fermions
+ gl_[2*ix-1 +20] = fact*(model->vd() + model->ad() );
+ gl_[2*ix +20] = fact*(model->vu() + model->au() );
+ gl_[2*ix+9 +20] = fact*(model->ve() + model->ae() );
+ gl_[2*ix+10+20] = fact*(model->vnu() + model->anu());
+ gr_[2*ix-1 +20] = gl_[2*ix-1 +20];
+ gr_[2*ix +20] = gl_[2*ix +20];
+ gr_[2*ix+9 +20] = gl_[2*ix+9 +20];
+ gr_[2*ix+10+20] = gl_[2*ix+10+20];
+ }
+ // couplngis to Z for extended top sector
+ tl_[0] = (0.5*sqr(model->cosThetaL())-2./3.*sqr(sw))/cw/sw;
+ tr_[0] = -2./3.*sw/cw;
+ tl_[1] = (0.5*sqr(model->sinThetaL())-2./3.*sqr(sw))/cw/sw;
+ tr_[1] = -2./3.*sw/cw;
+ tl_[2] = 0.5/sw/cw*model->sinThetaL()*model->cosThetaL();
+ tr_[2] = 0.;
+ // couplings to the Z_H of T-odd fermions
+ double cH = model->cosThetaH();
+ double sH = model->sinThetaH();
+ sL_ = model->sinThetaL();
+ cL_ = model->cosThetaL();
+ sR_ = model->sinThetaR();
+ cR_ = model->cosThetaR();
+ coupd_ = 0.1*(sH/cw+5.*cH/sw);
+ coupu_ = 0.1*(sH/cw-5.*cH/sw);
+ coupe_ = 0.1*(sH/cw+5.*cH/sw);
+ coupnu_ = 0.1*(sH/cw-5.*cH/sw);
+ tl_[5] = -2./3.*sw/cw;
+ tr_[5] = -2./3.*sw/cw;
+ // couplings of T-odd top to the Z_H
+ tl_[3] = 0.4*sH*sL_/cw;
+ tr_[3] = 0.4*sH*sR_/cw;
+ tl_[4] =-0.4*sH*cL_/cw;
+ tr_[4] =-0.4*sH*cR_/cw;
+ // base class initialisation
+ FFVVertex::doinit();
+}
+
+void LHTPFFZVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=q2Last_) {
+ coupLast_ = -electroMagneticCoupling(q2);
+ q2Last_=q2;
+ }
+ norm(coupLast_);
+ // the left and right couplings
+ long iferm = abs(a->id());
+ long ianti = abs(b->id());
+ long ibos = c->id();
+ if(ibos == ParticleID::Z0) {
+ if(iferm == 8 || iferm == 6) {
+ if(iferm == 6 && ianti == 6) {
+ left (tl_[0]);
+ right(tr_[0]);
+ }
+ else if(iferm == 8 && ianti == 8) {
+ left (tl_[1]);
+ right(tr_[1]);
+ }
+ else {
+ left (tl_[2]);
+ right(tr_[2]);
+ }
+ }
+ else if(iferm == 4000008) {
+ left (tl_[5]);
+ right(tr_[5]);
+ }
+ else if((iferm >= 1 && iferm <= 6)|| (iferm >= 11 && iferm <= 16)) {
+ left (gl_[iferm]);
+ right(gr_[iferm]);
+ }
+ else {
+ iferm = (iferm % 4000000) + 20;
+ left (gl_[iferm]);
+ right(gr_[iferm]);
+ }
+ }
+ else if(ibos == 33) {
+ if(iferm>4000000) swap(iferm,ianti);
+ assert(iferm<4000000&&ianti>4000000);
+ if( iferm == 6 || iferm == 8 ) {
+ if (iferm==6&&ianti==4000006) {
+ left (cL_*coupu_);
+ right(0.);
+ }
+ else if(iferm==6&&ianti==4000008) {
+ left (tl_[3]);
+ right(tr_[3]);
+ }
+ else if(iferm==8&&ianti==4000006) {
+ left (sL_*coupu_);
+ right(0.);
+ }
+ else if(iferm==8&&ianti==4000008) {
+ left ( tl_[4]);
+ right( tr_[4]);
+ }
+ else
+ assert(false);
+ }
+ else {
+ right(0.);
+ if(iferm <= 6) {
+ if(iferm % 2 == 0) left( coupu_ );
+ else left( coupd_ );
+ }
+ else {
+ if(iferm % 2 == 0) left( coupnu_ );
+ else left( coupe_ );
+ }
+ }
+ }
+ else
+ assert(false);
+}
diff --git a/Models/LHTP/LHTPFFZVertex.fh b/Models/LHTP/LHTPFFZVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFZVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPFFZVertex class.
+//
+#ifndef HERWIG_LHTPFFZVertex_FH
+#define HERWIG_LHTPFFZVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPFFZVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPFFZVertex,LHTPFFZVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPFFZVertex.h b/Models/LHTP/LHTPFFZVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPFFZVertex.h
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPFFZVertex_H
+#define HERWIG_LHTPFFZVertex_H
+//
+// This is the declaration of the LHTPFFZVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPFFZVertex class implements the couples of the \f$Z^0\f$
+ * boson and its heavy partner to the fermions in the Little Higgs
+ * model with T-parity.
+ */
+class LHTPFFZVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPFFZVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPFFZVertex & operator=(const LHTPFFZVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The left couplings of the Standard Model fermions.
+ */
+ vector<double> gl_;
+
+ /**
+ * The right couplings of the Standard Model fermions.
+ */
+ vector<double> gr_;
+
+ /**
+ * The left couplings to the Z for the extended top sector
+ */
+ vector<double> tl_;
+
+ /**
+ * The right couplings to the Z for the extended top sector
+ */
+ vector<double> tr_;
+
+ /**
+ * Coupling of \f$dd_-Z_H\f$
+ */
+ double coupd_;
+
+ /**
+ * Coupling of \f$uu_-Z_H\f$
+ */
+ double coupu_;
+
+ /**
+ * Coupling of \f$ee_-Z_H\f$
+ */
+ double coupe_;
+
+ /**
+ * Coupling of \f$\nu\nu_-Z_H\f$
+ */
+ double coupnu_;
+
+ /**
+ * Left mixings
+ */
+ double sL_,cL_;
+
+ /**
+ * Right mixings
+ */
+ double sR_,cR_;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHTPFFZVertex_H */
diff --git a/Models/LHTP/LHTPHHHVertex.cc b/Models/LHTP/LHTPHHHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPHHHVertex.cc
@@ -0,0 +1,75 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPHHHVertex class.
+//
+
+#include "LHTPHHHVertex.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 "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHTPHHHVertex::LHTPHHHVertex() : ratio_(ZERO), coupLast_(0.), q2Last_(ZERO) {
+ orderInGem(1);
+ orderInGs (0);
+}
+
+IBPtr LHTPHHHVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPHHHVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPHHHVertex::persistentOutput(PersistentOStream & os) const {
+ os << ounit(ratio_,GeV);
+}
+
+void LHTPHHHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(ratio_,GeV);
+}
+
+// The following static variable is needed for the type
+// description system in ThePEG.
+DescribeClass<LHTPHHHVertex,SSSVertex>
+describeHerwigLHTPHHHVertex("Herwig::LHTPHHHVertex", "HwLHTPModel.so");
+
+void LHTPHHHVertex::Init() {
+
+ static ClassDocumentation<LHTPHHHVertex> documentation
+ ("The LHTPHHHVertex class implements the trilinear Higgs boson"
+ " self couplings in the Little Higgs model with T-parity");
+
+}
+
+void LHTPHHHVertex::doinit() {
+ addToList(25,25, 25);
+ addToList(25,35, 35);
+ addToList(25,36, 36);
+ addToList(25,37,-37);
+ SSSVertex::doinit();
+ ratio_ = sqr(getParticleData(ParticleID::h0)->mass())/
+ getParticleData(ParticleID::Wplus)->mass();
+}
+
+void LHTPHHHVertex::setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr) {
+ if(q2!=q2Last_||coupLast_==0.) {
+ coupLast_ = weakCoupling(q2)*ratio_*UnitRemoval::InvE;
+ q2Last_=q2;
+ }
+ long id = part2->id()!=ParticleID::h0 ? abs(part2->id()) : abs(part1->id());
+ if(id==ParticleID::h0) norm( -coupLast_);
+ else if(id==35) norm( 3.*coupLast_);
+ else if(id==36) norm( 3.*coupLast_);
+ else if(id==37) norm(1.5*coupLast_);
+ else assert(false);
+}
diff --git a/Models/LHTP/LHTPHHHVertex.h b/Models/LHTP/LHTPHHHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPHHHVertex.h
@@ -0,0 +1,120 @@
+// -*- C++ -*-
+#ifndef Herwig_LHTPHHHVertex_H
+#define Herwig_LHTPHHHVertex_H
+//
+// This is the declaration of the LHTPHHHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/SSSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+ using namespace ThePEG::Helicity;
+
+/**
+ * The LHTPHHHVertex class implements the triple Higgs boson interactions
+ * in the Little Higgs model
+ * with T-parity.
+ */
+class LHTPHHHVertex : public SSSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPHHHVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+ /** @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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPHHHVertex & operator=(const LHTPHHHVertex &);
+
+private:
+
+ /**
+ * ratio of masses
+ */
+ Energy ratio_;
+
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+
+};
+
+}
+
+#endif /* Herwig_LHTPHHHVertex_H */
diff --git a/Models/LHTP/LHTPModel.cc b/Models/LHTP/LHTPModel.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPModel.cc
@@ -0,0 +1,302 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPModel class.
+//
+
+#include "LHTPModel.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Interface/Reference.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Interface/Switch.h"
+#include "ThePEG/Interface/Parameter.h"
+#include "ThePEG/Interface/ParVector.h"
+#include "ThePEG/Interface/RefVector.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "gsl/gsl_multiroots.h"
+#include "ThePEG/Repository/CurrentGenerator.h"
+#include <algorithm>
+
+using namespace Herwig;
+using namespace ThePEG;
+
+// equations for top parameters for GSL
+namespace {
+
+// struct to provide the model parameters to the functions
+struct tparams {
+ Energy v;
+ Energy f;
+ Energy mt;
+ double tan2a;
+};
+
+// equations defining tan 2alpha and mt expressed in form f(lambda1,lambda2)=0
+// to be solved to give lambda1 and lambda2 by gsl
+int top_equation(const gsl_vector * x, void *params, gsl_vector *f ) {
+ // yukawa and check top mass
+ const double lam1 = gsl_vector_get(x,0);
+ const double lam2 = gsl_vector_get(x,1);
+ Energy fs = ((struct tparams *) params)->f;
+ Energy v = ((struct tparams *) params)->v;
+ double sv = sin(sqrt(2.)*v/fs);
+ double cv = cos(sqrt(2.)*v/fs);
+ Energy mt = ((struct tparams *) params)->mt;
+ double tan2a = ((struct tparams *) params)->tan2a;
+ double f1 = 4.*lam1*lam2*(1.+cv)/(4.*sqr(lam2)-sqr(lam1)*(2.*sqr(sv)+sqr(1.+cv)))
+ -tan2a;
+ double delta = 0.5*(sqr(lam2)+0.5*sqr(lam1)*(sqr(sv)+0.5*sqr(1.+cv)));
+ double f2 = sqr(fs/mt)*delta*(1.-sqrt(1.-0.5*sqr(lam1*lam2*sv/delta)))-1.;
+ if(lam1*lam2<0.) f1+=1e10;
+ if(lam1*lam2<0.) f2+=1e10;
+ gsl_vector_set(f,0,f1);
+ gsl_vector_set(f,1,f2);
+ return GSL_SUCCESS;
+}
+
+}
+
+LHTPModel::LHTPModel()
+ : f_(0.5*TeV), salpha_(sqrt(0.5)), calpha_(sqrt(0.5)), sbeta_(0.), cbeta_(0.),
+ sL_(0.), cL_(1.), sR_(0.), cR_(0.),
+ kappaQuark_(1.), kappaLepton_(1.), mh_(125.*GeV), v_(246.*GeV),
+ g_(sqrt(0.43)), gp_(sqrt(0.12)), approximate_(false)
+{}
+
+IBPtr LHTPModel::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPModel::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPModel::persistentOutput(PersistentOStream & os) const {
+ os << ounit(f_,TeV) << salpha_ << calpha_ << sbeta_ << cbeta_
+ << kappaQuark_ << kappaLepton_ << ounit(v_,GeV)
+ << g_ << gp_ << sthetaH_ << cthetaH_ << approximate_
+ << sL_ << cL_ << sR_ << cR_ << WHHVertex_;
+}
+
+void LHTPModel::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(f_,TeV) >> salpha_ >> calpha_ >> sbeta_ >> cbeta_
+ >> kappaQuark_ >> kappaLepton_>> iunit(v_,GeV)
+ >> g_ >> gp_ >> sthetaH_ >> cthetaH_ >> approximate_
+ >> sL_ >> cL_ >> sR_ >> cR_ >> WHHVertex_;
+}
+
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPModel,StandardModel>
+describeHerwigLHTPModel("Herwig::LHTPModel", "HwLHTPModel.so");
+
+void LHTPModel::Init() {
+
+ static ClassDocumentation<LHTPModel> documentation
+ ("The LHTPModel class implements the Little Higgs model"
+ " with T-parity");
+
+ static Parameter<LHTPModel,Energy> interfacef
+ ("f",
+ "The scale of the non-linear sigma-model",
+ &LHTPModel::f_, TeV, 1.*TeV, 0.0*TeV, 10.0*TeV,
+ true, false, Interface::limited);
+
+ static Parameter<LHTPModel,double> interfaceSinAlpha
+ ("SinAlpha",
+ "The parameter controlling the mixing in the top quark sector of the model",
+ &LHTPModel::salpha_, sqrt(0.5), 0.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<LHTPModel,double> interfaceKappaQuark
+ ("KappaQuark",
+ "The parameter controlling the masses of the T-odd quarks",
+ &LHTPModel::kappaQuark_, 1.0, 0.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<LHTPModel,double> interfaceKappaLepton
+ ("KappaLepton",
+ "The parameter controlling the masses of the T-odd leptons",
+ &LHTPModel::kappaLepton_, 1.0, 0.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<LHTPModel,Energy> interfaceHiggsMass
+ ("HiggsMass",
+ "The mass of the lightest Higgs boson",
+ &LHTPModel::mh_, GeV, 120.0*GeV, 100.0*GeV, 1000.0*GeV,
+ false, false, Interface::limited);
+
+ static Switch<LHTPModel,bool> interfaceApproximate
+ ("Approximate",
+ "Whether to use the full expression for the mases of the top quark"
+ " and its partners or the second-order expansion in v/f.",
+ &LHTPModel::approximate_, false, false, false);
+ static SwitchOption interfaceApproximateYes
+ (interfaceApproximate,
+ "Yes",
+ "Approximate",
+ true);
+ static SwitchOption interfaceApproximateNo
+ (interfaceApproximate,
+ "No",
+ "Don't approximate",
+ false);
+
+ static Reference<LHTPModel,AbstractVSSVertex> interfaceVertexWHH
+ ("Vertex/WHH",
+ "Vertex for the interactions of the electroweak gauge"
+ " bosons and two Higgs bosons.",
+ &LHTPModel::WHHVertex_, false, false, true, false, false);
+
+}
+
+void LHTPModel::doinit() {
+ addVertex(WHHVertex_);
+ StandardModel::doinit();
+ using Constants::pi;
+ // compute the parameters of the model
+ // W and Z masses
+ Energy mw(getParticleData(ParticleID::Wplus)->mass());
+ Energy mz(getParticleData(ParticleID::Z0)->mass());
+ // couplings g and g'
+// double ee = sqrt(4.*pi*alphaEM(sqr(mz)));
+ double ee = sqrt(4.*pi*alphaEMMZ());
+ double sw(sqrt(sin2ThetaW())),cw(sqrt(1.-sin2ThetaW()));
+ g_ = ee/sw;
+ gp_ = ee/cw;
+ // vev
+ v_ = 2.*mw/g_;
+ double vf(sqr(v_/f_));
+ // calculate masses of the new particles from input
+ // and SM parameters
+ // masses of the new gauge bosons (MWH = MZH)
+ Energy MAH = gp_*f_*sqrt(0.2)*(1.-0.625*vf);
+ Energy MZH = g_ *f_* (1.-0.125*vf);
+ // mixings
+ sthetaH_ = 1.25*g_*gp_/(5.*sqr(g_)-sqr(gp_))*vf;
+ cthetaH_ = sqrt(1.-sqr(sthetaH_));
+ // masses of the new top quarks
+ Energy MTp,MTm;
+ topMixing(MTp,MTm);
+ // mixings in the top sector
+ sL_ = sqr(salpha_)*v_/f_;
+ cL_ = sqrt(1.-sqr(sL_));
+ sR_ = salpha_*(1.-0.5*sqr(calpha_)*(sqr(calpha_)-sqr(salpha_))*vf);
+ cR_ = sqrt(1.-sqr(sR_));
+ // masses of the T-odd fermions
+ Energy Mdm = sqrt(2.)*kappaQuark_ *f_;
+ Energy Mum = sqrt(2.)*kappaQuark_ *f_*(1.-0.125*vf);
+ Energy Mlm = sqrt(2.)*kappaLepton_*f_;
+ Energy Mnm = sqrt(2.)*kappaLepton_*f_*(1.-0.125*vf);
+ // masses of the triplet higgs
+ Energy MPhi = sqrt(2.)*mh_*f_/v_;
+ // set the masses of the new particles
+ // new gauge bosons
+ resetMass( 32 , MAH );
+ resetMass( 33 , MZH );
+ resetMass( 34 , MZH );
+ resetMass(-34 , MZH );
+ // masses of the new top quarks
+ resetMass( 8 , MTp );
+ resetMass( -8 , MTp );
+ resetMass( 4000008, MTm );
+ resetMass( -4000008, MTm );
+ // masses of the Higgs bosons
+ resetMass( 25 , mh_ );
+ resetMass( 35 , MPhi );
+ resetMass( 36 , MPhi );
+ resetMass( 37 , MPhi );
+ resetMass(-37 , MPhi );
+ resetMass( 38 , MPhi );
+ resetMass(-38 , MPhi );
+ // masses of the T-odd quarks
+ resetMass( 4000001, Mdm );
+ resetMass(-4000001, Mdm );
+ resetMass( 4000002, Mum );
+ resetMass(-4000002, Mum );
+ resetMass( 4000003, Mdm );
+ resetMass(-4000003, Mdm );
+ resetMass( 4000004, Mum );
+ resetMass(-4000004, Mum );
+ resetMass( 4000005, Mdm );
+ resetMass(-4000005, Mdm );
+ resetMass( 4000006, Mum );
+ resetMass(-4000006, Mum );
+ // masses of the T-odd leptons
+ resetMass( 4000011, Mlm );
+ resetMass(-4000011, Mlm );
+ resetMass( 4000012, Mnm );
+ resetMass(-4000012, Mnm );
+ resetMass( 4000013, Mlm );
+ resetMass(-4000013, Mlm );
+ resetMass( 4000014, Mnm );
+ resetMass(-4000014, Mnm );
+ resetMass( 4000015, Mlm );
+ resetMass(-4000015, Mlm );
+ resetMass( 4000016, Mnm );
+ resetMass(-4000016, Mnm );
+}
+
+void LHTPModel::topMixing(Energy & MTp, Energy & MTm) {
+ double vf(sqr(v_/f_));
+ Energy mt = getParticleData(ParticleID::t)->mass();
+ calpha_ = sqrt(1.-sqr(salpha_));
+ double sv(sin(sqrt(2.)*v_/f_)),cv(cos(sqrt(2.)*v_/f_));
+ // first guess for Yukawa's based on second-order in v/f expansion
+ double lambda1 = mt/v_/calpha_*(1.+(2.-3.*pow(salpha_,4))*vf/6.);
+ double lambda2 = mt/v_/salpha_*(1.+(2.-3.*pow(calpha_,4))*vf/6.);
+ // first guess for masses
+ MTp = sqrt(sqr(lambda1)+sqr(lambda2))*f_*(1-0.5*vf*sqr(calpha_*salpha_));
+ MTm = lambda2*f_;
+ if(!approximate_) {
+ // special case where denominator of tan 2 alpha eqn is zero
+ if(abs(salpha_-sqrt(0.5))<1e-4) {
+ double a = 0.25*(2.*sqr(sv)+sqr(1.+cv));
+ double b = 0.5*(a+0.5*(sqr(sv)+0.5*sqr(1.+cv)));
+ lambda1 = mt/f_*sqrt(1./b/(1.-sqrt(1.-0.5*a*sqr(sv/b))));
+ lambda2 = sqrt(a)*lambda1;
+ }
+ // general case using GSL
+ else {
+ double ca = sqrt(1.-sqr(salpha_));
+ double ta = salpha_/ca;
+ double tan2a = 2.*ta/(1.-sqr(ta));
+ const gsl_multiroot_fsolver_type *T;
+ gsl_multiroot_fsolver *s;
+ int status;
+ size_t iter=0;
+ const size_t n=2;
+ struct tparams p = {v_,f_,mt,tan2a};
+ gsl_multiroot_function f = {&top_equation, n, &p};
+ gsl_vector *x = gsl_vector_alloc(n);
+ gsl_vector_set(x,0,lambda1);
+ gsl_vector_set(x,1,lambda2);
+ T = gsl_multiroot_fsolver_hybrids;
+ s = gsl_multiroot_fsolver_alloc(T,2);
+ gsl_multiroot_fsolver_set(s, &f,x);
+ do {
+ iter++;
+ status = gsl_multiroot_fsolver_iterate(s);
+ if(status) break;
+ status = gsl_multiroot_test_residual(s->f,1e-7);
+ }
+ while (status==GSL_CONTINUE && iter < 1000);
+ gsl_multiroot_fsolver_free(s);
+ lambda1 = gsl_vector_get(s->x,0);
+ lambda2 = gsl_vector_get(s->x,1);
+ gsl_vector_free(x);
+ }
+ // calculate the heavy top masses using full result
+ double delta = 0.5*(sqr(lambda2)+0.5*sqr(lambda1)*(sqr(sv)+0.5*sqr(1.+cv)));
+ double det = sqrt(1.-0.5*sqr(lambda1*lambda2*sv/delta));
+ MTp = sqrt(sqr(f_)*delta*(1.+det));
+ MTm = lambda2*f_;
+ }
+ // beta mixing angle
+ double beta = 0.5*atan(2.*sqrt(2.)*sqr(lambda1)*sv*(1.+cv)/
+ (4.*sqr(lambda2)+sqr(1.+cv)*sqr(lambda1)-2.*sqr(lambda1)*sv));
+ sbeta_ = sin(beta);
+ cbeta_ = cos(beta);
+}
diff --git a/Models/LHTP/LHTPModel.fh b/Models/LHTP/LHTPModel.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPModel.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPModel class.
+//
+#ifndef THEPEG_LHTPModel_FH
+#define THEPEG_LHTPModel_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPModel;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPModel,LHTPModelPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPModel.h b/Models/LHTP/LHTPModel.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPModel.h
@@ -0,0 +1,302 @@
+// -*- C++ -*-
+#ifndef THEPEG_LHTPModel_H
+#define THEPEG_LHTPModel_H
+//
+// This is the declaration of the LHTPModel class.
+//
+
+#include "Herwig++/Models/StandardModel/StandardModel.h"
+#include "ThePEG/Helicity/Vertex/AbstractVSSVertex.h"
+#include "LHTPModel.fh"
+
+namespace Herwig {
+
+/**
+ * The LHTPModel class is the main class for the
+ * implementation of the Little Higgs model with T-parity
+ *
+ * @see \ref LHTPModelInterfaces "The interfaces"
+ * defined for LHTPModel.
+ */
+class LHTPModel: public StandardModel {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPModel();
+
+ /**
+ * Access to the parameters of the model
+ */
+ //@{
+ /**
+ * The vacuum expection value
+ */
+ Energy vev() const { return v_; }
+
+ /**
+ * The \f$f\f$ scale of the non-linear \f$\sigma\f$-model
+ */
+ Energy f() const { return f_; }
+
+ /**
+ * \f$\sin\alpha\f$
+ */
+ double sinAlpha() const { return salpha_; }
+
+ /**
+ * \f$\cos\alpha\f$
+ */
+ double cosAlpha() const { return calpha_; }
+
+ /**
+ * \f$\sin\beta\f$
+ */
+ double sinBeta() const { return sbeta_; }
+
+ /**
+ * \f$\cos\beta\f$
+ */
+ double cosBeta() const { return cbeta_; }
+
+ /**
+ * \f$\sin\theta_H\f$
+ */
+ double sinThetaH() const { return sthetaH_; }
+
+ /**
+ * \f$\cos\theta_H\f$
+ */
+ double cosThetaH() const { return cthetaH_; }
+
+ /**
+ * \f$\sin\theta_L\f$
+ */
+ double sinThetaL() const { return sL_;}
+
+ /**
+ * \f$\cos\theta_L\f$
+ */
+ double cosThetaL() const { return cL_;}
+
+ /**
+ * \f$\sin\theta_R\f$
+ */
+ double sinThetaR() const { return sR_;}
+
+ /**
+ * \f$\cos\theta_R\f$
+ */
+ double cosThetaR() const { return cR_;}
+ //@}
+
+ /**
+ * Yukwawa for T-odd fermions
+ */
+ //@{
+ /**
+ * The \f$\kappa_q\f$ parameter which controls the properties of the
+ * T-odd quarks
+ */
+ double kappaQuark() const { return kappaQuark_;}
+
+ /**
+ * The \f$\kappa_\ell\f$ parameter which controls the properties of the
+ * T-odd leptons
+ */
+ double kappaLepton() const { return kappaLepton_;}
+ //@}
+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;
+ //@}
+
+protected:
+
+ /**
+ * Calculate the mixing in the top sector of the model
+ * and the masses of the T-odd and T-even heavy tops
+ * The mixings are calculated by solving Eqns 2.22 and 2.24 of hep-ph/0506042
+ * for \f$\lambda_1$ and \f$\lambda_2\f$ given the input value of \f$\sin\alpha\f$
+ * and the top mass.
+ */
+ void topMixing(Energy & MTp, Energy & MTm);
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPModel & operator=(const LHTPModel &);
+
+private:
+
+ /**
+ * The constant for the non-linear \f$\sigma\f$ model
+ */
+ Energy f_;
+
+ /**
+ * @name The mixing in the top quark sector
+ */
+ //@{
+ /**
+ * \f$\sin\alpha\f$, taken as an input
+ */
+ double salpha_;
+
+ /**
+ * \f$\cos\alpha\f$
+ */
+ double calpha_;
+
+ /**
+ * \f$\sin\beta\f$
+ */
+ double sbeta_;
+
+ /**
+ * \f$\cos\beta\f$
+ */
+ double cbeta_;
+ //@}
+
+ /**
+ * @name Mixing of the heavy photon and Z
+ */
+ //@{
+ /**
+ * \f$\sin\theta_H\f$
+ */
+ double sthetaH_;
+
+ /**
+ * \f$\cos\theta_H\f$
+ */
+ double cthetaH_;
+ //@}
+
+ /**
+ * @name Mixings in the top sector
+ */
+ //@{
+ /**
+ * \f$\sin\theta_L\f$
+ */
+ double sL_;
+
+ /**
+ * \f$\cos\theta_L\f$
+ */
+ double cL_;
+
+ /**
+ * \f$\sin\theta_R\f$
+ */
+ double sR_;
+
+ /**
+ * \f$\cos\theta_R\f$
+ */
+ double cR_;
+ //@}
+
+ /**
+ * The \f$\kappa_q\f$ parameter which controls the properties of the
+ * T-odd quarks
+ */
+ double kappaQuark_;
+
+ /**
+ * The \f$\kappa_\ell\f$ parameter which controls the properties of the
+ * T-odd leptons
+ */
+ double kappaLepton_;
+
+ /**
+ * The mass of the Standard Model higgs
+ */
+ Energy mh_;
+
+ /**
+ * The vacuum expection valve
+ */
+ Energy v_;
+
+ /**
+ * The \f$g\f$ coupling
+ */
+ double g_;
+
+ /**
+ * the \f$g'\f$ coupling
+ */
+ double gp_;
+
+ /**
+ * Method for evaluating the masses
+ */
+ bool approximate_;
+
+ /**
+ * WHH Vertex
+ */
+ AbstractVSSVertexPtr WHHVertex_;
+};
+
+}
+
+#endif /* THEPEG_LHTPModel_H */
diff --git a/Models/LHTP/LHTPWHHVertex.cc b/Models/LHTP/LHTPWHHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWHHVertex.cc
@@ -0,0 +1,201 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPWHHVertex class.
+//
+
+#include "LHTPWHHVertex.h"
+#include "LHTPModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+LHTPWHHVertex::LHTPWHHVertex() :
+ coupLast_(0.), q2Last_(ZERO), coup_(11) {
+ orderInGs(0);
+ orderInGem(1);
+}
+
+IBPtr LHTPWHHVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPWHHVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPWHHVertex::persistentOutput(PersistentOStream & os) const {
+ os << coup_;
+}
+
+void LHTPWHHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> coup_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPWHHVertex,VSSVertex>
+describeHerwigLHTPWHHVertex("Herwig::LHTPWHHVertex", "HwLHTPModel.so");
+
+void LHTPWHHVertex::Init() {
+
+ static ClassDocumentation<LHTPWHHVertex> documentation
+ ("The LHTPWHHVertex class implements the coupling of a pair of Higgs"
+ " bosons to an electroweak gauge boson in the Little"
+ " Higgs model with T-parity.");
+
+}
+
+void LHTPWHHVertex::doinit() {
+ // photon
+ addToList( 22, 37,-37);
+ addToList( 22, 38,-38);
+ // Z0
+ addToList( 23, 37,-37);
+ addToList( 23, 38,-38);
+ addToList( 23, 35, 36);
+ // W+
+ addToList( 24, 35,-37);
+ addToList( 24, 36,-37);
+ addToList( 24, 37,-38);
+ // W-
+ addToList(-24, 35, 37);
+ addToList(-24, 36, 37);
+ addToList(-24,-37, 38);
+ // A_H
+ addToList( 32, 25, 36);
+ // Z_H
+ addToList( 33, 25, 36);
+ // W_H
+ addToList( 34, 25,-37);
+ addToList(-34, 25, 37);
+ VSSVertex::doinit();
+ // model
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHModel "
+ << " in LHWWWWVertex::doinit()"
+ << Exception::runerror;
+ double sw2(sin2ThetaW());
+ double sw(sqrt(sw2)),cw(sqrt(1.-sw2));
+ double vf(model->vev()/model->f());
+ coup_[ 0] = 1.;
+ coup_[ 1] = 2.;
+ coup_[ 2] =-sw/cw;
+ coup_[ 3] = (1.-2.*sw2)/cw/sw;
+ coup_[ 4] =-Complex(0.,1.)/cw/sw;
+ coup_[ 5] = sqrt(0.5)/sw;
+ coup_[ 6] = Complex(0.,1.)/sw*sqrt(0.5);
+ coup_[ 7] = 1./sw;
+ coup_[ 8] = Complex(0.,1)*sqrt(0.5)*vf/3./cw;
+ coup_[ 9] = Complex(0.,1)*sqrt(0.5)*vf/3./sw;
+ coup_[10] =-vf/6./sw;
+}
+
+void LHTPWHHVertex::setCoupling(Energy2 q2, tcPDPtr particle1,
+ tcPDPtr particle2, tcPDPtr particle3) {
+ if( q2 != q2Last_ || coupLast_==0.) {
+ q2Last_ = q2;
+ coupLast_ = electroMagneticCoupling(q2);
+ }
+ int ibos = particle1->id();
+ int isc1 = particle2->id();
+ int isc2 = particle3->id();
+ if(ibos==ParticleID::gamma) {
+ if(isc1==37)
+ norm(coup_[0]*coupLast_);
+ else if(isc1==38)
+ norm(coup_[1]*coupLast_);
+ else if(isc1==-37)
+ norm(-coup_[0]*coupLast_);
+ else if(isc1==-38)
+ norm(-coup_[1]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Z0) {
+ if(isc1==37)
+ norm(coup_[2]*coupLast_);
+ else if(isc1==38)
+ norm(coup_[3]*coupLast_);
+ else if(isc1==-37)
+ norm(-coup_[2]*coupLast_);
+ else if(isc1==-38)
+ norm(-coup_[3]*coupLast_);
+ else if(isc1==35)
+ norm(coup_[4]*coupLast_);
+ else if(isc2==35)
+ norm(-coup_[4]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Wplus) {
+ if(isc1==35)
+ norm(coup_[5]*coupLast_);
+ else if(isc1==36)
+ norm(coup_[6]*coupLast_);
+ else if(isc1==-38)
+ norm(-coup_[7]*coupLast_);
+ else if(isc2==35)
+ norm(-coup_[5]*coupLast_);
+ else if(isc2==36)
+ norm(-coup_[6]*coupLast_);
+ else if(isc2==-38)
+ norm( coup_[7]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==ParticleID::Wminus) {
+ if(isc1==35)
+ norm(conj(coup_[5])*coupLast_);
+ else if(isc1==36)
+ norm(conj(coup_[6])*coupLast_);
+ else if(isc1==38)
+ norm(-conj(coup_[7])*coupLast_);
+ else if(isc2==35)
+ norm(-conj(coup_[5])*coupLast_);
+ else if(isc2==36)
+ norm(-conj(coup_[6])*coupLast_);
+ else if(isc2==38)
+ norm( conj(coup_[7])*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==32) {
+ if(isc1==25)
+ norm( coup_[8]*coupLast_);
+ else if(isc2==25)
+ norm(-coup_[8]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==33) {
+ if(isc1==25)
+ norm( coup_[9]*coupLast_);
+ else if(isc2==25)
+ norm(-coup_[9]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==34) {
+ if(isc1==25)
+ norm( coup_[10]*coupLast_);
+ else if(isc2==25)
+ norm(-coup_[10]*coupLast_);
+ else
+ assert(false);
+ }
+ else if(ibos==-34) {
+ if(isc1==25)
+ norm( conj(coup_[10])*coupLast_);
+ else if(isc2==25)
+ norm(-conj(coup_[10])*coupLast_);
+ else
+ assert(false);
+ }
+ else
+ assert(false);
+}
diff --git a/Models/LHTP/LHTPWHHVertex.h b/Models/LHTP/LHTPWHHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWHHVertex.h
@@ -0,0 +1,118 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPWHHVertex_H
+#define HERWIG_LHTPWHHVertex_H
+//
+// This is the declaration of the LHTPWHHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/VSSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LHTPWHHVertex class implements the coupling of an electroweak gauge
+ * boson to a pair of Higgs bosons in the Little Higgs model with T-parity.
+ */
+class LHTPWHHVertex: public Helicity::VSSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPWHHVertex();
+
+ /** @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();
+
+ /**
+ * Calculate the coupling for the vertex
+ * @param q2 The scale to at which evaluate the coupling.
+ * @param particle1 The first particle in the vertex.
+ * @param particle2 The second particle in the vertex.
+ * @param particle3 The third particle in the vertex.
+ */
+ virtual void setCoupling(Energy2 q2, tcPDPtr particle1, tcPDPtr particle2,
+ tcPDPtr particle3);
+
+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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPWHHVertex & operator=(const LHTPWHHVertex &);
+
+private:
+
+ /**
+ * The value of the coupling when last evaluated
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+
+ /**
+ * Couplings
+ */
+ vector<Complex> coup_;
+};
+
+}
+
+#endif /* HERWIG_LHTPWHHVertex_H */
diff --git a/Models/LHTP/LHTPWWHVertex.cc b/Models/LHTP/LHTPWWHVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWHVertex.cc
@@ -0,0 +1,188 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPWWHVertex class.
+//
+
+#include "LHTPWWHVertex.h"
+#include "LHTPModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+IBPtr LHTPWWHVertex::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr LHTPWWHVertex::fullclone() const {
+ return new_ptr(*this);
+}
+
+void LHTPWWHVertex::persistentOutput(PersistentOStream & os) const {
+ os << ounit(coup_,GeV);
+}
+
+void LHTPWWHVertex::persistentInput(PersistentIStream & is, int) {
+ is >> iunit(coup_,GeV);
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPWWHVertex,VVSVertex>
+describeHerwigLHTPWWHVertex("Herwig::LHTPWWHVertex", "HwLHTPModel.so");
+
+void LHTPWWHVertex::Init() {
+
+ static ClassDocumentation<LHTPWWHVertex> documentation
+ ("The LHTPWWHVertex class implements the coupling of two electroweak"
+ " gauge bosons to a Higgs boson in the Little Higgs Model with T-Parity"
+ "including the additional heavy photon, Z and W bosons and the "
+ "triplet Higgs bosons.");
+
+}
+
+LHTPWWHVertex::LHTPWWHVertex() : coupLast_(0.), q2Last_(0.*GeV2) {
+ // order in the couplings
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHTPWWHVertex::doinit() {
+ // W_L W_L H
+ addToList( 24, -24, 25);
+ // Z_L Z_L H
+ addToList( 23, 23, 25);
+ // W_H W_H H
+ addToList( 34, -34, 25);
+ // Z_H Z_H H
+ addToList( 33, 33, 25);
+ // A_H A_H H
+ addToList( 32, 32, 25);
+ // Z_H A_H H
+ addToList( 33, 32, 25);
+ // Z_L Z_H Phi0
+ addToList( 23, 33, 35);
+ // A_H Z_L Phi0
+ addToList( 32, 23, 35);
+ // W_L W_H PhiP
+ addToList( 24, -34, 36);
+ addToList( 34, -24, 36);
+ // W_H Z_L Phi+/-
+ addToList( 34, 23, -37);
+ addToList( -34, 23, 37);
+ // W_L A_H Phi+/-
+ addToList( 24, 32, -37);
+ addToList( -24, 32, 37);
+ // W_L Z_H Phi+/-
+ addToList( 24, 33, -37);
+ addToList( -24, 33, 37);
+ // W_H A_L Phi+/-
+ addToList( 34, 22, -37);
+ addToList( -34, 22, 37);
+ // W_L W_H Phi --/++
+ addToList( 24, 34, -38);
+ addToList( -24, -34, 38);
+ // model
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the LHTPModel "
+ << " in LHTPWWHVertex::doinit()"
+ << Exception::runerror;
+ // base class
+ VVSVertex::doinit();
+ // calculate the couplings for the different combinations of particles
+ Energy fact = 0.5*model->vev()/model->sin2ThetaW();
+ double sw(sqrt(model->sin2ThetaW())),cw(sqrt(1.-model->sin2ThetaW()));
+ double vf(model->vev()/model->f());
+ double r2(sqrt(2.));
+ coup_.resize(14);
+ // H
+ coup_[ 0] = fact *(1.-sqr(vf)/3.);
+ coup_[ 1] = fact/sqr(cw)*(1.-sqr(vf)/3.);
+ coup_[ 2] =-fact;
+ coup_[ 3] =-fact;
+ coup_[ 4] =-fact*sqr(sw/cw);
+ coup_[ 5] =-fact/cw*sw;
+ // PhiP
+ coup_[ 6] = r2*fact*vf/3.;
+ // Phi0
+ coup_[ 7] =-fact*vf/r2/cw;
+ coup_[ 8] = fact*vf/r2*sw/sqr(cw);
+ // Phi+
+ coup_[ 9] = fact*vf/6./cw*(1.+2.*sqr(sw));
+ coup_[10] = fact*vf*sw/cw*0.5;
+ coup_[11] = fact*vf*5./6.;
+ coup_[12] =-fact*vf*sw/3.;
+ // Phi++
+ coup_[13] =-fact*vf;
+}
+
+void LHTPWWHVertex::setCoupling(Energy2 q2,tcPDPtr a,
+ tcPDPtr b, tcPDPtr c) {
+ // first the overall normalisation
+ if(q2!=q2Last_) {
+ coupLast_ = sqr(electroMagneticCoupling(q2));
+ q2Last_=q2;
+ }
+ long ih = abs(c->id());
+ long ibos[2]={abs(a->id()),abs(b->id())};
+
+ if(ih == 25) {
+ if( ibos[0] == 24 && ibos[1] == 24)
+ norm(UnitRemoval::InvE *coupLast_*coup_[0]);
+ else if( ibos[0] == 23 && ibos[1] == 23 )
+ norm(UnitRemoval::InvE *coupLast_*coup_[1]);
+ else if( ibos[0] == 34 && ibos[1] == 34 )
+ norm(UnitRemoval::InvE *coupLast_*coup_[2]);
+ else if( ibos[0] == 33 && ibos[1] == 33 )
+ norm(UnitRemoval::InvE *coupLast_*coup_[3]);
+ else if( ibos[0] == 32 && ibos[1] == 32 )
+ norm(UnitRemoval::InvE *coupLast_*coup_[4]);
+ else if((ibos[0] == 33 && ibos[1] == 32) ||
+ (ibos[0] == 32 && ibos[1] == 33) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[5]);
+ else
+ assert(false);
+ }
+ else if(ih == 36) {
+ if( a->id() == 34 || b->id() == 34)
+ norm( Complex(0.,1.)*UnitRemoval::InvE *coupLast_*coup_[6]);
+ else
+ norm(-Complex(0.,1.)*UnitRemoval::InvE *coupLast_*coup_[6]);
+ }
+ else if(ih == 35) {
+ if((ibos[0] == 23 && ibos[1] == 33) ||
+ (ibos[0] == 33 && ibos[1] == 23) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[7]);
+ else if((ibos[0] == 23 && ibos[1] == 32) ||
+ (ibos[0] == 32 && ibos[1] == 23) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[8]);
+ else
+ assert(false);
+ }
+ else if(ih == 37) {
+ if((ibos[0] == 34 && ibos[1] == 23) ||
+ (ibos[0] == 23 && ibos[1] == 34) ) {
+ norm(UnitRemoval::InvE *coupLast_*coup_[ 9]);
+ }
+ else if((ibos[0] == 24 && ibos[1] == 32) ||
+ (ibos[0] == 32 && ibos[1] == 24) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[10]);
+ else if((ibos[0] == 24 && ibos[1] == 33) ||
+ (ibos[0] == 33 && ibos[1] == 24) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[11]);
+ else if((ibos[0] == 34 && ibos[1] == 22) ||
+ (ibos[0] == 22 && ibos[1] == 34) )
+ norm(UnitRemoval::InvE *coupLast_*coup_[12]);
+ else
+ assert(false);
+ }
+ else if(ih == 38) {
+ norm(UnitRemoval::InvE *coupLast_*coup_[13]);
+ }
+ else
+ assert(false);
+}
diff --git a/Models/LHTP/LHTPWWHVertex.fh b/Models/LHTP/LHTPWWHVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWHVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPWWHVertex class.
+//
+#ifndef HERWIG_LHTPWWHVertex_FH
+#define HERWIG_LHTPWWHVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPWWHVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPWWHVertex,LHTPWWHVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPWWHVertex.h b/Models/LHTP/LHTPWWHVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWHVertex.h
@@ -0,0 +1,127 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPWWHVertex_H
+#define HERWIG_LHTPWWHVertex_H
+//
+// This is the declaration of the LHTPWWHVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Scalar/VVSVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * The LittleHiggsWWHVertex class implements the couplings of two electroweak
+ * gauge bosons to a Higgs boson in the Little Higgs model with T-parity
+ * including the additional
+ * heavy photon, Z and W bosons in the model and the triplet Higgs bosons.
+ */
+ class LHTPWWHVertex: public Helicity::VVSVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPWWHVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+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;
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPWWHVertex & operator=(const LHTPWWHVertex &);
+
+private:
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The last value of the electroweak coupling calculated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale \f$q^2\f$ at which the coupling was last evaluated.
+ */
+ Energy2 q2Last_;
+
+ /**
+ * Couplings for the different interactions
+ */
+ vector<Energy> coup_;
+ //@}
+
+};
+
+}
+
+#endif /* HERWIG_LHTPWWHVertex_H */
diff --git a/Models/LHTP/LHTPWWWVertex.cc b/Models/LHTP/LHTPWWWVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWWVertex.cc
@@ -0,0 +1,140 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the LHTPWWWVertex class.
+//
+
+#include "LHTPWWWVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "LHTPModel.h"
+
+using namespace Herwig;
+
+LHTPWWWVertex::LHTPWWWVertex() : coupLast_(0.), q2Last_(ZERO),
+ couplings_(3 ,0.) {
+ orderInGem(1);
+ orderInGs(0);
+}
+
+void LHTPWWWVertex::persistentOutput(PersistentOStream & os) const {
+ os << couplings_;
+}
+
+void LHTPWWWVertex::persistentInput(PersistentIStream & is, int) {
+ is >> couplings_;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<LHTPWWWVertex,VVVVertex>
+describeHerwigLHTPWWWVertex("Herwig::LHTPWWWVertex", "HwLHTPModel.so");
+
+void LHTPWWWVertex::Init() {
+
+ static ClassDocumentation<LHTPWWWVertex> documentation
+ ("The LHTPWWWVertex class implements the coupling of three "
+ "electroweak gauge bosons and their heavy partners in the "
+ "Little Higgs model with T-parity.");
+
+}
+
+void LHTPWWWVertex::doinit() {
+ //SM interactions
+ addToList( 24, -24, 22);
+ addToList( 24, -24, 23);
+ //LHTP
+ //W_H W_H A_L
+ addToList( 34, -34, 22);
+ //W_H W_H Z_L
+ addToList( 34, -34, 23);
+ //W_H W_L A_H
+ addToList( 34, -24, 32);
+ addToList( 24, -34, 32);
+ //W_H W_L Z_H
+ addToList( 34, -24, 33);
+ addToList( 24, -34, 33);
+ VVVVertex::doinit();
+ cLHTPModelPtr model =
+ dynamic_ptr_cast<cLHTPModelPtr>(generator()->standardModel());
+ if( !model )
+ throw InitException()
+ << "LHTPWWWVertex::doinit() - Model pointer must be of LHTPModel"
+ << "type, cannot continue without this."
+ << Exception::abortnow;
+ double sw(sqrt(model->sin2ThetaW()));
+ double cw(sqrt(1. - model->sin2ThetaW()));
+ //W W Z
+ couplings_[0] = cw/sw;
+ //W_L W_H A_H
+ couplings_[1] = model->sinThetaH()/sw;
+ //W_L W_H Z_H
+ couplings_[2] = 1./sw;
+
+}
+
+void LHTPWWWVertex::setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,tcPDPtr c) {
+ if(q2 != q2Last_) {
+ coupLast_ = electroMagneticCoupling(q2);
+ q2Last_ = q2;
+ }
+ int ida=a->id();
+ int idb=b->id();
+ int idc=c->id();
+ // get the PDG code for the neutral boson
+ long boson(0);
+ if(!a->charged()) {
+ boson = ida;
+ ida = 22;
+ }
+ else if(abs(ida) !=ParticleID::Wplus) {
+ ida = ida > 0 ? 24 : -24;
+ }
+ if(!b->charged()) {
+ boson = idb;
+ idb = 22;
+ }
+ else if(abs(idb) !=ParticleID::Wplus) {
+ idb = idb > 0 ? 24 : -24;
+ }
+ if(!c->charged()) {
+ boson = idc;
+ idc = 22;
+ }
+ else if(abs(idc) !=ParticleID::Wplus) {
+ idc = idc > 0 ? 24 : -24;
+ }
+ assert( boson ==22 || boson==23 || boson==32 || boson==33);
+ // get the prefactor
+ double pre(0.);
+ switch (boson) {
+ case 22:
+ pre = 1.;
+ break;
+ case 23:
+ pre = couplings_[0];
+ break;
+ case 32:
+ pre = couplings_[1];
+ break;
+ case 33:
+ pre = couplings_[2];
+ break;
+ default:
+ assert(false);
+ };
+ // W- W+ photon and cylic perms
+ if((ida==-24 && idb== 24 && idc== 22) ||
+ (ida== 22 && idb==-24 && idc== 24) ||
+ (ida== 24 && idb== 22 && idc==-24) ) norm( coupLast_*pre);
+ // W+ W- photon (anticylic perms of above)
+ else if((ida== 24 && idb==-24 && idc== 22) ||
+ (ida== 22 && idb== 24 && idc==-24) ||
+ (ida==-24 && idb== 22 && idc== 24) ) norm(-coupLast_*pre);
+ else
+ throw Helicity::HelicityConsistencyError()
+ << "LHTPWWWVertex::setCoupling - Incorrect particles in LHTPWWWVertex. "
+ << a->id() << " " << b->id() << " " << c->id() << '\n'
+ << Exception::runerror;
+}
diff --git a/Models/LHTP/LHTPWWWVertex.fh b/Models/LHTP/LHTPWWWVertex.fh
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWWVertex.fh
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+//
+// This is the forward declaration of the LHTPWWWVertex class.
+//
+#ifndef HERWIG_LHTPWWWVertex_FH
+#define HERWIG_LHTPWWWVertex_FH
+
+#include "ThePEG/Config/Pointers.h"
+
+namespace Herwig {
+
+class LHTPWWWVertex;
+
+}
+
+namespace ThePEG {
+
+ThePEG_DECLARE_POINTERS(Herwig::LHTPWWWVertex,LHTPWWWVertexPtr);
+
+}
+
+#endif
diff --git a/Models/LHTP/LHTPWWWVertex.h b/Models/LHTP/LHTPWWWVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/LHTPWWWVertex.h
@@ -0,0 +1,123 @@
+// -*- C++ -*-
+#ifndef HERWIG_LHTPWWWVertex_H
+#define HERWIG_LHTPWWWVertex_H
+//
+// This is the declaration of the LHTPWWWVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/VVVVertex.h"
+
+namespace Herwig {
+using namespace ThePEG;
+using namespace ThePEG::Helicity;
+using ThePEG::Helicity::Direction;
+
+/**
+ * This is the coupling of vector bosons to each other in the
+ * Littlest Higgs model with T-parity. It inherits from the
+ * Standard Model WWW vertex to use its setCoupling member
+ * for the SM gauge boson self-couplings.
+ */
+class LHTPWWWVertex: public VVVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ LHTPWWWVertex();
+
+ /** @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();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param a The ParticleData pointer for the first particle.
+ * @param b The ParticleData pointer for the second particle.
+ * @param c The ParticleData pointer for the third particle.
+ * @param d1 The direction for the first particle.
+ * @param d2 The direction for the second particle.
+ * @param d3 The direction for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr a,tcPDPtr b,tcPDPtr c);
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const { return new_ptr(*this); }
+
+ /** 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 { return new_ptr(*this); }
+ //@}
+
+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();
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ LHTPWWWVertex & operator=(const LHTPWWWVertex &);
+
+private:
+
+ /**
+ * The value of the coupling when it was last evaluated.
+ */
+ Complex coupLast_;
+
+ /**
+ * The scale where the coulpling was last evaluated
+ */
+ Energy2 q2Last_;
+
+ /**
+ * The couplings for the various possible interactions
+ */
+ vector<double> couplings_;
+};
+
+}
+
+#endif /* HERWIG_LHTPWWWVertex_H */
diff --git a/Models/LHTP/Makefile.am b/Models/LHTP/Makefile.am
new file mode 100644
--- /dev/null
+++ b/Models/LHTP/Makefile.am
@@ -0,0 +1,17 @@
+if WANT_LHTP
+pkglib_LTLIBRARIES = HwLHTPModel.la
+endif
+HwLHTPModel_la_SOURCES = \
+LHTPModel.fh LHTPModel.cc LHTPModel.h \
+LHTPWWHVertex.cc LHTPWWHVertex.h \
+LHTPFFGVertex.cc LHTPFFGVertex.h \
+LHTPFFPVertex.cc LHTPFFPVertex.h \
+LHTPFFWVertex.cc LHTPFFWVertex.h \
+LHTPFFZVertex.cc LHTPFFZVertex.h \
+LHTPWWWVertex.cc LHTPWWWVertex.h \
+LHTPHHHVertex.cc LHTPHHHVertex.h \
+LHTPWHHVertex.cc LHTPWHHVertex.h \
+LHTPFFHVertex.cc LHTPFFHVertex.h
+HwLHTPModel_la_LDFLAGS = -module -version-info 3:0:0
+HwLHTPModel_la_LIBADD= $(GSLLIBS)
+HwLHTPModel_la_CPPFLAGS= $(AM_CPPFLAGS) $(GSLINCLUDE)
diff --git a/Models/Makefile.am b/Models/Makefile.am
--- a/Models/Makefile.am
+++ b/Models/Makefile.am
@@ -1,2 +1,3 @@
SUBDIRS = RSModel StandardModel General Susy UED Zprime \
- Transplanckian ADD Leptoquarks Sextet TTbAsymm
+ Transplanckian ADD Leptoquarks Sextet TTbAsymm \
+ LH LHTP
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,185 +1,187 @@
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.59])
AC_INIT([Herwig++],[2.6.0],[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
case "${host}" in
*-darwin[[0156]].*)
AC_MSG_ERROR([Herwig++ requires OS X 10.3 or later])
;;
*-darwin7.*)
if test "x$MACOSX_DEPLOYMENT_TARGET" != "x10.3"; then
AC_MSG_ERROR(
[Please add 'MACOSX_DEPLOYMENT_TARGET=10.3' to the configure line.])
fi
;;
esac
dnl === disable debug symbols by default =====
if test "x$CXXFLAGS" = "x"; then
CXXFLAGS=-O3
fi
if test "x$CFLAGS" = "x"; then
CFLAGS=-O3
fi
dnl Looptools manual requires optimization off
if test "x$FCFLAGS" = "x"; then
FCFLAGS=-O0
fi
dnl ==========================================
AC_LANG([C++])
AM_INIT_AUTOMAKE([1.9 gnu dist-bzip2 -Wall])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
dnl Checks for programs.
AC_PROG_CXX([g++])
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])
LT_PREREQ([2.2])
LT_INIT([disable-static dlopen pic-only])
dnl ####################################
dnl ####################################
dnl for Doc/fixinterfaces.pl
AC_PATH_PROG(PERL, perl)
HERWIG_CHECK_GSL
HERWIG_CHECK_THEPEG
HERWIG_CHECK_BOOST
HERWIG_COMPILERFLAGS
HERWIG_LOOPTOOLS
HERWIG_PDF_PATH
FASTJET_CHECK_FASTJET
HERWIG_VERSIONSTRING
HERWIG_CHECK_ABS_BUG
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_CONFIG_FILES([UnderlyingEvent/Makefile
Models/Makefile
Models/StandardModel/Makefile
Models/RSModel/Makefile
Models/General/Makefile
Models/Susy/Makefile
Models/Susy/NMSSM/Makefile
Models/UED/Makefile
+ Models/LH/Makefile
+ Models/LHTP/Makefile
Models/Transplanckian/Makefile
Models/Leptoquarks/Makefile
Models/Zprime/Makefile
Models/TTbAsymm/Makefile
Models/ADD/Makefile
Models/Sextet/Makefile
Decay/Makefile
Decay/FormFactors/Makefile
Decay/Tau/Makefile
Decay/Baryon/Makefile
Decay/VectorMeson/Makefile
Decay/Perturbative/Makefile
Decay/ScalarMeson/Makefile
Decay/TensorMeson/Makefile
Decay/WeakCurrents/Makefile
Decay/Partonic/Makefile
Decay/General/Makefile
Decay/Radiation/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/Matchbox/Makefile
MatrixElement/Matchbox/Base/Makefile
MatrixElement/Matchbox/Utility/Makefile
MatrixElement/Matchbox/Phasespace/Makefile
MatrixElement/Matchbox/Dipoles/Makefile
MatrixElement/Matchbox/InsertionOperators/Makefile
MatrixElement/Matchbox/Powheg/Makefile
MatrixElement/Matchbox/Builtin/Makefile
MatrixElement/Matchbox/Builtin/Processes/Makefile
MatrixElement/Matchbox/Builtin/Amplitudes/Makefile
Exsample2/Makefile
Shower/SplittingFunctions/Makefile
Shower/Default/Makefile
Shower/Base/Makefile
Shower/Makefile
DipoleShower/Makefile
DipoleShower/Base/Makefile
DipoleShower/Kernels/Makefile
DipoleShower/Kinematics/Makefile
DipoleShower/Utility/Makefile
DipoleShower/AlphaS/Makefile
Utilities/Makefile
Hadronization/Makefile
lib/Makefile
include/Makefile
src/Makefile
src/defaults/Makefile
src/herwig-config
Doc/Makefile
Doc/HerwigDefaults.in
Looptools/Makefile
Analysis/Makefile
src/Makefile-UserModules
src/defaults/Analysis.in
Contrib/Makefile
Contrib/make_makefiles.sh
Tests/Makefile
Makefile])
AC_CONFIG_FILES([Doc/fixinterfaces.pl],[chmod +x Doc/fixinterfaces.pl])
HERWIG_OVERVIEW
AC_CONFIG_COMMANDS([summary],[cat config.herwig])
AC_OUTPUT
diff --git a/m4/herwig.m4 b/m4/herwig.m4
--- a/m4/herwig.m4
+++ b/m4/herwig.m4
@@ -1,461 +1,463 @@
# check for gcc bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34130
AC_DEFUN([HERWIG_CHECK_ABS_BUG],
[
AC_REQUIRE([HERWIG_COMPILERFLAGS])
if test "$GCC" = "yes"; then
AC_MSG_CHECKING([for gcc abs bug])
AC_RUN_IFELSE([
AC_LANG_PROGRAM(
[[ int foo (int i) { return -2 * __builtin_abs(i - 2); } ]],
[[ if ( foo(1) != -2 || foo(3) != -2 ) return 1; ]]
)],
[ AC_MSG_RESULT([not found. Compiler is ok.]) ],
[
AC_MSG_RESULT([found. Builtin abs() is buggy.])
AC_MSG_CHECKING([if -fno-builtin-abs works])
oldcxxflags=$CXXFLAGS
CXXFLAGS="$CXXFLAGS -fno-builtin-abs"
AC_RUN_IFELSE([
AC_LANG_PROGRAM(
[[
#include <cstdlib>
int foo (int i) { return -2 * std::abs(i - 2); }
]],
[[
if (foo(1) != -2 || foo(3) != -2) return 1;
]]
)],
[
AC_MSG_RESULT([yes. Setting -fno-builtin-abs.])
AM_CXXFLAGS="$AM_CXXFLAGS -fno-builtin-abs"
AM_CFLAGS="$AM_CFLAGS -fno-builtin-abs"
],
[
AC_MSG_RESULT([no. Setting -fno-builtin.])
AC_MSG_WARN([
*****************************************************************************
For this version of gcc, -fno-builtin-abs alone did not work to avoid the
gcc abs() bug. Instead, all gcc builtin functions are now disabled.
Update gcc if possible.
*****************************************************************************])
AM_CXXFLAGS="$AM_CXXFLAGS -fno-builtin"
AM_CFLAGS="$AM_CFLAGS -fno-builtin"
]
)
CXXFLAGS=$oldcxxflags
]
)
fi
])
dnl ##### THEPEG #####
AC_DEFUN([HERWIG_CHECK_THEPEG],
[
defaultlocation="${prefix}"
test "x$defaultlocation" = xNONE && defaultlocation="${ac_default_prefix}"
AC_MSG_CHECKING([for libThePEG in])
AC_ARG_WITH(thepeg,
AC_HELP_STRING([--with-thepeg=DIR],[location of ThePEG installation]),
[],
[with_thepeg="${defaultlocation}"])
AC_MSG_RESULT([$with_thepeg])
if test "x$with_thepeg" = "xno"; then
AC_MSG_ERROR([Cannot build Herwig++ without ThePEG. Please set --with-thepeg.])
fi
THEPEGLDFLAGS="-L${with_thepeg}/lib/ThePEG"
if test "${host_cpu}" == "x86_64" -a -e ${with_thepeg}/lib64/ThePEG/libThePEG.so ; then
THEPEGLDFLAGS="-L${with_thepeg}/lib64/ThePEG"
fi
THEPEGPATH="${with_thepeg}"
oldldflags="$LDFLAGS"
oldlibs="$LIBS"
LDFLAGS="$LDFLAGS $THEPEGLDFLAGS"
AC_CHECK_LIB([ThePEG],[debugThePEG],[],
[AC_MSG_ERROR([No ThePEG libraries in $THEPEGLDFLAGS. Please set --with-thepeg.])])
AC_SUBST([THEPEGLIB],[-lThePEG])
AC_SUBST(THEPEGLDFLAGS)
AC_SUBST(THEPEGPATH)
LIBS="$oldlibs"
LDFLAGS="$oldldflags"
AC_MSG_CHECKING([for ThePEG headers in])
AC_ARG_WITH([thepeg-headers],
AC_HELP_STRING([--with-thepeg-headers=DIR],[location of ThePEG include directory]),
[],
[with_thepeg_headers="${with_thepeg}/include"])
AC_MSG_RESULT([$with_thepeg_headers])
if test "x$with_thepeg_headers" = "xno"; then
AC_MSG_ERROR([Cannot build Herwig++ without ThePEG headers. Please set --with-thepeg-headers.])
fi
THEPEGINCLUDE="-I$with_thepeg_headers"
oldcppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $THEPEGINCLUDE"
AC_CHECK_HEADER([ThePEG/Config/ThePEG.h],[],
[AC_MSG_ERROR([No ThePEG headers in $with_thepeg_headers. Please set --with-thepeg-headers.])])
CPPFLAGS="$oldcppflags"
AC_SUBST(THEPEGINCLUDE)
AC_MSG_CHECKING([for HepMCAnalysis.so in ThePEG])
if test -x "$THEPEGPATH/lib/ThePEG/HepMCAnalysis.so" ; then
CREATE_HEPMC="create"
AC_MSG_RESULT([found])
else
CREATE_HEPMC="# create"
AC_MSG_RESULT([not found])
fi
AC_SUBST([CREATE_HEPMC])
])
dnl ##### boost #####
AC_DEFUN([HERWIG_CHECK_BOOST],
[
AC_MSG_CHECKING([for boost headers])
BOOSTINCLUDE=""
AC_ARG_WITH(boost,
AC_HELP_STRING([--with-boost=DIR],[location of boost]),
[],
[with_boost=system])
if test "x$with_boost" = "xno"; then
AC_MSG_ERROR([boost headers are required. Please specify boost installation with --with-boost.])
fi
boostpath=$with_boost
if test "x$with_boost" == "xsystem" ; then
if test -e "/usr/include/boost/array.hpp"; then
boostpath="/usr"
elif test -e "/usr/local/include/boost/array.hpp"; then
boostpath="/usr/local"
elif test -e "/opt/include/boost/array.hpp"; then
boostpath="/opt"
elif test -e "/opt/local/include/boost/array.hpp"; then
boostpath="/opt/local"
else
AC_MSG_RESULT([not found])
AC_MSG_ERROR([boost headers are required. Please install boost.])
fi
fi
if test -e "$boostpath/include/boost/array.hpp"; then
AC_MSG_RESULT([found in $boostpath])
else
AC_MSG_RESULT([not found])
AC_MSG_ERROR([boost headers are required. Please install boost.])
fi
BOOSTINCLUDE="-I$boostpath/include"
AC_SUBST(BOOSTINCLUDE)
])
dnl ##### LOOPTOOLS #####
AC_DEFUN([HERWIG_LOOPTOOLS],
[
AC_REQUIRE([AC_PROG_FC])
AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS])
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([HERWIG_COMPILERFLAGS])
AC_MSG_CHECKING([if Looptools build works])
enable_looptools=yes
if test "x$GCC" = "xyes"; then
case "${host}" in
x86_64-*|*-darwin1*)
AM_FCFLAGS="$AM_FCFLAGS -fdefault-integer-8"
;;
esac
AC_LANG_PUSH([Fortran])
oldFCFLAGS="$FCFLAGS"
FCFLAGS="$AM_FCFLAGS"
AC_COMPILE_IFELSE(
AC_LANG_PROGRAM([],[ print *[,]"Hello"]),
[],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([needs gfortran on 64bit machines])]
)
FCFLAGS="$oldFCFLAGS"
AC_LANG_POP([Fortran])
fi
AC_MSG_RESULT([$enable_looptools])
AC_SUBST([F77],[$FC])
AC_SUBST([FFLAGS],[$FCFLAGS])
AC_SUBST([AM_FFLAGS],[$AM_FCFLAGS])
AC_SUBST([FLIBS],[$FCLIBS])
])
dnl ##### PDF PATH #####
AC_DEFUN([HERWIG_PDF_PATH],
[
AC_MSG_CHECKING([which Herwig++ PDF data to use])
AC_ARG_WITH(pdf,
AC_HELP_STRING([--with-pdf=DIR],[installation path of Herwig++PDF data tarball]),
[],
[with_pdf=${prefix}]
)
HERWIG_PDF_PREFIX=${with_pdf}/share/Herwig++PDF
if test -f "${HERWIG_PDF_PREFIX}/mrst/2008/mrstMCal.dat"; then
AC_MSG_RESULT([$with_pdf])
localPDFneeded=false
else
AC_MSG_RESULT([Using built-in PDF data set. For other data sets, set --with-pdf.])
HERWIG_PDF_PREFIX=PDF
localPDFneeded=true
fi
HERWIG_PDF_DEFAULT=${HERWIG_PDF_PREFIX}/mrst/2008/mrstMCal.dat
HERWIG_PDF_NLO=${HERWIG_PDF_PREFIX}/mrst/2002/mrst2002nlo.dat
HERWIG_PDF_POMERON=${HERWIG_PDF_PREFIX}/diffraction/
AM_CONDITIONAL(WANT_LOCAL_PDF,[test "x$localPDFneeded" = "xtrue"])
AC_SUBST(HERWIG_PDF_DEFAULT)
AC_SUBST(HERWIG_PDF_NLO)
AC_SUBST(HERWIG_PDF_POMERON)
])
dnl ###### GSL ######
AC_DEFUN([HERWIG_CHECK_GSL],
[
AC_MSG_CHECKING([for gsl location])
GSLINCLUDE=""
GSLLIBS=""
AC_ARG_WITH(gsl,
AC_HELP_STRING([--with-gsl=DIR],[location of gsl installation @<:@default=system libs@:>@]),
[],
[with_gsl=system])
if test "x$with_gsl" = "xno"; then
AC_MSG_ERROR([libgsl is required. Please install the GNU scientific library and header files.])
fi
if test "x$with_gsl" = "xsystem"; then
AC_MSG_RESULT([in system libraries])
oldlibs="$LIBS"
AC_CHECK_LIB(m,main)
AC_CHECK_LIB(gslcblas,main)
AC_CHECK_LIB(gsl,main,[],
[
AC_MSG_ERROR([Cannot find libgsl. Please install the GNU scientific library and header files or use --with-gsl=.])
]
)
GSLLIBS="$LIBS"
LIBS=$oldlibs
else
if test "`uname -m`" = "x86_64" -a -e "$with_gsl/lib64/libgsl.a" -a -d "$with_gsl/include/gsl"; then
AC_MSG_RESULT([found in $with_gsl])
GSLLIBS="-L$with_gsl/lib64 -R$with_gsl/lib64 -lgslcblas -lgsl"
GSLINCLUDE="-I$with_gsl/include"
elif test -e "$with_gsl/lib/libgsl.a" -a -d "$with_gsl/include/gsl"; then
AC_MSG_RESULT([found in $with_gsl])
GSLLIBS="-L$with_gsl/lib -R$with_gsl/lib -lgslcblas -lgsl"
GSLINCLUDE="-I$with_gsl/include"
else
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Can't find $with_gsl/lib/libgsl.a or the headers in $with_gsl/include])
fi
fi
AC_SUBST(GSLINCLUDE)
AC_SUBST(GSLLIBS)
])
AC_DEFUN([HERWIG_VERSIONSTRING],
[
if test -d $srcdir/.svn; then
AC_CHECK_PROG(have_svnversion,[svnversion],[yes],[no])
fi
AM_CONDITIONAL(USE_SVNVERSION,[test "x$have_svnversion" = "xyes"])
])
dnl ##### COMPILERFLAGS #####
AC_DEFUN([HERWIG_COMPILERFLAGS],
[
AC_REQUIRE([HERWIG_CHECK_THEPEG])
AM_CPPFLAGS="-I\$(top_builddir)/include $THEPEGINCLUDE \$(GSLINCLUDE) \$(BOOSTINCLUDE)"
AC_MSG_CHECKING([for debugging mode])
AC_ARG_ENABLE(debug,
AC_HELP_STRING([--enable-debug],[debug mode, use --enable-debug=slow for additional options that slow down the run.]),
[],
[enable_debug=no]
)
AC_MSG_RESULT([$enable_debug])
if test "x$enable_debug" = "xno"; then
AM_CPPFLAGS="$AM_CPPFLAGS -DNDEBUG"
else
debugflags="-g"
fi
dnl -Wfloat-equal -fvisibility-inlines-hidden -Wctor-dtor-privacy -Weffc++
if test -n "$GCC"; then
warnflags="-ansi -pedantic -Wall -W"
if test "x$enable_debug" = "xslow"; then
debugflags="$debugflags -fno-inline"
AM_CPPFLAGS="$AM_CPPFLAGS -D_GLIBCXX_DEBUG"
fi
fi
dnl do an actual capability check on ld instead of this workaround
case "${host}" in
*-darwin*)
;;
*)
AM_LDFLAGS="-Wl,--enable-new-dtags"
;;
esac
AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_CFLAGS, ["$warnflags $debugflags"])
AC_SUBST(AM_CXXFLAGS,["$warnflags $debugflags"])
AC_SUBST(AM_FCFLAGS, ["$debugflags"])
AC_SUBST(AM_LDFLAGS)
])
AC_DEFUN([HERWIG_ENABLE_MODELS],
[
AC_MSG_CHECKING([for BSM models to include])
LOAD_RS=""
LOAD_SUSY=""
LOAD_NMSSM=""
LOAD_TRP=""
LOAD_UED=""
LOAD_ADD=""
LOAD_SEXTET=""
LOAD_TTBA=""
LOAD_ZPRIME=""
AC_ARG_ENABLE(models,
- AC_HELP_STRING([--enable-models=LIST],[Comma-separated list of BSM models to enable. Options are (mssm nmssm ued rs trp add leptoquarks sextet) or --disable-models to turn them all off.]),
+ AC_HELP_STRING([--enable-models=LIST],[Comma-separated list of BSM models to enable. Options are (mssm nmssm ued rs trp add leptoquarks sextet lh lhtp) or --disable-models to turn them all off.]),
[],
[enable_models=all]
)
if test "x$enable_models" = "xyes" -o "x$enable_models" = "xall"; then
all=yes
fi
AC_MSG_RESULT([$enable_models])
if test ! "$all"; then
oldIFS="$IFS"
IFS=","
for i in $enable_models; do
declare $i=yes
done
IFS="$oldIFS"
fi
if test "$nmssm" -o "$all"; then
LOAD_NMSSM="library HwNMSSM.so"
mssm=yes
fi
AC_SUBST(LOAD_NMSSM)
if test "$rs" -o "$all" ; then
LOAD_RS="library HwRSModel.so"
fi
AC_SUBST(LOAD_RS)
if test "$mssm" -o "$all"; then
LOAD_SUSY="library HwSusy.so"
fi
AC_SUBST(LOAD_SUSY)
if test "$trp" -o "$all"; then
LOAD_TRP="library HwTransplanck.so"
fi
AC_SUBST(LOAD_TRP)
if test "$ued" -o "$all"; then
LOAD_UED="library HwUED.so"
fi
AC_SUBST(LOAD_UED)
if test "$add" -o "$all"; then
LOAD_ADD="library HwADDModel.so"
fi
AC_SUBST(LOAD_ADD)
if test "$leptoquarks" -o "$all"; then
LOAD_LEPTOQUARKS="library HwLeptoquarkModel.so"
fi
AC_SUBST(LOAD_LEPTOQUARKS)
if test "$sextet" -o "$all"; then
LOAD_SEXTET="library HwSextetModel.so"
fi
AC_SUBST(LOAD_SEXTET)
if test "$ttba" -o "$all"; then
LOAD_TTBA="library HwTTbAModel.so"
fi
AC_SUBST(LOAD_TTBA)
if test "$zprime" -o "$all"; then
LOAD_SEXTET="library HwZprimeModel.so"
fi
AC_SUBST(LOAD_ZPRIME)
AM_CONDITIONAL(WANT_MSSM,[test "$mssm" -o "$all"])
AM_CONDITIONAL(WANT_NMSSM,[test "$nmssm" -o "$all"])
AM_CONDITIONAL(WANT_UED,[test "$ued" -o "$all"])
AM_CONDITIONAL(WANT_RS,[test "$rs" -o "$all"])
+AM_CONDITIONAL(WANT_LH,[test "$lh" -o "$all"])
+AM_CONDITIONAL(WANT_LHTP,[test "$lhtp" -o "$all"])
AM_CONDITIONAL(WANT_Leptoquark,[test "$leptoquarks" -o "$all"])
AM_CONDITIONAL(WANT_TRP,[test "$trp" -o "$all"])
AM_CONDITIONAL(WANT_ADD,[test "$add" -o "$all"])
AM_CONDITIONAL(WANT_SEXTET,[test "$sextet" -o "$all"])
AM_CONDITIONAL(WANT_TTBA,[test "$ttba" -o "$all"])
AM_CONDITIONAL(WANT_ZPRIME,[test "$zprime" -o "$all"])
])
AC_DEFUN([HERWIG_OVERVIEW],
[
FCSTRING=`$FC --version | head -1`
CXXSTRING=`$CXX --version | head -1`
CCSTRING=`$CC --version | head -1`
cat << _HW_EOF_ > config.herwig
*****************************************************
*** $PACKAGE_STRING configuration summary
*** Please include this information in bug reports!
***--------------------------------------------------
*** Prefix: $prefix
***
*** BSM models: $enable_models
*** Herwig debug mode: $enable_debug
***
*** GSL: $with_gsl
***
*** ThePEG: $with_thepeg
*** ThePEG headers: $with_thepeg_headers
***
*** boost: $with_boost
***
*** Fastjet: ${fjconfig}
***
*** Host: $host
*** CXX: $CXXSTRING
*** FC: $FCSTRING
*** CC: $CCSTRING
*****************************************************
_HW_EOF_
])
diff --git a/src/LH.model b/src/LH.model
new file mode 100644
--- /dev/null
+++ b/src/LH.model
@@ -0,0 +1,124 @@
+##################################################
+# Common setup for Little Higgs models
+#
+#
+# This file does not contain anything that
+# users need to touch. User settings are in
+# ???-LH.in
+#
+###################################################
+#
+# Create particle content
+#
+###################################################
+cd /Herwig/Particles
+
+create ThePEG::ParticleData A_H
+setup A_H 32 A_H 500.0 0. 0. 0.0 0 0 3 1
+create ThePEG::ParticleData Z_H
+setup Z_H 33 Z_H 900.0 0.0 0.0 0.0 0 0 3 1
+create ThePEG::ParticleData W_H+
+setup W_H+ 34 W_H+ 500.0 0. 0. 0.0 3 0 3 1
+create ThePEG::ParticleData W_H-
+setup W_H- -34 W_H- 500.0 0. 0. 0.0 -3 0 3 1
+makeanti W_H+ W_H-
+create ThePEG::ParticleData T
+setup T 8 T 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData Tbar
+setup Tbar -8 Tbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti T Tbar
+create ThePEG::ParticleData Phi0
+setup Phi0 35 Phi0 1000.0 0. 0. 0.0 0 0 1 1
+create ThePEG::ParticleData PhiP
+setup PhiP 36 PhiP 1000.0 0. 0. 0.0 0 0 1 1
+create ThePEG::ParticleData Phi+
+setup Phi+ 37 Phi+ 1000.0 0. 0. 0.0 3 0 1 1
+create ThePEG::ParticleData Phi-
+setup Phi- -37 Phi- 1000.0 0. 0. 0.0 -3 0 1 1
+makeanti Phi+ Phi-
+create ThePEG::ParticleData Phi++
+setup Phi++ 38 Phi++ 1000.0 0. 0. 0.0 +6 0 1 1
+create ThePEG::ParticleData Phi--
+setup Phi-- -38 Phi-- 1000.0 0. 0. 0.0 -6 0 1 1
+makeanti Phi++ Phi--
+
+###################################################
+#
+# Main directory and model object
+#
+###################################################
+mkdir /Herwig/NewPhysics/LH
+cd /Herwig/NewPhysics/LH
+
+create Herwig::LHModel Model HwLHModel.so
+
+# SM couplings
+set Model:QCD/RunningAlphaS /Herwig/AlphaS
+set Model:EW/RunningAlphaEM /Herwig/AlphaEM
+set Model:EW/CKM /Herwig/CKM
+set Model:RunningMass /Herwig/RunningMass
+###################################################
+#
+# Vertices
+#
+###################################################
+mkdir /Herwig/Vertices/LH
+cd /Herwig/Vertices/LH
+create Herwig::LHFFZVertex FFZVertex
+create Herwig::LHFFPVertex FFPVertex
+create Herwig::LHFFGVertex FFGVertex
+create Herwig::LHFFWVertex FFWVertex
+create Herwig::LHFFHVertex FFHVertex
+create Herwig::LHWWWVertex WWWVertex
+create Herwig::LHWWHVertex WWHVertex
+create Herwig::LHWWWWVertex WWWWVertex
+create Herwig::LHWHHVertex WHHVertex
+create Herwig::LHWWHHVertex WWHHVertex
+
+# LHWHHVertex.h LHWWHH
+
+
+
+cd /Herwig/NewPhysics/LH
+# SM vertices
+set Model:Vertex/GGG /Herwig/Vertices/GGGVertex
+set Model:Vertex/GGGG /Herwig/Vertices/GGGGVertex
+set Model:Vertex/HGG /Herwig/Vertices/HGGVertex
+set Model:Vertex/HPP /Herwig/Vertices/HPPVertex
+set Model:Vertex/HHH /Herwig/Vertices/HHHVertex
+# LH vertices
+set Model:Vertex/FFZ /Herwig/Vertices/LH/FFZVertex
+set Model:Vertex/FFP /Herwig/Vertices/LH/FFPVertex
+set Model:Vertex/FFG /Herwig/Vertices/LH/FFGVertex
+set Model:Vertex/FFW /Herwig/Vertices/LH/FFWVertex
+set Model:Vertex/FFH /Herwig/Vertices/LH/FFHVertex
+set Model:Vertex/WWW /Herwig/Vertices/LH/WWWVertex
+set Model:Vertex/WWH /Herwig/Vertices/LH/WWHVertex
+set Model:Vertex/WWWW /Herwig/Vertices/LH/WWWWVertex
+set Model:Vertex/WHH /Herwig/Vertices/LH/WHHVertex
+set Model:Vertex/WWHH /Herwig/Vertices/LH/WWHHVertex
+
+cd /Herwig/NewPhysics
+
+# Set the particles to be decayed
+insert NewModel:DecayParticles 0 /Herwig/Particles/A_H
+insert NewModel:DecayParticles 0 /Herwig/Particles/Z_H
+insert NewModel:DecayParticles 0 /Herwig/Particles/W_H+
+insert NewModel:DecayParticles 0 /Herwig/Particles/T
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi0
+insert NewModel:DecayParticles 0 /Herwig/Particles/PhiP
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi+
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi++
+insert NewModel:DecayParticles 0 /Herwig/Particles/h0
+
+# Set up the model framework
+set LH/Model:ModelGenerator NewModel
+
+# Shower stuff for coloured particles
+cd /Herwig/Shower
+do SplittingGenerator:AddFinalSplitting T->T,g; QtoQGSudakov
+
+cd /Herwig/Generators
+# Choose Little Higgs over SM
+set LEPGenerator:StandardModelParameters /Herwig/NewPhysics/LH/Model
+set LHCGenerator:StandardModelParameters /Herwig/NewPhysics/LH/Model
diff --git a/src/LHC-LH.in b/src/LHC-LH.in
new file mode 100644
--- /dev/null
+++ b/src/LHC-LH.in
@@ -0,0 +1,59 @@
+##################################################
+# Example generator for the Little Higgs model
+# The best way to use this is to make your own
+# copy of this file and edit that as you require.
+#
+# The first section loads the model file which
+# does not contain anything that users need to touch.
+#
+# The second section contains the user settings.
+###################################################
+
+read LH.model
+cd /Herwig/NewPhysics
+set LH/Model:f 1*TeV
+set LH/Model:VEVRatio 0.01
+
+##################################################
+#
+# This section contains the user defined settings
+#
+##################################################
+# --- Hard Process ----
+# The particle name can be found in the relevant model file
+# by searching for its PDG code and noting the text
+# '/Herwig/Particles/###' where the hashes denote the name
+
+
+# Example hard process: Incoming proton, outgoing T quark
+set HPConstructor:IncludeEW No
+insert HPConstructor:Incoming 0 /Herwig/Particles/g
+insert HPConstructor:Incoming 0 /Herwig/Particles/u
+insert HPConstructor:Incoming 0 /Herwig/Particles/ubar
+insert HPConstructor:Incoming 0 /Herwig/Particles/d
+insert HPConstructor:Incoming 0 /Herwig/Particles/dbar
+
+insert HPConstructor:Outgoing 0 /Herwig/Particles/T
+
+# Example hard process: Incoming proton, outgoing leptons via Z_H
+insert ResConstructor:Incoming 0 /Herwig/Particles/g
+insert ResConstructor:Incoming 0 /Herwig/Particles/u
+insert ResConstructor:Incoming 0 /Herwig/Particles/ubar
+insert ResConstructor:Incoming 0 /Herwig/Particles/d
+insert ResConstructor:Incoming 0 /Herwig/Particles/dbar
+insert ResConstructor:Intermediates 0 /Herwig/Particles/Z_H
+insert ResConstructor:Outgoing 0 /Herwig/Particles/e-
+insert ResConstructor:Outgoing 0 /Herwig/Particles/mu-
+
+# Intrinsic pT tune extrapolated to LHC energy
+set /Herwig/Shower/Evolver:IntrinsicPtGaussian 2.2*GeV
+
+# Other parameters for run
+cd /Herwig/Generators
+set LHCGenerator:NumberOfEvents 10000000
+set LHCGenerator:RandomNumberGenerator:Seed 31122001
+set LHCGenerator:DebugLevel 1
+set LHCGenerator:PrintEvent 10
+set LHCGenerator:MaxErrors 10000
+
+saverun LHC-LH LHCGenerator
diff --git a/src/LHC-LHTP.in b/src/LHC-LHTP.in
new file mode 100644
--- /dev/null
+++ b/src/LHC-LHTP.in
@@ -0,0 +1,56 @@
+##################################################
+# Example generator for the Little Higgs model with
+# T-parity
+# The best way to use this is to make your own
+# copy of this file and edit that as you require.
+#
+# The first section loads the model file which
+# does not contain anything that users need to touch.
+#
+# The second section contains the user settings.
+###################################################
+
+read LHTP.model
+cd /Herwig/NewPhysics
+
+##################################################
+#
+# This section contains the user defined settings
+#
+##################################################
+# --- Hard Process ----
+# The particle name can be found in the relevant model file
+# by searching for its PDG code and noting the text
+# '/Herwig/Particles/###' where the hashes denote the name
+
+# Switch to decide whether to include EW diagrams in the
+# hard process (On by default)
+set HPConstructor:IncludeEW No
+
+# Example hard process: Incoming proton, outgoing squarks
+insert HPConstructor:Incoming 0 /Herwig/Particles/g
+insert HPConstructor:Incoming 0 /Herwig/Particles/u
+insert HPConstructor:Incoming 0 /Herwig/Particles/ubar
+insert HPConstructor:Incoming 0 /Herwig/Particles/d
+insert HPConstructor:Incoming 0 /Herwig/Particles/dbar
+insert HPConstructor:Incoming 0 /Herwig/Particles/c
+insert HPConstructor:Incoming 0 /Herwig/Particles/cbar
+insert HPConstructor:Incoming 0 /Herwig/Particles/s
+insert HPConstructor:Incoming 0 /Herwig/Particles/sbar
+insert HPConstructor:Incoming 0 /Herwig/Particles/b
+insert HPConstructor:Incoming 0 /Herwig/Particles/bbar
+
+insert HPConstructor:Outgoing 0 /Herwig/Particles/TpT
+
+# Intrinsic pT tune extrapolated to LHC energy
+set /Herwig/Shower/Evolver:IntrinsicPtGaussian 2.2*GeV
+
+# Other parameters for run
+cd /Herwig/Generators
+set LHCGenerator:NumberOfEvents 10000000
+set LHCGenerator:RandomNumberGenerator:Seed 31122001
+set LHCGenerator:DebugLevel 0
+set LHCGenerator:PrintEvent 10
+set LHCGenerator:MaxErrors 10000
+
+saverun LHC-LHTP LHCGenerator
diff --git a/src/LHTP.model b/src/LHTP.model
new file mode 100644
--- /dev/null
+++ b/src/LHTP.model
@@ -0,0 +1,223 @@
+##################################################
+# Common setup for Little Higgs models with T-parity
+#
+#
+# This file does not contain anything that
+# users need to touch. User settings are in
+# ???-LHTP.in
+#
+###################################################
+#
+# Create particle content
+#
+###################################################
+cd /Herwig/Particles
+#
+# using PDG number for excited gauge bosons A_H=Z' Z_H=Z'' W_H=W'
+#
+create ThePEG::ParticleData A_H
+setup A_H 32 A_H 1000. 0.0 0.0 0.0 0 0 3 1
+create ThePEG::ParticleData Z_H
+setup Z_H 33 Z_H 1000. 0.0 0.0 0.0 0 0 3 1
+create ThePEG::ParticleData W_H+
+setup W_H+ 34 W_H+ 1000.0 0.0 0.0 0.0 3 0 3 1
+create ThePEG::ParticleData W_H-
+setup W_H- -34 W_H- 1000.0 0.0 0.0 0.0 -3 0 3 1
+makeanti W_H+ W_H-
+#
+# extra top quark using 4th generation number
+#
+create ThePEG::ParticleData TpT
+setup TpT 8 TpT 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData TpTbar
+setup TpTbar -8 TpTbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti TpT TpTbar
+#
+# triplet Higgs bosons (Phi0,PhiP,Phi+/- using numbers
+# for doublet + Phi++/-- 38)
+create ThePEG::ParticleData Phi0
+setup Phi0 35 Phi0 1000.0 0. 0. 0.0 0 0 1 1
+create ThePEG::ParticleData PhiP
+setup PhiP 36 PhiP 1000.0 0. 0. 0.0 0 0 1 1
+create ThePEG::ParticleData Phi+
+setup Phi+ 37 Phi+ 1000.0 0. 0. 0.0 3 0 1 1
+create ThePEG::ParticleData Phi-
+setup Phi- -37 Phi- 1000.0 0. 0. 0.0 -3 0 1 1
+makeanti Phi+ Phi-
+create ThePEG::ParticleData Phi++
+setup Phi++ 38 Phi++ 1000.0 0. 0. 0.0 +6 0 1 1
+create ThePEG::ParticleData Phi--
+setup Phi-- -38 Phi-- 1000.0 0. 0. 0.0 -6 0 1 1
+makeanti Phi++ Phi--
+#
+# T-odd particles using numbers for excited particles
+#
+create ThePEG::ParticleData dmT
+setup dmT 4000001 dmT 1000.0 0.0 0.0 0.0 -1 3 2 1
+create ThePEG::ParticleData dmTbar
+setup dmTbar -4000001 dmTbar 1000.0 0.0 0.0 0.0 1 -3 2 1
+makeanti dmT dmTbar
+create ThePEG::ParticleData umT
+setup umT 4000002 umT 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData umTbar
+setup umTbar -4000002 umTbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti umT umTbar
+create ThePEG::ParticleData smT
+setup smT 4000003 smT 1000.0 0.0 0.0 0.0 -1 3 2 1
+create ThePEG::ParticleData smTbar
+setup smTbar -4000003 smTbar 1000.0 0.0 0.0 0.0 1 -3 2 1
+makeanti smT smTbar
+create ThePEG::ParticleData cmT
+setup cmT 4000004 cmT 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData cmTbar
+setup cmTbar -4000004 cmTbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti cmT cmTbar
+create ThePEG::ParticleData bmT
+setup bmT 4000005 bmT 1000.0 0.0 0.0 0.0 -1 3 2 1
+create ThePEG::ParticleData bmTbar
+setup bmTbar -4000005 bmTbar 1000.0 0.0 0.0 0.0 1 -3 2 1
+makeanti bmT bmTbar
+create ThePEG::ParticleData tmT
+setup tmT 4000006 tmT 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData tmTbar
+setup tmTbar -4000006 tmTbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti tmT tmTbar
+create ThePEG::ParticleData TmT
+setup TmT 4000008 TmT 1000.0 0.0 0.0 0.0 2 3 2 1
+create ThePEG::ParticleData TmTbar
+setup TmTbar -4000008 TmTbar 1000.0 0.0 0.0 0.0 -2 -3 2 1
+makeanti TmT TmTbar
+create ThePEG::ParticleData emT-
+setup emT- 4000011 emT- 1000. 0.0 0.0 0.0 -3 0 2 1
+create ThePEG::ParticleData emT+
+setup emT+ -4000011 emT+ 1000. 0.0 0.0 0.0 3 0 2 1
+makeanti emT- emT+
+create ThePEG::ParticleData mumT-
+setup mumT- 4000013 mumT- 1000. 0.0 0.0 0.0 -3 0 2 1
+create ThePEG::ParticleData mumT+
+setup mumT+ -4000013 mumT+ 1000. 0. 0.0 0.0 3 0 2 1
+makeanti mumT+ mumT-
+create ThePEG::ParticleData taumT+
+setup taumT+ -4000015 taumT+ 1000. 0.0 0.0 0.0 3 0 2 1
+create ThePEG::ParticleData taumT-
+setup taumT- 4000015 taumT- 1000. 0.0 0.0 0.0 -3 0 2 1
+makeanti taumT- taumT+
+create ThePEG::ParticleData nu_emT
+setup nu_emT 4000012 nu_emT 1000. 0.0 0.0 0.0 0 0 2 1
+create ThePEG::ParticleData nu_emTbar
+setup nu_emTbar -4000012 nu_emTbar 1000 0.0 0.0 0.0 0 0 2 1
+makeanti nu_emTbar nu_emT
+create ThePEG::ParticleData nu_mumT
+setup nu_mumT 4000014 nu_mumT 1000. 0.0 0.0 0.0 0 0 2 1
+create ThePEG::ParticleData nu_mumTbar
+setup nu_mumTbar -4000014 nu_mumTbar 0.0 0.0 0.0 0 0 0 2 1
+makeanti nu_mumTbar nu_mumT
+create ThePEG::ParticleData nu_taumT
+setup nu_taumT 4000016 nu_taumT 1000. 0.0 0.0 0.0 0 0 2 1
+create ThePEG::ParticleData nu_taumTbar
+setup nu_taumTbar -4000016 nu_taumTbar 1000. 0.0 0.0 0.0 0 0 2 1
+makeanti nu_taumTbar nu_taumT
+###################################################
+#
+# Main directory and model object
+#
+###################################################
+
+mkdir /Herwig/NewPhysics/LHTP
+cd /Herwig/NewPhysics/LHTP
+
+create Herwig::LHTPModel Model HwLHTPModel.so
+
+# SM couplings
+set Model:QCD/RunningAlphaS /Herwig/AlphaS
+set Model:EW/RunningAlphaEM /Herwig/AlphaEM
+set Model:EW/CKM /Herwig/CKM
+set Model:RunningMass /Herwig/RunningMass
+###################################################
+#
+# Vertices
+#
+###################################################
+mkdir /Herwig/Vertices/LHTP
+cd /Herwig/Vertices/LHTP
+create Herwig::LHTPFFGVertex FFGVertex
+create Herwig::LHTPFFPVertex FFPVertex
+create Herwig::LHTPFFWVertex FFWVertex
+create Herwig::LHTPFFZVertex FFZVertex
+create Herwig::LHTPWWHVertex WWHVertex
+create Herwig::LHTPWWWVertex WWWVertex
+create Herwig::LHTPHHHVertex HHHVertex
+create Herwig::LHTPWHHVertex WHHVertex
+create Herwig::LHTPFFHVertex FFHVertex
+
+cd /Herwig/NewPhysics/LHTP
+set Model:Vertex/FFG /Herwig/Vertices/LHTP/FFGVertex
+set Model:Vertex/FFZ /Herwig/Vertices/LHTP/FFZVertex
+set Model:Vertex/FFW /Herwig/Vertices/LHTP/FFWVertex
+set Model:Vertex/FFP /Herwig/Vertices/LHTP/FFPVertex
+set Model:Vertex/WWH /Herwig/Vertices/LHTP/WWHVertex
+set Model:Vertex/WWW /Herwig/Vertices/LHTP/WWWVertex
+set Model:Vertex/HHH /Herwig/Vertices/LHTP/HHHVertex
+set Model:Vertex/WHH /Herwig/Vertices/LHTP/WHHVertex
+set Model:Vertex/FFH /Herwig/Vertices/LHTP/FFHVertex
+
+# Not implemented LHTP yet
+set Model:Vertex/WWWW /Herwig/Vertices/WWWWVertex
+set Model:Vertex/HGG /Herwig/Vertices/HGGVertex
+set Model:Vertex/HPP /Herwig/Vertices/HPPVertex
+
+# No LHTP equivalent
+set Model:Vertex/GGG /Herwig/Vertices/GGGVertex
+set Model:Vertex/GGGG /Herwig/Vertices/GGGGVertex
+
+
+cd /Herwig/NewPhysics
+insert HPConstructor:ExcludedVertices 0 /Herwig/Vertices/HPPVertex
+insert HPConstructor:ExcludedVertices 0 /Herwig/Vertices/HGGVertex
+
+# Set up the model framework
+set LHTP/Model:ModelGenerator NewModel
+
+# --- Perturbative Decays ---
+insert NewModel:DecayParticles 0 /Herwig/Particles/h0
+insert NewModel:DecayParticles 0 /Herwig/Particles/A_H
+insert NewModel:DecayParticles 0 /Herwig/Particles/Z_H
+insert NewModel:DecayParticles 0 /Herwig/Particles/W_H+
+insert NewModel:DecayParticles 0 /Herwig/Particles/TpT
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi0
+insert NewModel:DecayParticles 0 /Herwig/Particles/PhiP
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi+
+insert NewModel:DecayParticles 0 /Herwig/Particles/Phi++
+insert NewModel:DecayParticles 0 /Herwig/Particles/dmT
+insert NewModel:DecayParticles 0 /Herwig/Particles/umT
+insert NewModel:DecayParticles 0 /Herwig/Particles/smT
+insert NewModel:DecayParticles 0 /Herwig/Particles/cmT
+insert NewModel:DecayParticles 0 /Herwig/Particles/bmT
+insert NewModel:DecayParticles 0 /Herwig/Particles/tmT
+insert NewModel:DecayParticles 0 /Herwig/Particles/TmT
+insert NewModel:DecayParticles 0 /Herwig/Particles/emT-
+insert NewModel:DecayParticles 0 /Herwig/Particles/mumT-
+insert NewModel:DecayParticles 0 /Herwig/Particles/taumT-
+insert NewModel:DecayParticles 0 /Herwig/Particles/nu_emT
+insert NewModel:DecayParticles 0 /Herwig/Particles/nu_mumT
+insert NewModel:DecayParticles 0 /Herwig/Particles/nu_taumT
+###################################################
+#
+# Shower stuff for coloured particles
+#
+###################################################
+cd /Herwig/Shower
+
+do SplittingGenerator:AddFinalSplitting dmT->dmT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting umT->umT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting smT->smT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting cmT->cmT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting bmT->bmT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting tmT->tmT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting TmT->TmT,g; QtoQGSudakov
+do SplittingGenerator:AddFinalSplitting TpT->TpT,g; QtoQGSudakov
+
+cd /Herwig/Generators
+# Choose Little Higgs over SM
+set LEPGenerator:StandardModelParameters /Herwig/NewPhysics/LHTP/Model
+set LHCGenerator:StandardModelParameters /Herwig/NewPhysics/LHTP/Model
diff --git a/src/Makefile.am b/src/Makefile.am
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,169 +1,179 @@
SUBDIRS = defaults
AUTOMAKE_OPTIONS = -Wno-portability
defaultsdir = ${pkgdatadir}/defaults
bin_PROGRAMS = Herwig++
Herwig___SOURCES = Herwig++.cc herwigopts.c herwigopts.h
BUILT_SOURCES = herwigopts.c herwigopts.h
Herwig___LDFLAGS = $(AM_LDFLAGS) -export-dynamic $(THEPEGLDFLAGS)
Herwig___LDADD = $(THEPEGLIB) -ldl
Herwig___CPPFLAGS = $(AM_CPPFLAGS) \
-DHERWIG_PKGDATADIR="\"$(pkgdatadir)\"" \
-DHERWIG_PKGLIBDIR="\"$(pkglibdir)\"" \
-DTHEPEG_PKGLIBDIR="\"$(THEPEGPATH)/lib/ThePEG\""
bin_SCRIPTS = herwig-config
HELPERFILES = CMSSM40.1.1.slha RPV3.1.slha NMSSM.spc \
ADD.model \
Leptoquark.model \
MSSM.model \
MUED.model \
NMSSM.model \
RS.model \
Sextet.model \
TTBA.model \
-Zprime.model
+Zprime.model \
+LH.model \
+LHTP.model
INPUTFILES = \
DIS.in \
DIS-Matchbox.in \
GammaGamma.in \
ILC.in \
ILC-MSSM.in \
ILC-MUED.in \
ILC-RS.in \
LEP.in \
LEP-Matchbox.in \
LHC-ADD.in \
LHC-diffractive.in \
LHC-GammaGamma.in \
LHC.in \
LHC-Matchbox.in \
LHC-LQ.in \
LHC-MSSM.in \
LHC-MUED.in \
LHC-NMSSM.in \
LHC-Powheg.in \
LHC-RPV.in \
LHC-RS.in \
LHC-Sextet.in \
LHC-TRP.in \
LHC-TTBA.in \
LHC-MB.in \
LHC-ZP.in \
TVT.in \
TVT-Matchbox.in \
TVT-Powheg.in \
-TVT-TTBA.in
+TVT-TTBA.in \
+LHC-LH.in \
+LHC-LHTP.in
dist_pkgdata_DATA = $(INPUTFILES) $(HELPERFILES)
pkgdata_DATA = Makefile-UserModules
CLEANFILES = HerwigDefaults.rpo \
*.run *.log *.out *.tex \
multi.test *.output probs.test chisq.value \
LHC-RS-BR.spc LHC-MSSM-BR.spc LHC-RPV-BR.spc
## checking targets ##
HerwigDefaults.rpo: Herwig++ $(srcdir)/defaults/*.in defaults/PDF.in defaults/Analysis.in $(top_builddir)/lib/*.so
./Herwig++ init -L$(top_builddir)/lib -i defaults/HerwigDefaults.in -D
check_BSM_Full=
check_BSM=
if WANT_MSSM
check_BSM += check-LHC-RPV
check_BSM_Full += check-LHC-RPV check-LHC-MSSM
endif
if WANT_NMSSM
check_BSM_Full += check-LHC-NMSSM
endif
if WANT_UED
check_BSM_Full += check-LHC-MUED
endif
if WANT_RS
check_BSM += check-LHC-RS
check_BSM_Full += check-LHC-RS
endif
+if WANT_LH
+check_BSM_Full += check-LHC-LH
+endif
+if WANT_LHTP
+check_BSM_Full += check-LHC-LHTP
+endif
if WANT_TRP
check_BSM_Full += check-LHC-TRP
endif
if WANT_ADD
check_BSM_Full += check-LHC-ADD
endif
if WANT_TTBA
check_BSM_Full += check-LHC-TTBA
endif
if WANT_ZPRIME
check_BSM_Full += check-LHC-ZP
endif
check-local: check-LHC check-LEP check-DIS check-ILC check-GammaGamma $(check_BSM) check-LHC-Powheg
check-Powheg: check-LHC-Powheg check-TVT-Powheg
check-BSM: $(check_BSM_Full)
link-helper-files:
@for i in $(HELPERFILES); do \
if test -f $(srcdir)/$$i -a ! -e $$i; then \
$(LN_S) -f $(srcdir)/$$i; fi; done
check-%: $(srcdir)/%.in HerwigDefaults.rpo link-helper-files
./Herwig++ read $< -D
./Herwig++ run $(notdir $(subst .in,.run,$<)) -N500 -d1 -D
## valgrind targets ##
VALGRIND=valgrind --leak-check=full --num-callers=25 --freelist-vol=100000000 --leak-resolution=med --trace-children=yes
valgrind: valgrind-init valgrind-read valgrind-run
valgrind-init:
$(VALGRIND) ./Herwig++ init -d1 -D -L$(top_builddir)/lib -i defaults/HerwigDefaults.in \
&> /tmp/valgrind-init.log
valgrind-read:
$(VALGRIND) ./Herwig++ read -d1 -D LHC.in &> /tmp/valgrind-read.log
valgrind-run:
$(VALGRIND) ./Herwig++ run -d1 -D -N5 LHC.run &> /tmp/valgrind-run.log
SETUPTHEPEG=$(THEPEGPATH)/bin/setupThePEG
THEPEGREPO=$(THEPEGPATH)/lib/ThePEG/ThePEGDefaults.rpo
install-data-hook:
@echo Creating repository
@./Herwig++ init -L$(DESTDIR)$(pkglibdir) -i $(DESTDIR)$(defaultsdir)/HerwigDefaults.in -r $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo
uninstall-hook:
rm -f $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo
register: register-with-thepeg-repo
register-with-thepeg-repo:
@if test -x "$(SETUPTHEPEG)" -a -w "$(THEPEGREPO)"; \
then echo Registering with ThePEG; \
"$(SETUPTHEPEG)" --init \
$(DESTDIR)$(defaultsdir)/HerwigDefaults.in \
-r "$(THEPEGREPO)" -o "$(THEPEGREPO)" \
-l$(DESTDIR)$(pkglibdir) ; \
fi
unregister : unregister-from-thepeg-repo
unregister-from-thepeg-repo:
@if test -x "$(SETUPTHEPEG)" -a -w "$(THEPEGREPO)"; \
then echo Unregistering with ThePEG; \
"$(SETUPTHEPEG)" --init defaults/HerwigCleanup.in \
-r "$(THEPEGREPO)" -o "$(THEPEGREPO)" \
-l$(DESTDIR)$(pkglibdir) ; \
fi
EXTRA_DIST = herwigopts.ggo
GENGETOPT = gengetopt
%opts.h %opts.c : %opts.ggo
$(GENGETOPT) < $<

File Metadata

Mime Type
text/x-diff
Expires
Tue, Jan 21, 2:08 AM (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4241255
Default Alt Text
(255 KB)

Event Timeline