diff --git a/Models/DarkMatter/DMDMMediatorVertex.cc b/Models/DarkMatter/DMDMMediatorVertex.cc --- a/Models/DarkMatter/DMDMMediatorVertex.cc +++ b/Models/DarkMatter/DMDMMediatorVertex.cc @@ -1,66 +1,66 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the DMDMMediatorVertex class. // #include "DMDMMediatorVertex.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" #include "DMModel.h" using namespace Herwig; DMDMMediatorVertex::DMDMMediatorVertex() : cDMmed_(0.) { orderInGem(1); orderInGs(0); colourStructure(ColourStructure::DELTA); } IBPtr DMDMMediatorVertex::clone() const { return new_ptr(*this); } IBPtr DMDMMediatorVertex::fullclone() const { return new_ptr(*this); } void DMDMMediatorVertex::persistentOutput(PersistentOStream & os) const { os << cDMmed_; } void DMDMMediatorVertex::persistentInput(PersistentIStream & is, int) { is >> cDMmed_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigDMDMMediatorVertex("Herwig::DMDMMediatorVertex", "HwDMModel.so"); void DMDMMediatorVertex::Init() { static ClassDocumentation documentation ("The DMDMMediatorVertex class implements the couplnig of dark matter to the mediator."); } void DMDMMediatorVertex::setCoupling(Energy2 ,tcPDPtr aa,tcPDPtr,tcPDPtr) { int iferm=abs(aa->id()); assert(iferm==52); norm(cDMmed_); left(1.); right(1.); } void DMDMMediatorVertex::doinit() { - FFVVertex::doinit(); cDMModelPtr model = dynamic_ptr_cast(generator()->standardModel()); cDMmed_ = model->cDMmed(); addToList(52, 52, 32); + FFVVertex::doinit(); } diff --git a/Models/DarkMatter/DMMediatorQuarksVertex.cc b/Models/DarkMatter/DMMediatorQuarksVertex.cc --- a/Models/DarkMatter/DMMediatorQuarksVertex.cc +++ b/Models/DarkMatter/DMMediatorQuarksVertex.cc @@ -1,68 +1,68 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the DMMediatorQuarksVertex class. // #include "DMMediatorQuarksVertex.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" #include "DMModel.h" using namespace Herwig; DMMediatorQuarksVertex::DMMediatorQuarksVertex() { orderInGem(1); orderInGs(0); colourStructure(ColourStructure::DELTA); } IBPtr DMMediatorQuarksVertex::clone() const { return new_ptr(*this); } IBPtr DMMediatorQuarksVertex::fullclone() const { return new_ptr(*this); } void DMMediatorQuarksVertex::persistentOutput(PersistentOStream & os) const { os << cSMmed_; } void DMMediatorQuarksVertex::persistentInput(PersistentIStream & is, int) { is >> cSMmed_; } void DMMediatorQuarksVertex::setCoupling(Energy2 ,tcPDPtr aa,tcPDPtr,tcPDPtr) { int iferm=abs(aa->id()); assert(iferm>0 && iferm<4); norm(cSMmed_[iferm-1]); left(1.); right(1.); } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigDMMediatorQuarksVertex("Herwig::DMMediatorQuarksVertex", "HwDMModel.so"); void DMMediatorQuarksVertex::Init() { static ClassDocumentation documentation ("The DMMediatorQuarksVertex class implements the coupling of the quarks to the mediator."); } void DMMediatorQuarksVertex::doinit() { - FFVVertex::doinit(); cDMModelPtr model = dynamic_ptr_cast(generator()->standardModel()); cSMmed_ = model->cSMmed(); for(int ix=1;ix<4;++ix) { addToList(-ix, ix, 32); } + FFVVertex::doinit(); } diff --git a/Models/General/Makefile.am b/Models/General/Makefile.am --- a/Models/General/Makefile.am +++ b/Models/General/Makefile.am @@ -1,56 +1,58 @@ BUILT_SOURCES = ModelGenerator__all.cc CLEANFILES = ModelGenerator__all.cc ModelGenerator__all.cc : $(DIR_H_FILES) $(DIR_CC_FILES) Makefile @echo "Concatenating .cc files into $@" @$(top_srcdir)/cat_with_cpplines $(DIR_CC_FILES) > $@ EXTRA_DIST = $(ALL_H_FILES) $(ALL_CC_FILES) DIR_H_FILES = $(addprefix $(srcdir)/,$(ALL_H_FILES)) ALL_H_FILES = \ ModelGenerator.h ModelGenerator.fh \ DecayConstructor.h DecayConstructor.fh \ NBodyDecayConstructorBase.h \ NBodyDecayConstructorBase.fh \ TwoBodyDecayConstructor.h \ TwoToTwoProcessConstructor.h TwoToTwoProcessConstructor.fh \ HardProcessConstructor.h HardProcessConstructor.fh \ HiggsVectorBosonProcessConstructor.h \ HiggsVBFProcessConstructor.h \ QQHiggsProcessConstructor.h \ HPDiagram.h \ ThreeBodyDecayConstructor.h \ FourBodyDecayConstructor.h \ WeakCurrentDecayConstructor.h \ +VectorCurrentDecayConstructor.h \ ResonantProcessConstructor.h \ ResonantProcessConstructor.fh \ VVSLoopVertex.fh VVSLoopVertex.h \ GenericHGGVertex.h \ GenericHPPVertex.h \ BSMWidthGenerator.h BSMWidthGenerator.fh \ PrototypeVertex.h \ TBDiagram.h TwoBodyDecay.h\ BSMModel.h DIR_CC_FILES = $(addprefix $(srcdir)/,$(ALL_CC_FILES)) ALL_CC_FILES = \ ModelGenerator.cc\ DecayConstructor.cc \ NBodyDecayConstructorBase.cc \ TwoBodyDecayConstructor.cc \ TwoToTwoProcessConstructor.cc \ HardProcessConstructor.cc \ HiggsVectorBosonProcessConstructor.cc \ HiggsVBFProcessConstructor.cc \ QQHiggsProcessConstructor.cc \ ThreeBodyDecayConstructor.cc \ FourBodyDecayConstructor.cc \ WeakCurrentDecayConstructor.cc \ +VectorCurrentDecayConstructor.cc \ ResonantProcessConstructor.cc \ VVSLoopVertex.cc \ GenericHGGVertex.cc \ GenericHPPVertex.cc \ BSMWidthGenerator.cc \ PrototypeVertex.cc \ BSMModel.cc diff --git a/Models/General/VectorCurrentDecayConstructor.cc b/Models/General/VectorCurrentDecayConstructor.cc new file mode 100644 --- /dev/null +++ b/Models/General/VectorCurrentDecayConstructor.cc @@ -0,0 +1,170 @@ +// -*- C++ -*- +// +// This is the implementation of the non-inlined, non-templated member +// functions of the VectorCurrentDecayConstructor class. +// + +#include "VectorCurrentDecayConstructor.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" +#include "Herwig/Decay/General/DMMediatorDecayer.h" + + +namespace { +struct ParticleOrdering { + /** + * Operator for the ordering + * @param p1 The first ParticleData object + * @param p2 The second ParticleData object + */ + bool operator() (tcPDPtr p1, tcPDPtr p2) const { + return abs(p1->id()) > abs(p2->id()) || + ( abs(p1->id()) == abs(p2->id()) && p1->id() > p2->id() ) || + ( p1->id() == p2->id() && p1->fullName() > p2->fullName() ); + } +}; +} + +using namespace Herwig; + +IBPtr VectorCurrentDecayConstructor::clone() const { + return new_ptr(*this); +} + +IBPtr VectorCurrentDecayConstructor::fullclone() const { + return new_ptr(*this); +} + +void VectorCurrentDecayConstructor::persistentOutput(PersistentOStream & os) const { +os << ounit(massCut_,GeV) << current_; +} + +void VectorCurrentDecayConstructor::persistentInput(PersistentIStream & is, int) { +is >> iunit(massCut_,GeV) >> current_; +} + + +// The following static variable is needed for the type +// description system in ThePEG. +DescribeClass + describeHerwigVectorCurrentDecayConstructor("Herwig::VectorCurrentDecayConstructor", "Herwig.so"); + +void VectorCurrentDecayConstructor::Init() { + + static ClassDocumentation documentation + ("The VectorCurrentDecayConstructor class constructs the decays of low mass vector bosons" + " to hadrons via the weak current"); + + static RefVector interfaceCurrent + ("Current", + "The current for the decay mode", + &VectorCurrentDecayConstructor::current_, -1, false, false, true, false, false); + + static Parameter interfaceMassCut + ("MassCut", + "The maximum mass difference for the decay", + &VectorCurrentDecayConstructor::massCut_, GeV, 2.0*GeV, 1.0*GeV, 10.0*GeV, + false, false, Interface::limited); + +} + +void VectorCurrentDecayConstructor::doinit() { + NBodyDecayConstructorBase::doinit(); + model_ = dynamic_ptr_cast::pointer>(generator()->standardModel()); +} + +void VectorCurrentDecayConstructor::DecayList(const set & particles) { + if( particles.empty() ) return; + unsigned int nv(model_->numberOfVertices()); + for(PDPtr part : particles) { + if(part->iSpin()!=PDT::Spin1) continue; + if(part->iCharge()!=0) continue; + bool foundD(false),foundU(false),foundS(false); + if(part->mass()>massCut_) continue; + for(unsigned int iv = 0; iv < nv; ++iv) { + VertexBasePtr vertex = model_->vertex(iv); + if( !vertex->isIncoming(part) || vertex->getNpoint() != 3 ) continue; + for(unsigned int iloc = 0;iloc < 3; ++iloc) { + vector ext = vertex->search(iloc, part->id()); + if(ext.empty()) continue; + for(unsigned int ioff=0;ioffinit(); + for(unsigned int imode=0;imodenumberOfModes();++imode) { + // get the external particles for this mode + int iq(0),ia(0); + tPDVector out = current->particles(0,imode,iq,ia); + current->decayModeInfo(imode,iq,ia); + if(iq==2&&ia==-2) continue; + // order the particles + bool skip=false; + for(unsigned int ix=0;ix outgoing(out.begin(),out.end()); + string tag = part->PDGName() + "->"; + bool first=false; + for(tcPDPtr part : outgoing) { + if(!first) + first=true; + else + tag+=","; + tag+=part->PDGName(); + } + tag+=";"; + int charge(0); + for(tcPDPtr part : outgoing) + charge+=part->iCharge(); + if(charge!=0) continue; + // create the decayer + ostringstream fullname; + fullname << "/Herwig/Decays/DMMediator_" << part->PDGName(); + for(tcPDPtr part : out) + fullname << "_" << part->PDGName(); + string classname = "Herwig::DMMediatorDecayer"; + DMMediatorDecayerPtr decayer = dynamic_ptr_cast + (generator()->preinitCreate(classname,fullname.str())); + decayer->setDecayInfo(part,out,current); + // // set decayer options from base class + // setDecayerInterfaces(fullname.str()); + // initialize the decayer + decayer->init(); + // calculate the width + Energy pWidth = decayer->partialWidth(part,out); + if(pWidth<=ZERO) { + generator()->preinitInterface(decayer->fullName(), + "Initialize", "set","0"); + continue; + } + tDMPtr ndm = generator()->preinitCreateDecayMode(tag); + generator()->preinitInterface(ndm, "Decayer", "set", decayer->fullName()); + part->stable(false); + generator()->preinitInterface(ndm, "Active", "set", "Yes"); + setBranchingRatio(ndm, pWidth); + } + } + } +} diff --git a/Models/General/VectorCurrentDecayConstructor.h b/Models/General/VectorCurrentDecayConstructor.h new file mode 100644 --- /dev/null +++ b/Models/General/VectorCurrentDecayConstructor.h @@ -0,0 +1,131 @@ +// -*- C++ -*- +#ifndef Herwig_VectorCurrentDecayConstructor_H +#define Herwig_VectorCurrentDecayConstructor_H +// +// This is the declaration of the VectorCurrentDecayConstructor class. +// + +#include "NBodyDecayConstructorBase.h" +#include "Herwig/Decay/WeakCurrents/WeakCurrent.h" + +namespace Herwig { + +using namespace ThePEG; + +/** + * The VectorCurrentDecayConstructor class constructs the decay of low mass vector bosons via the weak currents. + * + * @see \ref VectorCurrentDecayConstructorInterfaces "The interfaces" + * defined for VectorCurrentDecayConstructor. + */ +class VectorCurrentDecayConstructor: public NBodyDecayConstructorBase { + +public: + + /** + * The default constructor. + */ + VectorCurrentDecayConstructor() : massCut_(2.*GeV) + {} + + /** + * Function used to determine allowed decaymodes, to be implemented + * in derived class. + *@param part vector of ParticleData pointers containing particles in model + */ + virtual void DecayList(const set & part); + + /** + * Number of outgoing lines. Required for correct ordering (do this one next-to-last) + */ + virtual unsigned int numBodies() const { return 999; } + + /** + * Cut off + */ + Energy massCut() const { return massCut_;} + +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. + */ + VectorCurrentDecayConstructor & operator=(const VectorCurrentDecayConstructor &) = delete; + +private: + + /** + * Model Pointer + */ + Ptr::pointer model_; + + /** + * Cut-off on the mass difference + */ + Energy massCut_; + + /** + * The current for the mode + */ + vector current_; +}; + +} + +#endif /* Herwig_VectorCurrentDecayConstructor_H */ diff --git a/PDT/DMMediatorWidthGenerator.cc b/PDT/DMMediatorWidthGenerator.cc deleted file mode 100644 --- a/PDT/DMMediatorWidthGenerator.cc +++ /dev/null @@ -1,206 +0,0 @@ -// -*- C++ -*- -// -// This is the implementation of the non-inlined, non-templated member -// functions of the DMMediatorWidthGenerator class. -// - -#include "DMMediatorWidthGenerator.h" -#include "ThePEG/Interface/ClassDocumentation.h" -#include "ThePEG/Interface/RefVector.h" -#include "ThePEG/Interface/Reference.h" -#include "ThePEG/EventRecord/Particle.h" -#include "ThePEG/Repository/UseRandom.h" -#include "ThePEG/Repository/EventGenerator.h" -#include "ThePEG/Utilities/DescribeClass.h" -#include "ThePEG/Persistency/PersistentOStream.h" -#include "ThePEG/Persistency/PersistentIStream.h" -#include "Herwig/Decay/PhaseSpaceMode.h" -#include "Herwig/Decay/General/DMMediatorDecayer.h" - -using namespace Herwig; - -namespace { -struct ParticleOrdering { - /** - * Operator for the ordering - * @param p1 The first ParticleData object - * @param p2 The second ParticleData object - */ - bool operator() (tcPDPtr p1, tcPDPtr p2) const { - return abs(p1->id()) > abs(p2->id()) || - ( abs(p1->id()) == abs(p2->id()) && p1->id() > p2->id() ) || - ( p1->id() == p2->id() && p1->fullName() > p2->fullName() ); - } -}; -} - -DMMediatorWidthGenerator::DMMediatorWidthGenerator() -{} - -IBPtr DMMediatorWidthGenerator::clone() const { - return new_ptr(*this); -} - -IBPtr DMMediatorWidthGenerator::fullclone() const { - return new_ptr(*this); -} - -void DMMediatorWidthGenerator::doinit() { - for(tWeakCurrentPtr current : weakCurrents_) { - current->init(); - for(unsigned int imode=0;imodenumberOfModes();++imode) { - // get the external particles for this mode - int iq(0),ia(0); - tPDVector out = current->particles(0,imode,iq,ia); - current->decayModeInfo(imode,iq,ia); - if(iq==2&&ia==-2) continue; - // order the particles - bool skip=false; - for(unsigned int ix=0;ix outgoing(out.begin(),out.end()); - string tag = parent_->PDGName() + "->"; - bool first=false; - for(tcPDPtr part : outgoing) { - if(!first) - first=true; - else - tag+=","; - tag+=part->PDGName(); - } - tag+=";"; - int charge(0); - for(tcPDPtr part : outgoing) - charge+=part->iCharge(); - if(charge!=0) continue; - // create the decayer - ostringstream fullname; - fullname << "/Herwig/Decays/DMMediator_" << parent_->PDGName(); - for(tcPDPtr part : out) - fullname << "_" << part->PDGName(); - string classname = "Herwig::DMMediatorDecayer"; - DMMediatorDecayerPtr decayer = dynamic_ptr_cast - (generator()->preinitCreate(classname,fullname.str())); - decayer->setDecayInfo(parent_,out,current); - // // set decayer options from base class - // setDecayerInterfaces(fullname.str()); - // initialize the decayer - decayer->init(); - // calculate the width - Energy pWidth = decayer->partialWidth(parent_,out); - if(pWidth<=ZERO) { - generator()->preinitInterface(decayer->fullName(), - "Initialize", "set","0"); - continue; - } - tDMPtr ndm = generator()->preinitCreateDecayMode(tag); - generator()->preinitInterface(ndm, "Decayer", "set", decayer->fullName()); - parent_->stable(false); - generator()->preinitInterface(ndm, "Active", "set", "Yes"); - setBranchingRatio(ndm, pWidth); - } - } - WidthGenerator::doinit(); - cerr << "Width for " << parent_->PDGName() << " = " << parent_->width()/GeV << " GeV\n"; - cerr << "Decay modes : \n"; - for(auto mode : parent_->decayModes()) { - cerr << mode->tag() << " " << mode->brat() << "\n"; - } -} - - -void DMMediatorWidthGenerator::persistentOutput(PersistentOStream & os) const { - os << weakCurrents_; -} - -void DMMediatorWidthGenerator::persistentInput(PersistentIStream & is, int) { - is >> weakCurrents_; -} - -// The following static variable is needed for the type -// description system in ThePEG. -DescribeClass -describeHerwigDMMediatorWidthGenerator("Herwig::DMMediatorWidthGenerator", "Herwig.so"); - -void DMMediatorWidthGenerator::Init() { - - static ClassDocumentation documentation - ("There is no documentation for the DMMediatorWidthGenerator class"); - - static RefVector interfaceWeakCurrents - ("WeakCurrents", - "Weak currents to use for the decays", - &DMMediatorWidthGenerator::weakCurrents_, -1, false, false, true, false, false); - - static Reference interfaceParent - ("Parent", - "The decaying particle", - &DMMediatorWidthGenerator::parent_, false, false, true, false, false); -} - - -bool DMMediatorWidthGenerator::accept(const ParticleData & pd) const { - if(pd.iSpin()!=PDT::Spin1) return false; - if(parent_ && pd.id()!=parent_->id()) return false; - return true; -} - -Energy DMMediatorWidthGenerator::width(const ParticleData & pd, Energy) const { - return pd.width(); -} - -WidthGenerator::DecayMap DMMediatorWidthGenerator::rate(const ParticleData & pd) const { - return pd.decaySelector(); -} - -void DMMediatorWidthGenerator::setBranchingRatio(tDMPtr dm, Energy pwidth) { - // if zero width just set BR to zero - if(pwidth==ZERO) { - generator()->preinitInterface(dm, "BranchingRatio","set", "0."); - generator()->preinitInterface(dm, "OnOff","set", "Off"); - return; - } - // Need width and branching ratios for all currently created decay modes - DecaySet modes = parent_->decayModes(); - unsigned int nmodes=0; - for( auto dm : modes ) { - if(dm->on()) ++nmodes; - } - if( nmodes==0 ) return; - double dmbrat(0.); - if( nmodes == 1 ) { - parent_->width(pwidth); - if( pwidth > ZERO ) parent_->cTau(hbarc/pwidth); - dmbrat = 1.; - parent_->width(pwidth); - } - else { - Energy currentwidth(parent_->width()); - Energy newWidth(currentwidth + pwidth); - parent_->width(newWidth); - if( newWidth > ZERO ) parent_->cTau(hbarc/newWidth); - //need to reweight current branching fractions if there are any - double factor = newWidth > ZERO ? double(currentwidth/newWidth) : 0.; - for(DecaySet::const_iterator dit = modes.begin(); - dit != modes.end(); ++dit) { - if( **dit == *dm || !(**dit).on() ) continue; - double newbrat = (**dit).brat()*factor; - ostringstream brf; - brf << setprecision(13)<< newbrat; - generator()->preinitInterface(*dit, "BranchingRatio", - "set", brf.str()); - } - //set brat for current mode - dmbrat = newWidth > ZERO ? double(pwidth/newWidth) : 0.; - parent_->width(newWidth); - } - ostringstream br; - br << setprecision(13) << dmbrat; - generator()->preinitInterface(dm, "BranchingRatio", - "set", br.str()); -} diff --git a/PDT/DMMediatorWidthGenerator.h b/PDT/DMMediatorWidthGenerator.h deleted file mode 100644 --- a/PDT/DMMediatorWidthGenerator.h +++ /dev/null @@ -1,148 +0,0 @@ -// -*- C++ -*- -#ifndef Herwig_DMMediatorWidthGenerator_H -#define Herwig_DMMediatorWidthGenerator_H -// -// This is the declaration of the DMMediatorWidthGenerator class. -// - -#include "ThePEG/PDT/WidthGenerator.h" -#include "Herwig/Decay/WeakCurrents/WeakCurrent.h" - -namespace Herwig { - -using namespace ThePEG; - -/** - * Here is the documentation of the DMMediatorWidthGenerator class. - * - * @see \ref DMMediatorWidthGeneratorInterfaces "The interfaces" - * defined for DMMediatorWidthGenerator. - */ -class DMMediatorWidthGenerator: public WidthGenerator { - -public: - - /** - * The default constructor. - */ - DMMediatorWidthGenerator(); - - - /** @name Virtual functions to be overridden by sub-classes. */ - //@{ - /** - * Return true if this object can be used for the given particle - * type with the given decay map. - */ - virtual bool accept(const ParticleData &) const; - - /** - * Given a particle type and a mass of an instance of that particle - * type, calculate a width. - */ - virtual Energy width(const ParticleData &, Energy m) const; - - /** - * Return decay map for the given particle type. - */ - virtual DecayMap rate(const ParticleData &) const; - //@} - -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(); - - /** - * Overloaded function from Interfaced - */ - virtual bool preInitialize() const { - return true; - } - -protected: - - /** - * Set the branching ratio of this mode. This requires - * calculating a new width for the decaying particle and reweighting - * the current branching fractions. - * @param dm The decaymode for which to set the branching ratio - * @param pwidth The calculated width of the mode - */ - void setBranchingRatio(tDMPtr dm, Energy pwidth); - -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. - */ - DMMediatorWidthGenerator & operator=(const DMMediatorWidthGenerator &); - -private: - - /** - * The particle - */ - PDPtr parent_; - - /** - * Weak currents to use for the decay - */ - vector weakCurrents_; - -}; - -} - -#endif /* Herwig_DMMediatorWidthGenerator_H */ diff --git a/PDT/Makefile.am b/PDT/Makefile.am --- a/PDT/Makefile.am +++ b/PDT/Makefile.am @@ -1,31 +1,30 @@ ## libHwPDT.la will go into libHwDecay.so noinst_LTLIBRARIES = libHwPDT.la libHwBaryonWidth.la libHwPDT_la_SOURCES = \ GenericMassGenerator.cc GenericMassGenerator.fh \ GenericMassGenerator.h \ GenericWidthGenerator.cc GenericWidthGenerator.fh \ GenericWidthGenerator.h \ OneOffShellCalculator.cc OneOffShellCalculator.fh \ OneOffShellCalculator.h \ ScalarMassGenerator.cc ScalarMassGenerator.fh \ ScalarMassGenerator.h \ ThreeBodyAllOn1IntegralCalculator.tcc \ ThreeBodyAllOn1IntegralCalculator.h \ ThreeBodyAllOnCalculator.tcc \ ThreeBodyAllOnCalculator.h \ TwoBodyAllOnCalculator.cc TwoBodyAllOnCalculator.fh \ TwoBodyAllOnCalculator.h \ TwoOffShellCalculator.cc TwoOffShellCalculator.fh \ TwoOffShellCalculator.h \ WidthCalculatorBase.cc WidthCalculatorBase.fh \ WidthCalculatorBase.h \ StandardMatchers.h StandardMatchers.cc \ SMHiggsWidthGenerator.cc SMHiggsWidthGenerator.h \ -SMHiggsMassGenerator.cc SMHiggsMassGenerator.h \ -DMMediatorWidthGenerator.cc DMMediatorWidthGenerator.h +SMHiggsMassGenerator.cc SMHiggsMassGenerator.h libHwBaryonWidth_la_SOURCES = \ BaryonWidthGenerator.cc BaryonWidthGenerator.fh \ BaryonWidthGenerator.h diff --git a/src/DM.in b/src/DM.in --- a/src/DM.in +++ b/src/DM.in @@ -1,78 +1,62 @@ # -*- ThePEG-repository -*- ################################################## # Read the model parameters ################################################## read DM.model ################################################## # Set the beams ################################################## read snippets/EECollider.in cd /Herwig/EventHandlers set EventHandler:BeamA /Herwig/Particles/chi set EventHandler:BeamB /Herwig/Particles/chi set /Herwig/Particles/chi:PDF /Herwig/Partons/NoPDF ################################################## # Set long-lived hadrons/muon to be unstable ################################################## set /Herwig/Particles/pi0:Stable Unstable set /Herwig/Particles/pi+:Stable Unstable set /Herwig/Particles/mu-:Stable Unstable set /Herwig/Particles/n0:Stable Unstable set /Herwig/Particles/K_L0:Stable Unstable set /Herwig/Particles/K+:Stable Unstable ################################################## # Selected the hard process ################################################## -# leading-order processes -################################################## - - -create Herwig::DMMediatorWidthGenerator /Herwig/Widths/DMWidth -set /Herwig/Particles/Zp:Width_generator /Herwig/Widths/DMWidth -set /Herwig/Widths/DMWidth:Parent /Herwig/Particles/Zp -insert /Herwig/Widths/DMWidth:WeakCurrents 0 /Herwig/Decays/TwoKaonCzyzCurrent -insert /Herwig/Widths/DMWidth:WeakCurrents 0 /Herwig/Decays/TwoPionCzyzCurrent -insert /Herwig/Widths/DMWidth:WeakCurrents 0 /Herwig/Decays/PhiPiCurrent - - - - - - cd /Herwig/MatrixElements # Set Processes insert SubProcess:MatrixElements 0 MEDM2Kaons ################################################## # LEP physics parameters (override defaults) ################################################## cd /Herwig/Generators # must be slightly greater than 2 x DM mass set EventGenerator:EventHandler:LuminosityFunction:Energy 2.0001 set /Herwig/Generators/EventGenerator:EventHandler:Cuts:MHatMin 0.2 cd /Herwig/Generators ################################################## ## prepare for Rivet analysis or HepMC output ## when running with parton shower ################################################## # create ThePEG::RivetAnalysis /Herwig/Analysis/Rivet RivetAnalysis.so # insert EventGenerator:AnalysisHandlers 0 /Herwig/Analysis/Rivet # insert /Herwig/Analysis/Rivet:Analyses 0 ANALYSIS ################################################### # Save run for later usage with 'Herwig run' ################################################## set EventGenerator:MaxErrors 10000 set EventGenerator:EventHandler:StatLevel Full set EventGenerator:EventHandler:CascadeHandler NULL saverun DM EventGenerator diff --git a/src/DM.model b/src/DM.model --- a/src/DM.model +++ b/src/DM.model @@ -1,148 +1,147 @@ # -*- ThePEG-repository -*- ################################################## # Common setup for Zprime models # # This file does not contain anything that # users need to touch. User settings are in # DM.in # ################################################### # # Particle Data object for the new resonances # ################################################### cd /Herwig/Particles # Dark model create ThePEG::ParticleData Zp setup Zp 32 Zp 2.0 0.0001 0.0 0.0 0 0 3 0 create ThePEG::BeamParticleData chi setup chi 52 chi 1.0 0.0 0.0 0.0 0 0 2 0 - +set chi:Stable Stable ################################################### # # Main directory and model object # ################################################### mkdir /Herwig/NewPhysics/DM cd /Herwig/NewPhysics/DM create Herwig::DMModel Model HwDMModel.so # SM couplings set Model:QCD/RunningAlphaS /Herwig/Couplings/NLOAlphaS set Model:EW/RunningAlphaEM /Herwig/Couplings/AlphaEM set Model:EW/CKM /Herwig/CKM set Model:RunningMass /Herwig/RunningMass # Z prime couplings # quark-anti-quark set Model:cDMmed 1. set Model:cSMmed 0 1.0 set Model:cSMmed 1 1.0 set Model:cSMmed 2 1.0 ################################################### # # Vertices # ################################################### # create model vertices mkdir /Herwig/Vertices/DM cd /Herwig/Vertices/DM library HwDMModel.so create Herwig::DMMediatorQuarksVertex DM_QQZPVertex create Herwig::DMDMMediatorVertex DM_DMDMZPVertex cd /Herwig/NewPhysics/DM # SM vertices set Model:Vertex/FFZ /Herwig/Vertices/FFZVertex set Model:Vertex/FFW /Herwig/Vertices/FFWVertex set Model:Vertex/FFH /Herwig/Vertices/FFHVertex set Model:Vertex/FFG /Herwig/Vertices/FFGVertex set Model:Vertex/FFP /Herwig/Vertices/FFPVertex set Model:Vertex/GGG /Herwig/Vertices/GGGVertex set Model:Vertex/GGGG /Herwig/Vertices/GGGGVertex set Model:Vertex/WWH /Herwig/Vertices/WWHVertex set Model:Vertex/WWW /Herwig/Vertices/WWWVertex set Model:Vertex/WWWW /Herwig/Vertices/WWWWVertex set Model:Vertex/HGG /Herwig/Vertices/HGGVertex set Model:Vertex/HHH /Herwig/Vertices/HHHVertex set Model:Vertex/WWHH /Herwig/Vertices/WWHHVertex set Model:Vertex/HHH /Herwig/Vertices/HHHVertex set Model:Vertex/HPP /Herwig/Vertices/HPPVertex # model vertices set Model:Vertex/QQZpVertex /Herwig/Vertices/DM/DM_QQZPVertex set Model:Vertex/DMDMZpVertex /Herwig/Vertices/DM/DM_DMDMZPVertex ################################################### # # Set up spin correlation Decayers # ################################################### cd /Herwig/NewPhysics - +insert DecayConstructor:NBodyDecayConstructors 0 VectorDecayConstructor set TwoBodyDC:CreateDecayModes Yes set ThreeBodyDC:CreateDecayModes No # which particles get the off-shell treatment set NewModel:WhichOffshell All # particles for which decays are included -#insert NewModel:DecayParticles 0 /Herwig/Particles/Zp +insert NewModel:DecayParticles 0 /Herwig/Particles/Zp ################################################### # Set up the model framework ################################################### set DM/Model:ModelGenerator NewModel ################################################### # # Choose Model over SM # ################################################### cd /Herwig/Generators set EventGenerator:StandardModelParameters /Herwig/NewPhysics/DM/Model ################################################### # Matrix Elements for the low energy annhilation ################################################### cd /Herwig/MatrixElements # X X -> mesons create Herwig::MEDM2Mesons DMMatrixElement set DMMatrixElement:IncomingA /Herwig/Particles/chi set DMMatrixElement:IncomingB /Herwig/Particles/chi # DM to mediator set DMMatrixElement:Mediator /Herwig/Particles/Zp # create the matrix elements for the different processes cp DMMatrixElement MEDM2Pions set MEDM2Pions:WeakCurrent /Herwig/Decays/TwoPionCzyzCurrent cp DMMatrixElement MEDM2Kaons set MEDM2Kaons:WeakCurrent /Herwig/Decays/TwoKaonCzyzCurrent cp DMMatrixElement MEDM3Pions set MEDM3Pions:WeakCurrent /Herwig/Decays/ThreePionCzyzCurrent cp DMMatrixElement MEDM4Pions set MEDM4Pions:WeakCurrent /Herwig/Decays/FourPionCzyzCurrent cp DMMatrixElement MEDM2EtaPiPi set MEDM2EtaPiPi:WeakCurrent /Herwig/Decays/EtaPiPiCurrent cp DMMatrixElement MEDM2EtaPrimePiPi set MEDM2EtaPrimePiPi:WeakCurrent /Herwig/Decays/EtaPrimePiPiCurrent cp DMMatrixElement MEDM2OmegaPiPi set MEDM2OmegaPiPi:WeakCurrent /Herwig/Decays/OmegaPiPiCurrent cp DMMatrixElement MEDM2OmegaPi set MEDM2OmegaPi:WeakCurrent /Herwig/Decays/OmegaPiCurrent cp DMMatrixElement MEDM2PiGamma set MEDM2PiGamma:WeakCurrent /Herwig/Decays/PiGammaCurrent cp DMMatrixElement MEDM2EtaPhoton set MEDM2EtaPhoton:WeakCurrent /Herwig/Decays/EtaGammaCurrent cp DMMatrixElement MEDM2EtaPhi set MEDM2EtaPhi:WeakCurrent /Herwig/Decays/EtaPhiCurrent cp DMMatrixElement MEDM2EtaOmega set MEDM2EtaOmega:WeakCurrent /Herwig/Decays/EtaOmegaCurrent cp DMMatrixElement MEDM2ppbar -set /Herwig/Decays/CzyzCurrent:FormFactor /Herwig/Decays/CzyzFormFactor set MEDM2ppbar:WeakCurrent /Herwig/Decays/CzyzCurrent cp DMMatrixElement MEDM2KKPi set MEDM2KKPi:WeakCurrent /Herwig/Decays/KKPiCurrent cp DMMatrixElement MEDM2PhiPi set MEDM2PhiPi:WeakCurrent /Herwig/Decays/PhiPiCurrent diff --git a/src/defaults/BSM.in b/src/defaults/BSM.in --- a/src/defaults/BSM.in +++ b/src/defaults/BSM.in @@ -1,133 +1,153 @@ # -*- ThePEG-repository -*- ################################################# # Create the BSM machinery # This only gets switched on in read if it is # requested by the user ################################################ mkdir /Herwig/NewPhysics cd /Herwig/NewPhysics create Herwig::ModelGenerator NewModel create Herwig::ResonantProcessConstructor ResConstructor create Herwig::TwoToTwoProcessConstructor HPConstructor create Herwig::HiggsVectorBosonProcessConstructor HVConstructor set HVConstructor:AlphaQCD /Herwig/Shower/AlphaQCD create Herwig::HiggsVBFProcessConstructor HiggsVBFConstructor create Herwig::QQHiggsProcessConstructor QQHiggsConstructor create Herwig::DecayConstructor DecayConstructor newdef DecayConstructor:QEDGenerator /Herwig/QEDRadiation/SOPHTY create Herwig::TwoBodyDecayConstructor TwoBodyDC set TwoBodyDC:ExcludeEffectiveVertices No set TwoBodyDC:AlphaQCD /Herwig/Shower/AlphaQCD set TwoBodyDC:AlphaQED /Herwig/Shower/AlphaQED set TwoBodyDC:Interactions QCDandQED create Herwig::ThreeBodyDecayConstructor ThreeBodyDC set ThreeBodyDC:RemoveFlavourChangingVertices Yes create Herwig::FourBodyDecayConstructor FourBodyDC set FourBodyDC:RemoveFlavourChangingVertices Yes create Herwig::WeakCurrentDecayConstructor WeakDecayConstructor set WeakDecayConstructor:InitPoints 10000 set WeakDecayConstructor:MassCut 2. # pi- insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau1MesonCurrent insert WeakDecayConstructor:DecayModes 0 pi-; insert WeakDecayConstructor:Normalisation 0 1.01386262897 # pi-,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi0; insert WeakDecayConstructor:Normalisation 0 1.17616809738 # e-,nu_ebar insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2LeptonCurrent insert WeakDecayConstructor:DecayModes 0 e-,nu_ebar; insert WeakDecayConstructor:Normalisation 0 1. # mu-,nu_mubar insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2LeptonCurrent insert WeakDecayConstructor:DecayModes 0 mu-,nu_mubar; insert WeakDecayConstructor:Normalisation 0 1. # tau-,nu_taubar insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2LeptonCurrent insert WeakDecayConstructor:DecayModes 0 tau-,nu_taubar; insert WeakDecayConstructor:Normalisation 0 1. # pi-,pi0,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau3PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi0,pi0; insert WeakDecayConstructor:Normalisation 0 1.65956712121 # pi-,pi+,pi- insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau3PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi+,pi-; insert WeakDecayConstructor:Normalisation 0 1.62175791702 # pi-,pi+,pi-,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau4PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi+,pi-,pi0; insert WeakDecayConstructor:Normalisation 0 1.09170097618 # pi-,pi0,pi0,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau4PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi0,pi0,pi0; insert WeakDecayConstructor:Normalisation 0 1. # Kbar0,pi- insert WeakDecayConstructor:Current 0 /Herwig/Decays/TauKPiCurrent insert WeakDecayConstructor:DecayModes 0 Kbar0,pi-; insert WeakDecayConstructor:Normalisation 0 1.17156865176 # K- insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau1MesonCurrent insert WeakDecayConstructor:DecayModes 0 K-; insert WeakDecayConstructor:Normalisation 0 0.938794564668 # K-,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/TauKPiCurrent insert WeakDecayConstructor:DecayModes 0 K-,pi0; insert WeakDecayConstructor:Normalisation 0 1.12526014943 # pi-,pi-,pi+,pi0,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau5PionCurrent insert WeakDecayConstructor:DecayModes 0 pi-,pi-,pi+,pi0,pi0; insert WeakDecayConstructor:Normalisation 0 0.954286993254 # pi-,pi-,pi-,pi+,pi+ insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau5PionCurrent insert WeakDecayConstructor:DecayModes 0 pi+,pi+,pi+,pi-,pi-; insert WeakDecayConstructor:Normalisation 0 0.435953860245 # pi-,pi0,pi0,pi0,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau5PionCurrent insert WeakDecayConstructor:DecayModes 0 pi+,pi0,pi0,pi0,pi0; insert WeakDecayConstructor:Normalisation 0 0.603378959531 # K0,pi+,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau1K2PiCurrent insert WeakDecayConstructor:DecayModes 0 K0,pi+,pi0; insert WeakDecayConstructor:Normalisation 0 0.380268556539 # K+,pi+,pi- insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau1K2PiCurrent insert WeakDecayConstructor:DecayModes 0 K+,pi+,pi-; insert WeakDecayConstructor:Normalisation 0 0.407904176498 # K+,K-,pi+ insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2K1PiCurrent insert WeakDecayConstructor:DecayModes 0 K+,K-,pi+; insert WeakDecayConstructor:Normalisation 0 0.727416124384 # K+,Kbar0,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2K1PiCurrent insert WeakDecayConstructor:DecayModes 0 K+,Kbar0,pi0; insert WeakDecayConstructor:Normalisation 0 0.945076580717 # K_L0,K_S0,pi+ insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2K1PiCurrent insert WeakDecayConstructor:DecayModes 0 K_L0,K_S0,pi+; insert WeakDecayConstructor:Normalisation 0 1.10729951668 # pi+,pi0,gamma insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2MesonPhotonCurrent insert WeakDecayConstructor:DecayModes 0 pi+,pi0,gamma; insert WeakDecayConstructor:Normalisation 0 3.13799210805 # eta,pi+,pi0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/TauEtaPiPiCurrent insert WeakDecayConstructor:DecayModes 0 eta,pi+,pi0; insert WeakDecayConstructor:Normalisation 0 0.880539616307 # K+,Kbar0 insert WeakDecayConstructor:Current 0 /Herwig/Decays/Tau2PionCurrent insert WeakDecayConstructor:DecayModes 0 K+,Kbar0; insert WeakDecayConstructor:Normalisation 0 1.62501804004 +create Herwig::VectorCurrentDecayConstructor VectorDecayConstructor +set VectorDecayConstructor:InitPoints 10000 +set VectorDecayConstructor:MassCut 2. + +insert VectorDecayConstructor:Current 0 /Herwig/Decays/TwoPionCzyzCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/TwoKaonCzyzCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/ThreePionCzyzCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/FourPionCzyzCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/EtaPiPiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/EtaPrimePiPiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/OmegaPiPiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/OmegaPiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/PiGammaCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/EtaGammaCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/EtaPhiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/EtaOmegaCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/CzyzCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/KKPiCurrent +insert VectorDecayConstructor:Current 0 /Herwig/Decays/PhiPiCurrent + insert NewModel:HardProcessConstructors[0] HPConstructor insert NewModel:HardProcessConstructors[1] ResConstructor insert NewModel:HardProcessConstructors[2] HVConstructor insert NewModel:HardProcessConstructors[3] HiggsVBFConstructor insert NewModel:HardProcessConstructors[4] QQHiggsConstructor newdef NewModel:DecayConstructor DecayConstructor insert DecayConstructor:NBodyDecayConstructors[0] TwoBodyDC insert DecayConstructor:NBodyDecayConstructors[1] ThreeBodyDC insert DecayConstructor:NBodyDecayConstructors[2] FourBodyDC