diff --git a/cloudvolume/datasource/precomputed/__init__.py b/cloudvolume/datasource/precomputed/__init__.py index 23668fd0..d6b48439 100644 --- a/cloudvolume/datasource/precomputed/__init__.py +++ b/cloudvolume/datasource/precomputed/__init__.py @@ -1,5 +1,7 @@ from typing import Optional, Union +import os + from .image import PrecomputedImageSource from .metadata import PrecomputedMetadata from .mesh import PrecomputedMeshSource @@ -58,13 +60,29 @@ def create_precomputed( use_https=use_https # for parsing redirects ) + readonly = bool(meta.redirected_from) + + if meta.info.get("@type", "") == "neuroglancer_skeletons": + info = meta.info + meta = synthetic_meta(cloudpath, config, cache_service) + meta.info["skeletons"] = os.path.basename(cloudpath) + skeleton = PrecomputedSkeletonSource(meta, cache_service, config, readonly, info=info) + else: + skeleton = PrecomputedSkeletonSource(meta, cache_service, config, readonly) + + if meta.info.get("@type", "") in ["neuroglancer_legacy_mesh", "neuroglancer_multilod_draco"]: + info = meta.info + meta = synthetic_meta(cloudpath, config, cache_service) + meta.info["mesh"] = os.path.basename(cloudpath) + mesh = PrecomputedMeshSource(meta, cache_service, config, readonly, info=info) + else: + mesh = PrecomputedMeshSource(meta, cache_service, config, readonly) + if mesh_dir: meta.info['mesh'] = str(mesh_dir) if skel_dir: meta.info['skeletons'] = str(skel_dir) - readonly = bool(meta.redirected_from) - if readonly: print(yellow(""" Redirected @@ -99,9 +117,6 @@ def create_precomputed( lru_bytes=lru_bytes, ) - mesh = PrecomputedMeshSource(meta, cache_service, config, readonly) - skeleton = PrecomputedSkeletonSource(meta, cache_service, config, readonly) - cv = CloudVolumePrecomputed( meta, cache_service, config, image, mesh, skeleton, @@ -113,6 +128,25 @@ def create_precomputed( return cv +def synthetic_meta(cloudpath, config, cache_service) -> PrecomputedMetadata: + info = PrecomputedMetadata.create_info( + num_channels=1, + layer_type="segmentation", + data_type='uint8', + encoding="raw", + resolution=[1,1,1], + voxel_offset=[0,0,0], + volume_size=[1,1,1], + ) + return PrecomputedMetadata( + os.path.dirname(cloudpath), + config=config, + cache=cache_service, + info=info, provenance=None, + max_redirects=0, + use_https=True # for parsing redirects + ) + def register(): register_plugin('precomputed', create_precomputed) \ No newline at end of file diff --git a/cloudvolume/datasource/precomputed/metadata.py b/cloudvolume/datasource/precomputed/metadata.py index 9b272047..d8c98156 100644 --- a/cloudvolume/datasource/precomputed/metadata.py +++ b/cloudvolume/datasource/precomputed/metadata.py @@ -189,6 +189,9 @@ def refresh_info(self, max_redirects=10, force_fetch=False): def parse_rois(self, info) -> List[Bbox]: """Parse ROIs from the info file at mip 0.""" + if 'scales' not in info: + return None + scale = info['scales'][0] if 'rois' not in scale: return None diff --git a/cloudvolume/skeleton.py b/cloudvolume/skeleton.py index 7bce8989..5082d2fb 100644 --- a/cloudvolume/skeleton.py +++ b/cloudvolume/skeleton.py @@ -1262,7 +1262,7 @@ def __str__(self): template.format(attr, buf.shape[0], buf.dtype) ) - return "Skeleton(segid={}, vertices=(shape={}, {}), edges=(shape={}, {}), {}, space='{}' transform={})".format( + return "Skeleton(segid={}, vertices=(shape={}, {}), edges=(shape={}, {}), {}, space='{}', transform={})".format( self.id, self.vertices.shape[0], self.vertices.dtype, self.edges.shape[0], self.edges.dtype,