dataservice/arrayinfo.h

84 lines
3.0 KiB
C++

#ifndef ARRAYINFO_H
#define ARRAYINFO_H
struct ArrayInfo {
ArrayInfo(const nix::DataArray &array) {
if (!array)
std::cerr << "shiiii\n";
arrayid = array.id();
dataExtent = array.dataExtent();
xDim = guessBestXdim(array);
nix::Dimension d = array.getDimension(xDim);
dimType = d.dimensionType();
xlabel = "";
if (dimType == nix::DimensionType::Sample) {
nix::SampledDimension sd = d.asSampledDimension();
xoffset = sd.offset() ? *sd.offset() : 0.0;
sampleinterval = sd.samplingInterval();
xmax = dataExtent[xDim - 1] * sampleinterval + xoffset;
xlabel = sd.label() ? *sd.label() : "";
xlabel += sd.unit() ? " [" + *sd.unit() + "]" : "";
} else if (dimType == nix::DimensionType::Range) {
nix::RangeDimension rd = d.asRangeDimension();
tics = rd.ticks();
xoffset = tics.front();
xmax = tics.back();
sampleinterval = 0.0;
xlabel = rd.label() ? *rd.label() : "";
xlabel += rd.unit() ? " [" + *rd.unit() + "]" : "";
} else { // SetDimension
xoffset = 0.0;
xmax = dataExtent[xDim - 1];
sampleinterval = 1.0;
}
name = array.name();
ylabel = array.label() ? *array.label() : "";
ylabel += array.unit() ? " [" + *array.unit() + "]" : "";
}
std::string arrayid;
std::string name;
std::string ylabel;
std::string xlabel;
int xDim;
nix::DimensionType dimType;
double xoffset, xmax, sampleinterval;
std::vector<double> tics;
nix::NDSize dataExtent;
int guessBestXdim(const nix::DataArray &array) const {
if(dataExtent.size() == 0) {
throw nix::IncompatibleDimensions("Array has dataExtent().size 0.", "guess_best_xdim");
}
if(dataExtent.size() > 2) {
throw nix::IncompatibleDimensions("Array has more than two dimensions.", "guess_best_xdim");
}
if(dataExtent.size() == 1) {
return 1;
} else {
nix::DimensionType d_1 = array.getDimension(1).dimensionType();
nix::DimensionType d_2 = array.getDimension(2).dimensionType();
if(d_1 == nix::DimensionType::Sample) {
return 1;
} else if (d_2 == nix::DimensionType::Sample) {
return 2;
} else {
if(d_1 == nix::DimensionType::Set && d_2 == nix::DimensionType::Range) {
return 2;
} else if (d_1 == nix::DimensionType::Range && d_2 == nix::DimensionType::Set){
return 1;
} else {
std::cerr << "How did you manage to end up in Lineplotter with 2D Set Data? guess_best_xdims() failure?" << std::endl;
throw nix::IncompatibleDimensions("Array contains 2D set data.", "guess_best_xdim");
}
}
}
}
};
#endif // ARRAYINFO_H