diff --git a/.gitignore b/.gitignore index 26af173..cc99b4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -/build - eatraw eatdev @@ -8,11 +6,14 @@ nohup.out .DS_Store -*.so - raw_eater.cpp raw_meat.cpp cyt/*.cpp +/build +*.log +*.so *.o +*.csv +*.parquet diff --git a/cyt/raw_eater.pxd b/cyt/raw_eater.pxd index a93e758..65f1f33 100644 --- a/cyt/raw_eater.pxd +++ b/cyt/raw_eater.pxd @@ -14,14 +14,18 @@ from libcpp cimport bool # # for how to overload the constructor see # https://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html +# and propagating exceptions from C++ to Python +# http://docs.cython.org/en/latest/src/userguide/wrapping_CPlusPlus.html#exceptions cdef extern from "../lib/raweat.hpp": cdef cppclass raw_eater: # constructor(s) - raw_eater() except+ + raw_eater() except + raw_eater(string) except + # set new file for decoding void set_file(string) + # perform conversion (pass any C++ exceptions to Python) + void setup_and_conversion() except + # get validity of data format bool get_valid() # get channel name and unit diff --git a/cyt/raw_eater.pyx b/cyt/raw_eater.pyx index 7ca4b52..c079033 100644 --- a/cyt/raw_eater.pyx +++ b/cyt/raw_eater.pyx @@ -30,6 +30,9 @@ cdef class raweater: raise ValueError("'" + str(rawfile) + "' does not exist") self.rawit.set_file(rawfile) + def do_conversion(self): + self.rawit.setup_and_conversion() + def validity(self): return self.rawit.get_valid() diff --git a/cyt/raw_meat.pxd b/cyt/raw_meat.pxd index 56e12c5..a5d493c 100644 --- a/cyt/raw_meat.pxd +++ b/cyt/raw_meat.pxd @@ -23,8 +23,8 @@ cdef extern from "../lib/rawmerge.hpp": vector[double] get_data() # dump all data to .csv void write_table(const char*,char) - # add channel and try to merge it - bool add_channel(string) + # add channel and try to merge it (pass C++ exceptions to Python) + bool add_channel(string) except + # get total number of (added) channels int get_num_channels() # get list of channel names diff --git a/lib/raweat.hpp b/lib/raweat.hpp index dce867b..42637d4 100644 --- a/lib/raweat.hpp +++ b/lib/raweat.hpp @@ -80,7 +80,7 @@ public: raw_eater(std::string rawfile, bool showlog = false) : rawfile_(rawfile) { // trigger setup and conversion - if ( ! rawfile.empty() ) this->setup_and_conversion(showlog); + //if ( ! rawfile.empty() ) this->setup_and_conversion(showlog); } raw_eater() @@ -88,6 +88,12 @@ public: } + // destructor + ~raw_eater() + { + + } + // provide/set new raw file void set_file(std::string rawfile, bool showlog = false) { @@ -100,11 +106,11 @@ public: datmes_.clear(); // do setup and conversion - setup_and_conversion(showlog); + //setup_and_conversion(showlog); } // set up and conversion - void setup_and_conversion(bool showlog) + void setup_and_conversion(bool showlog = false) { // make sure 'raw_file' is already set assert ( !rawfile_.empty() ); @@ -123,10 +129,8 @@ public: if ( showlog ) { - // show raw data + // show raw data and display predefined markers this->show_buffer(); - - // display predefined markers this->show_markers(); } @@ -150,12 +154,6 @@ public: } } - // destructor - ~raw_eater() - { - - } - // display buffer/data properties void show_buffer(int numel = 32) { @@ -239,10 +237,16 @@ public: unsigned long int totalmarksize = 0; for (std::pair> mrk : markers_ ) { - //assert ( datasec_[mrk.first].size() > 0 && "marker segment of length zero" ); if ( datasec_[mrk.first].size() == 0 ) { - std::cout<<"warning: "< 0 && "didn't find any predefined marker => probably not a valid .raw-file" ); valid_ = ( totalmarksize < 100 ) ? false : true; } @@ -389,7 +392,6 @@ public: } else { - // switch for datatypes switch ( dattype ) { @@ -414,9 +416,9 @@ public: convert_data_as_type(datbuf,factor,offset); break; case 6 : - std::cout<<"warning: 'signed long int' datatype with experimental support\n"; // assert ( sizeof(signed long int)*8 == typesize ); // convert_data_as_type(datbuf,factor,offset); + // throw std::runtime_error("warning: 'signed long int' datatype with experimental support"); assert ( sizeof(int)*8 == typesize ); convert_data_as_type(datbuf,factor,offset); break; @@ -429,13 +431,13 @@ public: convert_data_as_type(datbuf,factor,offset); break; case 9 : - std::cerr<<"'imc Devices Transitional Recording' datatype not supported\n"; + throw std::runtime_error("'imc Devices Transitional Recording' datatype not supported"); break; case 10 : - std::cerr<<"'Timestamp Ascii' datatype not supported\n"; + throw std::runtime_error("'Timestamp Ascii' datatype not supported"); break; case 11 : - std::cout<<"warning: '2-Byte-Word digital' datatype with experimental support\n"; + // throw std::runtime_error("warning: '2-Byte-Word digital' datatype with experimental support"); assert ( sizeof(short int)*8 == typesize ); convert_data_as_type(datbuf,factor,offset); break; diff --git a/lib/rawmerge.hpp b/lib/rawmerge.hpp index 42bfe9d..3e77e48 100644 --- a/lib/rawmerge.hpp +++ b/lib/rawmerge.hpp @@ -83,13 +83,19 @@ public: { // set raw file and perform conversion this->set_file(rawfile,showlog); + // try { + this->setup_and_conversion(); + // } catch (const std::exception& e) { + // // throw; + // std::cout<get_valid() ) { - std::cout<get_name()<<" ["<get_unit()<<"]"<<"\n"; std::cout<<"Time ["<get_temp_unit()<<"]"<<"\n"; for ( unsigned long int i = 0; i < 5; i++ ) std::cout<get_time()[i]<<"\n"; + std::cout<get_name()<<" ["<get_unit()<<"]"<<"\n"; for ( unsigned long int i = 0; i < 5; i++ ) std::cout<get_data()[i]<<"\n"; std::cout<<"lenght of channel "<get_time().size()<<"\n"; std::cout<<"\n"; @@ -126,12 +132,9 @@ public: std::vector td = this->get_data(); // compare start/end of timeseries (define tolerance) - double deltat = 7*fmax(this->get_dt(),this->dt_); - if ( ( this->timeseries_[0] - ts[0] < deltat ) - && ( this->timeseries_.back() - ts.back() < deltat ) ) - // double tol = 0.001; - // if ( ( (this->timeseries_[0]-ts[0])/ts[0] < tol ) - // && ( (this->timeseries_.back()-ts.back())/ts.back() < tol ) ) + double deltat = 9*fmax(this->get_dt(),this->dt_); + if ( ( fabs( this->timeseries_[0] - ts[0] ) < deltat ) + && ( fabs( this->timeseries_.back() - ts.back() ) < deltat ) ) { // resulting new time series std::vector newts; @@ -155,9 +158,14 @@ public: else { // refuse to merge due to inconsistent start of timeseries - std::cerr<<"rawmerge: add_channel '"<get_dt()) + + std::string(" and ") + std::to_string(this->dt_) + std::string(")"); + // std::cerr<get_temp_unit()<<"' versus '"<temp_unit_<<"'\n"; + std::string errmess = std::string("rawmerge: add_channel '") + rawfile + + std::string("' : inconsistent time units: ', i.e. '") + + this->get_temp_unit() + std::string("' vs. '") + + this->temp_unit_ + std::string("'"); + // std::cerr< 2 && "please provide a filename and path for input and output" ); - -// check number of CLI arguments -// assert( argc == 3 ); if ( argc != 3 ) //or ( argc == 1 && std::string(argv[1]) == str::string("--help") ) { @@ -29,19 +21,18 @@ int main(int argc, char* argv[]) // get name/path of file from CLI argument std::string rawfile(argv[1]); - // declare instance of "raw_eater" - raw_eater eatraw(rawfile,true); + // declare instance of 'raw_eater' (and decode data) + raw_eater eatraw; //rawfile,false); - // declare instance of "raw_merger" -// raw_merger eatmea; -// eatmea.add_channel(rawfile,true); -// eatmea.add_channel("smp/VehicleSpeed_HS.raw",true); -// eatmea.add_channel("smp/VehicleSpeed_HS.raw",true); -// eatmea.add_channel("smp/Rangerover_Evoque_F-RR534_2019-05-07/Temp_Disc_FR.raw",true); + // set file to be decoded + eatraw.set_file(rawfile,true); - //eatraw.show_markers(); + // do conversion + eatraw.setup_and_conversion(false); -// std::cout<<"\n"; + // eatraw.show_markers(); + + // std::cout<<"\n"; // std::map> marks = eatraw.get_markers(); // for ( auto mrk: marks ) // { @@ -67,10 +58,32 @@ int main(int argc, char* argv[]) // write data in csv-file if ( eatraw.get_valid() ) { - // eatraw.write_table(std::string(argv[2])); eatraw.write_table(std::string(argv[2]),' '); - // eatmea.write_table(std::string(argv[2])); - // eatmea.write_table(std::string(argv[2]),' '); + } + else + { + std::cout<<"=> invalid/corrupt .raw file\n"; + } + +//---------------------------------------------------------------------------// + + // declare instance of 'raw_merger' + raw_merger eatmea; + + // add channels + eatmea.add_channel(rawfile,false); + // eatmea.add_channel("smp/VehicleSpeed_HS.raw",true); + // eatmea.add_channel("smp/Mercedes_E-Klasse-2019-08-08/Flex_StWhl_AnglSpd.raw",false); + // eatmea.add_channel("smp/Rangerover_Evoque_F-RR534_2019-05-07/Temp_Disc_FR.raw",false); + + // write merged table + if ( eatmea.get_num_channels() > 0 ) + { + eatmea.write_table_all("output/allchannels.csv",' '); + } + else + { + std::cout<<"no valid channel added\n"; } return 0;