void getOffsetAndCount(const Tag &tag, const DataArray &array, NDSize &offset, NDSize &count) { vector<double> position = tag.position(); vector<double> extent = tag.extent(); vector<string> units = tag.units(); NDSize temp_offset(position.size()); NDSize temp_count(position.size(), 1); if (array.dimensionCount() != position.size() || (extent.size() > 0 && extent.size() != array.dimensionCount())) { throw std::runtime_error("Dimensionality of position or extent vector does not match dimensionality of data!"); } for (size_t i = 0; i < position.size(); ++i) { Dimension dim = array.getDimension(i+1); temp_offset[i] = positionToIndex(position[i], i >= units.size() ? "none" : units[i], dim); if (i < extent.size()) { ndsize_t c = positionToIndex(position[i] + extent[i], i >= units.size() ? "none" : units[i], dim) - temp_offset[i]; temp_count[i] = (c > 1) ? c : 1; } } offset = temp_offset; count = temp_count; }
void getOffsetAndCount(const MultiTag &tag, const DataArray &array, size_t index, NDSize &offsets, NDSize &counts) { DataArray positions = tag.positions(); DataArray extents = tag.extents(); NDSize position_size, extent_size; size_t dimension_count = array.dimensionCount(); if (positions) { position_size = positions.dataExtent(); } if (extents) { extent_size = extents.dataExtent(); } if (!positions || index >= position_size[0]) { throw nix::OutOfBounds("Index out of bounds of positions!", 0); } if (extents && index >= extent_size[0]) { throw nix::OutOfBounds("Index out of bounds of positions or extents!", 0); } if (position_size.size() == 1 && dimension_count != 1) { throw nix::IncompatibleDimensions("Number of dimensions in positions does not match dimensionality of data", "util::getOffsetAndCount"); } if (position_size.size() > 1 && position_size[1] > dimension_count) { throw nix::IncompatibleDimensions("Number of dimensions in positions does not match dimensionality of data", "util::getOffsetAndCount"); } if (extents && extent_size.size() > 1 && extent_size[1] > dimension_count) { throw nix::IncompatibleDimensions("Number of dimensions in extents does not match dimensionality of data", "util::getOffsetAndCount"); } NDSize temp_offset = NDSize{static_cast<NDSize::value_type>(index), static_cast<NDSize::value_type>(0)}; NDSize temp_count{static_cast<NDSize::value_type>(1), static_cast<NDSize::value_type>(dimension_count)}; vector<double> offset; positions.getData(offset, temp_count, temp_offset); NDSize data_offset(dimension_count, static_cast<size_t>(0)); NDSize data_count(dimension_count, static_cast<size_t>(1)); vector<string> units = tag.units(); for (size_t i = 0; i < offset.size(); ++i) { Dimension dimension = array.getDimension(i+1); string unit = "none"; if (i <= units.size() && units.size() > 0) { unit = units[i]; } data_offset[i] = positionToIndex(offset[i], unit, dimension); } if (extents) { vector<double> extent; extents.getData(extent, temp_count, temp_offset); for (size_t i = 0; i < extent.size(); ++i) { Dimension dimension = array.getDimension(i+1); string unit = "none"; if (i <= units.size() && units.size() > 0) { unit = units[i]; } ndsize_t c = positionToIndex(offset[i] + extent[i], unit, dimension) - data_offset[i]; data_count[i] = (c > 1) ? c : 1; } } offsets = data_offset; counts = data_count; }