def write_experiment_json( path: str, fov_count: int, tile_format: ImageFormat, *, primary_image_dimensions: Mapping[Union[str, Axes], int], aux_name_to_dimensions: Mapping[str, Mapping[Union[str, Axes], int]], primary_tile_fetcher: Optional[TileFetcher]=None, aux_tile_fetcher: Optional[Mapping[str, TileFetcher]]=None, postprocess_func: Optional[Callable[[dict], dict]]=None, default_shape: Optional[Mapping[Axes, int]]=None, dimension_order: Sequence[Axes]=(Axes.ZPLANE, Axes.ROUND, Axes.CH), ) -> None: """ Build and returns a top-level experiment description with the following characteristics: Parameters ---------- path : str Directory to write the files to. fov_count : int Number of fields of view in this experiment. primary_image_dimensions : Mapping[Union[str, Axes], int] Dictionary mapping dimension name to dimension size for the primary image. aux_name_to_dimensions : Mapping[str, Mapping[Union[str, Axes], int]] Dictionary mapping the auxiliary image type to dictionaries, which map from dimension name to dimension size. primary_tile_fetcher : Optional[TileFetcher] TileFetcher for primary images. Set this if you want specific image data to be set for the primary images. If not provided, the image data is set to random noise via :class:`RandomNoiseTileFetcher`. aux_tile_fetcher : Optional[Mapping[str, TileFetcher]] TileFetchers for auxiliary images. Set this if you want specific image data to be set for one or more aux image types. If not provided for any given aux image, the image data is set to random noise via :class:`RandomNoiseTileFetcher`. postprocess_func : Optional[Callable[[dict], dict]] If provided, this is called with the experiment document for any postprocessing. An example of this would be to add something to one of the top-level extras field. The callable should return what is to be written as the experiment document. default_shape : Optional[Tuple[int, int]] (default = None) Default shape for the tiles in this experiment. dimension_order : Sequence[Axes] Ordering for which dimensions vary, in order of the slowest changing dimension to the fastest. For instance, if the order is (ROUND, Z, CH) and each dimension has size 2, then the sequence is: (ROUND=0, CH=0, Z=0) (ROUND=0, CH=1, Z=0) (ROUND=0, CH=0, Z=1) (ROUND=0, CH=1, Z=1) (ROUND=1, CH=0, Z=0) (ROUND=1, CH=1, Z=0) (ROUND=1, CH=0, Z=1) (ROUND=1, CH=1, Z=1) (default = (Axes.Z, Axes.ROUND, Axes.CH)) """ if primary_tile_fetcher is None: primary_tile_fetcher = tile_fetcher_factory(RandomNoiseTile) if aux_tile_fetcher is None: aux_tile_fetcher = {} if postprocess_func is None: postprocess_func = lambda doc: doc experiment_doc: Dict[str, Any] = { 'version': str(CURRENT_VERSION), 'images': {}, 'extras': {}, } primary_image = build_image( range(fov_count), range(primary_image_dimensions[Axes.ROUND]), range(primary_image_dimensions[Axes.CH]), range(primary_image_dimensions[Axes.ZPLANE]), primary_tile_fetcher, axes_order=dimension_order, default_shape=default_shape, ) Writer.write_to_path( primary_image, os.path.join(path, "primary_images.json"), pretty=True, partition_path_generator=_fov_path_generator, tile_opener=_tile_opener, tile_format=tile_format, ) experiment_doc['images']['primary'] = "primary_images.json" for aux_name, aux_dimensions in aux_name_to_dimensions.items(): if aux_dimensions is None: continue auxiliary_image = build_image( range(fov_count), range(aux_dimensions[Axes.ROUND]), range(aux_dimensions[Axes.CH]), range(aux_dimensions[Axes.ZPLANE]), aux_tile_fetcher.get(aux_name, tile_fetcher_factory(RandomNoiseTile)), axes_order=dimension_order, default_shape=default_shape, ) Writer.write_to_path( auxiliary_image, os.path.join(path, "{}.json".format(aux_name)), pretty=True, partition_path_generator=_fov_path_generator, tile_opener=_tile_opener, tile_format=tile_format, ) experiment_doc['images'][aux_name] = "{}.json".format(aux_name) experiment_doc["codebook"] = "codebook.json" codebook_array = [ { "codeword": [ {"r": 0, "c": 0, "v": 1}, ], "target": "PLEASE_REPLACE_ME" }, ] codebook = Codebook.from_code_array(codebook_array) codebook_json_filename = "codebook.json" codebook.to_json(os.path.join(path, codebook_json_filename)) experiment_doc = postprocess_func(experiment_doc) with open(os.path.join(path, "experiment.json"), "w") as fh: json.dump(experiment_doc, fh, indent=4)
def simple_codebook_json(simple_codebook_array) -> Generator[str, None, None]: with tempfile.NamedTemporaryFile() as tf: codebook = Codebook.from_code_array(simple_codebook_array) codebook.to_json(tf.name) yield tf.name