//---------------------------------------------------------------------------// #ifndef IMCOBJECT #define IMCOBJECT #include #include #include "imc_key.hpp" //---------------------------------------------------------------------------// namespace imc { // obtain specific parameters as string std::string get_parameter(const std::vector* buffer, const imc::parameter* param) { std::string prm(""); for ( unsigned long int i = param->begin()+1; i <= param->end(); i++ ) { prm.push_back((char)(*buffer)[i]); } return prm; } // format and processor (corresponds to key CF) struct format { int fileformat_; int processor_; // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { if ( parameters.size() < 3 ) throw std::runtime_error("invalid number of parameters in CF"); fileformat_ = std::stoi(get_parameter(buffer,¶meters[0])); processor_ = std::stoi(get_parameter(buffer,¶meters[2])); } format(): fileformat_(-1), processor_(-1) {} // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 2 ) throw std::runtime_error("invalid number of parameters in CK"); version_ = std::stoi(get_parameter(buffer,¶meters[0])); length_ = std::stoi(get_parameter(buffer,¶meters[1])); closed_ = ( get_parameter(buffer,¶meters[3])==std::string("1") ); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in CB"); group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); name_ = get_parameter(buffer,¶meters[4]); comment_ = get_parameter(buffer,¶meters[6]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 9 ) throw std::runtime_error("invalid number of parameters in CT"); group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); name_ = get_parameter(buffer,¶meters[4]); text_ = get_parameter(buffer,¶meters[6]); comment_ = get_parameter(buffer,¶meters[8]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 5 ) throw std::runtime_error("invalid number of parameters in CG"); number_components_ = std::stoul(get_parameter(buffer,¶meters[2])); fldtype_ = (fieldtype)std::stoi(get_parameter(buffer,¶meters[3])); dimension_ = std::stoi(get_parameter(buffer,¶meters[4])); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 6 ) throw std::runtime_error("invalid number of parameters in CD1"); dx_ = std::stod(get_parameter(buffer,¶meters[2])); calibration_ = ( get_parameter(buffer,¶meters[3]) == std::string("1") ); unit_ = get_parameter(buffer,¶meters[5]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 11 ) throw std::runtime_error("invalid number of parameters in CD2"); dx_ = std::stod(get_parameter(buffer,¶meters[2])); calibration_ = ( get_parameter(buffer,¶meters[3]) == std::string("1") ); unit_ = get_parameter(buffer,¶meters[5]); reduction_ = ( get_parameter(buffer,¶meters[6]) == std::string("1") ); ismultievent_ = ( get_parameter(buffer,¶meters[7]) == std::string("1") ); sortbuffer_ = ( get_parameter(buffer,¶meters[8]) == std::string("1") ); x0_ = std::stod(get_parameter(buffer,¶meters[9])); pretriggerapp_ = std::stoi( get_parameter(buffer,¶meters[10]) ); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss< false (analog), 2 => true (digital) // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { if ( parameters.size() < 4 ) throw std::runtime_error("invalid number of parameters in CC"); component_index_ = std::stoi(get_parameter(buffer,¶meters[2])); analog_digital_ = ( std::stoi(get_parameter(buffer,¶meters[3])) == 2 ); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 10 ) throw std::runtime_error("invalid number of parameters in CP"); buffer_reference_ = std::stoi(get_parameter(buffer,¶meters[2])); bytes_ = std::stoi(get_parameter(buffer,¶meters[3])); numeric_type_ = (numtype)std::stoi(get_parameter(buffer,¶meters[4])); signbits_ = std::stoi(get_parameter(buffer,¶meters[5])); mask_ = std::stoi(get_parameter(buffer,¶meters[6])); offset_ = std::stoul(get_parameter(buffer,¶meters[7])); number_subsequent_samples_ = std::stoul(get_parameter(buffer,¶meters[8])); distance_bytes_ = std::stoul(get_parameter(buffer,¶meters[9])); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 13 ) throw std::runtime_error("invalid number of parameters in Cb"); number_buffers_ = std::stoul(get_parameter(buffer,¶meters[2])); bytes_userinfo_ = std::stoul(get_parameter(buffer,¶meters[3])); buffer_reference_ = std::stoul(get_parameter(buffer,¶meters[4])); sample_index_ = std::stoul(get_parameter(buffer,¶meters[5])); offset_buffer_ = std::stoul(get_parameter(buffer,¶meters[6])); number_bytes_ = std::stoul(get_parameter(buffer,¶meters[7])); offset_first_sample_ = std::stoul(get_parameter(buffer,¶meters[8])); number_filled_bytes_ = std::stoul(get_parameter(buffer,¶meters[9])); x0_ = std::stod(get_parameter(buffer,¶meters[11])); add_time_ = std::stod(get_parameter(buffer,¶meters[12])); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in CR"); transform_ = (get_parameter(buffer,¶meters[2]) == std::string("1")); factor_ = std::stod(get_parameter(buffer,¶meters[3])); offset_ = std::stod(get_parameter(buffer,¶meters[4])); calibration_ = (get_parameter(buffer,¶meters[5]) == std::string("1")); unit_ = get_parameter(buffer,¶meters[7]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 9 ) throw std::runtime_error("invalid number of parameters in CN"); group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); index_bit_ = (get_parameter(buffer,¶meters[4]) == std::string("1")); name_ = get_parameter(buffer,¶meters[6]); comment_ = get_parameter(buffer,¶meters[8]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss< rawdata_; // unsigned long int begin_buffer_, end_buffer_; // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { if ( parameters.size() < 4 ) throw std::runtime_error("invalid number of parameters in CS"); index_ = std::stoul(get_parameter(buffer,¶meters[2])); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if (parameters.size() < 4) throw std::runtime_error("invalid number of parameters in NL"); codepage_ = get_parameter(buffer, ¶meters[2]); language_code_ = get_parameter(buffer, ¶meters[3]); } }; // origin of data (corresponds to key NO) struct origin_data { bool origin_; // corresponds to true = 1 ("verrechnet") and false = 0 ("Original") std::string generator_; std::string comment_; // construct members by parsing particular parameters from buffer void parse(const std::vector* buffer, const std::vector& parameters) { if ( parameters.size() < 7 ) throw std::runtime_error("invalid number of parameters in CD2"); origin_ = ( get_parameter(buffer,¶meters[2]) == std::string("1") ); generator_ = get_parameter(buffer,¶meters[4]); comment_ = get_parameter(buffer,¶meters[6]); } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( parameters.size() < 8 ) throw std::runtime_error("invalid number of parameters in CD2"); tms_ = std::tm(); tms_.tm_mday = std::stoi( get_parameter(buffer,¶meters[2]) ); tms_.tm_mon = std::stoi( get_parameter(buffer,¶meters[3]) ) - 1; tms_.tm_year = std::stoi( get_parameter(buffer,¶meters[4]) ) - 1900; tms_.tm_hour = std::stoi( get_parameter(buffer,¶meters[5]) ); tms_.tm_min = std::stoi( get_parameter(buffer,¶meters[6]) ); long double secs = std::stold( get_parameter(buffer,¶meters[7]) ); double secs_int; trigger_time_frac_secs_ = modf((double)secs,&secs_int); tms_.tm_sec = (int)secs_int; } // get info string std::string get_info(int width = 20) { std::stringstream ss; ss<* buffer, const std::vector& parameters) { if ( key.name_ == std::string("CF") ) { fmt_.parse(buffer,parameters); objidx_ = 0; } else if ( key.name_ == std::string("CK") ) { kyg_.parse(buffer,parameters); objidx_ = 1; } else if ( key.name_ == std::string("CB") ) { grp_.parse(buffer,parameters); objidx_ = 2; } else if ( key.name_ == std::string("CT") ) { txt_.parse(buffer,parameters); objidx_ = 3; } else if ( key.name_ == std::string("CG") ) { dtf_.parse(buffer,parameters); objidx_ = 4; } else if ( key.name_ == std::string("CD") && key.version_ == 1 ) { abs_.parse(buffer,parameters); objidx_ = 5; } else if ( key.name_ == std::string("CC") ) { cmt_.parse(buffer,parameters); objidx_ = 6; } else if ( key.name_ == std::string("CP") ) { pkg_.parse(buffer,parameters); objidx_ = 7; } else if ( key.name_ == std::string("Cb") ) { bfr_.parse(buffer,parameters); objidx_ = 8; } else if ( key.name_ == std::string("CR") ) { rng_.parse(buffer,parameters); objidx_ = 9; } else if ( key.name_ == std::string("CN") ) { chn_.parse(buffer,parameters); objidx_ = 10; } else if ( key.name_ == std::string("CS") ) { dat_.parse(buffer,parameters); objidx_ = 11; } else if ( key.name_ == std::string("NO") ) { org_.parse(buffer,parameters); objidx_ = 12; } else if ( key.name_ == std::string("NT") && key.version_ == 1 ) { trt_.parse(buffer,parameters); objidx_ = 13; } else if ( key.name_ == std::string("CD") && key.version_ == 2 ) { abs2_.parse(buffer,parameters); objidx_ = 14; } else { if ( key.name_.at(0) == 'C' ) { throw std::logic_error( std::string("unsupported block associated to critical key ") + key.name_ + std::to_string(key.version_) ); } else { std::cout<<"WARNING: unsupported block associated to noncritical key " <