Skip to content
Snippets Groups Projects
LCIOFileReader.cpp 5.93 KiB
Newer Older
//==========================================================================
Markus Frank's avatar
Markus Frank committed
//  AIDA Detector description implementation 
//--------------------------------------------------------------------------
Markus Frank's avatar
Markus Frank committed
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
Markus Frank's avatar
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
Markus Frank's avatar
Markus Frank committed

// Framework include files
#include <DDG4/EventParameters.h>
Markus Frank's avatar
Markus Frank committed

// Forward declarations
namespace IO { class LCReader; }

/// Namespace for the AIDA detector description toolkit
Markus Frank's avatar
Markus Frank committed
namespace dd4hep  {
Markus Frank's avatar
Markus Frank committed

  /// Namespace for the Geant4 based simulation part of the AIDA detector description toolkit
Markus Frank's avatar
Markus Frank committed
  namespace sim  {
    /// 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) {
Markus Frank's avatar
Markus Frank committed
      EVENT::StringVec intKeys;
      EVENT::StringVec floatKeys;
      EVENT::StringVec stringKeys;
      source.getIntKeys(intKeys);
      source.getFloatKeys(floatKeys);
      source.getStringKeys(stringKeys);
      for(auto const& key: intKeys) {
        EVENT::IntVec intVec;
        source.getIntVals(key,intVec);
Markus Frank's avatar
Markus Frank committed
        m_intValues[key] = std::move(intVec);
      }
      for(auto const& key: floatKeys) {
        EVENT::FloatVec floatVec;
        source.getFloatVals(key,floatVec);
Markus Frank's avatar
Markus Frank committed
        m_fltValues[key] = std::move(floatVec);
      }
      for(auto const& key: stringKeys) {
        EVENT::StringVec stringVec;
        source.getStringVals(key,stringVec);
Markus Frank's avatar
Markus Frank committed
        m_strValues[key] = std::move(stringVec);
    /// 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
Markus Frank's avatar
Markus Frank committed
     */
    class LCIOFileReader : public LCIOEventReader  {
Markus Frank's avatar
Markus Frank committed
    protected:
      /// Reference to reader object
      IO::LCReader* m_reader;
      std::string m_collectionName;
Markus Frank's avatar
Markus Frank committed
    public:
      /// Initializing constructor
      LCIOFileReader(const std::string& nam);
Markus Frank's avatar
Markus Frank committed
      /// Default destructor
      /// Read an event and fill a vector of MCParticles.
      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); 
Markus Frank's avatar
Markus Frank committed
    };
  }
}
#endif // DD4HEP_DDG4_LCIOFILEREADER_H
Markus Frank's avatar
Markus Frank committed

#include <DD4hep/Printout.h>
#include <DDG4/Factories.h>
#include <UTIL/ILDConf.h>
Markus Frank's avatar
Markus Frank committed
using namespace dd4hep::sim;
Markus Frank's avatar
Markus Frank committed

// Factory entry
Markus Frank's avatar
Markus Frank committed
DECLARE_GEANT4_EVENT_READER_NS(dd4hep::sim,LCIOFileReader)
Markus Frank's avatar
Markus Frank committed

/// Initializing constructor
Markus Frank's avatar
Markus Frank committed
dd4hep::sim::LCIOFileReader::LCIOFileReader(const std::string& nam)
: LCIOEventReader(nam)
, m_collectionName(LCIO::MCPARTICLE)
Markus Frank's avatar
Markus Frank committed
{
  m_reader = ::lcio::LCFactory::getInstance()->createLCReader(LCReader::directAccess);
  printout(INFO,"LCIOFileReader","Created file reader. Try to open input %s",nam.c_str());
Markus Frank's avatar
Markus Frank committed
  m_reader->open(nam);
Markus Frank's avatar
Markus Frank committed
}

/// Default destructor
Markus Frank's avatar
Markus Frank committed
dd4hep::sim::LCIOFileReader::~LCIOFileReader()    {
  dd4hep::detail::deletePtr(m_reader);
/// moveToSpecifiedEvent, a.k.a. skipNEvents
Geant4EventReader::EventReaderStatus
Markus Frank's avatar
Markus Frank committed
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 ) ;
    printout(INFO,"LCIOFileReader::moveToEvent","Skipping the first %d events ", event_number );
    printout(INFO,"LCIOFileReader::moveToEvent","Event number before skipping: %d", m_currEvent );
    m_currEvent = event_number;
    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
Markus Frank's avatar
Markus Frank committed
dd4hep::sim::LCIOFileReader::readParticleCollection(int /*event_number*/, EVENT::LCCollection** particles)  {
  ::lcio::LCEvent* evt = m_reader->readNextEvent(); // simply read the events sequentially 
  ++m_currEvent ;
Markus Frank's avatar
Markus Frank committed
  if ( evt ) {
    *particles = evt->getCollection(m_collectionName);
      printout(INFO,"LCIOFileReader","read collection %s from event %d in run %d ", 
               m_collectionName.c_str(), evt->getEventNumber(), evt->getRunNumber());
      try {
        Geant4Context* ctx = context();
        EventParameters *parameters = new EventParameters();
        parameters->setRunNumber(evt->getRunNumber());
        parameters->setEventNumber(evt->getEventNumber());
        parameters->ingestParameters(evt->parameters());
        ctx->event().addExtension<EventParameters>(parameters);
Markus Frank's avatar
Markus Frank committed
  }
/// 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;
}