From 93ed029c33b219f672d1c467e1adf18eb9805366 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Fri, 7 Jun 2019 17:48:49 +0200 Subject: [PATCH] create .csv dump of all metainformation + readme --- README.md | 11 +++++++++++ example.py | 2 ++ lib/tdm_ripper.cpp | 26 ++++++++++++++++++++------ lib/tdm_ripper.hpp | 29 +++++++++++++++++++++++++++-- main.cpp | 4 ++++ makefile | 1 + pytdm_ripper.pyx | 3 +++ tdm_ripper.pxd | 1 + 8 files changed, 69 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a96d199..60ca659 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ # tdm_ripper + +## C++ core + +- XML parser employs pugixml https://pugixml.org/ +- analyse .tdm file +- buffer binary .tdx data +- convert binary data to datatypes according to given .tdm information + +## Cython wrapper + +- enables use as python module diff --git a/example.py b/example.py index 028bb73..cae3b65 100644 --- a/example.py +++ b/example.py @@ -31,6 +31,8 @@ print(RP.meta_info(b"SMP_Name").decode('utf-8')) print(RP.meta_info(b"Location").decode('utf-8')) print('\n') +RP.print_meta(b"meta_information.dat") + # extract channel and return it to numpy array # channels = RP.get_channel(1) # Nlen = len(channels) diff --git a/lib/tdm_ripper.cpp b/lib/tdm_ripper.cpp index 99b07fe..613e9ab 100644 --- a/lib/tdm_ripper.cpp +++ b/lib/tdm_ripper.cpp @@ -115,18 +115,32 @@ void tdm_ripper::parse_structure() int groupcount = 0; for (pugi::xml_node anode: subtreedata.children()) { + // get meta-info contained in tdm_root element + if ( std::string(anode.name()).compare("tdm_root") == 0 ) + { + // preliminiary: extract some hard-coded information tags only + root_info_.insert(std::pair("name",anode.child_value("name"))); + root_info_.insert(std::pair("description",anode.child_value("description"))); + root_info_.insert(std::pair("title",anode.child_value("title"))); + root_info_.insert(std::pair("author",anode.child_value("author"))); + } + if ( std::string(anode.name()).compare("tdm_channelgroup") == 0 ) { groupcount++; - // meta-info is pressumably contained in FIRST channel-group xml tree element - // (eventually identify by name = TESTINFOS ??? ) - if ( groupcount == 1 ) + for ( pugi::xml_node mnode: anode.child("instance_attributes").children() ) { - for ( pugi::xml_node mnode: anode.child("instance_attributes").children() ) + // preliminiary fix for Conti-TDM files since values are one arbitrary tree level above + bool pretdmfix = ( std::string(mnode.child_value()).compare("") == 0 ) ? false : true; + + if ( pretdmfix ) { - meta_info_.insert(std::pair(mnode.attribute("name").value(), - mnode.child_value("s"))); + meta_info_.insert(std::pair(mnode.attribute("name").value(),mnode.child_value())); + } + else + { + meta_info_.insert(std::pair(mnode.attribute("name").value(),mnode.child_value("s"))); } } diff --git a/lib/tdm_ripper.hpp b/lib/tdm_ripper.hpp index 744b959..b8647bf 100644 --- a/lib/tdm_ripper.hpp +++ b/lib/tdm_ripper.hpp @@ -57,7 +57,8 @@ class tdm_ripper pugi::xml_document xml_doc_; pugi::xml_parse_result xml_result_; - // .tdm-file eventually contains some meta information about measurement + // .tdm-file eventually contains some meta information (about measurement) + std::map root_info_; std::map meta_info_; // binary data container @@ -320,7 +321,31 @@ public: // obtain any meta information about .tdm-file if available std::string get_meta(std::string attribute_name) { - return meta_info_[attribute_name]; + // check if key "attribute_name" actually exits + std::map::iterator positer = meta_info_.find(attribute_name); + bool ispresent = ( positer == meta_info_.end() ) ? false : true; + + return ispresent ? meta_info_[attribute_name] : "key does not exist"; + } + + // prepare meta information file including all available meta-data + void print_meta(const char* filename, std::string sep = ",") + { + // open file + std::ofstream fout(filename); + + for ( const auto& it : root_info_ ) + { + fout<