Index: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt (revision 14)
+++ trunk/CMakeLists.txt (revision 15)
@@ -1,331 +1,349 @@
###########################################################################
#
# Copyright 2010
#
# This file is part of Starlight.
#
# Starlight 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.
#
# Starlight 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 Starlight. If not, see .
#
###########################################################################
#
# File and Version Information:
# $Rev:: 247 $: revision of last commit
# $Author:: butter $: author of last commit
# $Date:: 2016-03-05 00:59:24 +0000 #$: date of last commit
#
# Description:
# Starlight build file
#
#
###########################################################################
# check if cmake has the required version
cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
-
# set verbosity
set(CMAKE_VERBOSE_MAKEFILE 0) # if set to 1 compile and link commands are displayed during build
# the same effect can be achieved by calling 'make VERBOSE=1'
# The version number. 9999 indicates trunk
set (Starlight_VERSION_MAJOR 9999)
set (Starlight_VERSION_MINOR 1)
set (Starlight_VERSION_MINOR_MINOR 0)
# define project
project(starlight)
#find_package (Threads)
# load some common cmake macros
# set path, where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules")
message(STATUS "Using cmake module path '${CMAKE_MODULE_PATH}'")
include(CommonMacros)
# force out-of-source builds.
enforce_out_of_source_build()
# warn user if system is not UNIX
if(NOT UNIX)
message(FATAL_ERROR "This is an unsupported system.")
endif()
message(STATUS "Detected host system '${CMAKE_HOST_SYSTEM_NAME}' version '${CMAKE_HOST_SYSTEM_VERSION}' architecture '${CMAKE_HOST_SYSTEM_PROCESSOR}'")
message(STATUS "Compiling for system '${CMAKE_SYSTEM_NAME}' version '${CMAKE_SYSTEM_VERSION}' architecture '${CMAKE_SYSTEM_PROCESSOR}'")
-option (CPP11 "Enable compilation with C++11 features" OFF)
+option (CPP11 "Enable compilation with C++11 features" ON)
# define build types
# set a default build type for single-configuration CMake generators, if no build type is set.
set(CMAKE_BUILD_TYPE Debug)
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type was specified. Setting build type to 'Release'.")
set(CMAKE_BUILD_TYPE Release)
endif()
# common compiler flags
if (CMAKE_COMPILER_IS_GNUCC)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
message(STATUS "GCC_VERSTION")
message(STATUS ${GCC_VERSION})
if (GCC_VERSION VERSION_GREATER 4.6 OR GCC_VERSION VERSION_EQUAL 4.6)
message(STATUS "GCC_VERSION>=4.6")
if(CPP11)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Werror -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter -std=c++11")
message(STATUS "Enabling usage of C++11 features")
else()
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Werror -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter")
endif()
else()
message(STATUS "GCC_VERSION<4.6")
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Werror -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter")
if(CPP11)
message(WARNING "C++11 feautures not supported for your compiler")
endif()
endif()
else()
message(STATUS "Not GCC")
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Werror")
if(CPP11)
message(WARNING "C++11 feautures not supported for your compiler")
endif()
endif()
# flags for specific build types
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_LDFLAGS_DEBUG "-g")
# report global build settings
message(STATUS "Using CXX compiler '${CMAKE_CXX_COMPILER}'")
message(STATUS "Using CXX general compiler flags '${CMAKE_CXX_FLAGS}'")
foreach(_BUILD_TYPE "DEBUG" "MINSIZEREL" "RELEASE" "RELWITHDEBINFO")
message(STATUS "Using CXX compiler flags '${CMAKE_CXX_FLAGS_${_BUILD_TYPE}}' for build type ${_BUILD_TYPE}")
endforeach()
message(STATUS "Build type is '${CMAKE_BUILD_TYPE}'")
# redirect output files
#set(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib")
message(STATUS "Using library output path '${LIBRARY_OUTPUT_PATH}'")
#set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
message(STATUS "Using executable output path '${EXECUTABLE_OUTPUT_PATH}'")
# make CMAKE_SOURCE_DIR accessible in source code via predefined macro CMAKE_SOURCE_DIR
if(CMAKE_SOURCE_DIR)
add_definitions(-D'CMAKE_SOURCE_DIR=\"${CMAKE_SOURCE_DIR}\"')
else()
add_definitions(-D'CMAKE_SOURCE_DIR=\"\"')
endif()
# make SVN version string accessible in source code via predefined macro SVN_VERSION
find_package(Subversion)
if(Subversion_FOUND)
# unfortunately CMAKE only parses 'svn info'
find_program(SVNVERSION_EXECUTABLE
svnversion
)
if(NOT SVNVERSION_EXECUTABLE)
message(STATUS "Could not find subversion command 'svnversion'. Repository version unknown.")
else()
execute_process(
COMMAND ${SVNVERSION_EXECUTABLE} "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE SVN_VERSION
RESULT_VARIABLE _SVNVERSION_RETURN
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT ${_SVNVERSION_RETURN})
message(STATUS "Subversion repository revision is '${SVN_VERSION}'")
else()
message(STATUS "Error running 'svnversion'. Repository version unknown.")
set(SVN_VERSION "")
endif()
endif()
else()
message(STATUS "Could not find subversion installation. Repository version unknown.")
endif()
if(SVN_VERSION)
add_definitions(-D'SVN_VERSION=\"${SVN_VERSION}\"')
else()
add_definitions(-D'SVN_VERSION=\"\"')
endif()
# setup doxygen
find_package(Doxygen)
if(NOT DOXYGEN_FOUND)
message(WARNING "Cannot find Doxygen. No HTML documentation will be generated.")
else()
set(DOXYGEN_TARGET "doxygen")
set(DOXYGEN_DOC_DIR "${CMAKE_SOURCE_DIR}/doxygen")
set(DOXYGEN_CONF "${CMAKE_SOURCE_DIR}/starlightDoxyfile.conf")
message(STATUS "Run 'make ${DOXYGEN_TARGET}' to create Doxygen documentation files in '${DOXYGEN_DOC_DIR}'")
add_custom_target(${DOXYGEN_TARGET}
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CONF}
DEPENDS ${DOXYGEN_CONF}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
endif()
+option (ENABLE_HEPMC3 "Enable compilation against hepmc3 (necessary for hepmc3 output)" OFF)
+if(ENABLE_HEPMC3)
+ find_package(HepMC3)
+ if(HEPMC3_FOUND)
+ set(optionalLibs ${optionalLibs} ${HEPMC3_LIBRARY})
+ option(ENABLE_HEPMC3 "Should we use the HepMC3 library" ON)
+ else()
+ option(ENABLE_HEPMC3 "Should we use the HepMC3 library" OFF)
+ endif()
+endif()
# setup Pythia 8
option (ENABLE_PYTHIA "Enable compilation against pythia (necessary for certain processes)" OFF)
if(ENABLE_PYTHIA)
find_package(Pythia8)
if(PYTHIA8_FOUND)
set(optionalLibs ${optionalLibs} ${PYTHIA8_LIBRARY})
# find_package(LHAPDF REQUIRED) # implemented for dummy version in Pythia8
# set(optionalLibs ${optionalLibs} ${LHAPDF_LIBRARIES})#liblhapdfdummy
# removed from v8.2, if you want to add your own lhapdf set, uncomment
# find_package + set - jb 05192015
option(ENABLE_PYTHIA "Should we use the Pythia8 library" ON)
else()
option(ENABLE_PYTHIA "Should we use the Pythia8 library" OFF)
endif()
endif()
# setup Pythia 6
option (ENABLE_PYTHIA6 "Enable compilation against pythia 6 (necessary for certain processes)" OFF)
if(ENABLE_PYTHIA6)
find_package(Pythia6 REQUIRED)
if(PYTHIA6_FOUND)
set(optionalLibs ${optionalLibs} ${PYTHIA6_LIBRARY})
option (ENABLE_PYTHIA6 "Enable compilation against pythia 6 (necessary for certain processes)" ON)
include_directories(pythia6)
else(PYTHIA6_FOUND)
option (ENABLE_PYTHIA6 "Enable compilation against pythia 6 (necessary for certain processes)" OFF)
endif(PYTHIA6_FOUND)
endif()
# setup DPMJET
option (ENABLE_DPMJET "Enable compilation against DPMJet" OFF)
if(ENABLE_DPMJET)
find_package(DPMJet REQUIRED)
if(DPMJET_FOUND)
option (ENABLE_DPMJET "Enable compilation against DPMJet" ON)
else(DPMJET_FOUND)
option (ENABLE_DPMJET "Enable compilation against DPMJet" OFF)
endif(DPMJET_FOUND)
endif(ENABLE_DPMJET)
# set include directories
set(INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/include
${PROJECT_BINARY_DIR}
${PYTHIA8_INCLUDE_DIR}#uncommented 05192015
)
include_directories(${INCLUDE_DIRECTORIES})
# Set our source files, include the generated dictionary
set(SOURCES
src/bessel.cpp
src/beam.cpp
src/inputParameters.cpp
src/beambeamsystem.cpp
src/starlightparticle.cpp
src/gammaaluminosity.cpp
src/randomgenerator.cpp
src/nucleus.cpp
src/eventchannel.cpp
src/gammaavm.cpp
src/gammagammasingle.cpp
src/photonNucleusCrossSection.cpp
src/wideResonanceCrossSection.cpp
src/narrowResonanceCrossSection.cpp
src/readinluminosity.cpp
src/twophotonluminosity.cpp
src/gammagammaleptonpair.cpp
src/upcevent.cpp
src/vector3.cpp
src/lorentzvector.cpp
src/filewriter.cpp
src/eventfilewriter.cpp
src/starlightparticlecodes.cpp
src/nBodyPhaseSpaceGen.cpp
src/inputParser.cpp
src/incoherentPhotonNucleusLuminosity.cpp
src/incoherentVMCrossSection.cpp
# eSTARlight
src/eXevent.cpp
src/gammaeluminosity.cpp
src/e_wideResonanceCrossSection.cpp
src/e_narrowResonanceCrossSection.cpp
src/e_starlight.cpp
src/e_starlightStandalone.cpp
)
+
+if (ENABLE_HEPMC3)
+ set (SOURCES
+ ${SOURCES}
+ src/hepmc3writer.cpp
+ )
+ include_directories(${HEPMC3_INCLUDE_DIR})
+ add_definitions( -DHEPMC3_ON )
+endif()
if(ENABLE_PYTHIA)
set (SOURCES
${SOURCES}
#src/PythiaStarlight.cpp
src/pythiadecayer.cpp
)
include_directories(${PYTHIA8_INCLUDE_DIR})
endif()
if(ENABLE_PYTHIA6)
set (SOURCES
${SOURCES}
src/starlightpythia.cpp
src/spectrum.cpp
src/spectrumprotonnucleus.cpp
)
endif()
if(ENABLE_DPMJET)
set (SOURCES
${SOURCES}
src/starlightdpmjet.cpp
src/spectrum.cpp
src/spectrumprotonnucleus.cpp
)
endif()
# add Starlight library to the build system
set(THIS_LIB "Starlib")
add_library(${THIS_LIB} STATIC ${SOURCES})
#make_shared_library("${THIS_LIB}" "${SOURCES}"
# "${PYTHIA8_LIBRARY}"
# "${LHAPDF_LIBRARIES}"
#)
if(ENABLE_DPMJET)
enable_language(Fortran)
set(DPMJET_LIB "DpmJetLib")
message(STATUS "DPMJet objects: ${DPMJET_OBJECTS}")
add_library(${DPMJET_LIB} STATIC dpmjet/dpmjetint.f ${DPMJET_OBJECTS})
set(optionalLibs ${optionalLibs} ${DPMJET_LIB})
set(optionalLibs ${optionalLibs} "gfortran")
endif()
if(ENABLE_PYTHIA6)
enable_language(Fortran)
endif()
# add starlight executable to the build system
add_executable(e_starlight src/e_main.cpp)
target_link_libraries(e_starlight Starlib ${optionalLibs})# ${CMAKE_THREAD_LIBS_INIT})
configure_file (
"${PROJECT_SOURCE_DIR}/starlightconfig.h.in"
"${PROJECT_BINARY_DIR}/starlightconfig.h"
)
# Erase xsec values in case changes in code affects the xsec, executed during make process
add_custom_command (TARGET Starlib POST_BUILD COMMAND touch ARGS slight.txt)
add_custom_command (TARGET Starlib POST_BUILD COMMAND cp ARGS slight.txt slight.txt.bak)
add_custom_command (TARGET Starlib POST_BUILD COMMAND echo ARGS '' > slight.txt )
message(STATUS "Cmake did not find any errors. run 'make' to build the project.")
message(STATUS "On multi-core machines 'make -j#', where # is the number of parallel jobs, can speedup compilation considerably.")
Index: trunk/include/eventfilewriter.h
===================================================================
--- trunk/include/eventfilewriter.h (revision 14)
+++ trunk/include/eventfilewriter.h (revision 15)
@@ -1,72 +1,86 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 97 $: revision of last commit
// $Author:: odjuvsla $: author of last commit
// $Date:: 2012-10-22 22:25:35 +0100 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef EVENTFILEWRITER_H
#define EVENTFILEWRITER_H
+#ifdef HEPMC3_ON
+class hepMC3Writer;
+#endif
#include
#include "filewriter.h"
#include "inputParameters.h"
class eventFileWriter : public fileWriter
{
public:
/** Default constructor */
eventFileWriter();
/** Constructor with name */
eventFileWriter(std::string filename);
/** Write out simulation set up */
int writeInit(inputParameters ¶m );
/** Write an UPC event to file */
int writeEvent(upcEvent &event, int eventnumber);
/** Write an eX event to file */
int writeEvent(eXEvent &event, int eventnumber);
/** Set if we want to write full pythia information */
void writeFullPythiaInfo(bool v) { _writeFullPythia = v; }
+
+ /** Set if we want to write full pythia information */
+ void writeFullHepMC3Info(bool v) { _writeFullHepMC3 = v; }
+
+ /** close the file */
+ int close();
private:
bool _writeFullPythia;
-
+ bool _writeFullHepMC3;
+
+#ifdef HEPMC3_ON
+ hepMC3Writer * _hepmc3writer;
+#endif
+
};
#endif // EVENTFILEWRITER_H
Index: trunk/include/inputParameters.h
===================================================================
--- trunk/include/inputParameters.h (revision 14)
+++ trunk/include/inputParameters.h (revision 15)
@@ -1,405 +1,408 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 276 $: revision of last commit
// $Author:: jnystrand $: author of last commit
// $Date:: 2016-09-13 19:54:42 +0100 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef INPUTPARAMETERS_H
#define INPUTPARAMETERS_H
#include "starlightconstants.h"
#include "inputParser.h"
#include
#include
#include
#include
class parameterbase;
class parameterlist
{
public:
parameterlist() : _parameters(0) {}
void add(parameterbase* p) {
_parameters.push_back(p);
}
// Returns a string with a key of the current state of the parameter list
// only
inline std::string validationKey();
private:
std::vector _parameters;
};
// Base class for parameters, needed to keep a list of parameters
class parameterbase
{
public:
// Add this to parameter list
parameterbase()
{
_parameters.add(this);
}
virtual std::string validationkey() = 0;
template
std::string toString(T v)
{
std::stringstream s;
s << v;
return s.str();
}
inline friend std::ostream& operator<<(std::ostream& os, const parameterbase& par);
// List of all parameters
static parameterlist _parameters;
};
// Need to init the static variable
// parameterlist parameterbase::_parameters;
// The actual parameter class
// validate parameter specifies if the parameter should be a part of the validity check of the current parameters
template
class parameter : public parameterbase
{
public:
// Constructor
parameter(const std::string &name, T value, bool required = true) :parameterbase(),_name(name), _value(value), _validate(validate), _required(required) {}
parameter &operator=(T v) { _value = v; return *this;}
T* ptr() const {
return const_cast(&_value);
}
T value() const { return _value; }
std::string name() const { return _name;}
bool required() const { return _required; }
void setValue(T v) { _value = v; }
void setName(std::string name) { _name = name; }
void setRequired(bool r) { _required = r; }
// Validation key for this parameter
std::string validationkey()
{
return (_validate ? _name + ":" + toString(_value) + "-" : std::string(""));
}
template
inline friend std::ostream& operator<<(std::ostream& os, const parameter& par);
private:
std::string _name;
T _value; // Value
bool _validate; // true if a change in the parameter invalidates x-sec tables
bool _required; // true if this is required option.
parameter();
};
template
inline std::ostream& operator<<(std::ostream& os, const parameter& par)
{
os << par._value;
return os;
}
std::ostream& operator<<(std::ostream& os, const parameterbase& par)
{
os << par._parameters.validationKey();
return os;
}
std::string parameterlist::validationKey()
{
std::stringstream s;
for(unsigned int i = 0; i < _parameters.size(); ++i)
{
s << _parameters[i]->validationkey(); // Will print names and values of validation parameters
}
return s.str();
}
class inputParameters {
public:
inputParameters();
~inputParameters();
bool init();
bool configureFromFile(const std::string &configFileName = "./config/slight.in");
std::string baseFileName () const { return _baseFileName.value(); }
int beam1Z () const { return _beam1Z.value(); } ///< returns atomic number of beam particle 1
unsigned int beam1A () const { return _beam1A.value(); } ///< returns atomic mass number of beam particle 1
int beam2Z () const { return _beam2Z.value(); } ///< returns atomic number of beam particle 2
unsigned int beam2A () const { return _beam2A.value(); } ///< returns atomic mass number of beam particle 2
double targetLorentzGamma () const { return _targetLorentzGamma; } ///< returns Lorentz gamma factor of source in target frame
double beamLorentzGamma () const { return _beamLorentzGamma; } ///< returns Lorentz gamma factor of both beams in beam CMS frame
double beam1LorentzGamma () const { return _beam1LorentzGamma.value(); } ///< returns Lorentz gamma factor of beam 1 in collider frame
double beam2LorentzGamma () const { return _beam2LorentzGamma.value(); } ///< returns Lorentz gamma factor of beam 2 in collider frame
double targetMaxPhotonEnergy () const { return _targetMaxPhotonEnergy; } ///< returns maximum photon energy
double cmsMaxPhotonEnergy () const { return _cmsMaxPhotonEnergy; } ///< returns maximum photon energy
double targetMinPhotonEnergy () const { return _targetMinPhotonEnergy; } ///< returns maximum photon energy
double cmsMinPhotonEnergy () const { return _cmsMinPhotonEnergy; } ///< returns maximum photon energy
double maxW () const { return _maxW.value(); } ///< returns maximum mass W of produced hadronic system [GeV/c^2]
double minW () const { return _minW.value(); } ///< returns minimum mass W of produced hadronic system [GeV/c^2]
unsigned int nmbWBins () const { return _nmbWBins.value(); } ///< returns number of W bins in lookup table
double maxRapidity () const { return _maxRapidity.value(); } ///< returns maximum absolute value of rapidity
unsigned int nmbRapidityBins () const { return _nmbRapidityBins.value(); } ///< returns number of rapidity bins in lookup table
unsigned int nmbEnergyBins () const { return _nmbEnergyBins.value(); } ///< return the number of Egamma bins for eSTARlight lookup
bool ptCutEnabled () const { return _ptCutEnabled.value(); } ///< returns cut in pt
double ptCutMin () const { return _ptCutMin.value(); } ///< returns minimum pt
double ptCutMax () const { return _ptCutMax.value(); } ///< returns maximum pt
bool etaCutEnabled () const { return _etaCutEnabled.value(); } ///< returns cut in eta
double etaCutMin () const { return _etaCutMin.value(); } ///< returns minimum eta
double etaCutMax () const { return _etaCutMax.value(); } ///< returns maximum eta
int productionMode () const { return _productionMode.value(); } ///< returns production mode
unsigned int nmbEvents () const { return _nmbEventsTot.value(); } ///< returns total number of events to generate
int prodParticleId () const { return _prodParticleId.value(); } ///< returns PDG particle ID of produced particle
int randomSeed () const { return _randomSeed.value(); } ///< returns seed for random number generator
int beamBreakupMode () const { return _beamBreakupMode.value(); } ///< returns breakup mode for beam particles
bool interferenceEnabled () const { return _interferenceEnabled.value(); } ///< returns whether interference is taken into account
double interferenceStrength () const { return _interferenceStrength.value(); } ///< returns percentage of interference
double maxPtInterference () const { return _maxPtInterference.value(); } ///< returns maximum p_T for interference calculation [GeV/c]
int nmbPtBinsInterference () const { return _nmbPtBinsInterference.value(); } ///< returns number of p_T bins for interference calculation
double ptBinWidthInterference() const { return _ptBinWidthInterference.value(); } ///< returns width of p_T bins for interference calculation [GeV/c]
double minGammaEnergy () const { return _minGammaEnergy.value(); } ///< returns minimum gamma energy in case of photo nuclear processes [GeV]
double maxGammaEnergy () const { return _maxGammaEnergy.value(); } ///< returns maximum gamma energy in case of photo nuclear processes [GeV]
double minGammaQ2 () const { return _minGammaQ2.value(); } ///< return minimum gamma virtuality
double maxGammaQ2 () const { return _maxGammaQ2.value(); } ///< return maximum gamma virtuality
bool fixedQ2Range () const { return _fixedQ2Range; } ///< return state of Q2 range
unsigned int nmbGammaQ2Bins () const { return _nmbGammaQ2Bins.value(); } ///< return number of gamma q2 bins
std::string pythiaParams () const { return _pythiaParams.value(); } ///< returns parameters to be passed to pythia
bool pythiaFullEventRecord () const { return _pythiaFullEventRecord.value(); } ///< returns if the full pythia event record should be printed
+ bool hepmc3FullEventRecord () const { return _hepmc3FullEventRecord.value(); } ///< returns if the full hepmc3 event record should be printed
int xsecCalcMethod () const { return _xsecCalcMethod.value(); } ///< returns the method used for the x-sec calculation
double axionMass () const { return _axionMass.value(); } ///< returns axion mass //AXION HACK
int bslopeDefinition () const { return _bslopeDefinition.value(); } ///< returns the definition of b-slope
double bslopeValue () const { return _bslopeValue.value(); } ///< returns the value of b-slope
int impulseVM () const { return _impulseVM.value(); } ///< returns the impulseVM value
int quantumGlauber () const { return _quantumGlauber.value(); } ///< returns the quantum glauber value
starlightConstants::particleTypeEnum prodParticleType () const { return _particleType; } ///< returns type of produced particle
starlightConstants::decayTypeEnum prodParticleDecayType() const { return _decayType; } ///< returns decay type of produced particle
starlightConstants::interactionTypeEnum interactionType () const { return _interactionType; } ///< returns interaction type
double protonEnergy () const { return _protonEnergy.value(); }
double electronEnergy () const { return _electronEnergy.value(); }
double inputBranchingRatio () const { return _inputBranchingRatio; }
double targetRadius () const { return _targetR; }
void setBaseFileName (std::string v ) { _baseFileName = v; }
void setBeam1Z (unsigned int v) { _beam1Z = v; } ///< sets atomic number of beam particle 1
void setBeam1A (unsigned int v) { _beam1A = v; } ///< sets atomic mass number of beam particle 1
void setBeam2Z (unsigned int v) { _beam2Z = v; } ///< sets atomic number of beam particle 2
void setBeam2A (unsigned int v) { _beam2A = v; } ///< sets atomic mass number of beam particle 2
void setTargetLorentzGamma (double v) { _targetLorentzGamma = v; } ///< sets Lorentz gamma factor of both beams in beam CMS frame
void setBeamLorentzGamma (double v) { _beamLorentzGamma = v; } ///< sets Lorentz gamma factor of both beams in beam CMS frame
void setBeam1LorentzGamma (double v) { _beam1LorentzGamma = v; } ///< sets Lorentz gamma factor of beam 1 in collider frame
void setBeam2LorentzGamma (double v) { _beam2LorentzGamma = v; } ///< sets Lorentz gamma factor of beam 2 in collider frame
//void setMaxPhotonEnergy (double v) { _maxPhotonEnergy = v ; } ///< sets maximim photon energy
void setMaxW (double v) { _maxW = v; } ///< sets maximum mass W of produced hadronic system [GeV/c^2]
void setMinW (double v) { _minW = v; } ///< sets minimum mass W of produced hadronic system [GeV/c^2]
void setNmbWBins (unsigned int v) { _nmbWBins = v; } ///< sets number of W bins in lookup table
void setMaxRapidity (double v) { _maxRapidity = v; } ///< sets maximum absolute value of rapidity
void setNmbRapidityBins (unsigned int v) { _nmbRapidityBins = v; } ///< sets number of rapidity bins in lookup table
void setNmbEgaBins (unsigned int v) { _nmbEnergyBins = v; } ///< sets number of Ega bins for eSTARlight
void setPtCutEnabled (bool v) { _ptCutEnabled = v; } ///< sets cut in pt
void setPtCutMin (double v) { _ptCutMin = v; } ///< sets minimum pt
void setPtCutMax (double v) { _ptCutMax = v; } ///< sets maximum pt
void setEtaCutEnabled (bool v) { _etaCutEnabled = v; } ///< sets cut in eta
void setEtaCutMin (double v) { _etaCutMin = v; } ///< sets minimum eta
void setEtaCutMax (double v) { _etaCutMax = v; } ///< sets maximum eta
void setProductionMode (int v) { _productionMode = v; } ///< sets production mode
void setNmbEvents (unsigned int v) { _nmbEventsTot = v; } ///< sets total number of events to generate
void setProdParticleId (int v) { _prodParticleId = v; } ///< sets PDG particle ID of produced particle
void setRandomSeed (int v) { _randomSeed = v; } ///< sets seed for random number generator
void setBeamBreakupMode (int v) { _beamBreakupMode = v; } ///< sets breakup mode for beam particles
void setInterferenceEnabled (bool v) { _interferenceEnabled = v; } ///< sets whether interference is taken into account
void setInterferenceStrength (double v) { _interferenceStrength = v; } ///< sets percentage of interference
void setMaxPtInterference (double v) { _maxPtInterference = v; } ///< sets maximum p_T for voiderference calculation [GeV/c]
void setNmbPtBinsInterference (int v) { _nmbPtBinsInterference = v; } ///< sets number of p_T bins for interference calculation
void setPtBinWidthInterference(double v) { _ptBinWidthInterference = v; } ///< sets width of p_T bins for voiderference calculation [GeV/c]
void setMinGammaEnergy (double v) { _minGammaEnergy = v; } ///< sets minimum gamma energy in case of photo nuclear processes [GeV]
void setMaxGammaEnergy (double v) { _maxGammaEnergy = v; } ///< sets maximum gamma energy in case of photo nuclear processes [GeV]
void setMinGammaQ2 (double v) { _minGammaQ2 = v; } ///< sets minimum gamma virtuality in case of photo nuclear processes [GeV]
void setMaxGammaQ2 (double v) { _maxGammaQ2 = v; } ///< sets maximum gamma virtuality in case of photo nuclear processes [GeV]
void setPythiaParams (std::string v) { _pythiaParams = v; } ///< sets parameters to be passed to pythia
void setPythiaFullEventRecord (bool v) { _pythiaFullEventRecord = v; } ///< sets if the full pythia event record should be prvoided
+ void setHepMC3FullEventRecord (bool v) { _hepmc3FullEventRecord = v; } ///< sets if the full hepmc3 event record should be prvoided
void setXsecCalcMethod (int v) { _xsecCalcMethod = v; } ///< sets the method used for the x-sec calculation
void setAxionMass (double v) { _axionMass = v; } ///< sets axion mass //AXION HACK
void setbslopeDefinition (int v) { _bslopeDefinition = v; } ///< sets the definition of b slope
void setbslopeValue (double v) { _bslopeValue = v; } ///< sets the value of b slope
void setimpulseVM (int v) { _impulseVM = v; } ///< sets the value of _impulseVM
void setquantumGlauber (int v) { _quantumGlauber = v; } ///< sets the value of quantum_glauber
void setProdParticleType (starlightConstants::particleTypeEnum v) { _particleType = v; } ///< sets type of produced particle
void setProdParticleDecayType (starlightConstants::decayTypeEnum v) { _decayType = v; } ///< sets decay type of produced particle
void setInteractionType (starlightConstants::interactionTypeEnum v) { _interactionType = v; } ///< sets interaction type
void setProtonEnergy (double v) { _protonEnergy = v; } ///< sets proton energy
void setElectronEnergy (double v) { _electronEnergy = v; } ///< sets electron energy
template
inline bool setParameter(std::string expression);
std::ostream& print(std::ostream& out) const; ///< prints parameter summary
std::ostream& write(std::ostream& out) const; ///< writes parameters back to an ostream
std::string parameterValueKey() const; ///< Generates key for the current parameters
private:
// To indicate if the crossection table should be re-calculated if parameter changes
#define VALIDITY_CHECK true
#define NO_VALIDITY_CHECK false
std::string _configFileName; ///< path to configuration file (default = ./config/slight.in)
// config file parameters
parameter _baseFileName;
parameter _beam1Z; ///< atomic number of beam particle 1
parameter _beam1A; ///< atomic mass number of beam particle 1
parameter _beam2Z; ///< atomic number of beam particle 2
parameter _beam2A; ///< atomic mass number of beam particle 2
parameter _beam1LorentzGamma; ///< Lorentz gamma factor of beam 1 in collider frame
parameter _beam2LorentzGamma; ///< Lorentz gamma factor of beam 2 in collider frame
parameter _maxW; ///< maximum mass W of produced hadronic system [GeV/c^2]
parameter _minW; ///< minimum mass W of produced hadronic system; if set to -1 default value is taken [GeV/c^2]
parameter _nmbWBins; ///< number of W bins in lookup table
parameter _maxRapidity; ///< maximum absolute value of rapidity
parameter _nmbRapidityBins; ///< number of rapidity bins in lookup table
parameter _nmbEnergyBins; ///< number of Egamma bins in lookup table
parameter _ptCutEnabled; ///< en/disables cut in pt
parameter _ptCutMin; ///< minimum pt, if cut is enabled
parameter _ptCutMax; ///< maximum pt, if cut is enabled
parameter _etaCutEnabled; ///< en/disables cut in eta
parameter _etaCutMin; ///< minimum eta, if cut is enabled
parameter _etaCutMax; ///< maximum eta, if cut is enabled
parameter _productionMode; ///< \brief production mode
///<
///< 1 = photon-photon fusion,
///< 2 = narrow vector meson resonance in photon-Pomeron fusion,
///< 3 = Breit-Wigner vector meson resonance in photon-Pomeron fusion
parameter _nmbEventsTot; ///< total number of events to generate
parameter _prodParticleId; ///< PDG particle ID of produced particle
parameter _randomSeed; ///< seed for random number generator
///<
///< 1 = ASCII
///< 2 = GSTARtext,
///< 3 = PAW ntuple (not working)
parameter _beamBreakupMode; ///< \brief breakup mode for beam particles
///<
///< 1 = hard sphere nuclei (b > 2R),
///< 2 = both nuclei break up (XnXn),
///< 3 = a single neutron from each nucleus (1n1n),
///< 4 = neither nucleon breaks up (with b > 2R),
///< 5 = no hadronic break up (similar to option 1, but with the actual hadronic interaction)
parameter _interferenceEnabled; ///< if VALIDITY_CHECK, interference is taken into account
parameter _interferenceStrength; ///< percentage of interference: from 0 = none to 1 = full
parameter _maxPtInterference; ///< maximum p_T for interference calculation [GeV/c]
parameter _nmbPtBinsInterference; ///< number of p_T bins for interference calculation
parameter _ptBinWidthInterference; ///< width of p_T bins for interference calculation [GeV/c]
parameter _protonEnergy;
parameter _electronEnergy;
parameter _minGammaEnergy; ///< minimum gamma energy in case of photo nuclear processes [GeV]
parameter _maxGammaEnergy; ///< maximum gamma energy in case of photo nuclear processes [GeV]
parameter _minGammaQ2; ///< minimum gamma Q2 in case of photo nuclear processes
parameter _maxGammaQ2; ///< maximum gamma Q2 in case of photo nuclear processes
parameter _nmbGammaQ2Bins; ///< number of gamma q2 bins
parameter _pythiaParams; ///< semi-colon separated parameters to pass to pythia, e.g. "mstj(1)=0;paru(13)=0.1"
parameter _pythiaFullEventRecord; ///< if the full pythia event record should be in the output
+ parameter _hepmc3FullEventRecord; ///< if the full hepmc3 event record should be in the output
parameter _xsecCalcMethod; ///< Select x-sec calc method. (0 is standard starlight method, 1 must be used for assym. collisions (e.g. p-A), but is slow)
parameter _axionMass; ///Axion mass//AXION HACK
parameter _bslopeDefinition; ///< Optional parameter to set different values of slope parameter
parameter _bslopeValue; ///< Value of slope parameter when _bslopeDefinition is set to 1
parameter _impulseVM; ///< Optional parameter to use impulse approximation (no nuclear effects) for VM cross section.
parameter _quantumGlauber; ///< Optional parameter. Set = 1 to use Quantum Glauber calculation, rather than Classical Glauber
starlightConstants::particleTypeEnum _particleType;
starlightConstants::decayTypeEnum _decayType;
starlightConstants::interactionTypeEnum _interactionType;
double _targetLorentzGamma; ///< Lorentz gamma factor of the source in target frame, not an input parameter
double _beamLorentzGamma; ///< Lorentz gamma factor of the beams in CMS frame, not an input parameter
double _targetR;
double _cmsMaxPhotonEnergy;
double _cmsMinPhotonEnergy;
double _targetMaxPhotonEnergy;
double _targetMinPhotonEnergy;
double _inputBranchingRatio; ///< Branching ratio defined for each channel
bool _fixedQ2Range;
inputParser _ip;
};
template
inline
bool inputParameters::setParameter(std::string expression)
{
return _ip.parseString(expression);
}
inline
std::ostream&
operator <<(std::ostream& out,
const inputParameters& par)
{
return par.print(out);
}
#endif // INPUTPARAMETERS_H
Index: trunk/include/filewriter.h
===================================================================
--- trunk/include/filewriter.h (revision 14)
+++ trunk/include/filewriter.h (revision 15)
@@ -1,78 +1,78 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 28 $: revision of last commit
// $Author:: bgrube $: author of last commit
// $Date:: 2010-12-10 18:30:01 +0000 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef FILEWRITER_H
#define FILEWRITER_H
#include
#include
#include "upcevent.h"
#include "eXevent.h"
class fileWriter
{
public:
/** Default constructor */
fileWriter();
/** Constructor with filename */
fileWriter(const std::string& fileName);
/** Destructor */
virtual ~fileWriter();
/** open the file */
int open();
/** open file with given filename */
int open(const std::string& fileName);
/** close the file */
- int close();
+ virtual int close();
/** Set the filename we're writing to */
void setFileName(const std::string& fileName) { _fileName = fileName; }
protected:
/** The file name */
std::string _fileName;
/** The file stream */
std::ofstream _fileStream;
};
#endif // FILEWRITER_H
Index: trunk/include/hepmc3writer.h
===================================================================
--- trunk/include/hepmc3writer.h (revision 0)
+++ trunk/include/hepmc3writer.h (revision 15)
@@ -0,0 +1,34 @@
+
+#ifndef HEPMC3WRITER_H
+#define HEPMC3WRITER_H
+
+#include "inputParameters.h"
+#include "eXevent.h"
+#include "HepMC3/WriterAscii.h"
+
+using HepMC3::WriterAscii;
+
+class hepMC3Writer
+{
+
+ public:
+ /** Default Constructor **/
+ hepMC3Writer();
+ ~hepMC3Writer();
+
+ /** Init HepMC3 Writer with input parameters **/
+ int initWriter(const inputParameters & param);
+
+ /** Write an eX event to file **/
+ int writeEvent(const eXEvent &event, int eventnumber);
+
+ /* closes file */
+ void close(){ _hepmc3_output->close(); };
+
+ private:
+
+ WriterAscii * _hepmc3_output;
+
+};
+
+#endif // HEPMC3WRITER_H
Index: trunk/include/e_starlightStandalone.h
===================================================================
--- trunk/include/e_starlightStandalone.h (revision 14)
+++ trunk/include/e_starlightStandalone.h (revision 15)
@@ -1,80 +1,81 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 263 $: revision of last commit
// $Author:: butter $: author of last commit
// $Date:: 2016-06-04 23:03:58 +0100 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef E_STARLIGHTSTANDALONE_H
#define E_STARLIGHTSTANDALONE_H
#include
class upcEvent;
class e_starlight;
class inputParameters;
class e_starlightStandalone {
public:
e_starlightStandalone();
~e_starlightStandalone();
bool init(); ///< reads configuration file and initializes startlight
bool run (); ///< creates output file and runs starlight
const std::string& baseFileName () const { return _baseFileName; }
const std::string& configFileName () const { return _configFileName; } ///< returns path to config file
const std::string& eventDataFileName() const { return _eventDataFileName; } ///< returns path to output file
void setBaseFileName (const std::string& baseFileName ) { _baseFileName = baseFileName; } ///< sets path to base file
void setConfigFileName (const std::string& configFileName ) { _configFileName = configFileName; } ///< sets path to config file
void setEventDataFileName(const std::string& eventDataFileName) { _eventDataFileName = eventDataFileName; } ///< sets path to output file
void boostEvent(eXEvent &e); ///< Boost event from beam CMS to lab system
+ void flipZEvent(eXEvent &e); ///< flip z to -z for all output particles
private:
std::string _baseFileName; ///< path to base filename
std::string _configFileName; ///< path to configuration file
std::string _eventDataFileName; ///< path to output file
e_starlight* _starlight; ///< pointer to starlight instance
inputParameters* _inputParameters; ///< pointer to parameter instance
unsigned int _nmbEventsTot; ///< total number of events to generate (taken from configuration file)
unsigned int _nmbEventsPerFile; ///< maximum number of events written to a single file (not yet implemented)
};
#endif // E_STARLIGHTSTANDALONE_H
Index: trunk/src/hepmc3writer.cpp
===================================================================
--- trunk/src/hepmc3writer.cpp (revision 0)
+++ trunk/src/hepmc3writer.cpp (revision 15)
@@ -0,0 +1,73 @@
+#include "HepMC3/GenVertex.h"
+#include "HepMC3/GenVertex_fwd.h"
+#include "HepMC3/FourVector.h"
+#include "HepMC3/GenEvent.h"
+#include "HepMC3/GenParticle.h"
+#include "HepMC3/WriterAscii.h"
+#include "HepMC3/Print.h"
+
+#include "inputParameters.h"
+#include "eXevent.h"
+#include "hepmc3writer.h"
+
+using HepMC3::FourVector;
+using HepMC3::Print;
+
+hepMC3Writer::hepMC3Writer()
+{
+}
+
+int hepMC3Writer::initWriter(const inputParameters ¶m)
+{
+
+ std::string hepmc3_filename = param.baseFileName() + ".hepmc";
+
+ /** need to pass the parameters to HepMC3 **/
+ param.beam1Z(); //just do something for now
+ _hepmc3_output = new HepMC3::WriterAscii(hepmc3_filename);
+ return 0;
+}
+
+int hepMC3Writer::writeEvent(const eXEvent &event, int eventnumber)
+{
+
+ /** Make HepMC3 Event and Vertex ... Currently only 1 Vertex per Event **/
+ HepMC3::GenEvent hepmc3_evt(HepMC3::Units::GEV , HepMC3::Units::MM);
+ HepMC3::GenVertexPtr hepmc3_vertex_to_write = std::make_shared(FourVector(0,0,0,0));
+
+ /** Get starlight particle vector **/
+ const std::vector * particle_vector = event.getParticles();
+ lorentzVector gamma_lorentzVec = (*event.getGamma())[0];
+ FourVector hepmc3_gamma_four_vector = FourVector(gamma_lorentzVec.GetPx(),
+ gamma_lorentzVec.GetPy(),
+ gamma_lorentzVec.GetPz(),
+ gamma_lorentzVec.GetE());
+ HepMC3::GenParticlePtr hepmc3_gamma = std::make_shared( hepmc3_gamma_four_vector, 22, 0 ); // status currently set to 0... need to double check
+ hepmc3_vertex_to_write->add_particle_in( hepmc3_gamma );
+
+ /** Takes e_starlight events and converts to hepmc3 format **/
+ for ( std::vector::const_iterator particle_iter = (*particle_vector).begin();
+ particle_iter != (*particle_vector).end();
+ ++particle_iter)
+ {
+ int hepmc3_pid = (*particle_iter).getPdgCode();
+ /** pass to HepMC3 FourVector **/
+ FourVector hepmc3_four_vector = FourVector( (*particle_iter).GetPx(),
+ (*particle_iter).GetPy(),
+ (*particle_iter).GetPz(),
+ (*particle_iter).GetE());
+
+ HepMC3::GenParticlePtr hepmc3_particle = std::make_shared( hepmc3_four_vector, hepmc3_pid, 0 ); // status currently set to 0... need to double check
+ hepmc3_vertex_to_write->add_particle_out( hepmc3_particle );
+ }
+
+ /** add vertex to HepMC3 Event**/
+ hepmc3_evt.add_vertex( hepmc3_vertex_to_write );
+ _hepmc3_output->write_event(hepmc3_evt);
+ // Print::listing(hepmc3_evt);
+ // Print::content(hepmc3_evt);
+ hepmc3_evt.clear();
+
+ return eventnumber;
+}
+
Index: trunk/src/filewriter.cpp
===================================================================
--- trunk/src/filewriter.cpp (revision 14)
+++ trunk/src/filewriter.cpp (revision 15)
@@ -1,96 +1,94 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 28 $: revision of last commit
// $Author:: bgrube $: author of last commit
// $Date:: 2010-12-10 18:30:01 +0000 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include "filewriter.h"
using namespace std;
fileWriter::fileWriter()
: _fileName(""),
_fileStream()
{ }
fileWriter::fileWriter(const string& fileName) :
_fileName(fileName)
,_fileStream(fileName.c_str())
{ }
-
fileWriter::~fileWriter()
{ }
-
int fileWriter::open()
{
try
{
_fileStream.open(_fileName.c_str());
_fileStream.precision(15);
_fileStream.setf(ios::fixed);
}
catch (const ios::failure & error)
{
cerr << "I/O exception: " << error.what() << endl;
return EXIT_FAILURE;
}
return 0;
}
int fileWriter::open(const string& fileName)
{
_fileName = fileName;
return open();
}
int fileWriter::close()
{
try
{
_fileStream.close();
}
catch (const ios::failure & error)
{
cerr << "I/O exception: " << error.what() << endl;
return EXIT_FAILURE;
}
return 0;
}
Index: trunk/src/eventfilewriter.cpp
===================================================================
--- trunk/src/eventfilewriter.cpp (revision 14)
+++ trunk/src/eventfilewriter.cpp (revision 15)
@@ -1,189 +1,234 @@
-///////////////////////////////////////////////////////////////////////////
+
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 228 $: revision of last commit
// $Author:: butter $: author of last commit
// $Date:: 2016-01-18 17:10:17 +0000 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
+#ifdef HEPMC3_ON
+#include "hepmc3writer.h"
+#endif
+
+#include
+#include
+#include
#include "eventfilewriter.h"
#include "starlightparticlecodes.h"
+using namespace std;
+
//______________________________________________________________________________
eventFileWriter::eventFileWriter()
: fileWriter()
,_writeFullPythia(false)
+,_writeFullHepMC3(false)
{ }
-
//______________________________________________________________________________
eventFileWriter::eventFileWriter(std::string filename)
: fileWriter(filename)
{ }
//______________________________________________________________________________
int eventFileWriter::writeInit(inputParameters &_p)
{
_fileStream<<"CONFIG_OPT: "<<_p.productionMode()<<" "<<_p.prodParticleId()<<" "<<_p.nmbEvents()
<<" "<<_p.quantumGlauber()<<" "<<_p.impulseVM()<<" "<<_p.randomSeed()<initWriter(_p);
+#else
+ std::cout << "***HepMC3 file format not written --- eStarlight not compiled with HepMC3 Enabled***" << std::endl;
+ _writeFullHepMC3 = false;
+#endif
+ }
+
return 0;
}
//______________________________________________________________________________
int eventFileWriter::writeEvent(upcEvent &event, int eventnumber)
{
int numberoftracks = 0;
if(_writeFullPythia)
{
numberoftracks = event.getParticles()->size();
}
else
{
for(unsigned int i = 0; isize(); ++i)
{
if(event.getParticles()->at(i).getStatus() >= 0) numberoftracks++;
}
}
-
// sometimes we don't have tracks due to wrongly picked W , check it
if(numberoftracks){
eventnumber++;
_fileStream << "EVENT: " << eventnumber << " " << numberoftracks << " " << 1 << std::endl;
if(event.getGammaEnergies()->size()) _fileStream << "GAMMAENERGIES:";
for(unsigned int n = 0; n < event.getGammaEnergies()->size(); n++)
{
_fileStream << " " << event.getGammaEnergies()->at(n);
}
if(event.getGammaEnergies()->size()) _fileStream<< std::endl;
_fileStream <<"VERTEX: "<<0.<<" "<<0.<<" "<<0.<<" "<<0.<<" "<<1<<" "<<0<<" "<<0<<" "<::const_iterator part = (event.getParticles())->begin();
for (part = event.getParticles()->begin(); part != event.getParticles()->end(); part++, ipart++)
{
if(!_writeFullPythia)
{
if((*part).getStatus() < 0) continue;
}
_fileStream << "TRACK: " << " " << starlightParticleCodes::jetsetToGeant((*part).getPdgCode()) <<" "<< (*part).GetPx() << " " << (*part).GetPy()
<< " "<< (*part).GetPz() << " " << eventnumber << " " << ipart << " " << 0 << " "
<< (*part).getPdgCode();
if(_writeFullPythia)
{
lorentzVector vtx = (*part).getVertex();
_fileStream << " " << vtx.GetPx() << " " << vtx.GetPy() << " " << vtx.GetPz() << " " << vtx.GetE();
_fileStream << " " << (*part).getFirstParent() << " " << (*part).getLastParent() << " " << (*part).getFirstDaughter() << " " << (*part).getLastDaughter() << " " << (*part).getStatus();
}
_fileStream <size();
}
else
{
for(unsigned int i = 0; isize(); ++i)
{
if(event.getParticles()->at(i).getStatus() >= 0) numberoftracks++;
}
}
// sometimes we don't have tracks due to wrongly picked W , check it
if(numberoftracks){
eventnumber++;
_fileStream << "EVENT: " << eventnumber << " " << numberoftracks << " " << 1 << std::endl;
_fileStream <<"VERTEX: "<<0.<<" "<<0.<<" "<<0.<<" "<<0.<<" "<<1<<" "<<0<<" "<<0<<" "<size(); ++igam){
+ for( uint igam = 0 ; igam < event.getGammaEnergies()->size(); ++igam){
_fileStream <<"GAMMA: "<at(igam)<<" "<at(igam)<at(igam);
// Write the photon 4-vector out to file. Might be used in later iterations, so I keep it here
//_fileStream <<"GAMMA VECTOR: "<size(); ++itarget){
+ for( uint itarget = 0 ; itarget < event.getTarget()->size(); ++itarget){
lorentzVector target = event.getTarget()->at(itarget);
_fileStream <<"t: "<at(itarget)<size(); ++iel){
+ for( uint iel = 0 ; iel < event.getSources()->size(); ++iel){
lorentzVector el = event.getSources()->at(iel);
_fileStream <<"SOURCE: "<::const_iterator part = (event.getParticles())->begin();
for (part = event.getParticles()->begin(); part != event.getParticles()->end(); part++, ipart++)
{
if(!_writeFullPythia)
{
if((*part).getStatus() < 0) continue;
}
_fileStream << "TRACK: " << " "<< starlightParticleCodes::jetsetToGeant((*part).getPdgCode()) <<" "<< (*part).GetPx() << " " << (*part).GetPy()
<< " "<< (*part).GetPz() << " " << eventnumber << " " << ipart << " " << 0 << " "
<< (*part).getPdgCode();
if(_writeFullPythia)
{
lorentzVector vtx = (*part).getVertex();
_fileStream << " " << vtx.GetPx() << " " << vtx.GetPy() << " " << vtx.GetPz() << " " << vtx.GetE();
_fileStream << " " << (*part).getFirstParent() << " " << (*part).getLastParent() << " " << (*part).getFirstDaughter() << " " << (*part).getLastDaughter() << " " << (*part).getStatus();
}
_fileStream <writeEvent(event,eventnumber);
+ }
+#endif
+
return 0;
}
+int eventFileWriter::close()
+{
+
+#ifdef HEPMC3_ON
+ if ( _writeFullHepMC3 ){
+ _hepmc3writer->close();
+ }
+#endif
+
+ try
+ {
+ _fileStream.close();
+ }
+ catch (const ios::failure & error)
+ {
+ cerr << "I/O exception: " << error.what() << endl;
+ return EXIT_FAILURE;
+ }
+ return 0;
+}
Index: trunk/src/inputParameters.cpp
===================================================================
--- trunk/src/inputParameters.cpp (revision 14)
+++ trunk/src/inputParameters.cpp (revision 15)
@@ -1,703 +1,705 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 276 $: revision of last commit // $Author:: jnystra#$: author of last commit
// $Date:: 2016-09-13 19:54:42 +0100 #$: date of last commit //
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#include
#include
#include "reportingUtils.h"
#include "starlightconstants.h"
#include "inputParameters.h"
#include "inputParser.h"
#include "starlightconfig.h"
#include
#include
#include "randomgenerator.h"
using namespace std;
using namespace starlightConstants;
parameterlist parameterbase::_parameters;
#define REQUIRED true
#define NOT_REQUIRED false
//______________________________________________________________________________
inputParameters::inputParameters()
: _baseFileName ("baseFileName","slight"),
_beam1Z ("BEAM_1_Z",0),
_beam1A ("BEAM_1_A",0),
_beam2Z ("BEAM_2_Z",0),
_beam2A ("BEAM_2_A",0),
_beam1LorentzGamma ("BEAM_1_GAMMA",0),
_beam2LorentzGamma ("BEAM_2_GAMMA",0),
_maxW ("W_MAX",0),
_minW ("W_MIN",0),
_nmbWBins ("W_N_BINS",0),
_maxRapidity ("RAP_MAX",9,NOT_REQUIRED),
_nmbRapidityBins ("RAP_N_BINS",100,NOT_REQUIRED),
_nmbEnergyBins ("EGA_N_BINS",0),
_ptCutEnabled ("CUT_PT",false, NOT_REQUIRED),
_ptCutMin ("PT_MIN",0, NOT_REQUIRED),
_ptCutMax ("PT_MAX",0, NOT_REQUIRED),
_etaCutEnabled ("CUT_ETA",false, NOT_REQUIRED),
_etaCutMin ("ETA_MIN",0, NOT_REQUIRED),
_etaCutMax ("ETA_MAX",0, NOT_REQUIRED),
_productionMode ("PROD_MODE",0),
_nmbEventsTot ("N_EVENTS",0),
_prodParticleId ("PROD_PID",0),
_randomSeed ("RND_SEED",0),
_beamBreakupMode ("BREAKUP_MODE",0),
_interferenceEnabled ("INTERFERENCE",false,NOT_REQUIRED),
_interferenceStrength ("IF_STRENGTH",0,NOT_REQUIRED),
_maxPtInterference ("INT_PT_MAX",0,NOT_REQUIRED),
_nmbPtBinsInterference ("INT_PT_N_BINS",0),
_ptBinWidthInterference("INT_PT_WIDTH",0),
_protonEnergy ("PROTON_ENERGY",0, NOT_REQUIRED),
_electronEnergy ("ELECTRON_ENERGY",0, NOT_REQUIRED),
_minGammaEnergy ("MIN_GAMMA_ENERGY",6.0, NOT_REQUIRED),
_maxGammaEnergy ("MAX_GAMMA_ENERGY",600000.0, NOT_REQUIRED),
_minGammaQ2 ("MIN_GAMMA_Q2",0,NOT_REQUIRED),
_maxGammaQ2 ("MAX_GAMMA_Q2",0,NOT_REQUIRED),
_nmbGammaQ2Bins ("INT_GAMMA_Q2_BINS",400,NOT_REQUIRED),
_pythiaParams ("PYTHIA_PARAMS","", NOT_REQUIRED),
_pythiaFullEventRecord ("PYTHIA_FULL_EVENTRECORD",false, NOT_REQUIRED),
+ _hepmc3FullEventRecord ("HEPMC3_FULL_EVENTRECORD",false, NOT_REQUIRED),
_xsecCalcMethod ("XSEC_METHOD",0, NOT_REQUIRED),
_axionMass ("AXION_MASS",50, NOT_REQUIRED), // AXION HACK
_bslopeDefinition ("BSLOPE_DEFINITION",0, NOT_REQUIRED),
_bslopeValue ("BSLOPE_VALUE",4.0,NOT_REQUIRED),
_impulseVM ("SELECT_IMPULSE_VM",0,NOT_REQUIRED),
_quantumGlauber ("QUANTUM_GLAUBER",0,NOT_REQUIRED)
{
// All parameters must be initialised in initialisation list!
// If not: error: 'parameter::parameter() [with T = unsigned int, bool validate = true]' is private
// or similar
_ip.addParameter(_baseFileName);
_ip.addParameter(_beam1Z);
_ip.addParameter(_beam2Z);
_ip.addParameter(_beam1A);
_ip.addParameter(_beam2A);
_ip.addParameter(_beam1LorentzGamma);
_ip.addParameter(_beam2LorentzGamma);
_ip.addParameter(_maxW);
_ip.addParameter(_minW);
_ip.addParameter(_nmbWBins);
_ip.addParameter(_maxRapidity);
_ip.addParameter(_nmbRapidityBins);
//
_ip.addParameter(_nmbEnergyBins);
_ip.addParameter(_ptCutEnabled);
_ip.addParameter(_ptCutMin);
_ip.addParameter(_ptCutMax);
_ip.addParameter(_etaCutEnabled);
_ip.addParameter(_etaCutMax);
_ip.addParameter(_etaCutMin);
_ip.addParameter(_productionMode);
_ip.addParameter(_nmbEventsTot);
_ip.addParameter(_prodParticleId);
_ip.addParameter(_randomSeed);
_ip.addParameter(_beamBreakupMode);
_ip.addParameter(_interferenceEnabled);
_ip.addParameter(_interferenceStrength);
_ip.addParameter(_maxPtInterference);
_ip.addParameter(_nmbPtBinsInterference);
_ip.addParameter(_minGammaEnergy);
_ip.addParameter(_maxGammaEnergy);
_ip.addParameter(_minGammaQ2);
_ip.addParameter(_maxGammaQ2);
_ip.addParameter(_nmbGammaQ2Bins);
_ip.addParameter(_pythiaParams);
_ip.addParameter(_pythiaFullEventRecord);
+ _ip.addParameter(_hepmc3FullEventRecord);
_ip.addParameter(_xsecCalcMethod);
_ip.addParameter(_axionMass); // AXION HACK
_ip.addParameter(_bslopeDefinition);
_ip.addParameter(_bslopeValue);
_ip.addParameter(_impulseVM);
_ip.addParameter(_quantumGlauber);
}
//______________________________________________________________________________
inputParameters::~inputParameters()
{ }
//______________________________________________________________________________
bool
inputParameters::configureFromFile(const std::string &_configFileName)
{
int nParameters = _ip.parseFile(_configFileName);
if(nParameters == -1)
{
printWarn << "could not open file '" << _configFileName << "'" << endl;
return false;
}
if(_ip.validateParameters(cerr))
printInfo << "successfully read input parameters from '" << _configFileName << "'" << endl;
else {
printWarn << "problems reading input parameters from '" << _configFileName << "'" << endl
<< *this;
return false;
}
return true;
}
bool inputParameters::init()
{
// Calculate beam gamma in CMS frame
double rap1 = acosh(beam1LorentzGamma());
double rap2 = -acosh(beam2LorentzGamma());
_beamLorentzGamma = cosh((rap1-rap2)/2);
_targetLorentzGamma = cosh(rap1-rap2);
if( beam2A() == 1) //proton case 0.87 fm = 4.4 GeV^{-1}
_targetR = 4.4;
else
_targetR = 6.1 * pow(beam2A(), 1./3.);
//_targetR = 4.4/2.;
_fixedQ2Range = false;
std::cout << "Rapidity beam 1: " << rap1 << ", rapidity beam 2: " << rap2 << ", rapidity CMS system: " << (rap1+rap2)/2 << ", beam gamma in CMS: " << _beamLorentzGamma<< std::endl;
std::cout << "Rapidity beam 1 in beam 2 frame: " << rap1-rap2 << ", beam 1 gamma in beam 2 frame: " << _targetLorentzGamma<< std::endl;
_ptBinWidthInterference = maxPtInterference() / nmbPtBinsInterference();
_protonEnergy = _beamLorentzGamma * protonMass;
// Electron energy in the target frame of reference
_electronEnergy = _targetLorentzGamma * starlightConstants::mel;
if((beam1Z()==1) && (beam1A()==2)){
if((beam2Z()==1) && (beam2A()==2)){
printWarn << "deuteron-deuteron collisions are not supported" << endl;
return false;}
printWarn << "deuterium must be listed as the second nucleus" << endl;
return false;}
if( ((beam1Z()==1) && (beam1A()==3)) || ((beam2Z()==1) && (beam2A()==3)) ){
printWarn << "tritium is not currently supported" << endl;
return false;}
// check that rho production uses wide resonance option
if(_prodParticleId.value()==113 && _productionMode.value()==2){
printWarn << endl<< "For rho meson production, you should choose the wide resonance option (production mode = 3)" << endl;
return false;}
// define interaction type
switch (productionMode()) {
case 1:
_interactionType = PHOTONPHOTON;
break;
case 2:
_interactionType = PHOTONPOMERONNARROW;
break;
case 3:
_interactionType = PHOTONPOMERONWIDE;
break;
case 4:
_interactionType = PHOTONPOMERONINCOHERENT;
break;
case 5:
_interactionType = PHOTONUCLEARSINGLE;
break;
case 6:
_interactionType = PHOTONUCLEARDOUBLE;
break;
case 7:
_interactionType = PHOTONUCLEARSINGLEPA;
break;
case 8:
_interactionType = PHOTONUCLEARSINGLEPAPY;
break;
// case 9:
// _interactionType = PHOTONPHOTONKNIEHL;
// break;
// case 10:
// _interactionType = PHOTONPHOTONKNIEHLMODIFIED;
// break;
case 12:
_interactionType = E_PHOTONPOMERONNARROW;
break;
case 13:
_interactionType = E_PHOTONPOMERONWIDE;
break;
default:
printWarn << "unknown production mode '" << _productionMode << "'" << endl;
return false;
}
if( (_productionMode.value() ==4) && (_interferenceEnabled.value())) {
printWarn << " cannot enable interference for incoherent production " << endl;
return false;
}
double mass = 0;
double width = 0;
double defaultMinW = 0; // default for _minW, unless it is defined later [GeV/c^2]
double defaultMaxW = 0; // default for _maxW, unless it is defined later [GeV/c^2]
switch (prodParticleId()) {
case 11: // e+e- pair
_particleType = ELECTRON;
_decayType = LEPTONPAIR;
mass = starlightConstants::mel;
defaultMinW = 2*mass; // default is 0.01; up to 0.15 is safe for Summer 2000 triggering for e+e- pairs
defaultMaxW = sqrt(beam1LorentzGamma()*beam2LorentzGamma())*2*(starlightConstants::hbarc)/(1.2*pow(float(beam1A()),1./6.)*pow(float(beam2A()),1./6.)); // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 13: // mu+mu- pair
_particleType = MUON;
_decayType = LEPTONPAIR;
defaultMinW = 2 * muonMass;
defaultMaxW = sqrt(beam1LorentzGamma()*beam2LorentzGamma())*2*(starlightConstants::hbarc)/(1.2*pow(float(beam1A()),1./6.)*pow(float(beam2A()),1./6.)); // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 15: // tau+tau- pair
_particleType = TAUON;
_decayType = LEPTONPAIR;
defaultMinW = 2 * tauMass;
defaultMaxW = sqrt(beam1LorentzGamma()*beam2LorentzGamma())*2*(starlightConstants::hbarc)/(1.2*pow(float(beam1A()),1./6.)*pow(float(beam2A()),1./6.)); // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 10015: // tau+tau- pair
_particleType = TAUONDECAY;
_decayType = LEPTONPAIR;
defaultMinW = 2 * tauMass;
defaultMaxW = sqrt(beam1LorentzGamma()*beam2LorentzGamma())*2*(starlightConstants::hbarc)/(1.2*pow(float(beam1A()),1./6.)*pow(float(beam2A()),1./6.)); // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
// case 24: // W+W- pair
// _particleType = W;
// _decayType = WW;
// defaultMinW = 2 * muonMass;
// break;
case 115: // a_2(1320)
_particleType = A2;
_decayType = SINGLEMESON;
mass = starlightConstants::a2Mass;
width = starlightConstants::a2Width;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 221: // eta
_particleType = ETA;
_decayType = SINGLEMESON;
mass = starlightConstants::etaMass;
width = starlightConstants::etaWidth;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 225: // f_2(1270)
_particleType = F2;
_decayType = SINGLEMESON;
mass = starlightConstants::f2Mass;
width = starlightConstants::f2Width;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = starlightConstants::f2BrPiPi;
break;
case 331: // eta'(958)
_particleType = ETAPRIME;
_decayType = SINGLEMESON;
mass = starlightConstants::etaPrimeMass;
width = starlightConstants::etaPrimeWidth;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 335: // f_2'(1525)
_particleType = F2PRIME;
_decayType = SINGLEMESON;
mass = starlightConstants::f2PrimeMass;
width = starlightConstants::f2PrimeWidth;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = starlightConstants::f2PrimeBrKK;
break;
case 441: // eta_c(1s)
_particleType = ETAC;
_decayType = SINGLEMESON;
mass = starlightConstants::etaCMass;
width = starlightConstants::etaCWidth;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 9010221: // f_0(980), was orginally called 10221? updated to standard number
_particleType = F0;
_decayType = SINGLEMESON;
mass = starlightConstants::f0Mass;
width = starlightConstants::f0Width;
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = starlightConstants::f0BrPiPi;
break;
case 33: // Z"/Z0 This is the rho^0 rho^0 final state SRK
_particleType = ZOVERZ03;
_decayType = SINGLEMESON;
defaultMinW = 4*pionChargedMass;
defaultMaxW = 1.6; // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 88: // axion// AXION HACK, till break statement
_particleType = AXION;
_decayType = SINGLEMESON;
mass = _axionMass.value();
width = 1/(64*starlightConstants::pi)*mass*mass*mass/(1000*1000);//Fix Lambda=1000 GeV, rescaling is trivial.
defaultMinW = mass - 5*width; // JES 6.17.2015 to avoid problems with default of 0
defaultMaxW = mass + 5*width; // JES 6.17.2015 to avoid problems with no default
break; // AXION HACK, end
// case 25: // Higgs
// _particleType = HIGGS;
// _decayType = SINGLEMESON;
// break;
case 113: // rho(770)
_particleType = RHO;
_decayType = WIDEVMDEFAULT;
mass = starlightConstants::rho0Mass;
width = starlightConstants::rho0Width;
defaultMinW = 2 * pionChargedMass;
defaultMaxW = mass + 5 * width;
_inputBranchingRatio = starlightConstants::rho0BrPiPi;
break;
case 913: // rho(770) with direct pi+pi- decay, interference given by ZEUS data
_particleType = RHOZEUS;
_decayType = WIDEVMDEFAULT;
mass = starlightConstants::rho0Mass;
width = starlightConstants::rho0Width;
defaultMinW = 2 * pionChargedMass;
defaultMaxW = mass + 5 * width; // use the same 1.5GeV max mass as ZEUS
_inputBranchingRatio = starlightConstants::rho0BrPiPi;
break;
case 999: // pi+pi-pi+pi- phase space decay
_particleType = FOURPRONG;
_decayType = WIDEVMDEFAULT;
mass = starlightConstants::rho0PrimeMass;
width = starlightConstants::rho0PrimeWidth;
defaultMinW = 4 * pionChargedMass;
defaultMaxW = sqrt(beam1LorentzGamma()*beam2LorentzGamma())*2*(starlightConstants::hbarc)/(1.2*pow(float(beam1A()),1./6.)*pow(float(beam2A()),1./6.)); // JES 6.17.2015 to avoid problems with no default
_inputBranchingRatio = 1.0;
break;
case 223: // omega(782)
_particleType = OMEGA;
_decayType = NARROWVMDEFAULT;
mass = starlightConstants::OmegaMass;
width = starlightConstants::OmegaWidth;
defaultMinW = mass - 5 * width;
defaultMaxW = mass + 5 * width;
_inputBranchingRatio = starlightConstants::OmegaBrPiPi;
break;
case 333: // phi(1020)
_particleType = PHI;
_decayType = NARROWVMDEFAULT;
mass = starlightConstants::PhiMass;
width = starlightConstants::PhiWidth;
defaultMinW = 2 * kaonChargedMass;
defaultMaxW = mass + 5 * width;
_inputBranchingRatio = starlightConstants::PhiBrKK;
break;
case 443: // J/psi
_particleType = JPSI;
_decayType = NARROWVMDEFAULT;
mass = starlightConstants::JpsiMass;
width = starlightConstants::JpsiWidth;
defaultMinW = mass - 5 * width;
defaultMaxW = mass + 5 * width;
_inputBranchingRatio = (starlightConstants::JpsiBree + starlightConstants::JpsiBrmumu)/2.;
break;
case 443011: // J/psi
_particleType = JPSI_ee;
_decayType = NARROWVMDEFAULT;
mass = starlightConstants::JpsiMass;
width = starlightConstants::JpsiWidth;
defaultMinW = mass - 5 * width;
defaultMaxW = mass + 5 * width;
_inputBranchingRatio = starlightConstants::JpsiBree;
break;
case 443013: // J/psi
cout<<"In inputParameters setting J/psi mass!"<.
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 263 $: revision of last commit
// $Author:: mlomnitz $: author of last commit
// $Date:: 02/28/2017 #$: date of last commit
//
// Description:
//
// Main interface for eSTARlight code inherited from STARlight
//
//
///////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include "starlightconfig.h"
#ifdef ENABLE_PYTHIA
#include "PythiaStarlight.h"
#endif
#ifdef ENABLE_DPMJET
#include "starlightdpmjet.h"
#endif
#ifdef ENABLE_PYTHIA6
#include "starlightpythia.h"
#endif
#include "reportingUtils.h"
#include "inputParameters.h"
#include "eventchannel.h"
#include "gammagammaleptonpair.h"
#include "gammagammasingle.h"
#include "gammaavm.h"
#include "twophotonluminosity.h"
#include "gammaaluminosity.h"
#include "gammaeluminosity.h"
#include "incoherentPhotonNucleusLuminosity.h"
#include "upcevent.h"
#include "e_starlight.h"
using namespace std;
using namespace starlightConstants;
e_starlight::e_starlight() :
_beamSystem (0),
_eventChannel (0),
_nmbEventsPerFile (100),
_isInitialised (false),
_inputParameters (0)
{ }
e_starlight::~e_starlight()
{ }
bool
e_starlight::init()
{
// ???
if(Starlight_VERSION_MAJOR == 9999)
{
cout << endl << "#########################################" << endl
<< " Initialising Starlight version: trunk..." << endl
<< "#########################################" << endl << endl;
}
else
{
cout << endl << "#########################################" << endl
<< " Initialising Starlight version: " << Starlight_VERSION_MAJOR << "."
<< Starlight_VERSION_MINOR << "." << Starlight_VERSION_MINOR_MINOR << "..." << endl
<< "#########################################" << endl << endl;
}
_nmbEventsPerFile = _inputParameters->nmbEvents(); // for now we write only one file...
_beamSystem = new beamBeamSystem(*_inputParameters);
// This sets the precision used by cout for printing
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.precision(3);
std::string _baseFileName;
_baseFileName = _inputParameters->baseFileName();
_lumLookUpTableFileName = _baseFileName + ".txt";
const bool lumTableIsValid = luminosityTableIsValid();
// Do some sanity checks of the input parameters here.
if( _inputParameters->beam1A() != 0 && _inputParameters->beam2A() != 0 ){
- printErr << endl << "One of the two beams must be an electron in eSTARlight" << endl;
+ // printErr << endl << "One of the two beams must be an electron in eSTARlight" << endl;
return false;
}
if( _inputParameters->beam1A() == 0 && _inputParameters->beam2A() == 0 ){
- printErr << endl << "Only one of the two beams can be electron in eSTARlight"<< endl;
+ // printErr << endl << "Only one of the two beams can be electron in eSTARlight"<< endl;
return false;
}
if( _inputParameters->beam1A() == 0 && std::abs(_inputParameters->beam1Z()) != 1 ){
- printErr << endl << "Beam 1 should be electron, but has wrong Z"<< endl;
+ // printErr << endl << "Beam 1 should be electron, but has wrong Z"<< endl;
return false;
}
if( _inputParameters->beam2A() == 0 && _inputParameters->beam2Z() != std::abs(1) ){
- printErr << endl << "Beam 1 should be electron, but has wrong Z"<< endl;
+ // printErr << endl << "Beam 1 should be electron, but has wrong Z"<< endl;
return false;
}
bool createChannel = true;
switch (_inputParameters->interactionType()) {
// Photon-photon scattering is not implemented in eSTARlight as of yet
/*
case PHOTONPHOTON:
if (!lumTableIsValid) {
printInfo << "creating luminosity table for photon-photon channel" << endl;
twoPhotonLuminosity(*_inputParameters, _beamSystem->beam1(), _beamSystem->beam2());
}
break;
*/
case E_PHOTONPOMERONNARROW: // narrow and wide resonances use
case E_PHOTONPOMERONWIDE: // the same luminosity function
if (!lumTableIsValid) {
printInfo << "creating luminosity table for coherent photon-Pomeron channel" <interactionType() << "'."
<< " cannot initialize eSTARlight." << endl;
return false;
}
}
if(createChannel)
{
if (!createEventChannel())
return false;
}
_isInitialised = true;
return true;
}
eXEvent
e_starlight::produceEvent()
{
if (!_isInitialised) {
- printErr << "trying to generate event but Starlight is not initialised. aborting." << endl;
+ // printErr << "trying to generate event but Starlight is not initialised. aborting." << endl;
exit(-1);
}
return _eventChannel->e_produceEvent();
}
bool
e_starlight::luminosityTableIsValid() const
{
printInfo << "using random seed = " << _inputParameters->randomSeed() << endl;
ifstream lumLookUpTableFile(_lumLookUpTableFileName.c_str());
lumLookUpTableFile.precision(15);
if ((!lumLookUpTableFile) || (!lumLookUpTableFile.good())) {
return false;
}
unsigned int beam1Z, beam1A, beam2Z, beam2A;
double beamLorentzGamma = 0;
double maxW = 0, minW = 0;
unsigned int nmbWBins;
double maxRapidity = 0;
unsigned int nmbRapidityBins;
int productionMode, beamBreakupMode;
//Remove interference options for eX collisions (no logner symmetric)
// bool interferenceEnabled = false;
// double interferenceStrength = 0;
bool coherentProduction = false;
double incoherentFactor = 0, deuteronSlopePar = 0, maxPtInterference = 0;
int nmbPtBinsInterference;
std::string validationKey;
if (!(lumLookUpTableFile
>> validationKey
>> beam1Z >> beam1A
>> beam2Z >> beam2A
>> beamLorentzGamma
>> maxW >> minW >> nmbWBins
>> maxRapidity >> nmbRapidityBins
>> productionMode
>> beamBreakupMode
>> maxPtInterference
>> nmbPtBinsInterference
>> coherentProduction >> incoherentFactor
>> deuteronSlopePar))
// cannot read parameters from lookup table file
return false;
std::string validationKeyEnd;
while(!lumLookUpTableFile.eof())
{
lumLookUpTableFile >> validationKeyEnd;
}
lumLookUpTableFile.close();
return (validationKey == _inputParameters->parameterValueKey() && validationKeyEnd == validationKey);
return true;
}
bool
e_starlight::createEventChannel()
{
switch (_inputParameters->prodParticleType()) {
case ELECTRON:
case MUON:
case TAUON:
case TAUONDECAY:
{
_eventChannel = new Gammagammaleptonpair(*_inputParameters, *_beamSystem);
if (_eventChannel)
return true;
else {
printWarn << "cannot construct Gammagammaleptonpair event channel." << endl;
return false;
}
}
case A2: // jetset/pythia
case ETA: // jetset/pythia
case ETAPRIME: // jetset/pythia
case ETAC: // jetset/pythia
case F0: // jetset/pythia
{
-#ifdef ENABLE_PYTHIA
+
+ //#ifdef ENABLE_PYTHIA
// PythiaOutput = true;
- cout<<"Pythia is enabled!"<interactionType() == E_PHOTONPOMERONNARROW) {
_eventChannel = new e_Gammaanarrowvm(*_inputParameters, *_beamSystem);
if (_eventChannel)
return true;
else {
printWarn << "cannot construct Gammaanarrowvm event channel." << endl;
return false;
}
}
if (_inputParameters->interactionType() == E_PHOTONPOMERONWIDE) {
_eventChannel = new e_Gammaawidevm(*_inputParameters, *_beamSystem);
if (_eventChannel)
return true;
else {
printWarn << "cannot construct Gammaawidevm event channel." << endl;
return false;
}
}
printWarn << "interaction type '" << _inputParameters->interactionType() << "' "
<< "cannot be used with particle type '" << _inputParameters->prodParticleType() << "'. "
<< "cannot create event channel." << endl;
return false;
}
default:
{
printWarn << "unknown event channel '" << _inputParameters->prodParticleType() << "'."
<< " cannot create event channel." << endl;
return false;
}
}
}
Index: trunk/src/e_starlightStandalone.cpp
===================================================================
--- trunk/src/e_starlightStandalone.cpp (revision 14)
+++ trunk/src/e_starlightStandalone.cpp (revision 15)
@@ -1,187 +1,188 @@
//////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight 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.
//
// starlight 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 starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 270 $: revision of last commit
// $Author:: jnystrand $: author of last commit
// $Date:: 2016-07-08 16:31:51 +0100 #$: date of last commit
//
// Description:
//
//
//
///////////////////////////////////////////////////////////////////////////
#include
#include
#include "reportingUtils.h"
#include "e_starlight.h"
#include "inputParameters.h"
#include "eventfilewriter.h"
#include "e_starlightStandalone.h"
using namespace std;
e_starlightStandalone::e_starlightStandalone()
: _configFileName ("slight.in"),
_starlight (0),
_nmbEventsTot (1),
_nmbEventsPerFile (_nmbEventsTot)
{ }
e_starlightStandalone::~e_starlightStandalone()
{ }
bool
e_starlightStandalone::init()
{
_inputParameters = new inputParameters();
// read input parameters from config file
_inputParameters->configureFromFile(_configFileName);
if (!_inputParameters->init()) {
printWarn << "problems initializing input parameters. cannot initialize starlight." << endl;
return false;
}
// copy input file to one with baseFileName naming scheme
std::string inputCopyName, _baseFileName;
_baseFileName = _inputParameters->baseFileName();
if (_baseFileName != "slight") {
inputCopyName = _baseFileName +".in";
ofstream inputCopyFile;
inputCopyFile.open(inputCopyName.c_str());
std::ifstream infile(_configFileName.c_str());
if ((!infile) || (!infile.good()))
{
return -1;
}
int lineSize = 256;
char tmp[lineSize];
while (!infile.getline(tmp, lineSize).eof())
{
cout << tmp << endl;
inputCopyFile << tmp << endl;
}
inputCopyFile.close();
}
// get the number of events
// for now we write everything to one file
_nmbEventsTot = _inputParameters->nmbEvents();
_nmbEventsPerFile = _nmbEventsTot;
// create the starlight object
_starlight = new e_starlight();
// give starlight the input parameters
_starlight->setInputParameters(_inputParameters);
// initialize starlight
return _starlight->init();
}
bool
e_starlightStandalone::run()
{
if (!_starlight) {
printWarn << "null pointer to starlight object. make sure that init() was called. "
<< "cannot generate events." << endl;
return false;
}
// open output file
eventFileWriter fileWriter;
fileWriter.writeFullPythiaInfo(_inputParameters->pythiaFullEventRecord());
+ fileWriter.writeFullHepMC3Info(_inputParameters->hepmc3FullEventRecord());
_baseFileName = _inputParameters->baseFileName();
_eventDataFileName = _baseFileName +".out";
fileWriter.open(_eventDataFileName);
//
fileWriter.writeInit(*_inputParameters);
//
printInfo << "generating events:" << endl;
unsigned int nmbEvents = 0;
std::chrono::steady_clock::time_point begin= std::chrono::steady_clock::now();
while (nmbEvents < _nmbEventsTot) {
for (unsigned int iEvent = 0; (iEvent < _nmbEventsPerFile) && (nmbEvents < _nmbEventsTot);
++iEvent, ++nmbEvents) {
progressIndicator(iEvent, _nmbEventsTot, true, 4);
eXEvent event = _starlight->produceEvent();
// Boost event from back to lab reference frame
boostEvent(event);
- // flipZEvent(event);
+ flipZEvent(event);
fileWriter.writeEvent(event, iEvent);
}
}
std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();
float running_total = 1E-3*std::chrono::duration_cast(end - begin).count();
cout<<"Total time "<nmbAttempts() == 0 )return true;
double _branchingRatio = _inputParameters->inputBranchingRatio();
printInfo << "number of attempts = " << _starlight->nmbAttempts() << ", "
<< "number of accepted events = " << _starlight->nmbAccepted() << endl;
double selectedCrossSection =
((double)_starlight->nmbAccepted()/_starlight->nmbAttempts())*_branchingRatio*_starlight->getTotalCrossSection();
if (selectedCrossSection > 1.){
cout<< " The cross section of the generated sample is "< 1.){
cout<< " The cross section of the generated sample is "<<1.E3*selectedCrossSection<<" mb."< 1.){
cout<< " The cross section of the generated sample is "<<1.E6*selectedCrossSection<<" microbarn."< 1.){
cout<< " The cross section of the generated sample is "<<1.E9*selectedCrossSection<<" nanobarn."< 1.){
cout<< " The cross section of the generated sample is "<<1.E12*selectedCrossSection<<" picobarn."<beam1LorentzGamma());
double rap2 = -acosh(_inputParameters->beam2LorentzGamma());
double boost = (rap1+rap2)/2.;
event.boost(boost, rap2); // Boost back to laboratory reference frame. Electron initially in target frame and V.M. in CMS
// Assuming electron is beam1
}
void e_starlightStandalone::flipZEvent(eXEvent &event)
{
event.flipZ(); //Change all z to -z
}
Index: trunk/cmake_modules/FindHepMC3.cmake
===================================================================
--- trunk/cmake_modules/FindHepMC3.cmake (revision 0)
+++ trunk/cmake_modules/FindHepMC3.cmake (revision 15)
@@ -0,0 +1,27 @@
+
+
+FIND_PATH(HEPMC3_INCLUDE_DIR HepMC3/GenEvent.h HINTS /usr/local/include $ENV{HEPMC3DIR}/include)
+#FIND_LIBRARY(HEPMC3_LIBRARY NAMES HepMC3 PATHS $ENV{HEPMC3_ROOT_DIR}/lib)
+FIND_LIBRARY(HEPMC3_LIBRARY NAMES HepMC3 PATHS /usr/lib /usr/lib/HepMC3 /usr/local/lib $ENV{HEPMC3DIR}/lib)
+
+IF (HEPMC3_INCLUDE_DIR AND HEPMC3_LIBRARY)
+ SET(HEPMC3_FOUND TRUE)
+ENDIF (HEPMC3_INCLUDE_DIR AND HEPMC3_LIBRARY)
+
+
+IF (HEPMC3_FOUND)
+ IF (NOT HEPMC3_FIND_QUIETLY)
+ MESSAGE(STATUS "Found HepMC3: ${HEPMC3_LIBRARY}")
+ MESSAGE(STATUS "Found HepMC3 include: ${HEPMC3_INCLUDE_DIR}")
+ ENDIF (NOT HEPMC3_FIND_QUIETLY)
+ELSE (HEPMC3_FOUND)
+ IF (HEPMC3_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find HepMC3. We search first in the normal library paths, then in $HEPMC3IR")
+ ELSE(HEPMC3_FIND_REQUIRED)
+ IF(NOT HEPMC3_FIND_QUIETLY)
+ MESSAGE(STATUS "Could not find HepMC3. We search first in the normal library paths, then in $HEPMC3DIR")
+ ENDIF(NOT HEPMC3_FIND_QUIETLY)
+ ENDIF (HEPMC3_FIND_REQUIRED)
+
+ENDIF (HEPMC3_FOUND)
+