def __setitem__(self, key, spec): assert isinstance(key, ArrayKey) or isinstance(key, GraphKey), \ f"Only ArrayKey or GraphKey (not {type(key).__name__} are " \ "allowed as key for ProviderSpec, " if isinstance(key, ArrayKey): if isinstance(spec, Roi): spec = ArraySpec(roi=spec) assert isinstance(spec, ArraySpec), \ f"Only ArraySpec (not {type(spec).__name__}) can be set for " \ "ArrayKey" self.array_specs[key] = spec.copy() else: if isinstance(spec, Roi): spec = GraphSpec(roi=spec) assert isinstance(spec, GraphSpec), \ f"Only GraphSpec (not {type(spec).__name__}) can be set for " \ "GraphKey" self.graph_specs[key] = spec.copy()
class DaCapoArraySource(gp.BatchProvider): """A DaCapo Array source node Args: Array (Array): The DaCapo Array to pull data from key (``gp.ArrayKey``): The key to provide data into """ def __init__(self, array: Array, key: gp.ArrayKey): self.array = array self.array_spec = ArraySpec(roi=self.array.roi, voxel_size=self.array.voxel_size) self.key = key def setup(self): self.provides(self.key, self.array_spec.copy()) def provide(self, request): output = gp.Batch() timing_provide = Timing(self, "provide") timing_provide.start() spec = self.array_spec.copy() spec.roi = request[self.key].roi data = self.array[spec.roi] if "c" not in self.array.axes: # add a channel dimension data = np.expand_dims(data, 0) if np.any(np.isnan(data)): raise ValueError("INPUT DATA CAN'T BE NAN") output[self.key] = gp.Array(data, spec=spec) timing_provide.stop() output.profiling_stats.add(timing_provide) return output