Page MenuHomeHEPForge

D115.id496.diff
No OneTemporary

D115.id496.diff

diff --git a/.clang-format b/.clang-format
--- a/.clang-format
+++ b/.clang-format
@@ -66,7 +66,7 @@
Priority: 4
- Regex: '^"(HepMC|HepMC3)/'
Priority: 5
- - Regex: '^"(Pythia8|Photos|Tauola)/'
+ - Regex: '^"(Pythia8|Photos|Tauola|SHERPA|ATOOLS)/'
Priority: 6
- Regex: '^"T[[:alnum:]]+\.h"'
Priority: 7
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,6 +14,7 @@
USE_PYTHIA: "ON"
USE_PHOTOS: "ON"
USE_TAUOLA: "ON"
+ USE_SHERPA: "ON"
.future_os_image:
variables:
@@ -49,7 +50,7 @@
script:
- mkdir install
- mkdir build && cd build
- - cmake -DCMAKE_BUILD_TYPE:STRING=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX:PATH=$CI_PROJECT_DIR/install -DEVTGEN_HEPMC3:BOOL=$USE_HEPMC3 -DEVTGEN_PYTHIA:BOOL=$USE_PYTHIA -DEVTGEN_PHOTOS:BOOL=$USE_PHOTOS -DEVTGEN_TAUOLA:BOOL=$USE_TAUOLA -DEVTGEN_BUILD_TESTS:BOOL=$BUILD_TESTS -DEVTGEN_BUILD_VALIDATIONS:BOOL=$BUILD_TESTS -DEVTGEN_BUILD_DOXYGEN:BOOL=$BUILD_DOXYGEN $CI_PROJECT_DIR
+ - cmake -DCMAKE_BUILD_TYPE:STRING=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX:PATH=$CI_PROJECT_DIR/install -DEVTGEN_HEPMC3:BOOL=$USE_HEPMC3 -DEVTGEN_PYTHIA:BOOL=$USE_PYTHIA -DEVTGEN_PHOTOS:BOOL=$USE_PHOTOS -DEVTGEN_TAUOLA:BOOL=$USE_TAUOLA -DEVTGEN_SHERPA:BOOL=$USE_SHERPA -DEVTGEN_BUILD_TESTS:BOOL=$BUILD_TESTS -DEVTGEN_BUILD_VALIDATIONS:BOOL=$BUILD_TESTS -DEVTGEN_BUILD_DOXYGEN:BOOL=$BUILD_DOXYGEN $CI_PROJECT_DIR
- cmake --build .
- cmake --build . --target install
@@ -82,7 +83,7 @@
- .check_template
script:
- mkdir build && cd build
- - cmake -DEVTGEN_HEPMC3:BOOL=ON -DEVTGEN_PYTHIA:BOOL=ON -DEVTGEN_PHOTOS:BOOL=ON -DEVTGEN_TAUOLA:BOOL=ON -DEVTGEN_BUILD_TESTS:BOOL=OFF -DEVTGEN_BUILD_DOXYGEN:BOOL=ON $CI_PROJECT_DIR
+ - cmake -DEVTGEN_HEPMC3:BOOL=ON -DEVTGEN_PYTHIA:BOOL=ON -DEVTGEN_PHOTOS:BOOL=ON -DEVTGEN_TAUOLA:BOOL=ON -DEVTGEN_SHERPA:BOOL=ON -DEVTGEN_BUILD_TESTS:BOOL=OFF -DEVTGEN_BUILD_DOXYGEN:BOOL=ON $CI_PROJECT_DIR
- cmake --build . --target doc
- curl -o renameMemberVars.py "https://gitlab.cern.ch/evtgen/utilities/raw/master/RenameMemberVars/renameMemberVars.py?inline=false"
- python renameMemberVars.py check $CI_PROJECT_DIR doxygen/html
@@ -106,6 +107,7 @@
LCG_VERSION: "LCG_103_LHCB_7"
LCG_COMPILER: "gcc$GCC_VERSION-opt"
USE_HEPMC3: "OFF"
+ USE_SHERPA: "OFF"
extends:
- .production_image
- .build_template
diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,7 @@
option(EVTGEN_PYTHIA "Enable/disable linking with Pythia8" OFF)
option(EVTGEN_PHOTOS "Enable/disable linking with Photos++" OFF)
option(EVTGEN_TAUOLA "Enable/disable linking with Tauola++" OFF)
+option(EVTGEN_SHERPA "Enable/disable linking with Sherpa" OFF)
option(EVTGEN_SUPPRESS_EXTERNAL_WARNINGS "Enable/disable suppression of warnings from external dependencies" OFF)
if (EVTGEN_HEPMC3)
message(STATUS "EvtGen: Linking with HepMC3")
@@ -74,6 +75,7 @@
message(STATUS "EvtGen: Optional linking with Pythia8 EVTGEN_PYTHIA ${EVTGEN_PYTHIA}")
message(STATUS "EvtGen: Optional linking with Photos++ EVTGEN_PHOTOS ${EVTGEN_PHOTOS}")
message(STATUS "EvtGen: Optional linking with Tauola++ EVTGEN_TAUOLA ${EVTGEN_TAUOLA}")
+message(STATUS "EvtGen: Optional linking with Sherpa EVTGEN_SHERPA ${EVTGEN_SHERPA}")
include(EvtGenExternalDependencies)
# Setup clang-tidy checks
diff --git a/EvtGenExternal/EvtExternalGenList.hh b/EvtGenExternal/EvtExternalGenList.hh
--- a/EvtGenExternal/EvtExternalGenList.hh
+++ b/EvtGenExternal/EvtExternalGenList.hh
@@ -43,6 +43,10 @@
EvtAbsRadCorr* getPhotosModel( const double infraredCutOff = 1.0e-7,
const double maxWtInterference = 64.0 );
+ EvtAbsRadCorr* getSherpaPhotonsModel( const double infraredCutOff = 1.0e-7,
+ const int mode = 2,
+ const int useME = 0 );
+
protected:
private:
std::string m_photonType;
diff --git a/EvtGenExternal/EvtSherpaPhotons.hh b/EvtGenExternal/EvtSherpaPhotons.hh
new file mode 100644
--- /dev/null
+++ b/EvtGenExternal/EvtSherpaPhotons.hh
@@ -0,0 +1,86 @@
+
+/***********************************************************************
+* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
+* *
+* This file is part of EvtGen. *
+* *
+* EvtGen is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* EvtGen is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
+***********************************************************************/
+
+#ifdef EVTGEN_SHERPA
+#ifndef EVTSHERPAPHOTONS_HH
+#define EVTSHERPAPHOTONS_HH
+
+#include "EvtGenBase/EvtAbsRadCorr.hh"
+#include "EvtGenBase/EvtHepMCEvent.hh"
+#include "EvtGenBase/EvtId.hh"
+#include "EvtGenBase/EvtPDL.hh"
+#include "EvtGenBase/EvtParticle.hh"
+
+#include "SHERPA/Main/Sherpa.H"
+
+#include <string>
+
+class EvtParticle;
+class EvtAbsExternalGen;
+
+/* Description: EvtGen's interface to PHOTOS for generation of
+ * QED final state radiation.
+ */
+class EvtSherpaPhotons : public EvtAbsRadCorr {
+ public:
+ EvtSherpaPhotons( const bool useEvtGenRandom = true,
+ const double infraredCutOff = 1.0e-7, const int mode = 2,
+ const int useME = 0 );
+
+ void initialise() override;
+
+ void doRadCorr( EvtParticle* p ) override;
+
+ private:
+ // Provides vector of pointers to the configuration strings for Sherpa
+ std::vector<char*> addParameters();
+
+ // Updates the particle properties table of Sherpa
+ void updateParticleLists();
+
+ // The Sherpa instance.
+ std::unique_ptr<SHERPA::Sherpa> m_sherpaGen;
+
+ // Vector containing the configuration strings for Sherpa
+ // INIT_ONLY=6 intialises the Sherpa objects without launching simulation.
+ std::vector<std::string> m_configs{ "Sherpa", "INIT_ONLY=6" };
+
+ // Use EvtGen's random number generator
+ bool m_useEvtGenRandom = true;
+
+ // Default settings for PHOTONS++
+ // Minimum photon Energy (infrared cut-off).
+ double m_infraredCutOff = 1.0e-7;
+ // Switches on (default) the hard emission corrections (mode 2),
+ // otherwise follow the soft-photon only approach (mode 1).
+ int m_mode = 2;
+ // Switches off (default) or on the exact matrix-element corrections (works only for mode 2)
+ int m_useME = 0;
+
+ // Default photon properties
+ const std::string m_photonType = "gamma";
+ EvtId m_gammaId = EvtId( -1, -1 );
+ long int m_gammaPDG = 22;
+ bool m_initialised = false;
+};
+
+#endif
+
+#endif
diff --git a/EvtGenExternal/EvtSherpaRandom.hh b/EvtGenExternal/EvtSherpaRandom.hh
new file mode 100644
--- /dev/null
+++ b/EvtGenExternal/EvtSherpaRandom.hh
@@ -0,0 +1,94 @@
+
+/***********************************************************************
+* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
+* *
+* This file is part of EvtGen. *
+* *
+* EvtGen is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* EvtGen is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
+***********************************************************************/
+
+#ifdef EVTGEN_SHERPA
+
+#ifndef EVTSHERPARANDOM_HH
+#define EVTSHERPARANDOM_HH
+
+#include "EvtGenBase/EvtRandom.hh"
+
+#include "ATOOLS/Math/Random.H"
+
+/* Description: Class to specify the chosen EvtGen random number (engine)
+ * to be used for Sherpa.
+ */
+
+class EvtSherpaRandom : public ATOOLS::External_RNG {
+ public:
+ double Get() { return EvtRandom::Flat(); }
+
+ private:
+};
+
+// The following code makes EvtSherpaRandom loadable in Sherpa
+
+//! \cond DOXYGEN_IGNORE
+
+// In Sherpa versions v2.2.15 and earlier the DECLARE_GETTER macro produces code that doesn't compile with gcc versions > 12 and C++20
+// So, in those cases, instead use explicit code that has been modified to work correctly
+#ifdef EVTGEN_SHERPA_USEMACRO
+DECLARE_GETTER( EvtSherpaRandom, "EvtSherpaRandom", ATOOLS::External_RNG,
+ ATOOLS::RNG_Key );
+#else
+namespace ATOOLS {
+ template <>
+ class Getter<External_RNG, RNG_Key, EvtSherpaRandom> :
+ public Getter_Function<External_RNG, RNG_Key> {
+ public:
+ Getter( const bool& d = true ) :
+ Getter_Function<External_RNG, RNG_Key>{ "EvtSherpaRandom" }
+ {
+ SetDisplay( d );
+ }
+
+ protected:
+ void PrintInfo( std::ostream& str, const size_t width ) const;
+ Object_Type* operator()( const Parameter_Type& parameters ) const;
+
+ private:
+ static Getter<External_RNG, RNG_Key, EvtSherpaRandom> s_initializer;
+ };
+} // namespace ATOOLS
+
+ATOOLS::Getter<ATOOLS::External_RNG, ATOOLS::RNG_Key, EvtSherpaRandom>
+ ATOOLS::Getter<ATOOLS::External_RNG, ATOOLS::RNG_Key, EvtSherpaRandom>::s_initializer{
+ true };
+#endif
+
+ATOOLS::External_RNG*
+ATOOLS::Getter<ATOOLS::External_RNG, ATOOLS::RNG_Key, EvtSherpaRandom>::operator()(
+ const ATOOLS::RNG_Key& ) const
+{
+ return new EvtSherpaRandom();
+}
+
+// This eventually prints a help message
+void ATOOLS::Getter<ATOOLS::External_RNG, ATOOLS::RNG_Key, EvtSherpaRandom>::PrintInfo(
+ std::ostream& str, const size_t ) const
+{
+ str << " EvtGen-Sherpa RNG interface";
+}
+
+//! \endcond
+
+#endif
+
+#endif
diff --git a/History.md b/History.md
--- a/History.md
+++ b/History.md
@@ -11,8 +11,16 @@
===
## R02-0X-00
+21 May 2024 Fernando Abudinen
+* D115: Introduced Sherpa's PHOTONS++ generator
+ as alternative for final-state radiation simulation.
+ - Added Sherpa dependencies and linking in compilation files
+ - Introduced new `EvtSherpaPhotons` interface
+ - Introduced new `EvtSherpaRandom` interface to propagate EvtGen's random number into Sherpa
+ - Implemented `fsrGenerator` as input argument in `testDecayModel` module
+
8 May 2024 Michal Kreps, Thomas Latham, Andrii Verbytskyi
-* D58: Rename member variables to follow convention of m_ prefix
+* D58: Rename member variables to follow convention of `m_` prefix
- In addition:
* Introduce pre-build check in the CI that convention is being followed in all classes
* Fix shadowing of variables in some classes
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -23,14 +23,16 @@
We now recommend using HepMC3 but support for HepMC2 continues to be available.
Optionally, it is possible to use other external generators, such as Pythia8
-(for Pythia decays in the DECAY.DEC file, for example), Photos (for
-radiative corrections) and Tauola (for tau decays):
+(for Pythia decays in the DECAY.DEC file, for example), Photos or Sherpa's Photons++
+(for radiative corrections) and Tauola (for tau decays):
Pythia8 https://pythia.org/
-Photos http://photospp.web.cern.ch/photospp/
+Photos https://photospp.web.cern.ch/
-Tauola http://tauolapp.web.cern.ch/tauolapp/
+Tauola https://tauolapp.web.cern.ch/
+
+Sherpa https://sherpa-team.gitlab.io/
All of these packages have instructions for building them.
@@ -38,6 +40,7 @@
Pythia8: 8.201 or newer
Photos: 3.64 or newer
Tauola: 1.1.8 or newer
+Sherpa: 2.0.0 or newer
Once these packages are available, build the EvtGen release by creating a build directory
alongside the EvtGen source directory (assumed here to be called evtgen.git) and running:
@@ -88,6 +91,13 @@
depending on your build environment, otherwise the
location can be specified via this option.
+ `-DEVTGEN_SHERPA=ON` : Enable linking with Sherpa (OFF by default)
+
+ `-DSHERPA_ROOT_DIR=<location>` : Location of Sherpa install directory
+ As with HepMC this may be automatically detected
+ depending on your build environment, otherwise the
+ location can be specified via this option.
+
`-DEVTGEN_BUILD_DOC=ON` : Enable building documentation in 'doc' directory (OFF by default)
`-DEVTGEN_BUILD_TESTS=ON` : Enable building executables in 'test' directory (OFF by default)
@@ -168,23 +178,26 @@
To use the external generators, use the following code:
```c++
- #include "EvtGenExternal/EvtExternalGenList.hh"
#include "EvtGenBase/EvtAbsRadCorr.hh"
#include "EvtGenBase/EvtDecayBase.hh"
+ #include "EvtGenExternal/EvtExternalGenList.hh"
+
// Set up the default external generator list: Photos, Pythia and/or Tauola
EvtExternalGenList genList;
EvtAbsRadCorr* radCorrEngine = genList.getPhotosModel();
std::list<EvtDecayBase*> extraModels = genList.getListOfModels();
// Create the EvtGen generator object
- EvtGen myGenerator("decayFile.dec", "evt.pdl", randomEnginePointer,
- radCorrEngine, &extraModels);
+ EvtGen myGenerator( "decayFile.dec", "evt.pdl", randomEnginePointer,
+ radCorrEngine, &extraModels );
//If you don't want to use external generators, use the following:
//EvtGen myGenerator("decayFile.dec", "evt.pdl", randomEnginePointer);
```
+ To use Sherpa's PHOTONS++ generator instead of Photos, replace above `getPhotosModel()` with `getSherpaPhotonsModel()`.
+
The files [Pythia8_README.md](Pythia8_README.md) and [Tauola_README.md](Tauola_README.md) have more details about
using the new Pythia 8 and Tauola generators (called via the PYTHIA and TAUOLA
"decay.dec" model names). The new Photos generator is still called via the PHOTOS
@@ -193,7 +206,7 @@
It is now possible to use alias particle decays for the Pythia 8 model.
Two Pythia 8 instances are used in EvtPythiaEngine for normal and aliased decays.
Since the underlying code for Photos and Tauola is still Fortran, it is only
- possible to have one (unique) instance of each of these external generators.
+ possible to have one unique instance of each of these external generators.
This can only be fixed if these packages are converted to pure C++ code.
@@ -206,7 +219,6 @@
(EvtGenModels/EvtGenericDalitz.cpp), that should be used instead of EvtDDalitz.
The generic Dalitz model uses xml files to configure the resonance amplitude
parameters (instead of being hardcoded in EvtDDalitz):
-
```
Decay D+
1.0 K- pi+ pi+ GENERIC_DALITZ MyDalitzParameters.xml;
@@ -229,5 +241,3 @@
One or the other can be chosen as the mixing method for the B system by
choosing 0 (coherent) or 1 (incoherent) for the last integer argument
in the EvtGen() constructor.
-
-
diff --git a/cmake/Modules/EvtGenCompilerFlags.cmake b/cmake/Modules/EvtGenCompilerFlags.cmake
--- a/cmake/Modules/EvtGenCompilerFlags.cmake
+++ b/cmake/Modules/EvtGenCompilerFlags.cmake
@@ -35,6 +35,8 @@
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char -Wall -Wextra -Wshadow -Woverloaded-virtual")
if( ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" )
+ # Save temporary intermediate compilation products, e.g. result of pre-processor, etc.
+ #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -save-temps=obj")
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g3")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
diff --git a/cmake/Modules/EvtGenExternalDependencies.cmake b/cmake/Modules/EvtGenExternalDependencies.cmake
--- a/cmake/Modules/EvtGenExternalDependencies.cmake
+++ b/cmake/Modules/EvtGenExternalDependencies.cmake
@@ -27,6 +27,7 @@
set(Tauola++_ROOT_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Location of Tauola++ installation")
set(PHOTOSPP_ROOT_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Location of Photos++ installation - alternative spelling")
set(TAUOLAPP_ROOT_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Location of Tauola++ installation - alternative spelling")
+set(SHERPA_ROOT_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Location of Sherpa installation")
# The components we search for in the external generators depend on the version
# of HepMC we're working with
@@ -43,6 +44,9 @@
# From version 1.1.8 Tauola has HepMC3 support
find_package(Tauola++ REQUIRED COMPONENTS Fortran CxxInterface HepMC3)
endif()
+ if(EVTGEN_SHERPA)
+ find_package(Sherpa 2.0.0 REQUIRED)
+ endif()
else()
find_package(HepMC2 REQUIRED)
if(EVTGEN_PYTHIA)
@@ -57,4 +61,7 @@
# Older versions of Tauola don't have the HepMC component, the HepMC2 interface is in CxxInterface
find_package(Tauola++ REQUIRED COMPONENTS Fortran CxxInterface OPTIONAL_COMPONENTS HepMC)
endif()
+ if(EVTGEN_SHERPA)
+ find_package(Sherpa 2.0.0 REQUIRED)
+ endif()
endif()
diff --git a/cmake/Modules/FindPythia8.cmake b/cmake/Modules/FindPythia8.cmake
--- a/cmake/Modules/FindPythia8.cmake
+++ b/cmake/Modules/FindPythia8.cmake
@@ -41,7 +41,7 @@
if(PYTHIA8_XML AND NOT PYTHIA8_VERSION)
file(READ ${PYTHIA8_XML}/Version.xml versionstr)
string(REGEX REPLACE ".*Pythia:versionNumber.*default.*[0-9][.]([0-9]+).*" "\\1" PYTHIA8_VERSION "${versionstr}")
- set(PYTHIA8_VERSION ${PYTHIA8_VERSION} CACHE STRING "Detected version of Pythia8.")
+ set(PYTHIA8_VERSION ${PYTHIA8_VERSION} CACHE STRING "Detected version of Pythia8")
mark_as_advanced(PYTHIA8_VERSION)
endif()
@@ -76,7 +76,7 @@
# handle the QUIETLY and REQUIRED arguments and set PYTHIA8_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(Pythia8 DEFAULT_MSG PYTHIA8_INCLUDE_DIR PYTHIA8_LIBRARIES PYTHIA8_XML)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Pythia8 DEFAULT_MSG PYTHIA8_VERSION PYTHIA8_INCLUDE_DIR PYTHIA8_LIBRARIES PYTHIA8_XML)
set(PYTHIA8_INCLUDE_DIRS ${PYTHIA8_INCLUDE_DIR})
diff --git a/cmake/Modules/FindSherpa.cmake b/cmake/Modules/FindSherpa.cmake
new file mode 100644
--- /dev/null
+++ b/cmake/Modules/FindSherpa.cmake
@@ -0,0 +1,81 @@
+
+########################################################################
+# Copyright 1998-2020 CERN for the benefit of the EvtGen authors #
+# #
+# This file is part of EvtGen. #
+# #
+# EvtGen is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# EvtGen is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with EvtGen. If not, see <https://www.gnu.org/licenses/>. #
+########################################################################
+
+# - Try to find Sherpa
+# Defines:
+#
+# SHERPA_FOUND
+# SHERPA_VERSION
+# SHERPA_INCLUDE_DIR
+# SHERPA_INCLUDE_DIRS (not cached)
+# SHERPA_LIBRARY
+# SHERPA_LIBRARIES (not cached)
+# SHERPA_LIBRARY_DIRS (not cached)
+
+find_path(SHERPA_INCLUDE_DIR SHERPA/Main/Sherpa.H
+ HINTS $ENV{SHERPA_ROOT_DIR}/include ${SHERPA_ROOT_DIR}/include
+ PATH_SUFFIXES include SHERPA-MC)
+
+mark_as_advanced(SHERPA_INCLUDE_DIR)
+
+# Enforce a minimal list if none is explicitly requested
+if(NOT Sherpa_FIND_COMPONENTS)
+ set(Sherpa_FIND_COMPONENTS SherpaMain ModelMain METoolsMain METoolsLoops METoolsSpinCorrelations PDF PhotonsMEs PhotonsMain PhotonsPhaseSpace PhotonsTools Remnant ToolsMath ToolsOrg ToolsPhys)
+endif()
+
+foreach(component ${Sherpa_FIND_COMPONENTS})
+ find_library(SHERPA_${component}_LIBRARY NAMES ${component} ${_${component}_names}
+ HINTS $ENV{SHERPA_ROOT_DIR}/lib ${SHERPA_ROOT_DIR}/lib $ENV{SHERPA_ROOT_DIR}/lib64 ${SHERPA_ROOT_DIR}/lib64
+ PATH_SUFFIXES SHERPA-MC)
+ if (SHERPA_${component}_LIBRARY)
+ set(SHERPA_${component}_FOUND 1)
+ list(APPEND SHERPA_LIBRARIES ${SHERPA_${component}_LIBRARY})
+
+ get_filename_component(libdir ${SHERPA_${component}_LIBRARY} PATH)
+ list(APPEND SHERPA_LIBRARY_DIRS ${libdir})
+ else()
+ set(SHERPA_${component}_FOUND 0)
+ endif()
+ mark_as_advanced(SHERPA_${component}_LIBRARY)
+endforeach()
+
+if(SHERPA_LIBRARY_DIRS)
+ list(REMOVE_DUPLICATES SHERPA_LIBRARY_DIRS)
+endif()
+
+find_program(SHERPA_CONFIG Sherpa-config
+ HINTS $ENV{SHERPA_ROOT_DIR}/bin ${SHERPA_ROOT_DIR}/bin)
+
+if(SHERPA_CONFIG)
+ execute_process(COMMAND ${SHERPA_CONFIG} --version
+ OUTPUT_VARIABLE SHERPA_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ set(SHERPA_VERSION ${SHERPA_VERSION} CACHE STRING "Detected version of Sherpa")
+ mark_as_advanced(SHERPA_VERSION)
+endif()
+
+# handle the QUIETLY and REQUIRED arguments and set SHERPA_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Sherpa DEFAULT_MSG SHERPA_VERSION SHERPA_INCLUDE_DIR SHERPA_LIBRARIES )
+
+set(SHERPA_INCLUDE_DIRS ${SHERPA_INCLUDE_DIR})
+
+mark_as_advanced(SHERPA_FOUND)
diff --git a/doxygen/Doxyfile.in b/doxygen/Doxyfile.in
--- a/doxygen/Doxyfile.in
+++ b/doxygen/Doxyfile.in
@@ -2059,7 +2059,7 @@
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED = EVTGEN_HEPMC3 EVTGEN_PYTHIA EVTGEN_PHOTOS EVTGEN_TAUOLA
+PREDEFINED = EVTGEN_HEPMC3 EVTGEN_PYTHIA EVTGEN_PHOTOS EVTGEN_TAUOLA EVTGEN_SHERPA
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
diff --git a/setupEvtGen.sh b/setupEvtGen.sh
--- a/setupEvtGen.sh
+++ b/setupEvtGen.sh
@@ -41,35 +41,64 @@
# Location in which to install
INSTALL_PREFIX="/usr/local"
-# EvtGen version or tag number (or branch name). No extra spaces on this line!
-VERSION=R02-02-00
+# EvtGen version or tag number (or branch name)
+VERSION="R02-02-00"
+
+# EvtGen git URL
+# HepForge main repo
+EVTGEN_URL="https://phab.hepforge.org/source/evtgen.git"
+# CERN GitLab mirror
+#EVTGEN_URL="https://gitlab.cern.ch/evtgen/evtgen.git"
+
+# Options to pass to 'make', e.g. "-j 6"
+BUILDARGS=""
# HepMC version numbers - change HEPMCMAJORVERSION to 2 in order to use HepMC2
HEPMCMAJORVERSION="3"
HEPMC2VER="2.06.10"
HEPMC3VER="3.2.6"
-HEPMC2PKG="HepMC-"$HEPMC2VER
-HEPMC3PKG="HepMC3-"$HEPMC3VER
-HEPMC2TAR="hepmc"$HEPMC2VER".tgz"
-HEPMC3TAR=$HEPMC3PKG".tar.gz"
+HEPMC2PKG="HepMC-$HEPMC2VER"
+HEPMC3PKG="HepMC3-$HEPMC3VER"
+HEPMC2TAR="hepmc$HEPMC2VER.tgz"
+HEPMC3TAR="$HEPMC3PKG.tar.gz"
+HEPMCBASEURL="http://hepmc.web.cern.ch/hepmc/releases"
+if [ "$HEPMCMAJORVERSION" -lt "3" ]
+then
+ HEPMCURL=$HEPMCBASEURL/$HEPMC2TAR
+else
+ HEPMCURL=$HEPMCBASEURL/$HEPMC3TAR
+fi
-# Pythia version number with no decimal points, e.g. 8230 corresponds to version 8.230. This
-# follows the naming convention of Pythia install tar files. Again, no extra spaces allowed.
-PYTHIAVER=8310
-PYTHIAPKG="pythia"$PYTHIAVER
-PYTHIATAR=$PYTHIAPKG".tgz"
+# Pythia version number with no decimal points, e.g. 8310 corresponds to version 8.310
+# This follows the naming convention of Pythia install tar files
+PYTHIAVER="8310"
+PYTHIAPKG="pythia$PYTHIAVER"
+PYTHIATAR="$PYTHIAPKG.tgz"
+PYTHIABASEURL="https://pythia.org/download"
+PYTHIAURL="$PYTHIABASEURL/pythia${PYTHIAVER:0:2}/$PYTHIATAR"
# Photos++ version number
PHOTOSVER="3.64"
PHOTOSPKG="PHOTOS"
-PHOTOSDIR="PHOTOS."$PHOTOSVER
-PHOTOSTAR=$PHOTOSDIR".tar.gz"
+PHOTOSDIR="PHOTOS.$PHOTOSVER"
+PHOTOSTAR="$PHOTOSDIR.tar.gz"
+PHOTOSBASEURL="https://photospp.web.cern.ch/resources"
+PHOTOSURL="$PHOTOSBASEURL/$PHOTOSDIR/$PHOTOSTAR"
# Tauola++ version number
TAUOLAVER="1.1.8"
TAUOLAPKG="TAUOLA"
-TAUOLADIR="TAUOLA."$TAUOLAVER
-TAUOLATAR=$TAUOLADIR".tar.gz"
+TAUOLADIR="TAUOLA.$TAUOLAVER"
+TAUOLATAR="$TAUOLADIR.tar.gz"
+TAUOLABASEURL="https://tauolapp.web.cern.ch/resources"
+TAUOLAURL="$TAUOLABASEURL/$TAUOLADIR/$TAUOLATAR"
+
+# Sherpa version number
+SHERPAVER="2.2.15"
+SHERPAPKG="sherpa-v$SHERPAVER"
+SHERPATAR="$SHERPAPKG.tar.gz"
+SHERPABASEURL="https://gitlab.com/sherpa-team/sherpa/-/archive"
+SHERPAURL="$SHERPABASEURL/v$SHERPAVER/$SHERPATAR"
# Determine OS
osArch=`uname`
@@ -106,10 +135,10 @@
mkdir -p sources
mkdir -p builds
-echo Downloading EvtGen source from GIT
+echo Downloading EvtGen source from GIT, using URL: $EVTGEN_URL
cd sources
-git clone https://phab.hepforge.org/source/evtgen.git evtgen
+git clone $EVTGEN_URL evtgen
cd evtgen
git checkout $VERSION
@@ -123,15 +152,16 @@
export LC_ALL=en_US.UTF-8
fi
-if [ "$HEPMCMAJORVERSION" -lt "3" ]
-then
- curl -O http://hepmc.web.cern.ch/hepmc/releases/$HEPMC2TAR
-else
- curl -O http://hepmc.web.cern.ch/hepmc/releases/$HEPMC3TAR
-fi
-curl -O https://pythia.org/download/pythia${PYTHIAVER:0:2}/$PYTHIATAR
-curl -O http://photospp.web.cern.ch/photospp/resources/$PHOTOSDIR/$PHOTOSTAR
-curl -O http://tauolapp.web.cern.ch/tauolapp/resources/$TAUOLADIR/$TAUOLATAR
+echo Downloading HepMC source from: $HEPMCURL
+curl -O $HEPMCURL
+echo Downloading Pythia8 source from: $PYTHIAURL
+curl -O $PYTHIAURL
+echo Downloading Photos source from: $PHOTOSURL
+curl -O $PHOTOSURL
+echo Downloading Tauola source from: $TAUOLAURL
+curl -O $TAUOLAURL
+echo Downloading Sherpa source from: $SHERPAURL
+curl -O $SHERPAURL
cd $BUILD_BASE/sources
@@ -145,6 +175,7 @@
tar -xzf $BUILD_BASE/tarfiles/$PYTHIATAR
tar -xzf $BUILD_BASE/tarfiles/$PHOTOSTAR
tar -xzf $BUILD_BASE/tarfiles/$TAUOLATAR
+tar -xzf $BUILD_BASE/tarfiles/$SHERPATAR
# Patch TAUOLA and PHOTOS on Darwin (Mac)
if [ "$osArch" == "Darwin" ]
@@ -168,19 +199,19 @@
mkdir -p $BUILD_BASE/builds/HepMC2
cd $BUILD_BASE/builds/HepMC2
$CMAKE -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX $BUILD_BASE/sources/$HEPMC2PKG -Dmomentum:STRING=GEV -Dlength:STRING=MM
- make
+ make $BUILDARGS
make install
echo Installing pythia8 from $BUILD_BASE/sources/$PYTHIAPKG
cd $BUILD_BASE/sources/$PYTHIAPKG
./configure --enable-shared --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
echo Installing PHOTOS from $BUILD_BASE/sources/$PHOTOSPKG
cd $BUILD_BASE/sources/$PHOTOSPKG
./configure --with-hepmc3= --with-hepmc=$INSTALL_PREFIX --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
if [ "$osArch" != "Darwin" ]
@@ -188,29 +219,28 @@
echo Installing TAUOLA from $BUILD_BASE/sources/$TAUOLAPKG
cd $BUILD_BASE/sources/$TAUOLAPKG
./configure --without-hepmc3 --with-hepmc=$INSTALL_PREFIX --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
fi
-
else
echo Installing HepMC3 from $BUILD_BASE/sources/$HEPMC3PKG
mkdir -p $BUILD_BASE/builds/HepMC3
cd $BUILD_BASE/builds/HepMC3
$CMAKE -DHEPMC3_ENABLE_ROOTIO:BOOL=OFF -DHEPMC3_ENABLE_PYTHON:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX $BUILD_BASE/sources/$HEPMC3PKG
- make
+ make $BUILDARGS
make install
echo Installing pythia8 from $BUILD_BASE/souces/$PYTHIAPKG
cd $BUILD_BASE/sources/$PYTHIAPKG
./configure --enable-shared --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
echo Installing PHOTOS from $BUILD_BASE/sources/$PHOTOSPKG
cd $BUILD_BASE/sources/$PHOTOSPKG
./configure --without-hepmc --with-hepmc3=$INSTALL_PREFIX --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
if [ "$osArch" != "Darwin" ]
@@ -218,11 +248,18 @@
echo Installing TAUOLA from $BUILD_BASE/sources/$TAUOLAPKG
cd $BUILD_BASE/sources/$TAUOLAPKG
./configure --without-hepmc --with-hepmc3=$INSTALL_PREFIX --prefix=$INSTALL_PREFIX
- make
+ make $BUILDARGS
make install
fi
fi
+echo Installing Sherpa from $BUILD_BASE/sources/$SHERPAPKG
+cd $BUILD_BASE/sources/$SHERPAPKG
+autoreconf -i
+./configure --with-sqlite3=install --prefix=$INSTALL_PREFIX
+make $BUILDARGS
+make install
+
echo Installing EvtGen from $BUILD_BASE/sources/evtgen
mkdir -p $BUILD_BASE/builds/evtgen
cd $BUILD_BASE/builds/evtgen
@@ -234,13 +271,15 @@
-DEVTGEN_HEPMC3:BOOL=OFF -DHEPMC2_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PYTHIA:BOOL=ON -DPYTHIA8_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PHOTOS:BOOL=ON -DPHOTOSPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
- -DEVTGEN_TAUOLA:BOOL=OFF
+ -DEVTGEN_TAUOLA:BOOL=OFF \
+ -DEVTGEN_SHERPA:BOOL=ON -DSHERPA_ROOT_DIR:PATH=$INSTALL_PREFIX
else
$CMAKE -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX $BUILD_BASE/sources/evtgen \
-DEVTGEN_HEPMC3:BOOL=ON -DHEPMC3_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PYTHIA:BOOL=ON -DPYTHIA8_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PHOTOS:BOOL=ON -DPHOTOSPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
- -DEVTGEN_TAUOLA:BOOL=OFF
+ -DEVTGEN_TAUOLA:BOOL=OFF \
+ -DEVTGEN_SHERPA:BOOL=ON -DSHERPA_ROOT_DIR:PATH=$INSTALL_PREFIX
fi
else
if [ "$HEPMCMAJORVERSION" -lt "3" ]
@@ -249,16 +288,18 @@
-DEVTGEN_HEPMC3:BOOL=OFF -DHEPMC2_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PYTHIA:BOOL=ON -DPYTHIA8_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PHOTOS:BOOL=ON -DPHOTOSPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
- -DEVTGEN_TAUOLA:BOOL=ON -DTAUOLAPP_ROOT_DIR:PATH=$INSTALL_PREFIX
+ -DEVTGEN_TAUOLA:BOOL=ON -DTAUOLAPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
+ -DEVTGEN_SHERPA:BOOL=ON -DSHERPA_ROOT_DIR:PATH=$INSTALL_PREFIX
else
$CMAKE -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX $BUILD_BASE/sources/evtgen \
-DEVTGEN_HEPMC3:BOOL=ON -DHEPMC3_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PYTHIA:BOOL=ON -DPYTHIA8_ROOT_DIR:PATH=$INSTALL_PREFIX \
-DEVTGEN_PHOTOS:BOOL=ON -DPHOTOSPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
- -DEVTGEN_TAUOLA:BOOL=ON -DTAUOLAPP_ROOT_DIR:PATH=$INSTALL_PREFIX
+ -DEVTGEN_TAUOLA:BOOL=ON -DTAUOLAPP_ROOT_DIR:PATH=$INSTALL_PREFIX \
+ -DEVTGEN_SHERPA:BOOL=ON -DSHERPA_ROOT_DIR:PATH=$INSTALL_PREFIX
fi
fi
-make
+make $BUILDARGS
make install
echo Setup done.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -83,7 +83,7 @@
# Add the EvtGenExternal library (if required)...
-if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA )
+if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA OR EVTGEN_SHERPA)
# Again, first build all the object files (with PIC enabled) so they can be
# used to build both the shared and static libs
add_library(objlib_ext OBJECT ${EVTGEN_EXTERNAL_SOURCES})
@@ -130,6 +130,17 @@
target_include_directories(objlib_ext PRIVATE ${Tauola++_INCLUDE_DIRS})
endif()
endif()
+ if(EVTGEN_SHERPA)
+ target_compile_definitions(objlib_ext PRIVATE EVTGEN_SHERPA)
+ if( ${SHERPA_VERSION} VERSION_GREATER 2.2.15 )
+ target_compile_definitions(objlib_ext PRIVATE EVTGEN_SHERPA_USEMACRO)
+ endif()
+ if (EVTGEN_SUPPRESS_EXTERNAL_WARNINGS)
+ target_include_directories(objlib_ext SYSTEM PRIVATE ${SHERPA_INCLUDE_DIRS})
+ else()
+ target_include_directories(objlib_ext PRIVATE ${SHERPA_INCLUDE_DIRS})
+ endif()
+ endif()
# Now make the shared library from the object files
add_library(EvtGenExternal SHARED $<TARGET_OBJECTS:objlib_ext>)
@@ -142,6 +153,14 @@
target_include_directories(EvtGenExternal PUBLIC ${PYTHIA8_INCLUDE_DIRS})
target_link_libraries(EvtGenExternal PUBLIC ${PYTHIA8_LIBRARIES})
endif()
+ if(EVTGEN_SHERPA)
+ target_compile_definitions(EvtGenExternal PUBLIC EVTGEN_SHERPA)
+ if( ${SHERPA_VERSION} VERSION_GREATER 2.2.15 )
+ target_compile_definitions(EvtGenExternal PRIVATE EVTGEN_SHERPA_USEMACRO)
+ endif()
+ target_include_directories(EvtGenExternal PUBLIC ${SHERPA_INCLUDE_DIRS})
+ target_link_libraries(EvtGenExternal PUBLIC ${SHERPA_LIBRARIES})
+ endif()
if(EVTGEN_HEPMC3)
target_compile_definitions(EvtGenExternal PUBLIC EVTGEN_HEPMC3)
target_include_directories(EvtGenExternal PUBLIC ${HEPMC3_INCLUDE_DIR})
@@ -199,6 +218,14 @@
target_include_directories(EvtGenExternalStatic PUBLIC ${PYTHIA8_INCLUDE_DIRS})
target_link_libraries(EvtGenExternalStatic PUBLIC ${PYTHIA8_LIBRARIES})
endif()
+ if(EVTGEN_SHERPA)
+ target_compile_definitions(EvtGenExternalStatic PUBLIC EVTGEN_SHERPA)
+ if( ${SHERPA_VERSION} VERSION_GREATER 2.2.15 )
+ target_compile_definitions(EvtGenExternalStatic PRIVATE EVTGEN_SHERPA_USEMACRO)
+ endif()
+ target_include_directories(EvtGenExternalStatic PUBLIC ${SHERPA_INCLUDE_DIRS})
+ target_link_libraries(EvtGenExternalStatic PUBLIC ${SHERPA_LIBRARIES})
+ endif()
if(EVTGEN_HEPMC3)
target_compile_definitions(EvtGenExternalStatic PUBLIC EVTGEN_HEPMC3)
target_include_directories(EvtGenExternalStatic PUBLIC ${HEPMC3_INCLUDE_DIR})
@@ -255,7 +282,7 @@
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
-if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA )
+if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA OR EVTGEN_SHERPA)
install(
TARGETS EvtGenExternal EvtGenExternalStatic
EXPORT "EvtGenTargets"
diff --git a/src/EvtGenExternal/EvtExternalGenList.cpp b/src/EvtGenExternal/EvtExternalGenList.cpp
--- a/src/EvtGenExternal/EvtExternalGenList.cpp
+++ b/src/EvtGenExternal/EvtExternalGenList.cpp
@@ -25,6 +25,7 @@
#include "EvtGenExternal/EvtExternalGenFactory.hh"
#include "EvtGenExternal/EvtPHOTOS.hh"
#include "EvtGenExternal/EvtPythia.hh"
+#include "EvtGenExternal/EvtSherpaPhotons.hh"
#include "EvtGenExternal/EvtTauola.hh"
EvtExternalGenList::EvtExternalGenList( bool convertPythiaCodes,
@@ -80,6 +81,30 @@
}
#endif
+#ifdef EVTGEN_SHERPA
+EvtAbsRadCorr* EvtExternalGenList::getSherpaPhotonsModel(
+ const double infraredCutOff, const int mode, const int useME )
+{
+ // Define the Photos model, which uses the EvtSherpaPhotonsEngine class.
+ EvtSherpaPhotons* sherpaPhotonsModel =
+ new EvtSherpaPhotons( m_useEvtGenRandom, infraredCutOff, mode, useME );
+ return sherpaPhotonsModel;
+}
+#else
+EvtAbsRadCorr* EvtExternalGenList::getSherpaPhotonsModel(
+ const double /*infraredCutOff*/, const int /*mode*/, const int /*useME*/ )
+{
+ EvtGenReport( EVTGEN_ERROR, "EvtGen" )
+ << " Sherpa's PHOTONS++ generator has been called for FSR simulation, but Sherpa was not switched on during compilation."
+ << std::endl;
+
+ EvtGenReport( EVTGEN_ERROR, "EvtGen" )
+ << " The simulation will be generated without FSR." << std::endl;
+
+ return new EvtNoRadCorr{};
+}
+#endif
+
std::list<EvtDecayBase*> EvtExternalGenList::getListOfModels()
{
// Create the Pythia and Tauola models, which use their own engine classes.
diff --git a/src/EvtGenExternal/EvtSherpaPhotons.cpp b/src/EvtGenExternal/EvtSherpaPhotons.cpp
new file mode 100644
--- /dev/null
+++ b/src/EvtGenExternal/EvtSherpaPhotons.cpp
@@ -0,0 +1,299 @@
+
+/***********************************************************************
+* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
+* *
+* This file is part of EvtGen. *
+* *
+* EvtGen is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* EvtGen is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
+***********************************************************************/
+
+#ifdef EVTGEN_SHERPA
+
+#include "EvtGenExternal/EvtSherpaPhotons.hh"
+
+#include "EvtGenBase/EvtPhotonParticle.hh"
+#include "EvtGenBase/EvtRandom.hh"
+#include "EvtGenBase/EvtReport.hh"
+#include "EvtGenBase/EvtVector4R.hh"
+
+#include "ATOOLS/Org/MyStrStream.H"
+#include "ATOOLS/Phys/Particle.H"
+#include "SHERPA/Initialization/Initialization_Handler.H"
+#include "SHERPA/Single_Events/Event_Handler.H"
+#include "SHERPA/SoftPhysics/Soft_Photon_Handler.H"
+
+#include <cstring>
+#include <iostream>
+#include <vector>
+
+using std::endl;
+
+EvtSherpaPhotons::EvtSherpaPhotons( const bool useEvtGenRandom,
+ const double infraredCutOff, const int mode,
+ const int useME ) :
+ m_useEvtGenRandom{ useEvtGenRandom },
+ m_infraredCutOff{ infraredCutOff },
+ m_mode{ mode },
+ m_useME{ useME }
+{
+}
+
+void EvtSherpaPhotons::initialise()
+{
+ if ( m_initialised ) {
+ return;
+ }
+
+ EvtGenReport( EVTGEN_INFO, "EvtGen" )
+ << "Setting up Sherpa PHOTONS++ generator for FSR." << endl;
+
+ /* Specify whether we are going to use EvtGen's random number generator
+ * (via EvtSherpaRandom interface) for Sherpa's PHOTONS++ simulation. */
+ if ( m_useEvtGenRandom ) {
+ m_configs.push_back( "SHERPA_LDADD=EvtGenExternal" );
+ m_configs.push_back( "EXTERNAL_RNG=EvtSherpaRandom" );
+ }
+
+ /*
+ * Internal PHOTONS++ settings.
+ * Documentation at
+ * https://sherpa.hepforge.org/doc/Sherpa.html#QED-Corrections
+ */
+
+ /*
+ * YFS_IR_CUTOFF sets the infrared cut-off which serves as a
+ * minimum photon energy in this frame for explicit photon generation.
+ * The default is YFS_IR_CUTOFF = 1E-3 (GeV) but we set it to 1E-7 to equalize
+ * with the cutoff used for PHOTOS.
+ */
+ m_configs.push_back( "YFS_IR_CUTOFF=" + ATOOLS::ToString( m_infraredCutOff ) );
+
+ /*
+ * The keyword YFS_MODE = [0,1,2] determines the mode of operation.
+ * YFS_MODE = 0 switches Photons off.
+ * YFS_MODE = 1 sets the mode to "soft only", meaning soft emissions will be
+ * treated correctly to all orders but no hard emission corrections will be included.
+ * YFS_MODE = 2 these hard emission corrections will also be included up to
+ * first order in alpha_QED. This is the default setting in Sherpa.
+ */
+
+ m_configs.push_back( "YFS_MODE=" + ATOOLS::ToString( m_mode ) );
+
+ /*
+ * The switch YFS_USE_ME = [0,1] tells Photons how to correct hard emissions to
+ * first order in alpha_QED. If YFS_USE_ME = 0, then Photons will use collinearly
+ * approximated real emission matrix elements. Virtual emission matrix elements of
+ * order alpha_QED are ignored. If, however, YFS_USE_ME=1, then exact real and/or
+ * virtual emission matrix elements are used wherever possible.
+ * These are presently available for V->FF, V->SS, S->FF, S->SS, S->Slnu,
+ * S->Vlnu type decays, Z->FF decays and leptonic tau and W decays. For all other
+ * decay types general collinearly approximated matrix elements are used.
+ * In both approaches all hadrons are treated as point-like objects.
+ * The default setting is YFS_USE_ME = 1. This switch is only effective if YFS_MODE = 2.
+ */
+ m_configs.push_back( "YFS_USE_ME=" + ATOOLS::ToString( m_useME ) );
+
+ // TODO: Virtual photon splitting into l+l- will be part of ME corrections from Sherpa 3.0.0 on,
+ // Once released, this should be switched off by default or
+ // taken into account while retrieving the event.
+
+ // Set up run-time arguments for Sherpa.
+ std::vector<char*> argv = this->addParameters();
+
+ // Create instance and initialise Sherpa.
+ m_sherpaGen = std::make_unique<SHERPA::Sherpa>();
+ m_sherpaGen->InitializeTheRun( argv.size(), &argv[0] );
+ m_sherpaGen->InitializeTheEventHandler();
+
+ m_gammaId = EvtPDL::getId( m_photonType );
+ m_gammaPDG = EvtPDL::getStdHep( m_gammaId );
+
+ this->updateParticleLists();
+
+ m_initialised = true;
+}
+
+std::vector<char*> EvtSherpaPhotons::addParameters()
+{
+ std::vector<char*> argv;
+ argv.reserve( m_configs.size() );
+
+ for ( auto& config : m_configs ) {
+ if ( config != "Sherpa" ) {
+ EvtGenReport( EVTGEN_INFO, "EvtGen" )
+ << " EvtSherpaPhotons::initialise: Setting parameter '"
+ << config << "'" << endl;
+ }
+ argv.push_back( config.data() );
+ }
+
+ return argv;
+}
+
+void EvtSherpaPhotons::updateParticleLists()
+{
+ /* Use the EvtGen decay and pdl tables (decay/user.dec and evt.pdl)
+ * to update Sherpa's KF_Table which contains all defined particles
+ * and their properties.
+ * Loop over all entries in the EvtPDL particle data table.
+ */
+ const int nPDL = EvtPDL::entries();
+
+ for ( int iPDL = 0; iPDL < nPDL; iPDL++ ) {
+ const EvtId particleId = EvtPDL::getEntry( iPDL );
+
+ // Sherpa and EvtGen should use the same PDG codes for particles
+ const int PDGCode = EvtPDL::getStdHep( particleId );
+ const long unsigned int particleCode = std::abs( PDGCode );
+
+ // If particle is found in Sherpa's KF_Table, then continue.
+ // Updating the pole mass is not necessary because we provide the 4-momenta
+ // and the final mass for final-state radiation generation.
+ ATOOLS::KFCode_ParticleInfo_Map::const_iterator kf_it(
+ ATOOLS::s_kftable.find( particleCode ) );
+ if ( kf_it != ATOOLS::s_kftable.end() ) {
+ continue;
+ }
+
+ // If the PDG is negative, use the charge conjugated ID because
+ // the KF_Table is defined only for positive PDG numbers.
+ const EvtId particleIdConj = EvtPDL::chargeConj( particleId );
+
+ // Get mass, width, charge and spin
+ const double mass = EvtPDL::getMeanMass( particleId );
+ const double width = EvtPDL::getWidth( particleId );
+ const int charge = PDGCode < 0 ? EvtPDL::chg3( particleIdConj )
+ : EvtPDL::chg3( particleId );
+ const int spin = EvtSpinType::getSpin2(
+ EvtPDL::getSpinType( particleId ) );
+
+ // Use as reference the name of the particle (not anti-particle).
+ const std::string idName = PDGCode < 0 ? particleIdConj.getName()
+ : particleId.getName();
+
+ // Create new entry in the KF_Table. The 0 and 1 in the constructor below
+ // stand for m_on = 0 and m_stable = 1. These properties are irrelevant
+ // for final-state radiation and set to default values.
+ ATOOLS::s_kftable[particleCode] = new ATOOLS::Particle_Info(
+ particleCode, mass, width, charge, spin, 0, 1, idName, idName );
+ }
+}
+
+void EvtSherpaPhotons::doRadCorr( EvtParticle* theParticle )
+{
+ if ( !theParticle ) {
+ return;
+ }
+
+ /* Skip running FSR if the particle has no daughters, since we can't add FSR.
+ * Also skip FSR if the particle has too many daughters (>= 10) as done for PHOTOS.
+ */
+ const int nDaughters( theParticle->getNDaug() );
+ if ( nDaughters == 0 || nDaughters >= 10 ) {
+ return;
+ }
+
+ ATOOLS::Blob_List* blobs = m_sherpaGen->GetEventHandler()->GetBlobs();
+
+ // Use the hadron decay flag always.
+ // Internally, Sherpa handles tau decays in the same way as hadron decays.
+ ATOOLS::Blob* blob = blobs->AddBlob( ATOOLS::btp::Hadron_Decay );
+
+ // Tell Sherpa that the blob needs FSR (that is extra QED)
+ blob->SetStatus( ATOOLS::blob_status::needs_extraQED );
+
+ // Create mother particle and add it to blob
+ ATOOLS::Flavour mother_flav( EvtPDL::getStdHep( theParticle->getId() ) );
+ mother_flav.SetStable( false );
+ const double motherM0 = theParticle->mass();
+ const ATOOLS::Vec4D mother_mom( motherM0, 0., 0., 0. );
+
+ // Add mother to blob with m_number=-1. The m_number will start from 0 for daughters.
+ ATOOLS::Particle* mother_part = new ATOOLS::Particle( -1, mother_flav,
+ mother_mom );
+ mother_part->SetFinalMass( motherM0 );
+ mother_part->SetStatus( ATOOLS::part_status::decayed );
+ // Set m_info="I" (initial) for mother. The m_info will be "F" (final) for daughters.
+ mother_part->SetInfo( 'I' );
+
+ blob->AddToInParticles( mother_part );
+
+ // Add daughters to the blob
+ for ( int iDaug = 0; iDaug < nDaughters; iDaug++ ) {
+ const EvtParticle* theDaughter = theParticle->getDaug( iDaug );
+ ATOOLS::Flavour daughter_flav( EvtPDL::getStdHep( theDaughter->getId() ) );
+ daughter_flav.SetStable( true );
+
+ const double daugE = theDaughter->getP4().get( 0 );
+ const double daugPx = theDaughter->getP4().get( 1 );
+ const double daugPy = theDaughter->getP4().get( 2 );
+ const double daugPz = theDaughter->getP4().get( 3 );
+ const double daugM0 = theDaughter->mass();
+
+ const ATOOLS::Vec4D daughter_mom( daugE, daugPx, daugPy, daugPz );
+
+ ATOOLS::Particle* daughter_part =
+ new ATOOLS::Particle( iDaug, daughter_flav, daughter_mom );
+ daughter_part->SetFinalMass( daugM0 );
+
+ daughter_part->SetStatus( ATOOLS::part_status::active );
+ daughter_part->SetInfo( 'F' );
+
+ blob->AddToOutParticles( daughter_part );
+ }
+
+ const SHERPA::Initialization_Handler* inithandler =
+ m_sherpaGen->GetInitHandler();
+ SHERPA::Soft_Photon_Handler* softphotonhandler =
+ inithandler->GetSoftPhotonHandler();
+
+ // Simulate the radiation
+ softphotonhandler->AddRadiation( blob );
+
+ // Get number of final-state particles
+ const int nFinal( blob->NOutP() );
+
+ // Retrieve the event from Sherpa blob if FSR photons were added
+ if ( nFinal > nDaughters ) {
+ for ( int iLoop = 0; iLoop < nFinal; iLoop++ ) {
+ const ATOOLS::Particle* outParticle = blob->OutParticle( iLoop );
+ const ATOOLS::Vec4D daughter_mom = outParticle->Momentum();
+ const long int pdgId = outParticle->Flav();
+ const EvtVector4R newP4( daughter_mom[0], daughter_mom[1],
+ daughter_mom[2], daughter_mom[3] );
+ const char daugInfo = outParticle->Info();
+
+ if ( iLoop < nDaughters ) {
+ // Update momenta of initial particles
+ EvtParticle* daugParticle = theParticle->getDaug( iLoop );
+ if ( daugParticle ) {
+ daugParticle->setP4WithFSR( newP4 );
+ }
+ } else if ( pdgId == m_gammaPDG && daugInfo == 'S' ) {
+ // Add FSR photons. PHOTONS flags them with info 'S'.
+ // Create a new photon particle and add it to the list of daughters
+ EvtPhotonParticle* gamma = new EvtPhotonParticle();
+ gamma->init( m_gammaId, newP4 );
+ gamma->setFSRP4toZero();
+ gamma->setAttribute( "FSR", 1 );
+ gamma->setAttribute( "ISR", 0 );
+ gamma->addDaug( theParticle );
+ }
+ }
+ }
+
+ return;
+}
+
+#endif
diff --git a/EvtGenExternal/EvtExternalGenList.hh b/src/EvtGenExternal/EvtSherpaRandom.cpp
copy from EvtGenExternal/EvtExternalGenList.hh
copy to src/EvtGenExternal/EvtSherpaRandom.cpp
--- a/EvtGenExternal/EvtExternalGenList.hh
+++ b/src/EvtGenExternal/EvtSherpaRandom.cpp
@@ -18,36 +18,8 @@
* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
***********************************************************************/
-#ifndef EVTEXTERNALGENLIST_HH
-#define EVTEXTERNALGENLIST_HH
+#ifdef EVTGEN_SHERPA
-#include "EvtGenBase/EvtAbsRadCorr.hh"
-#include "EvtGenBase/EvtDecayBase.hh"
-
-#include <list>
-
-// Description: A factory type method to create engines for external physics
-// generators like Pythia.
-
-class EvtExternalGenList {
- public:
- EvtExternalGenList( bool convertPythiaCodes = false,
- std::string pythiaXmlDir = "",
- std::string photonType = "gamma",
- bool useEvtGenRandom = true );
-
- virtual ~EvtExternalGenList();
-
- std::list<EvtDecayBase*> getListOfModels();
-
- EvtAbsRadCorr* getPhotosModel( const double infraredCutOff = 1.0e-7,
- const double maxWtInterference = 64.0 );
-
- protected:
- private:
- std::string m_photonType;
-
- bool m_useEvtGenRandom;
-};
+#include "EvtGenExternal/EvtSherpaRandom.hh"
#endif
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -34,7 +34,7 @@
if (EVTGEN_HEPMC3)
target_compile_definitions(${test_exe} PRIVATE EVTGEN_HEPMC3)
endif()
- if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA )
+ if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA OR EVTGEN_SHERPA )
target_compile_definitions(${test_exe} PRIVATE EVTGEN_EXTERNAL)
target_link_libraries(${test_exe} PRIVATE EvtGenExternal)
endif()
diff --git a/test/testDecayModel.cc b/test/testDecayModel.cc
--- a/test/testDecayModel.cc
+++ b/test/testDecayModel.cc
@@ -113,9 +113,7 @@
m_config.at( "models" ).get<std::vector<std::string>>() };
const auto modelParameters{
m_config.at( "parameters" ).get<std::vector<std::vector<std::string>>>() };
- const auto outFileName{ m_config.at( "outfile" ).get<std::string>() };
const auto nEvents{ m_config.at( "events" ).get<int>() };
- const auto refFileName{ m_config.at( "reference" ).get<std::string>() };
// Then check for optional fields, setting default values if not present
@@ -131,6 +129,31 @@
? m_config.at( "extras" ).get<std::vector<std::string>>()
: std::vector<std::string>{} };
+ // Set the FSR generator. Use PHOTOS by default.
+ const auto fsrGenerator{
+ ( m_config.contains( "fsr_generator" ) )
+ ? m_config.at( "fsr_generator" ).get<std::string>()
+ : "PHOTOS" };
+
+ // Set reference and output file names, insert fsrGenerator name if FSR simulation is not deactivated
+ const bool noFSR = std::find( extraCommands.begin(), extraCommands.end(),
+ "noFSR" ) != extraCommands.end();
+
+ const std::string fileNameEnd = noFSR ? ".root"
+ : "_" + fsrGenerator + ".root";
+
+ const auto outFileStrSize =
+ m_config.at( "outfile" ).get<std::string>().size() - 5;
+ const auto refFileStrSize =
+ m_config.at( "reference" ).get<std::string>().size() - 5;
+
+ const auto outFileName =
+ m_config.at( "outfile" ).get<std::string>().substr( 0, outFileStrSize ) +
+ fileNameEnd;
+ const auto refFileName =
+ m_config.at( "reference" ).get<std::string>().substr( 0, refFileStrSize ) +
+ fileNameEnd;
+
const auto debugFlag{ ( m_config.contains( "debug_flag" ) &&
m_config.at( "debug_flag" ).is_boolean() )
? m_config.at( "debug_flag" ).get<bool>()
@@ -159,7 +182,19 @@
bool convertPythiaCodes( false );
bool useEvtGenRandom( true );
EvtExternalGenList genList( convertPythiaCodes, "", "gamma", useEvtGenRandom );
- radCorrEngine = genList.getPhotosModel();
+ if ( fsrGenerator == "PHOTOS" ) {
+ radCorrEngine = genList.getPhotosModel();
+ } else if ( fsrGenerator == "SherpaPhotons1" ) {
+ radCorrEngine = genList.getSherpaPhotonsModel( 1e-7, 1, 0 );
+ } else if ( fsrGenerator == "SherpaPhotons20" ) {
+ radCorrEngine = genList.getSherpaPhotonsModel( 1e-7, 2, 0 );
+ } else if ( fsrGenerator == "SherpaPhotons21" ) {
+ radCorrEngine = genList.getSherpaPhotonsModel( 1e-7, 2, 1 );
+ } else {
+ std::cerr << "ERROR: The option fsr_generator = '" << fsrGenerator
+ << "' is not supported. " << std::endl;
+ return false;
+ }
extraModels = genList.getListOfModels();
#endif
@@ -811,12 +846,19 @@
value = p1.get( 3 );
} else if ( !selectedVarName.compare( "cosHel" ) ||
- !selectedVarName.compare( "absCosHel" ) ) {
+ !selectedVarName.compare( "absCosHel" ) ||
+ !selectedVarName.compare( "cosHelParent" ) ) {
// Cosine of helicity angle
EvtVector4R p12;
EvtVector4R p1Res;
- if ( d2 != 0 ) {
+ if ( !selectedVarName.compare( "cosHelParent" ) ) {
+ p12 = selectedParent->getP4Lab();
+ const EvtVector4R boost{ p12.get( 0 ), -p12.get( 1 ), -p12.get( 2 ),
+ -p12.get( 3 ) };
+ // Momentum of particle d1 in resonance frame, p1Res
+ p1Res = boostTo( p1_lab, boost );
+ } else if ( d2 != 0 ) {
// Resonance center-of-mass system (d1 and d2)
p12 = p1_lab + p2_lab;
// Boost vector
@@ -1387,8 +1429,10 @@
int main( int argc, char* argv[] )
{
- if ( argc != 2 ) {
- std::cerr << "Expecting one argument: json input file" << std::endl;
+ if ( argc != 2 && argc != 3 ) {
+ std::cerr << "Expecting at least one argument: json input file."
+ << "\nOne additional argument supported for fsrGenerator"
+ << std::endl;
return 1;
}
@@ -1398,6 +1442,10 @@
inputStr >> config;
inputStr.close();
+ if ( argc == 3 ) {
+ config["fsr_generator"] = argv[2];
+ }
+
bool allOK{ true };
if ( config.is_array() ) {
for ( const auto& cc : config ) {
diff --git a/validation/CMakeLists.txt b/validation/CMakeLists.txt
--- a/validation/CMakeLists.txt
+++ b/validation/CMakeLists.txt
@@ -33,7 +33,7 @@
if (EVTGEN_HEPMC3)
target_compile_definitions(${validation_exe} PRIVATE EVTGEN_HEPMC3)
endif()
- if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA )
+ if( EVTGEN_PYTHIA OR EVTGEN_PHOTOS OR EVTGEN_TAUOLA OR EVTGEN_SHERPA)
target_compile_definitions(${validation_exe} PRIVATE EVTGEN_EXTERNAL)
target_link_libraries(${validation_exe} PRIVATE EvtGenExternal)
endif()

File Metadata

Mime Type
text/plain
Expires
Mon, Nov 18, 8:31 PM (6 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3791413
Default Alt Text
D115.id496.diff (56 KB)

Event Timeline