1 // -*- C++ -*- 2 // 3 // This file is part of HepMC 4 // Copyright (C) 2014-2019 The HepMC collaboration (see AUTHORS for details) 5 // 6 #ifndef HEPMC3_READERGZ_H 7 #define HEPMC3_READERGZ_H 8 /// 9 /// @file ReaderGZ.h 10 /// @brief Definition of class \b ReaderGZ 11 /// 12 /// @class HepMC3::ReaderGZ 13 /// @brief GenEvent I/O parsing for structured text files compressed with gzip 14 /// 15 /// @ingroup IO 16 /// 17 #include <string> 18 #include <fstream> 19 #include <istream> 20 #include <string.h> 21 #include "HepMC3/Reader.h" 22 #include "HepMC3/ReaderAscii.h" 23 #include "HepMC3/ReaderAsciiHepMC2.h" 24 #include "HepMC3/ReaderHEPEVT.h" 25 #include "HepMC3/ReaderLHEF.h" 26 #include "HepMC3/GenEvent.h" 27 #include "gzstream.h" 28 namespace HepMC3 { 29 /** @brief Union to hold first 4 byts of file, i.e. magic bytes */ 30 union magic_t { 31 uint8_t bytes[4]; ///< bytes 32 uint32_t number; ///< int 33 }; 34 class ReaderGZ : public Reader { 35 public: 36 /** @brief Construcor*/ ReaderGZ(const std::string & filename)37 ReaderGZ(const std::string& filename) : m_gzstream(filename.c_str()) 38 { 39 std::ifstream file(filename); 40 if(!file.is_open()) { 41 printf("Error in ReaderGZ: could not open file%s\n",filename.c_str()); 42 return; 43 } 44 magic_t my_magic = {0x1f, 0x8b, 0x08, 0x08}; 45 magic_t file_magic; 46 file.read((char *) file_magic.bytes, sizeof(file_magic)); 47 if ( file_magic.number == my_magic.number ) 48 { 49 m_reader=deduce_reader(m_gzstream); 50 } 51 else 52 { 53 printf("Error in ReaderGZ: make sure %s is a gziped file!\n",filename.c_str()); 54 return; 55 } 56 }; 57 ~ReaderGZ()58 ~ReaderGZ() {}; 59 /** @brief Read event */ read_event(GenEvent & evt)60 bool read_event(GenEvent& evt) { 61 return m_reader->read_event(evt); 62 }; 63 /** @brief State */ failed()64 bool failed() { 65 return m_gzstream.rdstate(); 66 } 67 /** @brief Close */ close()68 void close() { 69 if (m_reader) m_reader->close(); 70 }; 71 private: 72 igzstream m_gzstream; ///< Stream to read 73 std::shared_ptr<Reader> m_reader; ///< Actual reader 74 }; 75 } 76 #endif 77