diff --git a/lib/imc_block.hpp b/lib/imc_block.hpp index 968656d..d749140 100644 --- a/lib/imc_block.hpp +++ b/lib/imc_block.hpp @@ -70,7 +70,9 @@ namespace imc parse_parameters(); parse_object(); } catch (const std::exception& e) { - throw std::runtime_error("block: failed to parse parameters"); + throw std::runtime_error( + std::string("block: failed to parse parameters/objects: ") + e.what() + ); } } @@ -100,7 +102,14 @@ namespace imc // pass buffer and parameters associated to block to generate corres. object void parse_object() { - imc_object_.parse(thekey_,buffer_,parameters_); + try { + imc_object_.parse(thekey_,buffer_,parameters_); + } catch (const std::exception& e) { + throw std::runtime_error( + std::string("failed to parse imc::object for key ") + + thekey_.name_ + std::string(": ") + e.what() + ); + } } public: diff --git a/lib/imc_object.hpp b/lib/imc_object.hpp index 78bc734..39101ca 100644 --- a/lib/imc_object.hpp +++ b/lib/imc_object.hpp @@ -9,6 +9,17 @@ 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 { @@ -16,9 +27,10 @@ namespace imc int processor_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + fileformat_ = std::stoi(get_parameter(buffer,¶meters[0])); + processor_ = std::stoi(get_parameter(buffer,¶meters[2])); } format(): fileformat_(-1), processor_(-1) {} @@ -41,9 +53,11 @@ namespace imc bool closed_; // corresponds to true = 1 and false = 0 in file // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + 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 @@ -65,9 +79,11 @@ namespace imc std::string comment_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + group_index_ = std::stoul(get_parameter(buffer,¶meters[2])); + name_ = get_parameter(buffer,¶meters[4]); + comment_ = get_parameter(buffer,¶meters[6]); } // get info string @@ -90,9 +106,12 @@ namespace imc std::string comment_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + 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 @@ -124,9 +143,11 @@ namespace imc int dimension_; // corresponding to fieldtype \in {1,} // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + 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 @@ -148,9 +169,11 @@ namespace imc std::string unit_; // construct members by parsing particular parameters from buffer - void parse(const std::vector* buffer, const std::vector parameters) + void parse(const std::vector* buffer, const std::vector& parameters) { - + 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 @@ -164,6 +187,47 @@ namespace imc } }; + // definition of abscissa (corresponds to key CD2) + struct abscissa2 + { + double dx_; + bool calibration_; + std::string unit_; + bool reduction_; + bool ismultievent_; + bool sortbuffer_; + double x0_; + int pretriggerapp_; + + // construct members by parsing particular parameters from buffer + void parse(const std::vector* buffer, const std::vector& parameters) + { + 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[11]) ); + } + + // get info string + std::string get_info(int width = 20) + { + std::stringstream ss; + ss<