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 #include "HepMC3/Version.h"
13 
14 namespace HepMC3 {
15 HEPMC3_DECLARE_READER_FILE(ReaderRoot)
16 
17 ReaderRoot::ReaderRoot(const std::string &filename) {
18 
19  m_file = TFile::Open(filename.c_str());
20  m_next = new TIter(m_file->GetListOfKeys());
21 
22  if ( !m_file->IsOpen() ) {
23  HEPMC3_ERROR( "ReaderRoot: problem opening file: " << filename )
24  return;
25  }
26 
27  std::shared_ptr<GenRunInfo> ri = std::make_shared<GenRunInfo>();
28 
29  GenRunInfoData *run = reinterpret_cast<GenRunInfoData*>(m_file->Get("GenRunInfoData"));
30 
31  if(run) {
32  ri->read_data(*run);
33  delete run;
34  }
35 
36  set_run_info(ri);
37 }
38 
39 bool ReaderRoot::skip(const int n)
40 {
41  GenEvent evt;
42  for (int nn=n; nn>0; --nn)
43  {
44  if (!read_event(evt)) return false;
45  evt.clear();
46  }
47  return !failed();
48 }
49 
51 
52  // Skip object of different type than GenEventData
53  GenEventData *data = nullptr;
54 
55  while(true) {
56  TKey *key = (TKey*) (*m_next)();
57 
58  if( !key ) {
59  m_file->Close();
60  return false;
61  }
62 
63  const char *cl = key->GetClassName();
64 
65  if( !cl ) continue;
66  size_t geneventdata30=strncmp(cl,"HepMC::GenEventData",19);
67  size_t geneventdata31=strncmp(cl,"HepMC3::GenEventData",20);
68  if( geneventdata31==0 || geneventdata30==0 ) {
69  if (geneventdata30==0) HEPMC3_WARNING( "ReaderRoot::read_event: The object was written with HepMC3 version 3.0" )
70  data = reinterpret_cast<GenEventData*>(key->ReadObj());
71  break;
72  }
73  }
74 
75  if( !data ) {
76  HEPMC3_ERROR("ReaderRoot: could not read event from root file")
77  m_file->Close();
78  return false;
79  }
80 
81  evt.read_data(*data);
82  evt.set_run_info( run_info() );
83 
84  delete data;
85  return true;
86 }
87 
89  m_file->Close();
90 }
91 
93  if ( !m_file->IsOpen() ) return true;
94 
95  return false;
96 }
97 
98 } // namespace HepMC3
TIter * m_next
Iterator for event reading.
Definition: ReaderRoot.h:63
#define HEPMC3_WARNING(MESSAGE)
Macro for printing HEPMC3_HEPMC3_WARNING messages.
Definition: Errors.h:26
bool failed() override
Get stream error state.
Definition: ReaderRoot.cc:92
bool read_event(GenEvent &evt) override
Read event from file.
Definition: ReaderRoot.cc:50
Definition of class ReaderRoot.
Stores event-related information.
Definition: GenEvent.h:41
Stores serializable event information.
Definition: GenEventData.h:26
Stores serializable run information.
std::shared_ptr< GenRunInfo > run_info() const
Get the global GenRunInfo object.
Definition: Reader.h:44
void read_data(const GenEventData &data)
Fill GenEvent based on GenEventData.
Definition: GenEvent.cc:703
void set_run_info(std::shared_ptr< GenRunInfo > run)
Set the GenRunInfo object by smart pointer.
Definition: GenEvent.h:128
TFile * m_file
File handler.
Definition: ReaderRoot.h:62
#define HEPMC3_ERROR(MESSAGE)
Macro for printing error messages.
Definition: Errors.h:23
bool skip(const int) override
skip events
Definition: ReaderRoot.cc:39
void close() override
Close file stream.
Definition: ReaderRoot.cc:88
void clear()
Remove contents of this event.
Definition: GenEvent.cc:608
GenEvent I/O parsing and serialization for root files.
Definition: ReaderRoot.h:32