start parsing imc::objects

This commit is contained in:
Mario Fink 2021-02-10 13:08:32 +01:00
parent eb2c49549a
commit fe3befc5f2
3 changed files with 100 additions and 18 deletions

View File

@ -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:

View File

@ -9,6 +9,17 @@
namespace imc
{
// obtain specific parameters as string
std::string get_parameter(const std::vector<unsigned char>* 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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
fileformat_ = std::stoi(get_parameter(buffer,&parameters[0]));
processor_ = std::stoi(get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
version_ = std::stoi(get_parameter(buffer,&parameters[0]));
length_ = std::stoi(get_parameter(buffer,&parameters[1]));
closed_ = ( get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
group_index_ = std::stoul(get_parameter(buffer,&parameters[2]));
name_ = get_parameter(buffer,&parameters[4]);
comment_ = get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
group_index_ = std::stoul(get_parameter(buffer,&parameters[2]));
name_ = get_parameter(buffer,&parameters[4]);
text_ = get_parameter(buffer,&parameters[6]);
comment_ = get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
number_components_ = std::stoul(get_parameter(buffer,&parameters[2]));
fldtype_ = (fieldtype)std::stoi(get_parameter(buffer,&parameters[3]));
dimension_ = std::stoi(get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter> parameters)
void parse(const std::vector<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
dx_ = std::stod(get_parameter(buffer,&parameters[2]));
calibration_ = ( get_parameter(buffer,&parameters[3]) == std::string("1") );
unit_ = get_parameter(buffer,&parameters[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<unsigned char>* buffer, const std::vector<parameter>& parameters)
{
dx_ = std::stod(get_parameter(buffer,&parameters[2]));
calibration_ = ( get_parameter(buffer,&parameters[3]) == std::string("1") );
unit_ = get_parameter(buffer,&parameters[5]);
reduction_ = ( get_parameter(buffer,&parameters[6]) == std::string("1") );
ismultievent_ = ( get_parameter(buffer,&parameters[7]) == std::string("1") );
sortbuffer_ = ( get_parameter(buffer,&parameters[8]) == std::string("1") );
x0_ = std::stod(get_parameter(buffer,&parameters[9]));
pretriggerapp_ = std::stoi( get_parameter(buffer,&parameters[11]) );
}
// get info string
std::string get_info(int width = 20)
{
std::stringstream ss;
ss<<std::setw(width)<<std::left<<"dx:"<<dx_<<"\n"
<<std::setw(width)<<std::left<<"calibration_:"<<(calibration_?"yes":"no")<<"\n"
<<std::setw(width)<<std::left<<"unit:"<<unit_<<"\n"
<<std::setw(width)<<std::left<<"reduction:"<<reduction_<<"\n"
<<std::setw(width)<<std::left<<"ismultievent:"<<ismultievent_<<"\n"
<<std::setw(width)<<std::left<<"sortbuffer:"<<sortbuffer_<<"\n"
<<std::setw(width)<<std::left<<"x0:"<<x0_<<"\n"
<<std::setw(width)<<std::left<<"pretriggerapp:"<<pretriggerapp_<<"\n";
return ss.str();
}
};
// start of component (corresponds to key CC)
struct component
{
@ -420,6 +484,7 @@ namespace imc {
data dat_; // 11
origin_data org_; // 12
triggertime trt_; // 13
abscissa2 abs2_; // 14
int objidx_;
public:
@ -459,6 +524,11 @@ namespace imc {
abs_.parse(buffer,parameters);
objidx_ = 5;
}
else if ( key.name_ == std::string("CD") && key.version_ == 2 )
{
abs_.parse(buffer,parameters);
objidx_ = 14;
}
else if ( key.name_ == std::string("CC") )
{
cmt_.parse(buffer,parameters);
@ -502,7 +572,8 @@ namespace imc {
else
{
throw std::logic_error(
std::string("unsupported block associated to key ") + key.name_
std::string("unsupported block associated to key ")
+ key.name_ + std::to_string(key.version_)
);
}
}
@ -523,6 +594,8 @@ namespace imc {
return dtf_.get_info();
case 5:
return abs_.get_info();
case 14:
return abs2_.get_info();
case 6:
return cmt_.get_info();
case 7:

View File

@ -49,8 +49,8 @@ namespace imc
}
// access members
const unsigned long int& begin() { return begin_; }
const unsigned long int& end() { return end_; }
const unsigned long int& begin() const { return begin_; }
const unsigned long int& end() const { return end_; }
// comparison operator
bool operator==(const parameter& param)
@ -59,7 +59,7 @@ namespace imc
}
// get info
std::string get_info()
std::string get_info() const
{
return ( std::string("[") + std::to_string(begin_) + std::string(",")
+ std::to_string(end_) + std::string("]") );