#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 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