added units and excluced datatypes

This commit is contained in:
Mario Fink 2019-04-30 16:22:15 +02:00
parent afe7331feb
commit b16539264f
5 changed files with 43 additions and 21 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ build/
*.o *.o
*.a *.a
*.dat *.dat
data/

View File

@ -3,7 +3,7 @@
tdm_ripper::tdm_ripper(std::string tdmfile, std::string tdxfile): tdm_ripper::tdm_ripper(std::string tdmfile, std::string tdxfile):
tdmfile_(tdmfile), tdxfile_(tdxfile), num_channels_(0), num_groups_(0), tdmfile_(tdmfile), tdxfile_(tdxfile), num_channels_(0), num_groups_(0),
channel_id_(0), inc_id_(0), group_id_(0), channel_name_(0), group_name_(0), channel_id_(0), inc_id_(0), units_(0), channel_name_(0), group_id_(0), group_name_(0),
num_channels_group_(0), channels_group_(0), channel_ext_(0), minmax_(0), num_channels_group_(0), channels_group_(0), channel_ext_(0), minmax_(0),
byteoffset_(0), length_(0), type_(0), external_id_(0) byteoffset_(0), length_(0), type_(0), external_id_(0)
{ {
@ -118,14 +118,16 @@ void tdm_ripper::parse_structure()
if ( groupid.find(group_id_[g]) != std::string::npos ) channels_group_.push_back(g+1); if ( groupid.find(group_id_[g]) != std::string::npos ) channels_group_.push_back(g+1);
} }
// obtain measurement unit of channel
units_.push_back(anode.child_value("unit_string"));
if ( (*(units_.end()-1)).compare("°C") == 0 ) (*(units_.end()-1)) = "deg. Celsius";
// obtain minimum/maximum of channel // obtain minimum/maximum of channel
std::pair<double,double> minmaxchan(atof(anode.child_value("minimum")), std::pair<double,double> minmaxchan(atof(anode.child_value("minimum")),
atof(anode.child_value("maximum"))); atof(anode.child_value("maximum")));
minmax_.push_back(minmaxchan); minmax_.push_back(minmaxchan);
// TODO correct order of channels w.r.t. to list of offset, length and type by // get correct assignment of channels to byteoffset, length and datatype
// considering the xpointer id's !!!!
// follow xpointers to get external id
std::string locol = get_str_between(anode.child_value("local_columns"),"\"","\""); std::string locol = get_str_between(anode.child_value("local_columns"),"\"","\"");
std::string locolval; std::string locolval;
for (pugi::xml_node anode: subtreedata.children()) for (pugi::xml_node anode: subtreedata.children())
@ -145,7 +147,6 @@ void tdm_ripper::parse_structure()
locolvalext = anode.child("values").attribute("external").value(); locolvalext = anode.child("values").attribute("external").value();
} }
} }
// std::cout<<locol<<" "<<locolval<<" "<<locolvalext<<"\n";
// save external id of channel and get corresponding channel index // save external id of channel and get corresponding channel index
inc_id_.push_back(locolvalext); inc_id_.push_back(locolvalext);
@ -177,14 +178,15 @@ void tdm_ripper::list_channels(std::ostream& gout, int width, int maxshow)
gout<<std::setw(width)<<"offset"; gout<<std::setw(width)<<"offset";
gout<<std::setw(width)<<"length"; gout<<std::setw(width)<<"length";
gout<<std::setw(width)<<"datatype"; gout<<std::setw(width)<<"datatype";
gout<<std::setw(width)<<"unit";
gout<<std::setw(width)<<"minimum";
gout<<std::setw(width)<<"maximum";
gout<<std::setw(width)<<"group"; gout<<std::setw(width)<<"group";
gout<<std::setw(width)<<"group id"; gout<<std::setw(width)<<"group id";
gout<<std::setw(width)<<"group name"; gout<<std::setw(width)<<"group name";
gout<<std::setw(width)<<"num channels"; gout<<std::setw(width)<<"num channels";
gout<<std::setw(width)<<"minimum";
gout<<std::setw(width)<<"maximum";
gout<<"\n"; gout<<"\n";
gout<<std::setfill('-')<<std::setw(14*width+1)<<"\n"; gout<<std::setfill('-')<<std::setw(15*width+1)<<"\n";
gout<<std::setfill(' '); gout<<std::setfill(' ');
for ( int i = 0; i < num_channels_ && i < maxshow; i++ ) for ( int i = 0; i < num_channels_ && i < maxshow; i++ )
@ -196,12 +198,13 @@ void tdm_ripper::list_channels(std::ostream& gout, int width, int maxshow)
gout<<std::setw(width)<<byteoffset_[channel_ext_[i]-1]; gout<<std::setw(width)<<byteoffset_[channel_ext_[i]-1];
gout<<std::setw(width)<<length_[channel_ext_[i]-1]; gout<<std::setw(width)<<length_[channel_ext_[i]-1];
gout<<std::setw(width)<<type_[channel_ext_[i]-1]; gout<<std::setw(width)<<type_[channel_ext_[i]-1];
gout<<std::setw(width)<<units_[i];
gout<<std::setw(width)<<minmax_[i].first;
gout<<std::setw(width)<<minmax_[i].second;
gout<<std::setw(width)<<channels_group_[i]; gout<<std::setw(width)<<channels_group_[i];
gout<<std::setw(width)<<group_id_[channels_group_[i]-1]; gout<<std::setw(width)<<group_id_[channels_group_[i]-1];
gout<<std::setw(width)<<group_name_[channels_group_[i]-1]; gout<<std::setw(width)<<group_name_[channels_group_[i]-1];
gout<<std::setw(width)<<num_channels_group_[channels_group_[i]-1]; gout<<std::setw(width)<<num_channels_group_[channels_group_[i]-1];
gout<<std::setw(width)<<minmax_[i].first;
gout<<std::setw(width)<<minmax_[i].second;
gout<<"\n"; gout<<"\n";
} }
gout<<"\n\n"; gout<<"\n\n";
@ -217,6 +220,9 @@ void tdm_ripper::list_channels(std::ostream& gout, int width, int maxshow)
gout<<std::setw(width)<<byteoffset_[i]; gout<<std::setw(width)<<byteoffset_[i];
gout<<std::setw(width)<<length_[i]; gout<<std::setw(width)<<length_[i];
gout<<std::setw(width)<<type_[i]; gout<<std::setw(width)<<type_[i];
gout<<std::setw(width)<<units_[i];
gout<<std::setw(width)<<minmax_[i].first;
gout<<std::setw(width)<<minmax_[i].second;
gout<<std::setw(width)<<channels_group_[i]; gout<<std::setw(width)<<channels_group_[i];
gout<<std::setw(width)<<group_id_[channels_group_[i]-1]; gout<<std::setw(width)<<group_id_[channels_group_[i]-1];
gout<<std::setw(width)<<group_name_[channels_group_[i]-1]; gout<<std::setw(width)<<group_name_[channels_group_[i]-1];
@ -370,12 +376,18 @@ std::vector<double> tdm_ripper::convert_channel(int channelid)
std::vector<unsigned char> cseg(tdxbuf_.begin()+byteoffset+i*typesize, std::vector<unsigned char> cseg(tdxbuf_.begin()+byteoffset+i*typesize,
tdxbuf_.begin()+byteoffset+(i+1)*typesize); tdxbuf_.begin()+byteoffset+(i+1)*typesize);
if ( type_[channelid-1].compare("eInt32Usi") == 0 ) chann[i] = convert_int(cseg); if ( type_[channelid-1].compare("eInt32Usi") == 0 )
if ( type_[channelid-1].compare("eFloat64Usi") == 0 ) chann[i] = convert_double(cseg); {
chann[i] = convert_int(cseg);
// check if converted value is within expected range }
// if ( chann[i] < minmax_[channelid-1].first || chann[i] > minmax_[channelid-1].second ) std::cout<<chann[i]<<" "<<minmax_[channelid-1].first<<" "<<minmax_[channelid-1].second<<"\n"; else if ( type_[channelid-1].compare("eFloat64Usi") == 0 )
// assert( chann[i] >= minmax_[channelid-1].first && chann[i] <= minmax_[channelid-1].second ); {
chann[i] = convert_double(cseg);
}
else
{
assert( false && "datatype not supported!" );
}
} }
return chann; return chann;
@ -385,7 +397,16 @@ std::vector<double> tdm_ripper::get_channel(int channelid)
{ {
assert( channelid > 0 && channelid <= num_channels_ && "please provide valid channel id" ); assert( channelid > 0 && channelid <= num_channels_ && "please provide valid channel id" );
return convert_channel(channel_ext_[channelid-1]); std::vector<double> chann = convert_channel(channel_ext_[channelid-1]);
// check if converted value is within expected range
for ( int i = 0; i < (int)chann.size(); i++ )
{
assert( chann[i] >= minmax_[channelid-1].first - 1.0e-10
&& chann[i] <= minmax_[channelid-1].second + 1.0e-10 );
}
return chann;
} }
void tdm_ripper::print_channel(int channelid, const char* filename, int width) void tdm_ripper::print_channel(int channelid, const char* filename, int width)

View File

@ -25,10 +25,12 @@ class tdm_ripper
// number/names/ids of channels, channelgroups and channels's assignment to groups // number/names/ids of channels, channelgroups and channels's assignment to groups
int num_channels_, num_groups_; int num_channels_, num_groups_;
std::vector<std::string> channel_id_, inc_id_, group_id_, channel_name_, group_name_; std::vector<std::string> channel_id_, inc_id_, units_, channel_name_;
std::vector<std::string> group_id_, group_name_;
std::vector<int> num_channels_group_; std::vector<int> num_channels_group_;
std::vector<int> channels_group_; std::vector<int> channels_group_;
std::vector<int> channel_ext_; std::vector<int> channel_ext_;
// evtl. get group time_stamp of .tdm file in the unix format, i.e. #seconds since 01.01.0000 with average year having 365+97/400 = 365.2425 days
// minimum/maximum value in particular channel (is provided in .tdm file as float) // minimum/maximum value in particular channel (is provided in .tdm file as float)
std::vector<std::pair<double,double>> minmax_; std::vector<std::pair<double,double>> minmax_;

View File

@ -10,7 +10,7 @@ int main(int argc, char* argv[])
// declare and initialize tdm_ripper // declare and initialize tdm_ripper
tdm_ripper ripper(argv[1]); tdm_ripper ripper(argv[1]);
ripper.list_datatypes(); // ripper.list_datatypes();
// int sn = -76476; // int sn = -76476;
// std::vector<unsigned char> bych = ripper.convert_int(sn); // std::vector<unsigned char> bych = ripper.convert_int(sn);

View File

@ -35,5 +35,3 @@ cdef class pytdmripper:
# .channel_name(i, j) # .channel_name(i, j)
# .channel(i, j) # .channel(i, j)
# .close() # .close()
#
# evtl. get time_stamp of .tdm file in the unix format, i.e. #seconds since 01.01.0000 with average year having 365+97/400 = 365.2425 days