EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HepMC_3_2_4_ReaderFactory.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file HepMC_3_2_4_ReaderFactory.h
1 // -*- C++ -*-
2 //
3 // This file is part of HepMC
4 // Copyright (C) 2014-2020 The HepMC collaboration (see AUTHORS for details)
5 //
6 #ifndef HEPMC3_READERFACTORY_H
7 #define HEPMC3_READERFACTORY_H
8 
9 #include <memory>
10 #include <string>
11 #include <sys/stat.h>
12 #include <string.h>
13 
14 #include "HepMC3/ReaderAscii.h"
15 #include "HepMC3/ReaderAsciiHepMC2.h"
16 #include "HepMC3/ReaderHEPEVT.h"
17 #include "HepMC3/ReaderLHEF.h"
18 #include "HepMC3/ReaderPlugin.h"
19 
20 namespace HepMC3 {
21 
22 
23 std::shared_ptr<Reader> deduce_reader(std::istream &stream);
24 
25 
33 std::shared_ptr<Reader> deduce_reader(const std::string &filename)
34 {
35  std::string libHepMC3rootIO = "libHepMC3rootIO.so.3";
36 #if defined(__darwin__) || defined(__APPLE__)
37  libHepMC3rootIO = "libHepMC3rootIO.dylib";
38 #endif
39 #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
40  libHepMC3rootIO = "HepMC3rootIO.dll";
41 #endif
42  bool remote = false;
43  bool pipe = false;
44  if (filename.find("http://") != std::string::npos) remote = true;
45  if (filename.find("https://") != std::string::npos) remote = true;
46  if (filename.find("root://") != std::string::npos) remote = true;
47  if (filename.find("gsidcap://") != std::string::npos) remote = true;
48 
49  std::vector<std::string> head;
50  if (!remote)
51  {
52  struct stat buffer;
53 #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
54  if (!(stat (filename.c_str(), &buffer)==0))
55 #else
56  if (!(stat (filename.c_str(), &buffer)==0 && (S_ISFIFO(buffer.st_mode) || S_ISREG(buffer.st_mode) || S_ISLNK(buffer.st_mode))))
57 #endif
58  {
59  HEPMC3_ERROR("deduce_reader: file " << filename << " does not exist or is not a regular file/FIFO/link");
60  return std::shared_ptr<Reader> (nullptr);
61  }
62 
63  std::ifstream* file= new std::ifstream(filename);
64  if (!file)
65  {
66  HEPMC3_ERROR("deduce_reader could not open file for testing HepMC version: " << filename);
67  return std::shared_ptr<Reader>(nullptr);
68  }
69  if (!file->is_open()) {
70  HEPMC3_ERROR("deduce_reader could not open file for testing HepMC version: " << filename);
71  file->close();
72  return std::shared_ptr<Reader>(nullptr);
73  }
74 
75 #if defined(__linux__) || defined(__darwin__)|| defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun)
76  pipe = S_ISFIFO(buffer.st_mode);
77  if (pipe) {
78  HEPMC3_DEBUG(0, "deduce_reader: the file " << filename << " is a pipe");
79  return deduce_reader(*file);
80  }
81 #endif
82 
83  std::string line;
84  size_t nonempty = 0;
85  while (std::getline(*file, line) && nonempty < 3) {
86  if (line.empty()) continue;
87  nonempty++;
88  head.push_back(line);
89  }
90  file->close();
91  delete file;
92  }
93  // Assure there are at least two elements in the vector:
94  head.push_back("");
95  head.push_back("");
96  HEPMC3_DEBUG(0, "deduce_reader: Attempt ReaderRootTree for " << filename);
97  if ( strncmp(head.at(0).c_str(), "root", 4) == 0 || remote)
98  return std::make_shared<ReaderPlugin>(filename,libHepMC3rootIO,std::string("newReaderRootTreefile"));
99  if (!remote)
100  {
101  HEPMC3_DEBUG(0, "Attempt ReaderAscii for " << filename);
102  if ( strncmp(head.at(0).c_str(),"HepMC::Version",14) == 0 && strncmp(head.at(1).c_str(), "HepMC::Asciiv3", 14) == 0 )
103  return std::shared_ptr<Reader>((Reader*) ( new ReaderAscii(filename)));
104  HEPMC3_DEBUG(0, "Attempt ReaderAsciiHepMC2 for " << filename);
105  if ( strncmp(head.at(0).c_str(),"HepMC::Version",14) == 0 && strncmp(head.at(1).c_str(), "HepMC::IO_GenEvent", 18) == 0 )
106  return std::shared_ptr<Reader>((Reader*) ( new ReaderAsciiHepMC2(filename)));
107  HEPMC3_DEBUG(0, "Attempt ReaderLHEF for " << filename);
108  if ( strncmp(head.at(0).c_str(), "<LesHouchesEvents", 17) == 0)
109  return std::shared_ptr<Reader>((Reader*) ( new ReaderLHEF(filename)));
110  HEPMC3_DEBUG(0, "Attempt ReaderHEPEVT for " << filename);
111  std::stringstream st_e(head.at(0).c_str());
112  char attr = ' ';
113  bool HEPEVT = true;
114  int m_i,m_p;
115  while (true)
116  {
117  if (!(st_e>>attr)) {
118  HEPEVT=false;
119  break;
120  }
121  if (attr == ' ') continue;
122  if (attr != 'E') {
123  HEPEVT = false;
124  break;
125  }
126  HEPEVT=static_cast<bool>(st_e >> m_i >> m_p);
127  break;
128  }
129  if (HEPEVT) return std::shared_ptr<Reader>((Reader*) ( new ReaderHEPEVT(filename)));
130  }
131  HEPMC3_DEBUG(0, "deduce_reader: all attempts failed for " << filename);
132  return std::shared_ptr<Reader>(nullptr);
133 }
134 
135 
137 std::shared_ptr<Reader> deduce_reader(std::istream &stream)
138 {
139  std::vector<std::string> head;
140  head.push_back("");
141  size_t back = 0;
142  size_t backnonempty = 0;
143  while ( (back < 200 && backnonempty < 100) && stream) {
144  char c = stream.get();
145  back++;
146  if (c=='\n') {
147  if (head.back().length() != 0) head.push_back("");
148  } else {
149  head.back() += c;
150  backnonempty++;
151  }
152  }
153  if (!stream)
154  {
155  HEPMC3_WARNING("Input stream is too short or invalid.");
156  return std::shared_ptr<Reader>(nullptr);
157  }
158 
159  for (size_t i = 0; i < back; i++) stream.unget();
160 
161  if ( strncmp(head.at(0).c_str(), "HepMC::Version", 14) == 0 && strncmp(head.at(1).c_str(), "HepMC::Asciiv3", 14) == 0 )
162  {
163  HEPMC3_DEBUG(0, "Attempt ReaderAscii");
164  return std::shared_ptr<Reader>((Reader*) ( new ReaderAscii(stream)));
165  }
166 
167  if ( strncmp(head.at(0).c_str(), "HepMC::Version", 14) == 0 && strncmp(head.at(1).c_str(), "HepMC::IO_GenEvent", 18) == 0 )
168  {
169  HEPMC3_DEBUG(0, "Attempt ReaderAsciiHepMC2");
170  return std::shared_ptr<Reader>((Reader*) ( new ReaderAsciiHepMC2(stream)));
171  }
172 
173  if ( strncmp(head.at(0).c_str(), "<LesHouchesEvents", 17) == 0)
174  {
175  HEPMC3_DEBUG(0, "Attempt ReaderLHEF");
176  return std::shared_ptr<Reader>((Reader*) ( new ReaderLHEF(stream)));
177  }
178  HEPMC3_DEBUG(0, "Attempt ReaderHEPEVT");
179  std::stringstream st_e(head.at(0).c_str());
180  char attr = ' ';
181  bool HEPEVT = true;
182  int m_i, m_p;
183  while (true)
184  {
185  if (!(st_e>>attr)) {
186  HEPEVT = false;
187  break;
188  }
189  if (attr == ' ') continue;
190  if (attr != 'E') {
191  HEPEVT = false;
192  break;
193  }
194  HEPEVT = static_cast<bool>(st_e >> m_i >> m_p);
195  break;
196  }
197  if (HEPEVT) return std::shared_ptr<Reader>((Reader*) ( new ReaderHEPEVT(stream)));
198  HEPMC3_DEBUG(0, "deduce_reader: all attempts failed");
199  return std::shared_ptr<Reader>(nullptr);
200 }
201 }
202 #endif