diff --git a/Generators/Herwig7_i/CMakeLists.txt b/Generators/Herwig7_i/CMakeLists.txt index cdbf914787dc6883a8b43b8049f6f9dabaeb3130..c58fcf1986d03c02b38d55affeecdfbf77ee0df9 100644 --- a/Generators/Herwig7_i/CMakeLists.txt +++ b/Generators/Herwig7_i/CMakeLists.txt @@ -22,11 +22,25 @@ find_package( ThePEG ) find_package( GSL ) # find_package( OpenLoops ) find_package( VBFNLO ) +find_package( hepmc3 ) # Remove the --as-needed linker flags: atlas_disable_as_needed() # Component(s) in the package: +if (HEPMC3_USE) +atlas_add_component( Herwig7_i + Herwig7_i/*.h src/*.cxx src/components/*.cxx + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${HERWIG3_INCLUDE_DIRS} + ${THEPEG_INCLUDE_DIRS} ${GSL_INCLUDE_DIRS} ${VBFNLO_INCLUDE_DIRS} ${HEPMC3_INCLUDE_DIRS} + DEFINITIONS -DHWVERSION=\"${HERWIG3_LCGVERSION}\" + -DHWVER_IS_72=\"${HW3_VER_IS_72}\" + -DHAVE_HEPMC3 + LINK_LIBRARIES ${HERWIG3_LIBRARIES} ${Boost_LIBRARIES} + ${THEPEG_LIBRARIES} ${GSL_LIBRARIES} ${VBFNLO_LIBRARIES} + GeneratorModulesLib EventInfo GaudiKernel PathResolver AtlasHepMCLib ) + +else() atlas_add_component( Herwig7_i Herwig7_i/*.h src/*.cxx src/components/*.cxx INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${HERWIG3_INCLUDE_DIRS} @@ -36,6 +50,7 @@ atlas_add_component( Herwig7_i LINK_LIBRARIES ${HERWIG3_LIBRARIES} ${Boost_LIBRARIES} ${THEPEG_LIBRARIES} ${GSL_LIBRARIES} ${VBFNLO_LIBRARIES} GeneratorModulesLib EventInfo GaudiKernel PathResolver AtlasHepMCLib ) +endif() # ${OPENLOOPS_INCLUDE_DIRS} ${OPENLOOPS_LIBRARIES} # Install files from the package: diff --git a/Generators/Herwig7_i/src/Herwig7HepMC.cxx b/Generators/Herwig7_i/src/Herwig7HepMC.cxx index e150433ed4819e2e5b6104193d9706bd4c029279..2114ac14935525499128b877cfe12fba7123b185 100644 --- a/Generators/Herwig7_i/src/Herwig7HepMC.cxx +++ b/Generators/Herwig7_i/src/Herwig7HepMC.cxx @@ -25,6 +25,83 @@ #include "ThePEG/Vectors/HepMCConverter.h" #ifdef HWVER_IS_72 +#ifdef HEPMC3 +#include "HepMC3/GenEvent.h" +#include "HepMC3/GenParticle.h" +#include "HepMC3/GenVertex.h" +namespace ThePEG { + template<> + struct HepMCTraits<HepMC3::GenEvent> + : public HepMCTraitsBase<HepMC3::GenEvent, + HepMC3::GenParticle, + HepMC3::GenParticlePtr, + HepMC3::GenVertex, + HepMC3::GenVertexPtr, + std::pair<double,double>, + HepMC3::GenPdfInfo> + { + static bool hasUnits() { + return true; + } + + + /** Set the \a scale, \f$\alpha_S\f$ (\a aS) and \f$\alpha_{EM}\f$ + (\a aEM) for the event \a e. The scale will be scaled with \a + unit before given to the GenEvent. */ + static void setScaleAndAlphas(HepMC3::GenEvent & e, Energy2 scale, + double aS, double aEM, Energy unit) { + e.add_attribute("event_scale",std::make_shared<HepMC3::DoubleAttribute>(sqrt(scale)/unit)); + e.add_attribute("alphaQCD",std::make_shared<HepMC3::DoubleAttribute>(aS)); + e.add_attribute("alphaQED",std::make_shared<HepMC3::DoubleAttribute>(aEM)); + } + + /** Set the primary vertex, \a v, for the event \a e. */ + static void setSignalProcessVertex(HepMC3::GenEvent & e, HepMC3::GenVertexPtr v) { + e.add_attribute("signal_process_vertex",std::make_shared<HepMC3::IntAttribute>(v->id())); + } + + /** Set the polarization directions, \a the and \a phi, for particle + \a p. */ + static void setPolarization(HepMC3::GenParticle & genp, double the, double phi) { + genp.add_attribute("theta",std::make_shared<HepMC3::DoubleAttribute>(the)); + genp.add_attribute("phi",std::make_shared<HepMC3::DoubleAttribute>(phi)); + } + + /** Set the colour line (with index \a indx) to \a coline for + particle \a p. */ + static void setColourLine(HepMC3::GenParticle & p, int indx, int coline) { + p.add_attribute("flow"+std::to_string(indx),std::make_shared<HepMC3::IntAttribute>(coline)); + } + /** Set the beam particles for the event.*/ + static void setBeamParticles(HepMC3::GenEvent & e, HepMC3::GenParticlePtr p1, HepMC3::GenParticlePtr p2) { + p1->set_status(4); + p2->set_status(4); + e.set_beam_particles(p1,p2); + } + + static HepMC3::GenParticlePtr newParticle(const Lorentz5Momentum & p, + long id, int status, Energy unit) { + // Note that according to the documentation the momentum is stored in a + // HepLorentzVector in GeV (event though the CLHEP standard is MeV). + LorentzVector<double> p_scalar = p/unit; + HepMC3::GenParticlePtr genp = std::make_shared<HepMC3::GenParticle>(HepMC::FourVector(p_scalar.x(),p_scalar.y(),p_scalar.z(),p_scalar.e()), id, status); + genp->set_generated_mass(p.mass()/unit); + return genp; + } + /** Set the position \a p for the vertex, \a v. The length will be + scaled with \a unit which normally should be millimeters. */ + static void setPosition( HepMC3::GenVertex & v, const LorentzPoint & p, Length unit) { + LorentzVector<double> p_scaled = p/unit; + v.set_position(HepMC::FourVector(p_scaled.x(),p_scaled.y(),p_scaled.z(),p_scaled.t())); + } + + /** Create a new vertex. */ + static HepMC3::GenVertexPtr newVertex() { + return std::make_shared<HepMC3::GenVertex>(); + } + }; +} +#else namespace ThePEG { template<> struct HepMCTraits<HepMC::GenEvent> @@ -41,6 +118,7 @@ namespace ThePEG { } }; } +#endif #else namespace ThePEG { template<>