File indexing completed on 2024-09-28 07:02:49
0001
0002
0003
0004
0005
0006 #ifndef HEPMC3_READERFACTORY_H
0007 #define HEPMC3_READERFACTORY_H
0008
0009 #include <memory>
0010 #include <string>
0011 #include <sys/stat.h>
0012 #include <string.h>
0013
0014 #include "HepMC3/ReaderAscii.h"
0015 #include "HepMC3/ReaderAsciiHepMC2.h"
0016 #include "HepMC3/ReaderHEPEVT.h"
0017 #include "HepMC3/ReaderLHEF.h"
0018 #include "HepMC3/ReaderPlugin.h"
0019
0020 namespace HepMC3 {
0021
0022
0023 std::shared_ptr<Reader> deduce_reader(std::istream &stream);
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 std::shared_ptr<Reader> deduce_reader(const std::string &filename)
0034 {
0035 std::string libHepMC3rootIO = "libHepMC3rootIO.so.3";
0036 #if defined(__darwin__) || defined(__APPLE__)
0037 libHepMC3rootIO = "libHepMC3rootIO.dylib";
0038 #endif
0039 #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
0040 libHepMC3rootIO = "HepMC3rootIO.dll";
0041 #endif
0042 bool remote = false;
0043 bool pipe = false;
0044 if (filename.find("http://") != std::string::npos) remote = true;
0045 if (filename.find("https://") != std::string::npos) remote = true;
0046 if (filename.find("root://") != std::string::npos) remote = true;
0047 if (filename.find("gsidcap://") != std::string::npos) remote = true;
0048
0049 std::vector<std::string> head;
0050 if (!remote)
0051 {
0052 struct stat buffer;
0053 #if (defined(WIN32) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
0054 if (!(stat (filename.c_str(), &buffer)==0))
0055 #else
0056 if (!(stat (filename.c_str(), &buffer)==0 && (S_ISFIFO(buffer.st_mode) || S_ISREG(buffer.st_mode) || S_ISLNK(buffer.st_mode))))
0057 #endif
0058 {
0059 HEPMC3_ERROR("deduce_reader: file " << filename << " does not exist or is not a regular file/FIFO/link");
0060 return std::shared_ptr<Reader> (nullptr);
0061 }
0062
0063 std::ifstream* file= new std::ifstream(filename);
0064 if (!file)
0065 {
0066 HEPMC3_ERROR("deduce_reader could not open file for testing HepMC version: " << filename);
0067 return std::shared_ptr<Reader>(nullptr);
0068 }
0069 if (!file->is_open()) {
0070 HEPMC3_ERROR("deduce_reader could not open file for testing HepMC version: " << filename);
0071 file->close();
0072 return std::shared_ptr<Reader>(nullptr);
0073 }
0074
0075 #if defined(__linux__) || defined(__darwin__)|| defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun)
0076 pipe = S_ISFIFO(buffer.st_mode);
0077 if (pipe) {
0078 HEPMC3_DEBUG(0, "deduce_reader: the file " << filename << " is a pipe");
0079 return deduce_reader(*file);
0080 }
0081 #endif
0082
0083 std::string line;
0084 size_t nonempty = 0;
0085 while (std::getline(*file, line) && nonempty < 3) {
0086 if (line.empty()) continue;
0087 nonempty++;
0088 head.push_back(line);
0089 }
0090 file->close();
0091 delete file;
0092 }
0093
0094 head.push_back("");
0095 head.push_back("");
0096 HEPMC3_DEBUG(0, "deduce_reader: Attempt ReaderRootTree for " << filename);
0097 if ( strncmp(head.at(0).c_str(), "root", 4) == 0 || remote)
0098 return std::make_shared<ReaderPlugin>(filename,libHepMC3rootIO,std::string("newReaderRootTreefile"));
0099 if (!remote)
0100 {
0101 HEPMC3_DEBUG(0, "Attempt ReaderAscii for " << filename);
0102 if ( strncmp(head.at(0).c_str(),"HepMC::Version",14) == 0 && strncmp(head.at(1).c_str(), "HepMC::Asciiv3", 14) == 0 )
0103 return std::shared_ptr<Reader>((Reader*) ( new ReaderAscii(filename)));
0104 HEPMC3_DEBUG(0, "Attempt ReaderAsciiHepMC2 for " << filename);
0105 if ( strncmp(head.at(0).c_str(),"HepMC::Version",14) == 0 && strncmp(head.at(1).c_str(), "HepMC::IO_GenEvent", 18) == 0 )
0106 return std::shared_ptr<Reader>((Reader*) ( new ReaderAsciiHepMC2(filename)));
0107 HEPMC3_DEBUG(0, "Attempt ReaderLHEF for " << filename);
0108 if ( strncmp(head.at(0).c_str(), "<LesHouchesEvents", 17) == 0)
0109 return std::shared_ptr<Reader>((Reader*) ( new ReaderLHEF(filename)));
0110 HEPMC3_DEBUG(0, "Attempt ReaderHEPEVT for " << filename);
0111 std::stringstream st_e(head.at(0).c_str());
0112 char attr = ' ';
0113 bool HEPEVT = true;
0114 int m_i,m_p;
0115 while (true)
0116 {
0117 if (!(st_e>>attr)) {
0118 HEPEVT=false;
0119 break;
0120 }
0121 if (attr == ' ') continue;
0122 if (attr != 'E') {
0123 HEPEVT = false;
0124 break;
0125 }
0126 HEPEVT=static_cast<bool>(st_e >> m_i >> m_p);
0127 break;
0128 }
0129 if (HEPEVT) return std::shared_ptr<Reader>((Reader*) ( new ReaderHEPEVT(filename)));
0130 }
0131 HEPMC3_DEBUG(0, "deduce_reader: all attempts failed for " << filename);
0132 return std::shared_ptr<Reader>(nullptr);
0133 }
0134
0135
0136
0137 std::shared_ptr<Reader> deduce_reader(std::istream &stream)
0138 {
0139 std::vector<std::string> head;
0140 head.push_back("");
0141 size_t back = 0;
0142 size_t backnonempty = 0;
0143 while ( (back < 200 && backnonempty < 100) && stream) {
0144 char c = stream.get();
0145 back++;
0146 if (c=='\n') {
0147 if (head.back().length() != 0) head.push_back("");
0148 } else {
0149 head.back() += c;
0150 backnonempty++;
0151 }
0152 }
0153 if (!stream)
0154 {
0155 HEPMC3_WARNING("Input stream is too short or invalid.");
0156 return std::shared_ptr<Reader>(nullptr);
0157 }
0158
0159 for (size_t i = 0; i < back; i++) stream.unget();
0160
0161 if ( strncmp(head.at(0).c_str(), "HepMC::Version", 14) == 0 && strncmp(head.at(1).c_str(), "HepMC::Asciiv3", 14) == 0 )
0162 {
0163 HEPMC3_DEBUG(0, "Attempt ReaderAscii");
0164 return std::shared_ptr<Reader>((Reader*) ( new ReaderAscii(stream)));
0165 }
0166
0167 if ( strncmp(head.at(0).c_str(), "HepMC::Version", 14) == 0 && strncmp(head.at(1).c_str(), "HepMC::IO_GenEvent", 18) == 0 )
0168 {
0169 HEPMC3_DEBUG(0, "Attempt ReaderAsciiHepMC2");
0170 return std::shared_ptr<Reader>((Reader*) ( new ReaderAsciiHepMC2(stream)));
0171 }
0172
0173 if ( strncmp(head.at(0).c_str(), "<LesHouchesEvents", 17) == 0)
0174 {
0175 HEPMC3_DEBUG(0, "Attempt ReaderLHEF");
0176 return std::shared_ptr<Reader>((Reader*) ( new ReaderLHEF(stream)));
0177 }
0178 HEPMC3_DEBUG(0, "Attempt ReaderHEPEVT");
0179 std::stringstream st_e(head.at(0).c_str());
0180 char attr = ' ';
0181 bool HEPEVT = true;
0182 int m_i, m_p;
0183 while (true)
0184 {
0185 if (!(st_e>>attr)) {
0186 HEPEVT = false;
0187 break;
0188 }
0189 if (attr == ' ') continue;
0190 if (attr != 'E') {
0191 HEPEVT = false;
0192 break;
0193 }
0194 HEPEVT = static_cast<bool>(st_e >> m_i >> m_p);
0195 break;
0196 }
0197 if (HEPEVT) return std::shared_ptr<Reader>((Reader*) ( new ReaderHEPEVT(stream)));
0198 HEPMC3_DEBUG(0, "deduce_reader: all attempts failed");
0199 return std::shared_ptr<Reader>(nullptr);
0200 }
0201 }
0202 #endif