Skip to content
Snippets Groups Projects
Commit ffe7028f authored by Andre Sailer's avatar Andre Sailer Committed by Frank Gaede
Browse files

InputAction: Add parameter map property to pass arbitrary parameters to event readers if necessary

Use in event readers like:
MyReader::setParameters( std::map< std::string, std::string > & parameters ) {
  // int (or double, ...) m_parameter, defaultValue
    _getParameterValue( parameters, "MyParameters", m_parameter, defaultValue);
 }
parent 25dc0325
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "DDG4/Geant4Vertex.h" #include "DDG4/Geant4Vertex.h"
#include "DDG4/Geant4Particle.h" #include "DDG4/Geant4Particle.h"
#include "DDG4/Geant4GeneratorAction.h" #include "DDG4/Geant4GeneratorAction.h"
#include "DD4hep/Parsers.h"
// C/C++ include files // C/C++ include files
#include <vector> #include <vector>
...@@ -64,6 +65,24 @@ namespace DD4hep { ...@@ -64,6 +65,24 @@ namespace DD4hep {
bool m_directAccess; bool m_directAccess;
/// Current event number /// Current event number
int m_currEvent; int m_currEvent;
/// transform the string parameter value into the type of parameter
/**
* removes parameter from the parameters map
*/
template <typename T>
void _getParameterValue( std::map< std::string, std::string > & parameters,
std::string const& parameterName,
T& parameter, T defaultValue ) {
if( parameters.find( parameterName ) != parameters.end() ) {
DD4hep::Parsers::parse( parameter, parameters.at( parameterName ) );
parameters.erase( parameterName );
} else {
parameter = defaultValue;
}
}
public: public:
/// Initializing constructor /// Initializing constructor
Geant4EventReader(const std::string& nam); Geant4EventReader(const std::string& nam);
...@@ -92,6 +111,12 @@ namespace DD4hep { ...@@ -92,6 +111,12 @@ namespace DD4hep {
virtual EventReaderStatus readParticles(int event_number, virtual EventReaderStatus readParticles(int event_number,
Vertices& vertices, Vertices& vertices,
Particles& particles) = 0; Particles& particles) = 0;
/// pass parameters to the event reader object
virtual EventReaderStatus setParameters( std::map< std::string, std::string > & ) {return EVENT_READER_OK; }
/// make sure that all parameters have been processed, otherwise throw exceptions
virtual void checkParameters( std::map< std::string, std::string >& );
}; };
/// Generic input action capable of using the Geant4EventReader class. /// Generic input action capable of using the Geant4EventReader class.
...@@ -126,6 +151,8 @@ namespace DD4hep { ...@@ -126,6 +151,8 @@ namespace DD4hep {
int m_currentEventNumber; int m_currentEventNumber;
/// Flag to call abortEvent in case of failure (default: true) /// Flag to call abortEvent in case of failure (default: true)
bool m_abort; bool m_abort;
/// Property: named parameters to configure file readers or input actions
std::map< std::string, std::string> m_parameters;
public: public:
/// Read an event and return a LCCollectionVec of MCParticles. /// Read an event and return a LCCollectionVec of MCParticles.
......
...@@ -52,6 +52,21 @@ Geant4EventReader::EventReaderStatus Geant4EventReader::skipEvent() { ...@@ -52,6 +52,21 @@ Geant4EventReader::EventReaderStatus Geant4EventReader::skipEvent() {
return sc; return sc;
} }
/// check if all parameters have been consumed by the reader, otherwise throws exception
void Geant4EventReader::checkParameters(std::map< std::string, std::string > &parameters) {
if( parameters.empty() ) {
return;
}
for (auto const& pairNV : parameters ) {
printout(FATAL,"EventReader::checkParameters","Unknown parameter name: %s with value %s",
pairNV.first.c_str(),
pairNV.second.c_str());
}
throw std::runtime_error("Unknown parameter for event reader");
}
/// Move to the indicated event number. /// Move to the indicated event number.
Geant4EventReader::EventReaderStatus Geant4EventReader::EventReaderStatus
Geant4EventReader::moveToEvent(int event_number) { Geant4EventReader::moveToEvent(int event_number) {
...@@ -87,6 +102,7 @@ Geant4InputAction::Geant4InputAction(Geant4Context* ctxt, const string& nam) ...@@ -87,6 +102,7 @@ Geant4InputAction::Geant4InputAction(Geant4Context* ctxt, const string& nam)
declareProperty("Mask", m_mask = 0); declareProperty("Mask", m_mask = 0);
declareProperty("MomentumScale", m_momScale = 1.0); declareProperty("MomentumScale", m_momScale = 1.0);
declareProperty("HaveAbort", m_abort = true); declareProperty("HaveAbort", m_abort = true);
declareProperty("Parameters", m_parameters = {});
m_needsControl = true; m_needsControl = true;
} }
...@@ -123,6 +139,8 @@ int Geant4InputAction::readParticles(int evt_number, ...@@ -123,6 +139,8 @@ int Geant4InputAction::readParticles(int evt_number,
tn.first.c_str(),tn.second.c_str()); tn.first.c_str(),tn.second.c_str());
return Geant4EventReader::EVENT_READER_NO_FACTORY; return Geant4EventReader::EVENT_READER_NO_FACTORY;
} }
m_reader->setParameters( m_parameters );
m_reader->checkParameters( m_parameters );
} }
catch(const exception& e) { catch(const exception& e) {
err = e.what(); err = e.what();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment