// NewData returns a pointer to new keyvalue data with default values. func (dtype *Type) NewDataService(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (datastore.DataService, error) { basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } return &Data{basedata}, nil }
// NewData returns a pointer to labelsz data. func NewData(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (*Data, error) { // See if we have a valid DataService ROI var roistr string roistr, found, err := c.GetString("ROI") if err != nil { return nil, err } if found { parts := strings.Split(roistr, ",") if len(parts) != 2 { return nil, fmt.Errorf("bad ROI value (%q) expected %q", roistr, "<roiname>,<uuid>") } } // Initialize the Data for this data type basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } data := &Data{ Data: basedata, Properties: Properties{ StaticROI: roistr, }, } return data, nil }
// NewData returns a pointer to new ROI data with default values. func (dtype *Type) NewDataService(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (datastore.DataService, error) { basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } s, found, err := c.GetString("BlockSize") if err != nil { return nil, err } var blockSize dvid.Point3d if found { pt, err := dvid.StringToPoint(s, ",") if err != nil { return nil, err } if pt.NumDims() != 3 { return nil, fmt.Errorf("BlockSize must be 3d, not %dd", pt.NumDims()) } blockSize, _ = pt.(dvid.Point3d) } else { blockSize = dvid.Point3d{DefaultBlockSize, DefaultBlockSize, DefaultBlockSize} } d := &Data{ Data: basedata, Properties: Properties{blockSize, math.MaxInt32, math.MinInt32}, ready: make(map[dvid.VersionID]bool), } return d, nil }
// NewData returns a pointer to annotation data. func NewData(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (*Data, error) { // Initialize the Data for this data type basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } data := &Data{ Data: basedata, Properties: Properties{}, } return data, nil }
// NewData returns a pointer to a new Voxels with default values. func (dtype *Type) NewData(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (*Data, error) { basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } var p Properties p.setDefault(dtype.values, dtype.interpolable) if err := p.setByConfig(c); err != nil { return nil, err } data := &Data{ Data: basedata, Properties: p, } return data, nil }
// NewData returns a pointer to labelvol data. func NewData(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (*Data, error) { // Initialize the Data for this data type basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } props := new(Properties) props.setDefault() if err := props.setByConfig(c); err != nil { return nil, err } data := &Data{ Data: basedata, Properties: *props, } data.Properties.MaxLabel = make(map[dvid.VersionID]uint64) return data, nil }
// NewData returns a pointer to labelvol data. func NewData(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (*Data, error) { // Make sure we have a valid labelvol source s, found, err := c.GetString("Source") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make labelsz data without valid 'Source' specifying an associated labelvol.") } srcname := dvid.InstanceName(s) if _, err = labelvol.GetByUUID(uuid, srcname); err != nil { return nil, err } c.Set("sync", s) // This will set base data sync list // Initialize the Data for this data type basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } return &Data{basedata, srcname}, nil }
// NewData returns a pointer to new googlevoxels data with default values. func (dtype *Type) NewDataService(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (datastore.DataService, error) { // Make sure we have needed volumeid and authentication key. volumeid, found, err := c.GetString("volumeid") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make googlevoxels data without valid 'volumeid' setting.") } jwtfile, found, err := c.GetString("jwtfile") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make googlevoxels data without valid 'jwtfile' specifying path to JSON Web Token") } // Read in the JSON Web Token jwtdata, err := ioutil.ReadFile(jwtfile) if err != nil { return nil, fmt.Errorf("Cannot load JSON Web Token file (%s): %v", jwtfile, err) } conf, err := google.JWTConfigFromJSON(jwtdata, "https://www.googleapis.com/auth/brainmaps") if err != nil { return nil, fmt.Errorf("Cannot establish JWT Config file from Google: %v", err) } client := conf.Client(oauth2.NoContext) // Make URL call to get the available scaled volumes. url := fmt.Sprintf("%s/volumes/%s", bmapsPrefix, volumeid) resp, err := client.Get(url) if err != nil { return nil, fmt.Errorf("Error getting volume metadata from Google: %v", err) } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("Unexpected status code %d returned when getting volume metadata for %q", resp.StatusCode, volumeid) } metadata, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } resp.Body.Close() var m struct { Geoms Geometries `json:"geometry"` } if err := json.Unmarshal(metadata, &m); err != nil { return nil, fmt.Errorf("Error decoding volume JSON metadata: %v", err) } dvid.Infof("Successfully got geometries:\nmetadata:\n%s\nparsed JSON:\n%v\n", metadata, m) // Compute the mapping from tile scale/orientation to scaled volume index. geomMap := GeometryMap{} // (1) Find the highest resolution geometry. var highResIndex GeometryIndex minVoxelSize := dvid.NdFloat32{10000, 10000, 10000} for i, geom := range m.Geoms { if geom.PixelSize[0] < minVoxelSize[0] || geom.PixelSize[1] < minVoxelSize[1] || geom.PixelSize[2] < minVoxelSize[2] { minVoxelSize = geom.PixelSize highResIndex = GeometryIndex(i) } } dvid.Infof("Google voxels %q: found highest resolution was geometry %d: %s\n", name, highResIndex, minVoxelSize) // (2) For all geometries, find out what the scaling is relative to the highest resolution pixel size. for i, geom := range m.Geoms { if i == int(highResIndex) { geomMap[GSpec{0, XY}] = highResIndex geomMap[GSpec{0, XZ}] = highResIndex geomMap[GSpec{0, YZ}] = highResIndex geomMap[GSpec{0, XYZ}] = highResIndex } else { scaleX := geom.PixelSize[0] / minVoxelSize[0] scaleY := geom.PixelSize[1] / minVoxelSize[1] scaleZ := geom.PixelSize[2] / minVoxelSize[2] var shape Shape switch { case scaleX > scaleZ && scaleY > scaleZ: shape = XY case scaleX > scaleY && scaleZ > scaleY: shape = XZ case scaleY > scaleX && scaleZ > scaleX: shape = YZ default: shape = XYZ } var mag float32 if scaleX > mag { mag = scaleX } if scaleY > mag { mag = scaleY } if scaleZ > mag { mag = scaleZ } scaling := log2(mag) geomMap[GSpec{scaling, shape}] = GeometryIndex(i) dvid.Infof("%s at scaling %d set to geometry %d: resolution %s\n", shape, scaling, i, geom.PixelSize) } } // Create a client that will be authorized and authenticated on behalf of the account. // Initialize the googlevoxels data basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } data := &Data{ Data: basedata, Properties: Properties{ VolumeID: volumeid, JWT: string(jwtdata), TileSize: DefaultTileSize, GeomMap: geomMap, Scales: m.Geoms, HighResIndex: highResIndex, }, client: client, } return data, nil }
// NewData returns a pointer to new tile data with default values. func (dtype *Type) NewDataService(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (datastore.DataService, error) { // Make sure we have a valid DataService source sourcename, found, err := c.GetString("Source") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make imagetile data without valid 'Source' setting.") } // See if we want placeholder imagetile. placeholder, found, err := c.GetBool("Placeholder") if err != nil { return nil, err } // Determine encoding for tile storage and this dictates what kind of compression we use. encoding, found, err := c.GetString("Format") if err != nil { return nil, err } format := PNG if found { switch strings.ToLower(encoding) { case "lz4": format = LZ4 case "png": format = PNG case "jpg": format = JPG default: return nil, fmt.Errorf("Unknown encoding specified: '%s' (should be 'lz4', 'png', or 'jpg'", encoding) } } // Compression is determined by encoding. Inform user if there's a discrepancy. var compression string switch format { case LZ4: compression = "lz4" case PNG: compression = "none" case JPG: compression = "none" } compressConfig, found, err := c.GetString("Compression") if err != nil { return nil, err } if found && strings.ToLower(compressConfig) != compression { return nil, fmt.Errorf("Conflict between specified compression '%s' and format '%s'. Suggest not dictating compression.", compressConfig, encoding) } c.Set("Compression", compression) // Initialize the imagetile data basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } data := &Data{ Data: basedata, Properties: Properties{ Source: dvid.InstanceName(sourcename), Placeholder: placeholder, Encoding: format, }, } return data, nil }
// NewData returns a pointer to new googlevoxels data with default values. func (dtype *Type) NewDataService(uuid dvid.UUID, id dvid.InstanceID, name dvid.InstanceName, c dvid.Config) (datastore.DataService, error) { // Make sure we have needed volumeid and authentication key. volumeid, found, err := c.GetString("volumeid") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make googlevoxels data without valid 'volumeid' setting.") } authkey, found, err := c.GetString("authkey") if err != nil { return nil, err } if !found { return nil, fmt.Errorf("Cannot make googlevoxels data without valid 'authkey' setting.") } // Make URL call to get the available scaled volumes. url := fmt.Sprintf("https://www.googleapis.com/brainmaps/v1beta1/volumes/%s?key=%s", volumeid, authkey) resp, err := http.Get(url) if err != nil { return nil, fmt.Errorf("Error getting volume metadata from Google: %v", err) } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("Unexpected status code %d returned when getting volume metadata for %q", resp.StatusCode, volumeid) } metadata, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } var m struct { Geoms Geometries `json:"geometrys"` } if err := json.Unmarshal(metadata, &m); err != nil { return nil, fmt.Errorf("Error decoding volume JSON metadata: %v", err) } // Compute the mapping from tile scale/orientation to scaled volume index. tileMap := GeometryMap{} // (1) Find the highest resolution geometry. var highResIndex GeometryIndex minVoxelSize := dvid.NdFloat32{10000, 10000, 10000} for i, geom := range m.Geoms { if geom.PixelSize[0] < minVoxelSize[0] || geom.PixelSize[1] < minVoxelSize[1] || geom.PixelSize[2] < minVoxelSize[2] { minVoxelSize = geom.PixelSize highResIndex = GeometryIndex(i) } } dvid.Infof("Google voxels %q: found highest resolution was geometry %d: %s\n", name, highResIndex, minVoxelSize) // (2) For all geometries, find out what the scaling is relative to the highest resolution pixel size. for i, geom := range m.Geoms { if i == int(highResIndex) { tileMap[TileSpec{0, XY}] = highResIndex tileMap[TileSpec{0, XZ}] = highResIndex tileMap[TileSpec{0, YZ}] = highResIndex } else { scaleX := geom.PixelSize[0] / minVoxelSize[0] scaleY := geom.PixelSize[1] / minVoxelSize[1] scaleZ := geom.PixelSize[2] / minVoxelSize[2] var plane TileOrientation switch { case scaleX > scaleZ && scaleY > scaleZ: plane = XY case scaleX > scaleY && scaleZ > scaleY: plane = XZ case scaleY > scaleX && scaleZ > scaleX: plane = YZ default: dvid.Infof("Odd geometry skipped for Google voxels %q with pixel size: %s\n", name, geom.PixelSize) dvid.Infof(" Scaling from highest resolution: %d x %d x %d\n", scaleX, scaleY, scaleZ) continue } var mag float32 if scaleX > mag { mag = scaleX } if scaleY > mag { mag = scaleY } if scaleZ > mag { mag = scaleZ } scaling := log2(mag) tileMap[TileSpec{scaling, plane}] = GeometryIndex(i) dvid.Infof("Plane %s at scaling %d set to geometry %d: resolution %s\n", plane, scaling, i, geom.PixelSize) } } // Initialize the googlevoxels data basedata, err := datastore.NewDataService(dtype, uuid, id, name, c) if err != nil { return nil, err } data := &Data{ Data: basedata, Properties: Properties{ VolumeID: volumeid, AuthKey: authkey, TileSize: DefaultTileSize, TileMap: tileMap, Scales: m.Geoms, HighResIndex: highResIndex, }, } return data, nil }