diff --git a/Models/General/HiggsVBFProcessConstructor.cc b/Models/General/HiggsVBFProcessConstructor.cc --- a/Models/General/HiggsVBFProcessConstructor.cc +++ b/Models/General/HiggsVBFProcessConstructor.cc @@ -1,174 +1,175 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the HiggsVBFProcessConstructor class. // #include "HiggsVBFProcessConstructor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/RefVector.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/MatrixElement/General/GeneralfftoffH.h" using namespace Herwig; HiggsVBFProcessConstructor::HiggsVBFProcessConstructor() : _type(true), _shapeOpt(1), _intermediates(0) { } IBPtr HiggsVBFProcessConstructor::clone() const { return new_ptr(*this); } IBPtr HiggsVBFProcessConstructor::fullclone() const { return new_ptr(*this); } void HiggsVBFProcessConstructor::persistentOutput(PersistentOStream & os) const { os << _higgs << _type << _shapeOpt; } void HiggsVBFProcessConstructor::persistentInput(PersistentIStream & is, int) { is >> _higgs >> _type >> _shapeOpt; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigHiggsVBFProcessConstructor("Herwig::HiggsVBFProcessConstructor", "Herwig.so"); void HiggsVBFProcessConstructor::Init() { static ClassDocumentation documentation ("The HiggsVBFProcessConstructor class generates hard processes for" " Higgs boson production in association with a vector boson in general models."); static RefVector interfaceHiggsBoson ("HiggsBoson", "The possible Higgs bosons", &HiggsVBFProcessConstructor::_higgs, -1, false, false, true, false, false); static Switch interfaceShapeOption ("ShapeScheme", "Option for the treatment of the Higgs resonance shape", &HiggsVBFProcessConstructor::_shapeOpt, 2, false, false); static SwitchOption interfaceStandardShapeFixed (interfaceShapeOption, "FixedBreitWigner", "Breit-Wigner s-channel resonanse", 1); static SwitchOption interfaceStandardShapeRunning (interfaceShapeOption, "MassGenerator", "Use the mass generator to give the shape", 2); static SwitchOption interfaceStandardShapeYes (interfaceShapeOption, "OnShell", "Produce the Higgs on-shell", 0); static Switch interfaceProcess ("Process", "Which processes to include", &HiggsVBFProcessConstructor::_intermediates, 0, false, false); static SwitchOption interfaceProcessBoth (interfaceProcess, "Both", "Include both WW and ZZ processes", 0); static SwitchOption interfaceProcessWW (interfaceProcess, "WW", "Only include WW processes", 1); static SwitchOption interfaceProcessZZ (interfaceProcess, "ZZ", "Only include ZZ processes", 2); static Switch interfaceCollisionType ("CollisionType", "Type of collision", &HiggsVBFProcessConstructor::_type, true, false, false); static SwitchOption interfaceCollisionTypeLepton (interfaceCollisionType, "Lepton", "Lepton-Lepton collisions", false); static SwitchOption interfaceCollisionTypeHadron (interfaceCollisionType, "Hadron", "Hadron-Hadron collisions", true); } void HiggsVBFProcessConstructor::constructDiagrams() { if(_higgs.empty() || !subProcess() ) return; tPDPtr Wplus = getParticleData(ParticleID::Wplus); tPDPtr Wminus = getParticleData(ParticleID::Wminus); tPDPtr Z0 = getParticleData(ParticleID::Z0); for(unsigned int ix=0;ix<_higgs.size();++ix) _higgs[ix]->init(); for(unsigned int ix=0;ix<2;++ix) { if( ( ix == 0 && _intermediates == 2 ) || ( ix == 1 && _intermediates == 1 )) continue; // loop over the possible Higgs bosons for(PDVector::const_iterator ih=_higgs.begin(); ih!=_higgs.end();++ih) { // check higgs is neutral and scalar if((**ih).iCharge()!=0 || (**ih).coloured() || (**ih).iSpin()!=PDT::Spin0) continue; // find a suitable vertex for(unsigned int nv = 0; nv < model()->numberOfVertices(); ++nv ) { VertexBasePtr vertex = model()->vertex(nv); - AbstractVVSVertexPtr svert = + AbstractVVSVertexPtr svert = dynamic_ptr_cast(vertex); if(!svert) continue; if(vertex->getNpoint() != 3) continue; // check outgoing higgs allowed if(!vertex->isOutgoing(*ih)) continue; // check incoming W+W- or ZZ allowed if(ix==0) { if(!vertex->isIncoming(Wminus)|| !vertex->isIncoming(Wplus)) continue; + if(!vertex->allowed(-24,24,(**ih).id())) continue; } else { if(!vertex->isIncoming(Z0)) continue; if(!vertex->allowed(23,23,(**ih).id())) continue; } // create the MatrixElement object string objectname ("/Herwig/MatrixElements/"); string classname("Herwig::GeneralfftoffH"); if(_type) objectname += "MEPP2"; else objectname += "MEee2"; string bos = ix==0 ? "W+W+" : "ZOZO"; objectname += bos; objectname += (**ih).PDGName(); GeneralfftoffHPtr matrixElement = dynamic_ptr_cast (generator()->preinitCreate(classname, objectname)); if( !matrixElement ) throw Exception() << "HiggsVBFProcessConstructor::constructDiagrams() " << " Failed to construct matrix element for " << bos << " + " << (**ih).PDGName() << " production" << Exception::runerror; - GeneralfftoffH::Process process = _type ? + GeneralfftoffH::Process process = _type ? GeneralfftoffH::Hadron : GeneralfftoffH::Lepton; // set the information matrixElement->setProcessInfo( process, *ih, svert,_shapeOpt, ix+1 ); // insert it - generator()->preinitInterface(subProcess(), "MatrixElements", + generator()->preinitInterface(subProcess(), "MatrixElements", subProcess()->MEs().size(), "insert", matrixElement->fullName()); } } } } diff --git a/Models/General/HiggsVectorBosonProcessConstructor.cc b/Models/General/HiggsVectorBosonProcessConstructor.cc --- a/Models/General/HiggsVectorBosonProcessConstructor.cc +++ b/Models/General/HiggsVectorBosonProcessConstructor.cc @@ -1,170 +1,174 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the HiggsVectorBosonProcessConstructor class. // #include "HiggsVectorBosonProcessConstructor.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/Reference.h" #include "ThePEG/Interface/RefVector.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "Herwig/MatrixElement/General/GeneralfftoVH.h" using namespace Herwig; HiggsVectorBosonProcessConstructor::HiggsVectorBosonProcessConstructor() : _type(true), _shapeOpt(1) { } IBPtr HiggsVectorBosonProcessConstructor::clone() const { return new_ptr(*this); } IBPtr HiggsVectorBosonProcessConstructor::fullclone() const { return new_ptr(*this); } void HiggsVectorBosonProcessConstructor::persistentOutput(PersistentOStream & os) const { os << _vector << _higgs << _type << _shapeOpt << _alpha; } void HiggsVectorBosonProcessConstructor::persistentInput(PersistentIStream & is, int) { is >> _vector >> _higgs >> _type >> _shapeOpt >> _alpha; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigHiggsVectorBosonProcessConstructor("Herwig::HiggsVectorBosonProcessConstructor", "Herwig.so"); void HiggsVectorBosonProcessConstructor::Init() { static ClassDocumentation documentation ("The HiggsVectorBosonProcessConstructor class generates hard process for" " Higgs boson production in assoication with a vector boson in general models."); static RefVector interfaceVectorBoson ("VectorBoson", "The possible outgoing vector bosons, must be W/Z", &HiggsVectorBosonProcessConstructor::_vector, -1, false, false, true, false, false); static RefVector interfaceHiggsBoson ("HiggsBoson", "The possible Higgs bosons", &HiggsVectorBosonProcessConstructor::_higgs, -1, false, false, true, false, false); static Switch interfaceShapeOption ("ShapeScheme", "Option for the treatment of the Higgs resonance shape", &HiggsVectorBosonProcessConstructor::_shapeOpt, 2, false, false); static SwitchOption interfaceStandardShapeFixed (interfaceShapeOption, "FixedBreitWigner", "Breit-Wigner s-channel resonanse", 1); static SwitchOption interfaceStandardShapeRunning (interfaceShapeOption, "MassGenerator", "Use the mass generator to give the shape", 2); static SwitchOption interfaceStandardShapeYes (interfaceShapeOption, "OnShell", "Produce the Higgs on-shell", 0); static Switch interfaceCollisionType ("CollisionType", "Type of collision", &HiggsVectorBosonProcessConstructor::_type, true, false, false); static SwitchOption interfaceCollisionTypeLepton (interfaceCollisionType, "Lepton", "Lepton-Lepton collisions", false); static SwitchOption interfaceCollisionTypeHadron (interfaceCollisionType, "Hadron", "Hadron-Hadron collisions", true); static Reference interfaceAlphaQCD ("AlphaQCD", "The strong coupling used in the shower for MME or POWHEG corrections.", &HiggsVectorBosonProcessConstructor::_alpha, false, false, true, false, false); } void HiggsVectorBosonProcessConstructor::constructDiagrams() { if(_vector.empty()||_higgs.empty() || !subProcess() ) return; // initialise the particles for(unsigned int ix=0;ix<_vector.size();++ix) _vector[ix]->init(); for(unsigned int ix=0;ix<_higgs.size();++ix) _higgs[ix]->init(); for(PDVector::const_iterator iv=_vector.begin(); iv!=_vector.end();++iv) { // skip if combination not possible if(_type==false && (**iv).id()!=ParticleID::Z0) continue; else if(_type==true && (abs((**iv).id()) != ParticleID::Wplus && - (**iv).id() != ParticleID::Z0)) + (**iv).id() != ParticleID::Z0)) continue; // loop over the possible Higgs bosons for(PDVector::const_iterator ih=_higgs.begin(); ih!=_higgs.end();++ih) { // check higgs is neutral and scalar if((**ih).iCharge()!=0 || (**ih).coloured() || (**ih).iSpin()!=PDT::Spin0) continue; // find a suitable vertex for(unsigned int nv = 0; nv < model()->numberOfVertices(); ++nv ) { VertexBasePtr vertex = model()->vertex(nv); - AbstractVVSVertexPtr svert = + AbstractVVSVertexPtr svert = dynamic_ptr_cast(vertex); if(!svert) continue; if(vertex->getNpoint() != 3) continue; if(!vertex->isIncoming(*iv)) continue; if(!vertex->isOutgoing(*iv)) continue; if(!vertex->isOutgoing(*ih)) continue; // create the MatrixElement object string objectname ("/Herwig/MatrixElements/"); string classname("Herwig::GeneralfftoVH"); if(_type) objectname += "MEPP2"; else objectname += "MEee2"; objectname += (**iv).PDGName(); objectname += (**ih).PDGName(); GeneralfftoVHPtr matrixElement = dynamic_ptr_cast (generator()->preinitCreate(classname, objectname)); + if(abs((**iv).id()) == ParticleID::Z0 && !vertex->allowed(23,23,(**ih).id())) + continue; + if(abs((**iv).id()) == ParticleID::Wplus && !vertex->allowed(-24,24,(**ih).id())) + continue; if( !matrixElement ) throw Exception() << "HiggsVectorBosonProcessConstructor::constructDiagrams() " << " Failed to construct matrix element for " << (**iv).PDGName() << " + " << (**ih).PDGName() << " production" << Exception::runerror; GeneralfftoVH::Process process = GeneralfftoVH::Lepton; if(_type) { if((**iv).id()==ParticleID::Z0) process = GeneralfftoVH::HadronZ; else if((**iv).id()==ParticleID::Wplus) process = GeneralfftoVH::HadronWplus; else if((**iv).id()==ParticleID::Wminus) process = GeneralfftoVH::HadronWminus; } // set the coupling - generator()->preinitInterface(matrixElement, "Coupling", - "set", _alpha->fullName()); + generator()->preinitInterface(matrixElement, "Coupling", + "set", _alpha->fullName()); // set the information matrixElement->setProcessInfo( process, *ih, svert,_shapeOpt); // insert it - generator()->preinitInterface(subProcess(), "MatrixElements", + generator()->preinitInterface(subProcess(), "MatrixElements", subProcess()->MEs().size(), "insert", matrixElement->fullName()); } } } }