16#include "HepMC3/ReaderFactory_fwd.h"
26InputInfo::InputInfo (
const std::string &filename) {
28 if (filename.find(
"http://") != std::string::npos) m_remote =
true;
29 if (filename.find(
"https://") != std::string::npos) m_remote =
true;
30 if (filename.find(
"root://") != std::string::npos) m_remote =
true;
31 if (filename.find(
"gsidcap://") != std::string::npos) m_remote =
true;
35 struct stat buffer {};
36#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
37 if (!(stat (filename.c_str(), &buffer) == 0))
39 if (!(stat (filename.c_str(), &buffer) == 0 && (S_ISFIFO(buffer.st_mode) || S_ISREG(buffer.st_mode) || S_ISLNK(buffer.st_mode))))
42 HEPMC3_ERROR_LEVEL(100,
"deduce_reader: file " << filename <<
" does not exist or is not a regular file/FIFO/link")
43 m_reader = std::shared_ptr<
Reader> (
nullptr);
48 std::shared_ptr< std::ifstream > file = std::make_shared< std::ifstream >(filename);
51 HEPMC3_ERROR_LEVEL(100,
"deduce_reader could not open file for testing HepMC version: " << filename)
52 m_reader = std::shared_ptr<Reader> (
nullptr);
56 if (!file->is_open()) {
57 HEPMC3_ERROR_LEVEL(100,
"deduce_reader could not open file for testing HepMC version: " << filename)
59 m_reader = std::shared_ptr<Reader> (
nullptr);
64#if defined(__linux__) || defined(__darwin__)|| defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun)
65 m_pipe = S_ISFIFO(buffer.st_mode);
67 HEPMC3_DEBUG(10,
"deduce_reader: the file " << filename <<
" is a pipe");
76 while (std::getline( *(file.get()), line) && nonempty < 3) {
77 if (line.empty())
continue;
79 m_head.push_back(line);
84 m_head.emplace_back(
"");
85 m_head.emplace_back(
"");
92void InputInfo::classify() {
94 if ( strncmp(m_head.at(0).c_str(),
"root", 4) == 0 ) m_root =
true;
95 if ( strncmp(m_head.at(0).c_str(),
"hmpb", 4) == 0 ) m_protobuf =
true;
96 if ( strncmp(m_head.at(0).c_str(),
"HepMC::Version", 14) == 0 && strncmp(m_head.at(1).c_str(),
"HepMC::Asciiv3", 14) == 0 ) m_asciiv3 =
true;
97 if ( strncmp(m_head.at(0).c_str(),
"HepMC::Version", 14) == 0 && strncmp(m_head.at(1).c_str(),
"HepMC::IO_GenEvent", 18) == 0 ) m_iogenevent =
true;
98 if ( strncmp(m_head.at(0).c_str(),
"<LesHouchesEvents", 17) == 0) m_lhef=
true;
100 std::stringstream st_e(m_head.at(0));
107 if (!(st_e >> attr)) {
111 if (attr ==
' ')
continue;
116 HEPEVT =
static_cast<bool>(st_e >> m_i >> m_p);
119 if (HEPEVT) m_hepevt=
true;
127 const size_t raw_header_size = 100;
128 std::string raw_header(raw_header_size + 1,
'\0');
129 auto* fstream =
dynamic_cast<std::ifstream*
>(&stream);
131 fstream->read(&raw_header.front(), raw_header_size);
133 stream.read(&raw_header.front(), raw_header_size);
135 std::vector<std::string> head;
136 head.emplace_back(
"");
137 for (
size_t i = 0; i < raw_header_size; ++i) {
138 const char c = raw_header[i];
139 if (c ==
'\0')
break;
141 if (head.back().length() != 0) {
142 head.emplace_back(
"");
148 head.emplace_back(
"");
150 for (
size_t i = 0; i < raw_header_size; ++i) {
static_cast<std::filebuf*
>(fstream->rdbuf())->sungetc(); }
151 HEPMC3_DEBUG(10,
"After sungetc() fstream->good()=" + std::to_string(fstream->good()));
153 for (
size_t i = 0; i < raw_header_size; ++i) { stream.rdbuf()->sungetc(); }
154 HEPMC3_DEBUG(10,
"After sungetc() stream.good()=" + std::to_string(stream.good()));
164 if (input.m_protobuf) {
165 return std::make_shared<ReaderPlugin>(stream,libHepMC3protobufIO,std::string(
"newReaderprotobufstream"));
167 return input.native_reader(stream);
177 const size_t raw_header_size = 100;
178 std::string raw_header(raw_header_size + 1,
'\0');
179 auto fstream = std::dynamic_pointer_cast<std::ifstream>(stream);
181 fstream->read(&raw_header.front(), raw_header_size);
183 stream->read(&raw_header.front(), raw_header_size);
185 std::vector<std::string> head;
186 head.emplace_back(
"");
187 for (
size_t i = 0; i < raw_header_size; ++i) {
188 const char c = raw_header[i];
189 if (c ==
'\0')
break;
191 if (head.back().length() != 0) {
192 head.emplace_back(
"");
198 head.emplace_back(
"");
200 for (
size_t i = 0; i < raw_header_size; ++i) {
static_cast<std::filebuf*
>(fstream->rdbuf())->sungetc(); }
201 HEPMC3_DEBUG(10,
"After sungetc() fstream->good()="+ std::to_string(fstream->good()));
203 for (
size_t i = 0; i < raw_header_size; ++i) { stream->rdbuf()->sungetc(); }
204 HEPMC3_DEBUG(10,
"After sungetc() stream->good()="+ std::to_string(stream->good()));
216 if (input.m_protobuf) {
217 return std::make_shared<ReaderPlugin>(stream,libHepMC3protobufIO,std::string(
"newReaderprotobufspstream"));
219 return input.native_reader(stream);
#define HEPMC3_WARNING_LEVEL(LEVEL, MESSAGE)
Macro for printing HEPMC3_HEPMC3_WARNING messages.
#define HEPMC3_ERROR_LEVEL(LEVEL, MESSAGE)
Macro for printing error messages.
#define HEPMC3_DEBUG(LEVEL, MESSAGE)
Macro for printing debug messages with appropriate debug level.
Definition of class ReaderAsciiHepMC2.
Definition of class ReaderAscii.
Definition of class ReaderHEPEVT.
Definition of class ReaderLHEF.
Definition of class ReaderPlugin.
Base class for all I/O readers.
std::shared_ptr< Reader > deduce_reader(const std::string &filename)
This function deduces the type of input file based on the name/URL and its content,...