HepMC3 event record library
ReaderRoot.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // This file is part of HepMC
4 // Copyright (C) 2014-2019 The HepMC collaboration (see AUTHORS for details)
5 //
6 /**
7  * @file ReaderRoot.cc
8  * @brief Implementation of \b class ReaderRoot
9  *
10  */
11 #include "HepMC3/ReaderRoot.h"
12 
13 namespace HepMC3 {
14 
15 ReaderRoot::ReaderRoot(const std::string &filename) {
16 
17  m_file = TFile::Open(filename.c_str());
18  m_next = new TIter(m_file->GetListOfKeys());
19 
20  if ( !m_file->IsOpen() ) {
21  ERROR( "ReaderRoot: problem opening file: " << filename )
22  return;
23  }
24 
25  shared_ptr<GenRunInfo> ri = make_shared<GenRunInfo>();
26 
27  GenRunInfoData *run = reinterpret_cast<GenRunInfoData*>(m_file->Get("GenRunInfoData"));
28 
29  if(run) {
30  ri->read_data(*run);
31  delete run;
32  }
33 
34  set_run_info(ri);
35 }
36 
38 
39  // Skip object of different type than GenEventData
40  GenEventData *data = nullptr;
41 
42  while(true) {
43  TKey *key = (TKey*) (*m_next)();
44 
45  if( !key ) {
46  m_file->Close();
47  return false;
48  }
49 
50  const char *cl = key->GetClassName();
51 
52  if( !cl ) continue;
53  size_t geneventdata30=strncmp(cl,"HepMC::GenEventData",19);
54  size_t geneventdata31=strncmp(cl,"HepMC3::GenEventData",20);
55  if( geneventdata31==0 || geneventdata30==0 ) {
56  if (geneventdata30==0) WARNING( "ReaderRoot::read_event: The object was written with HepMC3 version 3.0" )
57  data = reinterpret_cast<GenEventData*>(key->ReadObj());
58  break;
59  }
60  }
61 
62  if( !data ) {
63  ERROR("ReaderRoot: could not read event from root file")
64  m_file->Close();
65  return false;
66  }
67 
68  evt.read_data(*data);
69  evt.set_run_info( run_info() );
70 
71  delete data;
72  return true;
73 }
74 
76  m_file->Close();
77 }
78 
80  if ( !m_file->IsOpen() ) return true;
81 
82  return false;
83 }
84 
85 } // namespace HepMC3
ERROR
#define ERROR(MESSAGE)
Macro for printing error messages.
Definition: Errors.h:23
ReaderRoot.h
Definition of class ReaderRoot.
HepMC3::GenEvent
Stores event-related information.
Definition: GenEvent.h:42
HepMC3::ReaderRoot::read_event
bool read_event(GenEvent &evt)
Read event from file.
Definition: ReaderRoot.cc:37
HepMC3
HepMC3 main namespace.
Definition: ReaderGZ.h:28
HepMC3::GenEventData
Stores serializable event information.
Definition: GenEventData.h:26
HepMC3::GenEvent::set_run_info
void set_run_info(shared_ptr< GenRunInfo > run)
Set the GenRunInfo object by smart pointer.
Definition: GenEvent.h:129
HepMC3::ReaderRoot::m_file
TFile * m_file
File handler.
Definition: ReaderRoot.h:60
HepMC3::ReaderRoot::ReaderRoot
ReaderRoot(const std::string &filename)
Default constructor.
Definition: ReaderRoot.cc:15
HepMC3::GenRunInfoData
Stores serializable run information.
Definition: GenRunInfoData.h:23
HepMC3::Reader::run_info
shared_ptr< GenRunInfo > run_info() const
Get the global GenRunInfo object.
Definition: Reader.h:39
HepMC3::ReaderRoot::failed
bool failed()
Get stream error state.
Definition: ReaderRoot.cc:79
WARNING
#define WARNING(MESSAGE)
Macro for printing warning messages.
Definition: Errors.h:26
HepMC3::Reader::set_run_info
void set_run_info(shared_ptr< GenRunInfo > run)
Set the global GenRunInfo object.
Definition: Reader.h:46
HepMC3::ReaderRoot::m_next
TIter * m_next
Iterator for event reading.
Definition: ReaderRoot.h:61
HepMC3::GenEvent::read_data
void read_data(const GenEventData &data)
Fill GenEvent based on GenEventData.
Definition: GenEvent.cc:705
HepMC3::ReaderRoot::close
void close()
Close file stream.
Definition: ReaderRoot.cc:75