DataView retrieveFeatureData(const MultiTag &tag, size_t position_index, size_t feature_index) { if (tag.featureCount() == 0) { throw nix::OutOfBounds("There are no features associated with this tag!", 0); } if (feature_index >= tag.featureCount()) { throw nix::OutOfBounds("Feature index out of bounds.", 0); } Feature feat = tag.getFeature(feature_index); DataArray data = feat.data(); if (data == nix::none) { throw nix::UninitializedEntity(); //return NDArray(nix::DataType::Float,{0}); } if (feat.linkType() == nix::LinkType::Tagged) { NDSize offset, count; getOffsetAndCount(tag, data, position_index, offset, count); if (!positionAndExtentInData(data, offset, count)) { throw nix::OutOfBounds("Requested data slice out of the extent of the Feature!", 0); } DataView io = DataView(data, count, offset); return io; } else if (feat.linkType() == nix::LinkType::Indexed) { //FIXME does the feature data to have a setdimension in the first dimension for the indexed case? //For now it will just be a slice across the first dim. if (position_index > data.dataExtent()[0]){ throw nix::OutOfBounds("Position is larger than the data stored in the feature.", 0); } NDSize offset(data.dataExtent().size(), 0); offset[0] = position_index; NDSize count(data.dataExtent()); count[0] = 1; if (!positionAndExtentInData(data, offset, count)) { throw nix::OutOfBounds("Requested data slice out of the extent of the Feature!", 0); } DataView io = DataView(data, count, offset); return io; } // FIXME is this expected behavior? In the untagged case all data is returned NDSize offset(data.dataExtent().size(), 0); DataView io = DataView(data, data.dataExtent(), offset); return io; }
boost::optional<Feature> getFeatureByPos(const MultiTag& st, size_t index) { Feature f = st.getFeature(index); return f ? boost::optional<Feature>(f) : boost::none; }
boost::optional<Feature> getFeatureById(const MultiTag& st, const std::string& id) { Feature f = st.getFeature(id); return f ? boost::optional<Feature>(f) : boost::none; }