diff --git a/cython/tdm_reaper.pyx b/cython/py_tdm_reaper.pyx similarity index 77% rename from cython/tdm_reaper.pyx rename to cython/py_tdm_reaper.pyx index 6f43bbf..7bf9cab 100644 --- a/cython/tdm_reaper.pyx +++ b/cython/py_tdm_reaper.pyx @@ -1,17 +1,18 @@ +# distutils: language = c++ -from tdm_reaper cimport tdmreaper -import numpy as np -import re -import os +from tdm_reaper cimport tdm_reaper +# import numpy as np +# import re +# import os -cdef class tdm_reaper: +cdef class tdmreaper: # C++ instance of class => stack allocated (requires nullary constructor!) - cdef tdm_reaper tdmrip + cdef tdm_reaper cpp_tdm # constructor - def __cinit__(self): - self.tdmrip = tdm_reaper() + def __cinit__(self, string tdmfile, string tdxfile): + self.cpp_tdm = tdm_reaper(tdmfile,tdxfile) # def set_file(self, string rawfile): # if not os.path.isfile(rawfile) : diff --git a/cython/setup.py b/cython/setup.py index 3a79dc8..f005526 100644 --- a/cython/setup.py +++ b/cython/setup.py @@ -4,7 +4,7 @@ from Cython.Build import cythonize extensions = Extension( name="tdm_reaper", - sources=["cython/tdm_reaper.pyx"], + sources=["cython/py_tdm_reaper.pyx"], # libraries=[""], # library_dirs=["lib"], include_dirs=["lib","pugixml"], diff --git a/cython/tdm_reaper.pxd b/cython/tdm_reaper.pxd index 4aa84b3..4644486 100644 --- a/cython/tdm_reaper.pxd +++ b/cython/tdm_reaper.pxd @@ -1,15 +1,18 @@ # cython: language_level = 3 -# distutils: language = c++ # use some C++ STL libraries from libcpp.string cimport string -from libcpp.vector cimport vector -from libcpp cimport bool +# from libcpp.vector cimport vector +# from libcpp cimport bool + +cdef extern from "tdm_reaper.cpp": + pass cdef extern from "tdm_reaper.hpp": - cdef cppclass tdmreaper: - # constructor(s) - tdmreaper() except + + cdef cppclass tdm_reaper: + # constructor(s) + tdm_reaper() except + + tdm_reaper(string tdmfile, string tdxfile) except + # set new file for decoding # void set_file(string) # # perform conversion (pass any C++ exceptions to Python) diff --git a/lib/tdm_reaper.cpp b/lib/tdm_reaper.cpp index 86a7d7c..e82f88b 100644 --- a/lib/tdm_reaper.cpp +++ b/lib/tdm_reaper.cpp @@ -40,93 +40,62 @@ void tdm_reaper::process_tdm(bool showlog) } // set up xml-parser and load tdm-file + pugi::xml_document xml_doc; + pugi::xml_parse_result xml_result; try { // load XML document from stream std::ifstream fin(tdmfile_.c_str()); - xml_result_ = xml_doc_.load(fin); + xml_result = xml_doc.load(fin); fin.close(); - // xml_result_ = xml_doc_.load_file(tdmfile_.c_str()); + // xml_result = xml_doc_.load_file(tdmfile_.c_str()); if ( showlog ) { - std::cout<<"\nloading "<check_datatype_consistency(); for ( tdm_datatype el: tdm_datatypes ) { - if ( el.name_ == "eInt16Usi" ) - { - if ( el.size_ != sizeof(eInt16Usi) ) throw std::logic_error("invalid representation of eInt16Usi"); - } - else if ( el.name_ == "eInt32Usi" ) - { - if ( el.size_ != sizeof(eInt32Usi) ) throw std::logic_error("invalid representation of eInt32Usi"); - } - else if ( el.name_ == "eUInt8Usi" ) - { - if ( el.size_ != sizeof(eUInt8Usi) ) throw std::logic_error("invalid representation of eUInt8Usi"); - } - else if ( el.name_ == "eUInt16Usi" ) - { - if ( el.size_ != sizeof(eUInt16Usi) ) throw std::logic_error("invalid representation of eUInt16Usi"); - } - else if ( el.name_ == "eUInt32Usi" ) - { - if ( el.size_ != sizeof(eUInt32Usi) ) throw std::logic_error("invalid representation of eUInt32Usi"); - } - else if ( el.name_ == "eFloat32Usi" ) - { - if ( el.size_ != sizeof(eFloat32Usi) ) throw std::logic_error("invalid representation of eFloat32Usi"); - } - else if ( el.name_ == "eFloat64Usi" ) - { - if ( el.size_ != sizeof(eFloat64Usi) ) throw std::logic_error("invalid representation of eFloat64Usi"); - } - else - { - throw std::logic_error("missing datatype validation"); - } - tdmdt_name_.insert(std::pair(el.name_,el)); tdmdt_chan_.insert(std::pair(el.channel_datatype_,el)); } // process elements of XML - this->process_include(showlog); - this->process_root(showlog); - this->process_channelgroups(showlog); - this->process_channels(showlog); - this->process_submatrices(showlog); - this->process_localcolumns(showlog); + this->process_include(showlog,xml_doc); + this->process_root(showlog,xml_doc); + this->process_channelgroups(showlog,xml_doc); + this->process_channels(showlog,xml_doc); + this->process_submatrices(showlog,xml_doc); + this->process_localcolumns(showlog,xml_doc); // open .tdx and stream all binary data into buffer try { @@ -147,10 +116,10 @@ void tdm_reaper::process_tdm(bool showlog) } } -void tdm_reaper::process_include(bool showlog) +void tdm_reaper::process_include(bool showlog, pugi::xml_document& xml_doc) { // get XML node - pugi::xml_node tdmincl = xml_doc_.child("usi:tdm").child("usi:include"); + pugi::xml_node tdmincl = xml_doc.child("usi:tdm").child("usi:include"); // check endianness std::string endianness(tdmincl.child("file").attribute("byteOrder").value()); @@ -201,11 +170,11 @@ void tdm_reaper::process_include(bool showlog) if ( showlog ) std::cout<<"number of blocks: "< - pugi::xml_node tdmdata = xml_doc_.child("usi:tdm").child("usi:data"); + pugi::xml_node tdmdata = xml_doc.child("usi:tdm").child("usi:data"); // find all its elements for ( pugi::xml_node group = tdmdata.child("tdm_channelgroup"); group; @@ -259,10 +228,10 @@ void tdm_reaper::process_channelgroups(bool showlog) if ( showlog ) std::cout<<"number of channelgroups: "< - pugi::xml_node tdmdata = xml_doc_.child("usi:tdm").child("usi:data"); + pugi::xml_node tdmdata = xml_doc.child("usi:tdm").child("usi:data"); // find all its elements for ( pugi::xml_node channel = tdmdata.child("tdm_channel"); channel; @@ -303,10 +272,10 @@ void tdm_reaper::process_channels(bool showlog) if ( showlog ) std::cout<<"number of channels: "< - pugi::xml_node tdmdata = xml_doc_.child("usi:tdm").child("usi:data"); + pugi::xml_node tdmdata = xml_doc.child("usi:tdm").child("usi:data"); // find all its elements for ( pugi::xml_node subm = tdmdata.child("submatrix"); subm; @@ -342,10 +311,10 @@ void tdm_reaper::process_submatrices(bool showlog) if ( showlog ) std::cout<<"number of submatrices: "< - pugi::xml_node tdmdata = xml_doc_.child("usi:tdm").child("usi:data"); + pugi::xml_node tdmdata = xml_doc.child("usi:tdm").child("usi:data"); // find all its elements for ( pugi::xml_node loccol = tdmdata.child("localcolumn"); loccol; @@ -786,6 +755,79 @@ void tdm_reaper::print_group(std::string &id, const char* filename, bool include // -------------------------------------------------------------------------- // +void tdm_reaper::check_local_datatypes() +{ + std::cout<<"\nmachine's C++ datatypes:\n"; + std::cout< void tdm_reaper::convert_data_to_type(std::vector &buffer, std::vector &channel) diff --git a/lib/tdm_reaper.hpp b/lib/tdm_reaper.hpp index c4ed66d..32a0a2a 100644 --- a/lib/tdm_reaper.hpp +++ b/lib/tdm_reaper.hpp @@ -33,10 +33,6 @@ class tdm_reaper // set of .csv files (encoding mode) std::vector csvfile_; - // XML parser - pugi::xml_document xml_doc_; - pugi::xml_parse_result xml_result_; - // endianness (true = little, false = big) bool endianness_, machine_endianness_; @@ -84,69 +80,36 @@ class tdm_reaper return listofids; } -public: - - // check machine's datatypes - // https://en.cppreference.com/w/cpp/language/types - void check_local_datatypes() - { - std::cout<<"\nmachine's C++ datatypes:\n"; - std::cout< csvfile); + // tdm_reaper(std::vector csvfile); // decoding tdm_reaper(); - tdm_reaper(std::string tdmfile, std::string tdxfile = std::string(""), bool showlog = false); + tdm_reaper(std::string tdmfile, std::string tdxfile = std::string(""), + bool showlog = false); // provide (tdm,tdx) files - void submit_files(std::string tdmfile, std::string tdxfile = std::string(""), bool showlog = false); + void submit_files(std::string tdmfile, std::string tdxfile = std::string(""), + bool showlog = false); // process TDM data model in tdm file void process_tdm(bool showlog); // process element - void process_include(bool showlog); + void process_include(bool showlog, pugi::xml_document& xml_doc); // extract tdm_root - void process_root(bool showlog); + void process_root(bool showlog, pugi::xml_document& xml_doc); // process/list all channels and groups - void process_channelgroups(bool showlog); - void process_channels(bool showlog); + void process_channelgroups(bool showlog, pugi::xml_document& xml_doc); + void process_channels(bool showlog, pugi::xml_document& xml_doc); // process submatrices and localcolumns - void process_submatrices(bool showlog); - void process_localcolumns(bool showlog); + void process_submatrices(bool showlog, pugi::xml_document& xml_doc); + void process_localcolumns(bool showlog, pugi::xml_document& xml_doc); // get meta-data tdm_meta get_meta() @@ -218,12 +181,19 @@ public: void print_channel(std::string &id, const char* filename, bool include_meta = true); void print_group(std::string &id, const char* filename, bool include_meta = true, char sep = ' '); + // check machine's datatypes + // https://en.cppreference.com/w/cpp/language/types + void check_local_datatypes(); + private: template void convert_data_to_type(std::vector &buffer, std::vector &channel); + // check consistency of mapped datatypes between C++ and TDM datatypes + void check_datatype_consistency(); + }; #endif diff --git a/makefile b/makefile index 0e26f56..4c643ec 100644 --- a/makefile +++ b/makefile @@ -74,7 +74,7 @@ cython-help : cython/setup.py cython-list : cython/setup.py python3 $< --name --description --author --author-email --url -cython-build : cython/setup.py cython/tdm_reaper.pyx cython/tdm_reaper.pyx +cython-build : cython/setup.py cython/tdm_reaper.pxd cython/py_tdm_reaper.pyx $(HPP) lib/tdm_reaper.cpp python3 $< build_ext --inplace # python3 $< build_ext @@ -82,8 +82,8 @@ cython-install : cython/setup.py cython/tdm_reaper.pyx cython/tdm_reaper.pyx python3 $< install clean-cython : - rm -vf cython/tdm_reaper.cpp tdm_reaper.cpython-*.so - rm -r build + rm -vf cython/py_tdm_reaper.cpp tdm_reaper.cpython-*.so + rm -rf build # --------------------------------------------------------------------------- #