// DataBySpec returns a ROI Data based on a string specification of the form // "<roiname>,<uuid>". If the given string is not parsable, the "found" return value is false. func DataBySpec(spec string) (d *Data, v dvid.VersionID, found bool, err error) { roispec := strings.Split(spec, ",") if len(roispec) != 2 { err = fmt.Errorf("Expect ROI filters to have format %q, but got %q", "roi:<roiname>,<uuid>", spec) return } roiName := dvid.InstanceName(roispec[0]) _, v, err = datastore.MatchingUUID(roispec[1]) if err != nil { return } var data datastore.DataService data, err = datastore.GetDataByVersionName(v, roiName) if err != nil { return } var ok bool d, ok = data.(*Data) if !ok { err = fmt.Errorf("Data instance %q is not ROI instance", roiName) return } found = true return }
func NewIterator(roiName dvid.InstanceName, versionID dvid.VersionID, b dvid.Bounder) (*Iterator, error) { dataservice, err := datastore.GetDataByVersionName(versionID, roiName) if err != nil { return nil, fmt.Errorf("Can't get ROI with name %q: %v", roiName, err) } data, ok := dataservice.(*Data) if !ok { return nil, fmt.Errorf("Data name %q was not of roi data type\n", roiName) } // Convert voxel extents to block Z extents minPt := b.StartPoint().(dvid.Chunkable) maxPt := b.EndPoint().(dvid.Chunkable) minBlockCoord := minPt.Chunk(data.BlockSize) maxBlockCoord := maxPt.Chunk(data.BlockSize) minIndex := minIndexByBlockZ(minBlockCoord.Value(2)) maxIndex := maxIndexByBlockZ(maxBlockCoord.Value(2)) ctx := datastore.NewVersionedCtx(data, versionID) it := new(Iterator) it.spans, err = getSpans(ctx, minIndex, maxIndex) return it, err }