Newer
Older
Markus Frank
committed
//==========================================================================
Markus Frank
committed
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
Markus Frank
committed
// All rights reserved.
Markus Frank
committed
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// Author : M.Frank
//
//==========================================================================
/** \addtogroup Geant4EventReader
*
@{
\package LCIOFileReader
* \brief Plugin to read lcio files
*
*
@}
*/
#ifndef DD4HEP_DDG4_LCIOFILEREADER_H
#define DD4HEP_DDG4_LCIOFILEREADER_H
#include "LCIOEventReader.h"
Andre Sailer
committed
#include <DDG4/EventParameters.h>
Andre Sailer
committed
#include <lcio.h>
using namespace lcio ;
// Forward declarations
namespace IO { class LCReader; }
/// Namespace for the AIDA detector description toolkit
/// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
Andre Sailer
committed
/// get the parameters from the input LCIO Event and store them in the EventParameters extension
template <class T=EVENT::LCParameters> void EventParameters::ingestParameters(T const& source) {
EVENT::StringVec intKeys;
EVENT::StringVec floatKeys;
EVENT::StringVec stringKeys;
source.getIntKeys(intKeys);
source.getFloatKeys(floatKeys);
source.getStringKeys(stringKeys);
Andre Sailer
committed
for(auto const& key: intKeys) {
EVENT::IntVec intVec;
source.getIntVals(key,intVec);
Andre Sailer
committed
}
for(auto const& key: floatKeys) {
EVENT::FloatVec floatVec;
source.getFloatVals(key,floatVec);
Andre Sailer
committed
}
for(auto const& key: stringKeys) {
EVENT::StringVec stringVec;
source.getStringVals(key,stringVec);
Andre Sailer
committed
}
}
/// Base class to read lcio event files
/**
* \author P.Kostka (main author)
* \author M.Frank (code reshuffeling into new DDG4 scheme)
* \author R.Ete (added event parameters in event context)
* \version 1.0
* \ingroup DD4HEP_SIMULATION
class LCIOFileReader : public LCIOEventReader {
protected:
/// Reference to reader object
IO::LCReader* m_reader;
std::string m_collectionName;
LCIOFileReader(const std::string& nam);
virtual ~LCIOFileReader();
/// Read an event and fill a vector of MCParticles.
Markus Frank
committed
virtual EventReaderStatus readParticleCollection(int event_number, EVENT::LCCollection** particles);
virtual EventReaderStatus moveToEvent(int event_number);
virtual EventReaderStatus skipEvent() { return EVENT_READER_OK; }
virtual EventReaderStatus setParameters(std::map< std::string, std::string >& parameters);
#endif // DD4HEP_DDG4_LCIOFILEREADER_H
#include <DD4hep/Printout.h>
#include <DDG4/Factories.h>
#include <UTIL/ILDConf.h>
DECLARE_GEANT4_EVENT_READER_NS(dd4hep::sim,LCIOFileReader)
dd4hep::sim::LCIOFileReader::LCIOFileReader(const std::string& nam)
, m_collectionName(LCIO::MCPARTICLE)
m_reader = ::lcio::LCFactory::getInstance()->createLCReader(LCReader::directAccess);
printout(INFO,"LCIOFileReader","Created file reader. Try to open input %s",nam.c_str());
m_directAccess = false;
dd4hep::sim::LCIOFileReader::~LCIOFileReader() {
dd4hep::detail::deletePtr(m_reader);
/// moveToSpecifiedEvent, a.k.a. skipNEvents
Geant4EventReader::EventReaderStatus
dd4hep::sim::LCIOFileReader::moveToEvent(int event_number) {
// ::lcio::LCEvent* evt = m_reader->readEvent(/*runNumber*/ 0, event_number);
// fg: direct access does not work if run number is different from 0 and/or event numbers are not stored consecutively
if( m_currEvent == 0 && event_number != 0 ) {
m_reader->skipNEvents( event_number ) ;
Andre Sailer
committed
printout(INFO,"LCIOFileReader::moveToEvent","Skipping the first %d events ", event_number );
printout(INFO,"LCIOFileReader::moveToEvent","Event number before skipping: %d", m_currEvent );
Andre Sailer
committed
printout(INFO,"LCIOFileReader::moveToEvent","Event number after skipping: %d", m_currEvent );
return EVENT_READER_OK;
}
/// Read an event and fill a vector of MCParticles.
Geant4EventReader::EventReaderStatus
dd4hep::sim::LCIOFileReader::readParticleCollection(int /*event_number*/, EVENT::LCCollection** particles) {
::lcio::LCEvent* evt = m_reader->readNextEvent(); // simply read the events sequentially
*particles = evt->getCollection(m_collectionName);
if ( *particles ) {
printout(INFO,"LCIOFileReader","read collection %s from event %d in run %d ",
Andre Sailer
committed
m_collectionName.c_str(), evt->getEventNumber(), evt->getRunNumber());
// Create input event parameters context
try {
Geant4Context* ctx = context();
Andre Sailer
committed
EventParameters *parameters = new EventParameters();
parameters->setRunNumber(evt->getRunNumber());
parameters->setEventNumber(evt->getEventNumber());
parameters->ingestParameters(evt->parameters());
ctx->event().addExtension<EventParameters>(parameters);
}
catch(std::exception &)
{
}
return EVENT_READER_OK;
}
Markus Frank
committed
return EVENT_READER_EOF;
/// Set the parameters for the class, in particular the name of the MCParticle
/// list
Geant4EventReader::EventReaderStatus
dd4hep::sim::LCIOFileReader::setParameters( std::map< std::string, std::string > & parameters ) {
_getParameterValue( parameters, "MCParticleCollectionName", m_collectionName, std::string(LCIO::MCPARTICLE));
return EVENT_READER_OK;
}