Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-06-01 07:06:39

0001 // -*- C++ -*-
0002 //
0003 // This file is part of HepMC
0004 // Copyright (C) 2014-2020 The HepMC collaboration (see AUTHORS for details)
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  * @brief This function deduces the type of input file based on the name/URL
0028  * and its content, and will return an appropriate Reader object
0029  *
0030  * @todo Too big for inlining: move into a .cc implementation file?
0031  * @todo Need a DEBUG verbosity flag
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     // Assure there are at least two elements in the vector:
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 /** @brief This function will deduce the type of input stream based on its content and will return appropriate Reader*/
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