From 4b7382bdc5f4cec4424c31e8d398a1e6f53ffdb6 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Apr 2025 16:46:45 -0400 Subject: [PATCH 001/157] wip: zarr 3 and sharding support --- linc_convert/modalities/lsm/spool.py | 62 +++++--------- linc_convert/utils/zarr/compressor.py | 25 +++--- linc_convert/utils/zarr/generate_pyramid.py | 28 ++++--- linc_convert/utils/zarr/zarr_config.py | 92 ++++++++++++++++++--- pyproject.toml | 2 +- 5 files changed, 134 insertions(+), 75 deletions(-) diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 82f27d82..3e8b3aef 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -21,7 +21,8 @@ from linc_convert.utils.spool import SpoolSetInterpreter from linc_convert.utils.zarr.compressor import make_compressor from linc_convert.utils.zarr.generate_pyramid import generate_pyramid -from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_config import ZarrConfig, open_zarr_group, \ + create_array spool = cyclopts.App(name="spool", help_format="markdown") lsm.command(spool) @@ -38,13 +39,11 @@ def convert( inp: str, *, - out: str, - zarr_config: ZarrConfig = None, - overlap: int = 30, - max_load: int = 512, + overlap: int = 192, orientation: str = "coronal", center: bool = True, voxel_size: list[float] = (1, 1, 1), + zarr_config: ZarrConfig | None = None, **kwargs ) -> None: """ @@ -74,27 +73,19 @@ def convert( ---------- inp Path to the root directory, which contains a collection of - subfolders named `*_z{:02d}_y{:02d}*`, each containing a - collection of files named `*_plane{:03d}_c{:d}.tiff`. - out - Path to the output Zarr directory [.ome.zarr] - max_load - Maximum input chunk size when building pyramid + subfolders named `*_run{:d}__z{:02d}_y{:02d}*`, each containing a + collection of spool files named '{:010d}spool.dat'. + TODO: add instrution for metadata file and info file orientation Orientation of the slice center Set RAS[0, 0, 0] at FOV center voxel_size Voxel size along the X, Y and Z dimension, in micron. + kwargs + used for internal api """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk[0] - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) CHUNK_PATTERN = re.compile( r"^(?P\w*)" @@ -135,10 +126,7 @@ def convert( tiles_info_by_index[(tile.y, tile.z)] = tile # Set default output path if not provided - if not out: - out = all_tiles_info[0].prefix + all_tiles_info[0].suffix - out += ".nii.zarr" if nii else ".ome.zarr" - nii = nii or out.endswith(".nii.zarr") + zarr_config.set_default_name(all_tiles_info[0].prefix + all_tiles_info[0].suffix) # Determine unique Y and Z tile indices z_tiles = set(tile.z for tile in all_tiles_info) @@ -152,7 +140,8 @@ def convert( expected_sx = 0 expected_sy = {} expected_sz = {} - all_shapes = np.empty((num_y_tiles, num_z_tiles, 3), dtype=int) + # TODO: as it is zero, if a tile is missing, it will make dimension mismatch + all_shapes = np.zeros((num_y_tiles, num_z_tiles, 3), dtype=int) # Collect shape and dtype info from all tiles for z_tile in range(min_z_tile, max_z_tile + 1): @@ -204,25 +193,14 @@ def convert( full_shape_x = expected_sx full_shape_y = sum(expected_sy.values()) - (num_y_tiles - 1) * overlap full_shape_z = sum(expected_sz.values()) - fullshape = [full_shape_z, full_shape_y, full_shape_x] + fullshape = (full_shape_z, full_shape_y, full_shape_x) # Initialize Zarr group and array - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) - print(out) - # Prepare chunking options - opt = { - "chunks": [chunk] * 3, - "dimension_separator": r"/", - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - - # write first level - omz.create_dataset("0", shape=fullshape, **opt) - array = omz["0"] + omz = open_zarr_group(zarr_config) + array = create_array(omz, "0", shape=fullshape, zarr_config=zarr_config, dtype=dtype) + # TODO: logger + # print(out) + print("Write level 0 with shape", fullshape) # Populate Zarr array from tiles @@ -256,11 +234,11 @@ def convert( print("") # Generate Zarr pyramid and metadata - generate_pyramid(omz) + generate_pyramid(omz, zarr_config) write_ome_metadata(omz, axes = ["z","y","x"],space_scale=voxel_size) # Write NIfTI-Zarr header: - if not nii: + if not zarr_config.nii: return header = default_nifti_header(omz["0"], omz) diff --git a/linc_convert/utils/zarr/compressor.py b/linc_convert/utils/zarr/compressor.py index 76531bcd..030f7e06 100644 --- a/linc_convert/utils/zarr/compressor.py +++ b/linc_convert/utils/zarr/compressor.py @@ -1,19 +1,24 @@ """Functions for zarr compression.""" +from typing import Any -import numcodecs -import numcodecs.abc +import zarr.codecs +from zarr import abc - -def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: +def make_compressor(name: str, **prm: dict) -> Any: """Build compressor object from name and options.""" # TODO: we should use `numcodecs.get_codec` instead` if not isinstance(name, str): return name + + compressor_map = { + "blosc": zarr.codecs.BloscCodec, + "zlib": zarr.codecs.ZstdCodec, + } + name = name.lower() - if name == "blosc": - Compressor = numcodecs.Blosc - elif name == "zlib": - Compressor = numcodecs.Zlib - else: - raise ValueError("Unknown compressor", name) + + if name not in compressor_map: + raise ValueError('Unknown compressor', name) + Compressor = compressor_map[name] + return Compressor(**prm) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 0ea3e342..dd19b865 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -8,10 +8,12 @@ from linc_convert.utils.math import ceildiv from linc_convert.utils.unit import convert_unit +from linc_convert.utils.zarr.zarr_config import create_array def generate_pyramid( omz: zarr.Group, + zarr_config, levels: int | None = None, ndim: int = 3, max_load: int = 512, @@ -23,8 +25,8 @@ def generate_pyramid( Parameters ---------- - path : PathLike | str - Path to parent Zarr + omz : zarr.Group + levels : int Number of additional levels to generate. By default, stop when all dimensions are smaller than their @@ -53,15 +55,17 @@ def generate_pyramid( # Read properties from base level shape = list(omz["0"].shape) + dtype = omz["0"].dtype chunk_size = omz["0"].chunks - opt = { - "dimension_separator": omz["0"]._dimension_separator, - "order": omz["0"]._order, - "dtype": omz["0"]._dtype, - "fill_value": omz["0"]._fill_value, - "compressor": omz["0"]._compressor, - "chunks": omz["0"].chunks, - } + # arr:zarr.Array = omz["0"] + # opt = { + # "dimension_separator": omz["0"]._dimension_separator, + # "order": omz["0"]._order, + # "dtype": omz["0"]._dtype, + # "fill_value": omz["0"]._fill_value, + # "compressor": omz["0"]._compressor, + # "chunks": omz["0"].chunks, + # } # Select windowing function if mode == "median": @@ -95,8 +99,8 @@ def generate_pyramid( print("Compute level", level, "with shape", shape) allshapes.append(shape) - omz.create_dataset(str(level), shape=batch + shape, **opt) - + # omz.create_dataset(str(level), shape=batch + shape, **opt) + create_array(omz,str(level), shape= batch+shape, zarr_config=zarr_config, dtype= dtype) # Iterate across `max_load` chunks # (note that these are unrelared to underlying zarr chunks) grid_shape = [ceildiv(n, max_load) for n in prev_shape] diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 2fb8e67e..17db7cd5 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -1,10 +1,15 @@ """Configuration related to output Zarr Archive.""" - +import dataclasses +import os from dataclasses import dataclass, replace from typing import Annotated, Literal +import numpy as np from cyclopts import Parameter from typing_extensions import Unpack +import zarr + +from linc_convert.utils.zarr.compressor import make_compressor @dataclass @@ -32,29 +37,96 @@ class _ZarrConfig: Compression options nii Convert to nifti-zarr. True if path ends in ".nii.zarr". + + overwrite + when no name is supplied and using default output name, if overwrite is set, + it won't ask if overwrite driver : {"zarr-python", "tensorstore", "zarrita"} library used for Zarr IO Operation """ - + out: str = None + zarr_version: Literal[2, 3] = 3 chunk: tuple[int] = (128,) - shard: list[int | str] | None = None - version: Literal[2, 3] = 3 - compressor: str = "blosc" - compressor_opt: str = "{}" + chunk_channels: bool = False + chunk_time: bool = False + shard: tuple[int | str] | None = None + shard_channel: bool = False + shard_time: bool = False + dimension_separator: Literal[".", "/"] = "/" + order: Literal["C", "F"] = "C" + compressor: Literal["blosc", "zlib", None] = "blosc" + compressor_opt: dict = dataclasses.field(default_factory=dict) + no_pyramid_axis: Literal["x", "y", "z", None] = None + levels: int = -1 + ome_version: Literal["0.4","0.5"] = "0.4" nii: bool = False - driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" + max_load: int = 512 + overwrite: bool = False + # driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" def __post_init__(self) -> None: - pass - # self.nii |= self.out.endswith(".nii.zarr") + self.nii |= self.out.endswith(".nii.zarr") + + def set_default_name(self, name: str): + if self.out is not None: + return + self.out = name + self.out += ".nii.zarr" if self.nii else ".ome.zarr" + if os.path.exists(self.out) and not self.overwrite: + answer = input( + f"The output path '{self.out}' already exists. Do you want to overwrite it? (y/n): ") + if answer.lower() not in ("y", "yes"): + raise FileExistsError( + f"Output path '{self.out}' exists and overwrite was not confirmed.") + def update(self, **kwargs): + replace(self, **kwargs) + return self ZarrConfig = Annotated[_ZarrConfig, Parameter(name="*")] -def update(zarr_config: ZarrConfig, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: +def update(zarr_config: ZarrConfig|None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: zarr_config = _ZarrConfig() replace(zarr_config, **kwargs) return zarr_config + +def open_zarr_group(zarr_config:ZarrConfig): + store = zarr.storage.LocalStore(zarr_config.out) + return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) + + +def create_array(omz: zarr.Group, name:str, shape:tuple, zarr_config:ZarrConfig, data=None, dtype=None) -> zarr.Array: + compressor = zarr_config.compressor + compressor_opt = zarr_config.compressor_opt + # if isinstance(compressor_opt, str): + # compressor_opt = ast.literal_eval(compressor_opt) + opt = { + "chunks": [*zarr_config.chunk] * 3, + "order": zarr_config.order, + "dtype": np.dtype(dtype).str, + "fill_value": None, + "compressors": make_compressor(compressor, **compressor_opt), + } + + dimension_separator = zarr_config.dimension_separator + if dimension_separator == '.' and omz.metadata.zarr_format == 2: + pass + elif dimension_separator == '/' and omz.metadata.zarr_format == 3: + pass + else: + from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams + dimension_separator = ChunkKeyEncodingParams( + name="default" if omz.metadata.zarr_format == 3 else "v2", + separator=dimension_separator) + + opt["chunk_key_encoding"] = dimension_separator + + arr= omz.create_array(name=name, + shape=shape, + **opt) + if data: + arr[:] = data + return arr \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9f9b9468..29f16a40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ python = "^3.10" cyclopts = "^3.0.0" numpy = "*" nibabel = "*" -zarr = "^2.0.0" +zarr = "^3.0.0" nifti-zarr = "*" [tool.poetry.group.df] From fd640963481a17c537c163c5b9a0c941ed65e18b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Apr 2025 10:40:46 -0400 Subject: [PATCH 002/157] wip: zarr 3 and sharding, add auto shard size --- linc_convert/utils/zarr/zarr_config.py | 135 +++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 11 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 17db7cd5..78d4292b 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -1,17 +1,21 @@ """Configuration related to output Zarr Archive.""" -import dataclasses +import ast import os from dataclasses import dataclass, replace from typing import Annotated, Literal import numpy as np +import zarr from cyclopts import Parameter from typing_extensions import Unpack -import zarr from linc_convert.utils.zarr.compressor import make_compressor - +SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio + 2 * # TB + 2 ** 30 # TB->Bytes + # I use 2GB for now + ) @dataclass class _ZarrConfig: """ @@ -24,7 +28,7 @@ class _ZarrConfig: Behavior depends on the number of values provided: * one: used for all spatial dimensions * three: used for spatial dimensions ([z, y, x]) - * four: used for channels and spatial dimensions ([c, z, y, x]) + * four+: used for channels and spatial dimensions ([c, z, y, x]) shard Output shard size. If `"auto"`, find shard size that ensures files smaller than 2TB, @@ -50,13 +54,14 @@ class _ZarrConfig: chunk: tuple[int] = (128,) chunk_channels: bool = False chunk_time: bool = False - shard: tuple[int | str] | None = None + shard: tuple[int] | Literal["auto"] | None = None shard_channel: bool = False shard_time: bool = False dimension_separator: Literal[".", "/"] = "/" order: Literal["C", "F"] = "C" compressor: Literal["blosc", "zlib", None] = "blosc" - compressor_opt: dict = dataclasses.field(default_factory=dict) + compressor_opt: str = "{}" + no_time: bool = False no_pyramid_axis: Literal["x", "y", "z", None] = None levels: int = -1 ome_version: Literal["0.4","0.5"] = "0.4" @@ -67,6 +72,9 @@ class _ZarrConfig: def __post_init__(self) -> None: self.nii |= self.out.endswith(".nii.zarr") + if self.zarr_version == 2: + if self.shard or self.shard_channel or self.shard_time: + raise NotImplementedError("Shard is not supported for Zarr 2.") def set_default_name(self, name: str): if self.out is not None: @@ -98,13 +106,24 @@ def open_zarr_group(zarr_config:ZarrConfig): return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) -def create_array(omz: zarr.Group, name:str, shape:tuple, zarr_config:ZarrConfig, data=None, dtype=None) -> zarr.Array: +def create_array( + omz: zarr.Group, + name: str, + shape: tuple, + zarr_config: ZarrConfig, + dtype: np.dtype = np.int32, + data=None +) -> zarr.Array: compressor = zarr_config.compressor compressor_opt = zarr_config.compressor_opt - # if isinstance(compressor_opt, str): - # compressor_opt = ast.literal_eval(compressor_opt) + chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + + if isinstance(compressor_opt, str): + compressor_opt = ast.literal_eval(compressor_opt) + opt = { - "chunks": [*zarr_config.chunk] * 3, + "chunks": chunk, + "shards": shard, "order": zarr_config.order, "dtype": np.dtype(dtype).str, "fill_value": None, @@ -129,4 +148,98 @@ def create_array(omz: zarr.Group, name:str, shape:tuple, zarr_config:ZarrConfig, **opt) if data: arr[:] = data - return arr \ No newline at end of file + return arr + + +def compute_zarr_layout(shape: tuple, dtype: np.dtype, zarr_config: ZarrConfig): + chunk = zarr_config.chunk + if len(shape) == 5: + chunk_tc = ( + 1 if zarr_config.chunk_time else shape[0], + 1 if zarr_config.chunk_channels else shape[1], + ) + shard_tc = ( + chunk_tc[0] if zarr_config.shard_time else shape[0], + chunk_tc[1] if zarr_config.shard_channel else shape[1] + ) + if zarr_config.no_time: + raise ValueError('no_time is not supported for 5D data') + + elif len(shape) == 4: + if zarr_config.no_time: + chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_channel else shape[0],) + else: + chunk_tc = (1 if zarr_config.chunk_time else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) + elif len(shape) == 3: + chunk_tc = tuple() + shard_tc = tuple() + else: + raise ValueError("Zarr layout only supports 3+ dimensions.") + + if len(chunk) > len(shape): + raise ValueError("Provided chunk size has more dimension than data") + if len(zarr_config.chunk) != len(shape): + chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) + + shard = zarr_config.shard + + if shard is None: + return chunk, shard + if isinstance(shard, tuple) and len(shard) == len(shape): + return chunk, shard + if isinstance(shard, tuple) and len(shard) > len(shape): + raise ValueError("Provided shard size has more dimension than data") + chunk_spatial = chunk[-3:] + if shard == "auto": + itemsize = dtype.itemsize + chunk_size = np.prod(chunk_spatial) * itemsize + shard_size = np.prod(shard_tc) * chunk_size + # total_chunks_allowed = SHARD_FILE_SIZE_LIMIT / shard_size + B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size + multiplier = int(B_multiplier ** (1 / 3)) + if multiplier < 1: + multiplier = 1 + + shape_spatial = shape[-3:] + # For each spatial dimension, the minimal multiplier needed to cover the data: + L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] + dims = len(chunk_spatial) + + shard = tuple(int(c * multiplier) for c in chunk_spatial) + m_uniform = int(B_multiplier ** (1 / dims)) + M = [] + free_dims = [] + for i in range(dims): + # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. + if m_uniform * chunk_spatial[i] >= shape_spatial[i]: + M.append(L[i]) + else: + M.append(m_uniform) + free_dims.append(i) + + # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. + improved = True + while improved and free_dims: + improved = False + for i in free_dims: + candidate = M[i] + 1 + # If increasing would exceed the data size in this dimension, + # clamp to the minimal covering multiplier. + if candidate * chunk_spatial[i] >= shape_spatial[i]: + candidate = L[i] + new_product = np.prod( + [candidate if j == i else M[j] for j in range(dims)] + ) + if new_product <= B_multiplier and candidate > M[i]: + M[i] = candidate + improved = True + # Remove dimensions that have reached or exceeded the data size. + free_dims = [i for i in free_dims if + M[i] * chunk_spatial[i] < shape_spatial[i]] + auto_shard_spatial = tuple(M[i] * chunk_spatial[i] for i in range(dims)) + shard = auto_shard_spatial + + shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) + return chunk, shard From 0713701239527d24daa0d9cc527dcad9e1518e54 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Apr 2025 10:49:31 -0400 Subject: [PATCH 003/157] wip: cleanup --- linc_convert/utils/zarr/zarr_config.py | 38 ++++++++++++++------------ 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 78d4292b..da0f39af 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -151,9 +151,15 @@ def create_array( return arr -def compute_zarr_layout(shape: tuple, dtype: np.dtype, zarr_config: ZarrConfig): - chunk = zarr_config.chunk - if len(shape) == 5: +def compute_zarr_layout( + shape: tuple, + dtype: np.dtype, + zarr_config: ZarrConfig +) -> tuple[tuple, tuple | None]: + ndim = len(shape) + if ndim == 5: + if zarr_config.no_time: + raise ValueError('no_time is not supported for 5D data') chunk_tc = ( 1 if zarr_config.chunk_time else shape[0], 1 if zarr_config.chunk_channels else shape[1], @@ -162,41 +168,40 @@ def compute_zarr_layout(shape: tuple, dtype: np.dtype, zarr_config: ZarrConfig): chunk_tc[0] if zarr_config.shard_time else shape[0], chunk_tc[1] if zarr_config.shard_channel else shape[1] ) - if zarr_config.no_time: - raise ValueError('no_time is not supported for 5D data') - elif len(shape) == 4: + elif ndim == 4: if zarr_config.no_time: chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) shard_tc = (chunk_tc[0] if zarr_config.shard_channel else shape[0],) else: chunk_tc = (1 if zarr_config.chunk_time else shape[0],) shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) - elif len(shape) == 3: + elif ndim == 3: chunk_tc = tuple() shard_tc = tuple() else: raise ValueError("Zarr layout only supports 3+ dimensions.") - if len(chunk) > len(shape): + chunk = zarr_config.chunk + if len(chunk) > ndim: raise ValueError("Provided chunk size has more dimension than data") - if len(zarr_config.chunk) != len(shape): + if len(zarr_config.chunk) != ndim: chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) shard = zarr_config.shard - if shard is None: - return chunk, shard - if isinstance(shard, tuple) and len(shard) == len(shape): - return chunk, shard - if isinstance(shard, tuple) and len(shard) > len(shape): + if isinstance(shard, tuple) and len(shard) > ndim: raise ValueError("Provided shard size has more dimension than data") + # If shard is not used or is fully specified, return early. + if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): + return chunk, shard + chunk_spatial = chunk[-3:] if shard == "auto": + # Compute auto shard sizes based on the file size limit. itemsize = dtype.itemsize chunk_size = np.prod(chunk_spatial) * itemsize shard_size = np.prod(shard_tc) * chunk_size - # total_chunks_allowed = SHARD_FILE_SIZE_LIMIT / shard_size B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size multiplier = int(B_multiplier ** (1 / 3)) if multiplier < 1: @@ -238,8 +243,7 @@ def compute_zarr_layout(shape: tuple, dtype: np.dtype, zarr_config: ZarrConfig): # Remove dimensions that have reached or exceeded the data size. free_dims = [i for i in free_dims if M[i] * chunk_spatial[i] < shape_spatial[i]] - auto_shard_spatial = tuple(M[i] * chunk_spatial[i] for i in range(dims)) - shard = auto_shard_spatial + shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) return chunk, shard From 5b331d6b4267ecfd9358130aea83dbdd89b9e2af Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Apr 2025 11:41:15 -0400 Subject: [PATCH 004/157] wip --- linc_convert/modalities/lsm/spool.py | 2 +- linc_convert/utils/spool.py | 3 +- linc_convert/utils/zarr/compressor.py | 5 +-- linc_convert/utils/zarr/generate_pyramid.py | 48 +++++++++++---------- linc_convert/utils/zarr/zarr_config.py | 18 ++++++-- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 3e8b3aef..65c65e8f 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -234,7 +234,7 @@ def convert( print("") # Generate Zarr pyramid and metadata - generate_pyramid(omz, zarr_config) + generate_pyramid(omz, levels=zarr_config.levels) write_ome_metadata(omz, axes = ["z","y","x"],space_scale=voxel_size) # Write NIfTI-Zarr header: diff --git a/linc_convert/utils/spool.py b/linc_convert/utils/spool.py index 6bd30a0b..aae6da70 100644 --- a/linc_convert/utils/spool.py +++ b/linc_convert/utils/spool.py @@ -137,7 +137,7 @@ def _load_spool_file(self, spool_file_name): array = np.frombuffer(self.spool_set[spool_file_name], dtype=self.dtype) elif self.type == 'dir': file = self._make_filename_from_spool_set(spool_file_name) - print(f'Reading file {spool_file_name}') + # print(f'Reading file {spool_file_name}') with open(file, 'rb') as f: array = np.frombuffer(f.read(), dtype=self.dtype) return np.reshape(array, self.spool_shape) @@ -184,7 +184,6 @@ def assemble(self): start = idx * axis_0_shape stop = start + axis_0_shape canvas[start:stop] = spool_file - print(canvas.shape) return canvas # this is the modified version for lsm pipeline diff --git a/linc_convert/utils/zarr/compressor.py b/linc_convert/utils/zarr/compressor.py index 030f7e06..21de8119 100644 --- a/linc_convert/utils/zarr/compressor.py +++ b/linc_convert/utils/zarr/compressor.py @@ -2,11 +2,10 @@ from typing import Any import zarr.codecs -from zarr import abc -def make_compressor(name: str, **prm: dict) -> Any: + +def make_compressor(name: str | None, **prm: dict) -> Any: """Build compressor object from name and options.""" - # TODO: we should use `numcodecs.get_codec` instead` if not isinstance(name, str): return name diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index dd19b865..6401ce74 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -1,20 +1,15 @@ import itertools -import re -from typing import Any, Literal +from typing import Literal -import nibabel as nib import numpy as np import zarr from linc_convert.utils.math import ceildiv -from linc_convert.utils.unit import convert_unit -from linc_convert.utils.zarr.zarr_config import create_array def generate_pyramid( omz: zarr.Group, - zarr_config, - levels: int | None = None, + levels: int = -1, ndim: int = 3, max_load: int = 512, mode: Literal["mean", "median"] = "median", @@ -54,18 +49,10 @@ def generate_pyramid( max_load += 1 # Read properties from base level - shape = list(omz["0"].shape) - dtype = omz["0"].dtype - chunk_size = omz["0"].chunks - # arr:zarr.Array = omz["0"] - # opt = { - # "dimension_separator": omz["0"]._dimension_separator, - # "order": omz["0"]._order, - # "dtype": omz["0"]._dtype, - # "fill_value": omz["0"]._fill_value, - # "compressor": omz["0"]._compressor, - # "chunks": omz["0"].chunks, - # } + base_level = omz["0"] + shape = list(base_level.shape) + chunk_size = base_level.chunks + opts = get_zarray_options(base_level) # Select windowing function if mode == "median": @@ -90,7 +77,7 @@ def generate_pyramid( shape.append(max(1, length // 2)) # Stop if seen enough levels or level shape smaller than chunk size - if levels is None: + if levels == -1: if all(x <= c for x, c in zip(shape, chunk_size[-ndim:])): break elif level > levels: @@ -99,8 +86,8 @@ def generate_pyramid( print("Compute level", level, "with shape", shape) allshapes.append(shape) - # omz.create_dataset(str(level), shape=batch + shape, **opt) - create_array(omz,str(level), shape= batch+shape, zarr_config=zarr_config, dtype= dtype) + omz.create_array(str(level), shape=batch + shape, **opts) + # Iterate across `max_load` chunks # (note that these are unrelared to underlying zarr chunks) grid_shape = [ceildiv(n, max_load) for n in prev_shape] @@ -174,4 +161,19 @@ def generate_pyramid( return allshapes - +def get_zarray_options(base_level): + return dict( + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=base_level.shards, + filters=base_level.filters, + compressors=base_level.compressors, + serializer=base_level.serializer, + fill_value=base_level.fill_value, + order=base_level.order, + # zarr_format=base_level.metadata.zarr_format, + attributes=base_level.metadata.attributes, + chunk_key_encoding=base_level.metadata.chunk_key_encoding, + dimension_names=base_level.metadata.dimension_names, + overwrite=True, + ) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index da0f39af..bded2b88 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -7,6 +7,7 @@ import numpy as np import zarr from cyclopts import Parameter +from numpy._typing import DTypeLike from typing_extensions import Unpack from linc_convert.utils.zarr.compressor import make_compressor @@ -29,10 +30,18 @@ class _ZarrConfig: * one: used for all spatial dimensions * three: used for spatial dimensions ([z, y, x]) * four+: used for channels and spatial dimensions ([c, z, y, x]) + If `"auto"`, find chunk size smaller than 1 MB (TODO: not implemented) + chunk_channels: + Put channels in different chunk. + If False, combine all channels in a single chunk. + chunk_time : + Put timepoints in different chunk. + If False, combine all timepoints in a single chunk. shard Output shard size. If `"auto"`, find shard size that ensures files smaller than 2TB, assuming a compression ratio or 2. + version Zarr version to use. If `shard` is used, 3 is required. compressor : {blosc, zlib|gzip, raw} @@ -53,10 +62,10 @@ class _ZarrConfig: zarr_version: Literal[2, 3] = 3 chunk: tuple[int] = (128,) chunk_channels: bool = False - chunk_time: bool = False + chunk_time: bool = True shard: tuple[int] | Literal["auto"] | None = None shard_channel: bool = False - shard_time: bool = False + shard_time: bool = True dimension_separator: Literal[".", "/"] = "/" order: Literal["C", "F"] = "C" compressor: Literal["blosc", "zlib", None] = "blosc" @@ -92,6 +101,7 @@ def update(self, **kwargs): replace(self, **kwargs) return self + ZarrConfig = Annotated[_ZarrConfig, Parameter(name="*")] @@ -111,7 +121,7 @@ def create_array( name: str, shape: tuple, zarr_config: ZarrConfig, - dtype: np.dtype = np.int32, + dtype: DTypeLike = np.int32, data=None ) -> zarr.Array: compressor = zarr_config.compressor @@ -153,7 +163,7 @@ def create_array( def compute_zarr_layout( shape: tuple, - dtype: np.dtype, + dtype: DTypeLike, zarr_config: ZarrConfig ) -> tuple[tuple, tuple | None]: ndim = len(shape) From 450bb1ed73fb681e1753387a65594bd4af42fc01 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Apr 2025 15:09:54 -0400 Subject: [PATCH 005/157] wip --- linc_convert/modalities/lsm/spool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 65c65e8f..9f504d7c 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -241,7 +241,7 @@ def convert( if not zarr_config.nii: return - header = default_nifti_header(omz["0"], omz) + header, _ = default_nifti_header(omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None)) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension affine = orientation_to_affine(orientation, *voxel_size) From da01c5f3d174b908700771de504574b16e7a06ea Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Apr 2025 16:04:11 -0400 Subject: [PATCH 006/157] wip --- linc_convert/modalities/lsm/spool.py | 13 +- linc_convert/utils/zarr/__init__.py | 4 + linc_convert/utils/zarr/compressor.py | 20 +- linc_convert/utils/zarr/create_array.py | 166 ++++++++++++++++ linc_convert/utils/zarr/generate_pyramid.py | 22 ++- linc_convert/utils/zarr/zarr_config.py | 206 ++++---------------- 6 files changed, 246 insertions(+), 185 deletions(-) create mode 100644 linc_convert/utils/zarr/create_array.py diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 9f504d7c..a84fa923 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -1,5 +1,4 @@ # stdlib -import ast import os import re import warnings @@ -10,7 +9,6 @@ import cyclopts import nibabel as nib import numpy as np -import zarr from niizarr import default_nifti_header, write_nifti_header from niizarr._nii2zarr import write_ome_metadata @@ -19,10 +17,8 @@ from linc_convert.modalities.lsm.cli import lsm from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.spool import SpoolSetInterpreter -from linc_convert.utils.zarr.compressor import make_compressor -from linc_convert.utils.zarr.generate_pyramid import generate_pyramid -from linc_convert.utils.zarr.zarr_config import ZarrConfig, open_zarr_group, \ - create_array +from linc_convert.utils.zarr import (create_array, generate_pyramid, open_zarr_group, + ZarrConfig) spool = cyclopts.App(name="spool", help_format="markdown") lsm.command(spool) @@ -76,12 +72,16 @@ def convert( subfolders named `*_run{:d}__z{:02d}_y{:02d}*`, each containing a collection of spool files named '{:010d}spool.dat'. TODO: add instrution for metadata file and info file + overlap + Overlap pixel between y slices orientation Orientation of the slice center Set RAS[0, 0, 0] at FOV center voxel_size Voxel size along the X, Y and Z dimension, in micron. + zarr_config + config related to zarr kwargs used for internal api """ @@ -241,6 +241,7 @@ def convert( if not zarr_config.nii: return + # TODO: header has some problem with unit when deal with zarr 2, furthur debugging needed header, _ = default_nifti_header(omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None)) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py index f1882e95..4e9fcce1 100644 --- a/linc_convert/utils/zarr/__init__.py +++ b/linc_convert/utils/zarr/__init__.py @@ -1 +1,5 @@ """Zarr utilities.""" +from .compressor import make_compressor +from .create_array import create_array, open_zarr_group +from .generate_pyramid import generate_pyramid +from .zarr_config import ZarrConfig diff --git a/linc_convert/utils/zarr/compressor.py b/linc_convert/utils/zarr/compressor.py index 21de8119..71d1687e 100644 --- a/linc_convert/utils/zarr/compressor.py +++ b/linc_convert/utils/zarr/compressor.py @@ -1,18 +1,26 @@ """Functions for zarr compression.""" -from typing import Any +from typing import Any, Literal import zarr.codecs -def make_compressor(name: str | None, **prm: dict) -> Any: +def make_compressor(name: str | None, zarr_version: Literal[2, 3],**prm: dict) -> Any: """Build compressor object from name and options.""" if not isinstance(name, str): return name - compressor_map = { - "blosc": zarr.codecs.BloscCodec, - "zlib": zarr.codecs.ZstdCodec, - } + if zarr_version == 2: + import numcodecs + compressor_map = { + "blosc": numcodecs.Blosc, + "zlib": numcodecs.Zstd, + } + elif zarr_version == 3: + import zarr.codecs + compressor_map = { + "blosc": zarr.codecs.BloscCodec, + "zlib": zarr.codecs.ZstdCodec, + } name = name.lower() diff --git a/linc_convert/utils/zarr/create_array.py b/linc_convert/utils/zarr/create_array.py new file mode 100644 index 00000000..801a6f69 --- /dev/null +++ b/linc_convert/utils/zarr/create_array.py @@ -0,0 +1,166 @@ +import ast + +import numpy as np +import zarr +from numpy._typing import DTypeLike +from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams + +from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.zarr_config import ZarrConfig + +SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio + 2 * # TB + 2 ** 30 # TB->Bytes + # I use 2GB for now + ) + + +def open_zarr_group(zarr_config:ZarrConfig): + store = zarr.storage.LocalStore(zarr_config.out) + return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) + + +def create_array( + omz: zarr.Group, + name: str, + shape: tuple, + zarr_config: ZarrConfig, + dtype: DTypeLike = np.int32, + data=None +) -> zarr.Array: + compressor = zarr_config.compressor + compressor_opt = zarr_config.compressor_opt + chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + + if isinstance(compressor_opt, str): + compressor_opt = ast.literal_eval(compressor_opt) + + opt = { + "chunks": chunk, + "shards": shard, + "order": zarr_config.order, + "dtype": np.dtype(dtype).str, + "fill_value": None, + "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), + } + + chunk_key_encoding = dimension_separator_to_chunk_key_encoding(zarr_config.dimension_separator, zarr_config.zarr_version) + if chunk_key_encoding: + opt["chunk_key_encoding"] = chunk_key_encoding + arr= omz.create_array(name=name, + shape=shape, + **opt) + if data: + arr[:] = data + return arr + + +def dimension_separator_to_chunk_key_encoding(dimension_separator,zarr_version): + dimension_separator = dimension_separator + if dimension_separator == '.' and zarr_version == 2: + pass + elif dimension_separator == '/' and zarr_version == 3: + pass + else: + dimension_separator = ChunkKeyEncodingParams( + name="default" if zarr_version == 3 else "v2", + separator=dimension_separator) + return dimension_separator + + +def compute_zarr_layout( + shape: tuple, + dtype: DTypeLike, + zarr_config: ZarrConfig +) -> tuple[tuple, tuple | None]: + ndim = len(shape) + if ndim == 5: + if zarr_config.no_time: + raise ValueError('no_time is not supported for 5D data') + chunk_tc = ( + 1 if zarr_config.chunk_time else shape[0], + 1 if zarr_config.chunk_channels else shape[1], + ) + shard_tc = ( + chunk_tc[0] if zarr_config.shard_time else shape[0], + chunk_tc[1] if zarr_config.shard_channels else shape[1] + ) + + elif ndim == 4: + if zarr_config.no_time: + chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_channels else shape[0],) + else: + chunk_tc = (1 if zarr_config.chunk_time else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) + elif ndim == 3: + chunk_tc = tuple() + shard_tc = tuple() + else: + raise ValueError("Zarr layout only supports 3+ dimensions.") + + chunk = zarr_config.chunk + if len(chunk) > ndim: + raise ValueError("Provided chunk size has more dimension than data") + if len(zarr_config.chunk) != ndim: + chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) + + shard = zarr_config.shard + + if isinstance(shard, tuple) and len(shard) > ndim: + raise ValueError("Provided shard size has more dimension than data") + # If shard is not used or is fully specified, return early. + if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): + return chunk, shard + + chunk_spatial = chunk[-3:] + if shard == "auto": + # Compute auto shard sizes based on the file size limit. + itemsize = dtype.itemsize + chunk_size = np.prod(chunk_spatial) * itemsize + shard_size = np.prod(shard_tc) * chunk_size + B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size + multiplier = int(B_multiplier ** (1 / 3)) + if multiplier < 1: + multiplier = 1 + + shape_spatial = shape[-3:] + # For each spatial dimension, the minimal multiplier needed to cover the data: + L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] + dims = len(chunk_spatial) + + shard = tuple(int(c * multiplier) for c in chunk_spatial) + m_uniform = int(B_multiplier ** (1 / dims)) + M = [] + free_dims = [] + for i in range(dims): + # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. + if m_uniform * chunk_spatial[i] >= shape_spatial[i]: + M.append(L[i]) + else: + M.append(m_uniform) + free_dims.append(i) + + # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. + improved = True + while improved and free_dims: + improved = False + for i in free_dims: + candidate = M[i] + 1 + # If increasing would exceed the data size in this dimension, + # clamp to the minimal covering multiplier. + if candidate * chunk_spatial[i] >= shape_spatial[i]: + candidate = L[i] + new_product = np.prod( + [candidate if j == i else M[j] for j in range(dims)] + ) + if new_product <= B_multiplier and candidate > M[i]: + M[i] = candidate + improved = True + # Remove dimensions that have reached or exceeded the data size. + free_dims = [i for i in free_dims if + M[i] * chunk_spatial[i] < shape_spatial[i]] + shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) + + shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) + return chunk, shard diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 6401ce74..df4ada58 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -3,8 +3,11 @@ import numpy as np import zarr +from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata from linc_convert.utils.math import ceildiv +from linc_convert.utils.zarr.create_array import \ + dimension_separator_to_chunk_key_encoding def generate_pyramid( @@ -162,18 +165,27 @@ def generate_pyramid( def get_zarray_options(base_level): - return dict( + opts = dict( dtype=base_level.dtype, chunks=base_level.chunks, shards=base_level.shards, filters=base_level.filters, compressors=base_level.compressors, - serializer=base_level.serializer, fill_value=base_level.fill_value, order=base_level.order, - # zarr_format=base_level.metadata.zarr_format, attributes=base_level.metadata.attributes, - chunk_key_encoding=base_level.metadata.chunk_key_encoding, - dimension_names=base_level.metadata.dimension_names, overwrite=True, ) + if isinstance(base_level.metadata, ArrayV2Metadata): + opts_extra = dict( + chunk_key_encoding = dimension_separator_to_chunk_key_encoding(base_level.metadata.dimension_separator, 2) + ) + elif isinstance(base_level.metadata, ArrayV3Metadata): + opts_extra = dict( + chunk_key_encoding=base_level.metadata.chunk_key_encoding, + serializer=base_level.serializer, + dimension_names=base_level.metadata.dimension_names, ) + else: + opts_extra = {} + opts.update(**opts_extra) + return opts \ No newline at end of file diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index bded2b88..2ff10b80 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -1,29 +1,21 @@ """Configuration related to output Zarr Archive.""" -import ast import os from dataclasses import dataclass, replace from typing import Annotated, Literal -import numpy as np -import zarr from cyclopts import Parameter -from numpy._typing import DTypeLike from typing_extensions import Unpack -from linc_convert.utils.zarr.compressor import make_compressor -SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio - 2 * # TB - 2 ** 30 # TB->Bytes - # I use 2GB for now - ) @dataclass -class _ZarrConfig: +class ZarrConfig: """ Configuration related to output Zarr Archive. Parameters ---------- + out + Output path chunk Output chunk size. Behavior depends on the number of values provided: @@ -31,6 +23,8 @@ class _ZarrConfig: * three: used for spatial dimensions ([z, y, x]) * four+: used for channels and spatial dimensions ([c, z, y, x]) If `"auto"`, find chunk size smaller than 1 MB (TODO: not implemented) + zarr_version + Zarr version to use. If `shard` is used, 3 is required. chunk_channels: Put channels in different chunk. If False, combine all channels in a single chunk. @@ -39,24 +33,45 @@ class _ZarrConfig: If False, combine all timepoints in a single chunk. shard Output shard size. + Behavior same as chunk. If `"auto"`, find shard size that ensures files smaller than 2TB, assuming a compression ratio or 2. - - version - Zarr version to use. If `shard` is used, 3 is required. - compressor : {blosc, zlib|gzip, raw} + shard_channels: + Put channels in different shards. + If False, combine all channels in a single shard. + shard_time: + Put timepoints in different shards. + If False, combine all timepoints in a single shard. + dimension_separator: + The separator placed between the dimensions of a chunk. + order: + Memory layout order for the data array. + compressor Compression method compressor_opt Compression options + no_time + If True, indicates that the dataset does not have a time dimension. + In such cases, any fourth dimension is interpreted as the channel dimension. + no_pyramid_axis + Spatial axis that should not be downsampled when generating pyramid levels. + If None, downsampling is applied across all spatial axes. + levels : int, optional + Number of pyramid levels to generate. + If set to -1, all possible levels are generated until the smallest level + fits into one chunk. + ome_version + Version of the OME-Zarr specification to use nii - Convert to nifti-zarr. True if path ends in ".nii.zarr". - + Convert the output to nifti-zarr format. + This is automatically enabled if the output path ends with ".nii.zarr". + max_load: + Maximum amount of data to load into memory at once during processing. overwrite when no name is supplied and using default output name, if overwrite is set, it won't ask if overwrite driver : {"zarr-python", "tensorstore", "zarrita"} library used for Zarr IO Operation - """ out: str = None zarr_version: Literal[2, 3] = 3 @@ -64,8 +79,8 @@ class _ZarrConfig: chunk_channels: bool = False chunk_time: bool = True shard: tuple[int] | Literal["auto"] | None = None - shard_channel: bool = False - shard_time: bool = True + shard_channels: bool = False + shard_time: bool = False dimension_separator: Literal[".", "/"] = "/" order: Literal["C", "F"] = "C" compressor: Literal["blosc", "zlib", None] = "blosc" @@ -82,7 +97,7 @@ class _ZarrConfig: def __post_init__(self) -> None: self.nii |= self.out.endswith(".nii.zarr") if self.zarr_version == 2: - if self.shard or self.shard_channel or self.shard_time: + if self.shard or self.shard_channels or self.shard_time: raise NotImplementedError("Shard is not supported for Zarr 2.") def set_default_name(self, name: str): @@ -102,158 +117,13 @@ def update(self, **kwargs): return self -ZarrConfig = Annotated[_ZarrConfig, Parameter(name="*")] +ZarrConfig = Annotated[ZarrConfig, Parameter(name="*")] def update(zarr_config: ZarrConfig|None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: - zarr_config = _ZarrConfig() + zarr_config = ZarrConfig() replace(zarr_config, **kwargs) return zarr_config -def open_zarr_group(zarr_config:ZarrConfig): - store = zarr.storage.LocalStore(zarr_config.out) - return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) - - -def create_array( - omz: zarr.Group, - name: str, - shape: tuple, - zarr_config: ZarrConfig, - dtype: DTypeLike = np.int32, - data=None -) -> zarr.Array: - compressor = zarr_config.compressor - compressor_opt = zarr_config.compressor_opt - chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - opt = { - "chunks": chunk, - "shards": shard, - "order": zarr_config.order, - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressors": make_compressor(compressor, **compressor_opt), - } - - dimension_separator = zarr_config.dimension_separator - if dimension_separator == '.' and omz.metadata.zarr_format == 2: - pass - elif dimension_separator == '/' and omz.metadata.zarr_format == 3: - pass - else: - from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams - dimension_separator = ChunkKeyEncodingParams( - name="default" if omz.metadata.zarr_format == 3 else "v2", - separator=dimension_separator) - - opt["chunk_key_encoding"] = dimension_separator - - arr= omz.create_array(name=name, - shape=shape, - **opt) - if data: - arr[:] = data - return arr - - -def compute_zarr_layout( - shape: tuple, - dtype: DTypeLike, - zarr_config: ZarrConfig -) -> tuple[tuple, tuple | None]: - ndim = len(shape) - if ndim == 5: - if zarr_config.no_time: - raise ValueError('no_time is not supported for 5D data') - chunk_tc = ( - 1 if zarr_config.chunk_time else shape[0], - 1 if zarr_config.chunk_channels else shape[1], - ) - shard_tc = ( - chunk_tc[0] if zarr_config.shard_time else shape[0], - chunk_tc[1] if zarr_config.shard_channel else shape[1] - ) - - elif ndim == 4: - if zarr_config.no_time: - chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_channel else shape[0],) - else: - chunk_tc = (1 if zarr_config.chunk_time else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) - elif ndim == 3: - chunk_tc = tuple() - shard_tc = tuple() - else: - raise ValueError("Zarr layout only supports 3+ dimensions.") - - chunk = zarr_config.chunk - if len(chunk) > ndim: - raise ValueError("Provided chunk size has more dimension than data") - if len(zarr_config.chunk) != ndim: - chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) - - shard = zarr_config.shard - - if isinstance(shard, tuple) and len(shard) > ndim: - raise ValueError("Provided shard size has more dimension than data") - # If shard is not used or is fully specified, return early. - if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): - return chunk, shard - - chunk_spatial = chunk[-3:] - if shard == "auto": - # Compute auto shard sizes based on the file size limit. - itemsize = dtype.itemsize - chunk_size = np.prod(chunk_spatial) * itemsize - shard_size = np.prod(shard_tc) * chunk_size - B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size - multiplier = int(B_multiplier ** (1 / 3)) - if multiplier < 1: - multiplier = 1 - - shape_spatial = shape[-3:] - # For each spatial dimension, the minimal multiplier needed to cover the data: - L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] - dims = len(chunk_spatial) - - shard = tuple(int(c * multiplier) for c in chunk_spatial) - m_uniform = int(B_multiplier ** (1 / dims)) - M = [] - free_dims = [] - for i in range(dims): - # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. - if m_uniform * chunk_spatial[i] >= shape_spatial[i]: - M.append(L[i]) - else: - M.append(m_uniform) - free_dims.append(i) - - # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. - improved = True - while improved and free_dims: - improved = False - for i in free_dims: - candidate = M[i] + 1 - # If increasing would exceed the data size in this dimension, - # clamp to the minimal covering multiplier. - if candidate * chunk_spatial[i] >= shape_spatial[i]: - candidate = L[i] - new_product = np.prod( - [candidate if j == i else M[j] for j in range(dims)] - ) - if new_product <= B_multiplier and candidate > M[i]: - M[i] = candidate - improved = True - # Remove dimensions that have reached or exceeded the data size. - free_dims = [i for i in free_dims if - M[i] * chunk_spatial[i] < shape_spatial[i]] - shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) - shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) - return chunk, shard From c8480b7ae8598125059956c81340122cf46485ea Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 7 Apr 2025 09:46:49 -0400 Subject: [PATCH 007/157] wip: added a trivial pipeline for testing --- linc_convert/__init__.py | 2 +- linc_convert/modalities/psoct/__init__.py | 4 +- linc_convert/modalities/psoct/_utils.py | 390 ------------------- linc_convert/modalities/psoct/multi_slice.py | 226 ++++------- linc_convert/utils/__init__.py | 1 + linc_convert/utils/zarr/generate_pyramid.py | 10 +- 6 files changed, 95 insertions(+), 538 deletions(-) diff --git a/linc_convert/__init__.py b/linc_convert/__init__.py index 1d5a7106..812c643e 100644 --- a/linc_convert/__init__.py +++ b/linc_convert/__init__.py @@ -1,4 +1,4 @@ """Data conversion tools for the LINC project.""" __all__ = ["modalities", "utils"] -from . import modalities, utils +from . import utils, modalities diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index d9bb1a68..0bb41021 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume"] - from . import cli, multi_slice, single_volume + __all__ = ["cli", "multi_slice", "single_volume", "ms_dask"] + from . import cli, multi_slice, single_volume, ms_dask except ImportError: pass diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 8fb391f2..5544bf88 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -108,393 +108,3 @@ def _parse_value_unit( return meta - -def generate_pyramid( - omz: zarr.Group, - levels: int | None = None, - ndim: int = 3, - max_load: int = 512, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: int | str | None = None, -) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - path : PathLike | str - Path to parent Zarr - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - shard : list[int] | bool | {"auto"} | None - Shard size. - * If `None`, use same shard size as the input array; - * If `False`, no dot use sharding; - * If `True` or `"auto"`, automatically find shard size; - * Otherwise, use provided shard size. - ndim : int - Number of spatial dimensions. - max_load : int - Maximum number of voxels to load along each dimension. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - # Read properties from base level - shape = list(omz["0"].shape) - chunk_size = omz["0"].chunks - opt = { - "dimension_separator": omz["0"]._dimension_separator, - "order": omz["0"]._order, - "dtype": omz["0"]._dtype, - "fill_value": omz["0"]._fill_value, - "compressor": omz["0"]._compressor, - "chunks": omz["0"].chunks, - } - - # Select windowing function - if mode == "median": - func = np.median - else: - assert mode == "mean" - func = np.mean - - level = 0 - batch, shape = shape[:-ndim], shape[-ndim:] - allshapes = [shape] - - while True: - level += 1 - - # Compute downsampled shape - prev_shape, shape = shape, [] - for i, length in enumerate(prev_shape): - if i == no_pyramid_axis: - shape.append(length) - else: - shape.append(max(1, length // 2)) - - # Stop if seen enough levels or level shape smaller than chunk size - if levels is None: - if all(x <= c for x, c in zip(shape, chunk_size[-ndim:])): - break - elif level > levels: - break - - print("Compute level", level, "with shape", shape) - - allshapes.append(shape) - omz.create_dataset(str(level), shape=batch + shape, **opt) - - # Iterate across `max_load` chunks - # (note that these are unrelared to underlying zarr chunks) - grid_shape = [ceildiv(n, max_load) for n in prev_shape] - for chunk_index in itertools.product(*[range(x) for x in grid_shape]): - print(f"chunk {chunk_index} / {tuple(grid_shape)})", end="\r") - - # Read one chunk of data at the previous resolution - slicer = [Ellipsis] + [ - slice(i * max_load, min((i + 1) * max_load, n)) - for i, n in zip(chunk_index, prev_shape) - ] - fullshape = omz[str(level - 1)].shape - dat = omz[str(level - 1)][tuple(slicer)] - - # Discard the last voxel along odd dimensions - crop = [ - 0 if y == 1 else x % 2 for x, y in zip(dat.shape[-ndim:], fullshape) - ] - # Don't crop the axis not down-sampling - # cannot do if not no_pyramid_axis since it could be 0 - if no_pyramid_axis is not None: - crop[no_pyramid_axis] = 0 - slcr = [slice(-1) if x else slice(None) for x in crop] - dat = dat[tuple([Ellipsis, *slcr])] - - if any(n == 0 for n in dat.shape): - # last strip had a single voxel, nothing to do - continue - - patch_shape = dat.shape[-ndim:] - - # Reshape into patches of shape 2x2x2 - windowed_shape = [ - x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] - if no_pyramid_axis is not None: - windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] - windowed_shape[2 * no_pyramid_axis + 1] = 1 - - dat = dat.reshape(batch + windowed_shape) - # -> last `ndim`` dimensions have shape 2x2x2 - dat = dat.transpose( - list(range(len(batch))) - + list(range(len(batch), len(batch) + 2 * ndim, 2)) - + list(range(len(batch) + 1, len(batch) + 2 * ndim, 2)) - ) - # -> flatten patches - smaller_shape = [max(n // 2, 1) for n in patch_shape] - if no_pyramid_axis is not None: - smaller_shape[no_pyramid_axis] = patch_shape[no_pyramid_axis] - - dat = dat.reshape(batch + smaller_shape + [-1]) - - # Compute the median/mean of each patch - dtype = dat.dtype - dat = func(dat, axis=-1) - dat = dat.astype(dtype) - - # Write output - slicer = [Ellipsis] + [ - slice(i * max_load // 2, min((i + 1) * max_load // 2, n)) - if axis_index != no_pyramid_axis - else slice(i * max_load, min((i + 1) * max_load, n)) - for i, axis_index, n in zip(chunk_index, range(ndim), shape) - ] - - omz[str(level)][tuple(slicer)] = dat - - print("") - - return allshapes - - pass - - -def write_ome_metadata( - omz: zarr.Group, - axes: list[str], - space_scale: float | list[float] = 1, - time_scale: float = 1, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: str | int | list[str | int] = 2, - levels: int | None = None, - no_pool: int | None = None, - multiscales_type: str = "", -) -> None: - """ - Write OME metadata into Zarr. - - Parameters - ---------- - path : str | PathLike - Path to parent Zarr. - axes : list[str] - Name of each dimension, in Zarr order (t, c, z, y, x) - space_scale : float | list[float] - Finest-level voxel size, in Zarr order (z, y, x) - time_scale : float - Time scale - space_unit : str - Unit of spatial scale (assumed identical across dimensions) - space_time : str - Unit of time scale - name : str - Name attribute - pyramid_aligns : float | list[float] | {"center", "edge"} - Whether the pyramid construction aligns the edges or the centers - of the corner voxels. If a (list of) number, assume that a moving - window of that size was used. - levels : int - Number of existing levels. Default: find out automatically. - zarr_version : {2, 3} | None - Zarr version. If `None`, guess from existing zarr array. - - """ - # Read shape at each pyramid level - shapes = [] - level = 0 - while True: - if levels is not None and level > levels: - break - - if str(level) not in omz.keys(): - levels = level - break - shapes += [ - omz[str(level)].shape, - ] - level += 1 - - axis_to_type = { - "x": "space", - "y": "space", - "z": "space", - "t": "time", - "c": "channel", - } - - # Number of spatial (s), batch (b) and total (n) dimensions - ndim = len(axes) - sdim = sum(axis_to_type[axis] == "space" for axis in axes) - bdim = ndim - sdim - - if isinstance(pyramid_aligns, (int, str)): - pyramid_aligns = [pyramid_aligns] - pyramid_aligns = list(pyramid_aligns) - if len(pyramid_aligns) < sdim: - repeat = pyramid_aligns[:1] * (sdim - len(pyramid_aligns)) - pyramid_aligns = repeat + pyramid_aligns - pyramid_aligns = pyramid_aligns[-sdim:] - - if isinstance(space_scale, (int, float)): - space_scale = [space_scale] - space_scale = list(space_scale) - if len(space_scale) < sdim: - repeat = space_scale[:1] * (sdim - len(space_scale)) - space_scale = repeat + space_scale - space_scale = space_scale[-sdim:] - - multiscales = [ - { - "version": "0.4", - "axes": [ - { - "name": axis, - "type": axis_to_type[axis], - } - if axis_to_type[axis] == "channel" - else { - "name": axis, - "type": axis_to_type[axis], - "unit": ( - space_unit - if axis_to_type[axis] == "space" - else time_unit - if axis_to_type[axis] == "time" - else None - ), - } - for axis in axes - ], - "datasets": [], - "type": "median window " + "x".join(["2"] * sdim) - if not multiscales_type - else multiscales_type, - "name": name, - } - ] - - shape0 = shapes[0] - for n in range(len(shapes)): - shape = shapes[n] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - scale = [1] * bdim + [ - ( - pyramid_aligns[i] ** n - if not isinstance(pyramid_aligns[i], str) - else (shape0[bdim + i] / shape[bdim + i]) - if pyramid_aligns[i][0].lower() == "e" - else ((shape0[bdim + i] - 1) / (shape[bdim + i] - 1)) - ) - * space_scale[i] - if i != no_pool - else space_scale[i] - for i in range(sdim) - ] - translation = [0] * bdim + [ - ( - pyramid_aligns[i] ** n - 1 - if not isinstance(pyramid_aligns[i], str) - else (shape0[bdim + i] / shape[bdim + i]) - 1 - if pyramid_aligns[i][0].lower() == "e" - else 0 - ) - * 0.5 - * space_scale[i] - if i != no_pool - else 0 - for i in range(sdim) - ] - - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": scale, - }, - { - "type": "translation", - "translation": translation, - }, - ] - - scale = [1.0] * ndim - if "t" in axes: - scale[axes.index("t")] = time_scale - multiscales[0]["coordinateTransformations"] = [{"scale": scale, "type": "scale"}] - - multiscales[0]["version"] = "0.4" - omz.attrs["multiscales"] = multiscales - - -def niftizarr_write_header( - omz: zarr.Group, - shape: list[int], - affine: np.ndarray, - dtype: np.dtype | str, - unit: Literal["micron", "mm"] | None = None, - header: nib.Nifti1Header | nib.Nifti2Header | None = None, - nifti_version: Literal[1, 2] = 1, -) -> None: - """ - Write NIfTI header in a NIfTI-Zarr file. - - Parameters - ---------- - path : PathLike | str - Path to parent Zarr. - affine : (4, 4) matrix - Orientation matrix. - shape : list[int] - Array shape, in NIfTI order (x, y, z, t, c). - dtype : np.dtype | str - Data type. - unit : {"micron", "mm"}, optional - World unit. - header : nib.Nifti1Header | nib.Nifti2Header, optional - Pre-instantiated header. - zarr_version : int, default=3 - Zarr version. - """ - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - - # If dimensions do not fit in a short (which is often the case), we - # use NIfTI 2. - if all(x < 32768 for x in shape) or nifti_version == 1: - NiftiHeader = nib.Nifti1Header - else: - NiftiHeader = nib.Nifti2Header - - header = header or NiftiHeader() - header.set_data_shape(shape) - header.set_data_dtype(dtype) - header.set_qform(affine) - header.set_sform(affine) - if unit: - header.set_xyzt_units(nib.nifti1.unit_codes.code[unit]) - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - - metadata = { - "chunks": [len(header)], - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": None, # TODO: Subject to change compression - } - - omz.create_dataset("nifti", data=header, shape=len(header), **metadata) - - print("done.") diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 4bf17df3..2407acff 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -5,35 +5,31 @@ into a OME-ZARR pyramid. """ -import ast import json -import math import os from functools import wraps from itertools import product from typing import Callable, Mapping, Optional from warnings import warn +import logging import cyclopts import h5py import numpy as np -import zarr from scipy.io import loadmat from linc_convert import utils -from linc_convert.modalities.psoct._utils import ( - generate_pyramid, - make_json, - niftizarr_write_header, - write_ome_metadata, -) +from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid +from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata + from linc_convert.utils.zarr.zarr_config import ZarrConfig +logger = logging.getLogger(__name__) multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") psoct.command(multi_slice) @@ -42,14 +38,9 @@ def _automap(func: Callable) -> Callable: """Automatically maps the array in the mat file.""" @wraps(func) - def wrapper(inp: list[str], out: str, **kwargs: dict) -> callable: - print(kwargs) - if out is None: - out = os.path.splitext(inp[0])[0] - out += ".nii.zarr" if kwargs.get("nii", False) else ".ome.zarr" + def wrapper(inp: list[str], **kwargs: dict) -> callable: dat = _mapmat(inp, kwargs.get("key", None)) - return func(dat, out=out, **kwargs) - + return func(dat, **kwargs) return wrapper @@ -59,8 +50,9 @@ def _get_key(self, f: Mapping) -> str: if key is None: if not len(f.keys()): raise Exception(f"{self.file} is empty") + # Select the first non-hidden key for key in f.keys(): - if key[:1] != "_": + if key[0] != "_": break if len(f.keys()) > 1: warn( @@ -70,12 +62,11 @@ def _get_key(self, f: Mapping) -> str: if key not in f.keys(): raise Exception(f"Key {key} not found in file {self.file}") - return key class _H5ArrayWrapper(_ArrayWrapper): - def __init__(self, file: h5py.File, key: str | None) -> None: + def __init__(self, file: h5py.File, key: Optional[str]) -> None: self.file = file self.key = key self.array = file.get(self._get_key(self.file)) @@ -107,7 +98,7 @@ def __getitem__(self, index: object) -> np.ndarray: class _MatArrayWrapper(_ArrayWrapper): - def __init__(self, file: str, key: str | None) -> None: + def __init__(self, file: str, key: Optional[str]) -> None: self.file = file self.key = key self.array = None @@ -117,8 +108,8 @@ def __del__(self) -> None: self.file.close() def load(self) -> np.ndarray: - f = loadmat(self.file) - self.array = f.get(self._get_key(f)) + data = loadmat(self.file) + self.array = data.get(self._get_key(data)) self.file = None return self.array @@ -145,11 +136,9 @@ def __getitem__(self, index: object) -> np.ndarray: return self.array[index] -def _mapmat(fnames: list[str], key: str = None) -> list[_ArrayWrapper]: +def _mapmat(fnames: list[str], key: Optional[str] = None) -> list[_ArrayWrapper]: """Load or memory-map an array stored in a .mat file.""" - # loaded_data = [] - - def make_wrapper(fname: str) -> callable: + def make_wrapper(fname: str) -> _ArrayWrapper: try: # "New" .mat file f = h5py.File(fname, "r") @@ -166,17 +155,13 @@ def make_wrapper(fname: str) -> callable: def convert( inp: list[str], *, - out: str, zarr_config: ZarrConfig = None, key: Optional[str] = None, meta: str = None, - max_load: int = 128, - max_levels: int = 5, - no_pool: Optional[int] = None, orientation: str = "RAS", center: bool = True, - dtype: str | None = None, - **kwargs + dtype: Optional[str] = None, + **kwargs ) -> None: """ Matlab to OME-Zarr. @@ -185,151 +170,104 @@ def convert( OME-ZARR (or NIfTI-Zarr) hierarchy. This command assumes that each slice in a volume is stored in a - different mat file. All slices must have the same shape, and will - be concatenated into a 3D Zarr. + different mat file. All slices must have the same shape and will be + concatenated into a 3D Zarr. Parameters ---------- - inp - Path to the input mat file - out - Path to the output Zarr directory [.ome.zarr] - key - Key of the array to be extracted, default to first key found - meta - Path to the metadata file - max_load - Maximum input chunk size - max_levels - Maximum number of pyramid levels - no_pool - Index of dimension to not pool when building pyramid. - orientation - Orientation of the volume - center - Set RAS[0, 0, 0] at FOV center - dtype - Data type to write into + inp : list of str + Paths to the input mat files. + key : Optional[str] + Key of the array to be extracted; defaults to the first key found. + meta : str + Path to the metadata file. + orientation : str + Orientation of the volume. + center : bool + Set RAS[0, 0, 0] at FOV center. + dtype : Optional[str] + Data type to write into. """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config.set_default_name(os.path.splitext(inp[0].file)[0]) - chunk: int = zarr_config.chunk[0] - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - # Write OME-Zarr multiscale metadata + # Process metadata if provided if meta: - print("Write JSON") + logger.info("Writing JSON metadata") with open(meta, "r") as f: meta_txt = f.read() meta_json = make_json(meta_txt) - path_json = ".".join(out.split(".")[:-2]) + ".json" + path_json = ".".join(zarr_config.out.split(".")[:-2]) + ".json" with open(path_json, "w") as f: json.dump(meta_json, f, indent=4) vx = meta_json["PixelSize"] unit = meta_json["PixelSizeUnits"] else: - vx = [1] * 3 + vx = [1, 1, 1] unit = "um" # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) + omz = open_zarr_group(zarr_config) # if not hasattr(inp[0], "dtype"): # raise Exception("Input is not an array. This is likely unexpected") if len(inp[0].shape) < 2: - raise Exception("Input array is not 2d:", inp[0].shape) - # Prepare chunking options + raise ValueError(f"Input array is not 2D: {inp[0].shape}") + dtype = dtype or np.dtype(inp[0].dtype).str - opt = { - "dimension_separator": r"/", - "order": "F", - "dtype": dtype, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - inp: list = inp - inp_shape = (*inp[0].shape, len(inp)) - inp_chunk = [min(x, max_load) for x in inp_shape[-3:]] - nk = ceildiv(inp_shape[-3], inp_chunk[0]) - nj = ceildiv(inp_shape[-2], inp_chunk[1]) - ni = len(inp) - - nblevels = min( - [ - int(math.ceil(math.log2(x))) - for i, x in enumerate(inp_shape[-3:]) - if i != no_pool - ] - ) - nblevels = min(nblevels, int(math.ceil(math.log2(max_load)))) - nblevels = min(nblevels, max_levels) - - opt["chunks"] = [min(x, chunk) for x in inp_shape] - - omz.create_dataset(str(0), shape=inp_shape, **opt) - - # iterate across input chunks - for i in range(ni): - for j, k in product(range(nj), range(nk)): + # The overall volume shape: (slice height, slice width, number of slices) + volume_shape = (*inp[0].shape, len(inp)) + # Use the entire dimensions as chunk sizes (replace with max_load if needed) + chunk_size = list(volume_shape[-3:]) + nz = ceildiv(volume_shape[-3], chunk_size[0]) + ny = ceildiv(volume_shape[-2], chunk_size[1]) + nslices = len(inp) + + dataset = create_array(omz, "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype)) + + # Process and store data in chunks + for i in range(nslices): + for j, k in product(range(ny), range(nz)): loaded_chunk = inp[i][ ..., - k * inp_chunk[0] : (k + 1) * inp_chunk[0], - j * inp_chunk[1] : (j + 1) * inp_chunk[1], + k * chunk_size[0] : (k + 1) * chunk_size[0], + j * chunk_size[1] : (j + 1) * chunk_size[1], ] - - print( - f"[{i + 1:03d}, {j + 1:03d}, {k + 1:03d}]", - "/", - f"[{ni:03d}, {nj:03d}, {nk:03d}]", - # f"({1 + level}/{nblevels})", - end="\r", + logger.info( + f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: {k + 1:03d}] " + f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" ) - - # save current chunk - omz["0"][ + z_start = k * chunk_size[0] + z_end = z_start + loaded_chunk.shape[-2] + y_start = j * chunk_size[1] + y_end = y_start + loaded_chunk.shape[-1] + dataset[ ..., - k * inp_chunk[-3] : k * inp_chunk[-3] + loaded_chunk.shape[-2], - j * inp_chunk[-2] : j * inp_chunk[-2] + loaded_chunk.shape[-1], + z_start:z_end, + y_start:y_end, i, ] = loaded_chunk + inp[i] = None # Remove reference to free memory - inp[i] = None # no ref count -> delete array - - generate_pyramid(omz, nblevels - 1, mode="mean", no_pyramid_axis=no_pool) - - print("") - - # Write OME-Zarr multiscale metadata - print("Write metadata") - print(unit) - ome_unit = to_ome_unit(unit) - write_ome_metadata( - omz, - axes=(["c"] if len(inp_shape) == 4 else []) + ["z", "y", "x"], - no_pool=no_pool, - space_unit=ome_unit, - space_scale=vx, - multiscales_type=(("2x2x2" if no_pool is None else "2x2") + "mean window"), - ) + generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + logger.info("Write OME-Zarr multiscale metadata") + write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) - if not nii: - print("done.") + if not zarr_config.nii: + logger.info("Conversion complete.") return # Write NIfTI-Zarr header - # NOTE: we use nifti2 because dimensions typically do not fit in a short - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - shape = list(reversed(omz["0"].shape)) + arr = omz["0"] + header, _ = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) + reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: - affine = center_affine(affine, shape[:3]) - niftizarr_write_header( - omz, shape, affine, omz["0"].dtype, to_nifti_unit(unit), nifti_version=2 - ) + affine = center_affine(affine, reversed_shape[:3]) + header.set_data_shape(reversed_shape) + header.set_data_dtype(arr.dtype) + header.set_qform(affine) + header.set_sform(affine) + header.set_xyzt_units(to_nifti_unit(unit)) + + write_nifti_header(omz, header) \ No newline at end of file diff --git a/linc_convert/utils/__init__.py b/linc_convert/utils/__init__.py index fff72c70..75fec8b0 100644 --- a/linc_convert/utils/__init__.py +++ b/linc_convert/utils/__init__.py @@ -1 +1,2 @@ """Various utilities.""" +from . import logging \ No newline at end of file diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index df4ada58..2cbc9468 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -67,7 +67,15 @@ def generate_pyramid( level = 0 batch, shape = shape[:-ndim], shape[-ndim:] allshapes = [shape] - + # nblevels = min( + # [ + # int(math.ceil(math.log2(x))) + # for i, x in enumerate(inp_shape[-3:]) + # if i != no_pool + # ] + # ) + # nblevels = min(nblevels, int(math.ceil(math.log2(max_load)))) + # nblevels = min(nblevels, max_levels) while True: level += 1 From 4336097f12a8df602ae0edec9a307eda93f43b2e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 7 Apr 2025 09:47:21 -0400 Subject: [PATCH 008/157] wip: added a trivial pipeline for testing --- linc_convert/modalities/psoct/single_volume.py | 9 ++------- linc_convert/utils/zarr/zarr_config.py | 11 +++++------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index e7267367..f2d9f45b 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -22,12 +22,7 @@ from scipy.io import loadmat from linc_convert import utils -from linc_convert.modalities.psoct._utils import ( - generate_pyramid, - make_json, - niftizarr_write_header, - write_ome_metadata, -) +from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine @@ -98,7 +93,7 @@ def convert( no_pool: Optional[int] = None, orientation: str = "RAS", center: bool = True, - kwargs + **kwargs ) -> None: """ Matlab to OME-Zarr. diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 2ff10b80..fefcc5b4 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -2,11 +2,14 @@ import os from dataclasses import dataclass, replace from typing import Annotated, Literal +from typing_extensions import Unpack +import logging from cyclopts import Parameter -from typing_extensions import Unpack +logger = logging.getLogger(__name__) +@Parameter(name="*") @dataclass class ZarrConfig: """ @@ -73,7 +76,7 @@ class ZarrConfig: driver : {"zarr-python", "tensorstore", "zarrita"} library used for Zarr IO Operation """ - out: str = None + out: Annotated[str, Parameter(name=["--out", "-o"])] = None zarr_version: Literal[2, 3] = 3 chunk: tuple[int] = (128,) chunk_channels: bool = False @@ -116,10 +119,6 @@ def update(self, **kwargs): replace(self, **kwargs) return self - -ZarrConfig = Annotated[ZarrConfig, Parameter(name="*")] - - def update(zarr_config: ZarrConfig|None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: zarr_config = ZarrConfig() From 6ba6374bc9f3d7f76fe1576de0d871eea94c6812 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 7 Apr 2025 13:03:56 -0400 Subject: [PATCH 009/157] wip: add logging --- linc_convert/utils/logging.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 linc_convert/utils/logging.py diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py new file mode 100644 index 00000000..119d2612 --- /dev/null +++ b/linc_convert/utils/logging.py @@ -0,0 +1,25 @@ +import logging + +logger = logging.getLogger() + +def setup_logging(): + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + logging.captureWarnings(True) + + +def add_file_handler(log_file_path=None): + # Create a file handler to save logs + log_filename = "/scratch/converter.log" + file_handler = logging.FileHandler(log_filename) + file_handler.setLevel(logging.DEBUG) + file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler.setFormatter(file_formatter) + logger.addHandler(file_handler) + + +setup_logging() +add_file_handler() \ No newline at end of file From d4ec4ad42cc6f7d9b17662d03872cc714b63d65c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 7 Apr 2025 13:05:22 -0400 Subject: [PATCH 010/157] wip: try catch for wk modality --- linc_convert/modalities/wk/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/linc_convert/modalities/wk/__init__.py b/linc_convert/modalities/wk/__init__.py index 85d95ec6..8e5c6e6f 100644 --- a/linc_convert/modalities/wk/__init__.py +++ b/linc_convert/modalities/wk/__init__.py @@ -1,4 +1,9 @@ """Webknossos annotation converters.""" -__all__ = ["cli", "webknossos_annotation"] -from . import cli, webknossos_annotation +try: + import wkw as _ # noqa: F401 + + __all__ = ["cli", "webknossos_annotation"] + from . import cli, webknossos_annotation +except ImportError: + pass \ No newline at end of file From 3e9239a2764b1279b4d51a0f341e42fbda04b745 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 7 Apr 2025 14:34:15 -0400 Subject: [PATCH 011/157] wip --- linc_convert/modalities/df/single_slice.py | 2 +- linc_convert/utils/chunk_processing.py | 38 +++++++++++++++++++++ linc_convert/utils/zarr/generate_pyramid.py | 2 +- linc_convert/utils/zarr/zarr_config.py | 3 +- 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 linc_convert/utils/chunk_processing.py diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index abb76bc0..962e3216 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -40,7 +40,7 @@ def convert( orientation: str = "coronal", center: bool = True, thickness: float | None = None, - **kwargs + **kwargs ) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py new file mode 100644 index 00000000..fcb31219 --- /dev/null +++ b/linc_convert/utils/chunk_processing.py @@ -0,0 +1,38 @@ +import numpy as np + +from linc_convert.utils.math import ceildiv + + +def chunk_slice_generator(arr_shape, chunk_shape): + """ + Generate slice indices for chunking an array based on its shape and the provided chunk_shape + for the last dimensions. + + Parameters: + arr_shape (tuple): The shape of the array. + chunk_shape (tuple): A tuple of integers representing the chunk size for each of the last dimensions. + + Yields: + tuple: A tuple (index, full_slice) where: + - index is a tuple representing the multi-index of the chunk. + - full_slice is a tuple of slice objects (prefixed by an Ellipsis to preserve any non-chunked dimensions) + that can be used to index into an array of shape arr_shape. + """ + # Ensure chunk_shape is a tuple + chunk_shape = tuple(chunk_shape) + + # Consider only the last dimensions that are meant to be chunked + shape = arr_shape[-len(chunk_shape):] + + # Calculate the number of chunks along each dimension + n_chunks = [ceildiv(dim, c) for dim, c in zip(shape, chunk_shape)] + + # Generate all multi-indices for the chunk grid + for index in np.ndindex(*n_chunks): + # Create slice objects for each dimension, ensuring we don't go beyond the array's bounds + slices = tuple(slice(i * c, min((i + 1) * c, dim)) + for i, c, dim in zip(index, chunk_shape, shape)) + # Prepend an Ellipsis to preserve any preceding (non-chunked) dimensions + full_slice = (...,) + slices + yield index, full_slice + diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 815906d7..0b1d36a6 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -7,7 +7,7 @@ from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata from linc_convert.utils.math import ceildiv -from linc_convert.utils.zarr import dimension_separator_to_chunk_key_encoding +from .create_array import dimension_separator_to_chunk_key_encoding def generate_pyramid( diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index fefcc5b4..6c0aee2f 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -98,7 +98,8 @@ class ZarrConfig: # driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" def __post_init__(self) -> None: - self.nii |= self.out.endswith(".nii.zarr") + if self.out: + self.nii |= self.out.endswith(".nii.zarr") if self.zarr_version == 2: if self.shard or self.shard_channels or self.shard_time: raise NotImplementedError("Shard is not supported for Zarr 2.") From 2f9d86855bc5b3cbd5cd0d47f4a0a0df13204ef4 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 8 Apr 2025 10:54:53 -0400 Subject: [PATCH 012/157] wip: refactor generate_pyramid.py --- linc_convert/utils/zarr/generate_pyramid.py | 113 +++++++++++--------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 0b1d36a6..bc35bb44 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -1,14 +1,17 @@ import itertools -from typing import Literal +import logging +import math +from typing import Literal, Optional -import nibabel as nib import numpy as np +import tqdm import zarr from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata from linc_convert.utils.math import ceildiv from .create_array import dimension_separator_to_chunk_key_encoding +logger = logging.getLogger(__name__) def generate_pyramid( omz: zarr.Group, @@ -16,7 +19,7 @@ def generate_pyramid( ndim: int = 3, max_load: int = 512, mode: Literal["mean", "median"] = "median", - no_pyramid_axis: int | None = None, + no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -35,7 +38,8 @@ def generate_pyramid( Maximum number of voxels to load along each dimension. mode : {"mean", "median"} Whether to use a mean or median moving window. - + no_pyramid_axis: int | None + # TODO: Returns ------- shapes : list[list[int]] @@ -47,71 +51,56 @@ def generate_pyramid( # Read properties from base level base_level = omz["0"] - shape = list(base_level.shape) + base_shape = list(base_level.shape) chunk_size = base_level.chunks opts = get_zarray_options(base_level) # Select windowing function - if mode == "median": - func = np.median - else: - assert mode == "mean" - func = np.mean + window_func = {"median": np.median, "mean": np.mean}[mode] - level = 0 - batch, shape = shape[:-ndim], shape[-ndim:] - allshapes = [shape] + batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + all_shapes = [spatial_shape] - while True: - level += 1 + # Compute default number of levels based on chunk size + if levels == -1: + levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + for lvl in tqdm.tqdm(range(1, levels + 1)): # Compute downsampled shape - prev_shape, shape = shape, [] - for i, length in enumerate(prev_shape): - if i == no_pyramid_axis: - shape.append(length) - else: - shape.append(max(1, length // 2)) - - # Stop if seen enough levels or level shape smaller than chunk size - if levels == -1: - if all(x <= c for x, c in zip(shape, chunk_size[-ndim:])): - break - elif level > levels: - break + prev_shape = spatial_shape + spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + all_shapes.append(spatial_shape) + logger.info("Compute level", lvl, "with shape", spatial_shape) - print("Compute level", level, "with shape", shape) - - allshapes.append(shape) - omz.create_array(str(level), shape=batch + shape, **opts) + arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) # Iterate across `max_load` chunks # (note that these are unrelated to underlying zarr chunks) grid_shape = [ceildiv(n, max_load) for n in prev_shape] - for chunk_index in itertools.product(*[range(x) for x in grid_shape]): - print(f"chunk {chunk_index} / {tuple(grid_shape)})", end="\r") + + for chunk_index in tqdm.tqdm( + itertools.product(*[range(x) for x in grid_shape])): # Read one chunk of data at the previous resolution slicer = [Ellipsis] + [ slice(i * max_load, min((i + 1) * max_load, n)) for i, n in zip(chunk_index, prev_shape) ] - fullshape = omz[str(level - 1)].shape - dat = omz[str(level - 1)][tuple(slicer)] + dat = omz[str(lvl - 1)][tuple(slicer)] # Discard the last voxel along odd dimensions + # if one dimension has length 1, it should not be cropped crop = [ - 0 if y == 1 else x % 2 for x, y in zip(dat.shape[-ndim:], fullshape) + 0 if y == 1 else x % 2 for x, y in zip(dat.shape[-ndim:], prev_shape) ] # Don't crop the axis not down-sampling - # cannot do if not no_pyramid_axis since it could be 0 if no_pyramid_axis is not None: crop[no_pyramid_axis] = 0 slcr = [slice(-1) if x else slice(None) for x in crop] dat = dat[tuple([Ellipsis, *slcr])] - if any(n == 0 for n in dat.shape): - # last strip had a single voxel, nothing to do + # last strip had a single voxel and become empty after cropping, nothing to do + if 0 in dat.shape: continue patch_shape = dat.shape[-ndim:] @@ -124,23 +113,23 @@ def generate_pyramid( windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] windowed_shape[2 * no_pyramid_axis + 1] = 1 - dat = dat.reshape(batch + windowed_shape) + dat = dat.reshape(tuple(batch_shape + windowed_shape)) # -> last `ndim`` dimensions have shape 2x2x2 dat = dat.transpose( - list(range(len(batch))) - + list(range(len(batch), len(batch) + 2 * ndim, 2)) - + list(range(len(batch) + 1, len(batch) + 2 * ndim, 2)) + list(range(len(batch_shape))) + + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) + + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) ) # -> flatten patches smaller_shape = [max(n // 2, 1) for n in patch_shape] if no_pyramid_axis is not None: smaller_shape[no_pyramid_axis] = patch_shape[no_pyramid_axis] - dat = dat.reshape(batch + smaller_shape + [-1]) + dat = dat.reshape(tuple(batch_shape + smaller_shape + [-1])) # Compute the median/mean of each patch dtype = dat.dtype - dat = func(dat, axis=-1) + dat = window_func(dat, axis=-1) dat = dat.astype(dtype) # Write output @@ -148,14 +137,36 @@ def generate_pyramid( slice(i * max_load // 2, min((i + 1) * max_load // 2, n)) if axis_index != no_pyramid_axis else slice(i * max_load, min((i + 1) * max_load, n)) - for i, axis_index, n in zip(chunk_index, range(ndim), shape) + for i, axis_index, n in zip(chunk_index, range(ndim), spatial_shape) ] - omz[str(level)][tuple(slicer)] = dat + arr[tuple(slicer)] = dat + + return all_shapes + + +def default_levels( + spatial_shape: tuple, + spatial_chunk: tuple, + no_pyramid_axis: Optional[int] +) -> int: + default_levels = max( + int(math.ceil(math.log2(s / spatial_chunk[i]))) + for i, s in enumerate(spatial_shape) + if no_pyramid_axis is None or i != no_pyramid_axis + ) + levels = max(default_levels, 0) + return levels - print("") - return allshapes +def next_level_shape(prev_shape: tuple, no_pyramid_axis: Optional[int]) -> list: + new_shape = [] + for i, length in enumerate(prev_shape): + if i == no_pyramid_axis: + new_shape.append(length) + else: + new_shape.append(max(1, length // 2)) + return new_shape def get_zarray_options(base_level): @@ -182,4 +193,4 @@ def get_zarray_options(base_level): else: opts_extra = {} opts.update(**opts_extra) - return opts \ No newline at end of file + return opts From 4d14b81dd21021858d9c242ffb99a667ce045aee Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 8 Apr 2025 10:55:01 -0400 Subject: [PATCH 013/157] wip: psoct --- .../modalities/psoct/_array_wrapper.py | 98 +++++++++ linc_convert/modalities/psoct/multi_slice.py | 106 +--------- .../modalities/psoct/single_volume.py | 186 ++++++------------ 3 files changed, 164 insertions(+), 226 deletions(-) create mode 100644 linc_convert/modalities/psoct/_array_wrapper.py diff --git a/linc_convert/modalities/psoct/_array_wrapper.py b/linc_convert/modalities/psoct/_array_wrapper.py new file mode 100644 index 00000000..45602393 --- /dev/null +++ b/linc_convert/modalities/psoct/_array_wrapper.py @@ -0,0 +1,98 @@ +from _warnings import warn +from typing import Mapping, Optional + +import h5py +import numpy as np +from scipy.io import loadmat + + +class _ArrayWrapper: + def _get_key(self, f: Mapping) -> str: + key = self.key + if key is None: + if not len(f.keys()): + raise Exception(f"{self.file} is empty") + # Select the first non-hidden key + for key in f.keys(): + if key[0] != "_": + break + if len(f.keys()) > 1: + warn( + f"More than one key in .mat file {self.file}, " + f'arbitrarily loading "{key}"' + ) + + if key not in f.keys(): + raise Exception(f"Key {key} not found in file {self.file}") + return key + + +class _H5ArrayWrapper(_ArrayWrapper): + def __init__(self, file: h5py.File, key: Optional[str]) -> None: + self.file = file + self.key = key + self.array = file.get(self._get_key(self.file)) + + def __del__(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def load(self) -> np.ndarray: + self.array = self.array[...] + if hasattr(self.file, "close"): + self.file.close() + self.file = None + return self.array + + @property + def shape(self) -> list[int]: + return self.array.shape + + @property + def dtype(self) -> np.dtype: + return self.array.dtype + + def __len__(self) -> int: + return len(self.array) + + def __getitem__(self, index: object) -> np.ndarray: + return self.array[index] + + +class _MatArrayWrapper(_ArrayWrapper): + def __init__(self, file: str, key: Optional[str]) -> None: + self.file = file + self.key = key + self.array = None + + def __del__(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def load(self) -> np.ndarray: + data = loadmat(self.file) + self.array = data.get(self._get_key(data)) + self.file = None + return self.array + + @property + def shape(self) -> tuple[int]: + if self.array is None: + self.load() + return self.array.shape + + @property + def dtype(self) -> np.dtype: + if self.array is None: + self.load() + return self.array.dtype + + def __len__(self) -> int: + if self.array is None: + self.load() + return len(self.array) + + def __getitem__(self, index: object) -> np.ndarray: + if self.array is None: + self.load() + return self.array[index] diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 2407acff..648b3e17 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -9,16 +9,16 @@ import os from functools import wraps from itertools import product -from typing import Callable, Mapping, Optional -from warnings import warn +from typing import Callable, Optional import logging import cyclopts import h5py import numpy as np -from scipy.io import loadmat from linc_convert import utils +from linc_convert.modalities.psoct._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ + _MatArrayWrapper from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.math import ceildiv @@ -44,98 +44,6 @@ def wrapper(inp: list[str], **kwargs: dict) -> callable: return wrapper -class _ArrayWrapper: - def _get_key(self, f: Mapping) -> str: - key = self.key - if key is None: - if not len(f.keys()): - raise Exception(f"{self.file} is empty") - # Select the first non-hidden key - for key in f.keys(): - if key[0] != "_": - break - if len(f.keys()) > 1: - warn( - f"More than one key in .mat file {self.file}, " - f'arbitrarily loading "{key}"' - ) - - if key not in f.keys(): - raise Exception(f"Key {key} not found in file {self.file}") - return key - - -class _H5ArrayWrapper(_ArrayWrapper): - def __init__(self, file: h5py.File, key: Optional[str]) -> None: - self.file = file - self.key = key - self.array = file.get(self._get_key(self.file)) - - def __del__(self) -> None: - if hasattr(self.file, "close"): - self.file.close() - - def load(self) -> np.ndarray: - self.array = self.array[...] - if hasattr(self.file, "close"): - self.file.close() - self.file = None - return self.array - - @property - def shape(self) -> list[int]: - return self.array.shape - - @property - def dtype(self) -> np.dtype: - return self.array.dtype - - def __len__(self) -> int: - return len(self.array) - - def __getitem__(self, index: object) -> np.ndarray: - return self.array[index] - - -class _MatArrayWrapper(_ArrayWrapper): - def __init__(self, file: str, key: Optional[str]) -> None: - self.file = file - self.key = key - self.array = None - - def __del__(self) -> None: - if hasattr(self.file, "close"): - self.file.close() - - def load(self) -> np.ndarray: - data = loadmat(self.file) - self.array = data.get(self._get_key(data)) - self.file = None - return self.array - - @property - def shape(self) -> list[int]: - if self.array is None: - self.load() - return self.array.shape - - @property - def dtype(self) -> np.dtype: - if self.array is None: - self.load() - return self.array.dtype - - def __len__(self) -> int: - if self.array is None: - self.load() - return len(self.array) - - def __getitem__(self, index: object) -> np.ndarray: - if self.array is None: - self.load() - return self.array[index] - - def _mapmat(fnames: list[str], key: Optional[str] = None) -> list[_ArrayWrapper]: """Load or memory-map an array stored in a .mat file.""" def make_wrapper(fname: str) -> _ArrayWrapper: @@ -155,12 +63,12 @@ def make_wrapper(fname: str) -> _ArrayWrapper: def convert( inp: list[str], *, - zarr_config: ZarrConfig = None, key: Optional[str] = None, meta: str = None, orientation: str = "RAS", center: bool = True, dtype: Optional[str] = None, + zarr_config: ZarrConfig = None, **kwargs ) -> None: """ @@ -209,9 +117,9 @@ def convert( # Prepare Zarr group omz = open_zarr_group(zarr_config) - # if not hasattr(inp[0], "dtype"): - # raise Exception("Input is not an array. This is likely unexpected") - if len(inp[0].shape) < 2: + if not hasattr(inp[0], "dtype"): + raise Exception("Input is not an array. This is likely unexpected") + if len(inp[0].shape) != 2: raise ValueError(f"Input array is not 2D: {inp[0].shape}") dtype = dtype or np.dtype(inp[0].dtype).str diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index f2d9f45b..02f896c9 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -5,31 +5,33 @@ into a OME-ZARR pyramid. """ -import ast import json -import math +import logging import os from contextlib import contextmanager from functools import wraps -from itertools import product from typing import Callable, Optional from warnings import warn import cyclopts import h5py import numpy as np -import zarr +from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header from scipy.io import loadmat from linc_convert import utils +from linc_convert.modalities.psoct._array_wrapper import _ArrayWrapper, _MatArrayWrapper from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct +from linc_convert.modalities.psoct.ms_dask import _H5ArrayWrapper +from linc_convert.utils.chunk_processing import chunk_slice_generator from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr import generate_pyramid, create_array, open_zarr_group from linc_convert.utils.zarr.zarr_config import ZarrConfig +logger = logging.getLogger(__name__) single_volume = cyclopts.App(name="single_volume", help_format="markdown") psoct.command(single_volume) @@ -38,45 +40,27 @@ def _automap(func: Callable) -> Callable: """Automatically map the array in the mat file.""" @wraps(func) - def wrapper(inp: str, out: str, **kwargs: dict) -> None: - if out is None: - out = os.path.splitext(inp[0])[0] - out += ".nii.zarr" if kwargs.get("nii", False) else ".ome.zarr" - # kwargs["nii"] = kwargs.get("nii", False) or out.endswith(".nii.zarr") - with _mapmat(inp, kwargs.get("key", None)) as dat: - return func(dat, zarr_config=zarr_config, **kwargs) + def wrapper(inp: str, zarr_config: ZarrConfig = None, **kwargs: dict) -> None: + # with _mapmat(inp, kwargs.get("key", None)) as dat: + # return func(dat, zarr_config=zarr_config, **kwargs) + dat = _mapmat(inp, kwargs.get("key", None)) + return func(dat, **kwargs) return wrapper -@contextmanager -def _mapmat(fname: str, key: str = None) -> None: +def _mapmat(fname: str, key: Optional[str] = None) -> _ArrayWrapper: """Load or memory-map an array stored in a .mat file.""" - try: - # "New" .mat file - f = h5py.File(fname, "r") - except Exception: - # "Old" .mat file - f = loadmat(fname) - - if key is None: - if not len(f.keys()): - raise Exception(f"{fname} is empty") - for key in f.keys(): - if key[:1] != "_": - break - if len(f.keys()) > 1: - warn( - f"More than one key in .mat file {fname}, " - f'arbitrarily loading "{key}"' - ) - - if key not in f.keys(): - raise Exception(f"Key {key} not found in file {fname}") - - yield f.get(key) - if hasattr(f, "close"): - f.close() + def make_wrapper(fname: str) -> _ArrayWrapper: + try: + # "New" .mat file + f = h5py.File(fname, "r") + return _H5ArrayWrapper(f, key) + except Exception: + # "Old" .mat file + return _MatArrayWrapper(fname, key) + + return make_wrapper(fname) @single_volume.default @@ -84,15 +68,12 @@ def _mapmat(fname: str, key: str = None) -> None: def convert( inp: str, *, - out: str, - zarr_config: ZarrConfig = None, key: Optional[str] = None, meta: str = None, - max_load: int = 128, - max_levels: int = 5, no_pool: Optional[int] = None, orientation: str = "RAS", center: bool = True, + zarr_config: ZarrConfig = None, **kwargs ) -> None: """ @@ -105,8 +86,6 @@ def convert( ---------- inp Path to the input mat file - out - Path to the output Zarr directory [.ome.zarr] key Key of the array to be extracted, default to first key found meta @@ -131,113 +110,66 @@ def convert( Set RAS[0, 0, 0] at FOV center """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) + zarr_config.set_default_name(os.path.splitext(inp.file)[0]) - # Write OME-Zarr multiscale metadata + # Process metadata if provided if meta: - print("Write JSON") + logger.info("Writing JSON metadata") with open(meta, "r") as f: meta_txt = f.read() meta_json = make_json(meta_txt) - path_json = ".".join(out.split(".")[:-2]) + ".json" + path_json = ".".join(zarr_config.out.split(".")[:-2]) + ".json" with open(path_json, "w") as f: json.dump(meta_json, f, indent=4) vx = meta_json["PixelSize"] unit = meta_json["PixelSizeUnits"] else: - vx = [1] * 3 + vx = [1, 1, 1] unit = "um" # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) + omz = open_zarr_group(zarr_config) if not hasattr(inp, "dtype"): raise Exception("Input is not a numpy array. This is unexpected.") - if len(inp.shape) < 3: + if len(inp.shape) != 3: raise Exception("Input array is not 3d:", inp.shape) - # Prepare chunking options - opt = { - "dimension_separator": r"/", - "order": "F", - "dtype": np.dtype(inp.dtype).str, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - - inp_chunk = [min(x, max_load) for x in inp.shape] + + inp_chunk = [min(x, zarr_config.max_load) for x in inp.shape] nk = ceildiv(inp.shape[0], inp_chunk[0]) nj = ceildiv(inp.shape[1], inp_chunk[1]) ni = ceildiv(inp.shape[2], inp_chunk[2]) - nblevels = min( - [int(math.ceil(math.log2(x))) for i, x in enumerate(inp.shape) if i != no_pool] - ) - nblevels = min(nblevels, int(math.ceil(math.log2(max_load)))) - nblevels = min(nblevels, max_levels) - - opt["chunks"] = [min(x, chunk) for x in inp.shape] - - omz.create_dataset(str(0), shape=inp.shape, **opt) - - # iterate across input chunks - for i, j, k in product(range(ni), range(nj), range(nk)): - loaded_chunk = inp[ - k * inp_chunk[0] : (k + 1) * inp_chunk[0], - j * inp_chunk[1] : (j + 1) * inp_chunk[1], - i * inp_chunk[2] : (i + 1) * inp_chunk[2], - ] - - print( - f"[{i + 1:03d}, {j + 1:03d}, {k + 1:03d}]", - "/", - f"[{ni:03d}, {nj:03d}, {nk:03d}]", - # f"({1 + level}/{nblevels})", - end="\r", + dataset = create_array(omz, "0", shape=inp.shape, zarr_config=zarr_config, + dtype=np.dtype(inp.dtype)) + + for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): + logger.info( + f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] ) + loaded_chunk = inp[slc] + dataset[slc] = loaded_chunk + + generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + logger.info("Write OME-Zarr multiscale metadata") + write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) - # save current chunk - omz["0"][ - k * inp_chunk[0] : k * inp_chunk[0] + loaded_chunk.shape[0], - j * inp_chunk[1] : j * inp_chunk[1] + loaded_chunk.shape[1], - i * inp_chunk[2] : i * inp_chunk[2] + loaded_chunk.shape[2], - ] = loaded_chunk - - generate_pyramid(omz, nblevels - 1, mode="mean", no_pyramid_axis=no_pool) - - print("") - - # Write OME-Zarr multiscale metadata - print("Write metadata") - print(unit) - ome_unit = to_ome_unit(unit) - write_ome_metadata( - omz, - axes=["z", "y", "x"], - no_pool=no_pool, - space_unit=ome_unit, - space_scale=vx, - multiscales_type=(("2x2x2" if no_pool is None else "2x2") + "mean window"), - ) - - if not nii: - print("done.") + if not zarr_config.nii: + logger.info("Conversion complete.") return # Write NIfTI-Zarr header - # NOTE: we use nifti2 because dimensions typically do not fit in a short - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - shape = list(reversed(omz["0"].shape)) + arr = omz["0"] + header, _ = default_nifti_header(arr, + omz.attrs.get("ome", omz.attrs).get("multiscales")) + reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: - affine = center_affine(affine, shape[:3]) - niftizarr_write_header( - omz, shape, affine, omz["0"].dtype, to_nifti_unit(unit), nifti_version=2 - ) + affine = center_affine(affine, reversed_shape[:3]) + header.set_data_shape(reversed_shape) + header.set_data_dtype(arr.dtype) + header.set_qform(affine) + header.set_sform(affine) + header.set_xyzt_units(to_nifti_unit(unit)) + + write_nifti_header(omz, header) From 577d43443c7851015deba355d64e797323e9dbfa Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 8 Apr 2025 16:09:56 -0400 Subject: [PATCH 014/157] wip: add a trivial pipeline for psoct for testing purpose --- linc_convert/modalities/psoct/__init__.py | 4 +- linc_convert/modalities/psoct/exp_dask.py | 128 ++++++++++++++++++++++ 2 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 linc_convert/modalities/psoct/exp_dask.py diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index 0bb41021..093ee910 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume", "ms_dask"] - from . import cli, multi_slice, single_volume, ms_dask + __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask"] + from . import cli, multi_slice, single_volume, ms_dask, exp_dask except ImportError: pass diff --git a/linc_convert/modalities/psoct/exp_dask.py b/linc_convert/modalities/psoct/exp_dask.py new file mode 100644 index 00000000..e66b1869 --- /dev/null +++ b/linc_convert/modalities/psoct/exp_dask.py @@ -0,0 +1,128 @@ +""" +Matlab to OME-Zarr. + +Converts Matlab files generated by the MGH in-house OCT pipeline +into a OME-ZARR pyramid. + +WARNING: THIS IS ONLY FOR TESTING IO. NEVER USE FOR PRODUCTION +""" + +import json +import os +from functools import wraps +from itertools import product +from typing import Callable, Mapping, Optional +from warnings import warn +import logging + +import cyclopts +import dask.array +import h5py +import numpy as np +from dask import delayed +from scipy.io import loadmat + +from linc_convert import utils +from linc_convert.modalities.psoct._utils import make_json +from linc_convert.modalities.psoct.cli import psoct +from linc_convert.utils.math import ceildiv +from linc_convert.utils.orientation import center_affine, orientation_to_affine +from linc_convert.utils.unit import to_nifti_unit, to_ome_unit +from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid +from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata +import dask.array as da + +from linc_convert.utils.zarr.zarr_config import ZarrConfig + +logger = logging.getLogger(__name__) +exp_dask = cyclopts.App(name="exp_dask", help_format="markdown") +psoct.command(exp_dask) + +@delayed +def load_mat_array(file, key): + return loadmat(file)[key] + +@exp_dask.default +def convert( + inp: list[str], + *, + zarr_config: ZarrConfig = None, + key: Optional[str] = None, + meta: str = None, + orientation: str = "RAS", + center: bool = True, + dtype: Optional[str] = None, + store: bool = True, + **kwargs +) -> None: + """ + Matlab to OME-Zarr. + + Convert OCT volumes in raw matlab files into a pyramidal + OME-ZARR (or NIfTI-Zarr) hierarchy. + + This command assumes that each slice in a volume is stored in a + different mat file. All slices must have the same shape and will be + concatenated into a 3D Zarr. + + Parameters + ---------- + inp : list of str + Paths to the input mat files. + key : Optional[str] + Key of the array to be extracted; defaults to the first key found. + meta : str + Path to the metadata file. + orientation : str + Orientation of the volume. + center : bool + Set RAS[0, 0, 0] at FOV center. + dtype : Optional[str] + Data type to write into. + """ + zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + vx = [1, 1, 1] + unit = "um" + logger.info("start") + # Prepare Zarr group + omz = open_zarr_group(zarr_config) + + dtype = np.float32 + nslices = len(inp) + data = [load_mat_array(inp[i], "R3D") for i in range(nslices)] + + slices = [da.from_delayed(i, shape=(350,350,1000), dtype=dtype) for i in data] + nested = np.array([None]*80, dtype=object) + for i in range(80): + nested[i] = slices[i] + nested=nested.reshape((4, 4, 5)) + # Convert the numpy array into a nested list + nested_list = nested.tolist() + + # Now concatenate the rows vertically + full_volume = da.block(nested_list) + print(full_volume.shape) + + dataset = create_array(omz, "0", shape=full_volume.shape, zarr_config=zarr_config, + dtype=np.dtype(dtype)) + if dataset.shards is None: + full_volume.to_zarr(dataset) + else: + full_volume = full_volume.rechunk(dataset.shards) + if store: + full_volume.store(dataset) + else: + def save(chunk,block_info=None): + slicer = tuple(slice(*al) for al in block_info[0]['array-location']) + dataset[slicer] = chunk + return 0 + full_volume.map_blocks(save, dtype=np.uint8).compute() + + + # generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + # logger.info("Write OME-Zarr multiscale metadata") + # write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + + if not zarr_config.nii: + logger.info("Conversion complete.") + return From b525f6c8e44145c3020e40032137afce856a6b5e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 9 Apr 2025 11:47:27 -0400 Subject: [PATCH 015/157] wip --- linc_convert/modalities/psoct/ms_dask.py | 266 +++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 linc_convert/modalities/psoct/ms_dask.py diff --git a/linc_convert/modalities/psoct/ms_dask.py b/linc_convert/modalities/psoct/ms_dask.py new file mode 100644 index 00000000..ad096d85 --- /dev/null +++ b/linc_convert/modalities/psoct/ms_dask.py @@ -0,0 +1,266 @@ +""" +Matlab to OME-Zarr. + +Converts Matlab files generated by the MGH in-house OCT pipeline +into a OME-ZARR pyramid. + +WARNING: THIS IS ONLY FOR TESTING IO. NEVER USE FOR PRODUCTION +""" + +import json +import os +from functools import wraps +from itertools import product +from typing import Callable, Mapping, Optional +from warnings import warn +import logging + +import cyclopts +import dask.array +import h5py +import numpy as np +from dask import delayed +from scipy.io import loadmat + +from linc_convert import utils +from linc_convert.modalities.psoct._utils import make_json +from linc_convert.modalities.psoct.cli import psoct +from linc_convert.utils.math import ceildiv +from linc_convert.utils.orientation import center_affine, orientation_to_affine +from linc_convert.utils.unit import to_nifti_unit, to_ome_unit +from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid +from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata +import dask.array as da + +from linc_convert.utils.zarr.zarr_config import ZarrConfig + +logger = logging.getLogger(__name__) +ms = cyclopts.App(name="ms", help_format="markdown") +psoct.command(ms) + + +def _automap(func: Callable) -> Callable: + """Automatically maps the array in the mat file.""" + + @wraps(func) + def wrapper(inp: list[str], **kwargs: dict) -> callable: + dat = _mapmat(inp, kwargs.get("key", None)) + return func(dat, **kwargs) + return wrapper + + +class _ArrayWrapper: + def _get_key(self, f: Mapping) -> str: + key = self.key + if key is None: + if not len(f.keys()): + raise Exception(f"{self.file} is empty") + # Select the first non-hidden key + for key in f.keys(): + if key[0] != "_": + break + if len(f.keys()) > 1: + warn( + f"More than one key in .mat file {self.file}, " + f'arbitrarily loading "{key}"' + ) + + if key not in f.keys(): + raise Exception(f"Key {key} not found in file {self.file}") + return key + + +class _H5ArrayWrapper(_ArrayWrapper): + def __init__(self, file: h5py.File, key: Optional[str]) -> None: + self.file = file + self.key = key + self.array = file.get(self._get_key(self.file)) + + def __del__(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def load(self) -> np.ndarray: + self.array = self.array[...] + if hasattr(self.file, "close"): + self.file.close() + self.file = None + return self.array + + @property + def shape(self) -> list[int]: + return self.array.shape + + @property + def dtype(self) -> np.dtype: + return self.array.dtype + + def __len__(self) -> int: + return len(self.array) + + def __getitem__(self, index: object) -> np.ndarray: + return self.array[index] + + +class _MatArrayWrapper(_ArrayWrapper): + def __init__(self, file: str, key: Optional[str]) -> None: + self.file = file + self.key = key + self.array = None + + def __del__(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def load(self) -> np.ndarray: + if self.array is not None: + return self.array + + data = loadmat(self.file) + self.array = data.get(self._get_key(data)) + self.file = None + return self.array + + @property + def shape(self) -> list[int]: + if self.array is None: + self.load() + return self.array.shape + + @property + def dtype(self) -> np.dtype: + if self.array is None: + self.load() + return self.array.dtype + + def __len__(self) -> int: + if self.array is None: + self.load() + return len(self.array) + + def __getitem__(self, index: object) -> np.ndarray: + if self.array is None: + self.load() + return self.array[index] + + +def _mapmat(fnames: list[str], key: Optional[str] = None) -> list[_ArrayWrapper]: + """Load or memory-map an array stored in a .mat file.""" + def make_wrapper(fname: str) -> _ArrayWrapper: + try: + # "New" .mat file + f = h5py.File(fname, "r") + return _H5ArrayWrapper(f, key) + except Exception: + # "Old" .mat file + return _MatArrayWrapper(fname, key) + + return [make_wrapper(fname) for fname in fnames] + +@ms.default +@_automap +def convert( + inp: list[str], + *, + zarr_config: ZarrConfig = None, + key: Optional[str] = None, + meta: str = None, + orientation: str = "RAS", + center: bool = True, + dtype: Optional[str] = None, + **kwargs +) -> None: + """ + Matlab to OME-Zarr. + + Convert OCT volumes in raw matlab files into a pyramidal + OME-ZARR (or NIfTI-Zarr) hierarchy. + + This command assumes that each slice in a volume is stored in a + different mat file. All slices must have the same shape and will be + concatenated into a 3D Zarr. + + Parameters + ---------- + inp : list of str + Paths to the input mat files. + key : Optional[str] + Key of the array to be extracted; defaults to the first key found. + meta : str + Path to the metadata file. + orientation : str + Orientation of the volume. + center : bool + Set RAS[0, 0, 0] at FOV center. + dtype : Optional[str] + Data type to write into. + """ + zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config.set_default_name(os.path.splitext(inp[0].file)[0]) + + # Process metadata if provided + if meta: + logger.info("Writing JSON metadata") + with open(meta, "r") as f: + meta_txt = f.read() + meta_json = make_json(meta_txt) + path_json = ".".join(zarr_config.out.split(".")[:-2]) + ".json" + with open(path_json, "w") as f: + json.dump(meta_json, f, indent=4) + vx = meta_json["PixelSize"] + unit = meta_json["PixelSizeUnits"] + else: + vx = [1, 1, 1] + unit = "um" + + # Prepare Zarr group + omz = open_zarr_group(zarr_config) + + # if not hasattr(inp[0], "dtype"): + # raise Exception("Input is not an array. This is likely unexpected") + if len(inp[0].shape) < 2: + raise ValueError(f"Input array is not 2D: {inp[0].shape}") + + dtype = dtype or np.dtype(inp[0].dtype).str + nslices = len(inp) + data = [delayed(inp[i].load)() for i in range(nslices)] + slices = [da.from_delayed(i, shape=inp[0].shape, dtype=dtype) for i in data] + full_volume = da.concatenate(slices, axis=2) + volume_shape = full_volume.shape + + dataset = create_array(omz, "0", shape=full_volume.shape, zarr_config=zarr_config, + dtype=np.dtype(dtype)) + if dataset.shards is None: + full_volume.to_zarr(dataset) + else: + full_volume = full_volume.rechunk(dataset.shards) + def save(chunk,block_info=None): + slicer = tuple(slice(*al) for al in block_info[0]['array-location']) + dataset[slicer] = chunk + return np.zeros_like(chunk) + full_volume.map_blocks(save,dtype=np.uint8).compute() + + + generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + logger.info("Write OME-Zarr multiscale metadata") + write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + + if not zarr_config.nii: + logger.info("Conversion complete.") + return + + # Write NIfTI-Zarr header + arr = omz["0"] + header, _ = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) + reversed_shape = list(reversed(arr.shape)) + affine = orientation_to_affine(orientation, *vx[::-1]) + if center: + affine = center_affine(affine, reversed_shape[:3]) + header.set_data_shape(reversed_shape) + header.set_data_dtype(arr.dtype) + header.set_qform(affine) + header.set_sform(affine) + header.set_xyzt_units(to_nifti_unit(unit)) + + write_nifti_header(omz, header) + From 1c7c1c24e3ce390d1885710909bfc226c12ca77f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Apr 2025 15:30:23 -0400 Subject: [PATCH 016/157] wip --- conda.yaml | 4 +--- pyproject.toml | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/conda.yaml b/conda.yaml index 54781a6d..11e70c05 100644 --- a/conda.yaml +++ b/conda.yaml @@ -2,7 +2,7 @@ name: linc-convert channels: - conda-forge dependencies: - - python=3.10 + - python - ipython - typer - numpy @@ -10,8 +10,6 @@ dependencies: - zarr - nibabel - tifffile - - wkw - - tensorstore - pytest - ruff - tifffile diff --git a/pyproject.toml b/pyproject.toml index 29f16a40..c310cac5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ numpy = "*" nibabel = "*" zarr = "^3.0.0" nifti-zarr = "*" +tqdm = "*" [tool.poetry.group.df] optional = true From caca57fac54b22a0b35dd018713ac6372d67153a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Apr 2025 15:31:41 -0400 Subject: [PATCH 017/157] wip --- linc_convert/utils/zarr/create_array.py | 1 + 1 file changed, 1 insertion(+) diff --git a/linc_convert/utils/zarr/create_array.py b/linc_convert/utils/zarr/create_array.py index 801a6f69..8530ad80 100644 --- a/linc_convert/utils/zarr/create_array.py +++ b/linc_convert/utils/zarr/create_array.py @@ -16,6 +16,7 @@ def open_zarr_group(zarr_config:ZarrConfig): + # TODO: check out is not none or empty store = zarr.storage.LocalStore(zarr_config.out) return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) From 843a698d143841235f545d06d38cb45b134298b8 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Apr 2025 15:59:27 -0400 Subject: [PATCH 018/157] wip --- linc_convert/modalities/psoct/exp_dask.py | 10 +- linc_convert/modalities/psoct/mosaic2d.py | 171 ++++++++++++++++++ linc_convert/modalities/psoct/mosaic3d.py | 206 ++++++++++++++++++++++ 3 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 linc_convert/modalities/psoct/mosaic2d.py create mode 100644 linc_convert/modalities/psoct/mosaic3d.py diff --git a/linc_convert/modalities/psoct/exp_dask.py b/linc_convert/modalities/psoct/exp_dask.py index e66b1869..b30ce00c 100644 --- a/linc_convert/modalities/psoct/exp_dask.py +++ b/linc_convert/modalities/psoct/exp_dask.py @@ -122,7 +122,15 @@ def save(chunk,block_info=None): # generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) # logger.info("Write OME-Zarr multiscale metadata") # write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) - + def print_proc_io(): + try: + with open("/proc/self/io", "r") as proc_io: + content = proc_io.read() + print(content) + except Exception as e: + print("Error reading /proc/self/io:", e) + + print_proc_io() if not zarr_config.nii: logger.info("Conversion complete.") return diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py new file mode 100644 index 00000000..a0f0ae06 --- /dev/null +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -0,0 +1,171 @@ +import os +import numpy as np +import scipy.io as sio +import nibabel as nib +import imageio +import warnings + +import dask.array as da + +from linc_convert.utils.zarr import ZarrConfig + + +def mosaic2d_telesto( + inp:str, + *, + parameter_file: str, + modality: str, + method: str = None, + zarr_config: ZarrConfig = None, +) -> None: + """ + Python translation of Mosaic2D_Telesto. + + Parameters + ---------- + inp : str + Paths + + """ + # Load .mat containing Parameters, Scan, and Mosaic2D + params = sio.loadmat(parameter_file, squeeze_me=True) + Parameters = params['Parameters'] + Scan = params['Scan'] + Mosaic2D = params['Mosaic2D'] + + use_method = method is not None + print(f"--Modality is {modality}--") + + sliceidx = Mosaic2D['sliceidx'] # 3xN array + + exp_file = Mosaic2D['Exp'] + mat_contents = sio.whosmat(exp_file) + names = [m[0] for m in mat_contents] + key = next((n for n in names if 'Experiment_Fiji' in n), + next((n for n in names if 'Experiment' in n), None)) + if key is None: + raise ValueError("No Experiment found in .mat") + Experiment = sio.loadmat(exp_file, squeeze_me=True)[key] + + if use_method: + Experiment['X_Mean'] = Experiment[method]['X_Mean'] + Experiment['Y_Mean'] = Experiment[method]['Y_Mean'] + + indir = list(Mosaic2D['indir'].flat) + file_format = Mosaic2D['file_format'] + filetype = Mosaic2D['InFileType'] + transpose_flag = bool(Parameters['transpose']) + + system = Scan['System'] + if system == 'Octopus': + XPixClip = int(Parameters['YPixClip']) + YPixClip = int(Parameters['XPixClip']) + else: + XPixClip = int(Parameters['XPixClip']) + YPixClip = int(Parameters['YPixClip']) + + X = da.from_array(Experiment['X_Mean'], chunks='auto').astype(float) + Y = da.from_array(Experiment['Y_Mean'], chunks='auto').astype(float) + X = X - X.min() + 1 + Y = Y - Y.min() + 1 + NbPix = int(Experiment['NbPix']) + sizerow = NbPix - XPixClip + sizecol = NbPix - YPixClip + MXL = int(da.nanmax(X).compute() + sizerow - 1) + MYL = int(da.nanmax(Y).compute() + sizecol - 1) + MZL = 4 if modality.lower() == 'orientation' else 1 + + dx = da.nanmedian(X.diff(axis=0)).compute() + dy = da.nanmedian(Y.diff(axis=1)).compute() + ramp_x = sizerow - int(round(dx)) + ramp_y = sizecol - int(round(dy)) + x = da.ones((sizerow,), chunks=sizerow) + y = da.ones((sizecol,), chunks=sizecol) + xv = da.linspace(0, 1, ramp_x) + yv = da.linspace(0, 1, ramp_y) + x = da.concatenate([xv, da.ones((sizerow - ramp_x,), chunks=sizerow - ramp_x)]) + y = da.concatenate([yv, da.ones((sizecol - ramp_y,), chunks=sizecol - ramp_y)]) + RampOrig = x[:, None] * y[None, :] + + MapIndex = Experiment['MapIndex_Tot_offset'] + Experiment['First_Tile'] - 1 + num_slices = sliceidx.shape[1] + mosaics = {} + + for s in range(num_slices): + sl_in, sl_out, sl_run = sliceidx[:, s] + indir_curr = indir[int(sl_run) - 1] + base = os.path.join(indir_curr, file_format) + + M = da.zeros((MXL, MYL, MZL), dtype=np.float32, chunks='auto') + Ma = da.zeros((MXL, MYL), dtype=np.float32, chunks='auto') + + rows, cols = MapIndex.shape + for ii in range(cols): + for jj in range(rows): + idx = MapIndex[jj, ii] + if idx > 0 and not np.isnan(Experiment['X_Mean'][jj, ii]): + r0 = int(Experiment['X_Mean'][jj, ii]) + c0 = int(Experiment['Y_Mean'][jj, ii]) + rowslice = slice(r0, r0 + sizerow) + colslice = slice(c0, c0 + sizecol) + currtile = int((sl_in - 1) * Experiment['TilesPerSlice'] + idx) + + # lazy load with dask + if filetype.lower() == 'nifti': + img = nib.load(get_volname(base, currtile, modality[:3])) + proxy = img.dataobj + I = da.from_array(proxy, chunks='auto') + elif filetype.lower() == 'mat': + matname = get_volname(base, currtile, modality[:3]) + matcontent = sio.loadmat(matname, squeeze_me=True) + varname = next(k for k in matcontent if not k.startswith('__')) + arr = matcontent[varname] + I = da.from_array(arr, chunks='auto') + else: + warnings.warn(f"Unknown filetype: {filetype}") + continue + + if system.lower() == 'octopus': + I = I.T + if transpose_flag: + I = I.T + + I = I[XPixClip:, YPixClip:] + + if modality.lower() == 'orientation': + ang = da.deg2rad(I) + SLO_OC = da.stack([da.cos(ang) ** 2, + da.cos(ang) * da.sin(ang), + da.cos(ang) * da.sin(ang), + da.sin(ang) ** 2], axis=-1) + M[rowslice, colslice, :] += SLO_OC * RampOrig[..., None] + Ma[rowslice, colslice] += RampOrig + else: + M[rowslice, colslice, 0] += I * RampOrig + Ma[rowslice, colslice] += RampOrig + + if modality.lower() == 'orientation': + T = M / Ma[..., None] + H = T.reshape((-1, 2, 2)) + vals, vecs = da.linalg.eig(H) + idx_max = da.argmax(vals, axis=1) + v = vecs[da.arange(H.shape[0]), :, idx_max] + angles = da.rad2deg(da.arctan2(v[:, 1], v[:, 0])).reshape((MXL, MYL)) + O = da.rot90(angles, -1) + mosaics[int(sl_out)] = O + else: + Z = M[..., 0] / Ma + Z = da.rot90(Z, -1) + Z = da.where(da.isnan(Z), 0, Z) + mosaics[int(sl_out)] = Z + + return mosaics + + +def get_volname(base: str, num: int, modality: str) -> str: + """ + Replace placeholders in the base filename. + """ + vol = base.replace('%tileID', f"{num:03d}") + vol = vol.replace('%modality', modality) + return vol diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py new file mode 100644 index 00000000..fc536ccc --- /dev/null +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -0,0 +1,206 @@ +import os +import numpy as np +import dask.array as da +import scipy.io as sio +import nibabel as nib +import tensorstore as ts +import warnings + + + +def mosaic3d_telesto( + parameter_file: str, + out_zarr: str, + downsample_zarr: str = None +) -> None: + """ + + + """ + # Load parameters + params = sio.loadmat(parameter_file, squeeze_me=True) + Parameters = params['Parameters'] + Scan = params['Scan'] + Mosaic3D = params['Mosaic3D'] + + modality = Mosaic3D['modality'] + print(f"--Modality is {modality}--") + + # Input volumes index + sliceidx = Mosaic3D['sliceidx'] # shape (3, N) + + # Load Experiment struct + exp_file = Mosaic3D['Exp'] + content = sio.whosmat(exp_file) + keys = [k[0] for k in content] + exp_key = next((k for k in keys if 'Experiment_Fiji' in k), + next((k for k in keys if 'Experiment' in k), None)) + if exp_key is None: + raise ValueError("No Experiment found in .mat file") + Experiment = sio.loadmat(exp_file, squeeze_me=True)[exp_key] + + # Directories and file settings + indir = list(Mosaic3D['indir'].flat) + file_format = Mosaic3D['FileNameFormat'][0] + filetype = Mosaic3D['InFileType'] + out_dir = os.path.dirname(out_zarr) + os.makedirs(out_dir, exist_ok=True) + + # Clipping + system = Scan['System'] + if system == 'Octopus': + XPixClip = int(Parameters['YPixClip']) + YPixClip = int(Parameters['XPixClip']) + else: + XPixClip = int(Parameters['XPixClip']) + YPixClip = int(Parameters['YPixClip']) + + # Flip in Z? + flag_flip = bool(Mosaic3D.get('invert_Z', True)) + + # Mosaic geometry + NbPix = int(Experiment['NbPix']) + X = np.array(Experiment['X_Mean'], dtype=float) + Y = np.array(Experiment['Y_Mean'], dtype=float) + X -= X.min() - 1 + Y -= Y.min() - 1 + sizerow = NbPix - XPixClip + sizecol = NbPix - YPixClip + MXL = int(np.nanmax(X) + sizerow - 1) + MYL = int(np.nanmax(Y) + sizecol - 1) + MZL = int(Mosaic3D['MZL']) + + # Blending ramp + dx = np.nanmedian(np.diff(Experiment['X_Mean'], axis=0)) + dy = np.nanmedian(np.diff(Experiment['Y_Mean'], axis=1)) + ramp_x = sizerow - int(round(dx)) + ramp_y = sizecol - int(round(dy)) + xv = np.linspace(0, 1, ramp_x) + yv = np.linspace(0, 1, ramp_y) + x = np.ones(sizerow) + y = np.ones(sizecol) + x[:ramp_x] = xv + x[-ramp_x:] = xv + y[:ramp_y] = yv + y[-ramp_y:] = yv + Ramp2D = np.outer(x, y) + Ramp3D = np.broadcast_to(Ramp2D[:, :, None], (MXL, MYL, MZL)) + + # Map indices + MapIndex = Experiment['MapIndex_Tot_offset'] + Experiment['First_Tile'] - 1 + + # Number of slices + num_slices = sliceidx.shape[1] + + # Prepare list of lazy slice arrays + slices = [] + for s in range(num_slices): + sl_in, sl_out, sl_run = map(int, sliceidx[:, s]) + indir_curr = indir[sl_run - 1] + base = os.path.join(indir_curr, file_format) + + # Accumulators as dask arrays + M = da.zeros((MXL, MYL, MZL), dtype=np.float32, chunks=(MXL, MYL, MZL)) + Ma = da.zeros((MXL, MYL), dtype=np.float32, chunks=(MXL, MYL)) + + # Loop tiles + rows, cols = MapIndex.shape + for jj in range(rows): + for ii in range(cols): + idx = int(MapIndex[jj, ii]) + if idx <= 0 or np.isnan(X[jj, ii]): + continue + r0 = int(X[jj, ii]) + c0 = int(Y[jj, ii]) + tile_slice = slice(r0, r0 + sizerow) + tile_col = slice(c0, c0 + sizecol) + currtile = (sl_in - 1) * int(Experiment['TilesPerSlice']) + idx + + # Lazy load array + if filetype.lower() == 'nifti': + volname = get_volname(base, currtile, 'cropped') + img = nib.load(volname) + data = da.from_array(img.dataobj, chunks='auto') + else: # .mat + fname = os.path.join(indir_curr, file_format.replace('%tileID', f"{currtile:03d}")) + mat = sio.loadmat(fname, squeeze_me=True) + var = next(k for k in mat if not k.startswith('__')) + data = da.from_array(mat[var], chunks='auto') + + # Clip and flip + data = data[XPixClip:, YPixClip:, :MZL] + if system == 'Octopus': + data = data.transpose((1, 0, 2)) + if flag_flip: + data = data[:, :, ::-1] + + # Convert dtype + data = data.astype(np.float32) + + # Compute modality-specific data (e.g., mus or dBI) + # Assuming direct use of first MZL frames + patch = data + + # Blend + M = M.at[tile_slice, tile_col, :].add(patch * Ramp3D) + Ma = Ma.at[tile_slice, tile_col].add(Ramp2D) + + # Finalize slice + Ma3 = da.broadcast_to(Ma[:, :, None], (MXL, MYL, MZL)) + mosaic = M / Ma3 + mosaic = da.where(da.isfinite(mosaic), mosaic, 0) + slices.append(mosaic) + + # Stack into full volume: shape (num_slices, MXL, MYL, MZL) + volume = da.stack(slices, axis=0) + + # Open TensorStore for output + spec = { + 'driver': 'zarr', + 'kvstore': {'driver': 'file', 'path': out_zarr}, + 'metadata': { + 'dtype': 'float32', + 'shape': list(volume.shape), + 'chunks': list(volume.chunksize) + } + } + store = ts.open(spec, create=True).result() + # Write Dask array into TensorStore + ts.copy(volume, store).result() + + # Optional downsampling + if downsample_zarr: + sxyz = Mosaic3D['sxyz'] + # factors: floor(sxyz / voxel_size) e.g., (2,2,1) + factors = (int(sxyz[0]), int(sxyz[1]), 1) + down = do_downsample(volume, factors) + ds_spec = { + 'driver': 'zarr', + 'kvstore': {'driver': 'file', 'path': downsample_zarr}, + 'metadata': { + 'dtype': 'float32', + 'shape': list(down.shape), + 'chunks': list(down.chunksize) + } + } + ds_store = ts.open(ds_spec, create=True).result() + ts.copy(down, ds_store).result() + + print(f"Wrote {out_zarr}{' and ' + downsample_zarr if downsample_zarr else ''}") + +def get_volname(base: str, num: int, modality: str) -> str: + """ + Replace placeholders in the base filename. + """ + vol = base.replace('%tileID', f"{num:03d}") + vol = vol.replace('%modality', modality) + return vol + + +def do_downsample(volume: da.Array, factors: tuple) -> da.Array: + """ + Downsample a Dask array by taking block-wise mean over given integer factors. + factors: (fx, fy, fz) + """ + fx, fy, fz = factors + return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) From 5ccaad5cf18160ff5ef662a8ea98e372d89e982e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Apr 2025 12:05:33 -0400 Subject: [PATCH 019/157] wip --- linc_convert/modalities/psoct/__init__.py | 4 +- linc_convert/modalities/psoct/exp_dask.py | 16 +- linc_convert/modalities/psoct/mosaic3d.py | 494 +++++++---- linc_convert/modalities/psoct/ms_dask.py | 5 +- linc_convert/modalities/psoct/multi_slice.py | 4 +- .../modalities/psoct/single_volume.py | 7 +- .../modalities/psoct/utils/__init__.py | 0 .../psoct/{ => utils}/_array_wrapper.py | 0 .../modalities/psoct/{ => utils}/_utils.py | 89 +- linc_convert/modalities/psoct/utils/_zarr.py | 837 ++++++++++++++++++ 10 files changed, 1248 insertions(+), 208 deletions(-) create mode 100644 linc_convert/modalities/psoct/utils/__init__.py rename linc_convert/modalities/psoct/{ => utils}/_array_wrapper.py (100%) rename linc_convert/modalities/psoct/{ => utils}/_utils.py (55%) create mode 100644 linc_convert/modalities/psoct/utils/_zarr.py diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index 093ee910..6764a509 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask"] - from . import cli, multi_slice, single_volume, ms_dask, exp_dask + __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask", "mosaic3d"] + from . import cli, multi_slice, single_volume, ms_dask, exp_dask, mosaic3d except ImportError: pass diff --git a/linc_convert/modalities/psoct/exp_dask.py b/linc_convert/modalities/psoct/exp_dask.py index b30ce00c..01365351 100644 --- a/linc_convert/modalities/psoct/exp_dask.py +++ b/linc_convert/modalities/psoct/exp_dask.py @@ -7,29 +7,17 @@ WARNING: THIS IS ONLY FOR TESTING IO. NEVER USE FOR PRODUCTION """ -import json -import os -from functools import wraps -from itertools import product -from typing import Callable, Mapping, Optional -from warnings import warn +from typing import Optional import logging import cyclopts -import dask.array -import h5py import numpy as np from dask import delayed from scipy.io import loadmat from linc_convert import utils -from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.math import ceildiv -from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid -from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata +from linc_convert.utils.zarr import open_zarr_group, create_array import dask.array as da from linc_convert.utils.zarr.zarr_config import ZarrConfig diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index fc536ccc..0a807766 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -1,206 +1,340 @@ -import os -import numpy as np +import logging +import os.path as op + +import cyclopts import dask.array as da -import scipy.io as sio +import dask import nibabel as nib +import numpy as np +import scipy.io as sio import tensorstore as ts -import warnings +from linc_convert.modalities.psoct.cli import psoct +from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ + find_experiment_params, mat_vars, atleast_2d_trailing, load_mat +from linc_convert.modalities.psoct.utils._zarr import default_write_config +from linc_convert.utils.zarr.create_array import compute_zarr_layout +from linc_convert.utils.zarr.zarr_config import ZarrConfig + +logger = logging.getLogger(__name__) +mosaic3d = cyclopts.App(name="mosaic3d", help_format="markdown") +psoct.command(mosaic3d) +@mosaic3d.default def mosaic3d_telesto( + # inp: str, parameter_file: str, - out_zarr: str, - downsample_zarr: str = None + *, + # parameter_file: str, + downsample: bool = False, + use_gpu: bool = False, + zarr_config: ZarrConfig = None, ) -> None: - """ - - """ # Load parameters params = sio.loadmat(parameter_file, squeeze_me=True) - Parameters = params['Parameters'] - Scan = params['Scan'] - Mosaic3D = params['Mosaic3D'] + Parameters, Scan, Mosaic3D = params['Parameters'], params['Scan'], params[ + 'Mosaic3D'] + Parameters = struct_arr_to_dict(Parameters) + Scan = struct_arr_to_dict(Scan) + Mosaic3D = struct_arr_to_dict(Mosaic3D) + # Load Experiment parameters + Exp, is_fiji = find_experiment_params(Mosaic3D['Exp']) + # load variables from parameters modality = Mosaic3D['modality'] - print(f"--Modality is {modality}--") - - # Input volumes index - sliceidx = Mosaic3D['sliceidx'] # shape (3, N) - - # Load Experiment struct - exp_file = Mosaic3D['Exp'] - content = sio.whosmat(exp_file) - keys = [k[0] for k in content] - exp_key = next((k for k in keys if 'Experiment_Fiji' in k), - next((k for k in keys if 'Experiment' in k), None)) - if exp_key is None: - raise ValueError("No Experiment found in .mat file") - Experiment = sio.loadmat(exp_file, squeeze_me=True)[exp_key] - - # Directories and file settings - indir = list(Mosaic3D['indir'].flat) - file_format = Mosaic3D['FileNameFormat'][0] - filetype = Mosaic3D['InFileType'] - out_dir = os.path.dirname(out_zarr) - os.makedirs(out_dir, exist_ok=True) - - # Clipping - system = Scan['System'] - if system == 'Octopus': - XPixClip = int(Parameters['YPixClip']) - YPixClip = int(Parameters['XPixClip']) - else: - XPixClip = int(Parameters['XPixClip']) - YPixClip = int(Parameters['YPixClip']) + sliceidx = atleast_2d_trailing(Mosaic3D['sliceidx']) + FileNameFormat = atleast_2d_trailing(Scan['FileNameFormat']) + + indir = np.atleast_1d(Mosaic3D['indir']) + ftype = Mosaic3D['InFileType'].lower() - # Flip in Z? - flag_flip = bool(Mosaic3D.get('invert_Z', True)) + # Clipping parameters + if Scan['System'] == 'Octopus': + xp, yp = Parameters['YPixClip'], Parameters['XPixClip'] + else: + xp, yp = Parameters['XPixClip'], Parameters['YPixClip'] + xp, yp = int(xp), int(yp) + flipZ = bool(Mosaic3D.get('invert_Z', True)) # Mosaic geometry - NbPix = int(Experiment['NbPix']) - X = np.array(Experiment['X_Mean'], dtype=float) - Y = np.array(Experiment['Y_Mean'], dtype=float) - X -= X.min() - 1 - Y -= Y.min() - 1 - sizerow = NbPix - XPixClip - sizecol = NbPix - YPixClip - MXL = int(np.nanmax(X) + sizerow - 1) - MYL = int(np.nanmax(Y) + sizecol - 1) + nb_pix = int(Exp['NbPix']) + size_row, size_column = nb_pix - xp, nb_pix - yp + X, Y = Exp['X_Mean'], Exp['Y_Mean'] + X -= np.nanmin(X) + Y -= np.nanmin(Y) + MXL = int(np.nanmax(X) + size_row) + MYL = int(np.nanmax(Y) + size_column) MZL = int(Mosaic3D['MZL']) - # Blending ramp - dx = np.nanmedian(np.diff(Experiment['X_Mean'], axis=0)) - dy = np.nanmedian(np.diff(Experiment['Y_Mean'], axis=1)) - ramp_x = sizerow - int(round(dx)) - ramp_y = sizecol - int(round(dy)) - xv = np.linspace(0, 1, ramp_x) - yv = np.linspace(0, 1, ramp_y) - x = np.ones(sizerow) - y = np.ones(sizecol) - x[:ramp_x] = xv - x[-ramp_x:] = xv - y[:ramp_y] = yv - y[-ramp_y:] = yv - Ramp2D = np.outer(x, y) - Ramp3D = np.broadcast_to(Ramp2D[:, :, None], (MXL, MYL, MZL)) + # Precompute blending ramps + dx = np.nanmedian(np.diff(X, axis=0)) + dy = np.nanmedian(np.diff(Y, axis=1)) + rx, ry = size_row - round(dx), size_column - round(dy) + xv = np.linspace(0, 1, int(rx)) + yv = np.linspace(0, 1, int(ry)) + x = np.ones(size_row) + x[:rx], x[-rx:] = xv, xv + y = np.ones(size_column) + y[:ry], y[-ry:] = yv, yv + Ramp2D = da.from_array(np.outer(x, y)[:, :], chunks=(size_row, size_column)) + Ramp3D = Ramp2D[...,None] # Map indices - MapIndex = Experiment['MapIndex_Tot_offset'] + Experiment['First_Tile'] - 1 - - # Number of slices - num_slices = sliceidx.shape[1] - - # Prepare list of lazy slice arrays - slices = [] - for s in range(num_slices): - sl_in, sl_out, sl_run = map(int, sliceidx[:, s]) - indir_curr = indir[sl_run - 1] - base = os.path.join(indir_curr, file_format) - - # Accumulators as dask arrays - M = da.zeros((MXL, MYL, MZL), dtype=np.float32, chunks=(MXL, MYL, MZL)) - Ma = da.zeros((MXL, MYL), dtype=np.float32, chunks=(MXL, MYL)) - - # Loop tiles - rows, cols = MapIndex.shape - for jj in range(rows): - for ii in range(cols): - idx = int(MapIndex[jj, ii]) - if idx <= 0 or np.isnan(X[jj, ii]): - continue - r0 = int(X[jj, ii]) - c0 = int(Y[jj, ii]) - tile_slice = slice(r0, r0 + sizerow) - tile_col = slice(c0, c0 + sizecol) - currtile = (sl_in - 1) * int(Experiment['TilesPerSlice']) + idx - - # Lazy load array - if filetype.lower() == 'nifti': - volname = get_volname(base, currtile, 'cropped') - img = nib.load(volname) - data = da.from_array(img.dataobj, chunks='auto') - else: # .mat - fname = os.path.join(indir_curr, file_format.replace('%tileID', f"{currtile:03d}")) - mat = sio.loadmat(fname, squeeze_me=True) - var = next(k for k in mat if not k.startswith('__')) - data = da.from_array(mat[var], chunks='auto') - - # Clip and flip - data = data[XPixClip:, YPixClip:, :MZL] - if system == 'Octopus': - data = data.transpose((1, 0, 2)) - if flag_flip: - data = data[:, :, ::-1] - - # Convert dtype - data = data.astype(np.float32) - - # Compute modality-specific data (e.g., mus or dBI) - # Assuming direct use of first MZL frames - patch = data - - # Blend - M = M.at[tile_slice, tile_col, :].add(patch * Ramp3D) - Ma = Ma.at[tile_slice, tile_col].add(Ramp2D) - - # Finalize slice - Ma3 = da.broadcast_to(Ma[:, :, None], (MXL, MYL, MZL)) - mosaic = M / Ma3 - mosaic = da.where(da.isfinite(mosaic), mosaic, 0) - slices.append(mosaic) - - # Stack into full volume: shape (num_slices, MXL, MYL, MZL) - volume = da.stack(slices, axis=0) - - # Open TensorStore for output - spec = { - 'driver': 'zarr', - 'kvstore': {'driver': 'file', 'path': out_zarr}, - 'metadata': { - 'dtype': 'float32', - 'shape': list(volume.shape), - 'chunks': list(volume.chunksize) - } - } - store = ts.open(spec, create=True).result() - # Write Dask array into TensorStore - ts.copy(volume, store).result() - - # Optional downsampling - if downsample_zarr: - sxyz = Mosaic3D['sxyz'] - # factors: floor(sxyz / voxel_size) e.g., (2,2,1) - factors = (int(sxyz[0]), int(sxyz[1]), 1) - down = do_downsample(volume, factors) - ds_spec = { - 'driver': 'zarr', - 'kvstore': {'driver': 'file', 'path': downsample_zarr}, - 'metadata': { - 'dtype': 'float32', - 'shape': list(down.shape), - 'chunks': list(down.chunksize) - } - } - ds_store = ts.open(ds_spec, create=True).result() - ts.copy(down, ds_store).result() - - print(f"Wrote {out_zarr}{' and ' + downsample_zarr if downsample_zarr else ''}") - -def get_volname(base: str, num: int, modality: str) -> str: - """ - Replace placeholders in the base filename. - """ - vol = base.replace('%tileID', f"{num:03d}") - vol = vol.replace('%modality', modality) - return vol + MapIdx = Exp['MapIndex_Tot_offset'] + Exp['First_Tile'] - 1 + n_slices = sliceidx.shape[1] + + def build_slice(s: int) -> da.Array: + sl_in, sl_out, run = sliceidx[:, s] + base_dir = indir[run - 1] + M_acc = da.zeros((MXL, MYL,MZL), chunks=(MXL, MYL, MZL), dtype=np.float32) + W_acc = da.zeros((MXL, MYL), chunks=(MXL, MYL), dtype=np.float32) + if is_fiji: + pass + # following line is commented out in original code + # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] + + for (jj, ii), idx in np.ndenumerate(MapIdx): + if idx <= 0 or np.isnan(X[jj, ii]): + continue + r0, c0 = int(X[jj, ii]), int(Y[jj, ii]) + row_range = slice(r0, r0 + size_row) + column_range = slice(c0, c0 + size_column) + tile_id = (sl_in - 1) * int(Exp['TilesPerSlice']) + idx + + # Load data lazily + if ftype == 'nifti': + if tile_id>120: + # do not know why, from matlab code + tile_id -= 1 + path = op.join(base_dir, f"test_processed_{tile_id:03d}_cropped.nii") + header = nib.load(path) + shape = header.shape + dtype = header.get_data_dtype() + delayed_arr = dask.delayed(header.get_fdata)() + + else: + mat_path = op.join(base_dir, FileNameFormat[0,0]%tile_id) + arr = sio.loadmat(mat_path, squeeze_me=True)[next(mat_vars(mat_path))] + arr = da.from_array(arr, chunks='auto') + name, shape, dtype = None, None, None + for name, shape, dtype in sio.whosmat(mat_path): + if not name.startswith("__"): + break + if not name: + raise ValueError("Variable not found") + + delayed_arr = dask.delayed(load_mat)(mat_path, name) + + arr = da.from_delayed(delayed_arr, + shape=shape, + dtype=dtype) + + arr = arr.astype(np.float32) + if Scan['System'] == 'Octopus': + arr = arr.transpose((1, 0, 2)) + if flipZ: + arr = arr[:, :, ::-1] + + arr = arr[xp:, yp:, :] + + if modality == "mus": + if ftype == 'mat': + arr = arr[:, :, :MZL] + elif ftype == 'nifti': + # shape (H, W, N) + I = 10.0 ** (arr / 10.0) + + # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] + # via a reverse cumulative-sum trick: + # reverse along the 3rd axis → shape (H,W,N) + I_rev = I[:, :, ::-1] + # cumulative sum in reversed order → (H,W,N) + cumsum_rev = np.cumsum(I_rev, + axis=2) + # drop the very first (no “next” beyond the last) → (H,W,N-1) + sum_excl_rev = cumsum_rev[:, :,:-1] + # flip back to original order → (H,W,N-1) + sum_excl = sum_excl_rev[:, :, ::-1] + + # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) + sum_excl = sum_excl[:, :, :MZL] # keep only the first MZL sums → (H,W,MZL) + + # divide elementwise and apply the constant factors + arr = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) + + else: + raise Exception("unknown file type") + elif modality == "dBI": + arr = arr[:,:,:MZL] + else: + raise Exception("unknown modality") + M_acc[row_range, column_range, :] += arr * Ramp3D + W_acc[row_range, column_range] += Ramp2D + + # arr = arr.astype(np.float32)[None, row_range, column_range] + # Blend into accumulators + # M_acc = da.overlap.overlap(M_acc, {0: 0, 1: 0, + # 2: 0}) # no-op but ensures dask consistency + # M_acc = M_acc.map_blocks( + # lambda block, patch=arr, ramp=Ramp3D: block + patch * ramp, + # dtype=np.float32) + # W_acc = W_acc.map_blocks( + # lambda block, ramp2=Ramp2D: block + ramp2[None, :, :], + # dtype=np.float32) + + # Normalize and replace NaNs + result = M_acc / W_acc[...,None] + result = da.nan_to_num(result) + return result + + # Build full volume graph + slices = [build_slice(s) for s in range(n_slices)] + + + def stitch_slices(slices): + z_off, z_sm, z_s = Mosaic3D["z_parameters"][:3] + # z_off: every slice is going to remove this much from beginning + z_off, z_sm, z_s = int(z_off), int(z_sm), int(z_s) + z_sms = z_sm + z_s + z_m = z_sm - z_s + # --- Load one slice to get block size and build tissue profile --- + Id0 = slices[0] + + if modality.lower() == 'mus': + # (If you want the 'mus' branch, you'd need skimage.filters.threshold_multiotsu, etc.) + raise NotImplementedError("The 'mus' branch is not shown here.") + else: + # dBI: average a small tissue-only block + tissue0 = Id0[:200, :200, z_off:].mean(axis=(0, 1)) + + # only keep the next z_sms values, offset by zoff + tissue = tissue0[z_off: z_off + z_sms] + + # --- compute blending weights --- + s = tissue[z_s] / tissue[:z_s] # Top overlapping skirt + ms = tissue[z_s] / tissue[z_s: z_sms] # non-overlap + bottom skirt + + degree = 1 # both dBI and mus use degree=1 + # w1 = s * np.linspace(0, 1, z_s) ** degree + # w2 = ms[z_m:] * np.linspace(1, 0, z_s) ** degree + # w3 = ms[:z_m] + #TODO: omit the normalizing weight here for now to avoid computation + w1 = np.linspace(0, 1, z_s) ** degree + w2 = np.linspace(1, 0, z_s) ** degree + w3 = np.ones(z_m) + + row_pxblock, col_pxblock = Id0.shape[:2] + tot_z_pix = int(z_sm * n_slices) + Ma = dask.array.zeros((row_pxblock, + col_pxblock, + tot_z_pix), + dtype=np.float32) + for i in range(n_slices): + si = int(sliceidx[0, i]) # incoming slice index + print(f'\tstitching slice {i + 1}/{n_slices} (MAT idx {si:03d})') + Id = slices[i] + nx, ny, _ = Id.shape + + if s == 0: + # first slice: apply fresh data + # pattern = np.array([1, w3, w2]) # MATLAB’s [w1*0+1, w3, w2] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], # shape (1,1,3) + # (nx, ny, pattern.size)) # → (nx, ny, 3) + + W = np.concatenate([np.ones_like(w1),w3,w2]) + zr1 = np.arange(z_sms) # 0 .. z_sms-1 + zr2 = zr1 + z_off # zoff .. zoff+z_sms-1 + + elif s == n_slices-1: + # last slice: add onto bottom-most z_sm planes + # pattern = np.array([w1, w3]) # MATLAB’s [w1, w3] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], + # (nx, ny, pattern.size)) # → (nx, ny, 2) + W = np.concatenate([w1, w3, np.ones_like(w2)]) + zr1 = np.arange(z_sm) + (tot_z_pix - z_sm) # targets top of Ma’s z-axis + zr2 = np.arange(z_sm) + z_off # picks from Id + else: + # middle slices: accumulate + # pattern = np.array([w1, w3, w2]) # MATLAB’s [w1, w3, w2] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], + # (nx, ny, pattern.size)) # → (nx, ny, 3) + W = np.concatenate([w1, w3, w2]) + zr1 = np.arange(z_sms) + (s - 1) * z_sm # where to write in Ma + zr2 = np.arange(z_sms) + z_off # where to read in Id + # if i == 0: + # # first slice: only top skirt=1 + body + bottom skirt + # vec = np.concatenate([np.ones(z_s), w3, w2]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sms) + # z1 = np.arange(z_sms) + # z2 = z1 + int(z_off) + # elif i == n_slices - 1: + # # last slice: only top skirt + body + # vec = np.concatenate([w1, w3]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sm) + # z1 = np.arange(tot_z_pix - z_sm, tot_z_pix) + # z2 = int(z_off) + np.arange(z_sm) + # else: + # # middle slices: skirt/body/skirt + # vec = np.concatenate([w1, w3, w2]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sms) + # start_z = i * z_sm + # z1 = np.arange(start_z, start_z + z_sms) + # z2 = int(z_off) + np.arange(z_sms) + + Ma[:, :, zr1] += Id[:, :, zr2] * W + return Ma + if len(slices) > 1: + volume = stitch_slices(slices) + else: + volume = slices[0] + + + chunk, shard = compute_zarr_layout(volume.shape, volume.dtype, zarr_config) + wconfig = default_write_config(zarr_config.out,volume.shape,dtype = np.float32, chunk=chunk,shard=shard) + wconfig["create"] = True + wconfig["delete_existing"] = True + + tswriter = ts.open(wconfig).result() + # spec = { + # 'driver': 'zarr', + # 'kvstore': {'driver': 'file', 'path': zarr_config.out}, + # 'metadata': { + # 'dtype': np.float32, + # 'shape': volume.shape, + # 'chunks': chunk, + # } + # } + # if shard: + # spec['metadata']['shard'] = shard + # volume = volume.rechunk(shard) + # else: + # volume = volume.rechunk(chunk) + # store = ts.open(spec, create=True).result() + volume.store(tswriter) + # ts.copy(volume, store).result() + + # # Optional downsample + # if downsample: + # factors = tuple(int(x) for x in Mosaic3D['sxyz'][:2]) + (1,) + # down = do_downsample(volume, factors) + # ds_path = out_zarr.replace('.zarr', '_ds.zarr') + # ds_spec = {**spec, 'kvstore': {'driver':'file', 'path': ds_path}, + # 'metadata': {'shape': list(down.shape), 'chunks': list(down.chunksize)}} + # ds_store = ts.open(ds_spec, create=True).result() + # ts.copy(down, ds_store).result() + # print(f"Wrote {out_zarr} and {ds_path}") + # else: + # print(f"Wrote {out_zarr}") + def do_downsample(volume: da.Array, factors: tuple) -> da.Array: - """ - Downsample a Dask array by taking block-wise mean over given integer factors. - factors: (fx, fy, fz) - """ fx, fy, fz = factors return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) + + diff --git a/linc_convert/modalities/psoct/ms_dask.py b/linc_convert/modalities/psoct/ms_dask.py index ad096d85..1f879c74 100644 --- a/linc_convert/modalities/psoct/ms_dask.py +++ b/linc_convert/modalities/psoct/ms_dask.py @@ -10,22 +10,19 @@ import json import os from functools import wraps -from itertools import product from typing import Callable, Mapping, Optional from warnings import warn import logging import cyclopts -import dask.array import h5py import numpy as np from dask import delayed from scipy.io import loadmat from linc_convert import utils -from linc_convert.modalities.psoct._utils import make_json +from linc_convert.modalities.psoct.utils._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 648b3e17..e6cb4ee3 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -17,9 +17,9 @@ import numpy as np from linc_convert import utils -from linc_convert.modalities.psoct._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ +from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ _MatArrayWrapper -from linc_convert.modalities.psoct._utils import make_json +from linc_convert.modalities.psoct.utils._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 02f896c9..f5a91ee5 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -8,20 +8,17 @@ import json import logging import os -from contextlib import contextmanager from functools import wraps from typing import Callable, Optional -from warnings import warn import cyclopts import h5py import numpy as np from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header -from scipy.io import loadmat from linc_convert import utils -from linc_convert.modalities.psoct._array_wrapper import _ArrayWrapper, _MatArrayWrapper -from linc_convert.modalities.psoct._utils import make_json +from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper +from linc_convert.modalities.psoct.utils._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.ms_dask import _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator diff --git a/linc_convert/modalities/psoct/utils/__init__.py b/linc_convert/modalities/psoct/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/linc_convert/modalities/psoct/_array_wrapper.py b/linc_convert/modalities/psoct/utils/_array_wrapper.py similarity index 100% rename from linc_convert/modalities/psoct/_array_wrapper.py rename to linc_convert/modalities/psoct/utils/_array_wrapper.py diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/utils/_utils.py similarity index 55% rename from linc_convert/modalities/psoct/_utils.py rename to linc_convert/modalities/psoct/utils/_utils.py index 5544bf88..0d725a96 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/utils/_utils.py @@ -1,10 +1,12 @@ import itertools import re -from typing import Any, Literal +from typing import Any, Literal, Generator import nibabel as nib import numpy as np import zarr +from numpy._typing import ArrayLike +from scipy import io as sio from linc_convert.utils.math import ceildiv from linc_convert.utils.unit import convert_unit @@ -108,3 +110,88 @@ def _parse_value_unit( return meta + +def struct_arr_to_dict(arr: np.void) -> dict: + """ + Convert a NumPy structured array (single record) to a dictionary. + + Parameters: + arr (np.void): A structured array element. + + Returns: + dict: Dictionary mapping field names to their values. + """ + return {name: arr[name].item() for name in arr.dtype.names} + + +def find_experiment_params(exp_file: str) -> tuple[dict, bool]: + """ + Load experiment parameters from a .mat file, detecting if it's a Fiji experiment. + + Parameters: + exp_file (str): Path to the .mat file. + + Returns: + tuple: + - dict: Experiment parameters. + - bool: True if it's a Fiji experiment, False otherwise. + + Raises: + ValueError: If no experiment key is found in the file. + """ + is_fiji = False + exp_key = None + + for key in mat_vars(exp_file): + if 'Experiment_Fiji' in key: + exp_key = key + is_fiji = True + break + if 'Experiment' in key: + exp_key = key + + if not exp_key: + raise ValueError("No Experiment found in .mat file") + + exp_data = sio.loadmat(exp_file, squeeze_me=True)[exp_key] + return struct_arr_to_dict(exp_data), is_fiji + + +def mat_vars(mat_file: str) -> Generator[str, None, None]: + """ + Yield variable names from a .mat file, excluding internal variables. + + Parameters: + mat_file (str): Path to the .mat file. + + Yields: + str: Variable names not starting with '__'. + """ + yield from (name for name, *_ in sio.whosmat(mat_file) if not name.startswith('__')) + + +def atleast_2d_trailing(arr: ArrayLike) -> np.ndarray: + """ + Ensure the input is at least 2D by adding a new axis at the end if needed. + + If the input is 1D, it becomes shape (N, 1). + If the input is 0D (scalar), it becomes shape (1, 1). + If it's already 2D or more, it's returned unchanged. + + Parameters: + arr (ArrayLike): Input array-like object. + + Returns: + np.ndarray: A 2D or higher NumPy array with at least two dimensions. + """ + arr = np.asarray(arr) + if arr.ndim == 0: + return arr.reshape(1, 1) + elif arr.ndim == 1: + return arr[:, np.newaxis] + return arr + + +def load_mat(mat_path, varname): + data = sio.loadmat(mat_path, squeeze_me=True) + return data[varname] diff --git a/linc_convert/modalities/psoct/utils/_zarr.py b/linc_convert/modalities/psoct/utils/_zarr.py new file mode 100644 index 00000000..c4f4ef08 --- /dev/null +++ b/linc_convert/modalities/psoct/utils/_zarr.py @@ -0,0 +1,837 @@ +"""Zarr utilities.""" + +# stdlib +import itertools +import json +import math +import os +from typing import Literal +from urllib.parse import urlparse + +# externals +import nibabel as nib +import numcodecs +import numcodecs.abc +import numpy as np +import tensorstore as ts +from upath import UPath + +from linc_convert.utils.math import ceildiv + + +def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: + """Build compressor object from name and options.""" + # TODO: we should use `numcodecs.get_codec` instead` + if not isinstance(name, str): + return name + name = name.lower() + if name == "blosc": + Compressor = numcodecs.Blosc + elif name == "zlib": + Compressor = numcodecs.Zlib + else: + raise ValueError("Unknown compressor", name) + return Compressor(**prm) + + +def make_compressor_v2(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v2.""" + name = name.lower() + if name not in ("blosc", "zlib", "bz2", "zstd"): + raise ValueError("Unknown compressor", name) + return {"id": name, **prm} + + +def make_compressor_v3(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v3.""" + name = name.lower() + if name not in ("blosc", "gzip", "zstd"): + raise ValueError("Unknown compressor", name) + return {"name": name, "configuration": prm} + + +def make_kvstore(path: str | os.PathLike) -> dict: + """Transform a URI into a kvstore JSON object.""" + path = UPath(path) + if path.protocol in ("file", ""): + return {"driver": "file", "path": path.path} + if path.protocol == "gcs": + url = urlparse(str(path)) + return {"driver": "gcs", "bucket": url.netloc, "path": url.path} + if path.protocol in ("http", "https"): + url = urlparse(str(path)) + base_url = f"{url.scheme}://{url.netloc}" + if url.params: + base_url += ";" + url.params + if url.query: + base_url += "?" + url.query + if url.fragment: + base_url += "#" + url.fragment + return {"driver": "http", "base_url": base_url, "path": url.path} + if path.protocol == "memory": + return {"driver": "memory", "path": path.path} + if path.protocol == "s3": + url = urlparse(str(path)) + path = {"path": url.path} if url.path else {} + return {"driver": "s3", "bucket": url.netloc, **path} + raise ValueError("Unsupported protocol:", path.protocol) + + +def auto_shard_size( + max_shape: list[int], + itemsize: int | np.dtype | str, + max_file_size: int = 2 * 1024**4, + compression_ratio: float = 2, +) -> list[int]: + """ + Find maximal shard size that ensures file size below cap. + + Parameters + ---------- + max_shape : list[int] + Maximum shape along each dimension. + itemsize : np.dtype or int + Data type, or data type size + max_file_size : int + Maximum file size (default: 2TB). + S3 has a 5TB/file limit, but given that we use an estimated + compression factor, we aim for 2TB to leave some leeway. + compression_ratio : float + Estimated compression factor. + I roughly found 2 for bosc-compressed LSM data, when compressing + only across space and channels (5 channels). + + Returns + ------- + shard : list[int] + Estimated shard size along each dimension. + Returned shards are either max_shape or powers of two. + """ + if not isinstance(itemsize, int): + itemsize = np.dtype(itemsize).itemsize + + # Maximum number of elements in the shard + max_numel = max_file_size * compression_ratio / itemsize + + shard = [1] * len(max_shape) + while True: + # If shard larger than volume, we can stop + if all(x >= s for x, s in zip(shard, max_shape)): + break + # Make shard one level larger + new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] + # If shard is too large, stop and keep previous shard + if np.prod(new_shard) > max_numel: + break + # Otherwise, use larger shard and recurse + shard = new_shard + + # replace max size with larger power of two + shard = [2 ** math.ceil(math.log2(x)) for x in shard] + return shard + + +def niftizarr_write_header( + path: os.PathLike | str, + shape: list[int], + affine: np.ndarray, + dtype: np.dtype | str, + unit: Literal["micron", "mm"] | None = None, + header: nib.Nifti1Header | nib.Nifti2Header | None = None, + zarr_version: int = 3, +) -> None: + """ + Write NIfTI header in a NIfTI-Zarr file. + + Parameters + ---------- + path : PathLike | str + Path to parent Zarr. + affine : (4, 4) matrix + Orientation matrix. + shape : list[int] + Array shape, in NIfTI order (x, y, z, t, c). + dtype : np.dtype | str + Data type. + unit : {"micron", "mm"}, optional + World unit. + header : nib.Nifti1Header | nib.Nifti2Header, optional + Pre-instantiated header. + zarr_version : int, default=3 + Zarr version. + """ + # TODO: we do not write the json zattrs, but it should be added in + # once the nifti-zarr package is released + + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # If dimensions do not fit in a short (which is often the case), we + # use NIfTI 2. + if all(x < 32768 for x in shape): + NiftiHeader = nib.Nifti1Header + else: + NiftiHeader = nib.Nifti2Header + + header = header or NiftiHeader() + header.set_data_shape(shape) + header.set_data_dtype(dtype) + header.set_qform(affine) + header.set_sform(affine) + if unit: + header.set_xyzt_units(nib.nifti1.unit_codes.code[unit]) + header = np.frombuffer(header.structarr.tobytes(), dtype="u1") + + if zarr_version == 3: + metadata = { + "chunk_grid": { + "name": "regular", + "configuration": {"chunk_shape": [len(header)]}, + }, + "codecs": [ + {"name": "bytes"}, + make_compressor_v3("gzip"), + ], + "data_type": "uint8", + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + tsconfig = { + "driver": "zarr3", + "metadata": metadata, + } + else: + metadata = { + "chunks": [len(header)], + "order": "F", + "dtype": "|u1", + "fill_value": None, + "compressor": make_compressor_v2("zlib"), + } + tsconfig = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + tsconfig["kvstore"] = make_kvstore(path / "nifti") + tsconfig["metadata"]["shape"] = [len(header)] + tsconfig["create"] = True + tsconfig["delete_existing"] = True + tswriter = ts.open(tsconfig).result() + with ts.Transaction() as txn: + tswriter.with_transaction(txn)[:] = header + print("done.") + + +def fix_shard_chunk( + shard: list[int], + chunk: list[int], + shape: list[int], +) -> tuple[list[int], list[int]]: + """ + Fix incompatibilities between chunk and shard size. + + Parameters + ---------- + shard : list[int] + chunk : list[int] + shape : list[int] + + Returns + ------- + shard : list[int] + chunk : list[int] + """ + for i in range(len(chunk)): + # if chunk spans the entire volume, match chunk and shard + if chunk[i] == shape[i] and chunk[i] != shard[i]: + chunk[i] = shard[i] + # ensure that shard is a multiple of chunk + if shard[i] % chunk[i]: + shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) + return shard, chunk + + +def default_write_config( + path: os.PathLike | str, + shape: list[int], + dtype: np.dtype | str, + chunk: list[int] = [32], + shard: list[int] | Literal["auto"] | None = None, + compressor: str = "blosc", + compressor_opt: dict | None = None, + version: int = 3, +) -> dict: + """ + Generate a default TensorStore configuration. + + Parameters + ---------- + chunk : list[int] + Chunk size. + shard : list[int], optional + Shard size. No sharding if `None`. + compressor : str + Compressor name + version : int + Zarr version + + Returns + ------- + config : dict + Configuration + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # Format compressor + if version == 3 and compressor == "zlib": + compressor = "gzip" + if version == 2 and compressor == "gzip": + compressor = "zlib" + compressor_opt = compressor_opt or {} + + # Prepare chunk size + if isinstance(chunk, int): + chunk = [chunk] + chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk + + # Prepare shard size + if shard: + if shard == "auto": + shard = auto_shard_size(shape, dtype) + if isinstance(shard, int): + shard = [shard] + shard = shard[:1] * max(0, len(shape) - len(shard)) + shard + + # Fix incompatibilities + shard, chunk = fix_shard_chunk(shard, chunk, shape) + + # ------------------------------------------------------------------ + # Zarr 3 + # ------------------------------------------------------------------ + if version == 3: + if compressor and compressor != "raw": + compressor = [make_compressor_v3(compressor, **compressor_opt)] + else: + compressor = [] + + codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} + + if shard: + chunk_grid = { + "name": "regular", + "configuration": {"chunk_shape": shard}, + } + + sharding_codec = { + "name": "sharding_indexed", + "configuration": { + "chunk_shape": chunk, + "codecs": [ + codec_little_endian, + *compressor, + ], + "index_codecs": [ + codec_little_endian, + {"name": "crc32c"}, + ], + "index_location": "end", + }, + } + codecs = [sharding_codec] + + else: + chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} + codecs = [ + codec_little_endian, + *compressor, + ] + + metadata = { + "chunk_grid": chunk_grid, + "codecs": codecs, + "data_type": np.dtype(dtype).name, + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + config = { + "driver": "zarr3", + "metadata": metadata, + } + + # ------------------------------------------------------------------ + # Zarr 2 + # ------------------------------------------------------------------ + else: + if compressor and compressor != "raw": + compressor = make_compressor_v2(compressor, **compressor_opt) + else: + compressor = None + + metadata = { + "chunks": chunk, + "order": "F", + "dtype": np.dtype(dtype).str, + "fill_value": 0, + "compressor": compressor, + } + config = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + + # Prepare store + config["metadata"]["shape"] = shape + config["kvstore"] = make_kvstore(path) + + return config + + +def default_read_config(path: os.PathLike | str) -> dict: + """ + Generate a TensorStore configuration to read an existing Zarr. + + Parameters + ---------- + path : PathLike | str + Path to zarr array. + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + if (path / "zarr.json").exists(): + zarr_version = 3 + elif (path / ".zarray").exists(): + zarr_version = 2 + else: + raise ValueError("Cannot find zarr.json or .zarray file") + return { + "kvstore": make_kvstore(path), + "driver": "zarr3" if zarr_version == 3 else "zarr", + "open": True, + "create": False, + "delete_existing": False, + } + + +def generate_pyramid( + path: os.PathLike | str, + levels: int | None = None, + shard: list[int] | bool | Literal["auto"] | None = None, + ndim: int = 3, + max_load: int = 512, + mode: Literal["mean", "median"] = "median", +) -> list[list[int]]: + """ + Generate the levels of a pyramid in an existing Zarr. + + Parameters + ---------- + path : PathLike | str + Path to parent Zarr + levels : int + Number of additional levels to generate. + By default, stop when all dimensions are smaller than their + corresponding chunk size. + shard : list[int] | bool | {"auto"} | None + Shard size. + * If `None`, use same shard size as the input array; + * If `False`, no dot use sharding; + * If `True` or `"auto"`, automatically find shard size; + * Otherwise, use provided shard size. + ndim : int + Number of spatial dimensions. + max_load : int + Maximum number of voxels to load along each dimension. + mode : {"mean", "median"} + Whether to use a mean or median moving window. + + Returns + ------- + shapes : list[list[int]] + Shapes of all levels, from finest to coarsest, including the + existing top level. + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + + zarray2 = path / "0" / ".zarray" + zarray3 = path / "0" / "zarr.json" + + if zarray2.exists(): + with zarray2.open("rb") as f: + metadata = json.load(f) + zarr_version = 2 + elif zarray3.exists(): + with zarray3.open("rb") as f: + metadata = json.load(f) + zarr_version = 3 + else: + raise FileNotFoundError("Could not find initial zarr array") + + shape = list(metadata["shape"]) + + if shard and zarr_version == 2: + raise ValueError("Sharding requires zarr 3") + + # Find chunk size + if zarr_version == 3: + chunk_size = metadata["chunk_grid"]["configuration"]["chunk_shape"] + chunk_size = list(chunk_size) + for codec in metadata["codecs"]: + if codec["name"] == "sharding_indexed": + chunk_size = list(codec["configuration"]["chunk_shape"]) + break + else: + assert zarr_version == 2 + chunk_size = metadata["chunks"] + + shard_option = shard + + def update_metadata(metadata: dict, shape: list[int]) -> dict: + metadata["shape"] = shape + if shard_option is None: + return metadata + + # find chunk size and compression codecs + chunk = metadata["chunk_grid"]["configuration"]["chunk_shape"] + chunk = list(chunk) + codecs = metadata["codecs"] + for codec in metadata["codecs"]: + if codec["name"] == "sharding_indexed": + chunk = list(codec["configuration"]["chunk_shape"]) + codecs = codec["configuration"]["codecs"] + break + + # set appropriate chunking/sharding config + if shard_option == "auto": + shard = auto_shard_size(shape, metadata["data_type"]) + shard, chunk = fix_shard_chunk(shard, chunk, shape) + else: + shard = shard_option + + if shard_option is False: + metadata["chunk_grid"]["configuration"]["chunk_shape"] = chunk + metadata["codecs"] = codecs + + else: + metadata["chunk_grid"] = { + "name": "regular", + "configuration": {"chunk_shape": shard}, + } + metadata["codecs"] = [ + { + "name": "sharding_indexed", + "configuration": { + "chunk_shape": chunk, + "codecs": codecs, + "index_codecs": [ + codecs[0], # should be the bytes codec + {"name": "crc32c"}, + ], + "index_location": "end", + }, + } + ] + + return metadata + + # Select windowing function + if mode == "median": + func = np.median + else: + assert mode == "mean" + func = np.mean + + level = 0 + batch, shape = shape[:-ndim], shape[-ndim:] + allshapes = [shape] + while True: + level += 1 + + # Compute downsampled shape + prev_shape, shape = shape, [max(1, x // 2) for x in shape] + + # Stop if seen enough levels or level shape smaller than chunk size + if levels is None: + if all(x <= c for x, c in zip(shape, chunk_size[-ndim:])): + break + elif level > levels: + break + + print("Compute level", level, "with shape", shape) + + allshapes.append(shape) + + # Open input and output zarr + rconfig = default_read_config(str(path / str(level - 1))) + wconfig = { + "driver": "zarr3" if zarr_version == 3 else "zarr", + "metadata": update_metadata(metadata, batch + shape), + "kvstore": make_kvstore(path / str(level)), + "create": True, + "delete_existing": True, + } + tsreader = ts.open(rconfig).result() + tswriter = ts.open(wconfig).result() + + # Iterate across `max_load` chunks + # (note that these are unrelared to underlying zarr chunks) + grid_shape = [ceildiv(n, max_load) for n in prev_shape] + for chunk_index in itertools.product(*[range(x) for x in grid_shape]): + print(f"chunk {chunk_index} / {tuple(grid_shape)})", end="\r") + + with ts.Transaction() as txn: + # Read one chunk of data at the previous resolution + slicer = [Ellipsis] + [ + slice(i * max_load, min((i + 1) * max_load, n)) + for i, n in zip(chunk_index, prev_shape) + ] + dat = tsreader.with_transaction(txn)[tuple(slicer)].read().result() + + # Discard the last voxel along odd dimensions + crop = [0 if x == 1 else x % 2 for x in dat.shape[-3:]] + slcr = [slice(-1) if x else slice(None) for x in crop] + dat = dat[tuple([Ellipsis, *slcr])] + + patch_shape = dat.shape[-3:] + + # Reshape into patches of shape 2x2x2 + windowed_shape = [ + x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) + ] + dat = dat.reshape(batch + windowed_shape) + # -> last `ndim`` dimensions have shape 2x2x2 + dat = dat.transpose( + list(range(len(batch))) + + list(range(len(batch), len(batch) + 2 * ndim, 2)) + + list(range(len(batch) + 1, len(batch) + 2 * ndim, 2)) + ) + # -> flatten patches + smaller_shape = [max(n // 2, 1) for n in patch_shape] + dat = dat.reshape(batch + smaller_shape + [-1]) + + # Compute the median of each patch + dtype = dat.dtype + dat = func(dat, axis=-1) + dat = dat.astype(dtype) + + # Write output + slicer = [Ellipsis] + [ + slice(i * max_load // 2, min((i + 1) * max_load // 2, n)) + for i, n in zip(chunk_index, shape) + ] + tswriter.with_transaction(txn)[tuple(slicer)] = dat + + print("") + + return allshapes + + +def write_ome_metadata( + path: str | os.PathLike, + axes: list[str], + space_scale: float | list[float] = 1, + time_scale: float = 1, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: str | int | list[str | int] = 2, + levels: int | None = None, + zarr_version: int | None = None, +) -> None: + """ + Write OME metadata into Zarr. + + Parameters + ---------- + path : str | PathLike + Path to parent Zarr. + axes : list[str] + Name of each dimension, in Zarr order (t, c, z, y, x) + space_scale : float | list[float] + Finest-level voxel size, in Zarr order (z, y, x) + time_scale : float + Time scale + space_unit : str + Unit of spatial scale (assumed identical across dimensions) + space_time : str + Unit of time scale + name : str + Name attribute + pyramid_aligns : float | list[float] | {"center", "edge"} + Whether the pyramid construction aligns the edges or the centers + of the corner voxels. If a (list of) number, assume that a moving + window of that size was used. + levels : int + Number of existing levels. Default: find out automatically. + zarr_version : {2, 3} | None + Zarr version. If `None`, guess from existing zarr array. + + """ + path = UPath(path) + + # Detect zarr version + if not zarr_version: + if (path / "0" / "zarr.json").exists(): + zarr_version = 3 + elif (path / "0" / ".zarray").exists(): + zarr_version = 2 + else: + raise FileNotFoundError("No existing array to guess version from") + + # Read shape at each pyramid level + zname = "zarr.json" if zarr_version == 3 else ".zarray" + shapes = [] + level = 0 + while True: + if levels is not None and level > levels: + break + + zpath = path / str(level) / zname + if not zpath.exists(): + levels = level + break + + level += 1 + with zpath.open("rb") as f: + zarray = json.load(f) + shapes += [zarray["shape"]] + + axis_to_type = { + "x": "space", + "y": "space", + "z": "space", + "t": "time", + "c": "channel", + } + + # Number of spatial (s), batch (b) and total (n) dimensions + ndim = len(axes) + sdim = sum(axis_to_type[axis] == "space" for axis in axes) + bdim = ndim - sdim + + if isinstance(pyramid_aligns, (int, str)): + pyramid_aligns = [pyramid_aligns] + pyramid_aligns = list(pyramid_aligns) + if len(pyramid_aligns) < sdim: + repeat = pyramid_aligns[:1] * (sdim - len(pyramid_aligns)) + pyramid_aligns = repeat + pyramid_aligns + pyramid_aligns = pyramid_aligns[-sdim:] + + if isinstance(space_scale, (int, float)): + space_scale = [space_scale] + space_scale = list(space_scale) + if len(space_scale) < sdim: + repeat = space_scale[:1] * (sdim - len(space_scale)) + space_scale = repeat + space_scale + space_scale = space_scale[-sdim:] + + multiscales = [ + { + "version": "0.4", + "axes": [ + { + "name": axis, + "type": axis_to_type[axis], + } + if axis_to_type[axis] == "channel" + else { + "name": axis, + "type": axis_to_type[axis], + "unit": ( + space_unit + if axis_to_type[axis] == "space" + else time_unit + if axis_to_type[axis] == "time" + else None + ), + } + for axis in axes + ], + "datasets": [], + "type": "median window " + "x".join(["2"] * sdim), + "name": name, + } + ] + + shape = shape0 = shapes[0] + for n in range(len(shapes)): + shape = shapes[n] + multiscales[0]["datasets"].append({}) + level = multiscales[0]["datasets"][-1] + level["path"] = str(n) + + scale = [1] * bdim + [ + ( + pyramid_aligns[i] ** n + if not isinstance(pyramid_aligns[i], str) + else (shape0[bdim + i] / shape[bdim + i]) + if pyramid_aligns[i][0].lower() == "e" + else ((shape0[bdim + i] - 1) / (shape[bdim + i] - 1)) + ) + * space_scale[i] + for i in range(sdim) + ] + translation = [0] * bdim + [ + ( + pyramid_aligns[i] ** n - 1 + if not isinstance(pyramid_aligns[i], str) + else (shape0[bdim + i] / shape[bdim + i]) - 1 + if pyramid_aligns[i][0].lower() == "e" + else 0 + ) + * 0.5 + * space_scale[i] + for i in range(sdim) + ] + + level["coordinateTransformations"] = [ + { + "type": "scale", + "scale": scale, + }, + { + "type": "translation", + "translation": translation, + }, + ] + + scale = [1] * ndim + if "t" in axes: + scale[axes.index("t")] = time_scale + multiscales[0]["coordinateTransformations"] = [{"scale": scale, "type": "scale"}] + + if zarr_version == 3: + with (path / "zarr.json").open("wt") as f: + json.dump( + { + "zarr_format": 3, + "node_type": "group", + "attributes": { + # Zarr v2 way of doing it -- neuroglancer wants this + "multiscales": multiscales, + # Zarr RFC-2 recommended way + "ome": {"version": "0.4", "multiscales": multiscales}, + }, + }, + f, + indent=4, + ) + else: + multiscales[0]["version"] = "0.4" + with (path / ".zgroup").open("wt") as f: + json.dump({"zarr_format": 2}, f, indent=4) + with (path / ".zattrs").open("wt") as f: + json.dump({"multiscales": multiscales}, f, indent=4) From 61d00b977f2ea324c82d83742399e7e7e2f701b6 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 22 Apr 2025 16:55:00 -0400 Subject: [PATCH 020/157] wip: oct data conversion --- linc_convert/modalities/psoct/__init__.py | 4 +- linc_convert/modalities/psoct/mosaic2d.py | 467 ++++++++++++++++------ linc_convert/modalities/psoct/mosaic3d.py | 61 ++- 3 files changed, 376 insertions(+), 156 deletions(-) diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index 6764a509..7e57f346 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask", "mosaic3d"] - from . import cli, multi_slice, single_volume, ms_dask, exp_dask, mosaic3d + __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask", "mosaic3d","mosaic2d"] + from . import cli, multi_slice, single_volume, ms_dask, exp_dask, mosaic3d, mosaic2d except ImportError: pass diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index a0f0ae06..ba165dcd 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -1,19 +1,36 @@ -import os +import os.path as op +import logging +from colorsys import hsv_to_rgb + +import cyclopts +import imageio import numpy as np import scipy.io as sio import nibabel as nib -import imageio -import warnings - +import dask import dask.array as da +import tensorstore as ts +from scipy.io import loadmat +from skimage.exposure import exposure +from linc_convert.modalities.psoct.cli import psoct +from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ + atleast_2d_trailing, find_experiment_params, load_mat +from linc_convert.modalities.psoct.utils._zarr import default_write_config from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr.create_array import compute_zarr_layout + +logger = logging.getLogger(__name__) +mosaic2d = cyclopts.App(name="mosaic2d", help_format="markdown") +psoct.command(mosaic2d) +@mosaic2d.default def mosaic2d_telesto( - inp:str, - *, + # inp:str, parameter_file: str, + *, + modality: str, method: str = None, zarr_config: ZarrConfig = None, @@ -29,143 +46,353 @@ def mosaic2d_telesto( """ # Load .mat containing Parameters, Scan, and Mosaic2D params = sio.loadmat(parameter_file, squeeze_me=True) - Parameters = params['Parameters'] - Scan = params['Scan'] - Mosaic2D = params['Mosaic2D'] + Parameters = struct_arr_to_dict(params['Parameters']) + Scan = struct_arr_to_dict(params['Scan']) + Mosaic2D = struct_arr_to_dict(params['Mosaic2D']) use_method = method is not None - print(f"--Modality is {modality}--") + logger.info(f"--Modality is {modality}--") - sliceidx = Mosaic2D['sliceidx'] # 3xN array + sliceidx = atleast_2d_trailing(Mosaic2D['sliceidx']) - exp_file = Mosaic2D['Exp'] - mat_contents = sio.whosmat(exp_file) - names = [m[0] for m in mat_contents] - key = next((n for n in names if 'Experiment_Fiji' in n), - next((n for n in names if 'Experiment' in n), None)) - if key is None: - raise ValueError("No Experiment found in .mat") - Experiment = sio.loadmat(exp_file, squeeze_me=True)[key] + Exp, is_fiji = find_experiment_params(Mosaic2D['Exp']) if use_method: - Experiment['X_Mean'] = Experiment[method]['X_Mean'] - Experiment['Y_Mean'] = Experiment[method]['Y_Mean'] + Exp['X_Mean'] = Exp[method]['X_Mean'] + Exp['Y_Mean'] = Exp[method]['Y_Mean'] + + indir = np.atleast_1d(Mosaic2D['indir']) - indir = list(Mosaic2D['indir'].flat) file_format = Mosaic2D['file_format'] - filetype = Mosaic2D['InFileType'] + filetype = Mosaic2D['InFileType'].lower() transpose_flag = bool(Parameters['transpose']) - system = Scan['System'] - if system == 'Octopus': - XPixClip = int(Parameters['YPixClip']) - YPixClip = int(Parameters['XPixClip']) + if Scan['System'] == 'Octopus': + xp, yp = Parameters['YPixClip'], Parameters['XPixClip'] else: - XPixClip = int(Parameters['XPixClip']) - YPixClip = int(Parameters['YPixClip']) - - X = da.from_array(Experiment['X_Mean'], chunks='auto').astype(float) - Y = da.from_array(Experiment['Y_Mean'], chunks='auto').astype(float) - X = X - X.min() + 1 - Y = Y - Y.min() + 1 - NbPix = int(Experiment['NbPix']) - sizerow = NbPix - XPixClip - sizecol = NbPix - YPixClip - MXL = int(da.nanmax(X).compute() + sizerow - 1) - MYL = int(da.nanmax(Y).compute() + sizecol - 1) - MZL = 4 if modality.lower() == 'orientation' else 1 - - dx = da.nanmedian(X.diff(axis=0)).compute() - dy = da.nanmedian(Y.diff(axis=1)).compute() - ramp_x = sizerow - int(round(dx)) - ramp_y = sizecol - int(round(dy)) - x = da.ones((sizerow,), chunks=sizerow) - y = da.ones((sizecol,), chunks=sizecol) - xv = da.linspace(0, 1, ramp_x) - yv = da.linspace(0, 1, ramp_y) - x = da.concatenate([xv, da.ones((sizerow - ramp_x,), chunks=sizerow - ramp_x)]) - y = da.concatenate([yv, da.ones((sizecol - ramp_y,), chunks=sizecol - ramp_y)]) - RampOrig = x[:, None] * y[None, :] - - MapIndex = Experiment['MapIndex_Tot_offset'] + Experiment['First_Tile'] - 1 + xp, yp = Parameters['XPixClip'], Parameters['YPixClip'] + xp, yp = int(xp), int(yp) + + # Mosaic geometry + nb_pix = int(Exp['NbPix']) + size_row, size_column = nb_pix - xp, nb_pix - yp + # need to copy here + X, Y = Exp['X_Mean'], Exp['Y_Mean'] + X -= np.nanmin(X) + Y -= np.nanmin(Y) + MXL = int(np.nanmax(X) + size_row) + MYL = int(np.nanmax(Y) + size_column) + MZL = 4 if modality =='Orientation' else 1 + + # Precompute blending ramps + dx = np.nanmedian(np.diff(X, axis=0)) + dy = np.nanmedian(np.diff(Y, axis=1)) + rx, ry = size_row - round(dx), size_column - round(dy) + xv = np.linspace(0, 1, int(rx)) + yv = np.linspace(0, 1, int(ry)) + x = np.ones(size_row) + x[:rx], x[-rx:] = xv, xv[::-1] + y = np.ones(size_column) + y[:ry], y[-ry:] = yv, yv[::-1] + RampOrig = da.from_array(np.outer(x, y)[:, :], chunks=(size_row, size_column)) + + GrayRange = None + savetiff = True + noscale = False + key_map = { + 'aip': 'AipGrayRange', + 'mip': 'MipGrayRange', + 'retardance': 'RetGrayRange', + 'mus': 'musGrayRange', + 'surf': 'surfGrayRange' + } + lower_mod = modality.lower() + if lower_mod in key_map: + GrayRange = Parameters.get(key_map[lower_mod]) + if GrayRange is None: + noscale = True + else: + dyn_key = f"{modality}GrayRange" + GrayRange = Parameters.get(dyn_key) + if GrayRange is None: + noscale = True + if noscale: + savetiff = False + logger.warning( + f"{modality} grayscale range not found. Only MAT file will be saved.") + + # ----- Modality string when inconsistency in file names ----- + modality_base = params['Enface']['inputstr'].item() # assumed list of strings + # find entry containing first 3 letters of modality + modality_str = next((s for s in modality_base if lower_mod[:3] in s.lower()), + None) + if modality_str is None: + modality_str = modality[:3] + logger.warning(f"{modality} not in Enface.inputstr. Mosaic2D might fail.") + + # using float32 sample + sample_dtype = np.float32 + + MapIndex = Exp['MapIndex_Tot_offset'] + Exp['First_Tile'] - 1 num_slices = sliceidx.shape[1] mosaics = {} - for s in range(num_slices): + def build_slice(s: int) -> da.Array: sl_in, sl_out, sl_run = sliceidx[:, s] indir_curr = indir[int(sl_run) - 1] - base = os.path.join(indir_curr, file_format) + base = op.join(indir_curr, file_format) M = da.zeros((MXL, MYL, MZL), dtype=np.float32, chunks='auto') Ma = da.zeros((MXL, MYL), dtype=np.float32, chunks='auto') - rows, cols = MapIndex.shape - for ii in range(cols): - for jj in range(rows): - idx = MapIndex[jj, ii] - if idx > 0 and not np.isnan(Experiment['X_Mean'][jj, ii]): - r0 = int(Experiment['X_Mean'][jj, ii]) - c0 = int(Experiment['Y_Mean'][jj, ii]) - rowslice = slice(r0, r0 + sizerow) - colslice = slice(c0, c0 + sizecol) - currtile = int((sl_in - 1) * Experiment['TilesPerSlice'] + idx) - - # lazy load with dask - if filetype.lower() == 'nifti': - img = nib.load(get_volname(base, currtile, modality[:3])) - proxy = img.dataobj - I = da.from_array(proxy, chunks='auto') - elif filetype.lower() == 'mat': - matname = get_volname(base, currtile, modality[:3]) - matcontent = sio.loadmat(matname, squeeze_me=True) - varname = next(k for k in matcontent if not k.startswith('__')) - arr = matcontent[varname] - I = da.from_array(arr, chunks='auto') - else: - warnings.warn(f"Unknown filetype: {filetype}") - continue - - if system.lower() == 'octopus': - I = I.T - if transpose_flag: - I = I.T - - I = I[XPixClip:, YPixClip:] - - if modality.lower() == 'orientation': - ang = da.deg2rad(I) - SLO_OC = da.stack([da.cos(ang) ** 2, - da.cos(ang) * da.sin(ang), - da.cos(ang) * da.sin(ang), - da.sin(ang) ** 2], axis=-1) - M[rowslice, colslice, :] += SLO_OC * RampOrig[..., None] - Ma[rowslice, colslice] += RampOrig - else: - M[rowslice, colslice, 0] += I * RampOrig - Ma[rowslice, colslice] += RampOrig - - if modality.lower() == 'orientation': - T = M / Ma[..., None] - H = T.reshape((-1, 2, 2)) - vals, vecs = da.linalg.eig(H) - idx_max = da.argmax(vals, axis=1) - v = vecs[da.arange(H.shape[0]), :, idx_max] - angles = da.rad2deg(da.arctan2(v[:, 1], v[:, 0])).reshape((MXL, MYL)) - O = da.rot90(angles, -1) - mosaics[int(sl_out)] = O + + for (jj, ii), idx in np.ndenumerate(MapIndex): + if idx <= 0 or np.isnan(X[jj, ii]): + continue + r0 = int(X[jj, ii]) + c0 = int(Y[jj, ii]) + row_slice = slice(r0, r0 + size_row) + col_slice = slice(c0, c0 + size_column) + tile_id = (sl_in - 1) * int(Exp['TilesPerSlice']) + idx + if filetype == 'nifti': + if modality == "mus": + path = get_volname(base, tile_id, "cropped") + else: + path = get_volname(base, tile_id, modality_str) + header = nib.load(path) + shape = header.shape + dtype = header.get_data_dtype() + delayed_arr = dask.delayed(header.get_fdata)() + + elif filetype == 'mat': + mat_path = get_volname(base, tile_id, modality_str) + name, shape, dtype = None, None, None + for name, shape, dtype in sio.whosmat(mat_path): + if not name.startswith("__"): + break + if not name: + raise ValueError("Variable not found") + delayed_arr = dask.delayed(load_mat)(mat_path, name) + arr = da.from_delayed(delayed_arr, + shape=shape, + dtype=dtype) + if Scan['System'].lower() == 'octopus': + arr = np.swapaxes(arr, 0,1) + if transpose_flag: + arr = np.swapaxes(arr, 0,1) + arr = arr[xp:,yp:] + if modality == "mus" and filetype == 'nifti': + # shape (H, W, N) + I = 10.0 ** (arr / 10.0) + + # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] + # via a reverse cumulative-sum trick: + # reverse along the 3rd axis → shape (H,W,N) + I_rev = I[:, :, ::-1] + # cumulative sum in reversed order → (H,W,N) + cumsum_rev = np.cumsum(I_rev, + axis=2) + # drop the very first (no “next” beyond the last) → (H,W,N-1) + sum_excl_rev = cumsum_rev[:, :, :-1] + # flip back to original order → (H,W,N-1) + sum_excl = sum_excl_rev[:, :, ::-1] + + # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) + sum_excl = sum_excl[:, :, + :MZL] # keep only the first MZL sums → (H,W,MZL) + + # divide elementwise and apply the constant factors + I = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) + arr = np.squeeze(np.mean(I, axis=2)) + + + # blend + if lower_mod == 'orientation': + rad = np.deg2rad(arr) + c, s = np.cos(rad), np.sin(rad) + SLO_OC = np.stack([c * c, c * s, c * s, c * c], axis=-1) + # add weighted outer products + M[row_slice, col_slice] += SLO_OC * RampOrig[...,None] + Ma[row_slice, col_slice] += RampOrig + else: + if arr.ndim ==2: + M[row_slice, col_slice] += (arr* RampOrig)[..., None] + else: + M[row_slice, col_slice] += arr * RampOrig + Ma[row_slice, col_slice] += RampOrig + + modalstr_map = { + 'mip': 'MIP', + 'aip': 'AIP', + 'retardance': 'Retardance', + 'orientation': 'Orientation', + 'mus': 'mus' + } + modalstr = modalstr_map.get(lower_mod, modality) + avg = M / Ma[:, :, None] + + if lower_mod == 'orientation': + print("Starting orientation angles eigen decomp...") + h, w = M.shape[:2] + a_x = avg.reshape((h * w, 2, 2)) + eigvals, eigvecs = np.linalg.eigh(a_x) + x = eigvecs[:, 0, 1] + y = eigvecs[:, 1, 1] + O = np.arctan2(y, x) / np.pi * 180 + O = O.reshape((h, w)) + # comp0, comp1, comp2, comp3 = avg[:, :, 0], avg[:, :, 1], avg[:, :, 2], avg[ + # :, :, + # 3] + # O = np.zeros((MXL, MYL)) + # for i in range(MXL): + # for j in range(MYL): + # mat2 = np.array( + # [[comp0[i, j], comp1[i, j]], [comp2[i, j], comp3[i, j]]]) + # w, v = np.linalg.eigh(mat2) + # principal = v[:, np.argmax(w)] + # O[i, j] = np.degrees(np.arctan2(principal[1], principal[0])) + O[O < -90] += 180 + O[O > 90] -= 180 + MosaicFinal = np.rot90(O, k=-1) + ref = loadmat(op.join( + "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", + f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] + np.testing.assert_array_almost_equal(ref, MosaicFinal) + + return MosaicFinal + # + # # save orientation mosaic + + # + # # masking orientation + # RetSliceTiff = os.path.join(outdir, + # f"Retardance_slice{sliceid_out:03d}.tiff") + # AipSliceTiff = os.path.join(outdir, f"AIP_slice{sliceid_out:03d}.tiff") + # data1 = imageio.imread(RetSliceTiff) + # data2 = imageio.imread(AipSliceTiff) + # data4 = wiener(data2, (5, 5)) + # + # O_norm = (O + 90) / 180 + # + # # Orientation1 + # I1 = exposure.rescale_intensity(data1.astype(np.float64), + # in_range='image') / (1 - 0.4) + # I1 = np.clip(I1, 0, 1) + # I1[data4 <= 20] = 0 + # map3D = np.ones((*O_norm.shape, 3)) + # map3D[..., 0] = O_norm + # map3D[..., 2] = I1 + # maprgb = hsv2rgb(map3D) + # imageio.imwrite( + # os.path.join(outdir, f"{modalstr}1_slice{sliceid_out:03d}.tiff"), + # (maprgb * 255).astype(np.uint8)) + # + # # Orientation2 + # I2 = (-exposure.rescale_intensity(data2.astype(np.float64), + # in_range='image') + 1 - 0.2) / ( + # (1 - 0.2) * 0.5) + # I2 = np.clip(I2, 0, 1) + # I2[data4 <= 20] = 0 + # map3D2 = np.ones((*O_norm.shape, 3)) + # map3D2[..., 0] = O_norm + # map3D2[..., 2] = I2 + # maprgb2 = hsv2rgb(map3D2) + # imageio.imwrite( + # os.path.join(outdir, f"{modalstr}2_slice{sliceid_out:03d}.tiff"), + # (maprgb2 * 255).astype(np.uint8)) + # + # # Orientation3 + # map3D3 = np.ones((*O_norm.shape, 3)) + # map3D3[..., 0] = O_norm + # maprgb3 = hsv2rgb(map3D3) + # imageio.imwrite( + # os.path.join(outdir, f"{modalstr}3_slice{sliceid_out:03d}.tiff"), + # (maprgb3 * 255).astype(np.uint8)) + else: - Z = M[..., 0] / Ma - Z = da.rot90(Z, -1) - Z = da.where(da.isnan(Z), 0, Z) - mosaics[int(sl_out)] = Z + avg = np.squeeze(avg) + MosaicFinal = np.rot90(avg, k=-1) + MosaicFinal = np.nan_to_num(MosaicFinal) + + # if savetiff: + # print("Saving .tiff mosaic...") + nonlocal GrayRange + if isinstance(GrayRange,np.ndarray): + GrayRange =tuple(GrayRange[:]) + normed = exposure.rescale_intensity(MosaicFinal, + in_range=GrayRange if GrayRange is not None else 'image') + imageio.imwrite( + op.join("/local_mount/space/megaera/1/users/kchai/psoct", f"{modalstr}_slice{1:03d}.tiff"), + (normed * 255).astype(np.uint8)) + # print("Saving .mat mosaic...") + # savemat(os.path.join(outdir, f"{modalstr}_slice{sliceid_out:03d}.mat"), + # {'MosaicFinal': MosaicFinal}) + ref = loadmat(op.join( + "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", + f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] + diff = np.abs(ref-MosaicFinal).compute() + i,j = np.where(diff==np.max(diff)) + i,j = ref.shape[-1]-j-1, i + print(i,j) + np.testing.assert_array_almost_equal(ref, MosaicFinal,decimal=4) + return MosaicFinal + + slices = [build_slice(s) for s in range(num_slices)] + arr = da.stack(slices,axis=-1) + chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) + wconfig = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, + chunk=chunk, shard=shard) + wconfig["create"] = True + wconfig["delete_existing"] = True + + tswriter = ts.open(wconfig).result() + arr.store(tswriter) - return mosaics + return None -def get_volname(base: str, num: int, modality: str) -> str: +def get_rgb_4d(ori, value_range): """ - Replace placeholders in the base filename. + Convert an orientation volume (in degrees) into an RGB 4D volume via HSV mapping. + value_range: [min_angle, max_angle] (e.g. [-90, 90]) + """ + r1, r2 = value_range + ori = ori.astype(np.float64) + + # wrap values as in MATLAB version + ori = np.where(ori > r2, ori - 180, ori) + ori = np.where(ori < r1, ori + 180, ori) + + # normalize to [0,1] for hue + hue = (ori - r1) / (r2 - r1) + + nx, ny, nz = ori.shape + hsv = np.ones((nx, ny, nz, 3), dtype=np.float64) + hsv[..., 0] = hue # H + hsv[..., 1] = 1.0 # S + hsv[..., 2] = 1.0 # V + + rgb = hsv_to_rgb(hsv) + rgb = (rgb * 255).astype(np.uint8) + return rgb + +def get_volname(base_file_name: str, num: int, modality: str) -> str: + """ + Generate a volume name by replacing placeholders in the base file name. + + This function provides flexibility for atypical processing where input file + naming deviates from the standard. It replaces '%tileID' with a zero-padded + three-digit number and '%modality' with the specified modality. + + Args: + base_file_name (str): The template file name containing placeholders. + num (int): The tile ID number to insert (zero-padded to three digits). + modality (str): The modality string to insert. + + Returns: + str: The formatted volume name with placeholders replaced. """ - vol = base.replace('%tileID', f"{num:03d}") - vol = vol.replace('%modality', modality) - return vol + vol_name = base_file_name + vol_name = vol_name.replace("%tileID", f"{num:03d}") + vol_name = vol_name.replace("%modality", modality) + return vol_name \ No newline at end of file diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 0a807766..53a08bc4 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -75,9 +75,9 @@ def mosaic3d_telesto( xv = np.linspace(0, 1, int(rx)) yv = np.linspace(0, 1, int(ry)) x = np.ones(size_row) - x[:rx], x[-rx:] = xv, xv + x[:rx], x[-rx:] = xv, xv[::-1] y = np.ones(size_column) - y[:ry], y[-ry:] = yv, yv + y[:ry], y[-ry:] = yv, yv[::-1] Ramp2D = da.from_array(np.outer(x, y)[:, :], chunks=(size_row, size_column)) Ramp3D = Ramp2D[...,None] @@ -116,8 +116,8 @@ def build_slice(s: int) -> da.Array: else: mat_path = op.join(base_dir, FileNameFormat[0,0]%tile_id) - arr = sio.loadmat(mat_path, squeeze_me=True)[next(mat_vars(mat_path))] - arr = da.from_array(arr, chunks='auto') + # arr = sio.loadmat(mat_path, squeeze_me=True)[next(mat_vars(mat_path))] + # arr = da.from_array(arr, chunks='auto') name, shape, dtype = None, None, None for name, shape, dtype in sio.whosmat(mat_path): if not name.startswith("__"): @@ -139,37 +139,30 @@ def build_slice(s: int) -> da.Array: arr = arr[xp:, yp:, :] - if modality == "mus": - if ftype == 'mat': - arr = arr[:, :, :MZL] - elif ftype == 'nifti': - # shape (H, W, N) - I = 10.0 ** (arr / 10.0) - - # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] - # via a reverse cumulative-sum trick: - # reverse along the 3rd axis → shape (H,W,N) - I_rev = I[:, :, ::-1] - # cumulative sum in reversed order → (H,W,N) - cumsum_rev = np.cumsum(I_rev, - axis=2) - # drop the very first (no “next” beyond the last) → (H,W,N-1) - sum_excl_rev = cumsum_rev[:, :,:-1] - # flip back to original order → (H,W,N-1) - sum_excl = sum_excl_rev[:, :, ::-1] - - # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) - sum_excl = sum_excl[:, :, :MZL] # keep only the first MZL sums → (H,W,MZL) - - # divide elementwise and apply the constant factors - arr = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) - - else: - raise Exception("unknown file type") - elif modality == "dBI": - arr = arr[:,:,:MZL] + if modality == "mus" and ftype == 'nifti': + # shape (H, W, N) + I = 10.0 ** (arr / 10.0) + + # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] + # via a reverse cumulative-sum trick: + # reverse along the 3rd axis → shape (H,W,N) + I_rev = I[:, :, ::-1] + # cumulative sum in reversed order → (H,W,N) + cumsum_rev = np.cumsum(I_rev, + axis=2) + # drop the very first (no “next” beyond the last) → (H,W,N-1) + sum_excl_rev = cumsum_rev[:, :,:-1] + # flip back to original order → (H,W,N-1) + sum_excl = sum_excl_rev[:, :, ::-1] + + # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) + sum_excl = sum_excl[:, :, :MZL] # keep only the first MZL sums → (H,W,MZL) + + # divide elementwise and apply the constant factors + arr = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) + else: - raise Exception("unknown modality") + arr = arr[:,:,:MZL] M_acc[row_range, column_range, :] += arr * Ramp3D W_acc[row_range, column_range] += Ramp2D From 581166c9bc83028bcacac39a511130d30adb0286 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 23 Apr 2025 17:40:33 -0400 Subject: [PATCH 021/157] wip: psoct --- linc_convert/modalities/psoct/mosaic2d.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index ba165dcd..c6ae2bf6 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -210,7 +210,7 @@ def build_slice(s: int) -> da.Array: if lower_mod == 'orientation': rad = np.deg2rad(arr) c, s = np.cos(rad), np.sin(rad) - SLO_OC = np.stack([c * c, c * s, c * s, c * c], axis=-1) + SLO_OC = np.stack([c * c, c * s, c * s, s*s], axis=-1) # add weighted outer products M[row_slice, col_slice] += SLO_OC * RampOrig[...,None] Ma[row_slice, col_slice] += RampOrig @@ -232,6 +232,11 @@ def build_slice(s: int) -> da.Array: avg = M / Ma[:, :, None] if lower_mod == 'orientation': + avg = np.array(avg) + ref = loadmat(op.join( + "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", + f"{modalstr}_slice{1:03d}.raw.mat"))['M'] + np.testing.assert_array_almost_equal(ref, avg) print("Starting orientation angles eigen decomp...") h, w = M.shape[:2] a_x = avg.reshape((h * w, 2, 2)) @@ -254,12 +259,11 @@ def build_slice(s: int) -> da.Array: O[O < -90] += 180 O[O > 90] -= 180 MosaicFinal = np.rot90(O, k=-1) - ref = loadmat(op.join( - "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", - f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] - np.testing.assert_array_almost_equal(ref, MosaicFinal) + # ref = loadmat(op.join( + # "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", + # f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] + # np.testing.assert_array_almost_equal(ref, MosaicFinal) - return MosaicFinal # # # save orientation mosaic @@ -278,14 +282,15 @@ def build_slice(s: int) -> da.Array: # I1 = exposure.rescale_intensity(data1.astype(np.float64), # in_range='image') / (1 - 0.4) # I1 = np.clip(I1, 0, 1) - # I1[data4 <= 20] = 0 # map3D = np.ones((*O_norm.shape, 3)) # map3D[..., 0] = O_norm # map3D[..., 2] = I1 # maprgb = hsv2rgb(map3D) # imageio.imwrite( - # os.path.join(outdir, f"{modalstr}1_slice{sliceid_out:03d}.tiff"), + # op.join("/local_mount/space/megaera/1/users/kchai/psoct", f"{modalstr}1_slice{1:03d}.tiff"), # (maprgb * 255).astype(np.uint8)) + + return MosaicFinal # # # Orientation2 # I2 = (-exposure.rescale_intensity(data2.astype(np.float64), From 8ce8336c0faab99708bb2d08c4e84246be145634 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 24 Apr 2025 15:03:12 -0400 Subject: [PATCH 022/157] wip: oct data conversion, optimization --- linc_convert/modalities/psoct/mosaic2d.py | 540 ++++++++++------------ 1 file changed, 248 insertions(+), 292 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index c6ae2bf6..7ed41ba7 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -1,16 +1,16 @@ -import os.path as op import logging +import os.path as op from colorsys import hsv_to_rgb +from typing import Optional import cyclopts +import dask +import dask.array as da import imageio +import nibabel as nib import numpy as np import scipy.io as sio -import nibabel as nib -import dask -import dask.array as da import tensorstore as ts -from scipy.io import loadmat from skimage.exposure import exposure from linc_convert.modalities.psoct.cli import psoct @@ -27,12 +27,11 @@ @mosaic2d.default def mosaic2d_telesto( - # inp:str, parameter_file: str, *, - modality: str, method: str = None, + tiff_output_dir: str = None, zarr_config: ZarrConfig = None, ) -> None: """ @@ -44,316 +43,273 @@ def mosaic2d_telesto( Paths """ + logger.info(f"--Modality is {modality}--") + # Load .mat containing Parameters, Scan, and Mosaic2D - params = sio.loadmat(parameter_file, squeeze_me=True) - Parameters = struct_arr_to_dict(params['Parameters']) - Scan = struct_arr_to_dict(params['Scan']) - Mosaic2D = struct_arr_to_dict(params['Mosaic2D']) + raw = sio.loadmat(parameter_file, squeeze_me=True) + params = struct_arr_to_dict(raw['Parameters']) + scan_params = struct_arr_to_dict(raw['Scan']) + mosaic_params = struct_arr_to_dict(raw['Mosaic2D']) + + slice_indices = atleast_2d_trailing(mosaic_params['sliceidx']) + exp_params, is_fiji = find_experiment_params(mosaic_params['Exp']) + input_dirs = np.atleast_1d(mosaic_params['indir']) + file_format_template = mosaic_params['file_format'] + filetype = mosaic_params['InFileType'].lower() + transpose_needed = bool(params['transpose']) + + clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) + if scan_params['System'].lower() == 'octopus': + clip_x, clip_y = clip_y, clip_x - use_method = method is not None - logger.info(f"--Modality is {modality}--") + # Mosaic geometry + tile_size = int(exp_params['NbPix']) + tile_width, tile_height = tile_size - clip_x, tile_size - clip_y + if method: + x_coords, y_coords = get_tile_coordinates(exp_params[method]['X_Mean'], + exp_params[method]['Y_Mean']) + else: + x_coords, y_coords = get_tile_coordinates(exp_params['X_Mean'], + exp_params['Y_Mean']) + total_width = int(np.nanmax(x_coords) + tile_width) + total_height = int(np.nanmax(y_coords) + tile_height) + total_depth = 4 if modality.lower() == 'orientation' else 1 + ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) + + gray_range, save_tiff = _get_gray_range(params, modality) + if not save_tiff: + tiff_output_dir = None + + modality_str = _select_modality_string(raw, modality) + + map_indicies = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 + num_slices = slice_indices.shape[1] + slices = [ + build_slice(s, slice_indices, scan_params, exp_params, file_format_template, + filetype, gray_range, input_dirs, + map_indicies, modality, modality_str, ramp, tile_height, + tile_width, total_width, total_height, total_depth, + x_coords, y_coords, clip_x, clip_y, transpose_needed, + tiff_output_dir) for s in range(num_slices)] + arr = da.stack(slices,axis=-1) + chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) + wconfig = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, + chunk=chunk, shard=shard) + wconfig["create"] = True + wconfig["delete_existing"] = True - sliceidx = atleast_2d_trailing(Mosaic2D['sliceidx']) + tswriter = ts.open(wconfig).result() + arr.store(tswriter) - Exp, is_fiji = find_experiment_params(Mosaic2D['Exp']) + return None - if use_method: - Exp['X_Mean'] = Exp[method]['X_Mean'] - Exp['Y_Mean'] = Exp[method]['Y_Mean'] - indir = np.atleast_1d(Mosaic2D['indir']) +def build_slice(slice_idx, slice_indices, scan_params, exp_params, file_format_template, + filetype, gray_range, input_dirs, map_indicies, modality, modality_str, + ramp, tile_height, tile_width, total_width, total_height, total_depth, + x_coords, y_coords, clip_x, clip_y, transpose_needed, tiff_output_dir): + lower_mod = modality.lower() + slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] + input_dir = input_dirs[int(slice_idx_run) - 1] + file_path_template = op.join(input_dir, file_format_template) + canvas = da.zeros((total_width, total_height, total_depth), dtype=np.float32, + chunks='auto') + weight = da.zeros((total_width, total_height), dtype=np.float32, chunks='auto') + for (index_row, index_column), tile_idx in np.ndenumerate(map_indicies): + if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( + y_coords[index_row, index_column]): + continue + r0 = int(x_coords[index_row, index_column]) + c0 = int(y_coords[index_row, index_column]) + row_slice = slice(r0, r0 + tile_width) + col_slice = slice(c0, c0 + tile_height) + tile_id = (slice_idx_in - 1) * int(exp_params['TilesPerSlice']) + tile_idx + + if filetype == 'mat': + arr = load_tile_mat(get_volname(file_path_template, tile_id, modality_str)) + elif filetype == 'nifti': + if modality == "mus": + arr = load_tile_nifti( + get_volname(file_path_template, tile_id, "cropped")) + else: + arr = load_tile_nifti( + get_volname(file_path_template, tile_id, modality_str)) + else: + raise ValueError(f"Unsupported file type: {filetype}") + + if scan_params['System'].lower() == 'octopus': + arr = np.swapaxes(arr, 0, 1) + if transpose_needed: + arr = np.swapaxes(arr, 0, 1) + arr = arr[clip_x:, clip_y:] - file_format = Mosaic2D['file_format'] - filetype = Mosaic2D['InFileType'].lower() - transpose_flag = bool(Parameters['transpose']) + if modality == "mus" and filetype == 'nifti': + # TODO: is this necessary in Mosaic2D? + # as total_depth will be 1 and we will crop 1 depth + arr = process_mus_nifti(arr, total_depth) - if Scan['System'] == 'Octopus': - xp, yp = Parameters['YPixClip'], Parameters['XPixClip'] + if lower_mod == 'orientation': + rad = np.deg2rad(arr) + c, s = np.cos(rad), np.sin(rad) + arr = np.stack([c * c, c * s, c * s, s * s], axis=-1) + + if arr.ndim == 2: + canvas[row_slice, col_slice] += (arr * ramp)[..., None] + else: + canvas[row_slice, col_slice] += arr * ramp[..., None] + weight[row_slice, col_slice] += ramp + + canvas /= weight[:, :, None] + + if lower_mod == 'orientation': + print("Starting orientation angles eigen decomp...") + h, w = canvas.shape[:2] + a_x = canvas.reshape((h * w, 2, 2)) + eigvals, eigvecs = np.linalg.eigh(a_x) + x = eigvecs[:, 0, 1] + y = eigvecs[:, 1, 1] + canvas = np.arctan2(y, x) / np.pi * 180 + canvas = canvas.reshape((h, w)) + canvas[canvas < -90] += 180 + canvas[canvas > 90] -= 180 + canvas = np.rot90(canvas, k=-1) else: - xp, yp = Parameters['XPixClip'], Parameters['YPixClip'] - xp, yp = int(xp), int(yp) + canvas = np.squeeze(canvas) + canvas = np.nan_to_num(canvas) + canvas = np.rot90(canvas, k=-1) + if tiff_output_dir: + logging.info("Save .tiff mosaic") + normed = exposure.rescale_intensity( + canvas, + in_range=gray_range if gray_range is not None else 'image') + imageio.imwrite( + op.join(tiff_output_dir, f"{modality}_slice{1:03d}.tiff"), + (normed * 255).astype(np.uint8)) - # Mosaic geometry - nb_pix = int(Exp['NbPix']) - size_row, size_column = nb_pix - xp, nb_pix - yp - # need to copy here - X, Y = Exp['X_Mean'], Exp['Y_Mean'] - X -= np.nanmin(X) - Y -= np.nanmin(Y) - MXL = int(np.nanmax(X) + size_row) - MYL = int(np.nanmax(Y) + size_column) - MZL = 4 if modality =='Orientation' else 1 - - # Precompute blending ramps - dx = np.nanmedian(np.diff(X, axis=0)) - dy = np.nanmedian(np.diff(Y, axis=1)) - rx, ry = size_row - round(dx), size_column - round(dy) + # ref = loadmat(op.join( + # "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", + # f"{modality}_slice{1:03d}.mat"))['MosaicFinal'] + # diff = np.abs(ref-canvas).compute() + # i,j = np.where(diff==np.max(diff)) + # i,j = ref.shape[-1]-j-1, i + # print(i,j) + # np.testing.assert_array_almost_equal(ref, canvas,decimal=6) + + return canvas + + +def process_mus_nifti(arr, total_depth): + I = 10.0 ** (arr / 10.0) + I_rev = I[:, :, ::-1] + # cumulative sum in reversed order → (H,W,N) + cumsum_rev = np.cumsum(I_rev, axis=2) + # drop the very first (no “next” beyond the last) → (H,W,N-1) + sum_excl_rev = cumsum_rev[:, :, :-1] + # flip back to original order → (H,W,N-1) + sum_excl = sum_excl_rev[:, :, ::-1] + # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) + sum_excl = sum_excl[:, :, + :total_depth] # keep only the first MZL sums → (H,W,MZL) + # divide elementwise and apply the constant factors + I = I[:, :, :total_depth] / sum_excl / (2.0 * 0.0025) + arr = np.squeeze(np.mean(I, axis=2)) + return arr + + +def load_tile_nifti(path): + header = nib.load(path) + shape = header.shape + dtype = header.get_data_dtype() + delayed_arr = dask.delayed(header.get_fdata)() + arr = da.from_delayed(delayed_arr, + shape=shape, + dtype=dtype) + return arr + + +def load_tile_mat(mat_path): + name, shape, dtype = None, None, None + for name, shape, dtype in sio.whosmat(mat_path): + if not name.startswith("__"): + break + if not name: + raise ValueError("Variable not found") + delayed_arr = dask.delayed(load_mat)(mat_path, name) + arr = da.from_delayed(delayed_arr, + shape=shape, + dtype=dtype) + return arr + + +def _compute_blending_ramp( + tile_width: int, + tile_height: int, + x_coords: np.ndarray, + y_coords: np.ndarray, +) -> da.Array: + """ + Create a 2D blending weight map for overlapping tiles. + """ + dx = np.nanmedian(np.diff(x_coords, axis=0)) + dy = np.nanmedian(np.diff(y_coords, axis=1)) + rx, ry = tile_width - round(dx), tile_height - round(dy) xv = np.linspace(0, 1, int(rx)) yv = np.linspace(0, 1, int(ry)) - x = np.ones(size_row) + x = np.ones(tile_width) x[:rx], x[-rx:] = xv, xv[::-1] - y = np.ones(size_column) + y = np.ones(tile_height) y[:ry], y[-ry:] = yv, yv[::-1] - RampOrig = da.from_array(np.outer(x, y)[:, :], chunks=(size_row, size_column)) + ramp = da.from_array(np.outer(x, y)[:, :], chunks=(tile_width, tile_height)) + return ramp + + +def get_tile_coordinates(x_mean, y_mean): + x_mean -= np.nanmin(x_mean) + y_mean -= np.nanmin(y_mean) + return x_mean, y_mean + - GrayRange = None - savetiff = True - noscale = False +def _get_gray_range( + params_dict: dict[str, any], modality: str +) -> tuple[Optional[tuple | str], bool]: + """ + Determine gray-level range for a modality; return (range, save_tiff_flag). + """ key_map = { 'aip': 'AipGrayRange', 'mip': 'MipGrayRange', 'retardance': 'RetGrayRange', 'mus': 'musGrayRange', - 'surf': 'surfGrayRange' + 'surf': 'surfGrayRange', } - lower_mod = modality.lower() - if lower_mod in key_map: - GrayRange = Parameters.get(key_map[lower_mod]) - if GrayRange is None: - noscale = True + low = modality.lower() + if low in key_map: + gray_range = params_dict.get(key_map[low]) else: - dyn_key = f"{modality}GrayRange" - GrayRange = Parameters.get(dyn_key) - if GrayRange is None: - noscale = True - if noscale: - savetiff = False + gray_range = params_dict.get(f"{modality}GrayRange") + if gray_range is None: logger.warning( - f"{modality} grayscale range not found. Only MAT file will be saved.") - - # ----- Modality string when inconsistency in file names ----- - modality_base = params['Enface']['inputstr'].item() # assumed list of strings - # find entry containing first 3 letters of modality - modality_str = next((s for s in modality_base if lower_mod[:3] in s.lower()), - None) - if modality_str is None: - modality_str = modality[:3] - logger.warning(f"{modality} not in Enface.inputstr. Mosaic2D might fail.") - - # using float32 sample - sample_dtype = np.float32 - - MapIndex = Exp['MapIndex_Tot_offset'] + Exp['First_Tile'] - 1 - num_slices = sliceidx.shape[1] - mosaics = {} - - def build_slice(s: int) -> da.Array: - sl_in, sl_out, sl_run = sliceidx[:, s] - indir_curr = indir[int(sl_run) - 1] - base = op.join(indir_curr, file_format) - - M = da.zeros((MXL, MYL, MZL), dtype=np.float32, chunks='auto') - Ma = da.zeros((MXL, MYL), dtype=np.float32, chunks='auto') - - - for (jj, ii), idx in np.ndenumerate(MapIndex): - if idx <= 0 or np.isnan(X[jj, ii]): - continue - r0 = int(X[jj, ii]) - c0 = int(Y[jj, ii]) - row_slice = slice(r0, r0 + size_row) - col_slice = slice(c0, c0 + size_column) - tile_id = (sl_in - 1) * int(Exp['TilesPerSlice']) + idx - if filetype == 'nifti': - if modality == "mus": - path = get_volname(base, tile_id, "cropped") - else: - path = get_volname(base, tile_id, modality_str) - header = nib.load(path) - shape = header.shape - dtype = header.get_data_dtype() - delayed_arr = dask.delayed(header.get_fdata)() - - elif filetype == 'mat': - mat_path = get_volname(base, tile_id, modality_str) - name, shape, dtype = None, None, None - for name, shape, dtype in sio.whosmat(mat_path): - if not name.startswith("__"): - break - if not name: - raise ValueError("Variable not found") - delayed_arr = dask.delayed(load_mat)(mat_path, name) - arr = da.from_delayed(delayed_arr, - shape=shape, - dtype=dtype) - if Scan['System'].lower() == 'octopus': - arr = np.swapaxes(arr, 0,1) - if transpose_flag: - arr = np.swapaxes(arr, 0,1) - arr = arr[xp:,yp:] - if modality == "mus" and filetype == 'nifti': - # shape (H, W, N) - I = 10.0 ** (arr / 10.0) - - # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] - # via a reverse cumulative-sum trick: - # reverse along the 3rd axis → shape (H,W,N) - I_rev = I[:, :, ::-1] - # cumulative sum in reversed order → (H,W,N) - cumsum_rev = np.cumsum(I_rev, - axis=2) - # drop the very first (no “next” beyond the last) → (H,W,N-1) - sum_excl_rev = cumsum_rev[:, :, :-1] - # flip back to original order → (H,W,N-1) - sum_excl = sum_excl_rev[:, :, ::-1] - - # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) - sum_excl = sum_excl[:, :, - :MZL] # keep only the first MZL sums → (H,W,MZL) - - # divide elementwise and apply the constant factors - I = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) - arr = np.squeeze(np.mean(I, axis=2)) - - - # blend - if lower_mod == 'orientation': - rad = np.deg2rad(arr) - c, s = np.cos(rad), np.sin(rad) - SLO_OC = np.stack([c * c, c * s, c * s, s*s], axis=-1) - # add weighted outer products - M[row_slice, col_slice] += SLO_OC * RampOrig[...,None] - Ma[row_slice, col_slice] += RampOrig - else: - if arr.ndim ==2: - M[row_slice, col_slice] += (arr* RampOrig)[..., None] - else: - M[row_slice, col_slice] += arr * RampOrig - Ma[row_slice, col_slice] += RampOrig - - modalstr_map = { - 'mip': 'MIP', - 'aip': 'AIP', - 'retardance': 'Retardance', - 'orientation': 'Orientation', - 'mus': 'mus' - } - modalstr = modalstr_map.get(lower_mod, modality) - avg = M / Ma[:, :, None] + f"{modality} grayscale range not found. TIFF output disabled." + ) + return None, False + if isinstance(gray_range, np.ndarray): + gray_range = tuple(gray_range[:2]) + return gray_range, True - if lower_mod == 'orientation': - avg = np.array(avg) - ref = loadmat(op.join( - "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", - f"{modalstr}_slice{1:03d}.raw.mat"))['M'] - np.testing.assert_array_almost_equal(ref, avg) - print("Starting orientation angles eigen decomp...") - h, w = M.shape[:2] - a_x = avg.reshape((h * w, 2, 2)) - eigvals, eigvecs = np.linalg.eigh(a_x) - x = eigvecs[:, 0, 1] - y = eigvecs[:, 1, 1] - O = np.arctan2(y, x) / np.pi * 180 - O = O.reshape((h, w)) - # comp0, comp1, comp2, comp3 = avg[:, :, 0], avg[:, :, 1], avg[:, :, 2], avg[ - # :, :, - # 3] - # O = np.zeros((MXL, MYL)) - # for i in range(MXL): - # for j in range(MYL): - # mat2 = np.array( - # [[comp0[i, j], comp1[i, j]], [comp2[i, j], comp3[i, j]]]) - # w, v = np.linalg.eigh(mat2) - # principal = v[:, np.argmax(w)] - # O[i, j] = np.degrees(np.arctan2(principal[1], principal[0])) - O[O < -90] += 180 - O[O > 90] -= 180 - MosaicFinal = np.rot90(O, k=-1) - # ref = loadmat(op.join( - # "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", - # f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] - # np.testing.assert_array_almost_equal(ref, MosaicFinal) - - # - # # save orientation mosaic - - # - # # masking orientation - # RetSliceTiff = os.path.join(outdir, - # f"Retardance_slice{sliceid_out:03d}.tiff") - # AipSliceTiff = os.path.join(outdir, f"AIP_slice{sliceid_out:03d}.tiff") - # data1 = imageio.imread(RetSliceTiff) - # data2 = imageio.imread(AipSliceTiff) - # data4 = wiener(data2, (5, 5)) - # - # O_norm = (O + 90) / 180 - # - # # Orientation1 - # I1 = exposure.rescale_intensity(data1.astype(np.float64), - # in_range='image') / (1 - 0.4) - # I1 = np.clip(I1, 0, 1) - # map3D = np.ones((*O_norm.shape, 3)) - # map3D[..., 0] = O_norm - # map3D[..., 2] = I1 - # maprgb = hsv2rgb(map3D) - # imageio.imwrite( - # op.join("/local_mount/space/megaera/1/users/kchai/psoct", f"{modalstr}1_slice{1:03d}.tiff"), - # (maprgb * 255).astype(np.uint8)) - - return MosaicFinal - # - # # Orientation2 - # I2 = (-exposure.rescale_intensity(data2.astype(np.float64), - # in_range='image') + 1 - 0.2) / ( - # (1 - 0.2) * 0.5) - # I2 = np.clip(I2, 0, 1) - # I2[data4 <= 20] = 0 - # map3D2 = np.ones((*O_norm.shape, 3)) - # map3D2[..., 0] = O_norm - # map3D2[..., 2] = I2 - # maprgb2 = hsv2rgb(map3D2) - # imageio.imwrite( - # os.path.join(outdir, f"{modalstr}2_slice{sliceid_out:03d}.tiff"), - # (maprgb2 * 255).astype(np.uint8)) - # - # # Orientation3 - # map3D3 = np.ones((*O_norm.shape, 3)) - # map3D3[..., 0] = O_norm - # maprgb3 = hsv2rgb(map3D3) - # imageio.imwrite( - # os.path.join(outdir, f"{modalstr}3_slice{sliceid_out:03d}.tiff"), - # (maprgb3 * 255).astype(np.uint8)) - else: - avg = np.squeeze(avg) - MosaicFinal = np.rot90(avg, k=-1) - MosaicFinal = np.nan_to_num(MosaicFinal) - - # if savetiff: - # print("Saving .tiff mosaic...") - nonlocal GrayRange - if isinstance(GrayRange,np.ndarray): - GrayRange =tuple(GrayRange[:]) - normed = exposure.rescale_intensity(MosaicFinal, - in_range=GrayRange if GrayRange is not None else 'image') - imageio.imwrite( - op.join("/local_mount/space/megaera/1/users/kchai/psoct", f"{modalstr}_slice{1:03d}.tiff"), - (normed * 255).astype(np.uint8)) - # print("Saving .mat mosaic...") - # savemat(os.path.join(outdir, f"{modalstr}_slice{sliceid_out:03d}.mat"), - # {'MosaicFinal': MosaicFinal}) - ref = loadmat(op.join( - "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", - f"{modalstr}_slice{1:03d}.mat"))['MosaicFinal'] - diff = np.abs(ref-MosaicFinal).compute() - i,j = np.where(diff==np.max(diff)) - i,j = ref.shape[-1]-j-1, i - print(i,j) - np.testing.assert_array_almost_equal(ref, MosaicFinal,decimal=4) - return MosaicFinal - - slices = [build_slice(s) for s in range(num_slices)] - arr = da.stack(slices,axis=-1) - chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) - wconfig = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, - chunk=chunk, shard=shard) - wconfig["create"] = True - wconfig["delete_existing"] = True - - tswriter = ts.open(wconfig).result() - arr.store(tswriter) - - return None +def _select_modality_string(raw_mat: dict[str, any], modality: str) -> str: + """ + Choose the filename token matching the modality from Enface.inputstr. + """ + candidates = list(raw_mat['Enface']['inputstr'].item()) + low3 = modality[:3].lower() + for token in candidates: + if low3 in token.lower(): + return token + logger.warning( + f"Modality '{modality}' not found in inputstr; using first 3 letters." + ) + return modality[:3] def get_rgb_4d(ori, value_range): From 3c94fe6242d74dcfdabb7cd4aef693d9ab62bb5a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 24 Apr 2025 16:37:31 -0400 Subject: [PATCH 023/157] wip: oct data conversion, optimization --- linc_convert/modalities/psoct/mosaic2d.py | 216 +++++----- linc_convert/modalities/psoct/mosaic3d.py | 459 +++++++++------------- 2 files changed, 290 insertions(+), 385 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index 7ed41ba7..532ce170 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -1,7 +1,7 @@ import logging import os.path as op from colorsys import hsv_to_rgb -from typing import Optional +from typing import Optional, Tuple, Dict import cyclopts import dask @@ -46,76 +46,80 @@ def mosaic2d_telesto( logger.info(f"--Modality is {modality}--") # Load .mat containing Parameters, Scan, and Mosaic2D - raw = sio.loadmat(parameter_file, squeeze_me=True) - params = struct_arr_to_dict(raw['Parameters']) - scan_params = struct_arr_to_dict(raw['Scan']) - mosaic_params = struct_arr_to_dict(raw['Mosaic2D']) - - slice_indices = atleast_2d_trailing(mosaic_params['sliceidx']) - exp_params, is_fiji = find_experiment_params(mosaic_params['Exp']) - input_dirs = np.atleast_1d(mosaic_params['indir']) - file_format_template = mosaic_params['file_format'] - filetype = mosaic_params['InFileType'].lower() + raw_mat = sio.loadmat(parameter_file, squeeze_me=True) + params = struct_arr_to_dict(raw_mat['Parameters']) + scan_info = struct_arr_to_dict(raw_mat['Scan']) + mosaic_info = struct_arr_to_dict(raw_mat['Mosaic2D']) + exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) + + slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) + input_dirs = np.atleast_1d(mosaic_info['indir']) + file_format_template = mosaic_info['file_format'] + file_type = mosaic_info['InFileType'].lower() transpose_needed = bool(params['transpose']) clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) - if scan_params['System'].lower() == 'octopus': + if scan_info['System'].lower() == 'octopus': clip_x, clip_y = clip_y, clip_x - # Mosaic geometry tile_size = int(exp_params['NbPix']) tile_width, tile_height = tile_size - clip_x, tile_size - clip_y - if method: - x_coords, y_coords = get_tile_coordinates(exp_params[method]['X_Mean'], - exp_params[method]['Y_Mean']) - else: - x_coords, y_coords = get_tile_coordinates(exp_params['X_Mean'], - exp_params['Y_Mean']) - total_width = int(np.nanmax(x_coords) + tile_width) - total_height = int(np.nanmax(y_coords) + tile_height) - total_depth = 4 if modality.lower() == 'orientation' else 1 - ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) + x_coords, y_coords = _normalize_tile_coords( + exp_params[method]['X_Mean'] if method else exp_params['X_Mean'], + exp_params[method]['Y_Mean'] if method else exp_params['Y_Mean'], + ) + full_width = int(np.nanmax(x_coords) + tile_width) + full_height = int(np.nanmax(y_coords) + tile_height) + depth = 4 if modality.lower() == 'orientation' else 1 + blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) gray_range, save_tiff = _get_gray_range(params, modality) if not save_tiff: tiff_output_dir = None - modality_str = _select_modality_string(raw, modality) + modality_token = _select_modality_token(raw_mat, modality) + map_indices = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 - map_indicies = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 num_slices = slice_indices.shape[1] slices = [ - build_slice(s, slice_indices, scan_params, exp_params, file_format_template, - filetype, gray_range, input_dirs, - map_indicies, modality, modality_str, ramp, tile_height, - tile_width, total_width, total_height, total_depth, - x_coords, y_coords, clip_x, clip_y, transpose_needed, - tiff_output_dir) for s in range(num_slices)] + build_slice(s, slice_indices=slice_indices, scan_info=scan_info, + exp_params=exp_params, input_dirs=input_dirs, + file_format_template=file_format_template, file_type=file_type, + modality=modality, modality_token=modality_token, + blend_ramp=blend_ramp, map_indices=map_indices, + tile_width=tile_width, tile_height=tile_height, + full_width=full_width, full_height=full_height, depth=depth, + x_coords=x_coords, y_coords=y_coords, clip_x=clip_x, clip_y=clip_y, + transpose_needed=transpose_needed, tiff_output_dir=tiff_output_dir, + gray_range=gray_range) for s in + range(num_slices)] arr = da.stack(slices,axis=-1) + chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) - wconfig = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, + write_cfg = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, chunk=chunk, shard=shard) - wconfig["create"] = True - wconfig["delete_existing"] = True + write_cfg["create"] = True + write_cfg["delete_existing"] = True - tswriter = ts.open(wconfig).result() + tswriter = ts.open(write_cfg).result() arr.store(tswriter) return None -def build_slice(slice_idx, slice_indices, scan_params, exp_params, file_format_template, - filetype, gray_range, input_dirs, map_indicies, modality, modality_str, - ramp, tile_height, tile_width, total_width, total_height, total_depth, - x_coords, y_coords, clip_x, clip_y, transpose_needed, tiff_output_dir): +def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, + file_format_template, file_type, modality, modality_token, blend_ramp, + map_indices, tile_width, tile_height, full_width, full_height, depth, + x_coords, y_coords, clip_x, clip_y, transpose_needed, tiff_output_dir, + gray_range): lower_mod = modality.lower() slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] input_dir = input_dirs[int(slice_idx_run) - 1] file_path_template = op.join(input_dir, file_format_template) - canvas = da.zeros((total_width, total_height, total_depth), dtype=np.float32, + canvas = da.zeros((full_width, full_height, depth), dtype=np.float32, chunks='auto') - weight = da.zeros((total_width, total_height), dtype=np.float32, chunks='auto') - for (index_row, index_column), tile_idx in np.ndenumerate(map_indicies): + weight = da.zeros((full_width, full_height), dtype=np.float32, chunks='auto') + for (index_row, index_column), tile_idx in np.ndenumerate(map_indices): if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( y_coords[index_row, index_column]): continue @@ -125,28 +129,29 @@ def build_slice(slice_idx, slice_indices, scan_params, exp_params, file_format_t col_slice = slice(c0, c0 + tile_height) tile_id = (slice_idx_in - 1) * int(exp_params['TilesPerSlice']) + tile_idx - if filetype == 'mat': - arr = load_tile_mat(get_volname(file_path_template, tile_id, modality_str)) - elif filetype == 'nifti': + if file_type == 'mat': + arr = _load_mat_tile( + get_volname(file_path_template, tile_id, modality_token)) + elif file_type == 'nifti': if modality == "mus": - arr = load_tile_nifti( + arr = _load_nifti_tile( get_volname(file_path_template, tile_id, "cropped")) else: - arr = load_tile_nifti( - get_volname(file_path_template, tile_id, modality_str)) + arr = _load_nifti_tile( + get_volname(file_path_template, tile_id, modality_token)) else: - raise ValueError(f"Unsupported file type: {filetype}") + raise ValueError(f"Unsupported file type: {file_type}") - if scan_params['System'].lower() == 'octopus': + if scan_info['System'].lower() == 'octopus': arr = np.swapaxes(arr, 0, 1) if transpose_needed: arr = np.swapaxes(arr, 0, 1) arr = arr[clip_x:, clip_y:] - if modality == "mus" and filetype == 'nifti': + if modality == "mus" and file_type == 'nifti': # TODO: is this necessary in Mosaic2D? # as total_depth will be 1 and we will crop 1 depth - arr = process_mus_nifti(arr, total_depth) + arr = process_mus_nifti(arr, depth) if lower_mod == 'orientation': rad = np.deg2rad(arr) @@ -154,10 +159,10 @@ def build_slice(slice_idx, slice_indices, scan_params, exp_params, file_format_t arr = np.stack([c * c, c * s, c * s, s * s], axis=-1) if arr.ndim == 2: - canvas[row_slice, col_slice] += (arr * ramp)[..., None] + canvas[row_slice, col_slice] += (arr * blend_ramp)[..., None] else: - canvas[row_slice, col_slice] += arr * ramp[..., None] - weight[row_slice, col_slice] += ramp + canvas[row_slice, col_slice] += arr * blend_ramp[..., None] + weight[row_slice, col_slice] += blend_ramp canvas /= weight[:, :, None] @@ -198,47 +203,18 @@ def build_slice(slice_idx, slice_indices, scan_params, exp_params, file_format_t return canvas -def process_mus_nifti(arr, total_depth): - I = 10.0 ** (arr / 10.0) - I_rev = I[:, :, ::-1] - # cumulative sum in reversed order → (H,W,N) - cumsum_rev = np.cumsum(I_rev, axis=2) - # drop the very first (no “next” beyond the last) → (H,W,N-1) - sum_excl_rev = cumsum_rev[:, :, :-1] - # flip back to original order → (H,W,N-1) - sum_excl = sum_excl_rev[:, :, ::-1] - # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) - sum_excl = sum_excl[:, :, - :total_depth] # keep only the first MZL sums → (H,W,MZL) - # divide elementwise and apply the constant factors - I = I[:, :, :total_depth] / sum_excl / (2.0 * 0.0025) - arr = np.squeeze(np.mean(I, axis=2)) - return arr - - -def load_tile_nifti(path): - header = nib.load(path) - shape = header.shape - dtype = header.get_data_dtype() - delayed_arr = dask.delayed(header.get_fdata)() - arr = da.from_delayed(delayed_arr, - shape=shape, - dtype=dtype) - return arr +def _load_nifti_tile(path: str) -> da.Array: + img = nib.load(path) + delayed = dask.delayed(img.get_fdata)() + return da.from_delayed(delayed, shape=img.shape, dtype=img.get_data_dtype()) -def load_tile_mat(mat_path): - name, shape, dtype = None, None, None - for name, shape, dtype in sio.whosmat(mat_path): - if not name.startswith("__"): - break - if not name: - raise ValueError("Variable not found") - delayed_arr = dask.delayed(load_mat)(mat_path, name) - arr = da.from_delayed(delayed_arr, - shape=shape, - dtype=dtype) - return arr +def _load_mat_tile(path: str) -> da.Array: + var_name, shape, dtype = next( + (n, s, dt) for n, s, dt in sio.whosmat(path) if not n.startswith("__") + ) + delayed = dask.delayed(load_mat)(path, var_name) + return da.from_delayed(delayed, shape=shape, dtype=dtype) def _compute_blending_ramp( @@ -253,25 +229,25 @@ def _compute_blending_ramp( dx = np.nanmedian(np.diff(x_coords, axis=0)) dy = np.nanmedian(np.diff(y_coords, axis=1)) rx, ry = tile_width - round(dx), tile_height - round(dy) - xv = np.linspace(0, 1, int(rx)) - yv = np.linspace(0, 1, int(ry)) - x = np.ones(tile_width) - x[:rx], x[-rx:] = xv, xv[::-1] - y = np.ones(tile_height) - y[:ry], y[-ry:] = yv, yv[::-1] - ramp = da.from_array(np.outer(x, y)[:, :], chunks=(tile_width, tile_height)) + xv = np.linspace(0, 1, rx) + yv = np.linspace(0, 1, ry) + wx = np.ones(tile_width) + wy = np.ones(tile_height) + wx[:rx], wx[-rx:] = xv, xv[::-1] + wy[:ry], wy[-ry:] = yv, yv[::-1] + ramp = da.from_array(np.outer(wx, wy)[:, :], chunks=(tile_width, tile_height)) return ramp -def get_tile_coordinates(x_mean, y_mean): - x_mean -= np.nanmin(x_mean) - y_mean -= np.nanmin(y_mean) - return x_mean, y_mean +def _normalize_tile_coords(x_arr: np.ndarray, y_arr: np.ndarray) -> Tuple[ + np.ndarray, np.ndarray]: + x0, y0 = np.nanmin(x_arr), np.nanmin(y_arr) + return x_arr - x0, y_arr - y0 def _get_gray_range( - params_dict: dict[str, any], modality: str -) -> tuple[Optional[tuple | str], bool]: + params_dict: Dict[str, any], modality: str +) -> Tuple[Optional[tuple | str], bool]: """ Determine gray-level range for a modality; return (range, save_tiff_flag). """ @@ -297,14 +273,14 @@ def _get_gray_range( return gray_range, True -def _select_modality_string(raw_mat: dict[str, any], modality: str) -> str: +def _select_modality_token(raw_mat: dict[str, any], modality: str) -> str: """ Choose the filename token matching the modality from Enface.inputstr. """ candidates = list(raw_mat['Enface']['inputstr'].item()) - low3 = modality[:3].lower() + prefix = modality[:3].lower() for token in candidates: - if low3 in token.lower(): + if prefix in token.lower(): return token logger.warning( f"Modality '{modality}' not found in inputstr; using first 3 letters." @@ -356,4 +332,22 @@ def get_volname(base_file_name: str, num: int, modality: str) -> str: vol_name = base_file_name vol_name = vol_name.replace("%tileID", f"{num:03d}") vol_name = vol_name.replace("%modality", modality) - return vol_name \ No newline at end of file + return vol_name + + +def process_mus_nifti(arr, total_depth): + I = 10.0 ** (arr / 10.0) + I_rev = I[:, :, ::-1] + # cumulative sum in reversed order → (H,W,N) + cumsum_rev = np.cumsum(I_rev, axis=2) + # drop the very first (no “next” beyond the last) → (H,W,N-1) + sum_excl_rev = cumsum_rev[:, :, :-1] + # flip back to original order → (H,W,N-1) + sum_excl = sum_excl_rev[:, :, ::-1] + # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) + sum_excl = sum_excl[:, :, + :total_depth] # keep only the first MZL sums → (H,W,MZL) + # divide elementwise and apply the constant factors + I = I[:, :, :total_depth] / sum_excl / (2.0 * 0.0025) + arr = np.squeeze(np.mean(I, axis=2)) + return arr diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 53a08bc4..7f97a744 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -10,8 +10,10 @@ import tensorstore as ts from linc_convert.modalities.psoct.cli import psoct +from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ + _compute_blending_ramp, process_mus_nifti, _load_mat_tile, _load_nifti_tile from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ - find_experiment_params, mat_vars, atleast_2d_trailing, load_mat + find_experiment_params, atleast_2d_trailing, load_mat from linc_convert.modalities.psoct.utils._zarr import default_write_config from linc_convert.utils.zarr.create_array import compute_zarr_layout from linc_convert.utils.zarr.zarr_config import ZarrConfig @@ -23,266 +25,56 @@ @mosaic3d.default def mosaic3d_telesto( - # inp: str, parameter_file: str, *, - # parameter_file: str, downsample: bool = False, use_gpu: bool = False, zarr_config: ZarrConfig = None, ) -> None: # Load parameters - params = sio.loadmat(parameter_file, squeeze_me=True) - Parameters, Scan, Mosaic3D = params['Parameters'], params['Scan'], params[ - 'Mosaic3D'] - Parameters = struct_arr_to_dict(Parameters) - Scan = struct_arr_to_dict(Scan) - Mosaic3D = struct_arr_to_dict(Mosaic3D) + raw_mat = sio.loadmat(parameter_file, squeeze_me=True) + params = struct_arr_to_dict(raw_mat['Parameters']) + scan_info = struct_arr_to_dict(raw_mat['Scan']) + mosaic_info = struct_arr_to_dict(raw_mat['Mosaic3D']) # Load Experiment parameters - Exp, is_fiji = find_experiment_params(Mosaic3D['Exp']) + exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) # load variables from parameters - modality = Mosaic3D['modality'] - sliceidx = atleast_2d_trailing(Mosaic3D['sliceidx']) - FileNameFormat = atleast_2d_trailing(Scan['FileNameFormat']) - - indir = np.atleast_1d(Mosaic3D['indir']) - ftype = Mosaic3D['InFileType'].lower() - - # Clipping parameters - if Scan['System'] == 'Octopus': - xp, yp = Parameters['YPixClip'], Parameters['XPixClip'] - else: - xp, yp = Parameters['XPixClip'], Parameters['YPixClip'] - xp, yp = int(xp), int(yp) - flipZ = bool(Mosaic3D.get('invert_Z', True)) - - # Mosaic geometry - nb_pix = int(Exp['NbPix']) - size_row, size_column = nb_pix - xp, nb_pix - yp - X, Y = Exp['X_Mean'], Exp['Y_Mean'] - X -= np.nanmin(X) - Y -= np.nanmin(Y) - MXL = int(np.nanmax(X) + size_row) - MYL = int(np.nanmax(Y) + size_column) - MZL = int(Mosaic3D['MZL']) - - # Precompute blending ramps - dx = np.nanmedian(np.diff(X, axis=0)) - dy = np.nanmedian(np.diff(Y, axis=1)) - rx, ry = size_row - round(dx), size_column - round(dy) - xv = np.linspace(0, 1, int(rx)) - yv = np.linspace(0, 1, int(ry)) - x = np.ones(size_row) - x[:rx], x[-rx:] = xv, xv[::-1] - y = np.ones(size_column) - y[:ry], y[-ry:] = yv, yv[::-1] - Ramp2D = da.from_array(np.outer(x, y)[:, :], chunks=(size_row, size_column)) - Ramp3D = Ramp2D[...,None] - + modality = mosaic_info['modality'] + slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) + input_dirs = np.atleast_1d(mosaic_info['indir']) + file_format_template = atleast_2d_trailing(scan_info['FileNameFormat']) + file_type = mosaic_info['InFileType'].lower() + + clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) + if scan_info['System'].lower() == 'octopus': + clip_x, clip_y = clip_y, clip_x + flip_z = bool(mosaic_info.get('invert_Z', True)) + + tile_size = int(exp_params['NbPix']) + tile_width, tile_height = tile_size - clip_x, tile_size - clip_y + x_coords, y_coords = _normalize_tile_coords(exp_params['X_Mean'], exp_params['Y_Mean'], + ) + full_width = int(np.nanmax(x_coords) + tile_width) + full_height = int(np.nanmax(y_coords) + tile_height) + depth = int(mosaic_info['MZL']) + + blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) + # Map indices - MapIdx = Exp['MapIndex_Tot_offset'] + Exp['First_Tile'] - 1 - n_slices = sliceidx.shape[1] - - def build_slice(s: int) -> da.Array: - sl_in, sl_out, run = sliceidx[:, s] - base_dir = indir[run - 1] - M_acc = da.zeros((MXL, MYL,MZL), chunks=(MXL, MYL, MZL), dtype=np.float32) - W_acc = da.zeros((MXL, MYL), chunks=(MXL, MYL), dtype=np.float32) - if is_fiji: - pass - # following line is commented out in original code - # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] - - for (jj, ii), idx in np.ndenumerate(MapIdx): - if idx <= 0 or np.isnan(X[jj, ii]): - continue - r0, c0 = int(X[jj, ii]), int(Y[jj, ii]) - row_range = slice(r0, r0 + size_row) - column_range = slice(c0, c0 + size_column) - tile_id = (sl_in - 1) * int(Exp['TilesPerSlice']) + idx - - # Load data lazily - if ftype == 'nifti': - if tile_id>120: - # do not know why, from matlab code - tile_id -= 1 - path = op.join(base_dir, f"test_processed_{tile_id:03d}_cropped.nii") - header = nib.load(path) - shape = header.shape - dtype = header.get_data_dtype() - delayed_arr = dask.delayed(header.get_fdata)() - - else: - mat_path = op.join(base_dir, FileNameFormat[0,0]%tile_id) - # arr = sio.loadmat(mat_path, squeeze_me=True)[next(mat_vars(mat_path))] - # arr = da.from_array(arr, chunks='auto') - name, shape, dtype = None, None, None - for name, shape, dtype in sio.whosmat(mat_path): - if not name.startswith("__"): - break - if not name: - raise ValueError("Variable not found") - - delayed_arr = dask.delayed(load_mat)(mat_path, name) - - arr = da.from_delayed(delayed_arr, - shape=shape, - dtype=dtype) - - arr = arr.astype(np.float32) - if Scan['System'] == 'Octopus': - arr = arr.transpose((1, 0, 2)) - if flipZ: - arr = arr[:, :, ::-1] - - arr = arr[xp:, yp:, :] - - if modality == "mus" and ftype == 'nifti': - # shape (H, W, N) - I = 10.0 ** (arr / 10.0) - - # compute, for each k=0..MZL-1, the sum I[:, :, k+1:] - # via a reverse cumulative-sum trick: - # reverse along the 3rd axis → shape (H,W,N) - I_rev = I[:, :, ::-1] - # cumulative sum in reversed order → (H,W,N) - cumsum_rev = np.cumsum(I_rev, - axis=2) - # drop the very first (no “next” beyond the last) → (H,W,N-1) - sum_excl_rev = cumsum_rev[:, :,:-1] - # flip back to original order → (H,W,N-1) - sum_excl = sum_excl_rev[:, :, ::-1] - - # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) - sum_excl = sum_excl[:, :, :MZL] # keep only the first MZL sums → (H,W,MZL) - - # divide elementwise and apply the constant factors - arr = I[:, :, :MZL] / sum_excl / (2.0 * 0.0025) - - else: - arr = arr[:,:,:MZL] - M_acc[row_range, column_range, :] += arr * Ramp3D - W_acc[row_range, column_range] += Ramp2D - - # arr = arr.astype(np.float32)[None, row_range, column_range] - # Blend into accumulators - # M_acc = da.overlap.overlap(M_acc, {0: 0, 1: 0, - # 2: 0}) # no-op but ensures dask consistency - # M_acc = M_acc.map_blocks( - # lambda block, patch=arr, ramp=Ramp3D: block + patch * ramp, - # dtype=np.float32) - # W_acc = W_acc.map_blocks( - # lambda block, ramp2=Ramp2D: block + ramp2[None, :, :], - # dtype=np.float32) - - # Normalize and replace NaNs - result = M_acc / W_acc[...,None] - result = da.nan_to_num(result) - return result + map_indices = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 + num_slices = slice_indices.shape[1] # Build full volume graph - slices = [build_slice(s) for s in range(n_slices)] + slices = [build_slice(s,blend_ramp, clip_x, clip_y, full_width, full_height, depth, + exp_params, file_format_template, file_type, flip_z, + input_dirs, is_fiji, map_indices, modality, + scan_info, slice_indices, tile_width, tile_height, x_coords, + y_coords) for s in range(num_slices)] - - def stitch_slices(slices): - z_off, z_sm, z_s = Mosaic3D["z_parameters"][:3] - # z_off: every slice is going to remove this much from beginning - z_off, z_sm, z_s = int(z_off), int(z_sm), int(z_s) - z_sms = z_sm + z_s - z_m = z_sm - z_s - # --- Load one slice to get block size and build tissue profile --- - Id0 = slices[0] - - if modality.lower() == 'mus': - # (If you want the 'mus' branch, you'd need skimage.filters.threshold_multiotsu, etc.) - raise NotImplementedError("The 'mus' branch is not shown here.") - else: - # dBI: average a small tissue-only block - tissue0 = Id0[:200, :200, z_off:].mean(axis=(0, 1)) - - # only keep the next z_sms values, offset by zoff - tissue = tissue0[z_off: z_off + z_sms] - - # --- compute blending weights --- - s = tissue[z_s] / tissue[:z_s] # Top overlapping skirt - ms = tissue[z_s] / tissue[z_s: z_sms] # non-overlap + bottom skirt - - degree = 1 # both dBI and mus use degree=1 - # w1 = s * np.linspace(0, 1, z_s) ** degree - # w2 = ms[z_m:] * np.linspace(1, 0, z_s) ** degree - # w3 = ms[:z_m] - #TODO: omit the normalizing weight here for now to avoid computation - w1 = np.linspace(0, 1, z_s) ** degree - w2 = np.linspace(1, 0, z_s) ** degree - w3 = np.ones(z_m) - - row_pxblock, col_pxblock = Id0.shape[:2] - tot_z_pix = int(z_sm * n_slices) - Ma = dask.array.zeros((row_pxblock, - col_pxblock, - tot_z_pix), - dtype=np.float32) - for i in range(n_slices): - si = int(sliceidx[0, i]) # incoming slice index - print(f'\tstitching slice {i + 1}/{n_slices} (MAT idx {si:03d})') - Id = slices[i] - nx, ny, _ = Id.shape - - if s == 0: - # first slice: apply fresh data - # pattern = np.array([1, w3, w2]) # MATLAB’s [w1*0+1, w3, w2] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], # shape (1,1,3) - # (nx, ny, pattern.size)) # → (nx, ny, 3) - - W = np.concatenate([np.ones_like(w1),w3,w2]) - zr1 = np.arange(z_sms) # 0 .. z_sms-1 - zr2 = zr1 + z_off # zoff .. zoff+z_sms-1 - - elif s == n_slices-1: - # last slice: add onto bottom-most z_sm planes - # pattern = np.array([w1, w3]) # MATLAB’s [w1, w3] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], - # (nx, ny, pattern.size)) # → (nx, ny, 2) - W = np.concatenate([w1, w3, np.ones_like(w2)]) - zr1 = np.arange(z_sm) + (tot_z_pix - z_sm) # targets top of Ma’s z-axis - zr2 = np.arange(z_sm) + z_off # picks from Id - else: - # middle slices: accumulate - # pattern = np.array([w1, w3, w2]) # MATLAB’s [w1, w3, w2] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], - # (nx, ny, pattern.size)) # → (nx, ny, 3) - W = np.concatenate([w1, w3, w2]) - zr1 = np.arange(z_sms) + (s - 1) * z_sm # where to write in Ma - zr2 = np.arange(z_sms) + z_off # where to read in Id - # if i == 0: - # # first slice: only top skirt=1 + body + bottom skirt - # vec = np.concatenate([np.ones(z_s), w3, w2]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sms) - # z1 = np.arange(z_sms) - # z2 = z1 + int(z_off) - # elif i == n_slices - 1: - # # last slice: only top skirt + body - # vec = np.concatenate([w1, w3]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sm) - # z1 = np.arange(tot_z_pix - z_sm, tot_z_pix) - # z2 = int(z_off) + np.arange(z_sm) - # else: - # # middle slices: skirt/body/skirt - # vec = np.concatenate([w1, w3, w2]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sms) - # start_z = i * z_sm - # z1 = np.arange(start_z, start_z + z_sms) - # z2 = int(z_off) + np.arange(z_sms) - - Ma[:, :, zr1] += Id[:, :, zr2] * W - return Ma if len(slices) > 1: - volume = stitch_slices(slices) + volume = stack_slices(modality, mosaic_info, slice_indices, slices) else: volume = slices[0] @@ -293,38 +85,157 @@ def stitch_slices(slices): wconfig["delete_existing"] = True tswriter = ts.open(wconfig).result() - # spec = { - # 'driver': 'zarr', - # 'kvstore': {'driver': 'file', 'path': zarr_config.out}, - # 'metadata': { - # 'dtype': np.float32, - # 'shape': volume.shape, - # 'chunks': chunk, - # } - # } - # if shard: - # spec['metadata']['shard'] = shard - # volume = volume.rechunk(shard) - # else: - # volume = volume.rechunk(chunk) - # store = ts.open(spec, create=True).result() volume.store(tswriter) - # ts.copy(volume, store).result() - - # # Optional downsample - # if downsample: - # factors = tuple(int(x) for x in Mosaic3D['sxyz'][:2]) + (1,) - # down = do_downsample(volume, factors) - # ds_path = out_zarr.replace('.zarr', '_ds.zarr') - # ds_spec = {**spec, 'kvstore': {'driver':'file', 'path': ds_path}, - # 'metadata': {'shape': list(down.shape), 'chunks': list(down.chunksize)}} - # ds_store = ts.open(ds_spec, create=True).result() - # ts.copy(down, ds_store).result() - # print(f"Wrote {out_zarr} and {ds_path}") - # else: - # print(f"Wrote {out_zarr}") +def stack_slices(modality, mosaic_info, slice_indices, slices): + num_slices = len(slices) + z_off, z_sm, z_s = mosaic_info["z_parameters"][:3] + # z_off: every slice is going to remove this much from beginning + z_off, z_sm, z_s = int(z_off), int(z_sm), int(z_s) + z_sms = z_sm + z_s + z_m = z_sm - z_s + # --- Load one slice to get block size and build tissue profile --- + Id0 = slices[0] + if modality.lower() == 'mus': + # (If you want the 'mus' branch, you'd need skimage.filters.threshold_multiotsu, etc.) + raise NotImplementedError("The 'mus' branch is not shown here.") + else: + # dBI: average a small tissue-only block + tissue0 = Id0[:200, :200, z_off:].mean(axis=(0, 1)) + # only keep the next z_sms values, offset by zoff + tissue = tissue0[z_off: z_off + z_sms] + # --- compute blending weights --- + s = tissue[z_s] / tissue[:z_s] # Top overlapping skirt + ms = tissue[z_s] / tissue[z_s: z_sms] # non-overlap + bottom skirt + degree = 1 # both dBI and mus use degree=1 + # w1 = s * np.linspace(0, 1, z_s) ** degree + # w2 = ms[z_m:] * np.linspace(1, 0, z_s) ** degree + # w3 = ms[:z_m] + # TODO: omit the normalizing weight here for now to avoid computation + w1 = np.linspace(0, 1, z_s) ** degree + w2 = np.linspace(1, 0, z_s) ** degree + w3 = np.ones(z_m) + row_pxblock, col_pxblock = Id0.shape[:2] + tot_z_pix = int(z_sm * num_slices) + Ma = dask.array.zeros((row_pxblock, + col_pxblock, + tot_z_pix), + dtype=np.float32) + for i in range(num_slices): + si = int(slice_indices[0, i]) # incoming slice index + print(f'\tstitching slice {i + 1}/{num_slices} (MAT idx {si:03d})') + Id = slices[i] + nx, ny, _ = Id.shape + + if s == 0: + # first slice: apply fresh data + # pattern = np.array([1, w3, w2]) # MATLAB’s [w1*0+1, w3, w2] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], # shape (1,1,3) + # (nx, ny, pattern.size)) # → (nx, ny, 3) + + W = np.concatenate([np.ones_like(w1), w3, w2]) + zr1 = np.arange(z_sms) # 0 .. z_sms-1 + zr2 = zr1 + z_off # zoff .. zoff+z_sms-1 + + elif s == num_slices - 1: + # last slice: add onto bottom-most z_sm planes + # pattern = np.array([w1, w3]) # MATLAB’s [w1, w3] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], + # (nx, ny, pattern.size)) # → (nx, ny, 2) + W = np.concatenate([w1, w3, np.ones_like(w2)]) + zr1 = np.arange(z_sm) + (tot_z_pix - z_sm) # targets top of Ma’s z-axis + zr2 = np.arange(z_sm) + z_off # picks from Id + else: + # middle slices: accumulate + # pattern = np.array([w1, w3, w2]) # MATLAB’s [w1, w3, w2] + # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], + # (nx, ny, pattern.size)) # → (nx, ny, 3) + W = np.concatenate([w1, w3, w2]) + zr1 = np.arange(z_sms) + (s - 1) * z_sm # where to write in Ma + zr2 = np.arange(z_sms) + z_off # where to read in Id + # if i == 0: + # # first slice: only top skirt=1 + body + bottom skirt + # vec = np.concatenate([np.ones(z_s), w3, w2]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sms) + # z1 = np.arange(z_sms) + # z2 = z1 + int(z_off) + # elif i == n_slices - 1: + # # last slice: only top skirt + body + # vec = np.concatenate([w1, w3]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sm) + # z1 = np.arange(tot_z_pix - z_sm, tot_z_pix) + # z2 = int(z_off) + np.arange(z_sm) + # else: + # # middle slices: skirt/body/skirt + # vec = np.concatenate([w1, w3, w2]) + # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ + # .reshape(row_pxblock, col_pxblock, z_sms) + # start_z = i * z_sm + # z1 = np.arange(start_z, start_z + z_sms) + # z2 = int(z_off) + np.arange(z_sms) + + Ma[:, :, zr1] += Id[:, :, zr2] * W + return Ma + + +def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, depth, exp_params, + file_format_template, file_type, flip_z, input_dirs, is_fiji, + map_indices, modality, scan_info, slice_indices, tile_width, + tile_height, x_coords, y_coords): + + slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] + input_dir = input_dirs[slice_idx_run - 1] + canvas = da.zeros((full_width, full_height, depth), + chunks=(full_width, full_height, depth), dtype=np.float32) + weight = da.zeros((full_width, full_height), chunks=(full_width, full_height), + dtype=np.float32) + if is_fiji: + pass + # following line is commented out in original code + # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] + + for (index_row, index_column), tile_idx in np.ndenumerate(map_indices): + if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( + y_coords[index_row, index_column]): + continue + r0, c0 = int(x_coords[index_row, index_column]), int(y_coords[index_row, index_column]) + row_slice = slice(r0, r0 + tile_width) + col_slice = slice(c0, c0 + tile_height) + tile_id = (slice_idx_in - 1) * int(exp_params['TilesPerSlice']) + tile_idx + + # Load data lazily + if file_type == 'mat': + arr = _load_mat_tile( + op.join(input_dir, file_format_template[0, 0] % tile_id)) + elif file_type == 'nifti': + if tile_id > 120: + # do not know why, from matlab code + tile_id -= 1 + arr = _load_nifti_tile(op.join(input_dir, f"test_processed_{tile_id:03d}_cropped.nii")) + else: + raise ValueError(f"Unsupported file type: {file_type}") + + if scan_info['System'].lower() == 'octopus': + arr = np.swapaxes(arr, 0, 1) + if flip_z: + arr = arr[:, :, ::-1] + + arr = arr[clip_x:, clip_y:, :] + + if modality == "mus" and file_type == 'nifti': + arr = process_mus_nifti(arr, depth) + else: + arr = arr[:, :, :depth] + canvas[row_slice, col_slice, :] += arr * blend_ramp[..., None] + weight[row_slice, col_slice] += blend_ramp + + result = canvas / weight[..., None] + result = da.nan_to_num(result) + return result + def do_downsample(volume: da.Array, factors: tuple) -> da.Array: fx, fy, fz = factors From b9d0a44c535bcf63ed5564bbd4b0eff2b55448be Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 24 Apr 2025 16:43:59 -0400 Subject: [PATCH 024/157] merge fix --- linc_convert/utils/zarr/generate_pyramid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index b5c82051..7bfd5584 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -114,7 +114,7 @@ def generate_pyramid( windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] windowed_shape[2 * no_pyramid_axis + 1] = 1 - dat = dat.reshape(tuple(batch + windowed_shape)) + dat = dat.reshape(tuple(batch_shape + windowed_shape)) # -> last `ndim` dimensions have shape 2x2x2 dat = dat.transpose( list(range(len(batch_shape))) From d2c00e8fb17e118380de23aa00baa346f081e13f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 1 May 2025 13:55:42 -0400 Subject: [PATCH 025/157] feat: parallelization for pyramid generation --- linc_convert/utils/zarr/generate_pyramid.py | 106 ++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 7bfd5584..b716c70d 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -3,6 +3,7 @@ import math from typing import Literal, Optional +import dask.array as da import numpy as np import tqdm import zarr @@ -195,3 +196,108 @@ def get_zarray_options(base_level): opts_extra = {} opts.update(**opts_extra) return opts + + +def generate_pyramid_new( + omz: zarr.Group, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, +) -> list[list[int]]: + """ + Generate the levels of a pyramid in an existing Zarr. + + Parameters + ---------- + omz : zarr.Group + Zarr group object + levels : int + Number of additional levels to generate. + By default, stop when all dimensions are smaller than their + corresponding chunk size. + ndim : int + Number of spatial dimensions. + mode : {"mean", "median"} + Whether to use a mean or median moving window. + no_pyramid_axis : int | None + Axis that should not be downsampled. If None, downsample + across all three dimensions. + Returns + ------- + shapes : list[list[int]] + Shapes of all levels, from finest to coarsest, including the + existing top level. + """ + # Read properties from base level + base_level = omz["0"] + base_shape = list(base_level.shape) + chunk_size = base_level.chunks + opts = get_zarray_options(base_level) + + # Select windowing function + window_func = {"median": np.median, "mean": np.mean}[mode] + + batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + all_shapes = [spatial_shape] + + # Compute default number of levels based on chunk size + if levels == -1: + levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + + for lvl in tqdm.tqdm(range(1, levels + 1)): + # Compute downsampled shape + prev_shape = spatial_shape + spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + all_shapes.append(spatial_shape) + logger.info("Compute level", lvl, "with shape", spatial_shape) + + arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) + + dat = da.from_zarr(omz[str(lvl - 1)]) + dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + dat = dat.rechunk(arr.chunks) + dat.store(arr) + + return all_shapes + + +def compute_next_level(arr, ndim, no_pyramid_axis, window_func): + batch_shape, prev_shape = arr.shape[:-ndim], arr.shape[-ndim:] + batch_shape = list(batch_shape) + crop = [ + 0 if i == 1 else i % 2 for i in prev_shape] + if no_pyramid_axis is not None: + crop[no_pyramid_axis] = 0 + slcr = [slice(-1) if x else slice(None) for x in crop] + arr = arr[tuple([Ellipsis, *slcr])] + if 0 in arr.shape: + return + patch_shape = arr.shape[-ndim:] + # Reshape into patches of shape 2x2x2 + windowed_shape = [ + x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) + ] + if no_pyramid_axis is not None: + windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] + windowed_shape[2 * no_pyramid_axis + 1] = 1 + arr = arr.reshape(tuple(batch_shape + windowed_shape)) + # -> last `ndim` dimensions have shape 2x2x2 + arr = arr.transpose( + list(range(len(batch_shape))) + + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) + + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) + ) + # -> flatten patches + smaller_shape = [max(n // 2, 1) for n in patch_shape] + if no_pyramid_axis is not None: + smaller_shape[no_pyramid_axis] = patch_shape[no_pyramid_axis] + arr = arr.reshape(tuple(batch_shape + smaller_shape + [-1])) + # Compute the median/mean of each patch + dtype = arr.dtype + arr = window_func(arr, axis=-1) + arr = arr.astype(dtype) + return arr + + + From 5589d909d814c509005d38c332f3a2f38b153d68 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 15 May 2025 17:01:15 -0400 Subject: [PATCH 026/157] wip: psoct --- linc_convert/modalities/psoct/mosaic2d.py | 71 +++++++++++----- linc_convert/modalities/psoct/mosaic3d.py | 98 ++++++++++++++++------- 2 files changed, 118 insertions(+), 51 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index 532ce170..adad8a83 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -31,6 +31,7 @@ def mosaic2d_telesto( *, modality: str, method: str = None, + tilted_illumination: bool = False, tiff_output_dir: str = None, zarr_config: ZarrConfig = None, ) -> None: @@ -44,6 +45,7 @@ def mosaic2d_telesto( """ logger.info(f"--Modality is {modality}--") + tilt_postfix = '_tilt' if tilted_illumination else '' # Load .mat containing Parameters, Scan, and Mosaic2D raw_mat = sio.loadmat(parameter_file, squeeze_me=True) @@ -57,6 +59,7 @@ def mosaic2d_telesto( file_format_template = mosaic_info['file_format'] file_type = mosaic_info['InFileType'].lower() transpose_needed = bool(params['transpose']) + no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) if scan_info['System'].lower() == 'octopus': @@ -64,9 +67,11 @@ def mosaic2d_telesto( tile_size = int(exp_params['NbPix']) tile_width, tile_height = tile_size - clip_x, tile_size - clip_y + if tilted_illumination: + tile_width = int(exp_params['NbPix' + tilt_postfix]) - clip_x x_coords, y_coords = _normalize_tile_coords( - exp_params[method]['X_Mean'] if method else exp_params['X_Mean'], - exp_params[method]['Y_Mean'] if method else exp_params['Y_Mean'], + exp_params[method]['X_Mean'] if method else exp_params['X_Mean' + tilt_postfix], + exp_params[method]['Y_Mean'] if method else exp_params['Y_Mean' + tilt_postfix], ) full_width = int(np.nanmax(x_coords) + tile_width) full_height = int(np.nanmax(y_coords) + tile_height) @@ -78,7 +83,8 @@ def mosaic2d_telesto( tiff_output_dir = None modality_token = _select_modality_token(raw_mat, modality) - map_indices = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 + map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params[ + 'First_Tile' + tilt_postfix] - 1 num_slices = slice_indices.shape[1] slices = [ @@ -91,13 +97,18 @@ def mosaic2d_telesto( full_width=full_width, full_height=full_height, depth=depth, x_coords=x_coords, y_coords=y_coords, clip_x=clip_x, clip_y=clip_y, transpose_needed=transpose_needed, tiff_output_dir=tiff_output_dir, - gray_range=gray_range) for s in + gray_range=gray_range, tilted_illumination=tilted_illumination, + no_tilted_illumination_scan = no_tilted_illumination_scan) for s in range(num_slices)] arr = da.stack(slices,axis=-1) - + #TODO: stack 2d -> nifti = arr.rot90.swapaxes(0,1) chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) - write_cfg = default_write_config(zarr_config.out, arr.shape, dtype=np.float32, + write_cfg = default_write_config(op.join(zarr_config.out, '0'), arr.shape, dtype=np.float32, chunk=chunk, shard=shard) + if shard: + arr = da.rechunk(arr,chunks=shard) + else: + arr = da.rechunk(arr,chunks=chunk) write_cfg["create"] = True write_cfg["delete_existing"] = True @@ -111,9 +122,15 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, file_format_template, file_type, modality, modality_token, blend_ramp, map_indices, tile_width, tile_height, full_width, full_height, depth, x_coords, y_coords, clip_x, clip_y, transpose_needed, tiff_output_dir, - gray_range): + gray_range, tilted_illumination, no_tilted_illumination_scan): lower_mod = modality.lower() slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] + mosaic_idx = 2 * slice_idx + 1 + if tilted_illumination: + mosaic_idx += 1 + if no_tilted_illumination_scan: + mosaic_idx = slice_idx_in + input_dir = input_dirs[int(slice_idx_run) - 1] file_path_template = op.join(input_dir, file_format_template) canvas = da.zeros((full_width, full_height, depth), dtype=np.float32, @@ -127,18 +144,18 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, c0 = int(y_coords[index_row, index_column]) row_slice = slice(r0, r0 + tile_width) col_slice = slice(c0, c0 + tile_height) - tile_id = (slice_idx_in - 1) * int(exp_params['TilesPerSlice']) + tile_idx + tile_id = tile_idx if file_type == 'mat': arr = _load_mat_tile( - get_volname(file_path_template, tile_id, modality_token)) + get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) elif file_type == 'nifti': if modality == "mus": arr = _load_nifti_tile( - get_volname(file_path_template, tile_id, "cropped")) + get_volname(file_path_template, mosaic_idx, tile_id, "cropped")) else: arr = _load_nifti_tile( - get_volname(file_path_template, tile_id, modality_token)) + get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) else: raise ValueError(f"Unsupported file type: {file_type}") @@ -151,6 +168,8 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, if modality == "mus" and file_type == 'nifti': # TODO: is this necessary in Mosaic2D? # as total_depth will be 1 and we will crop 1 depth + # TODO: in the updated version, it was said 2d mus is not updated yet so skip it + raise NotImplementedError arr = process_mus_nifti(arr, depth) if lower_mod == 'orientation': @@ -166,6 +185,7 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, canvas /= weight[:, :, None] + tilt_postfix = '_tilt' if tilted_illumination else '' if lower_mod == 'orientation': print("Starting orientation angles eigen decomp...") h, w = canvas.shape[:2] @@ -188,7 +208,7 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, canvas, in_range=gray_range if gray_range is not None else 'image') imageio.imwrite( - op.join(tiff_output_dir, f"{modality}_slice{1:03d}.tiff"), + op.join(tiff_output_dir, f"{modality}{tilt_postfix}_slice{slice_idx_out:03d}.tiff"), (normed * 255).astype(np.uint8)) # ref = loadmat(op.join( @@ -204,7 +224,9 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, def _load_nifti_tile(path: str) -> da.Array: - img = nib.load(path) + img = nib.load(path,mmap=True) + # return da.from_delayed(dask.delayed(img.dataobj), shape=img.shape, dtype=img.get_data_dtype()) + return da.from_array(img.dataobj) delayed = dask.delayed(img.get_fdata)() return da.from_delayed(delayed, shape=img.shape, dtype=img.get_data_dtype()) @@ -229,12 +251,15 @@ def _compute_blending_ramp( dx = np.nanmedian(np.diff(x_coords, axis=0)) dy = np.nanmedian(np.diff(y_coords, axis=1)) rx, ry = tile_width - round(dx), tile_height - round(dy) + xv = np.linspace(0, 1, rx) yv = np.linspace(0, 1, ry) wx = np.ones(tile_width) wy = np.ones(tile_height) - wx[:rx], wx[-rx:] = xv, xv[::-1] - wy[:ry], wy[-ry:] = yv, yv[::-1] + if rx > 0: + wx[:rx], wx[-rx:] = xv, xv[::-1] + if ry > 0: + wy[:ry], wy[-ry:] = yv, yv[::-1] ramp = da.from_array(np.outer(wx, wy)[:, :], chunks=(tile_width, tile_height)) return ramp @@ -255,6 +280,7 @@ def _get_gray_range( 'aip': 'AipGrayRange', 'mip': 'MipGrayRange', 'retardance': 'RetGrayRange', + 'birefringence': 'BirefGrayRange', 'mus': 'musGrayRange', 'surf': 'surfGrayRange', } @@ -277,13 +303,13 @@ def _select_modality_token(raw_mat: dict[str, any], modality: str) -> str: """ Choose the filename token matching the modality from Enface.inputstr. """ - candidates = list(raw_mat['Enface']['inputstr'].item()) + candidates = list(raw_mat['Enface']['save'].item()) prefix = modality[:3].lower() for token in candidates: if prefix in token.lower(): return token logger.warning( - f"Modality '{modality}' not found in inputstr; using first 3 letters." + f"Modality '{modality}' not found in Enface.save; using first 3 letters." ) return modality[:3] @@ -313,7 +339,9 @@ def get_rgb_4d(ori, value_range): rgb = (rgb * 255).astype(np.uint8) return rgb -def get_volname(base_file_name: str, num: int, modality: str) -> str: + +def get_volname(base_file_name: str, mosaic_num: int, tile_num: int, + modality: str) -> str: """ Generate a volume name by replacing placeholders in the base file name. @@ -329,9 +357,10 @@ def get_volname(base_file_name: str, num: int, modality: str) -> str: Returns: str: The formatted volume name with placeholders replaced. """ - vol_name = base_file_name - vol_name = vol_name.replace("%tileID", f"{num:03d}") - vol_name = vol_name.replace("%modality", modality) + # vol_name = base_file_name + # vol_name = vol_name.replace("%tileID", f"{num:03d}") + vol_name = base_file_name % (mosaic_num, tile_num) + vol_name = vol_name.replace("[modality]", modality) return vol_name diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 7f97a744..57b8af5f 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -1,5 +1,6 @@ import logging import os.path as op +import warnings import cyclopts import dask.array as da @@ -8,10 +9,12 @@ import numpy as np import scipy.io as sio import tensorstore as ts +import tqdm from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ - _compute_blending_ramp, process_mus_nifti, _load_mat_tile, _load_nifti_tile + _compute_blending_ramp, process_mus_nifti, _load_mat_tile, _load_nifti_tile, \ + get_volname from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ find_experiment_params, atleast_2d_trailing, load_mat from linc_convert.modalities.psoct.utils._zarr import default_write_config @@ -27,11 +30,14 @@ def mosaic3d_telesto( parameter_file: str, *, + modality:str, + tilted_illumination: bool = False, downsample: bool = False, use_gpu: bool = False, zarr_config: ZarrConfig = None, ) -> None: - + logger.info(f"modality is {modality}") + tilt_postfix = '_tilt' if tilted_illumination else '' # Load parameters raw_mat = sio.loadmat(parameter_file, squeeze_me=True) params = struct_arr_to_dict(raw_mat['Parameters']) @@ -41,10 +47,10 @@ def mosaic3d_telesto( exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) # load variables from parameters - modality = mosaic_info['modality'] + # modality = mosaic_info['modality'] slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) input_dirs = np.atleast_1d(mosaic_info['indir']) - file_format_template = atleast_2d_trailing(scan_info['FileNameFormat']) + file_path_template = mosaic_info['file_format'] file_type = mosaic_info['InFileType'].lower() clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) @@ -54,33 +60,55 @@ def mosaic3d_telesto( tile_size = int(exp_params['NbPix']) tile_width, tile_height = tile_size - clip_x, tile_size - clip_y - x_coords, y_coords = _normalize_tile_coords(exp_params['X_Mean'], exp_params['Y_Mean'], + if tilted_illumination: + tile_width = int(exp_params['NbPix' + tilt_postfix]) - clip_x + x_coords, y_coords = _normalize_tile_coords(exp_params['X_Mean' + tilt_postfix], exp_params['Y_Mean' + tilt_postfix], ) full_width = int(np.nanmax(x_coords) + tile_width) full_height = int(np.nanmax(y_coords) + tile_height) depth = int(mosaic_info['MZL']) blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) - + + modality_base = raw_mat['Processed3D']['save'].item().flatten() + substr = modality[:3] + matches = [s for s in modality_base if substr.lower() in str(s).lower()] + if matches: + modality_token = matches[0] + else: + modality_token = substr + warnings.warn( + f"{modality} (current) modality is not included in Enface struct. " + "Mosaic3D might fail." + ) + + # Map indices - map_indices = exp_params['MapIndex_Tot_offset'] + exp_params['First_Tile'] - 1 + map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params['First_Tile' + tilt_postfix] - 1 num_slices = slice_indices.shape[1] + no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' # Build full volume graph slices = [build_slice(s,blend_ramp, clip_x, clip_y, full_width, full_height, depth, - exp_params, file_format_template, file_type, flip_z, - input_dirs, is_fiji, map_indices, modality, + exp_params, file_path_template, file_type, flip_z, + input_dirs, is_fiji, map_indices, modality, modality_token, scan_info, slice_indices, tile_width, tile_height, x_coords, - y_coords) for s in range(num_slices)] - - if len(slices) > 1: - volume = stack_slices(modality, mosaic_info, slice_indices, slices) - else: - volume = slices[0] + y_coords, tilted_illumination, no_tilted_illumination_scan) for s in range(num_slices)] + # if len(slices) > 1: + # volume = stack_slices(modality, mosaic_info, slice_indices, slices) + # else: + # volume = slices[0] + volume= slices[0] chunk, shard = compute_zarr_layout(volume.shape, volume.dtype, zarr_config) - wconfig = default_write_config(zarr_config.out,volume.shape,dtype = np.float32, chunk=chunk,shard=shard) + + if shard: + volume = da.rechunk(volume,chunks=shard) + else: + volume = da.rechunk(volume,chunks=chunk) + + wconfig = default_write_config(op.join(zarr_config.out, '0'),shape=volume.shape,dtype = np.float32, chunk=chunk,shard=shard) wconfig["create"] = True wconfig["delete_existing"] = True @@ -89,6 +117,7 @@ def mosaic3d_telesto( def stack_slices(modality, mosaic_info, slice_indices, slices): + return da.concatenate(slices, axis=2) num_slices = len(slices) z_off, z_sm, z_s = mosaic_info["z_parameters"][:3] # z_off: every slice is going to remove this much from beginning @@ -182,39 +211,47 @@ def stack_slices(modality, mosaic_info, slice_indices, slices): def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, depth, exp_params, - file_format_template, file_type, flip_z, input_dirs, is_fiji, - map_indices, modality, scan_info, slice_indices, tile_width, - tile_height, x_coords, y_coords): + file_path_template, file_type, flip_z, input_dirs, is_fiji, + map_indices, modality, modality_token, scan_info, slice_indices, tile_width, + tile_height, x_coords, y_coords, tilted_illumination, no_tilted_illumination_scan): slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] + + mosaic_idx = 2 * slice_idx + 1 + if tilted_illumination: + mosaic_idx += 1 + if no_tilted_illumination_scan: + mosaic_idx = slice_idx_in + input_dir = input_dirs[slice_idx_run - 1] + canvas = da.zeros((full_width, full_height, depth), - chunks=(full_width, full_height, depth), dtype=np.float32) - weight = da.zeros((full_width, full_height), chunks=(full_width, full_height), + chunks=(tile_width*2, tile_height*2, depth), dtype=np.float32) + weight = da.zeros((full_width, full_height), chunks=(tile_width*2, tile_height*2), dtype=np.float32) + # canvas = da.zeros((full_width, full_height, depth), + # chunks=(full_width, full_height, depth), dtype=np.float32) + # weight = da.zeros((full_width, full_height), chunks=(full_width, full_height), + # dtype=np.float32) if is_fiji: pass # following line is commented out in original code # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] - - for (index_row, index_column), tile_idx in np.ndenumerate(map_indices): + file_path_template = op.join(input_dir, file_path_template) + for (index_row, index_column), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( y_coords[index_row, index_column]): continue r0, c0 = int(x_coords[index_row, index_column]), int(y_coords[index_row, index_column]) row_slice = slice(r0, r0 + tile_width) col_slice = slice(c0, c0 + tile_height) - tile_id = (slice_idx_in - 1) * int(exp_params['TilesPerSlice']) + tile_idx + tile_id = tile_idx # Load data lazily if file_type == 'mat': - arr = _load_mat_tile( - op.join(input_dir, file_format_template[0, 0] % tile_id)) + arr = _load_mat_tile(get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) elif file_type == 'nifti': - if tile_id > 120: - # do not know why, from matlab code - tile_id -= 1 - arr = _load_nifti_tile(op.join(input_dir, f"test_processed_{tile_id:03d}_cropped.nii")) + arr = _load_nifti_tile(get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) else: raise ValueError(f"Unsupported file type: {file_type}") @@ -226,6 +263,7 @@ def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, arr = arr[clip_x:, clip_y:, :] if modality == "mus" and file_type == 'nifti': + raise NotImplementedError("mus 3d stitching not updated") arr = process_mus_nifti(arr, depth) else: arr = arr[:, :, :depth] From 382181fad5c2ac12f333834259de1e6c265545b2 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 21 May 2025 15:12:36 -0400 Subject: [PATCH 027/157] wip: psoct --- linc_convert/modalities/psoct/mosaic2d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index adad8a83..cdc424e6 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -125,7 +125,7 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, gray_range, tilted_illumination, no_tilted_illumination_scan): lower_mod = modality.lower() slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] - mosaic_idx = 2 * slice_idx + 1 + mosaic_idx = 2 * slice_idx_in - 1 if tilted_illumination: mosaic_idx += 1 if no_tilted_illumination_scan: From 5778ce63e09f1b5c46a68f64e3375fead9aaebf6 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 22 May 2025 10:32:53 -0400 Subject: [PATCH 028/157] wip: psoct --- linc_convert/modalities/psoct/mosaic3d.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 57b8af5f..fe019e85 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -217,7 +217,7 @@ def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] - mosaic_idx = 2 * slice_idx + 1 + mosaic_idx = 2 * slice_idx_in - 1 if tilted_illumination: mosaic_idx += 1 if no_tilted_illumination_scan: @@ -229,16 +229,13 @@ def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, chunks=(tile_width*2, tile_height*2, depth), dtype=np.float32) weight = da.zeros((full_width, full_height), chunks=(tile_width*2, tile_height*2), dtype=np.float32) - # canvas = da.zeros((full_width, full_height, depth), - # chunks=(full_width, full_height, depth), dtype=np.float32) - # weight = da.zeros((full_width, full_height), chunks=(full_width, full_height), - # dtype=np.float32) if is_fiji: pass # following line is commented out in original code # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] file_path_template = op.join(input_dir, file_path_template) for (index_row, index_column), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( y_coords[index_row, index_column]): continue From 2b4dc36c653057d9092b47bcf271be946e3ed6bd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 29 May 2025 16:01:31 -0400 Subject: [PATCH 029/157] wip: psoct, sum in loop --- linc_convert/modalities/psoct/mosaic3d.py | 349 +++++++++++++++------- 1 file changed, 246 insertions(+), 103 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index fe019e85..e5a59888 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -1,22 +1,23 @@ import logging import os.path as op import warnings +from typing import Annotated import cyclopts -import dask.array as da import dask +import dask.array as da import nibabel as nib import numpy as np import scipy.io as sio import tensorstore as ts import tqdm +from cyclopts import Parameter from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ - _compute_blending_ramp, process_mus_nifti, _load_mat_tile, _load_nifti_tile, \ - get_volname + _compute_blending_ramp, _load_mat_tile, _load_nifti_tile from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ - find_experiment_params, atleast_2d_trailing, load_mat + find_experiment_params, atleast_2d_trailing from linc_convert.modalities.psoct.utils._zarr import default_write_config from linc_convert.utils.zarr.create_array import compute_zarr_layout from linc_convert.utils.zarr.zarr_config import ZarrConfig @@ -25,18 +26,31 @@ mosaic3d = cyclopts.App(name="mosaic3d", help_format="markdown") psoct.command(mosaic3d) +# 3d data has pixdim incorrectly set and cause nibabel keep logging warning +nib.imageglobals.logger.setLevel(40) @mosaic3d.default def mosaic3d_telesto( parameter_file: str, *, - modality:str, + dbi_output: Annotated[str, Parameter(name=["--dBI", "-d"])], + o3d_output: Annotated[str, Parameter(name=["--O3D", "-o"])], + r3d_output: Annotated[str, Parameter(name=["--R3D", "-r"])], tilted_illumination: bool = False, downsample: bool = False, use_gpu: bool = False, zarr_config: ZarrConfig = None, ) -> None: - logger.info(f"modality is {modality}") + """ + Parameters + ---------- + dbi_output : str + Output path for dBI volume. + o3d_output : str + Output path for O3D volume. + r3d_output : str + Output path for R3D volume. + """ tilt_postfix = '_tilt' if tilted_illumination else '' # Load parameters raw_mat = sio.loadmat(parameter_file, squeeze_me=True) @@ -70,53 +84,250 @@ def mosaic3d_telesto( blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) - modality_base = raw_mat['Processed3D']['save'].item().flatten() - substr = modality[:3] - matches = [s for s in modality_base if substr.lower() in str(s).lower()] - if matches: - modality_token = matches[0] - else: - modality_token = substr - warnings.warn( - f"{modality} (current) modality is not included in Enface struct. " - "Mosaic3D might fail." - ) - - # Map indices map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params['First_Tile' + tilt_postfix] - 1 num_slices = slice_indices.shape[1] no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' + + focus = _load_nifti_tile(scan_info['FocusFile'] + tilt_postfix) + raw_tile_width = int(scan_info['NbPixels' + tilt_postfix]) # Build full volume graph - slices = [build_slice(s,blend_ramp, clip_x, clip_y, full_width, full_height, depth, - exp_params, file_path_template, file_type, flip_z, - input_dirs, is_fiji, map_indices, modality, modality_token, - scan_info, slice_indices, tile_width, tile_height, x_coords, - y_coords, tilted_illumination, no_tilted_illumination_scan) for s in range(num_slices)] + slices = [build_slice(s, blend_ramp, clip_x, clip_y, full_width, full_height, depth, + flip_z, is_fiji, map_indices, scan_info, slice_indices, + tile_width, tile_height, x_coords, y_coords, + tilted_illumination, no_tilted_illumination_scan, focus, + raw_tile_width) for s in range(1)] # num_slices)] # if len(slices) > 1: - # volume = stack_slices(modality, mosaic_info, slice_indices, slices) + # volume = stack_slices(mosaic_info, slice_indices, slices) # else: # volume = slices[0] volume= slices[0] - chunk, shard = compute_zarr_layout(volume.shape, volume.dtype, zarr_config) + chunk, shard = compute_zarr_layout(volume[0].shape, volume[0].dtype, zarr_config) + writers = [] + results = [] + for out, res in zip([dbi_output, r3d_output, o3d_output], volume): - if shard: - volume = da.rechunk(volume,chunks=shard) + if shard: + res = da.rechunk(res, chunks=shard) + else: + res = da.rechunk(res, chunks=chunk) + wconfig = default_write_config(op.join(out, '0'), shape=res.shape, + dtype=np.float32, chunk=chunk, shard=shard) + wconfig["create"] = True + wconfig["delete_existing"] = True + tswriter = ts.open(wconfig).result() + # tswriter = da.from_array(tswriter, chunks=res.chunks) + writers.append(tswriter) + results.append(res) + task = da.store(results, writers, compute=False) + # task.visualize(filename="dag.svg", format="svg") + task.compute() + # Store the volumes + # writer = da.stack(writers, axis=0) + # result = da.stack(results, axis=0) + # result.store(writer, lock=False, compute=True) + + # + # tswriter = ts.open(wconfig).result() + # volume.store(tswriter) + +def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, depth, + flip_z, is_fiji, map_indices, scan_info, slice_indices, tile_width, + tile_height, x_coords, y_coords, tilted_illumination, + no_tilted_illumination_scan, focus, raw_tile_width): + raw_data_dir = scan_info['RawDataDir'] + input_file_format = scan_info['FileNameFormat'] + if '.nii' in input_file_format: + file_type = 'nifti' + elif '.mat' in input_file_format: + file_type = 'mat' else: - volume = da.rechunk(volume,chunks=chunk) + raise ValueError(f"Unsupported file type: {input_file_format}") + + file_prefix = [s for s in np.atleast_1d(scan_info['FilePrefix']) if + 'cropped' in str(s).lower()] + if file_prefix: + file_prefix = file_prefix[0] + else: + raise ValueError("No complex file prefix found in scan_info['FilePrefix']") + + slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] + + mosaic_idx = 2 * slice_idx_in - 1 + if tilted_illumination: + mosaic_idx += 1 + if no_tilted_illumination_scan: + mosaic_idx = slice_idx_in + + dBI_canvas, R3D_canvas, O3D_canvas = [da.zeros((full_width, full_height, depth), + chunks=( + tile_width * 2, tile_height * 2, + depth), dtype=np.float32) for _ in + range(3)] + canvas = da.zeros((full_width, full_height, depth,3), chunks=( + tile_width, tile_height, + depth, 3), dtype=np.float32) + weight = da.zeros((full_width, full_height), chunks=(tile_width, tile_height), + dtype=np.float32) + if is_fiji: + pass + # following line is commented out in original code + # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] + + dBI_record, R3D_record, O3D_record, weight_record = [], [], [], [] + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_name = input_file_format % (mosaic_idx, tile_idx) + input_file_name = input_file_name.replace('[modality]', file_prefix) + input_file_path = op.join(raw_data_dir, input_file_name) + + if file_type == 'mat': + complex3d = _load_mat_tile(input_file_path) + elif file_type == 'nifti': + complex3d = _load_nifti_tile(input_file_path) + + + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + results = da.stack([dBI3D, R3D, O3D], axis=3) + results = results[clip_x:, clip_y:]*blend_ramp[:,:,None,None] + + canvas[row_slice, col_slice] += results + weight[row_slice, col_slice] += blend_ramp + + # + # if mosaic_idx > 8 and tilted_illumination: + # Nz = depth + # # 1) build a mask of pixels needing correction + # mask_crop = focus <= scan_info['Focus_CropStart'] # (Ny, Nx) + # + # # 2) find, for each (y,x), the last index along z where dBI3D == -inf + # mask_inf = np.isneginf(dBI3D) # (Ny, Nx, Nz) + # depth_idx = np.arange(Nz)[None, None, :] # (1, 1, Nz) + # last_inf = np.max(np.where(mask_inf, depth_idx, -1), axis=2) + # # last_inf[y,x] is -1 if there was no -inf, or the maximum index otherwise + # + # # 3) decide which pixels actually get shifted + # do_shift = (mask_crop & (last_inf >= 0)) # (Ny, Nx) + # + # # 4) build the "shifted" index array for every (y,x,z) + # # new_idx[y,x,z] = last_inf[y,x] + z + # new_idx = last_inf[..., None] + depth_idx # (Ny, Nx, Nz) + # + # # 5) clip to valid range so we can safely gather, + # # then gather each volume + # clipped = np.clip(new_idx, 0, Nz - 1) + # dBI3D_shift = np.take_along_axis(dBI3D, clipped, axis=2) + # R3D_shift = np.take_along_axis(R3D, clipped, axis=2) + # O3D_shift = np.take_along_axis(O3D, clipped, axis=2) + # + # # 6) zero-out any positions that “fell off the end” (new_idx >= Nz) + # overflow = new_idx >= Nz + # dBI3D_shift[overflow] = 0 + # R3D_shift[overflow] = 0 + # O3D_shift[overflow] = 0 + # + # # 7) select per-pixel whether to keep the original or use the shifted version + # dBI3D = np.where(do_shift[..., None], dBI3D_shift, dBI3D) + # R3D = np.where(do_shift[..., None], R3D_shift, R3D) + # O3D = np.where(do_shift[..., None], O3D_shift, O3D) + # + # for arr, canvas in zip([dBI3D, R3D, O3D], [dBI_record, R3D_record, O3D_record]): + # if scan_info['System'].lower() == 'octopus': + # arr = np.swapaxes(arr, 0, 1) + # if flip_z: + # arr = arr[:, :, ::-1] + # arr = arr[clip_x:, clip_y:] + # if modality == "mus" and file_type == 'nifti': + # raise NotImplementedError("mus 3d stitching not updated") + # arr = process_mus_nifti(arr, depth) + # else: + # arr = arr[:, :, :depth] + # arr *= blend_ramp[..., None] + + # + # adding = da.zeros_like(dBI_canvas) + # adding[row_slice, col_slice, :] = + # canvas.append(adding) + # + # adding = da.zeros_like(weight) + # adding[row_slice, col_slice] = blend_ramp + # weight_record.append(adding) + + + # dBI_canvas = da.sum(da.stack(dBI_record, axis=0), axis=0) + # R3D_canvas = da.sum(da.stack(R3D_record, axis=0), axis=0) + # O3D_canvas = da.sum(da.stack(O3D_record, axis=0), axis=0) + # weight = da.sum(da.stack(weight_record, axis=0), axis=0) + # Normalize the canvases by the weight + # dBI_canvas /= weight[..., None] + # R3D_canvas /= weight[..., None] + # O3D_canvas /= weight[..., None] + # dBI_canvas = da.nan_to_num(dBI_canvas) + # R3D_canvas = da.nan_to_num(R3D_canvas) + # O3D_canvas = da.nan_to_num(O3D_canvas) + canvas /= weight[..., None, None] + canvas = canvas.rechunk({3:1}) + dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + return [dBI_canvas, R3D_canvas, O3D_canvas] + + +def process_complex3d(complex3d, raw_tile_width): + complex3d = complex3d.rechunk({0:raw_tile_width}) + comp = complex3d.reshape( + (4, raw_tile_width, complex3d.shape[1], complex3d.shape[2])) + j1r, j1i, j2r, j2i = comp[0], comp[1], comp[2], comp[3] + + j1 = j1r + 1j * j1i + j2 = j2r + 1j * j2i + mag1 = da.abs(j1) + mag2 = da.abs(j2) + + dBI3D = da.flip(10 * da.log10(mag1**2 + mag2**2), axis=2) + R3D = da.flip( + da.arctan(mag1 / mag2) / da.pi * 180, + axis=2 + ) + offset = 100 / 180 * da.pi + phi = da.angle(j1) - da.angle(j2) + offset * 2 + # wrap into [-π, π] + phi = da.where(phi > da.pi, phi - 2 * da.pi, phi) + phi = da.where(phi < -da.pi, phi + 2 * da.pi, phi) + O3D = da.flip(phi / (2 * da.pi) * 180, axis=2) + + return dBI3D, R3D, O3D + + +def do_downsample(volume: da.Array, factors: tuple) -> da.Array: + fx, fy, fz = factors + return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) - wconfig = default_write_config(op.join(zarr_config.out, '0'),shape=volume.shape,dtype = np.float32, chunk=chunk,shard=shard) - wconfig["create"] = True - wconfig["delete_existing"] = True - tswriter = ts.open(wconfig).result() - volume.store(tswriter) -def stack_slices(modality, mosaic_info, slice_indices, slices): +def stack_slices(mosaic_info, slice_indices, slices): return da.concatenate(slices, axis=2) num_slices = len(slices) z_off, z_sm, z_s = mosaic_info["z_parameters"][:3] @@ -209,71 +420,3 @@ def stack_slices(modality, mosaic_info, slice_indices, slices): Ma[:, :, zr1] += Id[:, :, zr2] * W return Ma - -def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, depth, exp_params, - file_path_template, file_type, flip_z, input_dirs, is_fiji, - map_indices, modality, modality_token, scan_info, slice_indices, tile_width, - tile_height, x_coords, y_coords, tilted_illumination, no_tilted_illumination_scan): - - slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] - - mosaic_idx = 2 * slice_idx_in - 1 - if tilted_illumination: - mosaic_idx += 1 - if no_tilted_illumination_scan: - mosaic_idx = slice_idx_in - - input_dir = input_dirs[slice_idx_run - 1] - - canvas = da.zeros((full_width, full_height, depth), - chunks=(tile_width*2, tile_height*2, depth), dtype=np.float32) - weight = da.zeros((full_width, full_height), chunks=(tile_width*2, tile_height*2), - dtype=np.float32) - if is_fiji: - pass - # following line is commented out in original code - # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] - file_path_template = op.join(input_dir, file_path_template) - for (index_row, index_column), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - - if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( - y_coords[index_row, index_column]): - continue - r0, c0 = int(x_coords[index_row, index_column]), int(y_coords[index_row, index_column]) - row_slice = slice(r0, r0 + tile_width) - col_slice = slice(c0, c0 + tile_height) - tile_id = tile_idx - - # Load data lazily - if file_type == 'mat': - arr = _load_mat_tile(get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) - elif file_type == 'nifti': - arr = _load_nifti_tile(get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) - else: - raise ValueError(f"Unsupported file type: {file_type}") - - if scan_info['System'].lower() == 'octopus': - arr = np.swapaxes(arr, 0, 1) - if flip_z: - arr = arr[:, :, ::-1] - - arr = arr[clip_x:, clip_y:, :] - - if modality == "mus" and file_type == 'nifti': - raise NotImplementedError("mus 3d stitching not updated") - arr = process_mus_nifti(arr, depth) - else: - arr = arr[:, :, :depth] - canvas[row_slice, col_slice, :] += arr * blend_ramp[..., None] - weight[row_slice, col_slice] += blend_ramp - - result = canvas / weight[..., None] - result = da.nan_to_num(result) - return result - - -def do_downsample(volume: da.Array, factors: tuple) -> da.Array: - fx, fy, fz = factors - return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) - - From e66b7e477adff06fadc1647b2c9256cc0672ab0b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 5 Jun 2025 10:31:43 -0400 Subject: [PATCH 030/157] wip: psoct --- linc_convert/modalities/psoct/mosaic2d.py | 10 +- linc_convert/modalities/psoct/mosaic3d.py | 279 ++++++++------------ linc_convert/utils/zarr/generate_pyramid.py | 2 +- 3 files changed, 122 insertions(+), 169 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index cdc424e6..5335cbee 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -224,9 +224,9 @@ def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, def _load_nifti_tile(path: str) -> da.Array: - img = nib.load(path,mmap=True) + img = nib.load(path, mmap=True) # return da.from_delayed(dask.delayed(img.dataobj), shape=img.shape, dtype=img.get_data_dtype()) - return da.from_array(img.dataobj) + return da.from_array(img.dataobj, chunks=img.shape) delayed = dask.delayed(img.get_fdata)() return da.from_delayed(delayed, shape=img.shape, dtype=img.get_data_dtype()) @@ -238,6 +238,12 @@ def _load_mat_tile(path: str) -> da.Array: delayed = dask.delayed(load_mat)(path, var_name) return da.from_delayed(delayed, shape=shape, dtype=dtype) +def _load_tile(path:str): + if path.endswith('.mat'): + return _load_mat_tile(path) + if path.endswith('.nii' or '.nii.gz'): + return _load_nifti_tile(path) + raise ValueError(f"Unsupported file type: {path}") def _compute_blending_ramp( tile_width: int, diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index e5a59888..1b06918b 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -11,16 +11,19 @@ import scipy.io as sio import tensorstore as ts import tqdm +import zarr from cyclopts import Parameter from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ - _compute_blending_ramp, _load_mat_tile, _load_nifti_tile + _compute_blending_ramp, _load_mat_tile, _load_nifti_tile, _load_tile from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ find_experiment_params, atleast_2d_trailing from linc_convert.modalities.psoct.utils._zarr import default_write_config from linc_convert.utils.zarr.create_array import compute_zarr_layout +from linc_convert.utils.zarr.generate_pyramid import generate_pyramid_new from linc_convert.utils.zarr.zarr_config import ZarrConfig +from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata logger = logging.getLogger(__name__) mosaic3d = cyclopts.App(name="mosaic3d", help_format="markdown") @@ -33,6 +36,7 @@ def mosaic3d_telesto( parameter_file: str, *, + slice_index: int, dbi_output: Annotated[str, Parameter(name=["--dBI", "-d"])], o3d_output: Annotated[str, Parameter(name=["--O3D", "-o"])], r3d_output: Annotated[str, Parameter(name=["--R3D", "-r"])], @@ -51,21 +55,15 @@ def mosaic3d_telesto( r3d_output : str Output path for R3D volume. """ + logger.info("started") tilt_postfix = '_tilt' if tilted_illumination else '' # Load parameters raw_mat = sio.loadmat(parameter_file, squeeze_me=True) params = struct_arr_to_dict(raw_mat['Parameters']) scan_info = struct_arr_to_dict(raw_mat['Scan']) mosaic_info = struct_arr_to_dict(raw_mat['Mosaic3D']) - # Load Experiment parameters exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) - - # load variables from parameters - # modality = mosaic_info['modality'] slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) - input_dirs = np.atleast_1d(mosaic_info['indir']) - file_path_template = mosaic_info['file_format'] - file_type = mosaic_info['InFileType'].lower() clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) if scan_info['System'].lower() == 'octopus': @@ -84,102 +82,116 @@ def mosaic3d_telesto( blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) - # Map indices map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params['First_Tile' + tilt_postfix] - 1 - num_slices = slice_indices.shape[1] no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' focus = _load_nifti_tile(scan_info['FocusFile'] + tilt_postfix) raw_tile_width = int(scan_info['NbPixels' + tilt_postfix]) - # Build full volume graph - slices = [build_slice(s, blend_ramp, clip_x, clip_y, full_width, full_height, depth, - flip_z, is_fiji, map_indices, scan_info, slice_indices, - tile_width, tile_height, x_coords, y_coords, - tilted_illumination, no_tilted_illumination_scan, focus, - raw_tile_width) for s in range(1)] # num_slices)] - - # if len(slices) > 1: - # volume = stack_slices(mosaic_info, slice_indices, slices) - # else: - # volume = slices[0] - volume= slices[0] - - chunk, shard = compute_zarr_layout(volume[0].shape, volume[0].dtype, zarr_config) + + slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_index] + + mosaic_idx = 2 * slice_idx_in - 1 + if tilted_illumination: + mosaic_idx += 1 + if no_tilted_illumination_scan: + mosaic_idx = slice_idx_in + + file_prefix = [s for s in np.atleast_1d(scan_info['FilePrefix']) if + 'cropped' in str(s).lower()] + if file_prefix: + file_prefix = file_prefix[0] + else: + raise ValueError("No complex file prefix found in scan_info['FilePrefix']") + + raw_data_dir = scan_info['RawDataDir'] + input_file_template = scan_info['FileNameFormat'] + input_file_template = input_file_template.replace('[modality]', file_prefix) + input_file_template = op.join(raw_data_dir, input_file_template) + + dBI_result, R3D_result, O3D_result = build_slice(mosaic_idx, input_file_template, + blend_ramp, clip_x, clip_y, + full_width, full_height, depth, + flip_z, map_indices, scan_info, + tile_width, tile_height, x_coords, + y_coords, raw_tile_width) + + if mosaic_idx > 8 and tilted_illumination: + O3D_result, R3D_result, dBI_result = temporary_compensation(O3D_result, + R3D_result, + dBI_result, depth, + focus, scan_info) + + chunk, shard = compute_zarr_layout(dBI_result.shape, dBI_result.dtype, zarr_config) writers = [] results = [] - for out, res in zip([dbi_output, r3d_output, o3d_output], volume): + zgroups = [] + for out, res in zip([dbi_output, r3d_output, o3d_output], + [dBI_result, R3D_result, O3D_result]): if shard: res = da.rechunk(res, chunks=shard) else: res = da.rechunk(res, chunks=chunk) + zgroup = zarr.create_group(out) + zgroups.append(zgroup) wconfig = default_write_config(op.join(out, '0'), shape=res.shape, dtype=np.float32, chunk=chunk, shard=shard) wconfig["create"] = True wconfig["delete_existing"] = True tswriter = ts.open(wconfig).result() - # tswriter = da.from_array(tswriter, chunks=res.chunks) writers.append(tswriter) results.append(res) task = da.store(results, writers, compute=False) - # task.visualize(filename="dag.svg", format="svg") task.compute() - # Store the volumes - # writer = da.stack(writers, axis=0) - # result = da.stack(results, axis=0) - # result.store(writer, lock=False, compute=True) - - # - # tswriter = ts.open(wconfig).result() - # volume.store(tswriter) - -def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, depth, - flip_z, is_fiji, map_indices, scan_info, slice_indices, tile_width, - tile_height, x_coords, y_coords, tilted_illumination, - no_tilted_illumination_scan, focus, raw_tile_width): - raw_data_dir = scan_info['RawDataDir'] - input_file_format = scan_info['FileNameFormat'] - if '.nii' in input_file_format: - file_type = 'nifti' - elif '.mat' in input_file_format: - file_type = 'mat' - else: - raise ValueError(f"Unsupported file type: {input_file_format}") - file_prefix = [s for s in np.atleast_1d(scan_info['FilePrefix']) if - 'cropped' in str(s).lower()] - if file_prefix: - file_prefix = file_prefix[0] - else: - raise ValueError("No complex file prefix found in scan_info['FilePrefix']") + logger.info("finished") + for zgroup in zgroups: + generate_pyramid_new(zgroup) + write_ome_metadata(zgroup, ["x", "y", "z"]) + logger.info("finished generating pyramid") + + +# For I80 slab1 use only +def temporary_compensation(O3D_result, R3D_result, dBI_result, depth, focus, scan_info): + Nz = depth + # 1) build a mask of pixels needing correction + mask_crop = focus <= scan_info['Focus_CropStart'] # (Ny, Nx) + # 2) find, for each (y,x), the last index along z where dBI3D == -inf + mask_inf = np.isneginf(dBI_result) # (Ny, Nx, Nz) + depth_idx = np.arange(Nz)[None, None, :] # (1, 1, Nz) + last_inf = np.max(np.where(mask_inf, depth_idx, -1), axis=2) + # last_inf[y,x] is -1 if there was no -inf, or the maximum index otherwise + # 3) decide which pixels actually get shifted + do_shift = (mask_crop & (last_inf >= 0)) # (Ny, Nx) + # 4) build the "shifted" index array for every (y,x,z) + # new_idx[y,x,z] = last_inf[y,x] + z + new_idx = last_inf[..., None] + depth_idx # (Ny, Nx, Nz) + # 5) clip to valid range so we can safely gather, + # then gather each volume + clipped = np.clip(new_idx, 0, Nz - 1) + dBI3D_shift = np.take_along_axis(dBI_result, clipped, axis=2) + R3D_shift = np.take_along_axis(R3D_result, clipped, axis=2) + O3D_shift = np.take_along_axis(O3D_result, clipped, axis=2) + # 6) zero-out any positions that “fell off the end” (new_idx >= Nz) + overflow = new_idx >= Nz + dBI3D_shift[overflow] = 0 + R3D_shift[overflow] = 0 + O3D_shift[overflow] = 0 + # 7) select per-pixel whether to keep the original or use the shifted version + dBI_result = np.where(do_shift[..., None], dBI3D_shift, dBI_result) + R3D_result = np.where(do_shift[..., None], R3D_shift, R3D_result) + O3D_result = np.where(do_shift[..., None], O3D_shift, O3D_result) + return O3D_result, R3D_result, dBI_result + + +def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, + full_height, depth, flip_z, map_indices, scan_info, tile_width, + tile_height, x_coords, y_coords, raw_tile_width): + canvas = [] + weight = [] - slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] - - mosaic_idx = 2 * slice_idx_in - 1 - if tilted_illumination: - mosaic_idx += 1 - if no_tilted_illumination_scan: - mosaic_idx = slice_idx_in - - dBI_canvas, R3D_canvas, O3D_canvas = [da.zeros((full_width, full_height, depth), - chunks=( - tile_width * 2, tile_height * 2, - depth), dtype=np.float32) for _ in - range(3)] - canvas = da.zeros((full_width, full_height, depth,3), chunks=( - tile_width, tile_height, - depth, 3), dtype=np.float32) - weight = da.zeros((full_width, full_height), chunks=(tile_width, tile_height), - dtype=np.float32) - if is_fiji: - pass - # following line is commented out in original code - # MapIndex = Exp['MapIndex_Tot'][:,:, sl_out] - - dBI_record, R3D_record, O3D_record, weight_record = [], [], [], [] for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( y_coords[i, j]): continue @@ -187,16 +199,8 @@ def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, row_slice = slice(x0, x0 + tile_width) col_slice = slice(y0, y0 + tile_height) - input_file_name = input_file_format % (mosaic_idx, tile_idx) - input_file_name = input_file_name.replace('[modality]', file_prefix) - input_file_path = op.join(raw_data_dir, input_file_name) - - if file_type == 'mat': - complex3d = _load_mat_tile(input_file_path) - elif file_type == 'nifti': - complex3d = _load_nifti_tile(input_file_path) - - + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) if complex3d.shape[0] > 4 * raw_tile_width: warnings.warn( f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " @@ -212,82 +216,28 @@ def build_slice(slice_idx, blend_ramp, clip_x, clip_y, full_width, full_height, dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) results = da.stack([dBI3D, R3D, O3D], axis=3) + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results.rechunk({3: 3}) results = results[clip_x:, clip_y:]*blend_ramp[:,:,None,None] + canvas_tile = da.zeros((full_width, full_height, depth, 3), + chunks=( + tile_width, tile_height, + depth, 3), dtype=np.float32) + canvas_tile[row_slice, col_slice, ...] = results + weight_tile = da.zeros((full_width, full_height), chunks=( + tile_width, tile_height), + dtype=np.float32) + weight_tile[row_slice, col_slice] = blend_ramp + canvas.append(canvas_tile) + weight.append(weight_tile) + + canvas = da.sum(da.stack(canvas, axis=0), axis=0) + weight = da.sum(da.stack(weight, axis=0), axis=0) - canvas[row_slice, col_slice] += results - weight[row_slice, col_slice] += blend_ramp - - # - # if mosaic_idx > 8 and tilted_illumination: - # Nz = depth - # # 1) build a mask of pixels needing correction - # mask_crop = focus <= scan_info['Focus_CropStart'] # (Ny, Nx) - # - # # 2) find, for each (y,x), the last index along z where dBI3D == -inf - # mask_inf = np.isneginf(dBI3D) # (Ny, Nx, Nz) - # depth_idx = np.arange(Nz)[None, None, :] # (1, 1, Nz) - # last_inf = np.max(np.where(mask_inf, depth_idx, -1), axis=2) - # # last_inf[y,x] is -1 if there was no -inf, or the maximum index otherwise - # - # # 3) decide which pixels actually get shifted - # do_shift = (mask_crop & (last_inf >= 0)) # (Ny, Nx) - # - # # 4) build the "shifted" index array for every (y,x,z) - # # new_idx[y,x,z] = last_inf[y,x] + z - # new_idx = last_inf[..., None] + depth_idx # (Ny, Nx, Nz) - # - # # 5) clip to valid range so we can safely gather, - # # then gather each volume - # clipped = np.clip(new_idx, 0, Nz - 1) - # dBI3D_shift = np.take_along_axis(dBI3D, clipped, axis=2) - # R3D_shift = np.take_along_axis(R3D, clipped, axis=2) - # O3D_shift = np.take_along_axis(O3D, clipped, axis=2) - # - # # 6) zero-out any positions that “fell off the end” (new_idx >= Nz) - # overflow = new_idx >= Nz - # dBI3D_shift[overflow] = 0 - # R3D_shift[overflow] = 0 - # O3D_shift[overflow] = 0 - # - # # 7) select per-pixel whether to keep the original or use the shifted version - # dBI3D = np.where(do_shift[..., None], dBI3D_shift, dBI3D) - # R3D = np.where(do_shift[..., None], R3D_shift, R3D) - # O3D = np.where(do_shift[..., None], O3D_shift, O3D) - # - # for arr, canvas in zip([dBI3D, R3D, O3D], [dBI_record, R3D_record, O3D_record]): - # if scan_info['System'].lower() == 'octopus': - # arr = np.swapaxes(arr, 0, 1) - # if flip_z: - # arr = arr[:, :, ::-1] - # arr = arr[clip_x:, clip_y:] - # if modality == "mus" and file_type == 'nifti': - # raise NotImplementedError("mus 3d stitching not updated") - # arr = process_mus_nifti(arr, depth) - # else: - # arr = arr[:, :, :depth] - # arr *= blend_ramp[..., None] - - # - # adding = da.zeros_like(dBI_canvas) - # adding[row_slice, col_slice, :] = - # canvas.append(adding) - # - # adding = da.zeros_like(weight) - # adding[row_slice, col_slice] = blend_ramp - # weight_record.append(adding) - - - # dBI_canvas = da.sum(da.stack(dBI_record, axis=0), axis=0) - # R3D_canvas = da.sum(da.stack(R3D_record, axis=0), axis=0) - # O3D_canvas = da.sum(da.stack(O3D_record, axis=0), axis=0) - # weight = da.sum(da.stack(weight_record, axis=0), axis=0) - # Normalize the canvases by the weight - # dBI_canvas /= weight[..., None] - # R3D_canvas /= weight[..., None] - # O3D_canvas /= weight[..., None] - # dBI_canvas = da.nan_to_num(dBI_canvas) - # R3D_canvas = da.nan_to_num(R3D_canvas) - # O3D_canvas = da.nan_to_num(O3D_canvas) canvas /= weight[..., None, None] canvas = canvas.rechunk({3:1}) dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] @@ -324,9 +274,6 @@ def do_downsample(volume: da.Array, factors: tuple) -> da.Array: fx, fy, fz = factors return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) - - - def stack_slices(mosaic_info, slice_indices, slices): return da.concatenate(slices, axis=2) num_slices = len(slices) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index b716c70d..85fec5c9 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -250,7 +250,7 @@ def generate_pyramid_new( prev_shape = spatial_shape spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) all_shapes.append(spatial_shape) - logger.info("Compute level", lvl, "with shape", spatial_shape) + logger.info(f"Compute level {lvl} with shape {spatial_shape}") arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) From c84b16d535425c15eca616a5df671b8fd21bf2db Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 5 Jun 2025 15:11:21 -0400 Subject: [PATCH 031/157] wip: psoct --- linc_convert/modalities/psoct/mosaic3d.py | 61 +++++++++++++++-------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 1b06918b..a6ce7b00 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -1,6 +1,7 @@ import logging import os.path as op import warnings +from multiprocessing.managers import Value from typing import Annotated import cyclopts @@ -13,6 +14,7 @@ import tqdm import zarr from cyclopts import Parameter +from dask import delayed from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ @@ -64,7 +66,9 @@ def mosaic3d_telesto( mosaic_info = struct_arr_to_dict(raw_mat['Mosaic3D']) exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) - + scan_resolution = np.atleast_1d(scan_info['Resolution']) + if len(scan_resolution) < 3: + raise ValueError clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) if scan_info['System'].lower() == 'octopus': clip_x, clip_y = clip_y, clip_x @@ -86,7 +90,7 @@ def mosaic3d_telesto( no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' - focus = _load_nifti_tile(scan_info['FocusFile'] + tilt_postfix) + focus = _load_nifti_tile(scan_info['FocusFile'+ tilt_postfix] ) raw_tile_width = int(scan_info['NbPixels' + tilt_postfix]) slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_index] @@ -109,18 +113,23 @@ def mosaic3d_telesto( input_file_template = input_file_template.replace('[modality]', file_prefix) input_file_template = op.join(raw_data_dir, input_file_template) + if mosaic_idx > 8 and tilted_illumination: + temp_compensate = True + else: + temp_compensate = False dBI_result, R3D_result, O3D_result = build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, full_height, depth, flip_z, map_indices, scan_info, tile_width, tile_height, x_coords, - y_coords, raw_tile_width) + y_coords, raw_tile_width, focus, temp_compensate) + - if mosaic_idx > 8 and tilted_illumination: - O3D_result, R3D_result, dBI_result = temporary_compensation(O3D_result, - R3D_result, - dBI_result, depth, - focus, scan_info) + + + dBI_result = dBI_result.transpose(2,1,0) + R3D_result = R3D_result.transpose(2,1,0) + O3D_result = O3D_result.transpose(2,1,0) chunk, shard = compute_zarr_layout(dBI_result.shape, dBI_result.dtype, zarr_config) writers = [] @@ -133,7 +142,7 @@ def mosaic3d_telesto( res = da.rechunk(res, chunks=shard) else: res = da.rechunk(res, chunks=chunk) - zgroup = zarr.create_group(out) + zgroup = zarr.create_group(out, overwrite=True) zgroups.append(zgroup) wconfig = default_write_config(op.join(out, '0'), shape=res.shape, dtype=np.float32, chunk=chunk, shard=shard) @@ -145,20 +154,24 @@ def mosaic3d_telesto( task = da.store(results, writers, compute=False) task.compute() + scan_resolution = scan_resolution[:3][::-1] logger.info("finished") for zgroup in zgroups: generate_pyramid_new(zgroup) - write_ome_metadata(zgroup, ["x", "y", "z"]) + write_ome_metadata(zgroup, ["z", "y", "x"], scan_resolution, space_unit="micrometer") + nii_header = default_nifti_header(zgroup["0"], zgroup.attrs["multiscales"]) + nii_header.set_xyzt_units("um") + write_nifti_header(zgroup, nii_header) logger.info("finished generating pyramid") # For I80 slab1 use only -def temporary_compensation(O3D_result, R3D_result, dBI_result, depth, focus, scan_info): +def temporary_compensation(dBI, R3D, O3D, depth, focus, scan_info): Nz = depth # 1) build a mask of pixels needing correction mask_crop = focus <= scan_info['Focus_CropStart'] # (Ny, Nx) # 2) find, for each (y,x), the last index along z where dBI3D == -inf - mask_inf = np.isneginf(dBI_result) # (Ny, Nx, Nz) + mask_inf = np.isneginf(dBI) # (Ny, Nx, Nz) depth_idx = np.arange(Nz)[None, None, :] # (1, 1, Nz) last_inf = np.max(np.where(mask_inf, depth_idx, -1), axis=2) # last_inf[y,x] is -1 if there was no -inf, or the maximum index otherwise @@ -170,24 +183,24 @@ def temporary_compensation(O3D_result, R3D_result, dBI_result, depth, focus, sca # 5) clip to valid range so we can safely gather, # then gather each volume clipped = np.clip(new_idx, 0, Nz - 1) - dBI3D_shift = np.take_along_axis(dBI_result, clipped, axis=2) - R3D_shift = np.take_along_axis(R3D_result, clipped, axis=2) - O3D_shift = np.take_along_axis(O3D_result, clipped, axis=2) + dBI3D_shift = np.take_along_axis(dBI, clipped, axis=2) + R3D_shift = np.take_along_axis(R3D, clipped, axis=2) + O3D_shift = np.take_along_axis(O3D, clipped, axis=2) # 6) zero-out any positions that “fell off the end” (new_idx >= Nz) overflow = new_idx >= Nz dBI3D_shift[overflow] = 0 R3D_shift[overflow] = 0 O3D_shift[overflow] = 0 # 7) select per-pixel whether to keep the original or use the shifted version - dBI_result = np.where(do_shift[..., None], dBI3D_shift, dBI_result) - R3D_result = np.where(do_shift[..., None], R3D_shift, R3D_result) - O3D_result = np.where(do_shift[..., None], O3D_shift, O3D_result) - return O3D_result, R3D_result, dBI_result + dBI = np.where(do_shift[..., None], dBI3D_shift, dBI) + R3D = np.where(do_shift[..., None], R3D_shift, R3D) + O3D = np.where(do_shift[..., None], O3D_shift, O3D) + return da.stack([dBI,R3D,O3D], 3) def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, full_height, depth, flip_z, map_indices, scan_info, tile_width, - tile_height, x_coords, y_coords, raw_tile_width): + tile_height, x_coords, y_coords, raw_tile_width, focus, temp_compensate): canvas = [] weight = [] @@ -215,7 +228,12 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - results = da.stack([dBI3D, R3D, O3D], axis=3) + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape,3), dtype= dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + if flip_z: results = da.flip(results, axis=2) if scan_info['System'].lower() == 'octopus': @@ -234,6 +252,7 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful weight_tile[row_slice, col_slice] = blend_ramp canvas.append(canvas_tile) weight.append(weight_tile) + break canvas = da.sum(da.stack(canvas, axis=0), axis=0) weight = da.sum(da.stack(weight, axis=0), axis=0) From fbb89d2e61e30b3ae5e6179ad89a5e950c12e147 Mon Sep 17 00:00:00 2001 From: Kabilar Gunalan Date: Fri, 13 Jun 2025 14:51:38 -0500 Subject: [PATCH 032/157] Add attribution for ps-oct code --- linc_convert/modalities/psoct/mosaic2d.py | 4 ++++ linc_convert/modalities/psoct/mosaic3d.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py index 5335cbee..34ac4593 100644 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ b/linc_convert/modalities/psoct/mosaic2d.py @@ -1,3 +1,7 @@ +""" +This module includes components that are based on the https://github.com/CarolineMagnain/OCTAnalysis repository (currently private). We have permission from the owner to include the code here. +""" + import logging import os.path as op from colorsys import hsv_to_rgb diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index a6ce7b00..9aa164b6 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -1,3 +1,7 @@ +""" +This module includes components that are based on the https://github.com/CarolineMagnain/OCTAnalysis repository (currently private). We have permission from the owner to include the code here. +""" + import logging import os.path as op import warnings From 78931ce10156e78286fcc8c08d725fe64de1cf1f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 11 Jun 2025 10:15:59 -0400 Subject: [PATCH 033/157] wip: psoct --- linc_convert/modalities/psoct/mosaic3d.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index 9aa164b6..bf9493d1 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -162,9 +162,9 @@ def mosaic3d_telesto( logger.info("finished") for zgroup in zgroups: generate_pyramid_new(zgroup) - write_ome_metadata(zgroup, ["z", "y", "x"], scan_resolution, space_unit="micrometer") + write_ome_metadata(zgroup, ["z", "y", "x"], scan_resolution, space_unit="millimeter") nii_header = default_nifti_header(zgroup["0"], zgroup.attrs["multiscales"]) - nii_header.set_xyzt_units("um") + nii_header.set_xyzt_units("mm") write_nifti_header(zgroup, nii_header) logger.info("finished generating pyramid") @@ -262,7 +262,8 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful weight = da.sum(da.stack(weight, axis=0), axis=0) canvas /= weight[..., None, None] - canvas = canvas.rechunk({3:1}) + canvas = da.nan_to_num(canvas) + # canvas = canvas.rechunk({3:1}) dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] return [dBI_canvas, R3D_canvas, O3D_canvas] From 8d55c7bdf1343680f80fa1e37f4b529011c5177c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 12 Jun 2025 16:52:50 -0400 Subject: [PATCH 034/157] wip: psoct, attempts optimize dask pipeline --- linc_convert/modalities/psoct/mosaic3d.py | 930 +++++++++++++++++++++- 1 file changed, 918 insertions(+), 12 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index bf9493d1..b29573bb 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -19,6 +19,7 @@ import zarr from cyclopts import Parameter from dask import delayed +from dask.diagnostics import ProgressBar from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ @@ -26,6 +27,7 @@ from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ find_experiment_params, atleast_2d_trailing from linc_convert.modalities.psoct.utils._zarr import default_write_config +from linc_convert.utils.math import ceildiv from linc_convert.utils.zarr.create_array import compute_zarr_layout from linc_convert.utils.zarr.generate_pyramid import generate_pyramid_new from linc_convert.utils.zarr.zarr_config import ZarrConfig @@ -97,8 +99,8 @@ def mosaic3d_telesto( focus = _load_nifti_tile(scan_info['FocusFile'+ tilt_postfix] ) raw_tile_width = int(scan_info['NbPixels' + tilt_postfix]) - slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_index] - + # slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_index] + slice_idx_in = slice_index mosaic_idx = 2 * slice_idx_in - 1 if tilted_illumination: mosaic_idx += 1 @@ -121,21 +123,27 @@ def mosaic3d_telesto( temp_compensate = True else: temp_compensate = False - dBI_result, R3D_result, O3D_result = build_slice(mosaic_idx, input_file_template, + + chunk, shard = compute_zarr_layout((depth, full_height, full_width), np.float32, + zarr_config) + + dBI_result, R3D_result, O3D_result = build_slice(mosaic_idx, + input_file_template, blend_ramp, clip_x, clip_y, full_width, full_height, depth, flip_z, map_indices, scan_info, tile_width, tile_height, x_coords, - y_coords, raw_tile_width, focus, temp_compensate) - - + y_coords, + raw_tile_width, + focus, + temp_compensate, + chunk=chunk if not shard else shard) dBI_result = dBI_result.transpose(2,1,0) R3D_result = R3D_result.transpose(2,1,0) O3D_result = O3D_result.transpose(2,1,0) - chunk, shard = compute_zarr_layout(dBI_result.shape, dBI_result.dtype, zarr_config) writers = [] results = [] zgroups = [] @@ -156,7 +164,9 @@ def mosaic3d_telesto( writers.append(tswriter) results.append(res) task = da.store(results, writers, compute=False) - task.compute() + + with ProgressBar(): + task.compute() scan_resolution = scan_resolution[:3][::-1] logger.info("finished") @@ -165,7 +175,7 @@ def mosaic3d_telesto( write_ome_metadata(zgroup, ["z", "y", "x"], scan_resolution, space_unit="millimeter") nii_header = default_nifti_header(zgroup["0"], zgroup.attrs["multiscales"]) nii_header.set_xyzt_units("mm") - write_nifti_header(zgroup, nii_header) + # write_nifti_header(zgroup, nii_header) logger.info("finished generating pyramid") @@ -201,10 +211,600 @@ def temporary_compensation(dBI, R3D, O3D, depth, focus, scan_info): O3D = np.where(do_shift[..., None], O3D_shift, O3D) return da.stack([dBI,R3D,O3D], 3) - def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, full_height, depth, flip_z, map_indices, scan_info, tile_width, - tile_height, x_coords, y_coords, raw_tile_width, focus, temp_compensate): + tile_height, x_coords, y_coords, raw_tile_width, focus, temp_compensate, + chunk): + coords = [] + tiles = [] + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, + scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape, 3), + dtype=dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] + tiles.append(results) + coords.append((x0, y0)) + if tile_idx > 50: + break + + return stitch_map_block( + coords, tiles, + full_width=full_width, full_height=full_height, + depth=depth, blend_ramp=blend_ramp, + tile_size=(tile_width, tile_height), + chunk=chunk + ) + + +from collections import defaultdict + +def stitch_baseline(coords, tiles, full_width, full_height, depth, + blend_ramp, tile_size, chunk, **_): + canvas = da.zeros((full_width, full_height, depth, 3), + chunks=(*chunk[::-1], 3), dtype=np.float32) + weight = da.zeros((full_width, full_height), + chunks=(*chunk[::-1][:-1],), dtype=np.float32) + + arr=da.sum(da.stack(tiles, axis=0), axis=0) + with ProgressBar(): + arr.compute() + logger.info("finished") + return [canvas[..., i] for i in range(3)] + + + +def stitch_addition(coords, tiles, full_width, full_height, depth, + blend_ramp, tile_size, chunk, **_): + canvas = da.zeros((full_width, full_height, depth, 3), + chunks=(*chunk[::-1], 3), dtype=np.float32) + weight = da.zeros((full_width, full_height), + chunks=(*chunk[::-1][:-1],), dtype=np.float32) + + for (x0, y0), t in zip(coords, tiles): + rs = slice(x0, x0 + tile_size[0]) + cs = slice(y0, y0 + tile_size[1]) + canvas[rs, cs] += t + weight[rs, cs] += blend_ramp + + canvas /= weight[..., None, None] + return [canvas[..., i] for i in range(3)] + + +def stitch_sparse_padding(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Same as native_padding but convert to sparse. COO per‐block before summing. + """ + pw, ph = tile_size + paints = [] + weights = [] + + for (x0, y0), t in zip(coords, tiles): + # build a full‐canvas tile with zeros + paint = da.zeros((full_width, full_height, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + weight_paint = da.zeros((full_width, full_height), + chunks=(pw, ph), + dtype=np.float32) + + rs = slice(x0, x0 + pw) + cs = slice(y0, y0 + ph) + paint[rs, cs, ...] = t + weight_paint[rs, cs] = blend_ramp + + paints.append(da.map_blocks(sparse.COO, paint)) + weights.append(da.map_blocks(sparse.COO, weight_paint)) + + canvas = da.sum(da.stack(paints, axis=0), axis=0) + weight = da.sum(da.stack(weights, axis=0), axis=0) + + canvas /= weight[..., None, None] + return [canvas[..., i] for i in range(3)] + + +def stitch_native_padding(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Per‐tile da.pad to full‐canvas, then stack & sum (build_slice_native_padding). + """ + pw, ph = tile_size + canvases = [] + weights = [] + + for (x0, y0), t in zip(coords, tiles): + # pad amounts = ((before_x, after_x), (before_y, after_y), (0,0), (0,0)) + pad_t = ((x0, full_width - x0 - pw), + (y0, full_height - y0 - ph), + (0, 0), + (0, 0)) + pad_w = ((x0, full_width - x0 - pw), + (y0, full_height - y0 - ph)) + + canvases.append(da.pad(t, pad_t).astype(np.float32)) + weights.append(da.pad(blend_ramp, pad_w).astype(np.float32)) + + canvas = da.sum(da.stack(canvases, axis=0), axis=0) + weight = da.sum(da.stack(weights, axis=0), axis=0) + + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + return [canvas[..., i] for i in range(3)] + + +def stitch_chunked_padding(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Chunk‐aligned padding + per‐block summation (build_slice_chunked_padding). + """ + pw, ph = tile_size + # final canvas & weight + canvas = da.zeros((full_width, full_height, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + weight = da.zeros((full_width, full_height), + chunks=(pw, ph), + dtype=np.float32) + + # collect per‐chunk pieces + block_tiles = defaultdict(list) + block_weights = defaultdict(list) + + for (x0, y0), t in zip(coords, tiles): + # which tile‐chunks this falls into? + x0c = x0 // pw + y0c = y0 // ph + x1c = (x0 + pw - 1) // pw + y1c = (y0 + ph - 1) // ph + + # pad region covering those chunks + x_start = x0c * pw + y_start = y0c * ph + x_end = (x1c + 1) * pw + y_end = (y1c + 1) * ph + + block_canvas = da.zeros((x_end - x_start, y_end - y_start, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + block_weight = da.zeros((x_end - x_start, y_end - y_start), + chunks=(pw, ph), + dtype=np.float32) + + # place tile into that big block + xs = slice(x0 - x_start, x0 - x_start + pw) + ys = slice(y0 - y_start, y0 - y_start + ph) + block_canvas[xs, ys, ...] = t + block_weight[xs, ys] = blend_ramp + + # chop into per‐chunk pieces + for cx in range(x0c, x1c + 1): + for cy in range(y0c, y1c + 1): + bid = (cx, cy) + sub_x = slice((cx - x0c) * pw, (cx - x0c + 1) * pw) + sub_y = slice((cy - y0c) * ph, (cy - y0c + 1) * ph) + block_tiles[bid].append(block_canvas[sub_x, sub_y, ...]) + block_weights[bid].append(block_weight[sub_x, sub_y]) + + # assemble each chunk back into final canvas + for (cx, cy), pieces in block_tiles.items(): + rs = slice(cx * pw, min((cx + 1) * pw, full_width)) + cs = slice(cy * ph, min((cy + 1) * ph, full_height)) + + summed = da.sum(da.stack(pieces, axis=0), axis=0) + wsum = da.sum(da.stack(block_weights[(cx, cy)], axis=0), axis=0) + + # trim edges if needed + summed = summed[: rs.stop - rs.start, : cs.stop - cs.start, ...] + wsum = wsum[: rs.stop - rs.start, : cs.stop - cs.start] + + canvas[rs, cs, ...] = summed + weight[rs, cs] = wsum + + # normalize & clean + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + return [canvas[..., i] for i in range(3)] + + +def stitch_whole_canvas_padding(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Build a full‐size zero‐canvas per tile and slice‐assign into it, + then stack & sum (build_slice_whole_canvas_padding). + """ + pw, ph = tile_size + canvases = [] + weights = [] + + for (x0, y0), t in zip(coords, tiles): + canvas_tile = da.zeros((full_width, full_height, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + weight_tile = da.zeros((full_width, full_height), + chunks=(pw, ph), + dtype=np.float32) + + rs = slice(x0, x0 + pw) + cs = slice(y0, y0 + ph) + canvas_tile[rs, cs, ...] = t + weight_tile[rs, cs] = blend_ramp + + canvases.append(canvas_tile) + weights.append(weight_tile) + + canvas = da.sum(da.stack(canvases, axis=0), axis=0) + weight = da.sum(da.stack(weights, axis=0), axis=0) + + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + return [canvas[..., i] for i in range(3)] + +def _combine_block(_,block_tiles,block_weights,*args,block_info=None, **kwargs): + chunk_id = tuple(block_info[None]['chunk-location'][:2]) + + paints = block_tiles[chunk_id] + weights = block_weights[chunk_id] + + # if no tiles hit this chunk → zero + shape = block_info[None]['chunk-shape'] + if not paints: + return np.broadcast_to(np.zeros((), dtype=np.float32), shape) + + # pure NumPy sums + total_paint = np.sum(np.stack(paints, axis=0), axis=0) + total_weight = np.sum(np.stack(weights, axis=0), axis=0) + return total_paint / total_weight[...,None,None] + +def stitch_map_block(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Chunk‐aligned padding + per‐block summation (build_slice_chunked_padding). + """ + pw, ph = tile_size + # final canvas & weight + canvas = da.zeros((full_width, full_height, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + weight = da.zeros((full_width, full_height), + chunks=(pw, ph), + dtype=np.float32) + + # collect per‐chunk pieces + block_tiles = defaultdict(list) + block_weights = defaultdict(list) + + for (x0, y0), t in zip(coords, tiles): + # which tile‐chunks this falls into? + x0c = x0 // pw + y0c = y0 // ph + x1c = (x0 + pw - 1) // pw + y1c = (y0 + ph - 1) // ph + + # pad region covering those chunks + x_start = x0c * pw + y_start = y0c * ph + x_end = (x1c + 1) * pw + y_end = (y1c + 1) * ph + + block_canvas = da.zeros((x_end - x_start, y_end - y_start, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + block_weight = da.zeros((x_end - x_start, y_end - y_start), + chunks=(pw, ph), + dtype=np.float32) + + # place tile into that big block + xs = slice(x0 - x_start, x0 - x_start + pw) + ys = slice(y0 - y_start, y0 - y_start + ph) + block_canvas[xs, ys, ...] = t + block_weight[xs, ys] = blend_ramp + + # chop into per‐chunk pieces + for cx in range(x0c, x1c + 1): + for cy in range(y0c, y1c + 1): + bid = (cx, cy) + sub_x = slice((cx - x0c) * pw, (cx - x0c + 1) * pw) + sub_y = slice((cy - y0c) * ph, (cy - y0c + 1) * ph) + block_tiles[bid].append(block_canvas[sub_x, sub_y, ...]) + block_weights[bid].append(block_weight[sub_x, sub_y]) + + + canvas = da.map_blocks(_combine_block,canvas, block_tiles, block_weights, + dtype=canvas.dtype, + chunks=(pw, ph, depth, 3)) + + return [canvas[..., i] for i in range(3)] + +import sparse +def per_chunk(chunk,weight=None, axis=None, keepdims=None): + if weight and not weight[0,0]: + return np.broadcast_to(np.zeros((), dtype=np.float32),) + return chunk + +def stitch_custom_reduction(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): + """ + Build a full‐size zero‐canvas per tile and slice‐assign into it, + then stack & sum (build_slice_whole_canvas_padding). + """ + pw, ph = tile_size + canvases = [] + weights = [] + num_chunkx = ceildiv(full_width, pw) + num_chunky = ceildiv(full_height, ph) + masks = [] + + for (x0, y0), t in zip(coords, tiles): + canvas_tile = da.zeros((full_width, full_height, depth, 3), + chunks=(pw, ph, depth, 3), + dtype=np.float32) + weight_tile = da.zeros((full_width, full_height), + chunks=(pw, ph), + dtype=np.float32) + + rs = slice(x0, x0 + pw) + cs = slice(y0, y0 + ph) + canvas_tile[rs, cs, ...] = t + weight_tile[rs, cs] = blend_ramp + x0c = x0 // pw + y0c = y0 // ph + x1c = (x0 + pw - 1) // pw + y1c = (y0 + ph - 1) // ph + mask = np.zeros((num_chunkx, num_chunky), dtype=bool) + mask[x0c:x1c + 1, y0c:y1c + 1] = True + mask=np.broadcast_to(mask[:, :, None, None] , (num_chunkx, num_chunky, pw, ph)).transpose(0, 2, 1, 3).reshape(num_chunkx*pw, num_chunky*ph)[:full_width, :full_height] + + masks.append(mask) + canvases.append(canvas_tile) + weights.append(weight_tile) + canvas = da.stack(canvases, axis=0) + weight = da.stack(weights, axis=0) + canvas = da.reduction(canvas,chunk = per_chunk, aggregate=da.sum, axis=0,dtype=np.float32) + weight = da.reduction(weight,chunk = per_chunk, aggregate=da.sum, axis=0, dtype=np.float32) + + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + return [canvas[..., i] for i in range(3)] + + +def build_slice_chunked_padding(mosaic_idx, input_file_template, blend_ramp, clip_x, + clip_y, full_width, + full_height, depth, flip_z, map_indices, scan_info, + tile_width, + tile_height, x_coords, y_coords, raw_tile_width, focus, + temp_compensate, chunk): + canvas = dask.array.zeros((full_width, full_height, depth, 3), + chunks=(tile_width, tile_height, depth, 3), + dtype=np.float32) + + weight = dask.array.zeros((full_width, full_height), + chunks=(tile_width, tile_height), + dtype=np.float32) + + all_blocks = defaultdict(list) + all_weights = defaultdict(list) + + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, + scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape, 3), + dtype=dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results.rechunk({3: 3}) + results = results[clip_x:, clip_y:] * blend_ramp[..., None, None] + x0_chunk = x0 // tile_width + y0_chunk = y0 // tile_height + x1_chunk = (x0 + tile_width - 1) // tile_width + y1_chunk = (y0 + tile_height - 1) // tile_height + # pad this tile to the chunk boundaries + x0_chunk_start = x0_chunk * tile_width + y0_chunk_start = y0_chunk * tile_height + x1_chunk_end = (x1_chunk + 1) * tile_width + y1_chunk_end = (y1_chunk + 1) * tile_height + canvas_tile = da.zeros( + (x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start, depth, 3), + dtype=np.float32, chunks=(tile_width, tile_height, depth, 3)) + canvas_tile[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, + y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = results + weight_tile = da.zeros( + (x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start), + dtype=np.float32, chunks=(tile_width, tile_height)) + weight_tile[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, + y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = blend_ramp + + # add the tile to corresponding blocks + for chunk_x_id in range(x0_chunk, x1_chunk + 1): + for chunk_y_id in range(y0_chunk, y1_chunk + 1): + block_id = (chunk_x_id, chunk_y_id) + all_blocks[block_id].append(canvas_tile[ + (chunk_x_id - x0_chunk) * tile_width: ( + chunk_x_id - x0_chunk + 1) * tile_width, + (chunk_y_id - y0_chunk) * tile_height: ( + chunk_y_id - y0_chunk + 1) * tile_height, + ...]) + all_weights[block_id].append(weight_tile[ + (chunk_x_id - x0_chunk) * tile_width: ( + chunk_x_id - x0_chunk + 1) * tile_width, + (chunk_y_id - y0_chunk) * tile_height: ( + chunk_y_id - y0_chunk + 1) * tile_height, + ]) + + if tile_idx > 100: + break + + for block_id, block_tiles in all_blocks.items(): + x_slice = slice(block_id[0] * tile_width, + min((block_id[0] + 1) * tile_width, full_width)) + y_slice = slice(block_id[1] * tile_height, + min((block_id[1] + 1) * tile_height, full_height)) + block_data = da.sum(da.stack(block_tiles, axis=0), axis=0) + weight_data = da.sum(da.stack(all_weights[block_id], axis=0), axis=0) + if (block_id[0] + 1) * tile_width > full_width: + block_data = block_data[:x_slice.stop - x_slice.start, ...] + weight_data = weight_data[:x_slice.stop - x_slice.start, ...] + if (block_id[1] + 1) * tile_height > full_height: + block_data = block_data[:, :y_slice.stop - y_slice.start, ...] + weight_data = weight_data[:, :y_slice.stop - y_slice.start] + + canvas[x_slice, y_slice] = block_data + weight[x_slice, y_slice] = weight_data + + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + # canvas = canvas.rechunk({3:1}) + dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + return [dBI_canvas, R3D_canvas, O3D_canvas] + + +def build_slice_whole_canvas_padding(mosaic_idx, input_file_template, blend_ramp, + clip_x, clip_y, full_width, + full_height, depth, flip_z, map_indices, scan_info, + tile_width, + tile_height, x_coords, y_coords, raw_tile_width, + focus, temp_compensate, chunk): + canvas = [] + weight = [] + + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, + scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape, 3), + dtype=dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results.rechunk({3: 3}) + results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] + canvas_tile = da.zeros((full_width, full_height, depth, 3), + chunks=( + tile_width, tile_height, + depth, 3), dtype=np.float32) + canvas_tile[row_slice, col_slice, ...] = results + weight_tile = da.zeros((full_width, full_height), chunks=( + tile_width, tile_height), + dtype=np.float32) + weight_tile[row_slice, col_slice] = blend_ramp + canvas.append(canvas_tile) + weight.append(weight_tile) + if tile_idx > 100: + break + + canvas = da.sum(da.stack(canvas, axis=0), axis=0) + weight = da.sum(da.stack(weight, axis=0), axis=0) + + canvas /= weight[..., None, None] + canvas = da.nan_to_num(canvas) + # canvas = canvas.rechunk({3:1}) + dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + return [dBI_canvas, R3D_canvas, O3D_canvas] + + +def build_slice_whole_canvas_custom_reduction(mosaic_idx, input_file_template, + blend_ramp, clip_x, clip_y, full_width, + full_height, depth, flip_z, map_indices, + scan_info, tile_width, + tile_height, x_coords, y_coords, + raw_tile_width, focus, temp_compensate, + chunk): canvas = [] weight = [] @@ -254,9 +854,15 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful tile_width, tile_height), dtype=np.float32) weight_tile[row_slice, col_slice] = blend_ramp + x0_chunk = x0 // tile_width + y0_chunk = y0 // tile_height + x1_chunk = (x0 + tile_width - 1) // tile_width + y1_chunk = (y0 + tile_height - 1) // tile_height + canvas.append(canvas_tile) weight.append(weight_tile) - break + if tile_idx > 100: + break canvas = da.sum(da.stack(canvas, axis=0), axis=0) weight = da.sum(da.stack(weight, axis=0), axis=0) @@ -268,6 +874,306 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful return [dBI_canvas, R3D_canvas, O3D_canvas] +def build_slice_baseline(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, + full_width, + full_height, depth, flip_z, map_indices, scan_info, tile_width, + tile_height, x_coords, y_coords, raw_tile_width, focus, + temp_compensate, chunk): + all_results = [] + all_weights = [] + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, + scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape, 3), + dtype=dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] + all_results.append(results) + all_weights.append(blend_ramp) + + canvas = da.sum(da.stack(all_results, axis=0), axis=0) + weight = da.sum(da.stack(all_weights, axis=0), axis=0) + # for i in range(len(all_results)): + # all_results[i] = da.stack(all_results[i], axis=1) + # all_weights[i] = da.stack(all_weights[i], axis=1) + # canvas = da.stack(all_results, axis=0) + # weight = da.stack(all_weights, axis=0) + + canvas /= weight[..., None, None] + canvas.compute() + logger.info("finished") + dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + return [dBI_canvas, R3D_canvas, O3D_canvas] + + +def build_slice_old(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, + full_width, + full_height, depth, flip_z, map_indices, scan_info, tile_width, + tile_height, x_coords, y_coords, raw_tile_width, focus, + temp_compensate, chunk): + chunk = chunk[::-1] + chunk_x, chunk_y = chunk[:2] + all_results = [] + canvas = dask.array.zeros((full_width, full_height, depth, 3), chunks=(*chunk, 3), + dtype=np.float32) + weight = dask.array.zeros((full_width, full_height), chunks=(*chunk[:-1],), + dtype=np.float32) + + block_map = defaultdict(list) + weight_map = defaultdict(list) + coords = [] + tiles = [] + for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): + if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( + y_coords[i, j]): + continue + x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) + row_slice = slice(x0, x0 + tile_width) + col_slice = slice(y0, y0 + tile_height) + + input_file_path = input_file_template % (mosaic_idx, tile_idx) + complex3d = _load_tile(input_file_path) + if complex3d.shape[0] > 4 * raw_tile_width: + warnings.warn( + f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " + "Trimming to 4*raw_tile_width." + ) + complex3d = complex3d[:4 * raw_tile_width, :, :] + elif complex3d.shape[0] < 4 * raw_tile_width: + raise ValueError( + f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " + "Check the input file." + ) + + dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) + + if temp_compensate: + results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, + scan_info) + results = da.from_delayed(results, shape=(*dBI3D.shape, 3), + dtype=dBI3D.dtype) + else: + results = da.stack([dBI3D, R3D, O3D], axis=3) + + if flip_z: + results = da.flip(results, axis=2) + if scan_info['System'].lower() == 'octopus': + results = da.swapaxes(results, 0, 1) + + results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] + + coords.append((x0, y0)) + tiles.append(results) + # find the all chunks this tile overlaps with + x0_chunk = x0 // chunk_x + y0_chunk = y0 // chunk_y + x1_chunk = (x0 + tile_width) // chunk_x + y1_chunk = (y0 + tile_height) // chunk_y + # pad this tile to the chunk boundaries + x0_chunk_start = x0_chunk * chunk_x + y0_chunk_start = y0_chunk * chunk_y + x1_chunk_end = (x1_chunk + 1) * chunk_x + y1_chunk_end = (y1_chunk + 1) * chunk_y + # paint = da.zeros((x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start, depth, 3), dtype=np.float32, chunks=(tile_width,tile_height,depth,3)) + # paint[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, + # y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start, :] = results + # weight = da.zeros((x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start), dtype=np.float32, chunks=(tile_width, tile_height)) + # weight[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, + # y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = blend_ramp + paint = results + weight = blend_ramp + # add the result to corresponding blocks in the block_map + for chunk_x_id in range(x0_chunk, x1_chunk + 1): + for chunk_y_id in range(y0_chunk, y1_chunk + 1): + block_id = (chunk_x_id, chunk_y_id) + block_map[block_id].append(paint[ + (chunk_x_id - x0_chunk) * chunk_x: ( + chunk_x_id - x0_chunk + 1) * chunk_x, + (chunk_y_id - y0_chunk) * chunk_y: ( + chunk_y_id - y0_chunk + 1) * chunk_y, + ...]) + weight_map[block_id].append(weight[ + (chunk_x_id - x0_chunk) * chunk_x: ( + chunk_x_id - x0_chunk + 1) * chunk_x, + (chunk_y_id - y0_chunk) * chunk_y: ( + chunk_y_id - y0_chunk + 1) * chunk_y, + ]) + + # all_results.append((x0,y0,results)) + # for chunk_x_id in range(x0// chunk_x, (x0 + tile_width) // chunk_x + 1): + # for chunk_y_id in range(y0 // chunk_y, (y0 + tile_height) // chunk_y + 1): + # block_id = (chunk_x_id, chunk_y_id) + # block_map[block_id].append((x0, y0, results)) + + ## by tile approch + # all_tiles = da.stack(tiles, axis=0) + # def _sum_by_tile(block, block_id=None): + # x0 ,y0 = coords[block_id[0]] + # row_slice = slice(x0, x0 + tile_width) + # col_slice = slice(y0, y0 + tile_height) + # canvas[row_slice, col_slice, :] += block + # weight[row_slice, col_slice] += blend_ramp + + # return block + # all_tiles = da.map_blocks( + # _sum_by_tile, + # all_tiles, # drives shape + chunks + # dtype=all_tiles.dtype, + # chunks=all_tiles.chunks # keep exactly the same chunk‐structure + # ) + # all_tiles.compute() + # canvas /= weight[..., None, None] + 1e-10 # avoid division by zero + # dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + # return [dBI_canvas, R3D_canvas, O3D_canvas] + + def _sum_overlapping(block, *args, block_id=None): + block_id = block_id[:2] + paints = block_map[block_id] + weights = weight_map[block_id] + + return dask.sum(da.stack(paints, axis=0), axis=0) / dask.sum( + da.stack(weights, axis=0), axis=0) + + # args = (tiles_list, coords_list, full_shape, chunk_shape) + tiles_list, coords_list = args + + # block_info[0]['array-location'] is something like ((row_start, row_stop), + # (col_start, col_stop)) + info = block_info[0] + (row_start, row_stop), (col_start, col_stop) = info['array-location'][:2] + block_h = row_stop - row_start + block_w = col_stop - col_start + + out = da.zeros((block_h, block_w), dtype=block.dtype) + weight = da.zeros((block_h, block_w), dtype=np.float32) + for tile_arr, (x0, y0) in zip(tiles_list, coords_list): + x1 = x0 + tile_arr.shape[0] + y1 = y0 + tile_arr.shape[1] + + # Overlap of [row_start:row_stop] with [x0:x1]: + rs = max(row_start, x0) + re = min(row_stop, x1) + cs = max(col_start, y0) + ce = min(col_stop, y1) + + if (re > rs) and (ce > cs): + # compute the slices + tile_rs = rs - x0; + tile_re = re - x0 + tile_cs = cs - y0; + tile_ce = ce - y0 + out_rs = rs - row_start + out_re = re - row_start + out_cs = cs - col_start + out_ce = ce - col_start + + out[out_rs:out_re, out_cs:out_ce] += tile_arr[tile_rs:tile_re, + tile_cs:tile_ce] + weight[out_rs:out_re, out_cs:out_ce] += blend_ramp[tile_rs:tile_re, + tile_cs:tile_ce] + out /= weight + 1e-10 # avoid division by zero + + return out + + canvas = da.map_blocks( + _sum_overlapping, + canvas, # drives shape + chunks + tiles, # will be “tiles_list” inside args + coords, # “coords_list” inside args + dtype=canvas.dtype, + chunks=(tile_width, tile_height, depth, 3) + # keep exactly the same chunk‐structure + ) + dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + return [dBI_canvas, R3D_canvas, O3D_canvas] + + # def cal(_, block_info=None): + # block_id = block_info[0]['chunk-location'][:2] + # array_location = block_info[0]['array-location'] + # x_location, y_location = array_location[:2] + # x_start, x_end = x_location + # y_start, y_end = y_location + # + # blocks = block_map[block_id] + # canvas, weight = [], [] + # for x0,y0,block in blocks: + # ramp = blend_ramp + # if x0 < x_start: + # ramp = ramp[x_start - x0:, :] + # block = block[x_start - x0:, :, :] + # elif x0 > x_start: + # # pad the ramp and block to the left + # ramp = da.pad(ramp, ((x0 - x_start, 0), (0, 0)), mode='constant') + # block = da.pad(block, ((x0 - x_start, 0), (0, 0), (0, 0)), mode='constant') + # if y0 < y_start: + # ramp = ramp[:, y_start - y0:] + # block = block[:, y_start - y0:, :] + # elif y0 > y_start: + # # pad the ramp and block to the top + # ramp = da.pad(ramp, ((0, 0), (y0 - y_start, 0)), mode='constant') + # block = da.pad(block, ((0, 0), (y0 - y_start, 0), (0, 0)), mode='constant') + # if x_start + ramp.shape[0] > x_end: + # ramp = ramp[:x_end - x_start, :] + # block = block[:x_end - x_start, :, :] + # elif x_start + ramp.shape[0] < x_end: + # # pad the ramp and block to the right + # ramp = da.pad(ramp, ((0, x_end - (x_start + ramp.shape[0])), (0, 0)), mode='constant') + # block = da.pad(block, ((0, x_end - (x_start + block.shape[0])), (0, 0), (0, 0)), mode='constant') + # if y_start + ramp.shape[1] > y_end: + # ramp = ramp[:, :y_end - y_start] + # block = block[:, :y_end - y_start, :] + # elif y_start + ramp.shape[1] < y_end: + # # pad the ramp and block to the bottom + # ramp = da.pad(ramp, ((0, 0), (0, y_end - (y_start + ramp.shape[1]))), mode='constant') + # block = da.pad(block, ((0, 0), (0, y_end - (y_start + block.shape[1])), (0, 0)), mode='constant') + # + # canvas.append(block) + # weight.append(ramp) + # print(canvas) + # if not canvas: + # return _ + # canvas = da.sum(da.stack(canvas, axis=0), axis=0) + # weight = da.sum(da.stack(weight, axis=0), axis=0) + # return canvas/weight[:,:,None,None] + # + # canvas = da.map_blocks(cal,canvas,dtype=np.float32) + # + # # canvas /= weight[..., None, None] + # dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] + # return [dBI_canvas, R3D_canvas, O3D_canvas] + + def process_complex3d(complex3d, raw_tile_width): complex3d = complex3d.rechunk({0:raw_tile_width}) comp = complex3d.reshape( From 99cb6f6dff8ca41e6d2ca3f9589738222bb970ee Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 17 Jun 2025 14:05:50 -0400 Subject: [PATCH 035/157] wip: psoct, finalize optimization --- linc_convert/modalities/psoct/mosaic3d.py | 824 +--------------------- 1 file changed, 13 insertions(+), 811 deletions(-) diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py index b29573bb..c50c0959 100644 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ b/linc_convert/modalities/psoct/mosaic3d.py @@ -5,7 +5,7 @@ import logging import os.path as op import warnings -from multiprocessing.managers import Value +from collections import defaultdict from typing import Annotated import cyclopts @@ -20,18 +20,17 @@ from cyclopts import Parameter from dask import delayed from dask.diagnostics import ProgressBar +from niizarr import default_nifti_header, write_ome_metadata from linc_convert.modalities.psoct.cli import psoct from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ - _compute_blending_ramp, _load_mat_tile, _load_nifti_tile, _load_tile + _compute_blending_ramp, _load_nifti_tile, _load_tile from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ find_experiment_params, atleast_2d_trailing from linc_convert.modalities.psoct.utils._zarr import default_write_config -from linc_convert.utils.math import ceildiv from linc_convert.utils.zarr.create_array import compute_zarr_layout from linc_convert.utils.zarr.generate_pyramid import generate_pyramid_new from linc_convert.utils.zarr.zarr_config import ZarrConfig -from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata logger = logging.getLogger(__name__) mosaic3d = cyclopts.App(name="mosaic3d", help_format="markdown") @@ -211,6 +210,7 @@ def temporary_compensation(dBI, R3D, O3D, depth, focus, scan_info): O3D = np.where(do_shift[..., None], O3D_shift, O3D) return da.stack([dBI,R3D,O3D], 3) + def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, full_height, depth, flip_z, map_indices, scan_info, tile_width, tile_height, x_coords, y_coords, raw_tile_width, focus, temp_compensate, @@ -257,10 +257,8 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] tiles.append(results) coords.append((x0, y0)) - if tile_idx > 50: - break - return stitch_map_block( + return stitch_tiles( coords, tiles, full_width=full_width, full_height=full_height, depth=depth, blend_ramp=blend_ramp, @@ -269,179 +267,6 @@ def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, ful ) -from collections import defaultdict - -def stitch_baseline(coords, tiles, full_width, full_height, depth, - blend_ramp, tile_size, chunk, **_): - canvas = da.zeros((full_width, full_height, depth, 3), - chunks=(*chunk[::-1], 3), dtype=np.float32) - weight = da.zeros((full_width, full_height), - chunks=(*chunk[::-1][:-1],), dtype=np.float32) - - arr=da.sum(da.stack(tiles, axis=0), axis=0) - with ProgressBar(): - arr.compute() - logger.info("finished") - return [canvas[..., i] for i in range(3)] - - - -def stitch_addition(coords, tiles, full_width, full_height, depth, - blend_ramp, tile_size, chunk, **_): - canvas = da.zeros((full_width, full_height, depth, 3), - chunks=(*chunk[::-1], 3), dtype=np.float32) - weight = da.zeros((full_width, full_height), - chunks=(*chunk[::-1][:-1],), dtype=np.float32) - - for (x0, y0), t in zip(coords, tiles): - rs = slice(x0, x0 + tile_size[0]) - cs = slice(y0, y0 + tile_size[1]) - canvas[rs, cs] += t - weight[rs, cs] += blend_ramp - - canvas /= weight[..., None, None] - return [canvas[..., i] for i in range(3)] - - -def stitch_sparse_padding(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Same as native_padding but convert to sparse. COO per‐block before summing. - """ - pw, ph = tile_size - paints = [] - weights = [] - - for (x0, y0), t in zip(coords, tiles): - # build a full‐canvas tile with zeros - paint = da.zeros((full_width, full_height, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - weight_paint = da.zeros((full_width, full_height), - chunks=(pw, ph), - dtype=np.float32) - - rs = slice(x0, x0 + pw) - cs = slice(y0, y0 + ph) - paint[rs, cs, ...] = t - weight_paint[rs, cs] = blend_ramp - - paints.append(da.map_blocks(sparse.COO, paint)) - weights.append(da.map_blocks(sparse.COO, weight_paint)) - - canvas = da.sum(da.stack(paints, axis=0), axis=0) - weight = da.sum(da.stack(weights, axis=0), axis=0) - - canvas /= weight[..., None, None] - return [canvas[..., i] for i in range(3)] - - -def stitch_native_padding(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Per‐tile da.pad to full‐canvas, then stack & sum (build_slice_native_padding). - """ - pw, ph = tile_size - canvases = [] - weights = [] - - for (x0, y0), t in zip(coords, tiles): - # pad amounts = ((before_x, after_x), (before_y, after_y), (0,0), (0,0)) - pad_t = ((x0, full_width - x0 - pw), - (y0, full_height - y0 - ph), - (0, 0), - (0, 0)) - pad_w = ((x0, full_width - x0 - pw), - (y0, full_height - y0 - ph)) - - canvases.append(da.pad(t, pad_t).astype(np.float32)) - weights.append(da.pad(blend_ramp, pad_w).astype(np.float32)) - - canvas = da.sum(da.stack(canvases, axis=0), axis=0) - weight = da.sum(da.stack(weights, axis=0), axis=0) - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - return [canvas[..., i] for i in range(3)] - - -def stitch_chunked_padding(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Chunk‐aligned padding + per‐block summation (build_slice_chunked_padding). - """ - pw, ph = tile_size - # final canvas & weight - canvas = da.zeros((full_width, full_height, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - weight = da.zeros((full_width, full_height), - chunks=(pw, ph), - dtype=np.float32) - - # collect per‐chunk pieces - block_tiles = defaultdict(list) - block_weights = defaultdict(list) - - for (x0, y0), t in zip(coords, tiles): - # which tile‐chunks this falls into? - x0c = x0 // pw - y0c = y0 // ph - x1c = (x0 + pw - 1) // pw - y1c = (y0 + ph - 1) // ph - - # pad region covering those chunks - x_start = x0c * pw - y_start = y0c * ph - x_end = (x1c + 1) * pw - y_end = (y1c + 1) * ph - - block_canvas = da.zeros((x_end - x_start, y_end - y_start, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - block_weight = da.zeros((x_end - x_start, y_end - y_start), - chunks=(pw, ph), - dtype=np.float32) - - # place tile into that big block - xs = slice(x0 - x_start, x0 - x_start + pw) - ys = slice(y0 - y_start, y0 - y_start + ph) - block_canvas[xs, ys, ...] = t - block_weight[xs, ys] = blend_ramp - - # chop into per‐chunk pieces - for cx in range(x0c, x1c + 1): - for cy in range(y0c, y1c + 1): - bid = (cx, cy) - sub_x = slice((cx - x0c) * pw, (cx - x0c + 1) * pw) - sub_y = slice((cy - y0c) * ph, (cy - y0c + 1) * ph) - block_tiles[bid].append(block_canvas[sub_x, sub_y, ...]) - block_weights[bid].append(block_weight[sub_x, sub_y]) - - # assemble each chunk back into final canvas - for (cx, cy), pieces in block_tiles.items(): - rs = slice(cx * pw, min((cx + 1) * pw, full_width)) - cs = slice(cy * ph, min((cy + 1) * ph, full_height)) - - summed = da.sum(da.stack(pieces, axis=0), axis=0) - wsum = da.sum(da.stack(block_weights[(cx, cy)], axis=0), axis=0) - - # trim edges if needed - summed = summed[: rs.stop - rs.start, : cs.stop - cs.start, ...] - wsum = wsum[: rs.stop - rs.start, : cs.stop - cs.start] - - canvas[rs, cs, ...] = summed - weight[rs, cs] = wsum - - # normalize & clean - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - return [canvas[..., i] for i in range(3)] - - def stitch_whole_canvas_padding(coords, tiles, full_width, full_height, depth, blend_ramp, tile_size, **_): @@ -476,30 +301,27 @@ def stitch_whole_canvas_padding(coords, tiles, canvas = da.nan_to_num(canvas) return [canvas[..., i] for i in range(3)] -def _combine_block(_,block_tiles,block_weights,*args,block_info=None, **kwargs): +def _combine_block(_, block_tiles, block_weights, *args, block_info=None, **kwargs): chunk_id = tuple(block_info[None]['chunk-location'][:2]) - paints = block_tiles[chunk_id] weights = block_weights[chunk_id] - - # if no tiles hit this chunk → zero shape = block_info[None]['chunk-shape'] + if not paints: return np.broadcast_to(np.zeros((), dtype=np.float32), shape) - # pure NumPy sums - total_paint = np.sum(np.stack(paints, axis=0), axis=0) - total_weight = np.sum(np.stack(weights, axis=0), axis=0) + total_paint = da.sum(da.stack(paints, axis=0), axis=0) + total_weight = da.sum(da.stack(weights, axis=0), axis=0) return total_paint / total_weight[...,None,None] -def stitch_map_block(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): + +def stitch_tiles(coords, tiles, + full_width, full_height, depth, + blend_ramp, tile_size, **_): """ Chunk‐aligned padding + per‐block summation (build_slice_chunked_padding). """ pw, ph = tile_size - # final canvas & weight canvas = da.zeros((full_width, full_height, depth, 3), chunks=(pw, ph, depth, 3), dtype=np.float32) @@ -553,626 +375,6 @@ def stitch_map_block(coords, tiles, return [canvas[..., i] for i in range(3)] -import sparse -def per_chunk(chunk,weight=None, axis=None, keepdims=None): - if weight and not weight[0,0]: - return np.broadcast_to(np.zeros((), dtype=np.float32),) - return chunk - -def stitch_custom_reduction(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Build a full‐size zero‐canvas per tile and slice‐assign into it, - then stack & sum (build_slice_whole_canvas_padding). - """ - pw, ph = tile_size - canvases = [] - weights = [] - num_chunkx = ceildiv(full_width, pw) - num_chunky = ceildiv(full_height, ph) - masks = [] - - for (x0, y0), t in zip(coords, tiles): - canvas_tile = da.zeros((full_width, full_height, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - weight_tile = da.zeros((full_width, full_height), - chunks=(pw, ph), - dtype=np.float32) - - rs = slice(x0, x0 + pw) - cs = slice(y0, y0 + ph) - canvas_tile[rs, cs, ...] = t - weight_tile[rs, cs] = blend_ramp - x0c = x0 // pw - y0c = y0 // ph - x1c = (x0 + pw - 1) // pw - y1c = (y0 + ph - 1) // ph - mask = np.zeros((num_chunkx, num_chunky), dtype=bool) - mask[x0c:x1c + 1, y0c:y1c + 1] = True - mask=np.broadcast_to(mask[:, :, None, None] , (num_chunkx, num_chunky, pw, ph)).transpose(0, 2, 1, 3).reshape(num_chunkx*pw, num_chunky*ph)[:full_width, :full_height] - - masks.append(mask) - canvases.append(canvas_tile) - weights.append(weight_tile) - canvas = da.stack(canvases, axis=0) - weight = da.stack(weights, axis=0) - canvas = da.reduction(canvas,chunk = per_chunk, aggregate=da.sum, axis=0,dtype=np.float32) - weight = da.reduction(weight,chunk = per_chunk, aggregate=da.sum, axis=0, dtype=np.float32) - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - return [canvas[..., i] for i in range(3)] - - -def build_slice_chunked_padding(mosaic_idx, input_file_template, blend_ramp, clip_x, - clip_y, full_width, - full_height, depth, flip_z, map_indices, scan_info, - tile_width, - tile_height, x_coords, y_coords, raw_tile_width, focus, - temp_compensate, chunk): - canvas = dask.array.zeros((full_width, full_height, depth, 3), - chunks=(tile_width, tile_height, depth, 3), - dtype=np.float32) - - weight = dask.array.zeros((full_width, full_height), - chunks=(tile_width, tile_height), - dtype=np.float32) - - all_blocks = defaultdict(list) - all_weights = defaultdict(list) - - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, - scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape, 3), - dtype=dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results.rechunk({3: 3}) - results = results[clip_x:, clip_y:] * blend_ramp[..., None, None] - x0_chunk = x0 // tile_width - y0_chunk = y0 // tile_height - x1_chunk = (x0 + tile_width - 1) // tile_width - y1_chunk = (y0 + tile_height - 1) // tile_height - # pad this tile to the chunk boundaries - x0_chunk_start = x0_chunk * tile_width - y0_chunk_start = y0_chunk * tile_height - x1_chunk_end = (x1_chunk + 1) * tile_width - y1_chunk_end = (y1_chunk + 1) * tile_height - canvas_tile = da.zeros( - (x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start, depth, 3), - dtype=np.float32, chunks=(tile_width, tile_height, depth, 3)) - canvas_tile[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, - y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = results - weight_tile = da.zeros( - (x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start), - dtype=np.float32, chunks=(tile_width, tile_height)) - weight_tile[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, - y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = blend_ramp - - # add the tile to corresponding blocks - for chunk_x_id in range(x0_chunk, x1_chunk + 1): - for chunk_y_id in range(y0_chunk, y1_chunk + 1): - block_id = (chunk_x_id, chunk_y_id) - all_blocks[block_id].append(canvas_tile[ - (chunk_x_id - x0_chunk) * tile_width: ( - chunk_x_id - x0_chunk + 1) * tile_width, - (chunk_y_id - y0_chunk) * tile_height: ( - chunk_y_id - y0_chunk + 1) * tile_height, - ...]) - all_weights[block_id].append(weight_tile[ - (chunk_x_id - x0_chunk) * tile_width: ( - chunk_x_id - x0_chunk + 1) * tile_width, - (chunk_y_id - y0_chunk) * tile_height: ( - chunk_y_id - y0_chunk + 1) * tile_height, - ]) - - if tile_idx > 100: - break - - for block_id, block_tiles in all_blocks.items(): - x_slice = slice(block_id[0] * tile_width, - min((block_id[0] + 1) * tile_width, full_width)) - y_slice = slice(block_id[1] * tile_height, - min((block_id[1] + 1) * tile_height, full_height)) - block_data = da.sum(da.stack(block_tiles, axis=0), axis=0) - weight_data = da.sum(da.stack(all_weights[block_id], axis=0), axis=0) - if (block_id[0] + 1) * tile_width > full_width: - block_data = block_data[:x_slice.stop - x_slice.start, ...] - weight_data = weight_data[:x_slice.stop - x_slice.start, ...] - if (block_id[1] + 1) * tile_height > full_height: - block_data = block_data[:, :y_slice.stop - y_slice.start, ...] - weight_data = weight_data[:, :y_slice.stop - y_slice.start] - - canvas[x_slice, y_slice] = block_data - weight[x_slice, y_slice] = weight_data - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - # canvas = canvas.rechunk({3:1}) - dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - return [dBI_canvas, R3D_canvas, O3D_canvas] - - -def build_slice_whole_canvas_padding(mosaic_idx, input_file_template, blend_ramp, - clip_x, clip_y, full_width, - full_height, depth, flip_z, map_indices, scan_info, - tile_width, - tile_height, x_coords, y_coords, raw_tile_width, - focus, temp_compensate, chunk): - canvas = [] - weight = [] - - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, - scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape, 3), - dtype=dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results.rechunk({3: 3}) - results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] - canvas_tile = da.zeros((full_width, full_height, depth, 3), - chunks=( - tile_width, tile_height, - depth, 3), dtype=np.float32) - canvas_tile[row_slice, col_slice, ...] = results - weight_tile = da.zeros((full_width, full_height), chunks=( - tile_width, tile_height), - dtype=np.float32) - weight_tile[row_slice, col_slice] = blend_ramp - canvas.append(canvas_tile) - weight.append(weight_tile) - if tile_idx > 100: - break - - canvas = da.sum(da.stack(canvas, axis=0), axis=0) - weight = da.sum(da.stack(weight, axis=0), axis=0) - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - # canvas = canvas.rechunk({3:1}) - dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - return [dBI_canvas, R3D_canvas, O3D_canvas] - - -def build_slice_whole_canvas_custom_reduction(mosaic_idx, input_file_template, - blend_ramp, clip_x, clip_y, full_width, - full_height, depth, flip_z, map_indices, - scan_info, tile_width, - tile_height, x_coords, y_coords, - raw_tile_width, focus, temp_compensate, - chunk): - canvas = [] - weight = [] - - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape,3), dtype= dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results.rechunk({3: 3}) - results = results[clip_x:, clip_y:]*blend_ramp[:,:,None,None] - canvas_tile = da.zeros((full_width, full_height, depth, 3), - chunks=( - tile_width, tile_height, - depth, 3), dtype=np.float32) - canvas_tile[row_slice, col_slice, ...] = results - weight_tile = da.zeros((full_width, full_height), chunks=( - tile_width, tile_height), - dtype=np.float32) - weight_tile[row_slice, col_slice] = blend_ramp - x0_chunk = x0 // tile_width - y0_chunk = y0 // tile_height - x1_chunk = (x0 + tile_width - 1) // tile_width - y1_chunk = (y0 + tile_height - 1) // tile_height - - canvas.append(canvas_tile) - weight.append(weight_tile) - if tile_idx > 100: - break - - canvas = da.sum(da.stack(canvas, axis=0), axis=0) - weight = da.sum(da.stack(weight, axis=0), axis=0) - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - # canvas = canvas.rechunk({3:1}) - dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - return [dBI_canvas, R3D_canvas, O3D_canvas] - - -def build_slice_baseline(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, - full_width, - full_height, depth, flip_z, map_indices, scan_info, tile_width, - tile_height, x_coords, y_coords, raw_tile_width, focus, - temp_compensate, chunk): - all_results = [] - all_weights = [] - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, - scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape, 3), - dtype=dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] - all_results.append(results) - all_weights.append(blend_ramp) - - canvas = da.sum(da.stack(all_results, axis=0), axis=0) - weight = da.sum(da.stack(all_weights, axis=0), axis=0) - # for i in range(len(all_results)): - # all_results[i] = da.stack(all_results[i], axis=1) - # all_weights[i] = da.stack(all_weights[i], axis=1) - # canvas = da.stack(all_results, axis=0) - # weight = da.stack(all_weights, axis=0) - - canvas /= weight[..., None, None] - canvas.compute() - logger.info("finished") - dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - return [dBI_canvas, R3D_canvas, O3D_canvas] - - -def build_slice_old(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, - full_width, - full_height, depth, flip_z, map_indices, scan_info, tile_width, - tile_height, x_coords, y_coords, raw_tile_width, focus, - temp_compensate, chunk): - chunk = chunk[::-1] - chunk_x, chunk_y = chunk[:2] - all_results = [] - canvas = dask.array.zeros((full_width, full_height, depth, 3), chunks=(*chunk, 3), - dtype=np.float32) - weight = dask.array.zeros((full_width, full_height), chunks=(*chunk[:-1],), - dtype=np.float32) - - block_map = defaultdict(list) - weight_map = defaultdict(list) - coords = [] - tiles = [] - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, - scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape, 3), - dtype=dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] - - coords.append((x0, y0)) - tiles.append(results) - # find the all chunks this tile overlaps with - x0_chunk = x0 // chunk_x - y0_chunk = y0 // chunk_y - x1_chunk = (x0 + tile_width) // chunk_x - y1_chunk = (y0 + tile_height) // chunk_y - # pad this tile to the chunk boundaries - x0_chunk_start = x0_chunk * chunk_x - y0_chunk_start = y0_chunk * chunk_y - x1_chunk_end = (x1_chunk + 1) * chunk_x - y1_chunk_end = (y1_chunk + 1) * chunk_y - # paint = da.zeros((x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start, depth, 3), dtype=np.float32, chunks=(tile_width,tile_height,depth,3)) - # paint[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, - # y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start, :] = results - # weight = da.zeros((x1_chunk_end - x0_chunk_start, y1_chunk_end - y0_chunk_start), dtype=np.float32, chunks=(tile_width, tile_height)) - # weight[x0 - x0_chunk_start:x0 + tile_width - x0_chunk_start, - # y0 - y0_chunk_start:y0 + tile_height - y0_chunk_start] = blend_ramp - paint = results - weight = blend_ramp - # add the result to corresponding blocks in the block_map - for chunk_x_id in range(x0_chunk, x1_chunk + 1): - for chunk_y_id in range(y0_chunk, y1_chunk + 1): - block_id = (chunk_x_id, chunk_y_id) - block_map[block_id].append(paint[ - (chunk_x_id - x0_chunk) * chunk_x: ( - chunk_x_id - x0_chunk + 1) * chunk_x, - (chunk_y_id - y0_chunk) * chunk_y: ( - chunk_y_id - y0_chunk + 1) * chunk_y, - ...]) - weight_map[block_id].append(weight[ - (chunk_x_id - x0_chunk) * chunk_x: ( - chunk_x_id - x0_chunk + 1) * chunk_x, - (chunk_y_id - y0_chunk) * chunk_y: ( - chunk_y_id - y0_chunk + 1) * chunk_y, - ]) - - # all_results.append((x0,y0,results)) - # for chunk_x_id in range(x0// chunk_x, (x0 + tile_width) // chunk_x + 1): - # for chunk_y_id in range(y0 // chunk_y, (y0 + tile_height) // chunk_y + 1): - # block_id = (chunk_x_id, chunk_y_id) - # block_map[block_id].append((x0, y0, results)) - - ## by tile approch - # all_tiles = da.stack(tiles, axis=0) - # def _sum_by_tile(block, block_id=None): - # x0 ,y0 = coords[block_id[0]] - # row_slice = slice(x0, x0 + tile_width) - # col_slice = slice(y0, y0 + tile_height) - # canvas[row_slice, col_slice, :] += block - # weight[row_slice, col_slice] += blend_ramp - - # return block - # all_tiles = da.map_blocks( - # _sum_by_tile, - # all_tiles, # drives shape + chunks - # dtype=all_tiles.dtype, - # chunks=all_tiles.chunks # keep exactly the same chunk‐structure - # ) - # all_tiles.compute() - # canvas /= weight[..., None, None] + 1e-10 # avoid division by zero - # dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - # return [dBI_canvas, R3D_canvas, O3D_canvas] - - def _sum_overlapping(block, *args, block_id=None): - block_id = block_id[:2] - paints = block_map[block_id] - weights = weight_map[block_id] - - return dask.sum(da.stack(paints, axis=0), axis=0) / dask.sum( - da.stack(weights, axis=0), axis=0) - - # args = (tiles_list, coords_list, full_shape, chunk_shape) - tiles_list, coords_list = args - - # block_info[0]['array-location'] is something like ((row_start, row_stop), - # (col_start, col_stop)) - info = block_info[0] - (row_start, row_stop), (col_start, col_stop) = info['array-location'][:2] - block_h = row_stop - row_start - block_w = col_stop - col_start - - out = da.zeros((block_h, block_w), dtype=block.dtype) - weight = da.zeros((block_h, block_w), dtype=np.float32) - for tile_arr, (x0, y0) in zip(tiles_list, coords_list): - x1 = x0 + tile_arr.shape[0] - y1 = y0 + tile_arr.shape[1] - - # Overlap of [row_start:row_stop] with [x0:x1]: - rs = max(row_start, x0) - re = min(row_stop, x1) - cs = max(col_start, y0) - ce = min(col_stop, y1) - - if (re > rs) and (ce > cs): - # compute the slices - tile_rs = rs - x0; - tile_re = re - x0 - tile_cs = cs - y0; - tile_ce = ce - y0 - out_rs = rs - row_start - out_re = re - row_start - out_cs = cs - col_start - out_ce = ce - col_start - - out[out_rs:out_re, out_cs:out_ce] += tile_arr[tile_rs:tile_re, - tile_cs:tile_ce] - weight[out_rs:out_re, out_cs:out_ce] += blend_ramp[tile_rs:tile_re, - tile_cs:tile_ce] - out /= weight + 1e-10 # avoid division by zero - - return out - - canvas = da.map_blocks( - _sum_overlapping, - canvas, # drives shape + chunks - tiles, # will be “tiles_list” inside args - coords, # “coords_list” inside args - dtype=canvas.dtype, - chunks=(tile_width, tile_height, depth, 3) - # keep exactly the same chunk‐structure - ) - dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - return [dBI_canvas, R3D_canvas, O3D_canvas] - - # def cal(_, block_info=None): - # block_id = block_info[0]['chunk-location'][:2] - # array_location = block_info[0]['array-location'] - # x_location, y_location = array_location[:2] - # x_start, x_end = x_location - # y_start, y_end = y_location - # - # blocks = block_map[block_id] - # canvas, weight = [], [] - # for x0,y0,block in blocks: - # ramp = blend_ramp - # if x0 < x_start: - # ramp = ramp[x_start - x0:, :] - # block = block[x_start - x0:, :, :] - # elif x0 > x_start: - # # pad the ramp and block to the left - # ramp = da.pad(ramp, ((x0 - x_start, 0), (0, 0)), mode='constant') - # block = da.pad(block, ((x0 - x_start, 0), (0, 0), (0, 0)), mode='constant') - # if y0 < y_start: - # ramp = ramp[:, y_start - y0:] - # block = block[:, y_start - y0:, :] - # elif y0 > y_start: - # # pad the ramp and block to the top - # ramp = da.pad(ramp, ((0, 0), (y0 - y_start, 0)), mode='constant') - # block = da.pad(block, ((0, 0), (y0 - y_start, 0), (0, 0)), mode='constant') - # if x_start + ramp.shape[0] > x_end: - # ramp = ramp[:x_end - x_start, :] - # block = block[:x_end - x_start, :, :] - # elif x_start + ramp.shape[0] < x_end: - # # pad the ramp and block to the right - # ramp = da.pad(ramp, ((0, x_end - (x_start + ramp.shape[0])), (0, 0)), mode='constant') - # block = da.pad(block, ((0, x_end - (x_start + block.shape[0])), (0, 0), (0, 0)), mode='constant') - # if y_start + ramp.shape[1] > y_end: - # ramp = ramp[:, :y_end - y_start] - # block = block[:, :y_end - y_start, :] - # elif y_start + ramp.shape[1] < y_end: - # # pad the ramp and block to the bottom - # ramp = da.pad(ramp, ((0, 0), (0, y_end - (y_start + ramp.shape[1]))), mode='constant') - # block = da.pad(block, ((0, 0), (0, y_end - (y_start + block.shape[1])), (0, 0)), mode='constant') - # - # canvas.append(block) - # weight.append(ramp) - # print(canvas) - # if not canvas: - # return _ - # canvas = da.sum(da.stack(canvas, axis=0), axis=0) - # weight = da.sum(da.stack(weight, axis=0), axis=0) - # return canvas/weight[:,:,None,None] - # - # canvas = da.map_blocks(cal,canvas,dtype=np.float32) - # - # # canvas /= weight[..., None, None] - # dBI_canvas, R3D_canvas, O3D_canvas = canvas[..., 0], canvas[..., 1], canvas[..., 2] - # return [dBI_canvas, R3D_canvas, O3D_canvas] - def process_complex3d(complex3d, raw_tile_width): complex3d = complex3d.rechunk({0:raw_tile_width}) From cc8022174dbdff77c424b329deb4fdc0e73e673f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 20 Jun 2025 15:23:39 -0400 Subject: [PATCH 036/157] stage: remove testing modalities --- linc_convert/modalities/psoct/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index 7e57f346..5ebd30d1 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume", "ms_dask", "exp_dask", "mosaic3d","mosaic2d"] - from . import cli, multi_slice, single_volume, ms_dask, exp_dask, mosaic3d, mosaic2d + __all__ = ["cli", "multi_slice", "single_volume", "mosaic3d","mosaic2d"] + from . import cli, multi_slice, single_volume, mosaic3d, mosaic2d except ImportError: pass From 39b0e651597a4b2d90d6782aba12a8a84a055f05 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 20 Jun 2025 15:29:06 -0400 Subject: [PATCH 037/157] stage: remove mosaic pipelines for review --- linc_convert/modalities/psoct/__init__.py | 4 +- linc_convert/modalities/psoct/exp_dask.py | 124 ------ linc_convert/modalities/psoct/mosaic2d.py | 392 ----------------- linc_convert/modalities/psoct/mosaic3d.py | 501 ---------------------- linc_convert/modalities/psoct/ms_dask.py | 263 ------------ 5 files changed, 2 insertions(+), 1282 deletions(-) delete mode 100644 linc_convert/modalities/psoct/exp_dask.py delete mode 100644 linc_convert/modalities/psoct/mosaic2d.py delete mode 100644 linc_convert/modalities/psoct/mosaic3d.py delete mode 100644 linc_convert/modalities/psoct/ms_dask.py diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index 5ebd30d1..d9bb1a68 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -4,7 +4,7 @@ import h5py as _h5py # noqa: F401 import scipy as _scipy # noqa: F401 - __all__ = ["cli", "multi_slice", "single_volume", "mosaic3d","mosaic2d"] - from . import cli, multi_slice, single_volume, mosaic3d, mosaic2d + __all__ = ["cli", "multi_slice", "single_volume"] + from . import cli, multi_slice, single_volume except ImportError: pass diff --git a/linc_convert/modalities/psoct/exp_dask.py b/linc_convert/modalities/psoct/exp_dask.py deleted file mode 100644 index 01365351..00000000 --- a/linc_convert/modalities/psoct/exp_dask.py +++ /dev/null @@ -1,124 +0,0 @@ -""" -Matlab to OME-Zarr. - -Converts Matlab files generated by the MGH in-house OCT pipeline -into a OME-ZARR pyramid. - -WARNING: THIS IS ONLY FOR TESTING IO. NEVER USE FOR PRODUCTION -""" - -from typing import Optional -import logging - -import cyclopts -import numpy as np -from dask import delayed -from scipy.io import loadmat - -from linc_convert import utils -from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.zarr import open_zarr_group, create_array -import dask.array as da - -from linc_convert.utils.zarr.zarr_config import ZarrConfig - -logger = logging.getLogger(__name__) -exp_dask = cyclopts.App(name="exp_dask", help_format="markdown") -psoct.command(exp_dask) - -@delayed -def load_mat_array(file, key): - return loadmat(file)[key] - -@exp_dask.default -def convert( - inp: list[str], - *, - zarr_config: ZarrConfig = None, - key: Optional[str] = None, - meta: str = None, - orientation: str = "RAS", - center: bool = True, - dtype: Optional[str] = None, - store: bool = True, - **kwargs -) -> None: - """ - Matlab to OME-Zarr. - - Convert OCT volumes in raw matlab files into a pyramidal - OME-ZARR (or NIfTI-Zarr) hierarchy. - - This command assumes that each slice in a volume is stored in a - different mat file. All slices must have the same shape and will be - concatenated into a 3D Zarr. - - Parameters - ---------- - inp : list of str - Paths to the input mat files. - key : Optional[str] - Key of the array to be extracted; defaults to the first key found. - meta : str - Path to the metadata file. - orientation : str - Orientation of the volume. - center : bool - Set RAS[0, 0, 0] at FOV center. - dtype : Optional[str] - Data type to write into. - """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - vx = [1, 1, 1] - unit = "um" - logger.info("start") - # Prepare Zarr group - omz = open_zarr_group(zarr_config) - - dtype = np.float32 - nslices = len(inp) - data = [load_mat_array(inp[i], "R3D") for i in range(nslices)] - - slices = [da.from_delayed(i, shape=(350,350,1000), dtype=dtype) for i in data] - nested = np.array([None]*80, dtype=object) - for i in range(80): - nested[i] = slices[i] - nested=nested.reshape((4, 4, 5)) - # Convert the numpy array into a nested list - nested_list = nested.tolist() - - # Now concatenate the rows vertically - full_volume = da.block(nested_list) - print(full_volume.shape) - - dataset = create_array(omz, "0", shape=full_volume.shape, zarr_config=zarr_config, - dtype=np.dtype(dtype)) - if dataset.shards is None: - full_volume.to_zarr(dataset) - else: - full_volume = full_volume.rechunk(dataset.shards) - if store: - full_volume.store(dataset) - else: - def save(chunk,block_info=None): - slicer = tuple(slice(*al) for al in block_info[0]['array-location']) - dataset[slicer] = chunk - return 0 - full_volume.map_blocks(save, dtype=np.uint8).compute() - - - # generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) - # logger.info("Write OME-Zarr multiscale metadata") - # write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) - def print_proc_io(): - try: - with open("/proc/self/io", "r") as proc_io: - content = proc_io.read() - print(content) - except Exception as e: - print("Error reading /proc/self/io:", e) - - print_proc_io() - if not zarr_config.nii: - logger.info("Conversion complete.") - return diff --git a/linc_convert/modalities/psoct/mosaic2d.py b/linc_convert/modalities/psoct/mosaic2d.py deleted file mode 100644 index 34ac4593..00000000 --- a/linc_convert/modalities/psoct/mosaic2d.py +++ /dev/null @@ -1,392 +0,0 @@ -""" -This module includes components that are based on the https://github.com/CarolineMagnain/OCTAnalysis repository (currently private). We have permission from the owner to include the code here. -""" - -import logging -import os.path as op -from colorsys import hsv_to_rgb -from typing import Optional, Tuple, Dict - -import cyclopts -import dask -import dask.array as da -import imageio -import nibabel as nib -import numpy as np -import scipy.io as sio -import tensorstore as ts -from skimage.exposure import exposure - -from linc_convert.modalities.psoct.cli import psoct -from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ - atleast_2d_trailing, find_experiment_params, load_mat -from linc_convert.modalities.psoct.utils._zarr import default_write_config -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr.create_array import compute_zarr_layout - -logger = logging.getLogger(__name__) -mosaic2d = cyclopts.App(name="mosaic2d", help_format="markdown") -psoct.command(mosaic2d) - - -@mosaic2d.default -def mosaic2d_telesto( - parameter_file: str, - *, - modality: str, - method: str = None, - tilted_illumination: bool = False, - tiff_output_dir: str = None, - zarr_config: ZarrConfig = None, -) -> None: - """ - Python translation of Mosaic2D_Telesto. - - Parameters - ---------- - inp : str - Paths - - """ - logger.info(f"--Modality is {modality}--") - tilt_postfix = '_tilt' if tilted_illumination else '' - - # Load .mat containing Parameters, Scan, and Mosaic2D - raw_mat = sio.loadmat(parameter_file, squeeze_me=True) - params = struct_arr_to_dict(raw_mat['Parameters']) - scan_info = struct_arr_to_dict(raw_mat['Scan']) - mosaic_info = struct_arr_to_dict(raw_mat['Mosaic2D']) - exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) - - slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) - input_dirs = np.atleast_1d(mosaic_info['indir']) - file_format_template = mosaic_info['file_format'] - file_type = mosaic_info['InFileType'].lower() - transpose_needed = bool(params['transpose']) - no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' - - clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) - if scan_info['System'].lower() == 'octopus': - clip_x, clip_y = clip_y, clip_x - - tile_size = int(exp_params['NbPix']) - tile_width, tile_height = tile_size - clip_x, tile_size - clip_y - if tilted_illumination: - tile_width = int(exp_params['NbPix' + tilt_postfix]) - clip_x - x_coords, y_coords = _normalize_tile_coords( - exp_params[method]['X_Mean'] if method else exp_params['X_Mean' + tilt_postfix], - exp_params[method]['Y_Mean'] if method else exp_params['Y_Mean' + tilt_postfix], - ) - full_width = int(np.nanmax(x_coords) + tile_width) - full_height = int(np.nanmax(y_coords) + tile_height) - depth = 4 if modality.lower() == 'orientation' else 1 - blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) - - gray_range, save_tiff = _get_gray_range(params, modality) - if not save_tiff: - tiff_output_dir = None - - modality_token = _select_modality_token(raw_mat, modality) - map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params[ - 'First_Tile' + tilt_postfix] - 1 - - num_slices = slice_indices.shape[1] - slices = [ - build_slice(s, slice_indices=slice_indices, scan_info=scan_info, - exp_params=exp_params, input_dirs=input_dirs, - file_format_template=file_format_template, file_type=file_type, - modality=modality, modality_token=modality_token, - blend_ramp=blend_ramp, map_indices=map_indices, - tile_width=tile_width, tile_height=tile_height, - full_width=full_width, full_height=full_height, depth=depth, - x_coords=x_coords, y_coords=y_coords, clip_x=clip_x, clip_y=clip_y, - transpose_needed=transpose_needed, tiff_output_dir=tiff_output_dir, - gray_range=gray_range, tilted_illumination=tilted_illumination, - no_tilted_illumination_scan = no_tilted_illumination_scan) for s in - range(num_slices)] - arr = da.stack(slices,axis=-1) - #TODO: stack 2d -> nifti = arr.rot90.swapaxes(0,1) - chunk, shard = compute_zarr_layout(arr.shape, arr.dtype, zarr_config) - write_cfg = default_write_config(op.join(zarr_config.out, '0'), arr.shape, dtype=np.float32, - chunk=chunk, shard=shard) - if shard: - arr = da.rechunk(arr,chunks=shard) - else: - arr = da.rechunk(arr,chunks=chunk) - write_cfg["create"] = True - write_cfg["delete_existing"] = True - - tswriter = ts.open(write_cfg).result() - arr.store(tswriter) - - return None - - -def build_slice(slice_idx, slice_indices, scan_info, exp_params, input_dirs, - file_format_template, file_type, modality, modality_token, blend_ramp, - map_indices, tile_width, tile_height, full_width, full_height, depth, - x_coords, y_coords, clip_x, clip_y, transpose_needed, tiff_output_dir, - gray_range, tilted_illumination, no_tilted_illumination_scan): - lower_mod = modality.lower() - slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_idx] - mosaic_idx = 2 * slice_idx_in - 1 - if tilted_illumination: - mosaic_idx += 1 - if no_tilted_illumination_scan: - mosaic_idx = slice_idx_in - - input_dir = input_dirs[int(slice_idx_run) - 1] - file_path_template = op.join(input_dir, file_format_template) - canvas = da.zeros((full_width, full_height, depth), dtype=np.float32, - chunks='auto') - weight = da.zeros((full_width, full_height), dtype=np.float32, chunks='auto') - for (index_row, index_column), tile_idx in np.ndenumerate(map_indices): - if tile_idx <= 0 or np.isnan(x_coords[index_row, index_column]) or np.isnan( - y_coords[index_row, index_column]): - continue - r0 = int(x_coords[index_row, index_column]) - c0 = int(y_coords[index_row, index_column]) - row_slice = slice(r0, r0 + tile_width) - col_slice = slice(c0, c0 + tile_height) - tile_id = tile_idx - - if file_type == 'mat': - arr = _load_mat_tile( - get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) - elif file_type == 'nifti': - if modality == "mus": - arr = _load_nifti_tile( - get_volname(file_path_template, mosaic_idx, tile_id, "cropped")) - else: - arr = _load_nifti_tile( - get_volname(file_path_template, mosaic_idx, tile_id, modality_token)) - else: - raise ValueError(f"Unsupported file type: {file_type}") - - if scan_info['System'].lower() == 'octopus': - arr = np.swapaxes(arr, 0, 1) - if transpose_needed: - arr = np.swapaxes(arr, 0, 1) - arr = arr[clip_x:, clip_y:] - - if modality == "mus" and file_type == 'nifti': - # TODO: is this necessary in Mosaic2D? - # as total_depth will be 1 and we will crop 1 depth - # TODO: in the updated version, it was said 2d mus is not updated yet so skip it - raise NotImplementedError - arr = process_mus_nifti(arr, depth) - - if lower_mod == 'orientation': - rad = np.deg2rad(arr) - c, s = np.cos(rad), np.sin(rad) - arr = np.stack([c * c, c * s, c * s, s * s], axis=-1) - - if arr.ndim == 2: - canvas[row_slice, col_slice] += (arr * blend_ramp)[..., None] - else: - canvas[row_slice, col_slice] += arr * blend_ramp[..., None] - weight[row_slice, col_slice] += blend_ramp - - canvas /= weight[:, :, None] - - tilt_postfix = '_tilt' if tilted_illumination else '' - if lower_mod == 'orientation': - print("Starting orientation angles eigen decomp...") - h, w = canvas.shape[:2] - a_x = canvas.reshape((h * w, 2, 2)) - eigvals, eigvecs = np.linalg.eigh(a_x) - x = eigvecs[:, 0, 1] - y = eigvecs[:, 1, 1] - canvas = np.arctan2(y, x) / np.pi * 180 - canvas = canvas.reshape((h, w)) - canvas[canvas < -90] += 180 - canvas[canvas > 90] -= 180 - canvas = np.rot90(canvas, k=-1) - else: - canvas = np.squeeze(canvas) - canvas = np.nan_to_num(canvas) - canvas = np.rot90(canvas, k=-1) - if tiff_output_dir: - logging.info("Save .tiff mosaic") - normed = exposure.rescale_intensity( - canvas, - in_range=gray_range if gray_range is not None else 'image') - imageio.imwrite( - op.join(tiff_output_dir, f"{modality}{tilt_postfix}_slice{slice_idx_out:03d}.tiff"), - (normed * 255).astype(np.uint8)) - - # ref = loadmat(op.join( - # "/local_mount/space/megaera/1/users/kchai/psoct/process_data/StitchingFiji", - # f"{modality}_slice{1:03d}.mat"))['MosaicFinal'] - # diff = np.abs(ref-canvas).compute() - # i,j = np.where(diff==np.max(diff)) - # i,j = ref.shape[-1]-j-1, i - # print(i,j) - # np.testing.assert_array_almost_equal(ref, canvas,decimal=6) - - return canvas - - -def _load_nifti_tile(path: str) -> da.Array: - img = nib.load(path, mmap=True) - # return da.from_delayed(dask.delayed(img.dataobj), shape=img.shape, dtype=img.get_data_dtype()) - return da.from_array(img.dataobj, chunks=img.shape) - delayed = dask.delayed(img.get_fdata)() - return da.from_delayed(delayed, shape=img.shape, dtype=img.get_data_dtype()) - - -def _load_mat_tile(path: str) -> da.Array: - var_name, shape, dtype = next( - (n, s, dt) for n, s, dt in sio.whosmat(path) if not n.startswith("__") - ) - delayed = dask.delayed(load_mat)(path, var_name) - return da.from_delayed(delayed, shape=shape, dtype=dtype) - -def _load_tile(path:str): - if path.endswith('.mat'): - return _load_mat_tile(path) - if path.endswith('.nii' or '.nii.gz'): - return _load_nifti_tile(path) - raise ValueError(f"Unsupported file type: {path}") - -def _compute_blending_ramp( - tile_width: int, - tile_height: int, - x_coords: np.ndarray, - y_coords: np.ndarray, -) -> da.Array: - """ - Create a 2D blending weight map for overlapping tiles. - """ - dx = np.nanmedian(np.diff(x_coords, axis=0)) - dy = np.nanmedian(np.diff(y_coords, axis=1)) - rx, ry = tile_width - round(dx), tile_height - round(dy) - - xv = np.linspace(0, 1, rx) - yv = np.linspace(0, 1, ry) - wx = np.ones(tile_width) - wy = np.ones(tile_height) - if rx > 0: - wx[:rx], wx[-rx:] = xv, xv[::-1] - if ry > 0: - wy[:ry], wy[-ry:] = yv, yv[::-1] - ramp = da.from_array(np.outer(wx, wy)[:, :], chunks=(tile_width, tile_height)) - return ramp - - -def _normalize_tile_coords(x_arr: np.ndarray, y_arr: np.ndarray) -> Tuple[ - np.ndarray, np.ndarray]: - x0, y0 = np.nanmin(x_arr), np.nanmin(y_arr) - return x_arr - x0, y_arr - y0 - - -def _get_gray_range( - params_dict: Dict[str, any], modality: str -) -> Tuple[Optional[tuple | str], bool]: - """ - Determine gray-level range for a modality; return (range, save_tiff_flag). - """ - key_map = { - 'aip': 'AipGrayRange', - 'mip': 'MipGrayRange', - 'retardance': 'RetGrayRange', - 'birefringence': 'BirefGrayRange', - 'mus': 'musGrayRange', - 'surf': 'surfGrayRange', - } - low = modality.lower() - if low in key_map: - gray_range = params_dict.get(key_map[low]) - else: - gray_range = params_dict.get(f"{modality}GrayRange") - if gray_range is None: - logger.warning( - f"{modality} grayscale range not found. TIFF output disabled." - ) - return None, False - if isinstance(gray_range, np.ndarray): - gray_range = tuple(gray_range[:2]) - return gray_range, True - - -def _select_modality_token(raw_mat: dict[str, any], modality: str) -> str: - """ - Choose the filename token matching the modality from Enface.inputstr. - """ - candidates = list(raw_mat['Enface']['save'].item()) - prefix = modality[:3].lower() - for token in candidates: - if prefix in token.lower(): - return token - logger.warning( - f"Modality '{modality}' not found in Enface.save; using first 3 letters." - ) - return modality[:3] - - -def get_rgb_4d(ori, value_range): - """ - Convert an orientation volume (in degrees) into an RGB 4D volume via HSV mapping. - value_range: [min_angle, max_angle] (e.g. [-90, 90]) - """ - r1, r2 = value_range - ori = ori.astype(np.float64) - - # wrap values as in MATLAB version - ori = np.where(ori > r2, ori - 180, ori) - ori = np.where(ori < r1, ori + 180, ori) - - # normalize to [0,1] for hue - hue = (ori - r1) / (r2 - r1) - - nx, ny, nz = ori.shape - hsv = np.ones((nx, ny, nz, 3), dtype=np.float64) - hsv[..., 0] = hue # H - hsv[..., 1] = 1.0 # S - hsv[..., 2] = 1.0 # V - - rgb = hsv_to_rgb(hsv) - rgb = (rgb * 255).astype(np.uint8) - return rgb - - -def get_volname(base_file_name: str, mosaic_num: int, tile_num: int, - modality: str) -> str: - """ - Generate a volume name by replacing placeholders in the base file name. - - This function provides flexibility for atypical processing where input file - naming deviates from the standard. It replaces '%tileID' with a zero-padded - three-digit number and '%modality' with the specified modality. - - Args: - base_file_name (str): The template file name containing placeholders. - num (int): The tile ID number to insert (zero-padded to three digits). - modality (str): The modality string to insert. - - Returns: - str: The formatted volume name with placeholders replaced. - """ - # vol_name = base_file_name - # vol_name = vol_name.replace("%tileID", f"{num:03d}") - vol_name = base_file_name % (mosaic_num, tile_num) - vol_name = vol_name.replace("[modality]", modality) - return vol_name - - -def process_mus_nifti(arr, total_depth): - I = 10.0 ** (arr / 10.0) - I_rev = I[:, :, ::-1] - # cumulative sum in reversed order → (H,W,N) - cumsum_rev = np.cumsum(I_rev, axis=2) - # drop the very first (no “next” beyond the last) → (H,W,N-1) - sum_excl_rev = cumsum_rev[:, :, :-1] - # flip back to original order → (H,W,N-1) - sum_excl = sum_excl_rev[:, :, ::-1] - # Now sum_excl[..., k] == sum of I[..., k+1:] exactly as in MATLAB’s sum(I(:,:,z+1:end),3) - sum_excl = sum_excl[:, :, - :total_depth] # keep only the first MZL sums → (H,W,MZL) - # divide elementwise and apply the constant factors - I = I[:, :, :total_depth] / sum_excl / (2.0 * 0.0025) - arr = np.squeeze(np.mean(I, axis=2)) - return arr diff --git a/linc_convert/modalities/psoct/mosaic3d.py b/linc_convert/modalities/psoct/mosaic3d.py deleted file mode 100644 index c50c0959..00000000 --- a/linc_convert/modalities/psoct/mosaic3d.py +++ /dev/null @@ -1,501 +0,0 @@ -""" -This module includes components that are based on the https://github.com/CarolineMagnain/OCTAnalysis repository (currently private). We have permission from the owner to include the code here. -""" - -import logging -import os.path as op -import warnings -from collections import defaultdict -from typing import Annotated - -import cyclopts -import dask -import dask.array as da -import nibabel as nib -import numpy as np -import scipy.io as sio -import tensorstore as ts -import tqdm -import zarr -from cyclopts import Parameter -from dask import delayed -from dask.diagnostics import ProgressBar -from niizarr import default_nifti_header, write_ome_metadata - -from linc_convert.modalities.psoct.cli import psoct -from linc_convert.modalities.psoct.mosaic2d import _normalize_tile_coords, \ - _compute_blending_ramp, _load_nifti_tile, _load_tile -from linc_convert.modalities.psoct.utils._utils import struct_arr_to_dict, \ - find_experiment_params, atleast_2d_trailing -from linc_convert.modalities.psoct.utils._zarr import default_write_config -from linc_convert.utils.zarr.create_array import compute_zarr_layout -from linc_convert.utils.zarr.generate_pyramid import generate_pyramid_new -from linc_convert.utils.zarr.zarr_config import ZarrConfig - -logger = logging.getLogger(__name__) -mosaic3d = cyclopts.App(name="mosaic3d", help_format="markdown") -psoct.command(mosaic3d) - -# 3d data has pixdim incorrectly set and cause nibabel keep logging warning -nib.imageglobals.logger.setLevel(40) - -@mosaic3d.default -def mosaic3d_telesto( - parameter_file: str, - *, - slice_index: int, - dbi_output: Annotated[str, Parameter(name=["--dBI", "-d"])], - o3d_output: Annotated[str, Parameter(name=["--O3D", "-o"])], - r3d_output: Annotated[str, Parameter(name=["--R3D", "-r"])], - tilted_illumination: bool = False, - downsample: bool = False, - use_gpu: bool = False, - zarr_config: ZarrConfig = None, -) -> None: - """ - Parameters - ---------- - dbi_output : str - Output path for dBI volume. - o3d_output : str - Output path for O3D volume. - r3d_output : str - Output path for R3D volume. - """ - logger.info("started") - tilt_postfix = '_tilt' if tilted_illumination else '' - # Load parameters - raw_mat = sio.loadmat(parameter_file, squeeze_me=True) - params = struct_arr_to_dict(raw_mat['Parameters']) - scan_info = struct_arr_to_dict(raw_mat['Scan']) - mosaic_info = struct_arr_to_dict(raw_mat['Mosaic3D']) - exp_params, is_fiji = find_experiment_params(mosaic_info['Exp']) - slice_indices = atleast_2d_trailing(mosaic_info['sliceidx']) - scan_resolution = np.atleast_1d(scan_info['Resolution']) - if len(scan_resolution) < 3: - raise ValueError - clip_x, clip_y = int(params['XPixClip']), int(params['YPixClip']) - if scan_info['System'].lower() == 'octopus': - clip_x, clip_y = clip_y, clip_x - flip_z = bool(mosaic_info.get('invert_Z', True)) - - tile_size = int(exp_params['NbPix']) - tile_width, tile_height = tile_size - clip_x, tile_size - clip_y - if tilted_illumination: - tile_width = int(exp_params['NbPix' + tilt_postfix]) - clip_x - x_coords, y_coords = _normalize_tile_coords(exp_params['X_Mean' + tilt_postfix], exp_params['Y_Mean' + tilt_postfix], - ) - full_width = int(np.nanmax(x_coords) + tile_width) - full_height = int(np.nanmax(y_coords) + tile_height) - depth = int(mosaic_info['MZL']) - - blend_ramp = _compute_blending_ramp(tile_width, tile_height, x_coords, y_coords) - - map_indices = exp_params['MapIndex_Tot_offset' + tilt_postfix] + exp_params['First_Tile' + tilt_postfix] - 1 - - no_tilted_illumination_scan = scan_info['TiltedIllumination'] != 'Yes' - - focus = _load_nifti_tile(scan_info['FocusFile'+ tilt_postfix] ) - raw_tile_width = int(scan_info['NbPixels' + tilt_postfix]) - - # slice_idx_in, slice_idx_out, slice_idx_run = slice_indices[:, slice_index] - slice_idx_in = slice_index - mosaic_idx = 2 * slice_idx_in - 1 - if tilted_illumination: - mosaic_idx += 1 - if no_tilted_illumination_scan: - mosaic_idx = slice_idx_in - - file_prefix = [s for s in np.atleast_1d(scan_info['FilePrefix']) if - 'cropped' in str(s).lower()] - if file_prefix: - file_prefix = file_prefix[0] - else: - raise ValueError("No complex file prefix found in scan_info['FilePrefix']") - - raw_data_dir = scan_info['RawDataDir'] - input_file_template = scan_info['FileNameFormat'] - input_file_template = input_file_template.replace('[modality]', file_prefix) - input_file_template = op.join(raw_data_dir, input_file_template) - - if mosaic_idx > 8 and tilted_illumination: - temp_compensate = True - else: - temp_compensate = False - - chunk, shard = compute_zarr_layout((depth, full_height, full_width), np.float32, - zarr_config) - - dBI_result, R3D_result, O3D_result = build_slice(mosaic_idx, - input_file_template, - blend_ramp, clip_x, clip_y, - full_width, full_height, depth, - flip_z, map_indices, scan_info, - tile_width, tile_height, x_coords, - y_coords, - raw_tile_width, - focus, - temp_compensate, - chunk=chunk if not shard else shard) - - - dBI_result = dBI_result.transpose(2,1,0) - R3D_result = R3D_result.transpose(2,1,0) - O3D_result = O3D_result.transpose(2,1,0) - - writers = [] - results = [] - zgroups = [] - for out, res in zip([dbi_output, r3d_output, o3d_output], - [dBI_result, R3D_result, O3D_result]): - - if shard: - res = da.rechunk(res, chunks=shard) - else: - res = da.rechunk(res, chunks=chunk) - zgroup = zarr.create_group(out, overwrite=True) - zgroups.append(zgroup) - wconfig = default_write_config(op.join(out, '0'), shape=res.shape, - dtype=np.float32, chunk=chunk, shard=shard) - wconfig["create"] = True - wconfig["delete_existing"] = True - tswriter = ts.open(wconfig).result() - writers.append(tswriter) - results.append(res) - task = da.store(results, writers, compute=False) - - with ProgressBar(): - task.compute() - - scan_resolution = scan_resolution[:3][::-1] - logger.info("finished") - for zgroup in zgroups: - generate_pyramid_new(zgroup) - write_ome_metadata(zgroup, ["z", "y", "x"], scan_resolution, space_unit="millimeter") - nii_header = default_nifti_header(zgroup["0"], zgroup.attrs["multiscales"]) - nii_header.set_xyzt_units("mm") - # write_nifti_header(zgroup, nii_header) - logger.info("finished generating pyramid") - - -# For I80 slab1 use only -def temporary_compensation(dBI, R3D, O3D, depth, focus, scan_info): - Nz = depth - # 1) build a mask of pixels needing correction - mask_crop = focus <= scan_info['Focus_CropStart'] # (Ny, Nx) - # 2) find, for each (y,x), the last index along z where dBI3D == -inf - mask_inf = np.isneginf(dBI) # (Ny, Nx, Nz) - depth_idx = np.arange(Nz)[None, None, :] # (1, 1, Nz) - last_inf = np.max(np.where(mask_inf, depth_idx, -1), axis=2) - # last_inf[y,x] is -1 if there was no -inf, or the maximum index otherwise - # 3) decide which pixels actually get shifted - do_shift = (mask_crop & (last_inf >= 0)) # (Ny, Nx) - # 4) build the "shifted" index array for every (y,x,z) - # new_idx[y,x,z] = last_inf[y,x] + z - new_idx = last_inf[..., None] + depth_idx # (Ny, Nx, Nz) - # 5) clip to valid range so we can safely gather, - # then gather each volume - clipped = np.clip(new_idx, 0, Nz - 1) - dBI3D_shift = np.take_along_axis(dBI, clipped, axis=2) - R3D_shift = np.take_along_axis(R3D, clipped, axis=2) - O3D_shift = np.take_along_axis(O3D, clipped, axis=2) - # 6) zero-out any positions that “fell off the end” (new_idx >= Nz) - overflow = new_idx >= Nz - dBI3D_shift[overflow] = 0 - R3D_shift[overflow] = 0 - O3D_shift[overflow] = 0 - # 7) select per-pixel whether to keep the original or use the shifted version - dBI = np.where(do_shift[..., None], dBI3D_shift, dBI) - R3D = np.where(do_shift[..., None], R3D_shift, R3D) - O3D = np.where(do_shift[..., None], O3D_shift, O3D) - return da.stack([dBI,R3D,O3D], 3) - - -def build_slice(mosaic_idx, input_file_template, blend_ramp, clip_x, clip_y, full_width, - full_height, depth, flip_z, map_indices, scan_info, tile_width, - tile_height, x_coords, y_coords, raw_tile_width, focus, temp_compensate, - chunk): - coords = [] - tiles = [] - for (i, j), tile_idx in tqdm.tqdm(np.ndenumerate(map_indices)): - if tile_idx <= 0 or np.isnan(x_coords[i, j]) or np.isnan( - y_coords[i, j]): - continue - x0, y0 = int(x_coords[i, j]), int(y_coords[i, j]) - row_slice = slice(x0, x0 + tile_width) - col_slice = slice(y0, y0 + tile_height) - - input_file_path = input_file_template % (mosaic_idx, tile_idx) - complex3d = _load_tile(input_file_path) - if complex3d.shape[0] > 4 * raw_tile_width: - warnings.warn( - f"Complex3D shape {complex3d.shape} is larger than expected {4 * raw_tile_width}. " - "Trimming to 4*raw_tile_width." - ) - complex3d = complex3d[:4 * raw_tile_width, :, :] - elif complex3d.shape[0] < 4 * raw_tile_width: - raise ValueError( - f"Complex3D shape {complex3d.shape} is smaller than expected {4 * raw_tile_width}. " - "Check the input file." - ) - - dBI3D, R3D, O3D = process_complex3d(complex3d, raw_tile_width) - - if temp_compensate: - results = delayed(temporary_compensation)(dBI3D, R3D, O3D, depth, focus, - scan_info) - results = da.from_delayed(results, shape=(*dBI3D.shape, 3), - dtype=dBI3D.dtype) - else: - results = da.stack([dBI3D, R3D, O3D], axis=3) - - if flip_z: - results = da.flip(results, axis=2) - if scan_info['System'].lower() == 'octopus': - results = da.swapaxes(results, 0, 1) - - results = results[clip_x:, clip_y:] * blend_ramp[:, :, None, None] - tiles.append(results) - coords.append((x0, y0)) - - return stitch_tiles( - coords, tiles, - full_width=full_width, full_height=full_height, - depth=depth, blend_ramp=blend_ramp, - tile_size=(tile_width, tile_height), - chunk=chunk - ) - - -def stitch_whole_canvas_padding(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Build a full‐size zero‐canvas per tile and slice‐assign into it, - then stack & sum (build_slice_whole_canvas_padding). - """ - pw, ph = tile_size - canvases = [] - weights = [] - - for (x0, y0), t in zip(coords, tiles): - canvas_tile = da.zeros((full_width, full_height, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - weight_tile = da.zeros((full_width, full_height), - chunks=(pw, ph), - dtype=np.float32) - - rs = slice(x0, x0 + pw) - cs = slice(y0, y0 + ph) - canvas_tile[rs, cs, ...] = t - weight_tile[rs, cs] = blend_ramp - - canvases.append(canvas_tile) - weights.append(weight_tile) - - canvas = da.sum(da.stack(canvases, axis=0), axis=0) - weight = da.sum(da.stack(weights, axis=0), axis=0) - - canvas /= weight[..., None, None] - canvas = da.nan_to_num(canvas) - return [canvas[..., i] for i in range(3)] - -def _combine_block(_, block_tiles, block_weights, *args, block_info=None, **kwargs): - chunk_id = tuple(block_info[None]['chunk-location'][:2]) - paints = block_tiles[chunk_id] - weights = block_weights[chunk_id] - shape = block_info[None]['chunk-shape'] - - if not paints: - return np.broadcast_to(np.zeros((), dtype=np.float32), shape) - - total_paint = da.sum(da.stack(paints, axis=0), axis=0) - total_weight = da.sum(da.stack(weights, axis=0), axis=0) - return total_paint / total_weight[...,None,None] - - -def stitch_tiles(coords, tiles, - full_width, full_height, depth, - blend_ramp, tile_size, **_): - """ - Chunk‐aligned padding + per‐block summation (build_slice_chunked_padding). - """ - pw, ph = tile_size - canvas = da.zeros((full_width, full_height, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - weight = da.zeros((full_width, full_height), - chunks=(pw, ph), - dtype=np.float32) - - # collect per‐chunk pieces - block_tiles = defaultdict(list) - block_weights = defaultdict(list) - - for (x0, y0), t in zip(coords, tiles): - # which tile‐chunks this falls into? - x0c = x0 // pw - y0c = y0 // ph - x1c = (x0 + pw - 1) // pw - y1c = (y0 + ph - 1) // ph - - # pad region covering those chunks - x_start = x0c * pw - y_start = y0c * ph - x_end = (x1c + 1) * pw - y_end = (y1c + 1) * ph - - block_canvas = da.zeros((x_end - x_start, y_end - y_start, depth, 3), - chunks=(pw, ph, depth, 3), - dtype=np.float32) - block_weight = da.zeros((x_end - x_start, y_end - y_start), - chunks=(pw, ph), - dtype=np.float32) - - # place tile into that big block - xs = slice(x0 - x_start, x0 - x_start + pw) - ys = slice(y0 - y_start, y0 - y_start + ph) - block_canvas[xs, ys, ...] = t - block_weight[xs, ys] = blend_ramp - - # chop into per‐chunk pieces - for cx in range(x0c, x1c + 1): - for cy in range(y0c, y1c + 1): - bid = (cx, cy) - sub_x = slice((cx - x0c) * pw, (cx - x0c + 1) * pw) - sub_y = slice((cy - y0c) * ph, (cy - y0c + 1) * ph) - block_tiles[bid].append(block_canvas[sub_x, sub_y, ...]) - block_weights[bid].append(block_weight[sub_x, sub_y]) - - - canvas = da.map_blocks(_combine_block,canvas, block_tiles, block_weights, - dtype=canvas.dtype, - chunks=(pw, ph, depth, 3)) - - return [canvas[..., i] for i in range(3)] - - -def process_complex3d(complex3d, raw_tile_width): - complex3d = complex3d.rechunk({0:raw_tile_width}) - comp = complex3d.reshape( - (4, raw_tile_width, complex3d.shape[1], complex3d.shape[2])) - j1r, j1i, j2r, j2i = comp[0], comp[1], comp[2], comp[3] - - j1 = j1r + 1j * j1i - j2 = j2r + 1j * j2i - mag1 = da.abs(j1) - mag2 = da.abs(j2) - - dBI3D = da.flip(10 * da.log10(mag1**2 + mag2**2), axis=2) - R3D = da.flip( - da.arctan(mag1 / mag2) / da.pi * 180, - axis=2 - ) - offset = 100 / 180 * da.pi - phi = da.angle(j1) - da.angle(j2) + offset * 2 - # wrap into [-π, π] - phi = da.where(phi > da.pi, phi - 2 * da.pi, phi) - phi = da.where(phi < -da.pi, phi + 2 * da.pi, phi) - O3D = da.flip(phi / (2 * da.pi) * 180, axis=2) - - return dBI3D, R3D, O3D - - -def do_downsample(volume: da.Array, factors: tuple) -> da.Array: - fx, fy, fz = factors - return da.coarsen(np.mean, volume, {0: fx, 1: fy, 2: fz}, trim_excess=True) - -def stack_slices(mosaic_info, slice_indices, slices): - return da.concatenate(slices, axis=2) - num_slices = len(slices) - z_off, z_sm, z_s = mosaic_info["z_parameters"][:3] - # z_off: every slice is going to remove this much from beginning - z_off, z_sm, z_s = int(z_off), int(z_sm), int(z_s) - z_sms = z_sm + z_s - z_m = z_sm - z_s - # --- Load one slice to get block size and build tissue profile --- - Id0 = slices[0] - if modality.lower() == 'mus': - # (If you want the 'mus' branch, you'd need skimage.filters.threshold_multiotsu, etc.) - raise NotImplementedError("The 'mus' branch is not shown here.") - else: - # dBI: average a small tissue-only block - tissue0 = Id0[:200, :200, z_off:].mean(axis=(0, 1)) - # only keep the next z_sms values, offset by zoff - tissue = tissue0[z_off: z_off + z_sms] - # --- compute blending weights --- - s = tissue[z_s] / tissue[:z_s] # Top overlapping skirt - ms = tissue[z_s] / tissue[z_s: z_sms] # non-overlap + bottom skirt - degree = 1 # both dBI and mus use degree=1 - # w1 = s * np.linspace(0, 1, z_s) ** degree - # w2 = ms[z_m:] * np.linspace(1, 0, z_s) ** degree - # w3 = ms[:z_m] - # TODO: omit the normalizing weight here for now to avoid computation - w1 = np.linspace(0, 1, z_s) ** degree - w2 = np.linspace(1, 0, z_s) ** degree - w3 = np.ones(z_m) - row_pxblock, col_pxblock = Id0.shape[:2] - tot_z_pix = int(z_sm * num_slices) - Ma = dask.array.zeros((row_pxblock, - col_pxblock, - tot_z_pix), - dtype=np.float32) - for i in range(num_slices): - si = int(slice_indices[0, i]) # incoming slice index - print(f'\tstitching slice {i + 1}/{num_slices} (MAT idx {si:03d})') - Id = slices[i] - nx, ny, _ = Id.shape - - if s == 0: - # first slice: apply fresh data - # pattern = np.array([1, w3, w2]) # MATLAB’s [w1*0+1, w3, w2] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], # shape (1,1,3) - # (nx, ny, pattern.size)) # → (nx, ny, 3) - - W = np.concatenate([np.ones_like(w1), w3, w2]) - zr1 = np.arange(z_sms) # 0 .. z_sms-1 - zr2 = zr1 + z_off # zoff .. zoff+z_sms-1 - - elif s == num_slices - 1: - # last slice: add onto bottom-most z_sm planes - # pattern = np.array([w1, w3]) # MATLAB’s [w1, w3] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], - # (nx, ny, pattern.size)) # → (nx, ny, 2) - W = np.concatenate([w1, w3, np.ones_like(w2)]) - zr1 = np.arange(z_sm) + (tot_z_pix - z_sm) # targets top of Ma’s z-axis - zr2 = np.arange(z_sm) + z_off # picks from Id - else: - # middle slices: accumulate - # pattern = np.array([w1, w3, w2]) # MATLAB’s [w1, w3, w2] - # W = np.broadcast_to(pattern[np.newaxis, np.newaxis, :], - # (nx, ny, pattern.size)) # → (nx, ny, 3) - W = np.concatenate([w1, w3, w2]) - zr1 = np.arange(z_sms) + (s - 1) * z_sm # where to write in Ma - zr2 = np.arange(z_sms) + z_off # where to read in Id - # if i == 0: - # # first slice: only top skirt=1 + body + bottom skirt - # vec = np.concatenate([np.ones(z_s), w3, w2]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sms) - # z1 = np.arange(z_sms) - # z2 = z1 + int(z_off) - # elif i == n_slices - 1: - # # last slice: only top skirt + body - # vec = np.concatenate([w1, w3]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sm) - # z1 = np.arange(tot_z_pix - z_sm, tot_z_pix) - # z2 = int(z_off) + np.arange(z_sm) - # else: - # # middle slices: skirt/body/skirt - # vec = np.concatenate([w1, w3, w2]) - # W = np.tile(vec, (row_pxblock * col_pxblock, 1)) \ - # .reshape(row_pxblock, col_pxblock, z_sms) - # start_z = i * z_sm - # z1 = np.arange(start_z, start_z + z_sms) - # z2 = int(z_off) + np.arange(z_sms) - - Ma[:, :, zr1] += Id[:, :, zr2] * W - return Ma - diff --git a/linc_convert/modalities/psoct/ms_dask.py b/linc_convert/modalities/psoct/ms_dask.py deleted file mode 100644 index 1f879c74..00000000 --- a/linc_convert/modalities/psoct/ms_dask.py +++ /dev/null @@ -1,263 +0,0 @@ -""" -Matlab to OME-Zarr. - -Converts Matlab files generated by the MGH in-house OCT pipeline -into a OME-ZARR pyramid. - -WARNING: THIS IS ONLY FOR TESTING IO. NEVER USE FOR PRODUCTION -""" - -import json -import os -from functools import wraps -from typing import Callable, Mapping, Optional -from warnings import warn -import logging - -import cyclopts -import h5py -import numpy as np -from dask import delayed -from scipy.io import loadmat - -from linc_convert import utils -from linc_convert.modalities.psoct.utils._utils import make_json -from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid -from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata -import dask.array as da - -from linc_convert.utils.zarr.zarr_config import ZarrConfig - -logger = logging.getLogger(__name__) -ms = cyclopts.App(name="ms", help_format="markdown") -psoct.command(ms) - - -def _automap(func: Callable) -> Callable: - """Automatically maps the array in the mat file.""" - - @wraps(func) - def wrapper(inp: list[str], **kwargs: dict) -> callable: - dat = _mapmat(inp, kwargs.get("key", None)) - return func(dat, **kwargs) - return wrapper - - -class _ArrayWrapper: - def _get_key(self, f: Mapping) -> str: - key = self.key - if key is None: - if not len(f.keys()): - raise Exception(f"{self.file} is empty") - # Select the first non-hidden key - for key in f.keys(): - if key[0] != "_": - break - if len(f.keys()) > 1: - warn( - f"More than one key in .mat file {self.file}, " - f'arbitrarily loading "{key}"' - ) - - if key not in f.keys(): - raise Exception(f"Key {key} not found in file {self.file}") - return key - - -class _H5ArrayWrapper(_ArrayWrapper): - def __init__(self, file: h5py.File, key: Optional[str]) -> None: - self.file = file - self.key = key - self.array = file.get(self._get_key(self.file)) - - def __del__(self) -> None: - if hasattr(self.file, "close"): - self.file.close() - - def load(self) -> np.ndarray: - self.array = self.array[...] - if hasattr(self.file, "close"): - self.file.close() - self.file = None - return self.array - - @property - def shape(self) -> list[int]: - return self.array.shape - - @property - def dtype(self) -> np.dtype: - return self.array.dtype - - def __len__(self) -> int: - return len(self.array) - - def __getitem__(self, index: object) -> np.ndarray: - return self.array[index] - - -class _MatArrayWrapper(_ArrayWrapper): - def __init__(self, file: str, key: Optional[str]) -> None: - self.file = file - self.key = key - self.array = None - - def __del__(self) -> None: - if hasattr(self.file, "close"): - self.file.close() - - def load(self) -> np.ndarray: - if self.array is not None: - return self.array - - data = loadmat(self.file) - self.array = data.get(self._get_key(data)) - self.file = None - return self.array - - @property - def shape(self) -> list[int]: - if self.array is None: - self.load() - return self.array.shape - - @property - def dtype(self) -> np.dtype: - if self.array is None: - self.load() - return self.array.dtype - - def __len__(self) -> int: - if self.array is None: - self.load() - return len(self.array) - - def __getitem__(self, index: object) -> np.ndarray: - if self.array is None: - self.load() - return self.array[index] - - -def _mapmat(fnames: list[str], key: Optional[str] = None) -> list[_ArrayWrapper]: - """Load or memory-map an array stored in a .mat file.""" - def make_wrapper(fname: str) -> _ArrayWrapper: - try: - # "New" .mat file - f = h5py.File(fname, "r") - return _H5ArrayWrapper(f, key) - except Exception: - # "Old" .mat file - return _MatArrayWrapper(fname, key) - - return [make_wrapper(fname) for fname in fnames] - -@ms.default -@_automap -def convert( - inp: list[str], - *, - zarr_config: ZarrConfig = None, - key: Optional[str] = None, - meta: str = None, - orientation: str = "RAS", - center: bool = True, - dtype: Optional[str] = None, - **kwargs -) -> None: - """ - Matlab to OME-Zarr. - - Convert OCT volumes in raw matlab files into a pyramidal - OME-ZARR (or NIfTI-Zarr) hierarchy. - - This command assumes that each slice in a volume is stored in a - different mat file. All slices must have the same shape and will be - concatenated into a 3D Zarr. - - Parameters - ---------- - inp : list of str - Paths to the input mat files. - key : Optional[str] - Key of the array to be extracted; defaults to the first key found. - meta : str - Path to the metadata file. - orientation : str - Orientation of the volume. - center : bool - Set RAS[0, 0, 0] at FOV center. - dtype : Optional[str] - Data type to write into. - """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - zarr_config.set_default_name(os.path.splitext(inp[0].file)[0]) - - # Process metadata if provided - if meta: - logger.info("Writing JSON metadata") - with open(meta, "r") as f: - meta_txt = f.read() - meta_json = make_json(meta_txt) - path_json = ".".join(zarr_config.out.split(".")[:-2]) + ".json" - with open(path_json, "w") as f: - json.dump(meta_json, f, indent=4) - vx = meta_json["PixelSize"] - unit = meta_json["PixelSizeUnits"] - else: - vx = [1, 1, 1] - unit = "um" - - # Prepare Zarr group - omz = open_zarr_group(zarr_config) - - # if not hasattr(inp[0], "dtype"): - # raise Exception("Input is not an array. This is likely unexpected") - if len(inp[0].shape) < 2: - raise ValueError(f"Input array is not 2D: {inp[0].shape}") - - dtype = dtype or np.dtype(inp[0].dtype).str - nslices = len(inp) - data = [delayed(inp[i].load)() for i in range(nslices)] - slices = [da.from_delayed(i, shape=inp[0].shape, dtype=dtype) for i in data] - full_volume = da.concatenate(slices, axis=2) - volume_shape = full_volume.shape - - dataset = create_array(omz, "0", shape=full_volume.shape, zarr_config=zarr_config, - dtype=np.dtype(dtype)) - if dataset.shards is None: - full_volume.to_zarr(dataset) - else: - full_volume = full_volume.rechunk(dataset.shards) - def save(chunk,block_info=None): - slicer = tuple(slice(*al) for al in block_info[0]['array-location']) - dataset[slicer] = chunk - return np.zeros_like(chunk) - full_volume.map_blocks(save,dtype=np.uint8).compute() - - - generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) - logger.info("Write OME-Zarr multiscale metadata") - write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) - - if not zarr_config.nii: - logger.info("Conversion complete.") - return - - # Write NIfTI-Zarr header - arr = omz["0"] - header, _ = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) - reversed_shape = list(reversed(arr.shape)) - affine = orientation_to_affine(orientation, *vx[::-1]) - if center: - affine = center_affine(affine, reversed_shape[:3]) - header.set_data_shape(reversed_shape) - header.set_data_dtype(arr.dtype) - header.set_qform(affine) - header.set_sform(affine) - header.set_xyzt_units(to_nifti_unit(unit)) - - write_nifti_header(omz, header) - From 516e93ca0409dda004c5fe2f5ba82cf78b3d2388 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 20 Jun 2025 17:47:59 -0400 Subject: [PATCH 038/157] refactor: change tests file structure --- tests/test_df.py | 4 ++-- tests/test_lsm.py | 2 +- tests/test_wk.py | 2 +- tests/{data => utils}/generate_trusted_result.py | 0 tests/{ => utils}/helper.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename tests/{data => utils}/generate_trusted_result.py (100%) rename tests/{ => utils}/helper.py (95%) diff --git a/tests/test_df.py b/tests/test_df.py index 6f35d69a..b0bd033d 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -5,7 +5,7 @@ import glymur import numpy as np -from helper import _cmp_zarr_archives +from utils.helper import _cmp_zarr_archives from linc_convert.modalities.df import multi_slice @@ -25,5 +25,5 @@ def test_df(tmp_path): output_zarr = tmp_path / "output.zarr" files = glob.glob(os.path.join(tmp_path, "*.jp2")) files.sort() - multi_slice.convert(files, out=str(output_zarr)) + multi_slice.convert(files, out=str(output_zarr), zarr_version=2) assert _cmp_zarr_archives(str(output_zarr), "data/df.zarr.zip") diff --git a/tests/test_lsm.py b/tests/test_lsm.py index 76a54c42..063205cf 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm.py @@ -3,7 +3,7 @@ import numpy as np import tifffile -from helper import _cmp_zarr_archives +from utils.helper import _cmp_zarr_archives from linc_convert.modalities.lsm import mosaic diff --git a/tests/test_wk.py b/tests/test_wk.py index 31294af2..40ae3692 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -3,7 +3,7 @@ import numpy as np import wkw import zarr -from helper import _cmp_zarr_archives +from utils.helper import _cmp_zarr_archives from linc_convert.modalities.wk import webknossos_annotation diff --git a/tests/data/generate_trusted_result.py b/tests/utils/generate_trusted_result.py similarity index 100% rename from tests/data/generate_trusted_result.py rename to tests/utils/generate_trusted_result.py diff --git a/tests/helper.py b/tests/utils/helper.py similarity index 95% rename from tests/helper.py rename to tests/utils/helper.py index 3f5a3f50..f55e149e 100644 --- a/tests/helper.py +++ b/tests/utils/helper.py @@ -20,7 +20,7 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: zarr2 = zarr.open(path2, mode="r") # Compare keys (dataset structure) - if zarr1.keys() != zarr2.keys(): + if set(zarr1.keys()) != set(zarr2.keys()): print("keys mismatch") return False if zarr1.attrs != zarr2.attrs: From 21ff85221b600b9c27bf7c2bee2452fd1bf820bc Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 20 Jun 2025 17:48:11 -0400 Subject: [PATCH 039/157] fix: zarr config replace --- linc_convert/utils/zarr/zarr_config.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 6c0aee2f..f1ba86f5 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -117,13 +117,12 @@ def set_default_name(self, name: str): f"Output path '{self.out}' exists and overwrite was not confirmed.") def update(self, **kwargs): - replace(self, **kwargs) - return self + return replace(self, **kwargs) def update(zarr_config: ZarrConfig|None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: zarr_config = ZarrConfig() - replace(zarr_config, **kwargs) - return zarr_config + return replace(zarr_config, **kwargs) + From 95fddfcc82e3dbab6ef101e3c0645815ad2608b1 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 20 Jun 2025 17:48:44 -0400 Subject: [PATCH 040/157] tests: psoct pipeline --- linc_convert/modalities/psoct/single_volume.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index f5a91ee5..68c31895 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -17,10 +17,9 @@ from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header from linc_convert import utils -from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper +from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, _H5ArrayWrapper from linc_convert.modalities.psoct.utils._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.modalities.psoct.ms_dask import _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine @@ -157,7 +156,7 @@ def convert( # Write NIfTI-Zarr header arr = omz["0"] - header, _ = default_nifti_header(arr, + header = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) From 536bf238fb27994777599ed949a3c51c7a15e749 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 11:20:17 -0400 Subject: [PATCH 041/157] refactor --- .../modalities/psoct/{utils => }/_utils.py | 0 linc_convert/modalities/psoct/multi_slice.py | 6 +- .../modalities/psoct/single_volume.py | 4 +- .../modalities/psoct/utils/__init__.py | 0 linc_convert/modalities/psoct/utils/_zarr.py | 837 ------------------ .../psoct => }/utils/_array_wrapper.py | 0 linc_convert/utils/zarr/_zarr.py | 426 +++++++++ 7 files changed, 431 insertions(+), 842 deletions(-) rename linc_convert/modalities/psoct/{utils => }/_utils.py (100%) delete mode 100644 linc_convert/modalities/psoct/utils/__init__.py delete mode 100644 linc_convert/modalities/psoct/utils/_zarr.py rename linc_convert/{modalities/psoct => }/utils/_array_wrapper.py (100%) create mode 100644 linc_convert/utils/zarr/_zarr.py diff --git a/linc_convert/modalities/psoct/utils/_utils.py b/linc_convert/modalities/psoct/_utils.py similarity index 100% rename from linc_convert/modalities/psoct/utils/_utils.py rename to linc_convert/modalities/psoct/_utils.py diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index e6cb4ee3..d0cdd336 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -17,9 +17,9 @@ import numpy as np from linc_convert import utils -from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ +from linc_convert.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ _MatArrayWrapper -from linc_convert.modalities.psoct.utils._utils import make_json +from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine @@ -167,7 +167,7 @@ def convert( # Write NIfTI-Zarr header arr = omz["0"] - header, _ = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) + header = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 68c31895..3900d758 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -17,8 +17,8 @@ from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header from linc_convert import utils -from linc_convert.modalities.psoct.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, _H5ArrayWrapper -from linc_convert.modalities.psoct.utils._utils import make_json +from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, _H5ArrayWrapper +from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.chunk_processing import chunk_slice_generator from linc_convert.utils.math import ceildiv diff --git a/linc_convert/modalities/psoct/utils/__init__.py b/linc_convert/modalities/psoct/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/linc_convert/modalities/psoct/utils/_zarr.py b/linc_convert/modalities/psoct/utils/_zarr.py deleted file mode 100644 index c4f4ef08..00000000 --- a/linc_convert/modalities/psoct/utils/_zarr.py +++ /dev/null @@ -1,837 +0,0 @@ -"""Zarr utilities.""" - -# stdlib -import itertools -import json -import math -import os -from typing import Literal -from urllib.parse import urlparse - -# externals -import nibabel as nib -import numcodecs -import numcodecs.abc -import numpy as np -import tensorstore as ts -from upath import UPath - -from linc_convert.utils.math import ceildiv - - -def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: - """Build compressor object from name and options.""" - # TODO: we should use `numcodecs.get_codec` instead` - if not isinstance(name, str): - return name - name = name.lower() - if name == "blosc": - Compressor = numcodecs.Blosc - elif name == "zlib": - Compressor = numcodecs.Zlib - else: - raise ValueError("Unknown compressor", name) - return Compressor(**prm) - - -def make_compressor_v2(name: str | None, **prm: dict) -> dict: - """Build compressor dictionary for Zarr v2.""" - name = name.lower() - if name not in ("blosc", "zlib", "bz2", "zstd"): - raise ValueError("Unknown compressor", name) - return {"id": name, **prm} - - -def make_compressor_v3(name: str | None, **prm: dict) -> dict: - """Build compressor dictionary for Zarr v3.""" - name = name.lower() - if name not in ("blosc", "gzip", "zstd"): - raise ValueError("Unknown compressor", name) - return {"name": name, "configuration": prm} - - -def make_kvstore(path: str | os.PathLike) -> dict: - """Transform a URI into a kvstore JSON object.""" - path = UPath(path) - if path.protocol in ("file", ""): - return {"driver": "file", "path": path.path} - if path.protocol == "gcs": - url = urlparse(str(path)) - return {"driver": "gcs", "bucket": url.netloc, "path": url.path} - if path.protocol in ("http", "https"): - url = urlparse(str(path)) - base_url = f"{url.scheme}://{url.netloc}" - if url.params: - base_url += ";" + url.params - if url.query: - base_url += "?" + url.query - if url.fragment: - base_url += "#" + url.fragment - return {"driver": "http", "base_url": base_url, "path": url.path} - if path.protocol == "memory": - return {"driver": "memory", "path": path.path} - if path.protocol == "s3": - url = urlparse(str(path)) - path = {"path": url.path} if url.path else {} - return {"driver": "s3", "bucket": url.netloc, **path} - raise ValueError("Unsupported protocol:", path.protocol) - - -def auto_shard_size( - max_shape: list[int], - itemsize: int | np.dtype | str, - max_file_size: int = 2 * 1024**4, - compression_ratio: float = 2, -) -> list[int]: - """ - Find maximal shard size that ensures file size below cap. - - Parameters - ---------- - max_shape : list[int] - Maximum shape along each dimension. - itemsize : np.dtype or int - Data type, or data type size - max_file_size : int - Maximum file size (default: 2TB). - S3 has a 5TB/file limit, but given that we use an estimated - compression factor, we aim for 2TB to leave some leeway. - compression_ratio : float - Estimated compression factor. - I roughly found 2 for bosc-compressed LSM data, when compressing - only across space and channels (5 channels). - - Returns - ------- - shard : list[int] - Estimated shard size along each dimension. - Returned shards are either max_shape or powers of two. - """ - if not isinstance(itemsize, int): - itemsize = np.dtype(itemsize).itemsize - - # Maximum number of elements in the shard - max_numel = max_file_size * compression_ratio / itemsize - - shard = [1] * len(max_shape) - while True: - # If shard larger than volume, we can stop - if all(x >= s for x, s in zip(shard, max_shape)): - break - # Make shard one level larger - new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] - # If shard is too large, stop and keep previous shard - if np.prod(new_shard) > max_numel: - break - # Otherwise, use larger shard and recurse - shard = new_shard - - # replace max size with larger power of two - shard = [2 ** math.ceil(math.log2(x)) for x in shard] - return shard - - -def niftizarr_write_header( - path: os.PathLike | str, - shape: list[int], - affine: np.ndarray, - dtype: np.dtype | str, - unit: Literal["micron", "mm"] | None = None, - header: nib.Nifti1Header | nib.Nifti2Header | None = None, - zarr_version: int = 3, -) -> None: - """ - Write NIfTI header in a NIfTI-Zarr file. - - Parameters - ---------- - path : PathLike | str - Path to parent Zarr. - affine : (4, 4) matrix - Orientation matrix. - shape : list[int] - Array shape, in NIfTI order (x, y, z, t, c). - dtype : np.dtype | str - Data type. - unit : {"micron", "mm"}, optional - World unit. - header : nib.Nifti1Header | nib.Nifti2Header, optional - Pre-instantiated header. - zarr_version : int, default=3 - Zarr version. - """ - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - - path = UPath(path) - if not path.protocol: - path = "file://" / path - - # If dimensions do not fit in a short (which is often the case), we - # use NIfTI 2. - if all(x < 32768 for x in shape): - NiftiHeader = nib.Nifti1Header - else: - NiftiHeader = nib.Nifti2Header - - header = header or NiftiHeader() - header.set_data_shape(shape) - header.set_data_dtype(dtype) - header.set_qform(affine) - header.set_sform(affine) - if unit: - header.set_xyzt_units(nib.nifti1.unit_codes.code[unit]) - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - - if zarr_version == 3: - metadata = { - "chunk_grid": { - "name": "regular", - "configuration": {"chunk_shape": [len(header)]}, - }, - "codecs": [ - {"name": "bytes"}, - make_compressor_v3("gzip"), - ], - "data_type": "uint8", - "fill_value": 0, - "chunk_key_encoding": { - "name": "default", - "configuration": {"separator": r"/"}, - }, - } - tsconfig = { - "driver": "zarr3", - "metadata": metadata, - } - else: - metadata = { - "chunks": [len(header)], - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": make_compressor_v2("zlib"), - } - tsconfig = { - "driver": "zarr", - "metadata": metadata, - "key_encoding": r"/", - } - tsconfig["kvstore"] = make_kvstore(path / "nifti") - tsconfig["metadata"]["shape"] = [len(header)] - tsconfig["create"] = True - tsconfig["delete_existing"] = True - tswriter = ts.open(tsconfig).result() - with ts.Transaction() as txn: - tswriter.with_transaction(txn)[:] = header - print("done.") - - -def fix_shard_chunk( - shard: list[int], - chunk: list[int], - shape: list[int], -) -> tuple[list[int], list[int]]: - """ - Fix incompatibilities between chunk and shard size. - - Parameters - ---------- - shard : list[int] - chunk : list[int] - shape : list[int] - - Returns - ------- - shard : list[int] - chunk : list[int] - """ - for i in range(len(chunk)): - # if chunk spans the entire volume, match chunk and shard - if chunk[i] == shape[i] and chunk[i] != shard[i]: - chunk[i] = shard[i] - # ensure that shard is a multiple of chunk - if shard[i] % chunk[i]: - shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) - return shard, chunk - - -def default_write_config( - path: os.PathLike | str, - shape: list[int], - dtype: np.dtype | str, - chunk: list[int] = [32], - shard: list[int] | Literal["auto"] | None = None, - compressor: str = "blosc", - compressor_opt: dict | None = None, - version: int = 3, -) -> dict: - """ - Generate a default TensorStore configuration. - - Parameters - ---------- - chunk : list[int] - Chunk size. - shard : list[int], optional - Shard size. No sharding if `None`. - compressor : str - Compressor name - version : int - Zarr version - - Returns - ------- - config : dict - Configuration - """ - path = UPath(path) - if not path.protocol: - path = "file://" / path - - # Format compressor - if version == 3 and compressor == "zlib": - compressor = "gzip" - if version == 2 and compressor == "gzip": - compressor = "zlib" - compressor_opt = compressor_opt or {} - - # Prepare chunk size - if isinstance(chunk, int): - chunk = [chunk] - chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk - - # Prepare shard size - if shard: - if shard == "auto": - shard = auto_shard_size(shape, dtype) - if isinstance(shard, int): - shard = [shard] - shard = shard[:1] * max(0, len(shape) - len(shard)) + shard - - # Fix incompatibilities - shard, chunk = fix_shard_chunk(shard, chunk, shape) - - # ------------------------------------------------------------------ - # Zarr 3 - # ------------------------------------------------------------------ - if version == 3: - if compressor and compressor != "raw": - compressor = [make_compressor_v3(compressor, **compressor_opt)] - else: - compressor = [] - - codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} - - if shard: - chunk_grid = { - "name": "regular", - "configuration": {"chunk_shape": shard}, - } - - sharding_codec = { - "name": "sharding_indexed", - "configuration": { - "chunk_shape": chunk, - "codecs": [ - codec_little_endian, - *compressor, - ], - "index_codecs": [ - codec_little_endian, - {"name": "crc32c"}, - ], - "index_location": "end", - }, - } - codecs = [sharding_codec] - - else: - chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} - codecs = [ - codec_little_endian, - *compressor, - ] - - metadata = { - "chunk_grid": chunk_grid, - "codecs": codecs, - "data_type": np.dtype(dtype).name, - "fill_value": 0, - "chunk_key_encoding": { - "name": "default", - "configuration": {"separator": r"/"}, - }, - } - config = { - "driver": "zarr3", - "metadata": metadata, - } - - # ------------------------------------------------------------------ - # Zarr 2 - # ------------------------------------------------------------------ - else: - if compressor and compressor != "raw": - compressor = make_compressor_v2(compressor, **compressor_opt) - else: - compressor = None - - metadata = { - "chunks": chunk, - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": 0, - "compressor": compressor, - } - config = { - "driver": "zarr", - "metadata": metadata, - "key_encoding": r"/", - } - - # Prepare store - config["metadata"]["shape"] = shape - config["kvstore"] = make_kvstore(path) - - return config - - -def default_read_config(path: os.PathLike | str) -> dict: - """ - Generate a TensorStore configuration to read an existing Zarr. - - Parameters - ---------- - path : PathLike | str - Path to zarr array. - """ - path = UPath(path) - if not path.protocol: - path = "file://" / path - if (path / "zarr.json").exists(): - zarr_version = 3 - elif (path / ".zarray").exists(): - zarr_version = 2 - else: - raise ValueError("Cannot find zarr.json or .zarray file") - return { - "kvstore": make_kvstore(path), - "driver": "zarr3" if zarr_version == 3 else "zarr", - "open": True, - "create": False, - "delete_existing": False, - } - - -def generate_pyramid( - path: os.PathLike | str, - levels: int | None = None, - shard: list[int] | bool | Literal["auto"] | None = None, - ndim: int = 3, - max_load: int = 512, - mode: Literal["mean", "median"] = "median", -) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - path : PathLike | str - Path to parent Zarr - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - shard : list[int] | bool | {"auto"} | None - Shard size. - * If `None`, use same shard size as the input array; - * If `False`, no dot use sharding; - * If `True` or `"auto"`, automatically find shard size; - * Otherwise, use provided shard size. - ndim : int - Number of spatial dimensions. - max_load : int - Maximum number of voxels to load along each dimension. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - path = UPath(path) - if not path.protocol: - path = "file://" / path - - zarray2 = path / "0" / ".zarray" - zarray3 = path / "0" / "zarr.json" - - if zarray2.exists(): - with zarray2.open("rb") as f: - metadata = json.load(f) - zarr_version = 2 - elif zarray3.exists(): - with zarray3.open("rb") as f: - metadata = json.load(f) - zarr_version = 3 - else: - raise FileNotFoundError("Could not find initial zarr array") - - shape = list(metadata["shape"]) - - if shard and zarr_version == 2: - raise ValueError("Sharding requires zarr 3") - - # Find chunk size - if zarr_version == 3: - chunk_size = metadata["chunk_grid"]["configuration"]["chunk_shape"] - chunk_size = list(chunk_size) - for codec in metadata["codecs"]: - if codec["name"] == "sharding_indexed": - chunk_size = list(codec["configuration"]["chunk_shape"]) - break - else: - assert zarr_version == 2 - chunk_size = metadata["chunks"] - - shard_option = shard - - def update_metadata(metadata: dict, shape: list[int]) -> dict: - metadata["shape"] = shape - if shard_option is None: - return metadata - - # find chunk size and compression codecs - chunk = metadata["chunk_grid"]["configuration"]["chunk_shape"] - chunk = list(chunk) - codecs = metadata["codecs"] - for codec in metadata["codecs"]: - if codec["name"] == "sharding_indexed": - chunk = list(codec["configuration"]["chunk_shape"]) - codecs = codec["configuration"]["codecs"] - break - - # set appropriate chunking/sharding config - if shard_option == "auto": - shard = auto_shard_size(shape, metadata["data_type"]) - shard, chunk = fix_shard_chunk(shard, chunk, shape) - else: - shard = shard_option - - if shard_option is False: - metadata["chunk_grid"]["configuration"]["chunk_shape"] = chunk - metadata["codecs"] = codecs - - else: - metadata["chunk_grid"] = { - "name": "regular", - "configuration": {"chunk_shape": shard}, - } - metadata["codecs"] = [ - { - "name": "sharding_indexed", - "configuration": { - "chunk_shape": chunk, - "codecs": codecs, - "index_codecs": [ - codecs[0], # should be the bytes codec - {"name": "crc32c"}, - ], - "index_location": "end", - }, - } - ] - - return metadata - - # Select windowing function - if mode == "median": - func = np.median - else: - assert mode == "mean" - func = np.mean - - level = 0 - batch, shape = shape[:-ndim], shape[-ndim:] - allshapes = [shape] - while True: - level += 1 - - # Compute downsampled shape - prev_shape, shape = shape, [max(1, x // 2) for x in shape] - - # Stop if seen enough levels or level shape smaller than chunk size - if levels is None: - if all(x <= c for x, c in zip(shape, chunk_size[-ndim:])): - break - elif level > levels: - break - - print("Compute level", level, "with shape", shape) - - allshapes.append(shape) - - # Open input and output zarr - rconfig = default_read_config(str(path / str(level - 1))) - wconfig = { - "driver": "zarr3" if zarr_version == 3 else "zarr", - "metadata": update_metadata(metadata, batch + shape), - "kvstore": make_kvstore(path / str(level)), - "create": True, - "delete_existing": True, - } - tsreader = ts.open(rconfig).result() - tswriter = ts.open(wconfig).result() - - # Iterate across `max_load` chunks - # (note that these are unrelared to underlying zarr chunks) - grid_shape = [ceildiv(n, max_load) for n in prev_shape] - for chunk_index in itertools.product(*[range(x) for x in grid_shape]): - print(f"chunk {chunk_index} / {tuple(grid_shape)})", end="\r") - - with ts.Transaction() as txn: - # Read one chunk of data at the previous resolution - slicer = [Ellipsis] + [ - slice(i * max_load, min((i + 1) * max_load, n)) - for i, n in zip(chunk_index, prev_shape) - ] - dat = tsreader.with_transaction(txn)[tuple(slicer)].read().result() - - # Discard the last voxel along odd dimensions - crop = [0 if x == 1 else x % 2 for x in dat.shape[-3:]] - slcr = [slice(-1) if x else slice(None) for x in crop] - dat = dat[tuple([Ellipsis, *slcr])] - - patch_shape = dat.shape[-3:] - - # Reshape into patches of shape 2x2x2 - windowed_shape = [ - x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] - dat = dat.reshape(batch + windowed_shape) - # -> last `ndim`` dimensions have shape 2x2x2 - dat = dat.transpose( - list(range(len(batch))) - + list(range(len(batch), len(batch) + 2 * ndim, 2)) - + list(range(len(batch) + 1, len(batch) + 2 * ndim, 2)) - ) - # -> flatten patches - smaller_shape = [max(n // 2, 1) for n in patch_shape] - dat = dat.reshape(batch + smaller_shape + [-1]) - - # Compute the median of each patch - dtype = dat.dtype - dat = func(dat, axis=-1) - dat = dat.astype(dtype) - - # Write output - slicer = [Ellipsis] + [ - slice(i * max_load // 2, min((i + 1) * max_load // 2, n)) - for i, n in zip(chunk_index, shape) - ] - tswriter.with_transaction(txn)[tuple(slicer)] = dat - - print("") - - return allshapes - - -def write_ome_metadata( - path: str | os.PathLike, - axes: list[str], - space_scale: float | list[float] = 1, - time_scale: float = 1, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: str | int | list[str | int] = 2, - levels: int | None = None, - zarr_version: int | None = None, -) -> None: - """ - Write OME metadata into Zarr. - - Parameters - ---------- - path : str | PathLike - Path to parent Zarr. - axes : list[str] - Name of each dimension, in Zarr order (t, c, z, y, x) - space_scale : float | list[float] - Finest-level voxel size, in Zarr order (z, y, x) - time_scale : float - Time scale - space_unit : str - Unit of spatial scale (assumed identical across dimensions) - space_time : str - Unit of time scale - name : str - Name attribute - pyramid_aligns : float | list[float] | {"center", "edge"} - Whether the pyramid construction aligns the edges or the centers - of the corner voxels. If a (list of) number, assume that a moving - window of that size was used. - levels : int - Number of existing levels. Default: find out automatically. - zarr_version : {2, 3} | None - Zarr version. If `None`, guess from existing zarr array. - - """ - path = UPath(path) - - # Detect zarr version - if not zarr_version: - if (path / "0" / "zarr.json").exists(): - zarr_version = 3 - elif (path / "0" / ".zarray").exists(): - zarr_version = 2 - else: - raise FileNotFoundError("No existing array to guess version from") - - # Read shape at each pyramid level - zname = "zarr.json" if zarr_version == 3 else ".zarray" - shapes = [] - level = 0 - while True: - if levels is not None and level > levels: - break - - zpath = path / str(level) / zname - if not zpath.exists(): - levels = level - break - - level += 1 - with zpath.open("rb") as f: - zarray = json.load(f) - shapes += [zarray["shape"]] - - axis_to_type = { - "x": "space", - "y": "space", - "z": "space", - "t": "time", - "c": "channel", - } - - # Number of spatial (s), batch (b) and total (n) dimensions - ndim = len(axes) - sdim = sum(axis_to_type[axis] == "space" for axis in axes) - bdim = ndim - sdim - - if isinstance(pyramid_aligns, (int, str)): - pyramid_aligns = [pyramid_aligns] - pyramid_aligns = list(pyramid_aligns) - if len(pyramid_aligns) < sdim: - repeat = pyramid_aligns[:1] * (sdim - len(pyramid_aligns)) - pyramid_aligns = repeat + pyramid_aligns - pyramid_aligns = pyramid_aligns[-sdim:] - - if isinstance(space_scale, (int, float)): - space_scale = [space_scale] - space_scale = list(space_scale) - if len(space_scale) < sdim: - repeat = space_scale[:1] * (sdim - len(space_scale)) - space_scale = repeat + space_scale - space_scale = space_scale[-sdim:] - - multiscales = [ - { - "version": "0.4", - "axes": [ - { - "name": axis, - "type": axis_to_type[axis], - } - if axis_to_type[axis] == "channel" - else { - "name": axis, - "type": axis_to_type[axis], - "unit": ( - space_unit - if axis_to_type[axis] == "space" - else time_unit - if axis_to_type[axis] == "time" - else None - ), - } - for axis in axes - ], - "datasets": [], - "type": "median window " + "x".join(["2"] * sdim), - "name": name, - } - ] - - shape = shape0 = shapes[0] - for n in range(len(shapes)): - shape = shapes[n] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - scale = [1] * bdim + [ - ( - pyramid_aligns[i] ** n - if not isinstance(pyramid_aligns[i], str) - else (shape0[bdim + i] / shape[bdim + i]) - if pyramid_aligns[i][0].lower() == "e" - else ((shape0[bdim + i] - 1) / (shape[bdim + i] - 1)) - ) - * space_scale[i] - for i in range(sdim) - ] - translation = [0] * bdim + [ - ( - pyramid_aligns[i] ** n - 1 - if not isinstance(pyramid_aligns[i], str) - else (shape0[bdim + i] / shape[bdim + i]) - 1 - if pyramid_aligns[i][0].lower() == "e" - else 0 - ) - * 0.5 - * space_scale[i] - for i in range(sdim) - ] - - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": scale, - }, - { - "type": "translation", - "translation": translation, - }, - ] - - scale = [1] * ndim - if "t" in axes: - scale[axes.index("t")] = time_scale - multiscales[0]["coordinateTransformations"] = [{"scale": scale, "type": "scale"}] - - if zarr_version == 3: - with (path / "zarr.json").open("wt") as f: - json.dump( - { - "zarr_format": 3, - "node_type": "group", - "attributes": { - # Zarr v2 way of doing it -- neuroglancer wants this - "multiscales": multiscales, - # Zarr RFC-2 recommended way - "ome": {"version": "0.4", "multiscales": multiscales}, - }, - }, - f, - indent=4, - ) - else: - multiscales[0]["version"] = "0.4" - with (path / ".zgroup").open("wt") as f: - json.dump({"zarr_format": 2}, f, indent=4) - with (path / ".zattrs").open("wt") as f: - json.dump({"multiscales": multiscales}, f, indent=4) diff --git a/linc_convert/modalities/psoct/utils/_array_wrapper.py b/linc_convert/utils/_array_wrapper.py similarity index 100% rename from linc_convert/modalities/psoct/utils/_array_wrapper.py rename to linc_convert/utils/_array_wrapper.py diff --git a/linc_convert/utils/zarr/_zarr.py b/linc_convert/utils/zarr/_zarr.py new file mode 100644 index 00000000..6fae4d4b --- /dev/null +++ b/linc_convert/utils/zarr/_zarr.py @@ -0,0 +1,426 @@ +"""Zarr utilities.""" + +# stdlib +import itertools +import json +import math +import os +from typing import Literal +from urllib.parse import urlparse + +# externals +import nibabel as nib +import numcodecs +import numcodecs.abc +import numpy as np +import tensorstore as ts +from upath import UPath + +from linc_convert.utils.math import ceildiv + + +def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: + """Build compressor object from name and options.""" + # TODO: we should use `numcodecs.get_codec` instead` + if not isinstance(name, str): + return name + name = name.lower() + if name == "blosc": + Compressor = numcodecs.Blosc + elif name == "zlib": + Compressor = numcodecs.Zlib + else: + raise ValueError("Unknown compressor", name) + return Compressor(**prm) + + +def make_compressor_v2(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v2.""" + name = name.lower() + if name not in ("blosc", "zlib", "bz2", "zstd"): + raise ValueError("Unknown compressor", name) + return {"id": name, **prm} + + +def make_compressor_v3(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v3.""" + name = name.lower() + if name not in ("blosc", "gzip", "zstd"): + raise ValueError("Unknown compressor", name) + return {"name": name, "configuration": prm} + + +def make_kvstore(path: str | os.PathLike) -> dict: + """Transform a URI into a kvstore JSON object.""" + path = UPath(path) + if path.protocol in ("file", ""): + return {"driver": "file", "path": path.path} + if path.protocol == "gcs": + url = urlparse(str(path)) + return {"driver": "gcs", "bucket": url.netloc, "path": url.path} + if path.protocol in ("http", "https"): + url = urlparse(str(path)) + base_url = f"{url.scheme}://{url.netloc}" + if url.params: + base_url += ";" + url.params + if url.query: + base_url += "?" + url.query + if url.fragment: + base_url += "#" + url.fragment + return {"driver": "http", "base_url": base_url, "path": url.path} + if path.protocol == "memory": + return {"driver": "memory", "path": path.path} + if path.protocol == "s3": + url = urlparse(str(path)) + path = {"path": url.path} if url.path else {} + return {"driver": "s3", "bucket": url.netloc, **path} + raise ValueError("Unsupported protocol:", path.protocol) + + +def auto_shard_size( + max_shape: list[int], + itemsize: int | np.dtype | str, + max_file_size: int = 2 * 1024**4, + compression_ratio: float = 2, +) -> list[int]: + """ + Find maximal shard size that ensures file size below cap. + + Parameters + ---------- + max_shape : list[int] + Maximum shape along each dimension. + itemsize : np.dtype or int + Data type, or data type size + max_file_size : int + Maximum file size (default: 2TB). + S3 has a 5TB/file limit, but given that we use an estimated + compression factor, we aim for 2TB to leave some leeway. + compression_ratio : float + Estimated compression factor. + I roughly found 2 for bosc-compressed LSM data, when compressing + only across space and channels (5 channels). + + Returns + ------- + shard : list[int] + Estimated shard size along each dimension. + Returned shards are either max_shape or powers of two. + """ + if not isinstance(itemsize, int): + itemsize = np.dtype(itemsize).itemsize + + # Maximum number of elements in the shard + max_numel = max_file_size * compression_ratio / itemsize + + shard = [1] * len(max_shape) + while True: + # If shard larger than volume, we can stop + if all(x >= s for x, s in zip(shard, max_shape)): + break + # Make shard one level larger + new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] + # If shard is too large, stop and keep previous shard + if np.prod(new_shard) > max_numel: + break + # Otherwise, use larger shard and recurse + shard = new_shard + + # replace max size with larger power of two + shard = [2 ** math.ceil(math.log2(x)) for x in shard] + return shard + + +def niftizarr_write_header( + path: os.PathLike | str, + shape: list[int], + affine: np.ndarray, + dtype: np.dtype | str, + unit: Literal["micron", "mm"] | None = None, + header: nib.Nifti1Header | nib.Nifti2Header | None = None, + zarr_version: int = 3, +) -> None: + """ + Write NIfTI header in a NIfTI-Zarr file. + + Parameters + ---------- + path : PathLike | str + Path to parent Zarr. + affine : (4, 4) matrix + Orientation matrix. + shape : list[int] + Array shape, in NIfTI order (x, y, z, t, c). + dtype : np.dtype | str + Data type. + unit : {"micron", "mm"}, optional + World unit. + header : nib.Nifti1Header | nib.Nifti2Header, optional + Pre-instantiated header. + zarr_version : int, default=3 + Zarr version. + """ + # TODO: we do not write the json zattrs, but it should be added in + # once the nifti-zarr package is released + + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # If dimensions do not fit in a short (which is often the case), we + # use NIfTI 2. + if all(x < 32768 for x in shape): + NiftiHeader = nib.Nifti1Header + else: + NiftiHeader = nib.Nifti2Header + + header = header or NiftiHeader() + header.set_data_shape(shape) + header.set_data_dtype(dtype) + header.set_qform(affine) + header.set_sform(affine) + if unit: + header.set_xyzt_units(nib.nifti1.unit_codes.code[unit]) + header = np.frombuffer(header.structarr.tobytes(), dtype="u1") + + if zarr_version == 3: + metadata = { + "chunk_grid": { + "name": "regular", + "configuration": {"chunk_shape": [len(header)]}, + }, + "codecs": [ + {"name": "bytes"}, + make_compressor_v3("gzip"), + ], + "data_type": "uint8", + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + tsconfig = { + "driver": "zarr3", + "metadata": metadata, + } + else: + metadata = { + "chunks": [len(header)], + "order": "F", + "dtype": "|u1", + "fill_value": None, + "compressor": make_compressor_v2("zlib"), + } + tsconfig = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + tsconfig["kvstore"] = make_kvstore(path / "nifti") + tsconfig["metadata"]["shape"] = [len(header)] + tsconfig["create"] = True + tsconfig["delete_existing"] = True + tswriter = ts.open(tsconfig).result() + with ts.Transaction() as txn: + tswriter.with_transaction(txn)[:] = header + print("done.") + + +def fix_shard_chunk( + shard: list[int], + chunk: list[int], + shape: list[int], +) -> tuple[list[int], list[int]]: + """ + Fix incompatibilities between chunk and shard size. + + Parameters + ---------- + shard : list[int] + chunk : list[int] + shape : list[int] + + Returns + ------- + shard : list[int] + chunk : list[int] + """ + shard= list(shard) + chunk = list(chunk) + for i in range(len(chunk)): + # if chunk spans the entire volume, match chunk and shard + if chunk[i] == shape[i] and chunk[i] != shard[i]: + chunk[i] = shard[i] + # ensure that shard is a multiple of chunk + if shard[i] % chunk[i]: + shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) + return shard, chunk + + +def default_write_config( + path: os.PathLike | str, + shape: list[int], + dtype: np.dtype | str, + chunk: list[int] = [32], + shard: list[int] | Literal["auto"] | None = None, + compressor: str = "blosc", + compressor_opt: dict | None = None, + version: int = 3, +) -> dict: + """ + Generate a default TensorStore configuration. + + Parameters + ---------- + chunk : list[int] + Chunk size. + shard : list[int], optional + Shard size. No sharding if `None`. + compressor : str + Compressor name + version : int + Zarr version + + Returns + ------- + config : dict + Configuration + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # Format compressor + if version == 3 and compressor == "zlib": + compressor = "gzip" + if version == 2 and compressor == "gzip": + compressor = "zlib" + compressor_opt = compressor_opt or {} + + # Prepare chunk size + if isinstance(chunk, int): + chunk = [chunk] + chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk + + # Prepare shard size + if shard: + if shard == "auto": + shard = auto_shard_size(shape, dtype) + if isinstance(shard, int): + shard = [shard] + shard = shard[:1] * max(0, len(shape) - len(shard)) + shard + + # Fix incompatibilities + shard, chunk = fix_shard_chunk(shard, chunk, shape) + + # ------------------------------------------------------------------ + # Zarr 3 + # ------------------------------------------------------------------ + if version == 3: + if compressor and compressor != "raw": + compressor = [make_compressor_v3(compressor, **compressor_opt)] + else: + compressor = [] + + codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} + + if shard: + chunk_grid = { + "name": "regular", + "configuration": {"chunk_shape": shard}, + } + + sharding_codec = { + "name": "sharding_indexed", + "configuration": { + "chunk_shape": chunk, + "codecs": [ + codec_little_endian, + *compressor, + ], + "index_codecs": [ + codec_little_endian, + {"name": "crc32c"}, + ], + "index_location": "end", + }, + } + codecs = [sharding_codec] + + else: + chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} + codecs = [ + codec_little_endian, + *compressor, + ] + + metadata = { + "chunk_grid": chunk_grid, + "codecs": codecs, + "data_type": np.dtype(dtype).name, + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + config = { + "driver": "zarr3", + "metadata": metadata, + } + + # ------------------------------------------------------------------ + # Zarr 2 + # ------------------------------------------------------------------ + else: + if compressor and compressor != "raw": + compressor = make_compressor_v2(compressor, **compressor_opt) + else: + compressor = None + + metadata = { + "chunks": chunk, + "order": "F", + "dtype": np.dtype(dtype).str, + "fill_value": 0, + "compressor": compressor, + } + config = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + + # Prepare store + config["metadata"]["shape"] = shape + config["kvstore"] = make_kvstore(path) + + return config + + +def default_read_config(path: os.PathLike | str) -> dict: + """ + Generate a TensorStore configuration to read an existing Zarr. + + Parameters + ---------- + path : PathLike | str + Path to zarr array. + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + if (path / "zarr.json").exists(): + zarr_version = 3 + elif (path / ".zarray").exists(): + zarr_version = 2 + else: + raise ValueError("Cannot find zarr.json or .zarray file") + return { + "kvstore": make_kvstore(path), + "driver": "zarr3" if zarr_version == 3 else "zarr", + "open": True, + "create": False, + "delete_existing": False, + } From 21bb3e1208ec78378fa1022df4071938ee555f84 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 11:20:56 -0400 Subject: [PATCH 042/157] fix: add exception --- linc_convert/utils/zarr/compressor.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/linc_convert/utils/zarr/compressor.py b/linc_convert/utils/zarr/compressor.py index 71d1687e..3c3a3a66 100644 --- a/linc_convert/utils/zarr/compressor.py +++ b/linc_convert/utils/zarr/compressor.py @@ -1,10 +1,8 @@ """Functions for zarr compression.""" from typing import Any, Literal -import zarr.codecs - -def make_compressor(name: str | None, zarr_version: Literal[2, 3],**prm: dict) -> Any: +def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: """Build compressor object from name and options.""" if not isinstance(name, str): return name @@ -21,7 +19,8 @@ def make_compressor(name: str | None, zarr_version: Literal[2, 3],**prm: dict) - "blosc": zarr.codecs.BloscCodec, "zlib": zarr.codecs.ZstdCodec, } - + else: + raise ValueError() name = name.lower() if name not in compressor_map: From bcc119c629eb67fec0bbfa51051cef4b8d955d04 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 11:21:25 -0400 Subject: [PATCH 043/157] feat: use tensorstore in pyramid generation --- linc_convert/utils/zarr/generate_pyramid.py | 99 +++++++++++++++++++-- 1 file changed, 91 insertions(+), 8 deletions(-) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 85fec5c9..9f795962 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -7,11 +7,17 @@ import numpy as np import tqdm import zarr +import dask from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata +import tensorstore as ts + from linc_convert.utils.math import ceildiv from .create_array import dimension_separator_to_chunk_key_encoding + +from dask.diagnostics import ProgressBar + logger = logging.getLogger(__name__) def generate_pyramid( @@ -197,6 +203,21 @@ def get_zarray_options(base_level): opts.update(**opts_extra) return opts +class _TSAdapter: + def __init__(self, ts): + self._ts = ts + @property + def shape(self): return tuple(self._ts.shape) + @property + def ndim(self): return self._ts.ndim + @property + def dtype(self): + # Expose the NumPy dtype here: + return self._ts.dtype.numpy_dtype + def __getitem__(self, idx): + return self._ts[idx].read().result() + + def generate_pyramid_new( omz: zarr.Group, @@ -229,6 +250,9 @@ def generate_pyramid_new( Shapes of all levels, from finest to coarsest, including the existing top level. """ + from linc_convert.utils.zarr._zarr import default_write_config, \ + default_read_config + # Read properties from base level base_level = omz["0"] base_shape = list(base_level.shape) @@ -236,7 +260,7 @@ def generate_pyramid_new( opts = get_zarray_options(base_level) # Select windowing function - window_func = {"median": np.median, "mean": np.mean}[mode] + window_func = {"median": da.median, "mean": da.mean}[mode] batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] all_shapes = [spatial_shape] @@ -245,23 +269,82 @@ def generate_pyramid_new( if levels == -1: levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + rconfig = default_read_config(str(omz["0"].store_path)) + reader = ts.open(rconfig).result() + + reader = _TSAdapter(reader) + dat = da.from_array(reader, chunks=opts["chunks"]) + tasks = [] for lvl in tqdm.tqdm(range(1, levels + 1)): - # Compute downsampled shape prev_shape = spatial_shape spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) all_shapes.append(spatial_shape) logger.info(f"Compute level {lvl} with shape {spatial_shape}") - arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) - dat = da.from_zarr(omz[str(lvl - 1)]) - dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - dat = dat.rechunk(arr.chunks) - dat.store(arr) - + # dat = da.from_zarr(omz[str(lvl - 1)]) + + wconfig = default_write_config(str(arr.store_path),shape = batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"]) + wconfig["delete_existing"] = True + wconfig["create"] = True + writer = ts.open(wconfig).result() + # + # + # dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + dat = compute_next_level_dask(dat, ndim, no_pyramid_axis, window_func) + # with ProgressBar():/ + # dat.compute() + # TODO: this exists even without sharding + if arr.shards: + dat = dat.rechunk(arr.shards) + else: + dat = dat.rechunk(arr.chunks) + with ProgressBar(): + tasks.append(dat.store(writer, compute=False)) + # TODO: delay this task, write together + dask.compute(*tasks) return all_shapes +def compute_next_level_dask(arr, ndim, no_pyramid_axis=None, window_func=da.mean): + """ + Compute the next (half-resolution) level of a dask array pyramid along the + last `ndim` dimensions, optionally skipping reduction along one axis. + + Parameters + ---------- + arr : dask.array.Array + Input array of shape (..., N1, N2, ..., Nndim). + ndim : int + Number of “pyramid” dimensions at the end of arr.ndim. + no_pyramid_axis : int or None + If not None, that axis (0 ≤ axis < ndim) will not be downsampled. + window_func : callable + A reduction function like da.mean or da.median. + + Returns + ------- + dask.array.Array + Array of shape (..., ceil(N1/2), ceil(N2/2), ...,ceil(Nndim/2)) + except on `no_pyramid_axis` where the length is unchanged. + """ + + # figure out which global axes we’re coarsening + start = arr.ndim - ndim + pyramid_axes = list(range(start, arr.ndim)) + + # build the coarsening factors: 2 along each pyramid dim, except 1 if skip + factors = { + axis: ( + 1 if (no_pyramid_axis is not None and axis == pyramid_axes[no_pyramid_axis]) + else 2) + for axis in pyramid_axes + } + + # da.coarsen will drop any “extra” pixels at the end if trim_excess=True + return da.coarsen(window_func, arr, factors, trim_excess=True) + + def compute_next_level(arr, ndim, no_pyramid_axis, window_func): batch_shape, prev_shape = arr.shape[:-ndim], arr.shape[-ndim:] batch_shape = list(batch_shape) From 6b38baea68d61a16b9c9c89d855620b0160840cf Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 13:37:21 -0400 Subject: [PATCH 044/157] tests: add unit test for psoct pipelines --- tests/test_oct.py | 141 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 tests/test_oct.py diff --git a/tests/test_oct.py b/tests/test_oct.py new file mode 100644 index 00000000..58d9a1c7 --- /dev/null +++ b/tests/test_oct.py @@ -0,0 +1,141 @@ +import glob +import shutil +import tempfile +from os import PathLike +from pathlib import Path +from typing import Union + +import skimage +import zarr.storage +from scipy.io import savemat + +from linc_convert.modalities.psoct import single_volume, multi_slice +from utils.helper import _cmp_zarr_archives + + +# def test_oct(tmp_path): +# files = glob.glob("data/test_oct/*") +# files.sort() +# output_zarr = tmp_path / "output.zarr" +# multi_slice.convert( +# files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True +# ) +# assert _cmp_zarr_archives(str(output_zarr), "data/oct.zarr") + +def generate_single_volume_data(path: Union[str, PathLike]) -> None: + """ + Generate a single-brain-volume test dataset and save it as a .mat file. + + Parameters + ---------- + path : Union[str, PathLike] + Path to save the .mat file. Can be: + - a directory (e.g. "tests/data/") → will write "tests/data/single_volume.mat" + - a filename (e.g. "out/myvol.mat" or "out/myvol") → will write to that file (appending .mat if needed) + """ + p = Path(path) + if p.is_dir() or str(p).endswith(('/', '\\')): + p = p / "single_volume.mat" + if p.suffix.lower() != ".mat": + p = p.with_suffix(".mat") + p.parent.mkdir(parents=True, exist_ok=True) + + volume = skimage.data.brain().T + savemat(str(p), {"volume": volume}) + + +def test_oct_single_volume(tmp_path): + input_path = tmp_path / "single_volume.mat" + output_path = tmp_path / "single_volume.nii.zarr" + generate_single_volume_data(input_path) + single_volume.convert(input_path, out=str(output_path), key="volume", + zarr_version=2, overwrite=True, chunk=(64,)) + + assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + "data/oct_single_volume_zarr2.nii.zarr.zip", mode="r")) + + +def test_oct_single_volume_zarr3(tmp_path): + input_path = tmp_path / "single_volume.mat" + output_path = tmp_path / "single_volume.nii.zarr" + generate_single_volume_data(input_path) + single_volume.convert(input_path, out=str(output_path), key="volume", + zarr_version=3, overwrite=True, chunk=(64,)) + + assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + "data/oct_single_volume_zarr3.nii.zarr.zip", mode="r")) + + +def generate_single_volume_test_result(): + with tempfile.TemporaryDirectory() as tmpdir: + tmpdir = Path(tmpdir) + try: + test_oct_single_volume(tmpdir) + except Exception as e: + pass + shutil.make_archive("data/oct_single_volume_zarr2.nii.zarr", "zip", + str(tmpdir / "single_volume.nii.zarr"), ) + try: + test_oct_single_volume_zarr3(tmpdir) + except Exception as e: + pass + shutil.make_archive("data/oct_single_volume_zarr3.nii.zarr", "zip", + str(tmpdir / "single_volume.nii.zarr"), ) + + +def generate_multi_slice_data(path: Union[str, PathLike]) -> None: + """ + Generate a single-brain-volume test dataset and save it as a .mat file. + + Parameters + ---------- + path : Union[str, PathLike] + Path to save the .mat file. + """ + p = Path(path) + p.mkdir(parents=True, exist_ok=True) + + volume = skimage.data.brain().T + for i in range(5): + savemat(str(p / f"slice_{i:03d}.mat"), {"Psi_ObsLSQ": volume[..., i]}) + + +def test_oct_multi_slices(tmp_path): + input_path = tmp_path + output_path = tmp_path / "multi_slice.nii.zarr" + generate_multi_slice_data(input_path) + input_path = glob.glob(str(input_path / "*.mat")) + multi_slice.convert(input_path, out=str(output_path), zarr_version=2, + overwrite=True, chunk=(64,)) + + assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + "data/oct_multi_slice_zarr2.nii.zarr.zip", mode="r")) + + +def test_oct_multi_slices_zarr3(tmp_path): + input_path = tmp_path + output_path = tmp_path / "multi_slice.nii.zarr" + generate_multi_slice_data(input_path) + input_path = glob.glob(str(input_path / "*.mat")) + multi_slice.convert(input_path, out=str(output_path), zarr_version=3, + overwrite=True, chunk=(64,)) + + assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + "data/oct_multi_slice_zarr3.nii.zarr.zip", mode="r")) + + +def generate_multi_slice_test_result(): + with tempfile.TemporaryDirectory() as tmpdir: + tmpdir = Path(tmpdir) + try: + test_oct_multi_slices(tmpdir) + except Exception as e: + pass + shutil.make_archive("data/oct_multi_slice_zarr2.nii.zarr", "zip", + str(tmpdir / "multi_slice.nii.zarr"), ) + try: + test_oct_multi_slices_zarr3(tmpdir) + except Exception as e: + pass + shutil.make_archive("data/oct_multi_slice_zarr3.nii.zarr", "zip", + str(tmpdir / "multi_slice.nii.zarr"), ) From ac83ab0a58ddb5b81536a5da87b792a5bf47a313 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 14:00:41 -0400 Subject: [PATCH 045/157] chore: add backward func --- linc_convert/modalities/psoct/multi_slice.py | 2 +- linc_convert/modalities/psoct/single_volume.py | 2 +- linc_convert/utils/zarr/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index d0cdd336..d523f80e 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -24,7 +24,7 @@ from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid +from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid, generate_pyramid_old from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata from linc_convert.utils.zarr.zarr_config import ZarrConfig diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 3900d758..6aabbb89 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -24,7 +24,7 @@ from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import generate_pyramid, create_array, open_zarr_group +from linc_convert.utils.zarr import generate_pyramid, create_array, open_zarr_group, generate_pyramid_old from linc_convert.utils.zarr.zarr_config import ZarrConfig logger = logging.getLogger(__name__) diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py index 4e9fcce1..721534e7 100644 --- a/linc_convert/utils/zarr/__init__.py +++ b/linc_convert/utils/zarr/__init__.py @@ -1,5 +1,5 @@ """Zarr utilities.""" from .compressor import make_compressor from .create_array import create_array, open_zarr_group -from .generate_pyramid import generate_pyramid +from .generate_pyramid import generate_pyramid, generate_pyramid_old from .zarr_config import ZarrConfig From 21b937d613715e425d7e60386ce916371d2bc424 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 14:02:27 -0400 Subject: [PATCH 046/157] fix: generate pyramid use correct zarr version --- linc_convert/utils/zarr/generate_pyramid.py | 25 +++++++++------------ 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 9f795962..f9bb4347 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -20,7 +20,7 @@ logger = logging.getLogger(__name__) -def generate_pyramid( +def generate_pyramid_old( omz: zarr.Group, levels: int = -1, ndim: int = 3, @@ -219,7 +219,7 @@ def __getitem__(self, idx): -def generate_pyramid_new( +def generate_pyramid( omz: zarr.Group, levels: int = -1, ndim: int = 3, @@ -284,29 +284,24 @@ def generate_pyramid_new( # dat = da.from_zarr(omz[str(lvl - 1)]) - wconfig = default_write_config(str(arr.store_path),shape = batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"]) + wconfig = default_write_config(str(arr.store_path),shape = batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"], + version = omz.info._zarr_format) wconfig["delete_existing"] = True wconfig["create"] = True writer = ts.open(wconfig).result() - # - # - # dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - dat = compute_next_level_dask(dat, ndim, no_pyramid_axis, window_func) - # with ProgressBar():/ - # dat.compute() + dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) # TODO: this exists even without sharding if arr.shards: dat = dat.rechunk(arr.shards) else: dat = dat.rechunk(arr.chunks) with ProgressBar(): - tasks.append(dat.store(writer, compute=False)) + dat.store(writer) # TODO: delay this task, write together - dask.compute(*tasks) return all_shapes -def compute_next_level_dask(arr, ndim, no_pyramid_axis=None, window_func=da.mean): +def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): """ Compute the next (half-resolution) level of a dask array pyramid along the last `ndim` dimensions, optionally skipping reduction along one axis. @@ -340,12 +335,12 @@ def compute_next_level_dask(arr, ndim, no_pyramid_axis=None, window_func=da.mean else 2) for axis in pyramid_axes } - + dtype = arr.dtype # da.coarsen will drop any “extra” pixels at the end if trim_excess=True - return da.coarsen(window_func, arr, factors, trim_excess=True) + return da.coarsen(window_func, arr, factors, trim_excess=True).astype(dtype) -def compute_next_level(arr, ndim, no_pyramid_axis, window_func): +def compute_next_level_old(arr, ndim, no_pyramid_axis, window_func): batch_shape, prev_shape = arr.shape[:-ndim], arr.shape[-ndim:] batch_shape = list(batch_shape) crop = [ From d75a4a9161a8225b3a7d6de1def06ec3c87ce483 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 17:02:35 -0400 Subject: [PATCH 047/157] feat: use abstract classes for zarrio --- .../modalities/psoct/single_volume.py | 16 +- linc_convert/utils/zarr/zarr_config.py | 2 +- linc_convert/utils/zarr/zarr_io/__init__.py | 339 ++++++++++++++++++ 3 files changed, 349 insertions(+), 8 deletions(-) create mode 100644 linc_convert/utils/zarr/zarr_io/__init__.py diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 6aabbb89..14f26928 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -13,6 +13,7 @@ import cyclopts import h5py +from linc_convert.utils.zarr.zarr_io import ZarrPythonGroup, from_config import numpy as np from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header @@ -124,7 +125,7 @@ def convert( unit = "um" # Prepare Zarr group - omz = open_zarr_group(zarr_config) + zgroup = from_config(zarr_config, overwrite= ZarrConfig.overwrite) if not hasattr(inp, "dtype"): raise Exception("Input is not a numpy array. This is unexpected.") @@ -136,7 +137,7 @@ def convert( nj = ceildiv(inp.shape[1], inp_chunk[1]) ni = ceildiv(inp.shape[2], inp_chunk[2]) - dataset = create_array(omz, "0", shape=inp.shape, zarr_config=zarr_config, + dataset = zgroup.create_array("0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype)) for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): @@ -146,18 +147,19 @@ def convert( loaded_chunk = inp[slc] dataset[slc] = loaded_chunk - generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + # generate_pyramid(zgroup, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + zgroup.generate_pyramid( mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") - write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: logger.info("Conversion complete.") return # Write NIfTI-Zarr header - arr = omz["0"] + arr = zgroup["0"] header = default_nifti_header(arr, - omz.attrs.get("ome", omz.attrs).get("multiscales")) + zgroup.attrs.get("ome", zgroup.attrs).get("multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: @@ -168,4 +170,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(to_nifti_unit(unit)) - write_nifti_header(omz, header) + write_nifti_header(zgroup, header) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index f1ba86f5..6fa29c9d 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -95,7 +95,7 @@ class ZarrConfig: nii: bool = False max_load: int = 512 overwrite: bool = False - # driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" + driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" def __post_init__(self) -> None: if self.out: diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py new file mode 100644 index 00000000..b4ef522e --- /dev/null +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -0,0 +1,339 @@ +import ast +import logging +from abc import ABC, abstractmethod +from typing import Iterator, Literal, Optional + +import dask.array as da +import numpy as np +import tqdm +import zarr +from dask.diagnostics import ProgressBar +from numpy._typing import DTypeLike + +from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.create_array import compute_zarr_layout, \ + dimension_separator_to_chunk_key_encoding +from linc_convert.utils.zarr.generate_pyramid import compute_next_level, default_levels, \ + next_level_shape + +logger = logging.getLogger(__name__) + + +class ZarrNode(ABC): + """ + Base class for any Zarr-like object (group or array). + """ + + def __init__(self): + pass + + # @property + # @abstractmethod + # def path(self): + # """Path to this node in the Zarr hierarchy.""" + ... + + @abstractmethod + def attrs(self): + """Access metadata/attributes for this node.""" + ... + + +class ZarrGroup(ZarrNode): + """ + Abstract interface for a Zarr group (container of arrays and/or subgroups). + """ + + # @abstractmethod + # def open_group(self, name, mode: str = 'r', **kwargs): + # """Open or create a subgroup by name.""" + # ... + # + # @abstractmethod + # def open_array(self, name, mode: str = 'r', **kwargs): + # """Open or create an array by name.""" + # ... + + @abstractmethod + def __getitem__(self, item): + ... + + +class ZarrArray(ZarrNode): + """ + Abstract interface for a Zarr array (n-dimensional data). + """ + + @abstractmethod + def shape(self) -> tuple[int, ...]: + ... + + @abstractmethod + def dtype(self) -> np.dtype: + ... + + +class ZarrPythonGroup(ZarrGroup): + @classmethod + def from_config(cls, zarr_config: ZarrConfig, overwrite=False) -> 'ZarrPythonGroup': + store = zarr.storage.LocalStore(zarr_config.out) + return cls(zarr.group(store=store, overwrite=overwrite, + zarr_format=zarr_config.zarr_version)) + + def __init__(self, zarr_group: zarr.Group): + # super().__init__(zarr_group.store.path) + self._zgroup = zarr_group + + def create_group(self, *args, **kwargs): + """ + Create a new subgroup in the group. + """ + return ZarrPythonGroup(self._zgroup.create_group(*args, **kwargs)) + + def keys(self): + yield from self._zgroup.keys() + + @property + def attrs(self): + return self._zgroup.attrs + + def __iter__(self) -> Iterator[str]: + yield from self.keys() + + def __getitem__(self, key): + if key in self._zgroup: + item = self._zgroup[key] + if isinstance(item, zarr.Group): + return ZarrPythonGroup(item) + elif isinstance(item, zarr.Array): + return ZarrPythonArray(item) + else: + raise TypeError(f"Unsupported item type: {type(item)}") + else: + raise KeyError(f"Key '{key}' not found in group '{self.path}'") + + def __getattr__(self, name): + return getattr(self._zgroup, name) + + def create_array(self, + name: str, + shape: tuple, + zarr_config: ZarrConfig = None, + dtype: DTypeLike = np.int32, + data=None, + **kwargs + ) -> zarr.Array: + if zarr_config is None: + arr = self._zgroup.create_array(name, shape, dtype, **kwargs) + if data is not None: + arr[:] = data + return ZarrPythonArray(arr) + + compressor = zarr_config.compressor + compressor_opt = zarr_config.compressor_opt + chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + + if isinstance(compressor_opt, str): + compressor_opt = ast.literal_eval(compressor_opt) + + opt = { + "chunks": chunk, + "shards": shard, + "order": zarr_config.order, + "dtype": np.dtype(dtype).str, + "fill_value": None, + "compressors": make_compressor(compressor, zarr_config.zarr_version, + **compressor_opt), + } + + chunk_key_encoding = dimension_separator_to_chunk_key_encoding( + zarr_config.dimension_separator, zarr_config.zarr_version) + if chunk_key_encoding: + opt["chunk_key_encoding"] = chunk_key_encoding + arr = self._zgroup.create_array(name=name, + shape=shape, + **opt) + if data: + arr[:] = data + return ZarrPythonArray(arr) + + def create_array_from_base(self, name: str, shape: tuple, data=None, + **kwargs) -> 'ZarrPythonArray': + """ + Create a new array using the properties from a base_level object. + """ + base_level = self['0'] + opts = dict( + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=getattr(base_level, "shards", None), + filters=getattr(base_level._array, "filters", None), + compressors=getattr(base_level._array, "compressors", None), + fill_value=getattr(base_level._array, "fill_value", None), + order=getattr(base_level._array, "order", None), + attributes=getattr(getattr(base_level._array, "metadata", None), + "attributes", None), + overwrite=True, + ) + # Handle extra options based on metadata type + meta = getattr(base_level, "metadata", None) + if meta is not None: + if hasattr(meta, "dimension_separator"): + opts["chunk_key_encoding"] = dimension_separator_to_chunk_key_encoding( + meta.dimension_separator, 2) + if hasattr(meta, "chunk_key_encoding"): + opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) + if hasattr(base_level, "serializer"): + opts["serializer"] = getattr(base_level, "serializer", None) + if hasattr(meta, "dimension_names"): + opts["dimension_names"] = getattr(meta, "dimension_names", None) + # Remove None values + opts = {k: v for k, v in opts.items() if v is not None} + opts.update(kwargs) + arr = self._zgroup.create_array(name=name, shape=shape, **opts) + if data is not None: + arr[:] = data + return ZarrPythonArray(arr) + + def generate_pyramid( + self, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, + ) -> list[list[int]]: + """ + Generate the levels of a pyramid in an existing Zarr. + + Parameters + ---------- + omz : zarr.Group + Zarr group object + levels : int + Number of additional levels to generate. + By default, stop when all dimensions are smaller than their + corresponding chunk size. + ndim : int + Number of spatial dimensions. + mode : {"mean", "median"} + Whether to use a mean or median moving window. + no_pyramid_axis : int | None + Axis that should not be downsampled. If None, downsample + across all three dimensions. + Returns + ------- + shapes : list[list[int]] + Shapes of all levels, from finest to coarsest, including the + existing top level. + """ + + base_level = self['0'] + base_shape = list(base_level.shape) + chunk_size = base_level.chunks + + window_func = {"median": da.median, "mean": da.mean}[mode] + + batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + all_shapes = [spatial_shape] + + if levels == -1: + levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + + for lvl in tqdm.tqdm(range(1, levels + 1)): + prev_shape = spatial_shape + spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + all_shapes.append(spatial_shape) + logger.info(f"Compute level {lvl} with shape {spatial_shape}") + arr = self.create_array_from_base( + str(lvl), shape=batch_shape + spatial_shape) + dat = da.from_zarr(self[str(lvl - 1)]._array) + dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + if arr.shards: + dat = dat.rechunk(arr.shards) + else: + dat = dat.rechunk(arr.chunks) + with ProgressBar(): + dat.store(arr) + return all_shapes + + @property + def zarr_version(self) -> Literal[2, 3]: + return self._zgroup.metadata.zarr_format + + +class ZarrPythonArray(ZarrArray): + def __init__(self, array: zarr.Array): + # super().__init__(array.store.path) + self._array = array + + @property + def attrs(self): + return self._array.attrs + + @property + def shape(self) -> tuple[int, ...]: + return self._array.shape + + @property + def dtype(self) -> np.dtype: + return self._array.dtype + + @property + def chunks(self) -> tuple: + return self._array.chunks + + @property + def shards(self) -> tuple: + return self._array.shards + + def __setitem__(self, key, value): + self._array[key] = value + + def __getitem__(self, item): + return self._array[item] + + def __getattr__(self, name): + if name == "_array": + return self._array + if hasattr(self._array, name): + return getattr(self._array, name) + else: + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{name}'") + + # def __setattr__(self, name, value): + # if name == "_array" and self._array is not None: + # raise AttributeError("Cannot set '_array' attribute directly.") + # elif hasattr(self._array, name): + # setattr(self._array, name, value) + # else: + # raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + + +def open(): + pass + + +def open_group(backend=None): + pass + + +def from_config(zarr_config: ZarrConfig, overwrite=False) -> 'ZarrGroup': + """ + Create a ZarrGroup from a ZarrConfig. + + Parameters + ---------- + zarr_config : ZarrConfig + Configuration for the Zarr group. + + Returns + ------- + ZarrGroup + An instance of ZarrGroup based on the configuration. + """ + if zarr_config.driver == "zarr-python": + return ZarrPythonGroup.from_config(zarr_config, overwrite=overwrite) + else: + raise NotImplementedError(f"Driver '{zarr_config.driver}' is not implemented.") From 5a28dc8822e30e700349fda25b5474a235f3ca63 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 23 Jun 2025 17:02:59 -0400 Subject: [PATCH 048/157] fix: add dependency, dask --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 159fa512..aba9b351 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,8 @@ nibabel = "*" zarr = "^3.0.0" nifti-zarr = "*" tqdm = "*" +dask = "*" + # optionals glymur = { version = "*", optional = true } tifffile = { version = "*", optional = true } From 22adc214b84dd2e09342f03bb57b62705ce863a6 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:17:55 -0400 Subject: [PATCH 049/157] tests: refactor test helper function --- tests/utils/compare_file.py | 112 ++++++++++++++++++++++++++++++++++++ tests/utils/helper.py | 42 -------------- 2 files changed, 112 insertions(+), 42 deletions(-) create mode 100644 tests/utils/compare_file.py delete mode 100644 tests/utils/helper.py diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py new file mode 100644 index 00000000..792c3283 --- /dev/null +++ b/tests/utils/compare_file.py @@ -0,0 +1,112 @@ +import argparse +import os +import sys + +import numpy as np +import zarr + + +def load_file(path): + """ + Load data from a file based on its extension. + Supports .nii, .nii.gz (via nibabel), .mat (via scipy.io), and .zarr (via zarr-python). + """ + ext = os.path.splitext(path)[1].lower() + # Handle .nii and .nii.gz + if ext in ['.nii', '.gz'] and (path.endswith('.nii') or path.endswith('.nii.gz')): + try: + import nibabel as nib + except ImportError: + print("Error: nibabel is not installed.") + sys.exit(1) + img = nib.load(path) + data = img.get_fdata() + return data + + # Handle .mat + if ext == '.mat': + try: + from scipy.io import loadmat + except ImportError: + print("Error: scipy is not installed.") + sys.exit(1) + mat = loadmat(path) + # Extract variable array from mat dict (ignoring metadata keys) + keys = [k for k in mat.keys() if not k.startswith('__')] + if len(keys) != 1: + print(f"Error: Expected one variable in the MAT file, found {len(keys)}: {keys}") + sys.exit(1) + return mat[keys[0]] + + # Handle .zarr + if ext == '.zarr' or '.zarr' in path: + try: + import zarr + except ImportError: + print("Error: zarr is not installed.") + sys.exit(1) + arr = zarr.open(path, mode='r') + return arr[:] # load full array into memory + + print(f"Unsupported file extension: {ext}") + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser(description='Compare arrays in two files.') + parser.add_argument('file1', help='First file (.nii, .nii.gz, .mat, .zarr)') + parser.add_argument('file2', help='Second file (.nii, .nii.gz, .mat, .zarr)') + args = parser.parse_args() + + a = load_file(args.file1) + b = load_file(args.file2) + try: + np.testing.assert_array_almost_equal(a, b, decimal=4) + print("Arrays are almost equal up to 6 decimal places.") + except AssertionError as e: + print("Arrays differ:") + print(e) + + +if __name__ == '__main__': + main() + + +def _cmp_zarr_archives(path1: str, path2: str) -> bool: + """ + Compare two Zarr archives to check if they contain the same data. + + Parameters + ---------- + - path1 (str): Path to the first Zarr archive. + - path2 (str): Path to the second Zarr archive. + + Returns + ------- + - bool: True if both archives contain the same data, False otherwise. + """ + # Open both Zarr groups + zarr1 = zarr.open(path1, mode="r") + zarr2 = zarr.open(path2, mode="r") + + # Compare keys (dataset structure) + if set(zarr1.keys()) != set(zarr2.keys()): + print("keys mismatch") + return False + if zarr1.attrs != zarr2.attrs: + print("attrs mismatch") + return False + + # Compare each array in both archives + for key in zarr1.keys(): + array1 = zarr1[key][:] + array2 = zarr2[key][:] + + np.testing.assert_allclose(array1, array2) + if zarr1[key].attrs != zarr2[key].attrs: + print("attrs mismatch") + return False + + # If all checks pass + print("The Zarr archives are identical.") + return True diff --git a/tests/utils/helper.py b/tests/utils/helper.py deleted file mode 100644 index f55e149e..00000000 --- a/tests/utils/helper.py +++ /dev/null @@ -1,42 +0,0 @@ -import numpy as np -import zarr - - -def _cmp_zarr_archives(path1: str, path2: str) -> bool: - """ - Compare two Zarr archives to check if they contain the same data. - - Parameters - ---------- - - path1 (str): Path to the first Zarr archive. - - path2 (str): Path to the second Zarr archive. - - Returns - ------- - - bool: True if both archives contain the same data, False otherwise. - """ - # Open both Zarr groups - zarr1 = zarr.open(path1, mode="r") - zarr2 = zarr.open(path2, mode="r") - - # Compare keys (dataset structure) - if set(zarr1.keys()) != set(zarr2.keys()): - print("keys mismatch") - return False - if zarr1.attrs != zarr2.attrs: - print("attrs mismatch") - return False - - # Compare each array in both archives - for key in zarr1.keys(): - array1 = zarr1[key][:] - array2 = zarr2[key][:] - - np.testing.assert_allclose(array1, array2) - if zarr1[key].attrs != zarr2[key].attrs: - print("attrs mismatch") - return False - - # If all checks pass - print("The Zarr archives are identical.") - return True From 28b312663d92db696c62d515644e15ce4e536e7e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:18:12 -0400 Subject: [PATCH 050/157] tests: add sample data --- tests/utils/sample_data.py | 81 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/utils/sample_data.py diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py new file mode 100644 index 00000000..b1a97887 --- /dev/null +++ b/tests/utils/sample_data.py @@ -0,0 +1,81 @@ +import numpy as np +import skimage +from typing import List, Optional, Tuple + +def sample_data_variation( + param: float, + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None +) -> np.ndarray: + """ + Scale global intensity by (1+param), then wrap values modulo the output dtype range. + + Parameters + ---------- + param : float + Scale offset: actual scale = 1.0 + param. + image : np.ndarray, optional + Input volume; defaults to skimage.data.brain(). + output_dtype : np.dtype, optional + Desired dtype; defaults to image.dtype. + + Returns + ------- + np.ndarray + Intensity‐scaled & wrapped image. + """ + if image is None: + image = skimage.data.brain() + if output_dtype is None: + output_dtype = image.dtype + + # 1) apply scale in float + scale = 1.0 + param + img_float = image.astype(np.float64) * scale + + # 2) compute wrap range for the output dtype + if np.issubdtype(output_dtype, np.integer): + info = np.iinfo(output_dtype) + else: + info = np.finfo(output_dtype) + rng = info.max - info.min + 1 + + # 3) wrap (modulo) then shift back into [min, max] + img_wrapped = ((img_float - info.min) % rng) + info.min + + # 4) cast back + return img_wrapped.astype(output_dtype) + + +def generate_sample_data_variation( + n: int, + param_range: Tuple[float, float] = (-0.95, 0.95), + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None +) -> List[np.ndarray]: + """ + Generate `n` deterministic, wrapped‐intensity variations. + + Parameters + ---------- + n : int + Number of variations. + param_range : (float, float) + Range of `param` to sample linearly. + image : np.ndarray, optional + Base volume. + output_dtype : np.dtype, optional + Desired dtype of outputs. + + Returns + ------- + List[np.ndarray] + List of `n` wrapped‐intensity volumes. + """ + if image is None: + image = skimage.data.brain() + params = np.linspace(param_range[0], param_range[1], n) + return [ + sample_data_variation(p, image=image, output_dtype=output_dtype) + for p in params + ] From 81cdef9daa8c45c83d4f9312b2b3ec07f2a4bb92 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:21:09 -0400 Subject: [PATCH 051/157] tests: shadowed old tests for pipelines that needs revise for zarr interface --- tests/test_df.py | 5 +++-- tests/test_lsm.py | 5 +++-- tests/test_wk.py | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/test_df.py b/tests/test_df.py index b0bd033d..7f7db694 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -4,8 +4,9 @@ import glymur import numpy as np +import pytest -from utils.helper import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives from linc_convert.modalities.df import multi_slice @@ -17,7 +18,7 @@ def _write_test_data(directory: str) -> None: data=image, ) - +@pytest.mark.skip(reason="🚧 refactor in progress") def test_df(tmp_path): # _write_test_data(tmp_path) with zipfile.ZipFile("data/df_input.zip", "r") as z: diff --git a/tests/test_lsm.py b/tests/test_lsm.py index 063205cf..68f84331 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm.py @@ -1,9 +1,10 @@ from pathlib import Path import numpy as np +import pytest import tifffile -from utils.helper import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives from linc_convert.modalities.lsm import mosaic @@ -20,7 +21,7 @@ def _write_test_data(directory: str) -> None: folder / f"test_z{z}_y{y}_plane{plane}_c{c}.tiff", image ) - +@pytest.mark.skip(reason="🚧 refactor in progress") def test_lsm(tmp_path): _write_test_data(tmp_path) output_zarr = tmp_path / "output.zarr" diff --git a/tests/test_wk.py b/tests/test_wk.py index 40ae3692..7e1718e0 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -1,9 +1,10 @@ import os import numpy as np +import pytest import wkw import zarr -from utils.helper import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives from linc_convert.modalities.wk import webknossos_annotation @@ -69,7 +70,7 @@ def _write_test_data(directory: str) -> None: ] omz.attrs["multiscales"] = multiscales - +@pytest.mark.skip(reason="🚧 refactor in progress") def test_wk(tmp_path): _write_test_data(tmp_path) From 3d52f2afaf9d10c8413608a19cd6e7afa3b40058 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:21:30 -0400 Subject: [PATCH 052/157] tests: updated oct pipeline unit tests --- tests/data/oct_multi_slice_zarr2.nii.zarr.zip | Bin 0 -> 391296 bytes tests/data/oct_multi_slice_zarr3.nii.zarr.zip | Bin 0 -> 284559 bytes .../data/oct_single_volume_zarr2.nii.zarr.zip | Bin 0 -> 728321 bytes .../data/oct_single_volume_zarr3.nii.zarr.zip | Bin 0 -> 522282 bytes tests/test_oct.py | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 tests/data/oct_multi_slice_zarr2.nii.zarr.zip create mode 100644 tests/data/oct_multi_slice_zarr3.nii.zarr.zip create mode 100644 tests/data/oct_single_volume_zarr2.nii.zarr.zip create mode 100644 tests/data/oct_single_volume_zarr3.nii.zarr.zip diff --git a/tests/data/oct_multi_slice_zarr2.nii.zarr.zip b/tests/data/oct_multi_slice_zarr2.nii.zarr.zip new file mode 100644 index 0000000000000000000000000000000000000000..ee62a1578281ae58c8a6376149c10a4c86b6eeb2 GIT binary patch literal 391296 zcmagF1FUF4vo5%8+qP}nwr$(CZS!m!XWO=I+s2&x{<-%hlbJW2UaLE)ud7$Ss!mp_ zs}!VxK~MnxtDRV{YW=Ut|NR2`H!{#G{Ez(f|3%LD|08GmKghxU>9?~qbFus%305Fmuz@`3K#uvxXH^NHKXhDR=>i1Yz$ zx^~`gS2ed61+TN%){u$);D=%I0j-80P|3v}mj#7ken{kjMec&AO~Pc3{;(dhdh zHz%=bFihE1n?b)U145Knq%5$e8>}aTS?Z;r8Gx%9mY6m(yeE1gEU)K3FipH2h1;xi z)6q3ES-hV6Qf@S~j-a;6x!4(F-OPawuWCei*q|6$bJ$==nW>O@IFp;C&5DoTEmenOT; zu~CWPpb`||zZV1iFLV4`^FIyb-;9y||Kt?^LHuvG_|FFj_m&m^m*l@(3i5yH_`i)> zRr|lU`wx_uc$l^GA4L402mBAz$;r@DH$f3Phyh`A_Y>tXFI0(!$m`NrWGo9g{FIEF zyyR_rvrO{2aog|f=4Z4F*I0n{mPBW5n;%2E$@xLsy`ffQH6|I+hMlc^54hpOmCp7-LVB;k{Z zlauiD7K|!P;1LKkuLPpvIRPuAr~(2BI8B7gYHb9nE-Fpu4^;ujS?!os{Y|B{_G$;z zLQmxD)d>`&08aln!&=M3nU6bH$H{xkpJye|gU=Zx=LPDs_-?M|l$Jzndj< z;t|VTsED6C#f07CRr;4~o^x|gURea@SX#Fh8D%c-f2_EdeB=*IrYiey z_MMXD;z6Et{z|IlNk&~h-kg}@cPHd`ACZg2NS-F@=6W9CcY2UKTj6oGrY4?(OG^3o z<}=<|GRuE`80KmG;>P>v4H1Lq9VJGuK8)RbdK@JWc6}2iR(@gQW8@GhNNqtkK?JTl z4yagd0pDDWiVLFoA^>(1D34Pm7azF^_QC=rweAJ?kVH5i5ZeqES%-FL_+!7*w`Y|c!>$k&OfN}_HEANBxo)6z+R+qKH7*m z-nn}mY5V#x#J_q!w&?6(@{;dyG_Dr204ze`e@Pp&P$fjP8OQ$+R}y;h=?U~N#lilC4Fh`qRI$HQ;O(s=%j8zu2c7lZnE@}LoECs?VJA07(D z@AE#7^(Ud&n71wl;d4+KdlXXXYMpr{AD+bVZZCbH)<#T^A$GCb_3_u1oKVourM_o- z(=5jCyR{lBSul&B+*VWtIny;hh#V;+P6kE>9qG&^UV4*2NWA45J%xmHV^xe_t~#U> zHRS8i2caPEq=|s@@tl{RjvZv*8f9vps;FqQhhZst5*Gj(XyLnf;?UZ*ZD2%b4v4Z%k>~CpzB=#Jmh=IQZL8lZ^Jzn^UM_xI`5`yuM!JSqO?#%zjw z61Tflr;zzvWh4nJ>4+-~@MJHrj2p?Zf?itgmg3usv+}SE6sB%a8L7F?PH;H4u^$U~ z=b4)Vf*X%FlmQZtW^h`7k<#Bmk`KaWe-t6Dq?)385R~wOOft}+QhX#TgGFd!#|2cT zykAGHsL&FAH}HN+_PoU}y)}9}+qvf=rSpD!9A_vW7wnOd!e0^*Trc}DjDj!FM~%rX ze>~%hgJjQ_Ib)vAtdwZ~EBcs{hu_0UQd+wr^pqh}zdxxxKV&DblOhF2dG&2c-m=uk zmj~Z)@0-JvAnO6`#=A5@xkDm$@J*JR4BSv_Mk>iU=m~r0n)&MFoIm&y6huGzffWKe zoG2^eo4KW~G8+>_v1`iOO9>NY=2nr1p@S5bXtQ${BH+6I<=Pp4Bpw{lE#b1T!avAp zSAdBnhYp|es1oISV_H>`I|+EQB}`0u6r@^7hfnP7+Ex&M_NBzu5gA^OIce_jF)EJy zffpd;{l+n{@X9EDKeaK-f3YTKyHTH%eu_kSww^u3o?Y3QWzlFQDT3M1AoQONKenGi z=ovShW=o{jxarU27|gY8v_LdBSyKI^4t~x6t&44V4ZkE~xj}_!tjjc2I?ub$?IrEA z<$8l{l@C8guVXrb4_t(p5Ttd)r=+C?+`$!=$OF6ZmIUyo7$_8O+x0yZ*5|mIX@iE0 zGHfJ5AAavdt z0xA@p^f_eDy%)Bf{j&99W=ns~s=wo&GIr|&5PvVMdA{@{CaTQ^LV6TSG*r)zG+BoF zU(~q36X;Tkg9DG4Fo28$o&f`fzH%KXy9$y_@T-sdIZ66A?N|q5#2C`e3)mpd!6lKZ zX}PJ4Oe*&o;m zdwgRw`Ti*WSRZDhsYeY<(Q8dxy(lgKsfnt|@3X^Vj9h z!9YU+w-LyFNN~jyrMD;YISJzTRty)AmvPz}I*r*< zSl$Ko>?s`guxw;0JVeyrJe%|i360WBu9S3E`fcUgN!rtur^*-ShdO#fx2DQjo?N2qte;m8q!^4pX%@J=W^KFqY2Fy0!|fO~>U(YV(m74?$Ofd#_Si>! z-td=oFJR}L-g1GPO2xr!QgY_{q&1$T&i>Uj6xg!XJJ!S>!Xg=4i;nUjA4-YV8%Eqs@X16(A*@QC@>?eFhq=% zfMCD@6V$@cNH0N-=rjw_wSYPTyQ1P33jl)URYpk|I&d|U+2RX5>&mMy?zP|L-@f^^ zQ>>bB>zc)|K#x)J8lr~TY}xlA?IhIDz(Po=%c7K03(#K>W!`!MQcYVL7Zmp{aOWiw zqtty{wi6?G2YpBmuyBbWAW51Zm9rQoHIzxU{d)rSdeq}UBOClfYjc^`oOeiLvy+KF zpv(~Em%`enCM(1{fCR`3iY>6OX@0=&zQ4(E+61WKq0;%Gh- zfymzPF_;xz5;!>RFwA7wEKxtKm&Fz>CiDg{ecxz2Pl)L@y9)^Y3J!AZy2{j?AI4tM z=&a62R0m@fNi2glB~5)sW;9Y__)Y9~QOZ!?7OGC6iKH~=1c1c_b70E+%QjSKA}1js zP3TPaYeYu9o(0px1KB??H4=S=Wcs=@`1M6Fke46qL`u)%$v`T{G%WQo-r9ARnSB0B z2$B<4&~hj_pylI0qUnABW5fw4-&8O!E2exL@GU*PE_6rL}tL2-HS=d~2n z!tax4V<$cuVajA;aT+d9Rnegr#33Ta~Uy zu(I0b)ve8%UgxxZfx&4SrIG)gE&U{OKPD&D(K>fOCW&T1C|ap?tA4b&&@G{(;R=Tb zca`<<-o-B^aT`xZgP!8yy?edtXgx&iokW!P!3^S_KbVVDx#5?2 zih@)f5{mgJV)q72(mz~g!VH8WswFnzjXwzTDZ44C$ODv~?QJ!la7Wxb_ zro9h*(IGfIIb3uY|~IAek~D_?KIyt6*Y7 zpOa)d=$)L&z)OyndFWKEs&TT;h|!N(r@};REg3{HVY~-;iaLl^YA3*;g`MVYAc1cu zuUwMJ4AGg}E92=lWbsovn6JQ zgb-MvE1;x6KmY4yfSi2JEZ+2k=+!(73>YOR#hQp?%z4$3FrndhM-5#+b#LLCt{!?? zUSHuKhZUh_;l>(b-}yj|s_w=}gawlj7N;uF+G(~m3b+bZjwuOD&0HuM@`mm6{i2It zGiu-Y5F0%z@L-g+E}1ad7xAF8&^yrM_#eA^SE$H8wy8bWuQ=1Gxg!ZaQ3{TF4sebo zp5Tqo$w`3(@{Zl>6-UNL%oomfM?<5|IdcLzKITc6F z`&0UNWHgi8Pt1V~YKKf73~&f5^&?_WD+s~iz}H*CpWjpmV<<;YP8`^$oX9)s*=*zv=iyvoEf@$n=|to)9+kvIf9_8}Nq=cNlC5!NlpcJQOTVCJ zw(~6ozu|m*`VjE>f!}>8Gl0xvVa~~So%Z_)r0;FXiccJ!h+Q1GiC;0_W=^B>CT4qr zjCnl+)*EJTGw`fok+_lH67P)|-r{+(2vOADHuLvv=7Ymr#$1ae#=(h8cCjgdqzshk z$Y2Zf-=+|=N@``^!R0Y?#+as+>IH_hj@}|a$LWh)Dfa@S;jYzfeTlPO`EJ@ao5gW4 zGHskuEH29ozImI{b1*SB9R*o^8rY(m@j3Of{rJ+1^!Zf3LaV9P6*J@i(2$bQn?(_J zzlRgx>cKb)!KJKtAGmpVBObSX%$e#v`Ew@9BZAg!V+C!I*s1*tP>J=g_Inv!+~Jlo z>zVc7;O`WDUGf=f>@t_AgAp@7pc>_3J@`MRG-=k4_Mh=bD}4Lh!vhFh?n24l6={kf z#9K)eEc*Y=au&25=Qy8-XEX(i;-|z6)cnA1ehW9^{>IFa{W9oCTxQ*+@}!|q>T!3@ z^8PZt2j=`M!ldg58$CWRDD#xjj>Bi2n&b=F)(EIs9#c@0^c&cwgCe8wAkGM%CPvIH z^YxiQfO@A~3H>x?k_6k1LVqKqaqrDP$$@1wrimjB_Xp1x?eGi&foT+m94lmq^LC-? zDkCbQR!m?C^*L}>;n!;+A^N?}pd$&}aNuQKCzi9w#C;*wss6m^30&Xd z;1cJ`zDu+Et32NXS1CrI5H@G=az6~7SaTWwYfr)uR*V4aSoA4kipd1lo$#=^HavQ1 zJegSi2wNmsIN|3k)g|V6hdQP^9-)p0G})8+?h%*Lz!Rg-6=H`V80xo>>8v)ZPBWjv zWP*?a(61@i@*S(8MBktAaa#P&-%6oy14Rdh3TfTkXV7O+4I$DWsN)hbQe{B*2HWC| z3OuE^fc=&eGl<^@%KEIEyn##S9gz9CS45nYo?Q0q6vq%JRv^~gU*XSFEp~<)eKI&f zc<312!c&O@*MY{yYH_~|#RrcEba^5+Lee%Cb{e(+gv-e?9AIpG_*6IG@!RKKJOfFE zRBdraibf~mP9hz4=fM4}IFa;w`t~qpT5(0!q$~wyH)tX~%nbOd26;7Z`;r$GZ-3g; zshBX7l^zEO{%c<$Sz8Hu7| z0V|ZGrooVqg|?7%J^?l!Z$(;j&$8X*YtrZ0?Qb5wKfY(`9j%gIb7h>&3Cy~nVB!o( z{TuHl#`G(pcw5#S%`K!HnfSGA-Upe`!l?mP8GvoJu+d0)Vd+K~Jt1Ir;g{s;mHQGd zXzIMcgp7JBQ^k%@+7+cmP~AY4BsDU8gZAI#fhcGRg@DQKeGdv8qnykGtSB{tgW1T- z)ZY+Dr=V#O z?yD12RIDWYhOZ&?frEL3*Yw_Rd8a9RORY1W^+G-Afos&kf5F8oaM$0atAVp4f{*M3 zuhxVFJN-oe#*=sE`K$`(}WSm*Et( zcz|n~Hxtx&V+|L zq06{~=41(2MCCgP_O1;X)xbr*JT-i?IFv0P(|P3x;h90^OA0i{PtRGMsPr@-ZMq>^ zy5@O;xRmE1{kmx}V(Oy_ba9aqj46`HsAa0Z_4jPM36gjL7q`hW{+KkRA{x>3hHu?g z+Sd^=KXzb>Z{!JiV)nn_BcVE6ODgWfVtgPX{DOBK_(8mL2?zLqQkCt+b~n@^IyjAf z?`H%TLVFyk04yNLh)$3P(dgQf*htpep~nubm7%}mM;zh@Tge15f zY$SBj?1qL_vLi=uYZHS3g|khlMHGdHu_xTB#2(pzNtuVdxjLkRWk8+Xa2dSWB{4)b z9a9-`z7sTG8gc;TCw;GQ-<6RR0+rGI`OAZjGtw+X zV8rtxz^xB26)Wa+X@Zij=b6nqQRUE@W|U5Q*RT?PnBxB--!;h{jB?Pla|!LI$F-=k4(b&U;!v@ykE(J-a~h z=7YWSgza=GuVfP6pIy5gweJ*&gJ&~{v%Wjzi&bHCIqWOW@Pvo-7xw$9vjD2%LM`Cl z6$G`pttH^lzF$;|ebzO}KH7}h<~7xHEVohT3zih?V34x^9E26X54Q0OX<^5*Oyu3T zqlwZAe3uz}Ue*mx`>#-dK47CBgmu38NZ(Q^N z>WE5{lt12rUS#ezeqN}^nH2|~E#gGtagQV5rzvxgr2>8P#U$V`Zf*jNC!LT5PqL0c zx5*Elc;+|Ii80fE}Rb>TuYQMe7^RzKTD^0kBDR zB3Csl%BP#?rg(UL)x)MmIk_t(JB(y(wKu+?^`8I=g5=C^-o~1k?xgmq5cWJk1ZUe7 zR#rM^NiY{dJ6EBMMCuasGy#?kK;q*u$JAv0llc4*inqCh+G;qwkh?SikKza)$wMB1 zbbo@CT_Z4JO8EmnT8pRf0(_txJcrl_WB(EKHiCd#$(2|e8+MQU;(|$ttJebax`69R z!tvKBe}qI}%kVK-!SY34$B$vO#)N6Ga+JPml!IBNu5O%(24p9o2r;gHdJ4-X^2MMv zz%NAsrTtLggCj(8!r#yZE-8$X73IKVnoQ^qne%!7P6g$q~+ny@G@Qhf0x7j!0c)}f%EWq)%^`7pLsjCe5V)GwseqU>oM z43#MGUl`}dButRq?1+0I0lhg4C5Kx7dpKdgb^d9mE+aZ0)&*GhZI#@s4Vx}u6#H9} z7a}EaRmV*D&@|$LIY47FrczA+PV@v%GH6_uR6G}dyt(XXz8IE9ps^%`O^q0G!Unx_ z!qdn~Te7zj1kg~QXbK8j`1PFDx2D_zi*8uGOXE(`w=*lQU@4Tj(Y_|qKf-)arJtz; z>8Ac`@P5*Ge>cnF+(chKcg(Bdm~#(0t0MeVm$e($x9}(q6g< z;vEuP-RhWV(E+--_ZvB2(aEXf z;%Ik65$#Q;rPbM77MZq}2(v&r7r!+uaqwfM_Pu6U|G6 z$`R2j?t`AMK`_ew0P7`;gf7UGRQ1cy(&~E~wt~*QlwvG74;iK}#qkI*zjZdZzf1;K zL-86C)l_1i?m5q>e59l!UY@-}3t>?tV$94Anu~Gu$RK;dDo8qRDw8~D;XT1zkCm`^ z5MGl_)#EbhC4|4Sbd+JwKLFU)i7r;-mULRMv>9UHFyoSO*Q9MzLIB3Tq^W+D`bE!eCj2sa-`>DZ}CH&-J{U3-|6-)!;9R1vV} zp!D;c75<&urcPgoe(tEMU!LfBvsqkGT8KvGYH=lU5hEirH9v&Tm;(~BEtZo*Qv?Es zXp!xveRJpI!h=jtCC^|Y7hDIEhHcx<)l;xwUhHTeGEqD0C=^gGPGpPygU*JrF_8wl zHg^Smr`j-Y!Bvb~fH-wB!b5?;G#T7ttm`(b5~Jf%7`FG1PBbh#%W< z(aieXzofG`4l|c#9j7=|Xfs)A60>f>6(osTNfC3pmf$vS%|Q`)t=^E1?Qa=o{_0N1 zEMU3upzXXynq>g&h9?w5o)8#rbdod<%h|t(&;*M(?^#S588tOrVswoV>$pgd&Va65 zsclljn}`>t&A;m^?H7qgkL6NR`Q)V-UhG?aD~VFt9C_^&=qZX)_PWtJ^nG>yFn#E8 zYre#9Ix$bq+NMS!BN66_=ZoXe;^lkX4a-r=?y)qCnByig`Y}5LKtq`mHch=|s+hOs zG@>MGTWt^|{^4P3i(+!vJ~4EV=>I#Z`h)b z9}7rRt+@u=&mk#=sa-HiV_hujv5_bdX25wi!*iaXyH5Y^*3^5#%?c`!VzV!-0Uvsu zMF7a(g{XorPuF0{|G$G;%@8BDXmmmtw9vYjMeQzSp?Q029c_w`oF$ zg#Vs*vUrhZ`GAh+k2_r~X+ibV2uBg4Kin?yMRl(5lrXdvPvhDM!v)5>B@zzi%>XD% zqx@Ly4<>%=bi^dk*#khd%6n?-v<8bO#>O83+#q0drIp4krE3~QyDNdf7cheDykg3s zO{26qn;TdL^L8Vg5JUn%IAPHOLw>>m6hxN)MN(;I$dU+OQ>d>jcq( z3B((>N_J1^4D}emoLx7FI85KH%V_qn6lvT5GUoqMkbkYZvz|yc;smW2`NSs#qv~$cE5tx~nyi`o$;ALAgKYColt`>o9fb?jbBp4F z6AcxgqqRjSQe98f7!*b;2^if#)1PS{z}#RHUIP?Bkw8EitH!M@QEUPdFdzy=SLaZK zrYjSu$e}n1c{;s0GS?C6o_BKTA!tvulpdCF;BwGC6$f)GYRot_n23MvBig=1|cJ{S_K0l#&`(i&PO$gO%)5WnoiWWGjIoFIEp4)3+V@EZoSH zK6!8fY*o0m&lXmLs;K_{O)vQHVLoC67@QhT+oX-=&OvM-E8l|H9oq2JqzMLAz@jtT zITer51NPeg1LevmE;&prDU1|hGu1G5;ZiL)pAA&L$Ve!xQkmUnnXS5fS$!X6@CfX* z8`4{9q-B-lDPh!1ngcLAtu?>{PO2Z~C?@(l_s>Vo!mw^0nUC93Lls;<`NW0S{)F;P zH84S(0KMUr^r;_e!+bVMdTyfJzwp@^r8!sy3i#B3QgjeG0V)X?x)MSay*{X^YYjoX z&9bQj7I=3HmWbJQRX^kL-8H2S7#$d~W!|yQiIFp?74`dDY->bD@*Tk1LmYk=H(tQR9(eP+ zlEn^W>aSC@XVgGv^t;q5n4wZA4*r#b*NMtyqb-4}tp7wQNSh8WK(+h9gOh>b6-yVb z881X#V$itPlisv@oeTxzC7}QvrP$UeVumfKMGslJsKU{B|u>H7Zzps=WymLw(H#UiW%*P-Ta{?YYXZuuw>{>fp0exB~ zeady(qOKPPLDfPl^5jZCt(3V5F%}FHF8YdBy<+N0#}#sBkOWTdnsP>*apky6EF#=G{LlmPg*S=#@b)aZ; zEG6|*g6LIv4+`2g0jF6B?9G0?V3rjr(+bV(=wJBFI1TY-DS9N=p2FjhSGfSZ9kBv? z!)Fv;lkIp&30iu%4#X=7NPYXC>Lc0xHVT4SF)>#C@ks|R6Ve68$!b9HYqf&ZJ*?#(d4uSKQ^x!Y-gh`!PBs1cR<-s61DXS%4 zDOvnq8pL!K;F6ZTM``tg)l`8oqoZPMApBD0SffR}Qt%v^GO^KARr4x~;&Kjl9t@0h z&Lf1gCmR_F$)-TDjz^if9yHMdQi9cDx(k)R*WNNx9Lu%)qkr+6yX)30$=yf0rs(2K zZ_}g(CYdFKdg7j}02iv#iSxJO2DT1ZMT&1IRG*>53YL@jz=|q$gSTw_8?dhf5K9jk z5p(Um4NWm0#z>7=x;s;WQo9U5N|J`S@U2Y>{Y>zLFWBWiXPUhUigCBcE2EEGh#MA6 zRt3^Q;`6rzvu}e4t;`I=0tOC*;`=$)-zws8U-e?}qH0Z*as|{lVV9fiI9xyFOCO#4 zN`$p6ZW^)yl6Q0 zl!TBA`vDOtMHsl1PIIlFto&)>AxdRY@H=!QklAdPZWq-x3sCb*03vnA;}F!&4lI_O zCZQ@~%jL^@)cx5aiTRh{5gEa~HSWCva707f%ndz$s+Bvz2hdnRd1H@k=_1JOH~Yus zT%4%tY8k!v$5uV^C{HB^#v`+d}QgbB4 zz)3>i#Ct4TxQUge`HH}GJ!X~L9||ZwEhJY-=C9A07D)1(&1&SJxtzh8p#m|#t>`}d z2#&RC&Lzmv>jW9-k;eOsg?0kxd;8QMJ%x4887?m!U&Z1E3h=)bFsZM1cX zszcT$MX@kJgo}ljOw8>#Il<5vOpWa$=}9xQrH&8SF-6c$YIlK0C`l~@nR-iE`b!1Z~L1m#XSabKH8Tk7I8~>Kmd88`oay2-oH-mx+sWc^-NVGB+#V&1x;zW@N#Zv>q2h2i zhl#$Cm+W{SY2tkTk>W|o$fIqN4T%>M{qwCX*bygf`?bkFm&@L2kYhMG%mMmYp&Eqn zt~WjyD?S-(IxOfWg*G|+5$WYFS{qQ>&M(Z&nNlT=CU{a(oD}OQhGu|h)B#yG!4|E) z;h>mQp)CcK)uC-;77xjj2a=vgB1CekjBB zU;Tbd`VD_f^W0y9dmJ2|-i>t=#><>Y%Y13_-;af$c4dTP`M~|v{1JX-SnU45ndNf| zG5Kc#-oEsO9}-1&?+?8 z#9HQ^T>+5QE&{m9fu%F5|GbHaxC%&KvEAsjhO?nvI^l=59Ymnd) z%OjUFN#joy0^l_`ixNSlhi_9vpwjOS1nl+1;eUuZ5OveZD;RLV`+FMCqcq_Td$vnH zg9W!UNE|+iw1m?~T-Tea;fZR0Vxdv_#Os}j`13>s{|h{whkaf6(&{)v(S}1tV%GlA zMRz`6E5gVW?splt^`01OBvV^akEMRva=2lj06-!-cW8)cQNuvHcQ30m(#!9c>(}u`4tMK_? zBr}Ni?a8rQB;SxSk@R^v-qG>S`xnS3UaKaUgQB+*{?XNoDB_z*BS=#A^uw9v$K6^& zSpg2Mt^sD+u%lMm9MqOUz}CYH1w&iwwaI|^pb*jzNk=ofLmF#LG~ zFWj&NMV-j08M}*3PEb$D_}+~C2V85q`PoNy9R9!LwRJ2wm7hd^rj;tBSFSC!^tsyu zlAM-^WDA<(v~=}384na*IPPFQDL;VvI<~+E`|Sx@`cDPz3pt_kQxNYr8OJ!&el%I1 zrNB)DEy9iS04{0oW>=JTIPX|IxSB1_grxS+EiU-II<}S95q3u-wrWKfTf#!njiS*) z;)55sIdEIq!p38?dTJ#IM0bQ0_=uC?+!yn;T(tEWsI_`PUW_g=9BK^@Ht3=9If~sq znU}s;neQKWCOaYF!b7;`zkawcN*|%-?Xcd&)(Y=XMNOjZv!}Ro&Gu{J=g#uxu+DeX zC*$6?Wqji__b)|}Hbd4!+_;F`t>W_bf>o&15ROs4mCjjxE1+z; z+rSuDdvb8u63N}8r7epoAO@R8?%xr#Q&~(yoj|7qw)p7++z{PWxx+cSv1TqpqJ}gK zUUUZsKP86G%j)&9lU0TmRExRFOYbC1Gw<+S1u6f*a*=CPC&g! z0=oU3Y8WlxU-AQxQ&Kv9M>8m?9Y6?jy4qk=jhywCbXSe4dpzDs2`PMASl*Bbk&coc zSqr`wai(kAe}*!v)fDibGdNKT?c%l4vJl}PLw2D{pXxzSh)?bv_*GW&Vaq7H4QZpT zx;09^wC&7!T0%?+!hA+JwgP@iR_7Nx%7a=qhuAYLXZ)kq&o+l@SoIC=87*d^oOR5{ zfSj&QkO@#Q_B32FK*`PxTq9)FH5kGSF;8@G9F!*bU!hO3Z1<5$hrwa) zJImzW&ATUo+5&IYlFI{3sv-e?wuZm9Fid#lKiK(S^-ZpC+0B#9pV0FhNH^dY2SwXs z3P2&BEu>4i{ng;<2pLLG22@d5xZDdFh4Ldg+G=hH z2^-3j7cBy}7Lh_nV!aR{Y$5?_h;z2gk-^Mib&O{rdap5Sh{$njjXz$uNUrXgxPf!f zml_1fu+XRxjZBEv9XR<2_EH|CH}vNup$Z4iR!l?Hp!wwpA_o$u143Ol?~0GSB(@Kb4r%1wk{SV^G6 z348pYKUmsvVcGMe#Z&q?{8p7bmQ+Oi+%s;=sLfL&Wgvp(!cYgHr-(9&sHqiQ-5cB+ z$hWHVsS-k0u_!-2XR1i2~_-uR1=j+ac3Td7!p#zUwCA?#~e4IO!-G2c26>(Z9)8s z{8^5(ji!^D@$X=1Vf@i&H>Xe3V`wc&1B$ooyH$gg_0!xhcVlavZX9%M0|d$LCfs5{XX7~W z41z{F5AMEi?H;%0UiN9xB{%REI$nj#Ys~lHw0K^^RLB%eT0uzpkxdCGAE94_FC!)K z=nY?7umpRd-g7I3n%5(>I4;C4(txoxJ=TT67ji@RP3PFWbX;Ismt0qok-fb!3C@~& zFfeS%9I#2Nlg$Iecp1j7;Op*#%BM+|Yw$x3k2%JS>VaBb%$|8VBl65=oN8_(omF~V zsCvvfz&TA*X3&wy$7F` zrFBHQF|`7ap^YDX#_>!4&j4{o`<)gC44{+_y-#o|qJ zA9U+2hV0o2F$rse?PN+#PHM_wq2dpG;g&nWb&Vi#sL4KCGvU#}3zpIEqr;U2B3w|- zsO5;i0LeG^p-s=f1=m8XFK7R%OdIZ*Hpraqxevj!(WSUMt_n9&Dj zrX(D(y}!DQiSM>`nuSKMzBAZ4R%Atw`OQn4fAqgpVN|@t+|y>821DzON%AqGEjhrsiLYv(GVZ%#X$+{4(}zqVFyH2C?Q$%e#3cIT<0gM3u3`h9^rB)0 zWcRsCxFnH`S9REy7*9UqA6EQ>usr3T6dSVXP3!4;XMEAQpH<9?V-;YT1$NcPHl;Q==hX`OP^V9R+wwpQc!C_(a&Ubf z6R}|j3lp2RgC8Q5%Aaed+6Zbm0VW%Uu15@(v7$W08~d`t+8vNekkbU8pZ&Z7+g()s z!Fbi{lUQpGN_03URfWNXcwr5lQ_D?ykr!1lz-F4e&Az1*y@>iG_lh)ZH-tdnjU%bE zAmE~ws5&^(FKZ9(>g~uz3FR>5AP{!DhLjEf)7r$3B7^5} zq}VBT5S?-By~8;>ij&as#@Rq%F0^Er_IfybBZ{`^B&?Fx&$HF%6WXdWg00e^)d42! zhVuFla*ip=F`$wANnFrHO$c_tm-E|#Ola*+P_Q2@l`bxWoeR$K8730wQF)<~eynkad0Kn?3uH+B!*+v7dLix@(&f(=D9Y zfnp14C5a}wY~Qi7n%GJP}Qo3>ZU~c z$kHj?SD?mi7{`+M6$nf=HaIJ_aMeV&8^+w0wZM53I^Xr}re3vsX7>JzuwJ+JK%T*@ z7Qw%l@Pw5UDrC4@^d3R3q?691F98kQ1LlGq#xo(#89n;spNgU zW-R&!LZiz!O{0&$L+$GW!&b(sz~Yf)0-hrNBpaH`yI!~1tC?T&*`5|CV{uv zGqejkB5T`w_Ehe_+woJSwE356lQ1GL{OS_ZEGUXLCw-r1jC>F~^$Qwl3;)#|mSNMa zGcTGga&XNVZ&!+kZ7mAK2rtQ9ImHI%2NWrBU>%dKaxG98JO{oRFryc8-|MhZ_lm`v zoQ;&p&5Ot-RCnvhD7qX4HYMy4<@y9FXB@lCXfPh99(!rl&TQusWq}oG|JI?|&K33* zpoLfUD&|F)m}cf_LDHQ`>L-e!0lur!d`^~Qs!Up0S1#t4muhiX!FxUu+QfbBfSl9Z z@vNL|E$x`ftzZ1I`nTdW#*F#p2w!7RC#LJBPp}&0^qt3M_Cq&-ZL09KNonH^|EJcw zU2Of1u>pM6q+kG^--f=p7}7M$w)O3t2xL|vWTVU_-85)xjJfI!>YK(eoE`A*j=EQIA z*+`LI#DwH1*$+K$9Duj7QPkx)js}``diAPGC-B~(+aprX8Y~1E^0h6o^&O@vM3yBC2zdDzp#MYE1>pI7MDJO=9y;*o{^v0B}Y23A)1d|5w1 zwk_;8Qv&3)?$W2-i`W$)QQA>9IPD@EeNB~1m>PD(-blnYk54Kf%9CszPr7Nd0E;%i zZMMNhm90&rk8e`s*k2gb>zB*}2iy6aeiZNa9ThDuo#(S?P#MUb<{jG|uCcN#dO??O z$+@bjZRXVpw?SIEav4C9F%s^wy-=5!{ zs$F{bwO1JLn(mdho|Y9pO0-H**9%S+f_tSO;gg|-12 z8Wh=+u5$>|g$bbR*z?A=ZQHhI-q^Nn+qP}XLCvoJI;tG$hsS3T_^@RV>A#<*n$5rG%)xHc^^E!aj&a}` zpRA(I>^1Woj2}iHj?;M`jBEFyO0>z1BogeRN!;k+NyuxWNzlI=<9eQUaX$3tN0ac} ztRQ)NQ+E6t!{=8DzwP3~_xQx+o6E~w<@$}StA0AWq}(@5uyPm+bH4<}dGI=Q*C~Ni zjCV6N%h8p>(@Q}kzsgf|2}a=kxe40Z59B$FB^Xl*_Qs#X+2q4&RS%-yTpVtZBQ1o( zYwso%oF&i1mlu|Z0##Nr*BkW)hMA29ta9||FueYO=tn)$*u=bOWQW%b{BXG|EAx27 z5kbA(?2q%}yashV%48TztkXCgr`e69UNioi^X+Eg>NlF*kLlXmUG{B#Ft6ap8uxYR zeK@|zayY(F>R57f>UeY<+iL7}Ai3CnFdpL{LsA|iF1DSr%+;M9wVUnEsT3o%wO1rY z5v3@Vr)WZ1k+M;)zv6r|UGUA*EZ#H6DH3=B6*>^rxFcneE6Z#_<04DGcn!$z(sf?0 zAvl=tQ2gh@tqs?cucW(rm?Xu{kP6&sFkguQSFzFD^kY`=<8ELGf$+JBk}Z}p18XJy z6HmG2p2X?2S?hSzCg*4}WT&=6Ku@`f(5{> z44&p!N0?@gZ^Mt|I^{`jm2SK)8TCA%8!7n0q~i87d>Rce;&)E~MDc=FG4A${{wk#r zP&cD&K06@f=AXyef3N>AnDA|)?%GCS?dpcB@p}8spo00(PJeXHkx})C!=DPAQ6?}J zcsS#8`s$kt+P^K)bKw^=8sVs zIVT#3u+OfK6{4+67)&3PT@c_#%vGOMjPFdc&x za`9t5?i1PEGqgntDGtXcG4Tr2DesqYyL?mMK6v%>iaT%ineCyzSr_ox#`#=w$3#2_ z`D4+frZuVWq&|b4DTu6atdnB^YMSE*nkxXcpxBj>RLV=3Q0CD%Mc+fs-7V%F#*o&4 zs3@$41CPbyucvoLs<#oC)9xMV&GR4czcb=pE18C+&H5bI0I%tZd`FLg!g}O`*CEWA z@JGi}Umm#!@7n{Z*Q`}3AV>C*qzwV{hU@;~ciS(iu;99PmOsdsUi9Jcb<-Ssp>8i= zd~9RU{&mUfzoKo>evyajNEvPpLEaXAF+?D`j9ENlGMC}Wx?~$Ch^(Qr&}?lO>=k;l za){>EZ8U9I3`Kgh2A0_#w`pyS2MKb6R^~i=_vUoA(GXMc^`r{lJpic84#v(_EXy$d?&eGoj+Xko_ z&k4^@Cj2!8ADY^7aCZMhYVSSieI1EM*Hvf`2hY$Ga5a5yalGvmSDw#Q8yfOn+R*vA z*$2CtGjvVNL&8(IYqIx`r5#g5NO=0Ys(_!)gcD>(_%|X|lTj52pnaBNc#%7<{G;&h zBcg-vb2<<1D3gepbHO55Qbc!S;QS~gdmE46?6cpu6*_l0 zG84d$Isd_x=pQd;M}X#c0>Z5FWcAMM>K8;`UrT%jFNR0@)27nttkRzrL zt7cXg4%QXsA1(M-15E@%#1?oWiAZFCCvwUAv7pKffw`9%^xRun8_em!C5FX%SW-FQ zQ?waJwzSG1q%0{FO&pdwf^Ff9v;5gZqa*?=~1N{W(;u&sB!b*RziVqQd)O zF^9lM8_q%EgmLDxz@mFb=K$h1zZPl9k2;*kzMB}|wfjAzStDE}=X-=+GAB`G3nFlD z`g@qD_=$$8ov4C|{1zx2iM1bP6o^FT&i0ehmuVusDksLltS&$%sTaxTAM3$bq#-c( z2?e|sj?$)BY@kNwxbt~Ki}eNPtKwlT%%d2KC2Y6Fl-j{(BBzn}b^6k;odIsv#f(tN z7~o{^maUxIe~9JF1Mk>_I@t2YjF*Qa`}*rqg6WAbYVKU%3kknvxyG??zxvA~Qww1s zyBF|Y%7Ju$3D~37877^cIRxei183}Jcs%rzXM6gWKdy!`Kk9}F(c~Q>7#t>9z1XDMe}W+xd>o8$~^d(oulK9@z#b`fYo zX-<}0J*S|?)WXYR&%6$uPnSjYDOLCBsK6KGd0QawmzR5W6$t@oy7BusB7g&VLl_Lt zt@q3D@IjzRH*e?sB$Rps;D#yxk;(1F^1JzOC`jZ}VQ2`@hYJ9wc*CCcjMqB3`kV*> zWsO*R@jAWr3YxqrDs?AvA~l0Pc}6_xLb-J>3A#lXP-pWsnb`_Zj^0dgN~ zLUE`(LN~2Kk?JEp@Ca2`k3HwF6ygJze(aJ---miF@{&SOov^2g+WACZK%b<_g7(iC zIk!G?{Hh_b_|y8PJom)kI4G1lS}Pxdo)Y(L2aJ;(jRA)_be^Jm^VyQ%aI zuYRc3=MEW61wTAtn*BvoSW^I8W=Qq zyOC*p$F@8ZX=R@Q9!(kK6OygSVy8Rx<7ZDcG}Yo}zBdxi?EXDem>pP?Hi>X5O#e6q z0k+K?ys6)f_1V)`PW_%l_J`^(Wpn*$KRC$geFt6pqDDUZn{ZPd1qv?_h#~G=PFHeF zN=;N*+Nm37H%ACZ`^Jti_g}(BmyFjd)@-J!cwx6Pip?cxNrH2*lAx2#%H2mN2)g5} zyn*Ho@Li$gjMBrWS6q{L($d;8&O&8#a~eI!gS8ne-q>2tUaul86s~ulFYAF*X_Gt& zC~K*QL$sA@c_d;fiyPxc? zU6e7E{7vq_ZSZ@{j69!`Rc($0iA1%P5={wk9`LFVSXZkbA~=*7ePl-RZMupyN^V45 zfnz|uwkXN_UXI;KdVG+jHcVizA4_gWK%;+*{x*w>uLPqXbj%njypX(m=jwN`+2b|Y z&z?4qf)Z>bU%UM@3mCjls?g->s zy(?3=zs5sq1~Bvs4s{;Zd*=2}@n71w2jnv2J-FYb$dXJ_A)eq2-am<3oaErX zxQRhreK>LMzT=GvR}x-xBp)Frbm^)hmR#qX(5h+@`#@G^l6qzzRkyL(YbX+BnA{Ev zxgxfxfnr;O8<8hn&zWzAXrUHaFOCf~IceIBuC)jHvGdtvj{?z;Wwmp9<8j@pafS5G z6aLW7$P0n}0){ef266jdQArl_2hq(DD8OzctjyFG-DK9y%uhv}$E{bmKh^!ZIQo|Z z^$#;#3COs!lU2M05U1ioUXdp21M_tUDpthpJZ=1dg9=n%kt;9W$vs9AMjPhG**BMx zLjJT>8a1(!f0e}XqJyM_fFU(TADA0vziKIoSHa{uPJKIwl@AY4ZQ%NN;spFRdTIUzg!J-z5Ht@KRH=~|F z$`+Q^g9`Mnq%UwxR!v0p3GHI!(XA9D`MXY&0Ph%xfHzFCzwI!9tXn1$SA3h`dZva= zDk1y8RwICxL*8|IxNs_VSwktr$Wlrfol^=7iIgQc$O31^mxL#^oO-n?(9doSsVX4M zNQEzQ&yii*P@hhD7HXK>9G^^STVl%lLxddsy($%lQ|J0pbH#nCupzdnvfEAg`{&U14ePyM*J2R9kN@RRLRHzh_D!A z=IF~qE9wO3p#CP0!WJ0zPA=F-Lxj&=I+%7lI0-WCh{ zc_5%Qp+;W{v?q!s5u!J1$aU*>I%Oc)_N$#zV~R-W2eO-$hah*wt1SO>E!oS9O%kx4 zi4X|!WX&`5ObhI0LiDq2;0!BqtjQSZ8 z!&(y;g0-X-(zFl~Pr zw2^!_(xllMLvMz4IHr-zPit_2i??Pb0nA<^xQ+XBpHAjy@*P|ib0ODETvfLOVx%cC%WAI^!2pRGx~y?>cL)nGD+mBPbdSHd1ykzdvu zO@j5RH|jOP7e7ESjkPfvIt1P5>L$E#3$^6@q?%z0vmTkD3Ms{W$8JP4xygD7^uY-T{R4u*yiop1CQ0;$GP*1Y-G z(!gEFl_s54`c6(mjxXB^w-?ivk)ewn?I7NPQd6zwOG+pP=yEWSvR;V6csN!gPU6?^^TZdMnh9;>=2hT~;k!OTT%YHuh+<$JA z6f43z0{T*n+{PZy^Jkfq=O83Sp!DU)E|7Da88ZIeKRe4~Ph+W?4{Iwo;+_VhRBm%Y zW;*2!%VuBsXp=9=K*FDPJpZN07NLq zC0ceiGdy|bWN_I`VI9AGvUf+f%=%V4+ngmb zBi?QQ@;8i#!qY~S)jeU_jSXvfEzO$?+5AIZ@wBFS0Q!?W^eL`GDPbQ2Bgs8_LxoqU zRpuasD?a0~>Fa}<#gE4yOgYu_n!)?LI1zY@7Hz$9eLb4t#?OKhv?DJZ`lkyJC0S00G zA`3tbS7H*)jC-EV#^Dv0$0b;P83f)#5sTu6z35xbUZt4_PaVDf*Q7RMm}LUh4~%9D ztFv*H5u)_mRSA9uhd}BPu=7KbTof_f{%@2I7Tzheg+`TfS|OP{lF>-zyml~5tB&0X z%Ko}>zK}BmZC6$$@j;p|QnUTHM1Vjnb`qU;@WA)2>IH9MNK_wEo5A>+Vx$`GAaMuU z&*L%VmjYs@lVCS+&g3kn72?axxj6|B9>!o3?4pbis|>#8HP#Z}5A=-gH6w3Xx?y&U zpO`qwQuEMd0E4FKMcCIuGFR&Hm=pC_f^&`0{IP|yf3`E%g-gDoI)O1W)41$t*Tjyb zd3iX(^!bm83yphQD+jw2%g*bIt}S{dLq8uAoukrUHPQo0t&NzP#hK>ltmuwWklV3% zHrOaJ7W;F@8FBHn+Bgyk`b8vJmy}$qh!#ae+Qk|}Os>p3uq!>pj<J@g<4W^w~-)YH=;3pJpTYp_`< zQa|v)_HN#244EIYg=)g4i~Ij@Gq=1l{RJK7$*9F0cZypm*DTp=!_VbBm$9r|}2$(nEc zT5iBGO&6^(Gl^s|7QsoEQlUl!W*;)9HsRP`Pse?&JvftCV1%D6b!9Eto%$pBy}9)$ z_9v#h|EgvzX}E%`SZNUyu66R}ICdFDx3f2fB%8%8T&$*2bK2$2V(WY0b zZImb3mDfX9uyCyX17S0iMM%nyc(m5;vrVgqOlvIPE_cROv)2~dliw|EtP&(^DNGoN z-95$Vj!+$FwUBdUbgvMxb>N!o9Kbza zanO2a{w6(hsdr5NU+Pqh;o**dWQ55eVnrOhK3K+IH2cYxd&pWTOsaFYrJp#nRW$SJ zBd)hgP9PzeV~yX;h1&wYzQ7S^oF$i>9kM2j%hhQP#6vdg1(HWFG7p1QEK=Z z1J6kk(TJu~dEACX%^#IPb9tNVv&{iyky#|utKuM%CD=d*?Q+D!L&>^r6YnT`3d8)5 zI*nEBmoS6>I5K8JaA`&T-&lz?^F!NwX|Oqn;&CCnbz}x7H#bJ ze3HoZx)-P$pAPqorZ<~kl^6yZU!WfhHfN2VB>PfziytdRZ-S4Adw&+-qFac&As*o~ zZhaK~qG-Awm@Uy*hiZtO1UF~?=rj>P7{2I7rJpzTc`SYtgn6t%mb|Xn1GxXWGk0oqp>7RXt$xzOAJyOjo;Z#%)HNjd|y@Il2%$x-O72-6( zUR;!r$!>C`H3Lh+C83(|ZuLmu%K|Y-Xsa1#=kec33+GwON75eU&Pj{~y>6TMLk2p6 zo4YMYIXJ8KSmJ#h+eg@~hdoM3#8Yin`SM_*u>Gpso$vui6IDv&f1^Ih`2MF)?@gX= zDQ~Pc=PopPSDL*wYCCgP$M2)cghFi%vkE|AJMxEC#5Dvr=LM~TU{nj|oV{(@F> zuX8Kv@9+8cw5*I>ZBG2L>-X9J;~sQEx9O$#XahVnQg6dVIJbo6j(Y4FL|oIZ+%BI- zdN&fp?;X%!)=@q<{GHB*yFdYvu$=iu8;BeswK-r@&Q$HbJQ{{`;X!A~DJgxaoz-8W z!0OU+h61n2$?et6zo1CxI=pXYhhk&DXlTjQvOi!YQ_X*7z~do>Oqs80l`fn0=Z75U zX43RK(z#llyVwM;lv0bO{l10q$epp>$~3(=@uSxA)^W^0>cecJB%kY30eqfla~o~Npj&f1H*w_qLyO3bpOy8GOefyxGss{YyMZiZ zN#oz{DHoimur}%15009asJ|5|wGA6-7z@Fj$O0TARZ~FTtfo@iHqkD>nbXah3o_@h zvOlGJHdJV@QqTV_QJv|`$L7m#EV0~Mw_3}qATKK#DXCu+2?k*KD<4L}ZM#jn>G(Q` zP-EvR_uH=MEM1ZiMY2nm*pP(gV{#-{6cD=)K3hDusyo6@{6h_>OjTtt)xIdPHL+F< z=)k@lPGfE;+JBOf!Y*7go%B*)KG*Yk$`g~vUXWu+ww&fhAsT-U4z9e_*1hcwTfXdRbM!!CrEV&Vv zvF5g=v&)b!w^3I)g}73%I7>h-qi>0x?Lg&T&WZPfpV@gGxg%@4)ahy_5M~z2F+EaH zzuf}XEirzd;)eHjzZgsT@JhP2EKPTQ;$X0skd6tRDK=NN+S(a%s-)E>9CoR4M9y&A z6-H5czxH~Y^{-|T^7K8*0?htSHF@ncd&7#nH@H*@+<%*+9rF-DoU2pS&M=J_CoQCH zR*kr5HwFp5Q2?A%H*Z-kK0FQedl1>X6pr5>QD&{zbBX4MKo) zv*zG;t{`U@`_Q!qoMdxztS>9=*V)t}(5lg0!^rDkG#ao{!Z*W`YtrHK;NO_#{Y%7b zD0nkEY=b+m7c?32F>uHQ7x5kIWzKpLtF*DrA}yDi7M>z*DCo<(RLZ{RsMURnBFP$! zXh~2hT7$J6AU~HJX+qziYJFdccIzX_bt1jtVXqLdC_W*R;rg@o4L$#m$Bb#&L~qm4 zfvqc_#VexZCjS?=CfJ&MHggk+c_JMn6F1X}v!ja5Eu&xPDO{nbM0~RZCIp4adHz(W zbaNMG;6oMHG&I)})AZ`aW3-tWBUUapg{?umW8TJ*=C?lRo(Gl_t(B+fjR$D*4N52- zI`;vCZl-Kc@kefSZB--HsqY9CFx5Los-uZ=n=GI!OQIQqDcp=6g_|Zl#B3IZ#*5Rn zOa`ss+w4CIVR2OX3fEFL%zSXXaiA?S=UZtzC8NKrho#cxXd68m@sPX5>gj;Ju|+#F zr_;85i+0vtFl!a6=km4?Ix`|WXU9BAtoIfmgPicxw02}Iyw}y5jw@uY&6$!UZFbFw z^LqlB28Ij~2ZG^ZM#v0>obZB^e*BHB?0_zMnR^c6wt$t-D;8dam{H8p(vFc9gD+ev zdeSU{UC|+nCnI+Q?sS(Mi0iJwJ`5v17fQ&_FE>I`%qErAfpC@Hq*q)XEicTNq_(}4CW=eRXO$E>`H-YhvAGxCJX7SnzqyuoFNtK2Vt!@1dN zyM=pOQF$BVP#61kP5x|h83wJ!bD{2%M00)~eOPf34X+$o1p2aQiJzcrZxW+*f($Vy z{#*rZ-3(ivtxi{|RxxNe%Yr6!BgUU(E}{L_)RqsrJG^vcY%+X01xj00cD8t7xr@yy z*%rEn-Qrc3u{J~8z7+hj(+1Dc7#*ouNhjj2mncnz2GU-6i1v7kTL}Hyl-XWwXxbV_ zZG$*35uzbj+!!LBg?=>PAVpT%LQH21^w=1Lv5uxUD~MjmRzd;&b3nLt@TQ}*23PwS z)Dds>?5Ol!JAz~G=t&vg_j+UMP+WfKAlU9`sVma%BnC3G1K-sV2IY9vkA~N{m|YeLX~AQdbZ3&gn|s1CpY9~ z#*FnoFnp@|hsklCDG+Zg75iPm1C>j+65$(jn7ZaoSI)GoQdA$Gxu12JYI;&k+PYy~ zd+y>@DISqj7qUiNuAjG5zGCI(>Go7XFO&z$4cmxkZgrv-F`z7I4X;t?-`dpW(!@g& zT2X~>`U&eQeS&MEoWH_n3?yMYE4qR63K?Om?!o}v8C({ibn1hd?P-4|H?lb%E4Q8U z=8AuwF~@R)_!qI1T0#a(4MbVPTe(x|BJLQ}gyf^r>c%fteRjm$P@bAp=48o2jllLNiNaPZ z_bc1*68m8hH#@G=6y$9pq*&5xwcKWwz&aIzGOi@9s%DgDJo+%JN$!}ZwLdF8$$rn>reVt?v zQbC8~fzbreEr#0`UiFHuo`4thC=G!cR#ZUT(AEl>I;Q zKa|_|s@`^s<&b$!NI*=9P>W9z6t*HiD7DgO?B@%GtI)NRqO+0B>t)X&=+5?Ax@l86 z2#ZP9-uH90#J|6{zw7JpcbQ|F?xiP4tSSlphEP z%j$o_cZ~njLXz9->7zFCF2MgvP83K>L3)Kq{)&t~lLMDciD)2*s@S#{1^Y=YrHMvF z7%t`*N@&%(5+q%tE?6tWW;eDyTTZ=FT4%d#q+PwIY)$4Da{K6a(rNJdd3$;}BFFri z!^JYoJN3C9Hz7)0shX!ut?k+;Stt4FzI;t;yT%p(IoL*R^L0qZ4-E~q$ zC`D4~gjLDRtgJ;wvNAb-x6i!L+a1$lO+m80?nmlyF|P27W7O?pM>$N^wS|_cy4u9_ z(37&Y&O+ym=ifsx&rZ!=*%y2?Xb5^V*hg|S=twa&&XsIxGH-)bnMX*1#`i5*u<_%< z73^Bh$=D@RV@dT<3Zmy!GAKxP;nLo*wkD4zg3`2=GS4oL$ww=V%_l!!BrZQ8clTtj zPma*@Eaka3WIr)p^k{lCnAntmcu?{_>zac)Y*-juw`EEDJHEGEMc6k|$z%G|a@z-1S!+5N~2)n;RpWK~FN}M?|9kEh4_6 zOH8sjo0?d~FFe@swl=9z7W9(6dG{(Lv92#zGEdgxq>D?FES=gnjB>`WBw*~FcgB$n z6aMD;tSMoF?+^s1@shAF6er2I3O)*`_uTU5uqg0ZRUnJe?GU%)GERf@uab_@^$jCf zX;xh*i9?0i)N$^;qJRov@o$QiuqZ`|p`*gu2(zb)+Q?9~Ox*I)X|$oeo|HrERLsY~ z$XY6W{O-G|d1ihdlnGVUwo6OAb{`+NeVrV?$)6hUejOi=N0=H9(D9Vla1E1^>sS-e zvyYX)_I}}Ax49p4dM>nQ#@!~8ZM|f$)@@W0FE;MRDS>q){!*&y!sY|!{S}t==IvP^ z$djLst9ciad{x?-EqVEoLU&M6HF+wnnqCX5{+2rPK66p2-=RmiPD!a1%{Fyh{g!WI zM#a6`9AREG;h0=g8JkjvP@h~T8JqZa&1N3<6c_hfCp7OSNtxy1SLc1O7EiEvv~ z*D5w2c_x3pzs%Nt#3L~>eiAK@#p{#CJbMnAc1vCmuP38lm`Y)B`;RpL0>{Xs#+Z&% z9@TS5n=|&}9XeZ%%5yeeS}Do%l$7_|6J0+cmFRi-u@;V}p-*3)%^~{a>TTEIWXv;u zQqAH`{nbv~hy6RXoX(I^-LCik%QcLmT>5VO;9-d|0xm94aPeO)i;^pDs%T2~;y^oe z()@t7T@Ho%)-r`IR;6$rHUj!;h60-JC68WVi%(Y#@1p=ZY`ZJy4mu94xlzNVR;n&ZP9$Hrq}fK(35wau0IWY$17R(ci@mY>9LQt6XX7%>p&rHqiIjO^XX9I zc;Qw|Rr!}Tq196P&5QNPJKx&W_BN?XijJR<=QbS0KZiAfZ%u~2gTIQ&%O{1gQjO*K zEblW@R_CEkRtG!R)Mm<}@H^Vp^vzVl#N!s%u)Mu!M|>CeIDt4m6i&Y~j@-d_{H`Pf z71VYSP2lK(_0Yf6?YPR=f4 zzWX1X`+i=gUE{o(W97VQRc+&CyTDDnhJ=d`4PIu6r(M}RMHNfz4H62Ci?cb_HjAE- zvfZ4_&R4A#HNyK#bxbc^vg7U^Xd6TTQJV%%?e zucdYH?zd_D1bF%IVGN#c8=|8Q?{EqJ79omz{9~*i9skT3>vTJbNW%lY;gWtwBbG>O9L5YcYZ0iDJt?G+&NS_?teVIsrNW1WW;}JYgFw zE>>`B2(<6jM6f4R8~0p|DkyRuURVEWkPw0-Jdk}ejAX^QH8yZ8$O9O(B4)Fk-Hu{gG99PF@S9%BalXQ&5JX*WykojX2IGx zz%Z%yoUb_|NT%ZYQLW+xvm6890f|54pM{&lqKFvo?3Fmb7pJRX>bCvfS{{Zjq8q=` ziZ#sSVcW1Iuf-&6>r8d*AF9NGKlu>=8z{#PznHtQA6MD_YZuWeAF&dzr9?(~Pe*5T zhJU_ohF6OCVaA`{Dh zP9&ayD=IoKgp2c)hQFpJ;5Kse5v1VOe^>ntuXioJ^c2^RC|?oEpI$rOw1fq-SUl#4Ph3?#kAN$tj<`}a?9 zdIPV5{}6679JiRuJAN9! zUE4IQxnIZ^LrQ3o`?Cst?j}gp6Pbd(QVv;s5Gaj{eT<&SNFoZVYmV6-wrdTZZ zF_6yS{iDmb`&h4sNyqx}AB+8sCi$T&npN(;#4-e?f2l$^rXX%Ax?w0Bo8-|mPoqOo zoFD#Y>pCJ=2KaWR;&1UUOsjue*Y?`yD*QfOnf?w{xUZOKm2pXy6ycGE)7ngjk5tYe z*Z1hzYq5QR;|G?n+7m=><%Z!x+t3tr-#15G%?_(YL?syG^+si$^`f>P!y^GgxC7m| zgY;8E<89hF_<8>n_-lu)c=-IQxJF0nsNQ>o&fFc3yuyS9pEjn67jUS}ob4gm|V4ROTz&O#=~vRV&ewvgHC! zU&^=6-bZqlQwjYKH1+PD71UBa8oqAnINVJ%KI?gbR7VXNHatU|hvTqVQ^#Qu75TPn zChbi_*ZkQjDwhK6ZUQWSBt3)<=W@w!--d!QLzl>(-&Io7zz>m%bdlkvK<=Grh^(jn zTbxUbH?GlqcUUPG`s8=32)PAA0na^vj zFfFfl=-p!Uy(d=G(;^LU^v^XEN9^wmqC)noMfUk@7ZjKKkP86>m<3qFT6pdi#jV0D zNfKBc<lBNUIJAHSM8a%1FJyuYI6Ba~(8(^&sQbQ_tB z=_1ccge$IhG2@yol3^YLqytOMo^ zQ=DWwJ7mAgz+=0B{$l})_rQfhepIB;EWFB4bj(X}WJIGFR?K3=5}Mc5q^ioW_i-Gx6sEs_GKn_F zqDH?-uG4%ng%X}|$5Hq^g0kRK#V8)B-DVA|LoZIn`)>g3Mjv!8Of7%(2<%&WQXa3(V3U0tXbNgnv|gW9;! zK)i~$C(iIVk8g$UGV9RhNyxQ4(_$L?urnM}iy7QH7YTJs=PZI_={}CFW)po?|M2bH z_99%fC~jASC=(B#b~?D8p-M+UxIj1Z`ztWd3CdGB@+g@SGz(&u;bf0`sV)HRTb6Cl zcP7UH5p&Cy<8dA&cRN%(X7Dp2iM?H`#Iy$RKpd7pjM)xkKyjTA>Imrr)Jr-}1hEhT z^EQ!mg#sq)UZ$Pct}YSgxPPm6SiD4iqNQ$ciKm^+bcCvEbr2QC!dccFTO`M>3&sfc z(+SAw$4x~e$S<4=M#BMh{)U&t732mcsauUWEer2sj#>>|1J(BQ+sV2F5A z-$C&8WZn@mA@DKZM0%b*MK6(&e>bPsPrq<;^GC*XUuo3?3F3)klk<5sj{p90ACwpF z8?U+!^HZhJ0>S6Ec5t(gXebdb!O2-^k>YK z%EPn(M~EZf93PaejvS}Z_KCM=&5!(h_>{rh<5m8N{2r$RfAg0)0%ma9)5y8y_NIl2 zdzRcO7&JY=wV;-p`;(j!A{Fi#l?}^qG|@E>_Kd!Q*P`CDnXVP-r<&hZ(1Tbm=*&#Ol}*_BF61PK(~9|^VR7a4v_W}T1k zb)Z0c)HiU90*QcNyV$n8Gj_gsbW9r&9jP;yn0yw6dfk8=LY{|wp_VWnk%qjBaX}LS#2qH_NHsnG*TY)dpo3;Swt>R8u?s$VFX6BK0<0cd zz})ULQyY1)GCn5{LvV?7Oz$_g!1TvcA7LLoX_NYVGJ{E5;WI|yHClE&VO60&{1d!V zDHeJeG-7anVIp}KI)0*@Z%DbH(=l)Ds^K<`f(=qMC9Dxct`J@oH{p2_}C!MW1JNVJHhciP%nxIg|a{`B2oqi6IFunNO)pVMHyj` zD6t3@I36p#m3chVFt#}Zix?tgL$AL5ZKn4M(y1;UR0QzCfW-wUYHh}J!}aW{S< z7C`m)C2ADn{+&pB3mNLu{D=thhCKpYC;_SpiMJnBF+|m3X%|IMYxYX6iUt8WY9jpP zTww|GpBHz88)80CHQGNkGt)(oP=2Io^!i|Ek|tTw2r*)`i}e}mocah^J@O4=1G-f8bVF$5`GLs)0)KqjGR)ui?ogJrv~)Qb_6 zFjI>&NX89*mq|IL14QlO`Noe)s$}FCOM_>dvx(YyMlck$C#MVKcOgg_Q)1cLC4$5Q zTVjtGv&*%Ce-x3(uw61L)g{-H0Z(Nm+3w|w(o;{e$ah_qr;ntwAN_|hqw$*+$$08r_|6q zwI@f*3P2=Z4m1!=+s`!mc#SE-N)~6g2rB=z&Lr_P`rzNKC!7=*aIP@AO4e{p0Ak2% zqlj=$u>U;=Lx7B;fO17YFj&{Z`Kz(9gpEQta#!jQ4gx8(cmytEzR0rfsCH*}z}Fkk&HtgvYbjEJM+t zhf&Vop374$N`}HCef5vTwmc3=yh&L5FY^4zh?s|6id;0&xViT6Xv;uN1zsbaC7oK3 zF2(s!{XVcV9HW2j#3JNF;7fDv24A*HWj8WZgKoDlk?RmSk4RhbprX6m$WM zwe<$kRS2lq^@Q{vb|HOma>gJG4Nab{nxz6O;Sv?afpgN(DVOmbmoGBEx!lNU&f`6o zJ9>mCl3%WVv@cx&-bSahP`4!uqt8p|TaE`k|2C)3OZ})hLG-Mu0{?2#94yp#j5g7x z2xNMEa)fy(X8$k zn;wvS4gFBA72^*X`VsClLQv&+&L!d+=O5eyJzpe60CAJYOHn41yb1SBt|RbGF6hWK zMGKHD_*m-o1npY#I%6u!J(B?Oj#d+)wEBV>)UtjTh(b4B0dpkVJ?% zxa*$xVG+?9+#KAQ?iZu!Za=)VTka4qPVJ%jLV(7%9S7d zYRPAt{++tlY6gqW6xJMx%M4h~b%2406KSjC#W%F^L<8ukg{!9r=WU}giKxbUO1VJJ z-6ltFRs*|VV*Ms47Ff>Y%2NlwoSdkFN4919(h=#E1!q7cxM5q;@jUb- zw#cz$i8&+kPf=$kE=z_rLgg8Jm++&EYEu~`h^8)S;@wHA`yy4SOf;C_=!)r-C^)Zu zU=h{k<*^cE81f(dJSLb_2a|NVg<7dqa)^~L)PMoQA7GarO+w5&5z8{gD39N0Zn5)P z(I6r6;gxW%A7gnRyqQnPmqFiN(%(zX-EH3~30gyI!Zy{X|FPB566LPLV2#J$C&wvp z=*66F1_CVVWW}s_gz4XV9eI)n0`~3rZCg<+%Y+x22DDltxL=@Q50+2Pq96z}G?)xP z>B_P%K;%Xa=JSEEyd}VmMglz{k*CL0Br11EtDx9*QH`ZoFU7_Umx#l69U@7*J!jZB z6QEVrh;t=>RDD=#?{5+;okMUFd0%OYwL7g%==A3w!{;A2LzG)q<3oaM)KKT<6I_92 z521i-)Tmp=LW^N6ewu~S|GFnhR76ed@KUs-(~|g>*GFOyYH?(k<%%Wi*sgg;(kTd< zWDL^0#`ovri@MbFJAokvYxdkCiA$*A$C%-Xk-FrurrExk>-1<}zL6V!DdE6SM-m?! z9a=#F#)65)Rbu;ai9(%`Hl;cbp+md=2LM?>roWLi%boD03{hc<(YdJXii>3_O9Dmc zOch`y31E~1K@9Up{K`C=^s$Yo`>}&z!es5`h>uzl>VEM#(3Z>}eQD~Ap`MPgdR@HG z*e#98qDpc)>A~f00d1t5B%ChIR`1ZIFL2<1w3Do+ZxH3t#GN5HSWy8{0>3yIYF9+~ z2>>fQ6u3uMwDR~+WfPr>YdzzTLmjGd$On=ej$qpij?CT=lH$I~*c)%alFo?`7`~J) zA6dsPLM!+guH4fkkEYJU)WV<&jFD4INY_7?BM>CppiNA0Q>6iv>Ip8;)Rv=P7+v^Y;U^0A3>;Z{XZ9r%aHz2@9+gE`{ zCkPHOYb17yTG_*qg@G{+;7;-$BL|r+M}lCAv70y3mhE+0@$5nIT}F3|J}^2bhBHVH zjT|112fH@(puCJ!99haplCYR(Ovp5CTIG6W!%7ZrJ%jfHK}3$zP!BWUWkLQ?+k7(4UKD5$in8PMFg9ortQzB9Icd#HZpXx&TjTtfG> zhG>KLaI829#O47J9TBT2$qzZ`1s)o{M1(WpEn$@LJ3to}$Rky{?AiQEhM@!|tQ{CL z-k3?SWCn;ZE!x2OHM{LPd~-2^{^ik&#^$$Sv$&1P6GSsOT0}m5D68{9M#iP=jd&q| zIzwb7aM?ul0>fUCIJI&Kc~0#iQhSM=YWWBm?z|P+Q^r3_s$^lblt^|y7RTAGjp{eZ zuz*Z$5oD!rb8{K}lk1%ot!G!7bqD~?@!my!u#Zyf=50G#n^q%rfT;$l%Cikpoy*Cz zRAY_Qnlv?NrD&yMpRB7{N*hxZbEJ%gLr91m*$SzrWY9}Pw75wXQdzZCO0V@H zay{B^k@BHCfhQ5Qwp%70y*FV}pAM1z?tMWXcj4EvfXh0`$Qi9=#$X{BVJcT$(AbeEoA7x$`v{$0Hs&UI>5XvD$Xyq) zE(~pRlaRF$F|xzV?Fkey6nh>Z9Y$Y4I!nXU{&{{LlA2IANARJ+f~8fQDca|9BzFb{ ziqLio=aOAEzC&yZ%(egFpmT^Pq_SoL0!awcMI{OadL1wJaU zk0YfaMzRsq)kqn1m5gJfEAtWcZ2*V8=MT-{wavpG=b=cxx-_F%P>e-f%K`R%_ya-o z#u%~aQnoate6o>yC^5Lk78QA_aTswGg3ZVc_kfSN1qrMcwiop19t0#(uifd--41>% zQ{YTGYYSHz&;tjfwtCfSuJG#(gl8w+)}VUNhVp#(`PNusg@9h!8%McghL@1$@?nJdzYmQBlPSu0~P-0jJH961HWY zF7|uJM7qLj?;PlxB9pFY8Qa>Y2ys#sG%d%a=fE26V!%q&TMhYN6^jn)r5v2RBx16} zXK#!c;!{*lY1wVjG}(W0lw@*xxK74yzg`kNEv;nue`(i&stoPLZ~1tB`l`+HRXlglzONaa=-|Q> zg>Mlhg=iV)7HTNx$CW%TVmrxe|pwgwx|}8mXc5?!HnJ@+`E)&WmLCZ9WmA>?U@% zbIy_B<02Wph3u_8H_s-9kp&@o>6o1nLvody2;sy}#YZmzJ=6aYDmcPt9s>0&&wNQ4*aMdM$g% zgM(sJH1+aLE=}0>{vN*2NLN5Da@_xrLjHh2&sM0Ji4Y9r=gI!0IY{9R*PY;HzNv+u zPrmV=aii-R+WY$q;bM$*<8#86OF9T!ej;UYHvWr@d~|N6ilMEHTyutuJfD=KB2U+( zpZT50__F#TN7Is3qyqcUQ$w%%xDV?rn%`B2@$g4c4G<+1wCGil6`_cXk(9 zZ99L8ub$*IRZTP*1u`UgPb)gn(h{k^cnhVJrNBC$fvDARu}E>!q`l}b&h`aJw;*)e zli-;u^djvM^F$=Om9LVS!$lUw(2jYM>FI{7Q!z^Kxg3M|s^^g*UMkLs+MD!U4+>ws z=cdt22$VfFQ)D;#hmfrLWg+5s|Cg7^+?C=02OtJa?(kACF5%7sUsijD8Vmx;BqU3a?{l zxnO^Jx-FmCD7wEuL4b@Q^l z51i*}h|i!8Rw)?xlS0%X0W;0?*#(>{;s&dbx>-T z@7-3TZ-|B)`}-zI12>U1NZ)h0(8b05jJ<28=tHDm(_j5lzB`XBoE~0c|g?i(f4~nPHK*d#(~BAi)VdM&kOm!>%_Wb!0BzLO3XfnBL^Z z;LrZ}7Up;W-8Y)Hek#oYGTu%ehtuj& zx$%q-6Sy5Z9GWxs+5PmY-{<9fRdum&&!o7@q`O=t8Z7>!41b2mGMQ%VTFf#>l|xum7^~3 zA$J-dH!b(_4(J!}4AY+-ewj;b>;@@1)rSFJIN45wkC{zJ!p5BCW9m^8{mTL6QOp9< z3_7xlyqCV&La-3fl)+2N3xeC~!RH)AbvUkaGU^jjTtG@+SD5sizxt|hd*3A@t@&w@ z)*nX7!ajg&GzA6uLG%D}`ZI`l8-*;bPLZqfaE7-;olW|=honN`jd-B3x7{lI`6vR> zAYL?;3!u`CO;`F-AP^9tsF?5`nL&m%hzCMtH z<9cZyjl#Jwjwei{=f>nWZF!}I%Y4$i@`PyD{!7SFNqm<6@jl_fH*S#O6>-X>pL}12 zSH34izhJ1`pWjVJe(?(#IrP2U+KmJ=y=lo<5#+vm0@r|ojdEWjQA_$E#s%nnFb){Pe5Jfwq zm=1gfyuLH!Dok#=9_+TzFAuq(DQxXvP_2%JD4@Xg0RE z1;SPV?K&~O4yE#~8JQC60`UBW7IJ&&%`$g}A4Zr%$FHG5WvfZe+OgU9x-UgW^)fV= zOo~57#rvg%Mj$QUA-TQm8==VOXkoY(9n$~!SYl3Z{vp#XEX~z~qsk?WiahvW`qvGj zhxTpM6#+|=x+92-*k(WP%r_!a3Lf+MWt4fMw3n;4KZC_+AY1C?w-3?}@lvlERSqyV zYOpHkWERuE=jn_4X#Z&3h1r7n81l0XJPI-AN zdLPhCV7yoP0C;seL^Rr+|i~@iJnXEvWV? z19O&oH=%{IAOJ_O;>a3L^AU<+T)^xrsUKs%0d|R|0F-_XTwg8q)hM*XV-A7m2q+R4 z7Nh7k4JWS<#oEuJRiqppGzW}5z10u-yvKK55;8uDsW!$>8nPrr=aIh^GJX|*ZBl(# z3aKuLe`)OX9VI|^g}T?IHrL5_&2**y7=gQ2(Wv?^bkmDy3uf{y!ln_=8y^zn#eN&A z*nqB42Bx45e6M_8JMb1d^M&O$VSIVih-=XG4U`kdyQ9%T;AOp1&Jlx@(@J3hq<6FhZBt~HzaZa3Kce0-sj?Tw_#HO5rN-WOp^*1UZdMo>rq(PJy*CNDrtQem zqAMjvjP%X-eS|-CQs#{#JyknT!VRt(1(`6Ukukp9A8`bvlsWfT3quot%M!j~zXo-m zhv7aofM&yRaz6q99!B&S%~W~~z#H6zCbH$yc>^!xP5K9S7p`CdS6FwUW>o$&3_5d^1n_ zVq;S&(GAsz8E^=Y`|CLTM>q~8_TbCk(XK88_{oP%LcVigJm|N3QNmsVsP;6M#_jMn zM4ik9hQxU&A(==6+o4jcIDyYJ8OeE;Al}M1(CRUGF)L%uIhi7I<-BU19HuIY$F%n8 z8|7gaS$(}4e#77x(X99B#*Lxgh92lYz#uJfhIHdQkNaf8)2NocUOi({2fq|{YZvV^ zIxng;_SV0N$^I_>(xisUI}+?Siv`U*@`N17HhG;)ur4xI{e$LA{p=coFw=Cpv zldo|&ArtgQK=E5b){7;%O7iHQ0-o;9z&dbuK#T=H02;&`(eUN!?i-X7XCtCg45sX0 zZ2$AUJs}i)x=DR>oAA@!agDL(UMak`5$TFAN6B|n9f8OJF$+*XRIc?!Bl=fHKY&{H z4be%!)nw2Qyg$?*$H(i7P3q5ombQCNT^|P^f%s4hEs@k9yISvtc7M?i36FtLhO#$I zH8*XRJnL0rBe{I~PE_8)F!g|>Bi>JVMJ?e`*y$jGKeHTV*xs?Dv(o#}2;PENeGr{y z7_`SDd_)LZwgUalhq$aF7eSj&QjlGaJcVrPa z@kZZ_cY8dASAC!eGWAq<|B?!O&mxiV5rDKOMudFMb+b(BtYz}nkezqP1uKy+{^I|H zHNW~qhVMYf)D8}4cK4AM1%LNA`Z?I!)p(Hr9_Ym`^!HH7QlTQ1%h;X{QE$#(3V}D4 z;JBYpiIBqbu|lY@AS&@j0Ub!3->hJ*mjhHRk;I9JI1Y9k15EkWmm-Byv)qtOWr2jL zxl;sXbR1oyYqm0A98IVjWoN&OW|-7p>b*N+SFe=4zUA&mFFawdf#eVBpQ}F`Ju`A9 z_27N-&X4^l%RIeYbl&D$MQqot%e;u@ebIu&F`1&8(}kILAy^l!Vlt3~4K_Y3QzW>r ziTx;W4U}JJA3Hw8A?3E{p6qh0BrDp8cA1epK=!*g!dYX%11A~IOhw1j3@^~nPr>b3 zV6HNs%M3VXTjpyv5H#evmJ&iUF4y=Liyg>-Bz;8-%Bq@R>iP1%AUqb?Crq_G`BFab zaV8Ai~?NP?P-srtR1%HK%^nqE6hDrSsw)JP>EQs_zDHR?8WbI3>icn9*SUArM zR&O+ia9>|q>e0AJ?>UyH(_g%~Y3x$rk8-~r?> zt41l1A+p_xu<698zwhLUXnmwR=pZ_ITTfo3z3Yr0vUzvA<3AeR*L5_h-|rMX{{pHx z$Eo#rnFp7Oy+$zQpcEo(1_xS!>i{u6ai^Koo6pNzY{r}=)EliT=&4Pd z@nGB^{W|2PT|QSX_0GikVJ->~27uPCV>u4oYBn3h_oVzC!lMyx-vIYuJ-RwjaJ7Q{ z8c(5#A^XAmxTp(0&i$be-^XwP>);dHqag%qIO9eRTq47xeM6s-pTmC203WsvR8KnV zO-8>NUyIDiR+HM_#lJVt9{f;5ul^wsy?SJE|Au)_p?%r`rw9Pa1#0|LdW&8l z;%p{$XrF#TMEcD)WR|f&H=q17!lK; z?F(3qf=hLykB6~%gU)z)LC7rVo1yyp8nE~oz!fMnka`D<3zu``cmh_i9yvMGLy(ne zfyQj%DrCgYR>y0Neg$Rpzx}uGdrF(KyiES>7ohwkR4rd-^xbIG+yjbS)K*@(v+F&% zv`=&y(fw_qFu#;&JL*w)l0xKQWc%njlisjltVEs5Ji~F*HK&Stz`6e``^1d0oYcsw zYlt1u7Y820o|k!gaO#~<8Mmj7;K+)80wp;A;Mz>ux+%g79I2eVUsAc2>45H!m^J*09;Of8!AKXV? zbw(&Dy)o1$L#JOCkHDJ=NKB89h7|g&&Mjg3!&@XS|3AZpNE`454VJ<&=w5v!K4SE5 zQS|yWLaUFE3QqrQo4j)4CcI4P6THr;XS|<|eo!A@w)m$~rPg)rnh9=8Wo zsKgh9h)_`LE33&fWat3cP+05LLV*5?-M%V7)$6j&1(mjndr784{m)0YlAeK=2VS-Y zogA00LPc#4G-23w=ylO;5MhEm5O}d!S?D-PM~S0ddwT;{z>jxXsAvWPgJ+hk_eC8_ z5OV>zvOeIJU|vfd%BflFu^mhtsj_8y1Ff!l9Ji>Hhj#ijn7CT*WxAHTr?@SnOBZ~$ zLD!rv#GxnQ7bTOZt##QUK`!4KxL2xuQCXhvtD641s1_<4Ro7DVjvSq9`-M>JfbG%y zSz6Fp+{HC_Hur+f#OHeMQ5uhqFkOa9kvKqW1oy`Qa3#=i)3GBOZu0ZFUnrGng)F4= z>u7vUcffrKaaJw6r?e&;aG4rf2~m0#h|1$iQJQC_MF8odU>ML{{4Rl!NT<-lk zn|q*^UxKx94{&$#vTR9PrjD!9*(i_(`sNlB-g#dlmGU*=i%C!cv*{Nk^5~a?EbuOQ zfKxL3WT951<>%2#=_ScuTZ4WdE*$(ZP zOggl!bGd?>cr6HcsVejlQ{Plc)3yqazKHojhAS#pOerb$sNGQ!<)e*pOXNa3Yyt|Q zXX3?j7tM*dHA_j(t+TSVfty^X^HJzfBIy>L4e!f8vUR-_%}Ye0P1R90qVt?p$88lV zXOFMoF7%v)Y6T{1!e6=AyV1$e_N(T#pap%-MOe#9Hxu1_phVZs%-6891?-bf4sBi@ z_i8TjlyK$fY|N`-HIIs#Sk(&)dqF&x&fr{$;AKlIgW{GXe+!exSNU^^j`ZZ9$yX)n zyltQ<8FFxqU!6U^e_U7zqih${W0egnz-1@(lFn2eklpj%=wwFF{8LGHr<;kRJ3wni zxaz3%Auhu;Bbl{fy*X$GY2ybuO9&QceO$*OD^-+{;5syoRM|cuDUHmd?3&9UgcBUf z2WU=PTFiVuiB6M2oegcLP9SC`8|2DmZMh-SlnZo4pBACsVvpCOphI7JWDbrI88>{H zG}5FIa>Ihy3J>WJa3aF>IvzT0_Iy@y*7WPd3PAJrrP2nDF3|ZerbN`>vLpi!E(iZnTnUW*Ykd2 zua}ktnm+#$XPKlMOJ#z4(af(Ad1B!p<3<%Ro z7a6-@9hN=;-L<+L>F5%8Z!9+%a`yG>#S01g2Apip$8(O<`N%}_AeY!+AyL+mI&RhC z;?06kde_2?M`xYvzsm4n7w?yPH@p)Gh0N)J>bU5s+71pQ1N0T!miF0NxTK@T!nkG9HZ zlyaR{+#qd^_-W`-#I+E17-XI!B=CdWHzIjw!f~AmR-L~brX{+X+n&c`-Brlmc5KJG zc}blvg?i6b+YGOj#Y)y4Wfb)i9*#6rAb^&CUY&n_Ap*2sUjvwOVR53~Gc+4L+Rsxc zt|4FTbWn2^PI~dBSk^jp3EO$xwRa+|R(EofYoX(8NeQ5qF)( ziGd=qd*FeR@F%u_Xlfb3>+T?%MqKZN(GYVMo4Iw6m0Io;Uw8p`sB>3nN1T5V5tB zmyOEzDjf8|YHh!fZ1KqU&0hjK*5UO>i(sBdMR@fF-ibqOqzkxDMQG@aBf!&MIZ#4W z90+0~LKL&d5GN@j>oquM74SzwBES$8Zm&WXkfuW`B!17XXS%EQq19;;aXa8NP;4q* zl(HDAbHxT&pW5gvyiF8~v64rGWA(9jhWtYDI4HhcQ6;Wzy|;&qv!Pmk%4iN%u6>&7j7}O`m9lf0%mn>yw%t>mosHqjVF-M`Vub? zc6f~t@*oH>x}OkMdCeK;*K>}`iFBiDO?oM%V~`vHi~=zNQGhuE?~XH)1XALzf!bs5 z^q^xu1u=#hh-}Y+%&fl>TD=xj?XR)UwrKyut6y>)O8TagIcn>*WxY;pP>aYM(NVQN z0CPh|(!U_1F5nvaEJA6HEP2G%Fys|0a%;I^A;Ab$nq&8HsX}*v>JgJ-0E_!WJ7*C@ zqb%|)%1Kq;VEGaqCI<^&i1+IRJq!T8i~;T8s6KtHNhDfJj@I z@BKGe)2(tgk%v3p{-Fy4r7-Y=JdgnmcKhaK)N+vLsA#nuSI7>f7cyjF&*V8-+3;%j zc+}6r?RN;Cl&FafPbBv9>#bde^{&BdDD+^r-srCCOJfVTIWig%+T6Uzdw{xBEj7%6 z8MvmFd1%FUL1MWUsrVqn+c*cytM!n9%`@*s z(hRbWZm`Lt@WgrQexp~Yn0WDA^j@d<4Vr%reJ!pK1vORNSHt+YefSe#!~Otk3DSKi zcW2IGU!X_=aKJFRwc<<(aLvHM)>Q%<>qMioy0_`xDyY=wB78I(vDb^q^4be(aD>sv zbZYT5FTXH!Z6X-Da(Kc}zsGbl76zD@b!4wDgQ&8_Nz#+LR(T7?=6JWb#XeM+agjZO zmy^sE<&y}l9ZD+$f%IIUnT@O94@?>3B!bbF)HAa@DPcNIw7pM0;I(f?4stTuH)c@h zH7=a>Y*8dd{;V?2oeK^SU1)dh#p#EWw=UG<5RaQ3??WlgS9qBs8HQ7w|+77ggFB z99Nk?!)Hj0z4mITi2iu9jqVgruVpc7gBs{Uum_)!J94*=@clnfO9KQH000080OxDh zT4Rx3ch@!m08d>200#g705LBxFEB4KrF;o=Rn_(Pc`tMFUT#K)gyiJC014#Wcfue_ zNXQMK-~b`ugv#Uq4hbmEgyDiSg5XfmIuAIMK~Sp|R1WyJ4pmT#we6>MsM=zSb8E#4 z-~R1$9$>rHe|>9xti{cH_uYHXKKtz9w}*41kwjF8Tp>iJXrC%XFZ$HoPl(@C3b8md zQ{Z2g=rD>Ad(lZx})J)K9{Gx9s(sl*LS#@f?8dbtZr%iWNn zM?;plAq#uhv$Ci0lq?G(O7=EF>FUZKECr(I5CSff(ZKUP)1YKVAe79an-T+yudy^e zdz~9<(;i1tONXPWOcW|v6wuXP;Wc)^ViUnB8mqi)i@mCxhWCPE-wTU;Ss50opNxK) zhlyoGUn;Pi6TTM|_;g81=2&7Av1~V+3&TE2f3V3-a^ACPzWR=yBI7GrO3#yV%%g;+ zoG2;EiSW&Zbjk~*PgE0$y@(FtNrEV=p{Zy3hc5k7L=#T!fRHh>E0ts90R$ zg@rV_DO6fSM(|iN!o1AzqAb@Y@<=dhMbnlT6Seju$Cep^ChiAP$zt%PRHTSOVwzntPqh2AiXJ^~8nFnnR8EU1 zt7uJ`=1N)y*=I`zKeKmLn$>j8A>2F66Q_~15n*Aq<(3gCk|=t_NMA+;W)t;gGMJ#` z?4VQW^Dpf#U>4s)BPPZiJJ!i^K(x_wFf=_26Q&gqt;8{UPGLZkEWsR#!z9reM(Gm< zF*UxdF{3cc8A|pPbUtQE4w3pNJ##8OqcG(K?wMgK<;{=xk7BLx)yjw`@_m_uVXDIh zmF!r1Etb2VzV4+a(T}c8)(_7GrTu7`pmkvk{3Mku4xnU2Mp2q?1%_6&)GP)SzU&!P zvqlngiMU>T!1`edh2atdKjGB+Ga<|C{i zOLO$zLZ>^c(e-6k(4>;l znJ?!vz4iAxdar-Mae0JUsB~{RpHIU?kZ|;21K0_{^#YPv))k0HsY&@*1LhU!u_uzg z?2UEm32DW+SY|=1P(o6ZylBwNnaq{696!M{lNn%ISpu6Cb380cc`Wf0z;RNK!eG48 zrRQ$WV|wS@?4Io1;AXs!48j)8c+1&0)Recf`)aw06o&C{8Z)zA0Ft zZZSQoc1iF=Si4ynngf1vz+u)_QGXi z8YI0hU88-HZ^%a2NLm2r)IYg5lgXWRq7%<^kGIP$Pe~I#m<1>B57=z}3l_4lgyWUW z4xE1Fm~l$>4F@W@j1(|=d;7I{%*CNFf+h9oC7_wa4P8XaNA#s2Kt9|G%nZ?20BM@HrwUT*vAf1_if zsNp$14z74YgORY+^f=F&AetK-zt5&5i|n(`8MZl>dDQO`zZP)XD* z^I03><}_=2$P|GuokZj!E8_W>OFj&4f!JvQ0{n|-x@Z!?Aeyyl#BXFKF|SeLc%^Iq z*_6dI*+A4J@7!Q#qUY^!M7(o?BjQ$(IAC4p*~O}MT3rPF>+(Wq4Y~e2INeNeIWJrY zf(TE1}k=EIYNysd$$)d8F90G9i&3)Y2#T&b;78 za%RvTLzgGu--e5MN{$ypRdV?m*Ya9vJ;cr8$$z+6OeGfSDG%G#OJ4S+JDo)yShw$X zr$7GWr`k0bWRUxSe0F(I5_q31QwQ0UopdMwZCKwTr3((9&r>CXK^!d`YB@^3E5-K) zcM?2+pMx7N4HbzWjIh~4LlAxwKhpmp^naeOD@&W${3cTa9oNo0$<64>^Bn0{n@LLE zVJ0gbe{HiB%4bABmF#zmTgn?=bhi|K<8HYPa?)X1mEOF@-QoqqRC4m!;|`toSFB0` zsxH`krPn!|R1x+n7i*kJYwQJ;^iu!GYOfx%$WbfWD zv#0ffk!gTVJc0Z za2Gou&AKgf!UB-2dDRJxHN&m9DC+>PcW&IX+SkJrD61=XSd3)4Nl)k`S-1=ub~Ii3 zZ(sHk3zQyv+~ye5_yp;9Qa$73XC=7={o{L1L@yuhIMJ`$&FBa6iOHKDbQAq_rCap* zpSnfA2yA(GmSfA&Bm&8$DfjHJgPv(ATsGJ`b?U&zng3s)<+g>C3tF1vs<>SkRCL1+UZpQNGMJ1m!YBnUa1;Lip~Yy#-8Et2jd? zk2umzVcBhNW}D!}ZZgj)*`I7sQoQl9rTURzn$ipUI*ybtbQ9ehWGG$sb2rg14B5TI zOqoiau-OSnJzXF-25X3@^m2a*z)5r;vR4-J#rhqhET`PC`yvQ24eq4 z_)7nKzZHVymi2C0H;NV|SDBlXzGb3S+T_ag+CCyiD_!@2-%m!tf>gVIYvLfU;V9OK28b0ej!oEXH6|xWbA?4u!UC zBgExE4s^1G{@y{ZCmaAovs|&-lrsjdvcU(iC;^lbC2s)sIZ;qFHxW!5VvbdEZAeCb z7P$}k90`klV{emHjE4|!mynl9PCDDJsh+yn&7g;JJZT`->R*26cyjdwclzISo4(~b zCmj>T41fs|k-b5_O4j|}iPpdtEFxVmOI0n)`jV>X(&{GhPDuc@%5F!SK6mry1SS}xBe}s9jG-O3@rUxYTnYkPx zkVhx=nNB7|*Dr8#|HD~MoI5()sy}~{J9G4OcSenMXNJ7%M1HubQpvx3>`dNUqEYGQ z&m9BTH@j&!Q}jm8@NOkX1qr1uxqq*{`6^MYlF7%MzLf28qx|g)H%i@&O^0x*(Z&EU zlOz+-ZO;2~km95W(MvwmJ&z?}E{6*g!X8UvLwXY|hf<|Vs;u5@>sW7+Oth?2W- zzCQRR#J&u~pAL-{DlJink$`G5gMJn&WCn*3J19`f7wx!;u(MRmF#upgVpRwhn&U{0 z{)jZw1e+fKgOeRcx`^P}unc3bQVhG~;jlnGgI_3lFF9>}+m_9iXZuO%X*Oiw=bI)a z`vvDIxsZa1>T9P_3&kxex#d+i`+o-Om0XONcoh^$f8=KW z6~XZ2kmuc1^_XLe6Sm#^oUqk}_Yl8Uxkc&-Ddw9M9%gy-1tf)ZsnFU~UN+Lg5X2oR?o{$I zL5$fn(h5`ZH*+0{Ip9kv@a;Mh5q;_iH@(7uqL4omc9BPh6P5f0lzS_%>||tODoMHI z$H5qt%zh}>M!H{6upyrm)0G@)YF!3p7hS7&t#xCT{^-VRL8t;DArXRYJsxZ+0@4JC zB6mI46BAsl05dX@tZk8nS0a;wbpkUKd7PqLv_;R!v8gMVq*gk;!l&4Y6wSPh(7qVy z46?MFXd?QFmz!*K{1kXpEGks;xlZR}&bY>D{U4unlGHWJn*Ct zZsj=uph==uB|p3;*NW6HXnFMT=iI7Si6fN!7vj>x31iF8!}AqI<^+L_O^Nx*wW}>o zCNb})qI+YxKjzd}R zB4LnCHdoH3s8g5x*74@paJoufGQ%mxtAgz9GQw#3>bKmSvSHgEA%mZM#kgn92+4|^ zfd`f%ur-31wAMg^pfd&_Y7TgID_rm{1T4*g&7H^_4Uz!lX}W__oEB-mK$A=ly68EY z+H~R#Ic-zg=>?B6uSjqL`jNgE3Tp*L(P9T(_&54XC{`rta|ZE4(5TgBgwntI!{&m1 z8Aw0$fiI)On-Bs6U3`%sF?qU$Ff(1McKC<9pnc^@h&s<)ce&_GH`X@&kSF-G4h931 z+@a)|AvvM|gnPj{7};t>oI{kJG~oLPZj$>bHm+S;dbGWheQ0y&xx;P$an&U4;vvwIA7kTxuL0H_+kuhEqrMiEjZ z@GWi&zgKbt0cU;DRnO!zp$`RwWBzVlCSMNJaSDYE1Zj7x+IxR>G;>4u`o(Z&gd8gZ zRr~bGZce`!Un%{`O_oX0gFu}Qo!(Avr}nw2ukclR-2b?nZwx=DNdmJkg`?bx+`+Bz zv#W6v^Pvt#HEf483&_zwl-vg$UK3`Mr7=ZTaMs|*ogBL4bCmG8_1(a1RTlo_a!PfM zRT{7hM%Wb2@gQ?SDSf6`KHO^cua)#xL=8EjlY)Ip9t(@P!kmpyBUEkgKOY_A>9!## zoD#m~sv7$s<#U4tO11@eDt-2tXY9IPgBa$0Lu#RrZo3gEZ&J8I$-!ofstqr@&Pv#7 z@)dG7r)4MjoWk3Mr_Le{%NDSv9>tt`_zJ*}W@u8kV01kUyoe~P8}!>}BBO31m+)5Q z2_Z$~r$xN~{CA9uv{n7@R}h8&>jnQ0|NicYY5%{^_}~8>o2GJ;i~w8*V*P*7-R&** zRIA8{{<^S1XJ?l1UhVZ7eD5M*D^~4P>tE&6-!2_$R{`(={+pJW| z*YSd-@djO1Lf6RNf!E~;SC!%PrRVFuNfT+%O^yHkkjrI8gowz`-5zVurNvBkZ(N2f zi11PeOKK5cS67Ghn0~dmDmVhivuEOX%~k*P;9q$nMTloSAWTZ>o@Gm84PNMX*~pYg z1oLDK$QoFOXN(DOJm(x7ue};GSq6SCz9{^UM}Ox9r$L3uq!yY}ksE~)q&8qMTQndi zP(>$oBC(y=(wM>{+b809{slNL3UOR8pU<3)Pr{GKK&Qu{ z^gOb|{B-DldW-3)BDW3MZj@ z!X*-=r1MC=#$#~e0HPjL6X}`+9dzB$Q6x*lkHrH!&cbn47e+r9e8aF)Kt}tyM6PZ< z9>436_`M(CMs;6M*N1?G7nTugDV#q@&c$9Ut-9EX#OBuHurS*MQZ%S~fP!VP`6-r< zs_pqC!xYGYHAx>+95f1}j765_6KkN}=?8ZK)+5obq)#K*(hKuiLn zR%wv#%XBJ5l!c=6AZ6crTTzS7#%dL`5r@1;5yG2p6ji%Wj%JVChqL1&*{{%|5q3>s zxsE(xX+eWL8FWkoQaFu*X+3QUmUAX~HGT9kAmeb%q;WV1uN#16GD&DCd9=|fTl~pV zTw^{!)svn%&DUODG?y%rhgtPPdD0M@f_xi-^bYeC2WORByd^q`W|pu~ zK-rl=HGutT%1Y4jM+ZdOQOIpHgXsQT=b1?Nlj}sPA;`29p)fOD*1}(+GRxYM0~B5) zGmtedgPo`|r%+U^M&&jTkQ%N?g}GFvEtugDx_7u7Wh(M@lGa@M!S#f`VI__nMzrcv zj>H^i!YE8bAkz_&+BV|%+JQu|7qkHj(bA#BUxw;o3Qr?WiaB0r>)t>06GO>FzoK+e zkEJ;cy1509Un&SmFQ6zz9)sYc3JmCpNV*q%a4+DLN)T5UcGBR8a)%(z+$2a|n{<#t zR&cp5Cx_evkWjLLO;#IG6laQD)jQ=A4$*xFL7)`!bAu2&4FstQ+^HXo^&ALrnF3vdfw*cziuS6) zXXy!Xr{INM#I9(AEs)ium@%hhVArl>esTqm1R0IMs zQ*k9YV4F-T?}~ON?g~E#L=fUaZ_W!RIs|`9M`a^_!IHD2P!-38tZ!4{p$b^l_!m?#&jo_a zg&DtdXXfR&Gbasow>}+YDZT7=cWdpx-0549IXM00bR*U-cmL(_bbnAkccyM1ogwU1 z(wbwz*y@KI7~5wYJlnU`rM33aLzA;QT(-+Jr!RD!6mk}pY!xz*t4duavbn@PqI)y+C=bSe7gnI>t-jG!DotWaZgD3~ToP9!fXk*xe^9uuUso;wUlimaB+6CEVcT40<7Yh_3*IBol05r! z$Aa?7P3a;^hD!da+MVwEft$yQD;;OXAUBl1!R5E^Ug0L()#)yL@kn>!OGpRaDTsi# zU^cqwpx@qYbI&#i+f9xlSz7M`|J~?=D5ab9u2n8QPy+4Q1r-I)ci*fS+-ovb#V z>7@7T*W8(9gWZ{B7dycphWhojXF0*Ye6_o<&sXk3|2TK%Z!PZ3fJfb#OXs@=zICAf z3UJVXwylL<=8mAcz!d@M@!VjuhB%biyz`|De(uf*?zyXMW6}N; zTX2Dvjs_q8h|EsRdTd@1&-QzuV<8hxA#|Yux4Lk*Qn4$RqKJU(Lr_9N4#{9**)=a^ z^Pu1U$xW~3W5=0iNTMkY)=H20#`Q#w!5kZD3W;4exX#J1O@d_Ud&j?RC5|_D{@y*# zyUd;W-Cy0ANk4Z3L;|uoeb?Jt$aEcB5_zOul(dcf?vzGaEQ&ohi+Hh{SFUTUm6;&zCZq%|gAP1^6n5XBN+mw|WNgHW&=_~= zJE5-7PSX>dLR*6gZ71p4f0IX_6V{qIM_lv2Q8V%hbBsj#^y1-ae+3LayRW9 zWLx-+*eb)&5Yyx9gu?nC%7 ziKP%+>IN*nksG%>*MB4Z#HuydM4eoEiuFARe3H*7n4WkyFq7Evo8mPy>pNzLAd7Iwr$(CjcMDqZQJf?+qP|c8q;6f{@Oj$ zx^vFP*?Ts2@7{{2i2CD+%&N?as>t`v_xYh=rJq4$(4?svTROH*Nq_Om(A*ZjGw>Kt zN(H>7u7(!!ei0;{b|G4}rGB%W(78OwQ0EVdta$J*eW!plb%y?}$8o_Lme&;X6iB{7 z>Vh$k4}uWN8c)@T*EB{8PeQEz3MENW$g=Vk1$*U@y*B+uTA#JQtraf|TW6=Ji*xWy z`B;*$c#LO>^f@Ki@JJ)pj>*(fP9Ouhw~MC#8%8bdoaSIUCYz|kKk7;8mu$4*)Y$5q zsm(tWGkr;!h{yPt}eo`72!EmRx*s##TOZ9QqweT#QZB$pX?-AxpVI!>d1jIPPK-7cacz6S~`5FAYb#J~qZrhkb4PCChFQqTtuDu5t^R(NVR> z60&309-^COP9_O!2m*nYxLB{%5IlZB=$34`R|6|9qAL%<44w*-q%pI;c^dDg8z>_u zewG>=8g0u2L#%FHcA``dj%4wce2Oltz4oYMd2;WEAZs+Y(&jq5v4rSylg{N;ZW0#9 z?cl-2dbXq-F*|ZAAjJF)b2Vj}h1(>wcZsUQ9eLARvrFQ_sbb$O<)YSoOZa{nSvTWr z7P;$aYtng=NMg@#1gV_(n^-_KihbGjpm^2^1$A)vXD<&dZ_WS*nke_%G2~24k0gcC zxgHGBqeCN!PJkttu9@s5-^#CYOZ7d?<~l~up!Hdpm89fkWp`OpGKfEDRU_@cxje6w z0G9!#2OlIWMZ#hodIK^@>UX{P2yqb@$qs+Phzld*Kfzb@ zh@Hn#Db%;5iY$i?oXeGVBi<3ia|`Wepz*oELEWL_Z(HtZZG9%kZ6AK~^CHk+nhGAh zfxxL@{ z*ro3WA~E?kv(yv)Q8rP~7d-Y2PHqT%8^xQ3?VPa+^7tMFkWHr1`bkQ~K{5v6xoi>( zUi5{CZzhTNFOhLXDTHJ)z$fT@vsWsA_}N1E11ycf0F5KIi<`bA&~b>rK^-(Fn>!@sj$ZJE*8dLr z3*tqT>H~ zUHeH0`QkTgGanqc>Sn200^9DOY~Y-b#7~TzIxNCX-dFpwTLgXn7ljRSRnQ;alNKdT zQ~~eKra}wrmziFPDDCc%_8&OM9g123ZiNPxLGRmQuiHdfnNgeBo@h3Oqxoigc+7dT zi_Y9S?VRKYHZ?LeaQvXN7Of!?0Vd2Gj!8LPBR^}We1Lq_&=^dJWoke1x^u;9*)_bigg#E~` z+50mIo5_i5ilJ-FP5XIiKRI)9%B%4`gN~lH!FT4`iK7IKQ8$P5m{LQU{MW1rM^3{W zzYUg}QOXqJU9XL^CmD3vmfy^)yfcBUQ<*L>X4|PHWlJb4=@+Q%T2kIw;83M9e0+j# zuO1%XNqBrV)Lus{*)spitwf7RZ`>BuZELKp{s~#6_a9H3Kh;Y!!{$Yo_(XdqIOGrOhW$0|}|7Sb+w{^SOchWO3!ZjB*;)sbOG;9j6qjH+m%al$CIJS zM_Wy2-(g%YF~bP>K(A4?8>s^)?(0QOkSZp{Pi9XcM3SFiCSYK5Gg*>f@gc#D5{#dO zcY1pXz7(J#?T2RL?W%{UtVGDX1rQulU`0*>Q;Z?+hizakS2OkjasOCBgRRwCo!H#A zxjRK5Kgl2j*|TISXazKJakH+e0w5u))3G67P z3ycFx%|k`H^P=k0%qj!zvO7-Hy&fGY6#Ugu)DGlgqmzZTZ2~10VkPQvLCP1@i@0lo zhb!!1F}n_5ES6&C-yrE|rY>$mSHZQ>Ca68d?H7uWMT7n}r5>TDZXDGcbGWI)09m&- zggXSX!Dj^6$2`L%bR^A~%BaT1v6L4?9p*e;F}4j^64O97r%eG+qEZ2EU);XZRPvio z?0Mk^VijEjw%Kac)JgvmdFaj!g)P7DuWo>XL!hx_-(MkW;}H879PA+tJvUH(zvxp) zc``y(i<_0~N%SHuSE8C-ZfS~X-~g`<;ZA#$U4tBv0tl>fB<9`)PjPmHlP+~3LbVyw`7v*K7Q+|Wa7TG>)2;FZejSLH!&xNx#hH!jl~f%%^5sXslJ`L`GaLQhunR{XrJeG|#%*XYjfYDf<_k)f}@n#aS4oyWP!L_c^-cTNV zN(wz%QuS}h!M6TtS2zXjMWWN+{@;Jw!kmdqP%C8PLkbeb4$EaP9vDX*f~=fE7@WZ$ zqsrh44mgQ{>m$tQO%*Qq{Z?4ypC~8uck#Ep13sgd)T#}P5{VkSWvvPrIQFnD>5?r0 z{+-#Cy!|@>ND~`-Y>%SSirI{cjbWwYZ&J!67^|gYxJi7?I+ zBx8Y;*44}8yGJX}B(d>((lEgMH!%FmmLgY5xxxGq#5)E_65y*d%FFpl>7n@57nI-q z5#S3N4R?iv`D1yq!Xa+UrY71wRI))jo28Fdi)$;{bxYwm(RjhuLE;mm+mtM}B> zDs@DZ)=7_eJDQAa{Yxk9&b}z?h;hNmnBAg@KK;OJM-8NNN%%NP63njq@~cHE;LB5`3w82Y%0i+^Db#ze2Mj znV2MwDj72NK~JDg$|rLaOtan+$;lr4DICnL3x(i1*~A5JEkYeTyMt-K$&S{Yj!A3iXtq&<|SsW%#Wuq=+qiB zH!b&thfnnlm-dVbch9;@@DRytM78xOcD>b$ZT)UZxo3%x7;TwYFMzJwF%D$|52?Qe z=F253!ag+bbRp;c*};Sj<31hl9MW!l-htPnOF1i?(r|zlxibbb<21D@i0O z($sGilH*4t=KAM(MiPwJ>ENKu82*!qk=X??eNPra(j15ZTa%h4}QGFu+ zq0Fc`wP^+w)2-iOWFmC?@Iu!oHY7}@vUB3?1CM~6cD%W5O4BtYhBja)0XG}5=Li#c zt^;!TWl0M<>Rh%GrzEC?=gD`mj2%qvSL`Gof`NUM0o^+?nL*S>JU!PKx&O5XDGZL1 z72dFjpYe5O(G}z;vbb%^B$A7DUy1tR!_T04k)Ke|Jv>>V*&XX)pDqvfYZC+ffn?rJ zg384;xlzmI+orP_Q(395WEw-;8iXq9;#GePr|D1uBT=Vg9-#yRIvNDm1eATE6|oQ( zkdc4l_B&n&)ACI>fXo%|Si`b>MLJ=46FKrmPB=F%>2Wv<^`G~_AKHpRp)RfIcN1+P z1WUTlK&2nwMBLT$Vh)De7tNKbN_G=-1 z>b~23CdX+_?+xok-F$$dgbEDtr13z?{X1yX(ryRH`$O?gO#k{;vy?n2gIx$P+X)wG z-cI9JMUjhIFqeV`ke?p)6BiZBJVg9hlcb|Ab<%#dMA`{Q!FY}ym;*0Y!>N26uthgY zTIwU0n(7dyj5^v*az;vFTS!XOC#gb?|N5F#Ov4vSf zqTHQ@irHObSad9thvo#AFegy;AjN=iPZY1`q$P+g0Ee&TU*fD69V&BOCUb2647bpX zkYz#@5rONSbm8^1*RHr8rZ5+!*p_Z!C<+?7FT=gT!P2V~1{CD-F&ZxRhRFdV1mn=I zBppQ4_>B)YSO%OLDUU#?_TTxwS?? z^r@j^;-LZ{I)tZ25z;gfR$v%y+q8{sV4chBj3idJ-t*kvMPGuVS2uP|Wjln4jZ@yG zYC&w@B&B?W!Wf3Tyc47Hn3WRsnH%#41(8eT`+#Lrmo?YW8b6AYt4HGnJ*S>>$MBHj zX&=dxA)GMg2XnYXS*({9N{jO`l$(lXecSN*W{V;20EYw5xLIXUQWsKV62|)btH1~e z@EYU^4`E$D~9!B|#k~uD{^c3%*vx2GiXed}h$GO>d zR0~LqO6pPUw(F7)7Ld=d1aj~Z&d+&)-bE*pKA)hFloi~`dCf^FMXGjVr!o51v} z<;fXQrJgqI>nFa{MZxu|jm@b+ttJ>di4UUaSC(?9wEUm#GOd&<k&fLv-!v-*&p9PJhsi^3S<^G&Y}Pb%|JX zQG06|x2M3AJo4~|Bso77C8aU1)1M74p)XMH(F9--vzIf5Zj%+Uk1SI5r(k^ni%zPK~ z?aw7lsSRD*o=dqqi0h3>I>qKjIpqz+IFgJRj#W~reZ&x*!Xzd#qG>5tF%e})oB&`< zgaFSjx}iB)aR7~skF_}WjuQld_4mKO3UZOf&W{aVE(ypY${y zKUI49FV1w(#7PqAtJPf~ilWd#L=tVj0ZjYtG*^Mc*cCoe z{Bmgu`sjMCswdEb#a|HS$F%N--%0i~4BA!^6r};zR;uib$55t)SoTclMOoRXiD~6S zLHX7u3zak&Zu_pZxJ7AjuuwDs$G-INGXe(}RuP(fb2^h!TQO?Mj*oWBgo*w4S=k^? z+O<|PqPDm3>##t6MmtAsh>@0CmMm?+3#9YS8BnpUb%G6=99(6C^r(ztl?CYNM|HX zk;!l*Crb(@xQLNH;K9~|d#14GULFnMnSN3fA4D_sS(lPSbD(eWqpXE4-KC%Ry`JAH ze%i;fD?Y8*V}sO^U&HWpRSTNZ1Fe&Zo8nVSziv(enT&nG<7po{Azx9yqfU(FNpX0c zYKlVwwoHI-*15U!!=@F)5{9`V3{4nIKvs_;eaov zZ@nq@*tcL7XyBbci%`J6Y5_HAtY~p4RYqGv(vyDLl%Q?Y!U%pN;H^Pa@`2~lXgBFS zQpt?^YFYp0JLzAmuJRhnR^jMEK+z#SKQwX(gU5IKa1tH7@DGq0c|NjAQcvA327|Z! z-SG`|OsM>a4uEx%K#jtVix`DcO7n!w^%o+!S(3glYP~CTy*c`aG9R*aEOJCf(rlj$ zbp4mBQD^+H^I2isfg&%|C?~V*%Hu^)8HXelQ(G7*AqFIJY|42xi#Umod-AhA8r> zC~*WyQY3B84o}nhpt?>ayb%HxP}#o#v1(o4tgcBo^goDzHhbPxM8}dGODb_I;L;{d zqy!}-u)4XSp&P}##aw{ubCs;oT#$xibSMN^pKXGi-Eq(8Q)rmRsXLcd^U#EVD8xN6 zjHg&xsw2NVi*b0o71B8rM{FvFBAl+-92&?k@06PwXSNqH zU+<99AAcR7cHhyOlk?PY9K3PWo`&d&{_J@f0x1#2u5T3BUl0Od>F&iE6P`|pe0%?SS}q{lBtc z|Idp5mjnv}@_$ya{r~pD{y!Bk|JjE4U`6SF^bhv$g#FL^VDdF_cXxHGZGZ&%FM#d; zkdjdeZukC^NQ3@2sjI7rk3sS>?BEys7e^SY#&Fz6g~i*-Duxt^7+Kv8*E8Fj35f-iHW;I{KG?c?Fpy^P|LY0= z_W}J6MDKrsb^qsp{eNrzZxi!h?fl=S=D#%meR9tJy(GK=+GD&PARu=0|D!es#B&slHFhuT|26!{!dnGEFLw~&NFhQb+CU+k_Ho4Jg>dTR$Qw_cii$FcNa2zS-7 z{RhA29FNQ13rV)ic+#l7CHKM{m0u?d`}ps%e8qowT&r1QI1StdMN>DsFO_*mD!{no z%}$N^$l4keu|Vgm!ws-y|IT$x0)?nN1~q zlj{Ji^^xG^p!cnd$f)m7yK8sza6yF7(mbVEE*fJRH&UNVxB<7#Z+45}$Z~W_hAM}HD^tXTqrcgvkAKj#ZW{3E$#Yx_%RGrk+{kKTrr1+S_5dq>E(%I#Ji?FIs{M}LbLpIl>Lp@Z$xU+}11y11kv`e7|Q06uq{{aHfuy_LN z!ll|gntW5re1f<*#7OWD=v%)ja4l6A2~M){It2a;m*?`3KKxBlKOiFbIjka(7RxqW z@I`wcQ6>I+O+Ft13H5qTe<;_j?k&Ck)V@rZLW}Xi-&4tIK44%;>zqY(b?LIuK zNxHj3o3Z%i6fl((H~pwd9|=o;{UPb3s<}k^Qw-nM9hiLc=Ng!jo>-bupo8n@Sj zn7jm&avr3Gq`6>Qdn4Z47TdnwMugvBpea-CiAT&I==t;a-!b{P_qa@!<6XH;ZU8Gv zepRwv3=e~M0gxNcR8uN^Pq+*j46grZbQFTXdCLWI0f7{_!pG1y8US|_#z|}X7hfP z=X>;v@PASC^D@^}LB@{f7HVmYceUzlpiLj>>5{d3Yi|JhZe6&GyIGF~Khrge>N}~; zJUuZ0i2VbZc~^!!h04I5$)D*}wq2w~^4BiCr3JZm;|OS0Q^oKWR0=MNlfVu z%=!;~0onyLjinDB%_6@NFg_)1UIj~jZ1|-YfhG z^+C}lJoZZ*H1xdT{xtOVyfc&GUx=&w0&JKN&J1|%mC&4nkj@#!g#Emtw|?)7No{oZ zyXkhc*GamB;b25vqtxGa%J#^*a?j>lB ze)8JTo`vs|^-=Xp^4>=1XPc25?X}%p{4fp3qY{U`4_r&!eMOFH;OMR%?-1tiJ)z>k zU7SPrWL|wu20TLDg^g5P;Tju(ntHIpo?p@lPamFyd`E&+q@MMnMlMO!QP!G&mCA*0?1+c5e# zaS(LzgkU;4Is3X+TsZ+J;E+bvRHyt}+66<;z8rt`^KV;T9wj||9U^)gLSNVWWPS{9 zh$n4e2%tVFd}>=q^nCFtPvkKz43dzrh8l7+?uiPtrTQrJo~!c zAbGa@yGBVcfmY-iO|A>Rp_0esLUbJF8sUgE^3kZ1q~B6 zjLw-&M+~aAJWH<&83ACR+L(##62Yrp7^Vcl-Qn;%qBRYRgEY(gtly!}W23RkwNR%< zOHWU!!G@1(jN&vN{S={1*c_Y=IboJ6!<|00Jju>}enV)QX1yBr4nZn}4$pvtkxj$x z-F5iV4O_&6m_I}+?!p7xuJ8TTD|U-lOlOC^3LFTft%rt|yaWLW)FaQ@Vk4xo*miJ8 zjCU^>1Y&`$kZ&QVT*SW5n=~QpP1qxUrX;ysoWmJ$4ZBS9lAXaz{8Wa?c`A$cuLOSJ zzzMT&eN|D)>?I^41k>F&i+ltuK~Xo!5GCuzfbl?E41aQ5C;=XH z)rD|2dSf2M>mY7rXz`+gr+IhOEOK8z(0^vo(1MIHdj3Q0hSu#+^_gf-VVQn=zC6~=HxAEz zSV6nLi45C!e`{(X0we~j_WcJsw25uA=RZn9nHzy8(V?SR@i*u1;f99Q#JwlWzWR}H z(X{y)$YNM(T8vPJWW^1!zPo+34Y8s2B6Zje7q!mN12ql0qa#-`J7A7b<$>n#Idjb5}GC| z(^4`41B@0&b)t zkV$oX_^6PJ)P06Zd%_5IK9EMweP^|B0|yZvw4;yStG*DYc4JO}5Q*sP?6Bwa0`Xpa zLcSiNjRHHOHgzO7M?@%WpGkpau1f=!@ueFI-iEa%zd^dS;BTxzk&Ol&szBDEIg6I# zp-#ta?GJ)uNwA)43~Qm7Qt5DNoI6F4!!W7aX*Ly%e}xTeL9YtUC?ef8Jh`H>O)v#4 zv4fAngQ4^$T#2o!`u)jdE)ObS4 z->BfnmhMs|Cb4_aimzM~nfpX_ksseysAYA6pJ3t56MhU28EXMG1i#UnH2ZHQgTrpA z8Mom98}-xz!A^vG)b4fQTFzC|(ol`z`Mf)Tl!FHv{Wty6rj=7APh4$F}>m6*^ z9bP{2^bZc?XtwBeljwg2LKhof;A?08xqohkJ&dS!sVOHCUDry8M%4&7we7?70*Rh} zkT$IGROu>T3LZlC>fSK>);ZDeU|<`mJ0p4gN&)JB`*mPmOdJ`!0SnHELH0a?2*@54 zT>H>Rc0wJgn&}A|RX&)~Bn`3puwRAAd{ziSYo^;qt%yG^3y1Cq-kub6`6+3hsn%*% zEl#kfDD(t^nNt%+wc@;(jZKaV50UQ1dS9C`6gA5_A_yYuLGo_`tjr%ks;{ZL&g?Qa zhI34sq#9G(!-7B2mXoLApFd=44>)w#KZ0-#OrpkL{b!k6aZ+E5_j@vTY`gCt{OPT` zsmVq>Z4jmOwr4zTc%|(0wm7zH>n?1&&OCGAc3(Zo@dg&eh*W?haNE%~+f|ELW^e;X zko{Gmqh|K>+ccdEfEh8At_kcht$+Yd7;n){qpe76h~2-Guu;eaU1$Yvfo*%SUBnU5 z4CB3SC;I!N=BABi&0%=A7$(F}u9%yJU@vkSsdX;jFgT!tI#8GMNkbyOwK7=fV>Bp1 z;M~E(YYO|X;1AhKC~^5%iEa@bb&_B@e4YkmLIui$S}o#H`IE9=WJIp;lTJTn1csKL z!0zB#Lq3Av;n%M~txTG#cH^KEsrTa6b$|O3mQcALt8Bw=DviRL8#Y!ukHiTM)b9pt zfBvA{C@Grvtj(ooMgXk87)_V=&!dMqw6}HY6mO}@2ljT3#=`C5?=Vnc^c8r)>kq?6 z{!Fr7w_(Rh0YWyxAe_>g$oLJrK~mW=jjvsBGN0QihLK`kZZjYK?hCX(_X&WVeE&Qr ztjgNo;YDF>Hkujg(gXD&N?ryPz95-;;ra@M4Z;tG&l#hqr#%ZHQ&gK^uplL(r zc_P@HzDN|8d9i^NG0Y6N4#F7meYuq`JGNZ4Ks!TZP&)l6P{v{*6mWRMFbSeffS#eG z^CDq_rt@x^4;$`SDcbfgZ?7+vEnr=`e_1~_bt)>=j*u`dGPB-Qw8OF6bv9eX^e>>s z(!%UpN6t=kl;n+*jC{2sG{ZrJ&vfTNkWw+qWp5vXw=fTYlS<+C)zBFst;4ff4UO8R z-JUapHlb? ze+vLRTbp_kfQoylPi1qHeOM3^Uq3ixds{T`a5oxWoRncnN-ry;49gA(m0-lE_6x4t z#K@e+j&b}p!wq+TJ(2>wI9`O^o`W59&oYFK^(*`5TYIJ9j-FnILe=lcj^GP!G2-M` z$E_Us&2@D%oV!bumvlP}Zif8j->_3o5$zhTA5qFMOZNQiM*G%GQL|3p>oUn_QB4Lz1} zD~$df7}dZ^1MdcVmIs;NTWMk~Dhnh|lwmp+RdX?6H&+mH2hXuTw+!zW=|yLp=r4$T z1vJqfcv|>*wKR_m|741nZ@il@M)bNH`R%?5 zDc>b=ut$)&1*%-bn{G@*|I)^M!0E@=Fo1|zMY-#_iJU?oQ{}LM$)o# zs66uqN;rpBl4}qV0eiX;hEEQ1W4bK8GSmSHO!yln>%$|OK>NHvfcC7JKz6#2IjzSx zp+$HBd5p5`dOs~~;K2nqrp~B3`49FT*8QW+1C>a8;4no;E8n2YD{Od=Bu?%5-#!I0d1s%iK)YuL7TM1dQWJZ0!_CZ0s>n&je* zf6LKG-YqR}aO;cP+I2A;4v)X+p598-%CXM9oCms1p6)%+h5e_>5%oSft_sYJN9Rd? zcCh(R_D=;za5iV#wT_+YzK4=_gxO`~`|Nrz<_N$DoF8fyEey94Tuky&C51rKNLLO% z(Wc_i9wp4if-pVrl_`@qrR5v1x^pmn^8B)SiC2(30^jZ>{$ zpxk>JLF|MLFb}+6QL--8B-kGi7gSu62`hrXZHAIG&li;rV%@q%f8M*HPbKZ2brHTM z!HO3;D=qZI4W^QyOL{wLP2ooOdO1rXY9fZQ9(5F(y{>MM#>|_#vmO)s$L_~PSyY^h zoWN!m9~ky^R5qV*=B|*;jX=}2gtRp4?G9bhZs$TvGAjd#uEGzh#-@B4AU6j)TE&&Wo{hCv zjpG{-?a;8c@efdTW3K6j&u@U4sV$#7EEQ=*xuTov)%pNu1x(}Q4n7mkCWMjj^pELo)>QB75zJsy$)I4=OLoRtwn8b?B_c?Mw2`;~i2 z9)!B5Q^W{Z)H^6K%T30fUJpES9LX2$+<`+Ueg;rG0h#xz_?L{oYV)_d`Xw-(i&392AA#fP!8Isu`v_o{haPgn|hX!qBI%pFSFY+Or5Bkg~Tp>9q%|3}gVU)me3>kOWE^=AP=JJ3x-~rJe zH}`{^mSpohuf~+Nk$?}_l*$6K!kihzzmDo3egu=fF4Gi1DAzIHH@jjo3Z3t$sPH2U zH08|@7ks8o`wJD2jO&#q#Bqc;e( zv8GMA#D4T9CTd0}zK}O59s*8=e&(|w8_YD`5K`|gx@P<3jO`PiRag>R*B&jUWsJyA zyC}DDN7do{@7;8m`N~f$x5A@~KV?wrgIADb#TY)0C}U+%)3TB^QglE1Ii?x(#@;`- zd1}pLU|e6rMfm%;sL(ajHJt}~jc_UxS3hGZDawOT<0#;&-+1Mu)9Sxt=M*ABjY`eE z_oMYlM}!c>aDFqZ1>d_jK>t3Ay)$6s>@!`4ADmrKo)|eAC*s#`i3^+8r`>QLOp5zf z%O?A`xo7aBU+%&r?$uA5R#z_76ru&UNE`ze6&Yr=Z*9WAjX&C68p_pUY! z`KJ%%?>>vgr3^=tN&0v?J|2_J<%5Y1>`OclIu&?+IHHh~O1e{5$e`j6?}!?Hie|Uo zFYG43XHcBew}sfuyTvfQJ>sB&t3*%%f@@1w68MfV>_{>!wA=4*PU9QAKLh)8rirlf z5CX>V#?R=p0qM7|MRXp^tTwQG@daR>3(q^XDAoL8j2b5P@g|}e&beA;=tEd8CaD9u zu_f;cliShNs*NS&8}}HS6c$^!f+ z{(5J2x{Mt^_YQ7`fgh#=)ncDsv4*wW@lTCzC&q%d9RSlJ3)8aJ+JghWMZ4_t_Wt$E z$VX>&Kl5Gzz%Mp;j3-PPpT(P0002`u|wCQ774`2vgsLpU_JT?&F@1PnH%DxSB_GsT)F0F3H6N@T%(B@-4x0ChKMOd!`L}@+6y!*xLi2f)@ z_p5j;h{$^Ng8q(9$nF*8=YdW29#ZhL^NtQ)gHD{f+jYNGXY7`Af3K$>`TGW-;eRe4&A0{;HC(zTIWwMLjl}J+XzOYM6}lcC;RX<5 zDi;>(|1Qnp?@YTk+Ylr{tM0@DGtsB&|8B*@u)X3oh51ic;F5p-T5w2kQv$j0`0t#V_y zA;bRSf0b$CcH29@nLAV6y=gB3@!+qH zGOQT&#_Rh^j~OzM9eVghrRdng!ggC^3bUw^tfipE@qu>pfRYqtIGVU!qHLEK^**jE zcWj*a=d$6jCw1A*ZDHl{pKpeA4S?_;bvA6)6(^NUjQCXwCG6j~^>|};DmSjAOq@Ak!$no})p2j)lIF$nAHtwIG&kie0KDMENR24H(KjXr zc%gV(2v{MC4OMsMfnIxrQo{OB{yM2^7caw~J6s1}bvBh-h}jK%*HMOogO&Aph=|DE zUFG|P$(4<5zbd|^a5eWKXv9?pZ&68>D6lPKIaUWt(9~X?7;Tu3Y1t74U9!-7oyLRm@fTe@1oFIOV_CS8imCezHrRM8SKsm@7nwIvD}u` zrl@}_Wlum!t~T!9XS>dsfofIB1#!LUQ}J@ONuh!1tZvAf68ktptnu#|4|e04t(?)s zDfe~Lv4S)$NjfZ*`KDK1>XMo%h)^?sh?`C_Ujn;3d6fUq)Cly%)S{v8zRUWwZN@yi z_iH9K@+){~tU5SB!R?wi0L!Zr?b5I>YZ7O{*o}3zNwlus?j$sZe$dM@y&jmrZ36pqT=;WcQWev??+U)$r(5;&BH~j~& zke*fb?`Aoif_Pbs`7uUQoj%%?`9LtJND9}bZ@`8u?XsYx4&miN-kRQ$^xmpblJw)X z_sIJ%JMGF;C(_O%$r?un)F}4z`0XSk$xm$PJzg?X9`H#sNz8592G;de z9}TbSNzT6h-wc;oi;p8LSZmkP`KOd2RoGsdUf>}@t*C2UT%+&|e%9du6x!yyzhz-x zxz@3^;fNefRA}CG_of@^y>|}k%J*jl^z|}{6Y{c3jf z-rwEm7cy_5+XwANI$4 zoGG0CTU1jo&9euOjI&%#5e3{`B=8- zg`u*YfD>*%`9}w85A{A0K;amZA@CeVZ`1IGVkO>Cpj}z}dc$hmPZ-8`@ez*Du#Km& zd4^jjSs55;SN>Dk*{gk&qi@v(iyO1AA0JBq(&_b2Wbu9}k`fM>5K`f_8y05C;|m?s05UJ!h|5a_@ZYj#8y z^8r|_LfW*RmL(R;*DhqTE$;arHUP!}V*v&&9}1VG+!>kTyJYNl^nTk^dn_d3u$kl0 zOR2~o!5SHV{@V&VF_&bul7pSHNysmD19;1z(7&CnK?yXe^F@OElhrP7^LiU$*cJRE540rxL zkaFo-5$CFbS@@&-kB}_uV7*W=zcML>^Bfm$ck~dfJ?vl!!U(>9VVD54^V2@Zm{m}f zNb^SkXAY7a`yPhjrrAtFmyT7X)i3WdOR;@4F6*I^X;pfH8T%Y9<9M_{g#_;bw}~A- z2kl^*$-#^rZKjZs*%)dt4T_lr_(MrG(~_c6pOW!!d@r)mC@50#i#!LV50-MES*wOi z^zuB$R*4b~PHnzNUSv%)-7RrAtSW2vnP^8=*ZGao;8uj@9!ZYkj5wHi2fo<)>W?n= zHF*`fJyx>871VApr(=9Pd;mV+;l7U7!=nDBhP8~mf#<}uZzmhqlZ~|AK8}Y8*q8u5 zhk=UL%?_L0z_NX8g;sz%@XGS^sS@L(!sc{u*?Cl;y!GIx!m6)EP+`1}jp8W#>9ags zAg!6%?Ur8;N-0bXaxB^c02t7Px?*<{_LTV}uz??aoxW6TP1#5V& zcwhEYVJuZ|T_(FahoE?Ulx3vkOgDq}r6Uw}fKksRl|duGENxx#XNGg2gtny;aH_6a z4w{`ow}TxQbvr^<@wH5{C3)I>UPI?Nd;0Jj`57aJ%A5)p_{7+Xn|(u0n#H@|McfBefegBzzW%HT?RDGQ zAfkJF4*m0{0XbN}dgVm(uV}l@Uu>8;?9hpxM@Xr^e*Y(1w%XsXv-uwvl90kqIcJS@ zZ;-2f{)&6Vwensyea1PhXHkpu7*78W09!z$zbbeE_q?OvK=YK&UK(a*az^6^%PXrI zI81U5SiC4q9(ME{@+3sDuz$>+!ws&AA_?KJ!Oqn!hmUCOWmQ=#^&DoYizMrwu&`*T z=P;Aan&wpz00f0aJc@}{lRJQC{#d#(8EQPt!0M&7!(_Qfwj0Hg^hb5wv1MmX>N%tp z*f7%RabrU?JVCB7kq{_9PMc}N_=a9PY1335lQEt)Oyx-#=~Ph*gHzVy=6!hHpQJYz1ss^E{anY(W& z_{(Ny_ALd!k;xW5q2L#@nY{J{Axus`RB&1nI$vu<0qqz+Iy%3Oc$+t0EvKQg9TrKT1g%*>h;J!)0k1 zi{iPbLbLcVq219635<%Q@jgosGSfW{J#+#esJAdny@eU-Ei`=DTNv-2!cUTdns(0g zlQ_8`DwS5(r073& zO)_aDlj@pe`cyKh;Hk{b)R=;s_8S@fjG4zTmd`49{f**Fng%al%6{~gf^0k*xMX$&Gy>b7pPk~7>&IcJDuC)Hqv$w=U{{!A%7jTgRSjS870Ug z!ZWb1P3kr@A@0q=J}K3SH%};nSHPp$zt?LRcdIxuMSV%4djMR_@)fAf>?`|($M4b| zC?yN4!@XeHW{TPhO=H|Je=;J9M{&%AkA!S59_ zAGxC74<^j|4F$gss@>CVV-WN&DmVoF=@%9JLdGoIRd6R`7Ij6#wTxN4s^E8Vp9_2U zDQS2O_tf{F&SWO^eI}vGEmgGRmMgYly5kn;JMk>uy<8F`B=U+FK@7rs@>4`ovN$s4 z<$VIfhDn(R_rzzw&EUxqQF0k~&&m8>H(nCS2Wm-XvwOXQ8465fA<{v0cG-Fjt1X*- zB`Urkeaxya2=gGDQ6)|!>B%Vofm5a_!#iO5x$@Ky_ z<1Ar483U!0(gd)_lGJ!L2EdqV1jOgDF{S8|V-sUzO3@|Lmy$#H^jqnqR)CM1#f*Ya zf8xr^6$QU@E%(M11%I43@83}Hhd|lAJ;hskpx{vQg%=eZ+<5x-o&rBRr{LiHqBbb* zfUcJnd=BSa)#qo-{2c|ipjdAz_#}u`P>R}c$pM~`6f`7q1QUx`YR(e*I`S2$Dk0l_ z(V`Z>Tt;Nor$lBxPIV{#=%?d8sA%f;KQ{uGZGmEWIANd2E|LyU;oq!3XX(B_7!x4q zH>qx7lB6<@QZ_`YY>LZ{TC@ZyLXS0r?ohmP+rjuiTt%#Sozel_)%UNx$W!}1X`LwozXw%Fvr?0DvV7#BzD*-z8l%^ESv5DIXj{9UTY7-J% zl~aXp-2-^>1^k?qR+T>i_B%?3HU;}ikY?R{S#}Ua$n>Ew2s?puZi*UancW+q1bkWe z#FS$9KUx;dWqxtLB0Q0FcFdGj@wSFJvaj?a^~6dY!CrmnipX3ef`}djc+gL(1CP4pM1K!);JK&qE|t$_%OV#@y>~vvXQxEa7YunE z($gpTI%^3XN`()iaOEwKobn?F$|CgQo~H`53XOkxWWWV9?#C3$@x2a}Z6m{qqS*uz z!7wt?*nVUh>2XuNn3+zd$2Fo;P>?Epo21q|qN1!HCQh|8Nq?&Na4da3IVPKX8)K&) zCC8Mnne^`D(#i+TJUM$+7nGlKvkNyBe16(|bYH>mW;5Oc1qaK_zO3L7ZfEbQ%wG-s z-na?}*i((LaGs~MV+?ILdH327p1GliGQjW951)YU&B%E7G^0u=s@uI{J)wYr)7x^TZ5>BrNv zSw-cuFJrR-mIvGI1nkO>g^_hDfest zupzEHvDXj>DJ2wFH%=N!Fv^4S-)V#+St$Y)su>QFjneujiL?;Ku3e&-BmS5bE@s>x z!*~0~pxL;)SiX~nWIKLDMlmR5{8lxW^6{*sK?8u2Nh>*~x>}RjJ4x*$j9qlc$FxuJ zurxES;Ms?h^^*4AT=V5Q1;1M~p4?XOxvVjNduYQO=WZ!@#W2q(pTa(Guqmr?(=aCQ zsEqMT;PJcKtsDYUgjEilTrY`UH}^xm zZdqU>&dQns|FG9B>n_0N%XFK<8z+BIHM@y?y{)?G4&X#;*_M%d9scxE;c8wxO|MSg)lSycYv!wSdSuTjV{vZic$G~ewrfv_NH6wd_&*?L@|-OnP2pMpCF(o_ z{YZI~RT~>gi^JAGXk*LjHa1Fl`}Ya!)SpHwru$hi!=vgyY+^e=WO*u?BPTgiWq-2+upIiQ>`%m@SitnzHb(?}I?*9eCLh>1A8< zX-$aa-RpVneWxGRF6l^(`J{AvTEWl0oS(m_5o?)?+S|REF>YuAT``TBJHtqaF{Kd> ziy*5BbPsm&4fQ1#y9?#qYtteK0==o;3ND)VUTq4kAI9}(h8oMzc;I`gz*K}omBAbV#%v0xOFb`(gkfUWsMtG6&wO; zM(Y)r&r>fbI2@p?yJvQpmlXU3Gi#hxR!GTxi6q1m8Aa$Gpauyn{kv)%M#xU4zE0{V z`*t?weTDvYkxU_7H#2-~*iRS1i#@mZ5I4%!j+lvM$w&)Un=4bF9CU}%KFIyq9;|UDz4zt6p`W*4xGhFNsBD@+44fh7&pFjL>MBV%y>!}C`ohN zNNTGIER)o5m~d$gPnXQ`A^i3*qMw|;Kg^sYuiyzo>+9jPw!TvH_pj^B!1%(2Te@8^ zcWLtOWd*NH8aJ*f_!Yw_s?39ZnHH00nAtfsNns9Osy4KUGlm*_kvrob1`a0Gq_764 z(xA}748;YhTv2s3=*}_9tA4vIRe|gr1BxrMaqMdpJ%UK{Pf#I4MOFz>c8k;$ENb03 z=F_CIzuP!QjFfzbQi66idnG3Q9!jiJEPAvga=N5c3~D6o{w)3oW((=G@>tU5_#PWT zp$ypo1RAn|nKcc~28LzoZo5?WRz@4qsp*$YQybBjULL~J?!xKe`QA(Chv&a|@rIrf zVO-ALI3T45}{-W^4CNgb!b_WUk{^;%w8%>ppG#ANJ$njkoKmIFe;Su zGq~bt5kjV1CZGS?K>jm&(3EVR5KSz(iU|3L!UlIgl#S12$+r6fj(%cRbQTGZpA59` z(Cx{i|G<|0gti4-r;OAe9g&`)nKFlti8(Q(!MHiQhwBN?9O8QVMKhyudhrEQdyMAI zdpUi+;ks3QzH!^Wk{i-s@E;-TbJ^t;cmG_b zYyFRszfK6F0*BnEfjxQ-;hH8&9DsnjXo>zV5l^@v6LO#k)w(&r??Ec31M=^b#Ms7+ zyK2dj@Ft~djI?=7BHl2^wGM!lYgg`=kWn&BZl{dyZ(7jpIn!L#0d~l79bnJi(J8yf z#@QD#84bTMH%z#gb!SqaZ+bOr2){RdbwU}ohC_9fAjI5N^_0_wY2DciY3H>vccDWr z4@2M?Q#C$7k3)1%iXP;+bQ!2*njHcWZb&sN`nX=E`Vy)c1V*owMd1gUlN9qs6xw7(4korhBiKdisClV0KBUFHe0E5?JCl_mO)qC|>s+*P z#(d$D4lrhn+Di&PW0*OWE6!capo5?px$V*2+Q> zvWA?6V`iz)mwI1aB2rBSyF`~3Ii)2E8^3qZP{=n?mQ4>$JbwY7pMY7$EKz#OeolF(IXjp3=Sm<&I%EFTK8cTX zdWb(0p7{`e>11kLWqQWl?^kn4_WhDb!j1ioPQs;9!{l5l`=O-Wv|$V>b;ggITc~hTn&SlRIDOEMEWi=cofu(a$ra7Z2f;BODK_}MnMHAb-V!}oSwSN(glOgYdp%h+R7l{Ng1S+NyoV(U zFU8%zEz4SpV=C4{c7qty3)=69VhGiaMWJA7$D%r~Oc#ElPeZy=<=3Fcvt~l}1sg^> zJH$^ql^L$^WNNtb&17P!QdUocdX-riWya2s=R>3JPrq0h@q*Bx}8EmHnE7`VmDXCu|BWrtwn=wxP!B68< z9Vskj3e~H|E8ni=Ocjo&-YYVbsVq{oUQyp$S(PG?&beNaTu3-MxeWUKfYM+784KEq z`r|0-K1mJURSJNu!FuTK;?mzN>qe`)R7Vn*Sx%o?(4Q5-NFakuxaQK`Kd#tgV>CV} z+5HnsCSMblovOI3^dvQYBb`#ixRW_AtvMrUUrVPoXIw813(wNdQ%cWU)I?SCg+*Euu9yg+94(4SN%uxcPJE##`UL3|9Ltpc zP74*AkmfFRP%&yHpy4j0r}jZdM~iY%|J@F%xcis#JZhlw|Cg$WZVA8T0PylLRXh9^ z-Ma*LMBo2V@A#PGo=Nf0JagAd;Nednn z$R?Ao>ZAFwA*Rza$swkVb9)ra+}MMknj2CqRlR6vc*>cXOzEeepDc|lc)DO-n$(oZ znl)=kne3Sh3O;RSCTs$UxuLO^LmZJWuTTK?sgM=&PrF3!}I2M#4D`O#@NhQ^Uzf?M#PO5I3RJxE%s_B49 z!@pUcH!mksk~VfKOMOwP{9G#id4<`T8|k#h?1l5$agEt4X9`1Js7=-~dXRM?bM>@> zo0FMy6$Q^_GiNU;cqx;etSR`pOg5tjT-P9+6i?;OGU$Lw8Fs=8AHo8sq=VoM8)w{i5JV=?cS)BoU*5cGugq2?%>HUQ}do^UB< ze?Ucl{X11zcX+8HLx|K#2#?b5Ri)8z5_B9bk&6+>dN(rZ9wA7i{ zq^aQP(+BdVf~Tiq`62vleh4?t-#nF3aP!86vsnc~wZ+M!_d@ z8K+Bt72R; zwU$vIx|rOb28BKYi|M$`{!zF@bo2@2S4Di?pTu!m)Y+<>8W0x=4A?anWuG9;$IIxB zC^ib$K3=4@HZk8VO9h{Qzb%TO!jg?!B4^K zwiWzLHdDT);8r%1zoy_dtd@#`!`IK8l5qP{h6d$ZWR2!YCuD`LJxYn6vS_w2z7vrn zb4yruu#J3bSe^u8Ublo*N;@#n6b5>$@@oiwqFTBFEbr5T2Ys2Hm%#%>E|o|-}bFDjDQrdW*_atOcT zo*1|OdVW7MPpusmFJ9Qk(r46*7b0w|q7ZV5vGMZ?o@3DoORwVt=JA|{8`i$GhEJc~ zH>wFy%pN8l6_?bmt8^-!P{?r}XQbQkd9 zfKMmX!-A-PoPGKsZ95RkVlbK~Lzd$#4sEER^vu4@y--$h(*9VXZqIgTR;a2>7TuX_ zgnHH@<%UC>S^bro?i=D6uhAE9xV#7Li>Btji5+TQ6I-0AGErCTXcltsC-nq0&k0rJ zA`IOFmY4(;%A+|h>VX&yV-W$$ebh=FEz22-GGZt)kFqI++I~$(ef!I5_)8%o9J(=i9>FOvsE=!!wFX$IaR}phG9q1Yzf%g z)Jq8HOALp#dfZX8oaZcRVSzb3RFj{&hlPZpk**H^uHLSLj9>qVEoVZpw}AzCZikAZ zmNfJaLZ}_0ktpQ7u%|hv8&R|4yHT1q03AhSU}cXs0r@&rgHKVv?|y1oPZ0J`(m(s< zLJ-BqY(LG*hK1%Qi?lrn&Ek#HfC8e+iMMIAGIfelO9IueleL|q$%S~r52JdNkK?HH zD!xLB=E@!_f+#d*f)ZrS3z4ZqBkTl^P6?_+8B4f=7_mgXPap92)}q+^tz$6SJkI{s z;x%>_D7m=VmR*2TbJ2ePDl3Q~L0i182dXvup%_9$^WJ!v=;)C(+;c|toO*o0gdT@^ zw31_#{p)wB{4GnUBR9>gG-zWt?{_0|$_;HOs4vOUng?IXfE<{RDj71=l0I6dy@O6! zV)qsik&IhU#5PXf7vYCEI|VI%h`OQUVuK#;soesIBOR(mr13*IoGII2z!{6o3q@ZN zh7@Z)s$!d?VxBn`0Bs_Wq9)YiG^&z8juHEpw@f$Bn`H7GZaxP z5z)uCVl>jD&?sQl@5pWK9L84F4tEJR+S#NH^;ms#B}NOP&c~mO3UC(<6E?+r`Y$f!&u)DpIAP+>yZHJxUOBYqwT-V(*}&Rh2i(W37d&R zByo!b)$;txA~DIgnB&aThs0929?%CU4%QR=12HVNOkBpgU6T-+9|(H&J^uy`PKe1O zK}It{M48mvVRTXb4#i{-K-oBuKkx0ErunEecHIl#rMD-Fhrol)Jh!F-U&qB{s3}Vr zX~KV@!K;*5$9HrO$~+mng6~T9@gbT~$V%3;7M3F9d~~`oh(uTEr5pL0u_O=^onK$_ z=!4;Q76leJR@T^#z|cl5(jl4iL7}!J_NnabJa>zdHmm*TVjIk@M9A~v;7S;7ZP0Zc zNIudjxh1U692X56M`VGNpR$BA=RYXPj46$Ty*VpF3$k2?%vf4BkTuaJ*?64||P+0?HfDh$QwO_z3ux>FIVlX84=ih4o_TiT!i7Al2d$qAu) zP!e?h_&XvaPAj~7823Lzg}ZkA4a^-Wj>DQgPvE4@ z*au$~pLW0M_6xLkXVmMlZwc&pJkfT9T3uQ#Cg{Urq@56W-e69lB@n(Fj!F!I|7o?- zv~n^xJoX-&#%tZAnW1OsU5<;nhhm3I8fRV+rnnoi#a17rrm|(BKS=;{E(-m{yb4R| zHTY7HjzF1Pu_e+WD`>1J<-Z-@D~tLk2$VU9b#}0bg+@aGu)_SymeQwjF~5h@T^gu5 zSY5!$PsDehEz9|v{y2@CyDM%pM)NlIRTdJRm9=;G z5ehfF(YD%8w70lkpQD{ji>+9TR^rUF^+LWbH!@vYPUJ@=*7Gjo;?q{N?~?v}#*9vE zUEqIdGxP|h3u|I=7KLPTgw~!Yk@-b67>8_8b15_ibvMAl?Owz?Pm8DlO^FuP17!y4 z${0_}M6*azzfBu<$ns1^xTh``N6c`cBNV%^oww$cq*c?Jt(a zh*+Bk{%kqNXr^c&+~q^Kr6FrJx+Jp4Xf(q)s;W^w3GM12>Jp+9R4+B!vFHwSkIgiC zMuc{#ooN(!f(v`XTdnQTDqP@^h(YM+*P=DC4Xm3m3JHS5@{xo<-CBOhYYV(OYvIzG zkV%e6QIU8QD@KGab7aQC0>j$aFM?>0cW(I^gd-Nldn4chkM=yF_~dvA$V^#kd>vE1 z)D<$c8fBUS(opj`D2%^A>O$-!^#E6Vyh^6cPYOmG3&D;&78Hdbv=Fi_$Tg z;{@Lc_;h0+U*M)`&;>Q19jb`J0r!*C?nKr%Ey@%v%6Ey_U&2>9H7iGf7R1i8<;L^Y z;`0yKk(ow+)RUSex|P@znuRa1=WRmV%IL!HH<3kPsN0uO%X6T|aBr z+J#YpUN_;?g+QQ9G6iu+2{^RvA^T~pk)NgINe$)@{RgFv>K=F&7j4TWv4_v7?1rUc zNOqd!!89c8&7yEWyD#JCEgJWfA$rhcEtiTaDyp271_|YDG1*gDiZPJbiNfzaP$b;ZW(C~q9-aaIrUkhunn^-;L=9M>{xMkYKA!1b zf+S@-?Y2JxxwkU9CDz_jf+gC*8(CXQ2&B5ZTlGhX#X5^eN+I$ZFLl+XRdq!*-0Q6)TCJ z4I#e=eEbvq1f;=*uaBii+SgXetNrlkJknOt8Q7Xo;UP_UhrFiB>NzJQk0I_?EfG@m z+xQl1K*zfku~$UMewthb$KgMUOw;xUE4cI5aqd$gHa;o0GlpWrcf1FJo|Mwsry{Ts z5cwLc)z8mL*vVNjprxCrG~m8(Fh4re7;xSZ2<^CDTbM@e_Vf8o0hw>F5c(DpD=y(` zVaHqFq+O}kTJ1&2?)~R$d{Z*M!#hHybJ30QG6h6vkUJhZUy{>WCqW%sD?gJRRvq!69Tgs9}7+CFA(+Smj+B zH5@Yb2a&U|*T}Ob!GE~YV1}EAQx2<=7e<%F$}6x@+L60ak41L2h|?pHniP>sF(WE5 zwU*#5sf66x5+}9(Y>V+iOPsbvTY3{3*ZgOyt^&HUdl}!VDC4W5RF%+3C?(Bsh6LpJ zQ=yN9o%0c?e8j?}$PiUSQ7!FZFd=QIaCEQunQCmiR4oq2hT+xOI~5rPr}6(|GU7y= z`jQ(#4uU&gm12~1KZX3FHboAo=bD!OetlOP#KLXaSViuc9|QI8=;T#)q?mm%ERR- z;c-6T{S9#%ZF4N}=(rC_T>lE*%^ju;*8=j7lam&U5Qi@?hrS;F6?+4>jc1_rcmA*F8^b+vq6?Ip?%%@CqU zz8#~bR<*)f64SV8IMkRD$D<`_Z&E!nmFLqJdR&ohGvqLx5RYwO zAufI3?gvKTc#>&!qImlUBKE@BPAeqTF189yX}WufnAG0RXvBL@S(q|H^Q^PN`EzmF z2mLTFu>D@hmtsPl!E~283&!S}z^%hf+UA=*0dC$Ec|1t5yi7#-WEB?4q&iFv{xw+_ zMEZ#pOVU!I`VrDwb;aD|MwKdR=M}8_`E{TwN68Rj|L=+@KPGpIeNPP0CU+N)AA8zh zKyB~ZL3+2*^#k<2({r3f>a5gAFwVqM>l6km(6PJ2gu%44+i3}L>+#({h})&jen&(_ zwq2(qe9Uj^Y#^CJG`TgZ ztO)YP?ow_<4rnDIB%Jz#GWX}x%(z@t5|8G_Q3RY+5e;G#MgjS^qq0!g-B0__f37V1 z1%IN_2nuX@^hZZva22kyvovVn#*eH=49uIC+fu=EdXL4fs|m@S=bY(Dx*gsx=qb}} zH?g^+BX;xsZ|Qc;=q}$<-GB>i$Em9@`9{ch^=)DycUIKsumX3dtjDWRBWlvV-R}EQ z3mn4xdeAlGU|$6d;T?6)sy53baut!uA|fbEE^q&Th1w}n^ROj&oKaOM`D<6GkHDf> zEqq^DszyT-{f|&Y2{y(E^yEpJ!dHpwfFk=POAMbBZdH_YD2)r96kY64w(yvRA4f*q zs45S6gG`ne#1IgXm=d=W;or(*w#Zfz4-U!~Vf8uMqDq|~=B8#fR zo&HXnCG=jM0~XO`8;MSv>vE3wp1W&{3Le&-9-V(^guUcC&pk1Z)o8RGo^aI&Qc$6@ zu11g&6`m`24EW!baC^Bg!WxGt1`d(wl4nl7Rg47dA&A}MC5i&da8>u?ga--`QHwCm zUHG&}=g{CZEh-AZeJH#oIE;un*j8gD&zgnL9TjglFj(JJZyt>@-dAtl ziq^QJ;DreD90e~JAN06_2P+-!DR}3r{azs93-zsf=RC{O4A+gd_r9uTxWc35dP-=p zkq ztNs^&qxXT$|4@|?K`LT9^i)i{pd!xhq-8rHd#bjT$V>a!e+JndEr}iB{8?L!lk(ps zgS!?VF=37Uenp1ByFXqQwIyOtB`WkFl8BA`PT~qG?EEY|9Ed;mmy~>>`J@ZV8%ct# zqN2OM5w7()fBgu(Q?kL|D=@Cca`wI0Rzi*CY-}bH?sIiux4qgQ9$4%2n{9PqjrYGb zuMfDq7}XO#cb(;Lwe^9Hn`gr-3hkxg6?}2Gu&fSvZlCq^0k7>W>Tl(`yuYdsB)GS= zqYm_V*k92HYOq}s>cBca_tk;iikmFw5)}Pe6S1_rpbSM)W=RoH?ZBsG3$g!Wl+}Tp zrwoGYE0<@T*8AHyuti778>Xo6ImK#Z{`@zpV3U&Z@WcI|6gf}s*$3&n$bBlPkcVpI zNC8oo(=565G}`oZRSHg;-}`xrWYAPyX?W61AwP|8&3@KutgVKt?bo9UYi?pkqtn|= zctgrGJ3YRn4m88!=#oCr`(UjzJiwxx!vjGx&pP^6`ABDYt1z*;v!xF3XrfjhlC0J- zG?964t*}Q+&KLWd$SlkcX<6@w?NxPPnTNYvQ^tMwu=R|!V5+Nm+!`BQ#ur?AsO?X0jwAb?gj&UJ$Ab97Qe?`BtC#6ifkHC;LT>7gWitVnB)+ z3&C7_Ds=i9+gF}jX}ix3j|=Q{b~}MaLh*U06DTAU=M%eo2R7TTKET_KyLX_yx#sDW zzLIdmA(hu_2}d0W3W+)&GEKBLubIYU8!OI`m=U(Trmu*0);q&1U{bY*59h0SePC%V ze6DHcf%V#5Qlm-epMO|YguP>%$f(hJQ_G_=_`7+@hEa{_}=BlgLK z=Hkv;g{APBE%YKQTPCCayOUsG<^~m(qyvrSVrS7c#T8=<^SqU)s_)tl6P|wZmKP3} z(rD=M=lZ}71l7{;?YN_7GTS>I%?@4hyJfr1*&kYsT}U+VKS{mku>S#K>JMi{(~b*@ z_&06%kp8WrY+<(`2~Wy;A~6_-V!l=XK?MLn48h!>91Te7WQY=t{gZZtU?41Ou5kj{HW%@e&ru{fkgk@xuC zf!<&+WG@~J4>SjByfvgBPwfSSY{lwmZE#pHEcUwJmfVPpe z2Ql}A)d2PK-Y+Q%aOS!eO;4|Po+<6jy|qzIpf>L|twtU+tINZ-%e()*m0K0tD?X{% z&qLZTxgoWV4G^WRWx7J;Uyq>FOEI&c3{(-Pwh9R`D|JbP`LNncbDWQRK)L zV@%`(Z~%@2J5g-J>16-dko*d)z?sd+xd4`95mYKW;0D7#yVohg}Xh%RhKP;mT|D?=|YCF8yDfZDLEb zqBptXhB~D}y^r`rLoI3)aU%02N`S63`n~CNIQ~0}c%IDN>C_!7I`|(xCc7aMAD_@4 zIufJTC)3D2oK6i-{M4PEXuCT+o}QTZ59u2s`;+KC?l3hS8W#WYdqZ=d>9H6Z`*cD} zkFh_EMZag*iygb>KFRWTjotn9{nWAf-mv#=L#lo}>^(M-Ck0)hv41$3bk{ZQe;NL1 z^lI~mDYlt}zrb%mg%A1AU!-+#u+Kmf6h!|$uMcJE-g_~8aBc7&^&6-|zpsLFL=nI= zu+G`9K3x?>-xkja`J(v3dXf zSoFOV`M5)})7-iHhwELMn;d5Jj~{m*AGbIj>7RBdkHfsaKn;KNZGGX%Wb)mfzHs+3 zbtbu8cGTou*OjB*=qD)-{LmK{>5o`HHk|Z6u+$ajRq-pdSVGJ1K58brEFYL^I;ZT% zKwPxMhiSBXdaU@PF`0+VT8a2`MuBDkFdDr^lQNEDU@#Igx(qvuP5M|#sn86LXfB?r zvZO(W2Ek32%biB+6!swbi=u*cWNKS$OzO_Z`uDA@!v9S^de$cPEd}?%AEJ zr=oifC#h%VSBHb2^ZNoBrU&}+cruy%ioP=>>%ZMpJ)fXXy>Es@hc0yWkO(Kei5U_U zy%rg9M)P&pJN-3&hw1?2^}nUg?!o~zzNF5+N4@{^D#bBa37EWaL<^nxvN}l%!6*zx zE`Z4)r@~Y(^!axJu8a}@L$Qc~s(Kx$;FS3;hCuU_WP$NQ}_73x*Ck9qmsw!U1Jr%(-JnE z4o&Nj>mE+^ho_?43VP!~+C7{OpMHhg^&-UXdK2A#<6i7E`sk@h2>rdZ6?vi8jV9sK z;bZfOVL18pGjn0s9hN`TUpD#DcW7e~P9{$iZ<;OWWcVaz)F&pxNwlF%PzSB63r_N1 zINl@CnM`_5KFLlZc-9+bJ?Amf;z*)Wpo;3SU)30EOh0VtUZQ^idP*s55E%C+4CP<~ zAA~rY4epf@stIps?E0P}x&#TpU%0~1 zH3nk{9*_Qq_jYf1JURW_F-|o<{x`+SOBvY~D4_c{rY^iwv6a`U1fAwAUHwSDqJFS1Wk zPeT2E3UdaF{wv|I`oSmlPYr*X5w^pG{xMG{lcSFD<+MO1v@cIl?3&m1JWW>P<5TqG zA8UIOGDpe|!L?(LCMIH`(Xr1Jm&_WAdMOHM2mhtThY?|ekBHs|P;mGk5LjoxdblRO z6Rc}PJ!|f)kj1K@z{7ZC~3s9>3yw4i1;*pZFro9M#>}@<#x7%$e@LOmq{VN|S z8M?=F4X_C#Iot@IJPF^Y&Fd3z0{5N`T<`7EiRksR{3C+X9`#~yDh8jXuY1Ms_h=(9 z{GYl%kH=%Z*pl5Ho5na6V>enLg*%QG&YpWZ)OL8?W3zA`A9wY*ps@D-aA@u`Cg;fZ zY%t7+$wvP)Rqg5J{O%u$XI&%na$4@Lo89T;!-;qjZ9-{BVs?(yznv(q{(we$GTNO? zj$Snvs8>IDRbNO>CeIR4uBSU3j-yRzxA)X+LOX+Zedj5b)CqPS(1{6?$Pa*m0DMmS zKEwTZn*trTccF^}fgcpep~#2P`Zz|qL?6A@;-b$H3P}E}!k`RRSaRM`M~NcMNp3zj z?W%+ijes=D7S+eX*CFalS93A^!jvk4_P$-b-%Ti`u;6SY>U#w{FYrd2P>HvSjMjJOEo&qi46wGC)-2|~PBzO@n@L4VwJBK z&Gij4T;D)f0Bucx(qb9BkfT{|Bl9n@ylpw2I?Z{#h)&k%_kR_d^ zBOK_n$(u2MyIxi&FNbw|sVgc_@r^rHRo^0MOLyL=?@H+yrh^i-kYP}3P!kzex+XmM zmL(EizX&Y?)rd-xB-siqIhbpJx;zzZ$R#xSCbioSDrb;5f>)XTdFau8u)+9m5=~v#9({pqf$FFP7!9NR56n zS&NPGYYhCJ@pLt?zn+}KBh=TfC0sr&TciKxxRp19#M~97lshw*&<($|tr~uNLvv;Y z)ta&do;?$9yc9266+ZrvX!z!W*4Il}vg~Mmy*&LKPusWXby?Y|;nTiTh3==V=*#Aq z?TH={xnF)Lq_$WhLRvo_#|;$WC|9a4Fjw}vB1=F`f)y_LZ$Sgd{(~5Q0V@Xyi>@wv zxgTRiNf0VSG{XOTv!JQgneP2lhxb7?96r4B_ycTxh^4?uU-@NKZl-KxXDSH zYLM@AxlH7CEGQ?`puIc4Z58)<=)b;Pl$}LA#%a7)w)Ge?kEyCtmEdua`=W7wd4FE1xogHcsXy{?nwSsAGiV;Lc!)}N$7n|Q^Y^NqNB5AVOh?O8dTS>3-b>hF>}?M{7ekpauQc0I=h3uU>}#tT=< zvd`}!_ge%)p~NA71{Dtv84ow&fk=b!#m~?nQ?CJr7x_=qe59Q>!v0kad`FYI&5zU+ zFn~SA2u)K{po*4FNx@2+$t9&KDWLwitO^Pkb+pw~^zCI`BYVE601`2y9hw#kE-h=H zPDGl!llFpUdY932^%jO zrQO9kUR*h>l{jz7C2Cm`WHa4g3pG`HF_gF@ym05)FnFj^1u? za)T4aNrep-TD4jst8t3=RcgvVS{v0KA`1a2He@f+2?<5y%wYy^wSm)^f24F3#b?OV zJ>qP(m{)marc4ER^G-{ZEpKv-OTX^81#z@e?~_aLHW_^-FI~A@;aAzc>w6{Ou=1Cm zYgZVDRcQ6v9v-;ZzS`O0v2(+_dX?Maz`1@IFG^JzY~w|N#t<3>gBGdRq$Y2eeMFB( zkJNgg9(9#QO~&QCH@N~%7mVukFW~Pgz4PS^A2|c z{Qq@o=ouQ1NIJCXeXqgS&wzKF5rY)L?U$NeWTw?s7KXdCwCpDk} zlsq_UrtxSOcCIyfaLC?JWuU!gM8`}k0 zDjWjFyx&r|PY?cOPGcm+*H}MfH0!@Z4lFOkH{)B}m6{ZpGu@2G-ww!s|MOUFX0V`6 z68Ak-Etb-3yYV*7g_VXX2BK!bA$|xj8+Pn1jrBvKP9ytAzyM+lCUj8*v_tYZZ65&h z3(q9pWl&+bfD{{z==VK7gk~bnd5~3C>5p3TUVQIL{lapRW9>OFs2Yx`wQ{}c7*48E zwO-S9%k}&%Z7=WaUN%s)`i-Ogy0&lKxpvgl_RVf>-_!PD*{3$>BPbSM^xu#W zulcu#$e_XDn{K+VA@rw&QicCPx>FC-Kr zeRF5Krom%QBdBd@tXZvA->Pc+_Eyc+c%bnn|u^0AgSIm9vdZB6T^s}8v ze+@f#tEmo^k}Ylpc2~ZN)!=@RX@d^XpMv-=d=%nuGqb@eCrhzqqo@7VK!vdT=mfg! z=MWIXK?V%UL75=<@+5Xc;$@BJyA9t1bpIu=Z=s+1d9>rYZJAuVT~|t{-*E+Fm(4>>5~K>DIwb)1-x7 z^TnpN7rUjG_e@h)t^GZ1FH5V^(5ecB^LYQT*HUMEDFt^{xMdn?G=v5CCgzz!n?clw zqepw#pwYH)6D$(c*5A;Fdkbptu{QgXe+K!V0gW7XD%B=?T4>iXP(KC~rK=bt=G1Qc z4D;VoWa+pWI(GIU$4p3-hQF-wWpig>|IyET{nhf^PF1(2EN--0rqwFNwrQQst=6uQ zOep%dqJd~#e|He)7|&OqH_`}Y&w9xS2YQxl86m^1yk+}QE6YeYP=LIZ zR&HKrp<=@V3OEXV2_SQDEYZVX(~c0;O<;=)Xgt0Gpd^Ce(9w*HMO6o23)*oFK2#?? zqN0MO5VR<$3!s6BNM&#lyuY@zr}Ih-*5+_~p~c=3-G<^KUM|!0iQfVtV9OK%ya8Q0 zYjs9Vy*Y&Ezo}zv^tXm~ihtDXy9r@!O_jz=6$dc7IWELw>#lB&<@j7mH%EVIw!EnI zA%A@-{nBh9%6`os++H+GSK|44)i~y)Z-+bDo+-%AZL@UcWpQ8IDeRUyZRJ$OU&O9g z=A}_+Dgb#(&-(>M9m>T5v|koWE)B^qD^?k(gNz!!iWX3VjzR&9WiL>CDhpgDux|f8 z=ou<1;6lcstYOwt;YrVz3XtQq?4OL+W=8*X-R3jy3RnJuc3Y@rO7YcVyMy8X0?o4p z3hFi+3UrOrR~)pWCNRgv(@M=J&Izf0of>ZW`-$3LqZZ5}lc*>5;^TiuPdaM$=S5m1 z73Ihq3kyB5sykucJB+0aF!)Aw!|1-uy4FtJbeb*Op#c(0t90FX99np_2kF!Jw+aR^ zY>(!#Q(V(A(G{QDPqeA=8x5`@umwa!nA17{!XNKVU^7g&Qm<2qq4x0;otY1=HQ~HMjU+5JXbP6G0uy=ss(<($>jngEPhKJ z$Nrs}NL^Zs?$QXywq+Hq|2K8z0H7TY0(Fd3R+**n0(OosDuTlhHNtD?1$yw`YbjR7 z|EKdP*k8|4`_(bKG6xQ~f}us8T`^fzF}wI&x0aIH0%NprMT(3ax+f7GC#)n5C? zn%Bp?kNtJg=*MZC3a}=`W;<%rEsEP>2HS&Jv$%lGz--la7I5Wa(cb1AMA@>+yl<*d z%keJ!5=g7K0!w_xcN&n1cUT<&>xr0m$%~olfO)Np1#t)k8H%a{ctN6}gW>?o6bEnw z*HbBs(Jh5p8tke9D%1urDK5z0>X^=cR2u-C%ZNe|)CN$PLIV@$vzW(OCE>xqD8wlj zmCPhBX$bqyl?E)(+>X;eoEq+-6BnhHllooJ_|j~=3E$ZhTZgk557m;1MtO!CYs=n< zp+(k%en$9Zlr^835AP}l?ds}}xcKPcK_+Y4-@wN*X= z0XhTwG0^7QN|yp2ae+@m)<$pX#6^W3_m+o+i5~T9euQog#Y0B(^U95t-5~lg{!ki) z!nEh;OI}thdibhFb|OoO3iy13Pq4$j&k88WjtoBER86Mg{0bk|?5Bi?&kmNi+0Rmw z1#$6>(52BfCu+Y(qit!i!=vqRm7bPbEmbehq19x?&d#Xpgk9$>$EI!7uj*EFE}K^4 z%_+545t~z|MeXBk3b1R9E~+1kS`&DpK@J`Mc?g5>ju_N6hx80BCEdl?VsPw(er{PK zT3fV3AeSB&@imr;9o)pBl*egtYNdxNg%QKhWK6xw(EL&QqtJYgB|w-!%{)S#915#G z5vYtA&BDRH8fm=wfNm*{smlI6Hztx7UY=LZiALR=-WuY!-CIHmQhUG^k%-M3k0ve% zbC#5kZ;J(OcUC=NJYc0K9V0W)ZL3O|$6dOZKi&-l3JVaiHz4l%-4NOv;jl zy8cmDSv@NO4%wvd6nTTW0OyUQSB}QZ;zL%pz{Y>{Icx(y8)5K;ge2Sl_5TzEA9|wf za@#F6qWcPhFAiMgFi{%#OU;iU@Wl!{2=cI~?ffC15%?m_IT7+XcMJmGZZn%UtN=UXeA zrVonk)TVj=eywEQZ(S+w8~$n8u)|B*E;sEfW_2nSEpON45-eFZJKsx|v<;7SmjXq- z^K~u{{*3Rqh;gxKIR%5X=kx(>Apl?Cn%y-%Mx&MKV?cXwee(wE7m%I1P47Mk6waO{ z+*+#YI;HcTppt#P$@HY*p2F8NF>HjdZ>@bCUO&34H#g_t_2RM@SOwtg3%m2XwLej+ zR90iQW7Ms%0?6P zX1!Z6{nB*~Og~ze3j0xiHLWWqXH%%kw&|~mEo-~l-m+xTSrH=@%}mNt;t)sUIeL^22vj;n>f(}g#J?=;7N{!31p!bIRe##q&mfN z=*7K=UO``GWjaHo28jU z!SlV0yIIUH&!}wJcF{2>*x9<{7#*Xvzr<07Gs zgH=?TYTnDpaxT5Rq*~r8=S@D7UPqky8Ci|&Sy{^&dsf!Z*_-*uZtb4gi`Vi-5iVOf z%A20eZQqop$Mfy$c4WWODMTaW&@D&yu-Y*8+!g1Ffn4ObtUcq4X+vEPw4HYOg}`J9 zDfBcxxLRU`}%Ax*#tF-jais0-vnuqwf3}h(6po z1JRG-k667A8vEG$_1U^rHryuh6h^am=KIAMJP4s)Y zOg^3d*+tbfkPkIYoX%#Wrq5(E=j>^NQlZaA_FTGk&+-dp4lt6&1BA0t!Cu5ZCNq-1e-z#lhCbM6wYaT zo4U%l;j7j;8HTX!I{^i6tO(>dj4(-Qg_3_w?fMT}OkRO~Di@t3+q|iLrQx$aq}Q58*|{QCu)3`w zE|IvEqyT{>>}XT@Tde=1_D2c_?<;cTWrc!=YO^5c$td`r zQ7Cx0Kt;3Ej8O2Ht^)utaJGKghxXk*1-kce4k!CoHY+WS?y+cM*cz5Wt$t?Dr1QpZ zQQvAipq+3CZ=oAAe@mf)GPK+3LsdTWb5Tjd|WW9e3m_|`17rg;NDq|c9-7sb?UO$d_LddN^|6;*5PHb^Yu9mZvF3h z)drG=uW1{ZwWGGlXCiw(m$4!{b+ED1w90FN2m0}4|33U|PSFB5Ssc{m=(*9Y>CA6y z1rKO2}@y8*`yaPQJKxOYeih9?bmn7OQQ?~qW(Y56(aJI!8zX;JJf)a}B5 zqGspdM|7Q$hP)R9`1=2tRuP&1d{W79$!sKRmd|G`Eo%mik>>N{P%Z6ICFFB7tGYx# zyqV8X_@b_oOT{nGW8~WE$a9O#dKh-41dQ*Su8aY!#-hZ2V z>5{hhXscj2?5|Vb>Th?NVogs+=xH-*5C~fugYg zv%snWqpvjI%*(u#x+n4whY9j|x>u0P4`TQ~^;VF}ikpo<=1}vPgM7DA9l(m%d_iXO z86&JCvzGCY>0BzZGVZpm61s5h9!tDti8ix zAwaLQ#vzWc*BICSBfRG@P4-X%tzhQmwLVEt7Z5gIz$ziu` z2yWQDv?bB9J$5L?=A)Y3Z8_cUhe@Xa+RKO}K%gJB)s-f|&^gF4vmuTuJ4s z0w*l0Dh#E|iULm-Yz}TMlq{U4WHhGaG@)1t<^(M`pDPYGVIZqHJ=qdo-Gm$K@Ib+= zJXf2FS=Lpi!t>_J@Ucn{gqdb|uvgn)Gw?>5z+13loT6u-Rp(gq>37B9OW;bBbT$MWQmk-R9fr5C#oW?Yu(O6b%D%lcD176XD2a6FHW!9p~ zl_pE)k?wGcX5nKs5rk)OHfkjdrsI9Hd7U{rewZz*EX7qPFjrElI|`CXwKtO~eDmdQ zrF#nx8Xcp)NrbDd6p%Wlc6+6R=N6b-w_#whV>0A4t8CR7%~A(q?P-pNufQ31lsTFT z%s#=GmPs%%43yw(fZkJMBUvV9wC1F#u|yW!1 zImIT+=T#lV90oNpo8C~Bs-iG<85Rk5?Uag?P*W)ss=4wit1BchReRN?5mx8zHXamM zm8b>MwQbW!9oJ?^uCnd6S|n6XUsf*9H#H}nfknt@g#zKSWt{_iH`weN1Fmv)5mvG@ zo6Ezx90t}6n%EE2oClFq*g-3=D^3sm9Rl(>aX3lKB{&;N1Ch9DECyjZ2CRDnrnATl zAVzkL>nWJ{adt3o0JAK(4mlzA11+bC$@5lO5iVEW=QA6OsasdpQ=oF-a5>fLpond( zxOQukv135v>z$Q0tvuH*7Cb`Mh_ofQQX#SHm@d-MELYuDhZTV^v^d|?L|RHbdl&>j zg|`^Ym0;cItS7BC6CfGQAq$0J09PTbmxRiqAb>{~68xw9AS@9OB8#!dU@fKL4NyFI z<|Hh4l@D<(z>=_F6H?-u_oDcXzz>GY3^bSMS5Lib6f+zBMMF%B@A`hyI>&Btr z0Ulr{4IQXA#PDuqL*+*55R>ByGyHK-e7Y*fwWa`0&(bnEsUQRYg3c*{Eb~LKc;Qmz zTG8O%rKyT&T=Q-jV(zBxkGDGo*Bh_9Zmr;rx9v`$;ElI!_{1A`>y=K&8}C$1yW@>_ z+-}|WrY449)jb20pVyd)`UZ$Fhyo1@@@bgyWG)XjMNcEiA4ZXQ8rCqVHlPekkRk+~ zqzaC@QUkdW86bEvi|ZEGEDHf0b+{jg$K-OFa{v^r7=s({gTW(kZVAq9f~L^%uC}fk z`nLyQmeb{wt{BF{Y=0oY@+loPh{`}$z~!h$oN0@=3!36l6bkJe=%Yui=eXWdl@kHF zgDzNWLEhoHRS?bXVMgO-p;o!#jkjurn(K|X3!OsS8*jU|>yH=QdZ*xxyB*f?$L+dl z+upd%x}CZlmzwhpt!a`%)5HMK)dC3^v_L3xD8;a(VU=mkDImfqjEut~JxavT*h?sn z3Djyi(3UwgOfSK^I&oCJs6dayt(IXipiKu&r#Z*csG)WB=PD7)P@Iw6e%*KyXR{w| zuAVv!Qsx|i^EF&NjKi}JW|8Kc{?3!m=!1t&z|!aiW-=x799InP(^6e;qzs>C1;*MQ z4cu1Ys*vN4RBLxhSrF~^T~fl*_fK!PJ3cA%Zb9hQb1o3NbHXF2-Rji6o7HWz^UL&H z(41bN<-?%LoGCORd7#NxK{@hf1{UudU~zy@wAwW$0HT1t)I=Oe4n%c&!AhbI_<1kh zTx;fF>{#|WL;?D@=_w#mAe)M#=cG0J3OpkS+MsBHoaM76ovFq@aa=P%Fcd-3Ee_e} z>`6maR72_)%|Yv@I}31=8A1jJVO_9CVDU6lD6em4(AuA}0L`p}>IfXb*KM@hl6Hx5 zVbe^R1(pm3*s1I7n%x?a<8H0iZp-m}y9V-es?aVJ+E3G``2te2+$nTicU@jsFXbgHc3%N6uK9JOA9rx<_zJC&%vw2fr9Xo`Z~v( z!@E3@ArVxXufb`fz=9;u6l^%kuE>K>gZf}8px_ulx+h_k3oVP>x;KqB=03QuI16XK zIIoGtv<7A#8JJI>GC&6yBR%xWaIEVdDRdqF@JIopit3R9abynW6EsgLun3fox zg?p#yT=ZI}1k64qsZ|cOT;|d8RHbsY;(9l(vO>$Jy(>hm?Txo<@Sishl3go!Pba2bj>Qd*gMmbaihWj_Y^FVHtVjWc+{^Pk`{Dae5dm`jCYX0$~+sVfdFr zrJ4tdy#{nHfx6D344#3r%JAtT!lf(;JL*}~r$XZgn=dxt$ zVKkq~8!8xlB;`D40)vpJ4q64YvARA;vju#js@`l-qZ90z$(E}i6sfL!qpjtX8}i=t z>eg1f>Qnf7b=Q~Tc6-m4;#0Mn5JHY8K%mbrx&`|u(q7p>&AMl=>V=MN`*yEj+nzlv z)eC6GQgXP%ywgct{2dv15rluUSrlGPT!J~jbROslwAH}G!=lz4FgyTmDrmSyff9>A z)*}GvofAm9?*S)3>pF+$L1Cmd@iIuea~R=}U}pi3p-(k!Au>>mpQutb=;AFaZy0DB z;irBMjGLB5f}KQB*1shoh~k0xM9S&Ulx_42{z<-HO;?v2-g{qZw|0blZ`;1wN_oSm zPHP@HYN8>8KVI9b`Qs?BK0I*SZu>3_s1;lvPS~}=FOk*t$y%;=?0VfF?{w;S+0b$Q zajiKd^~ZIs`2<+_7|{56Am=UJv;)M1}G?g9gfdRmCy{pc_5+U1(Y}E z1(4q)+DVjIxH1G+oXnDM3GfWP56w}~TYxd}0zj{hSSMB8(DfmN2}y*=U{7^}?E`t$ z4MX(=2-do;dNT*KrYhbW0g6);ZyePK_r`Ciy0YL?4BVD2Z@jy1Z2RXIT(Rj>rdDBY zO^)Yldk*kh>;YFxAknoyVW|yty+LC)Mfy3rUHFBGYrCC}XBg`MGCa(XuNUA|OD>T9 zl4N+@Ep&W2cioPZbJ7z(K%EU30fg0wf^5B(qovOdgHZ=2uwnGiH&AcKz~-=3p#2&u zNK`C<_E<3^VMrFmJ4;GNyqrNVfgCe%DZp2QyMdv78PEqyWl=HI(kDTGD$2K1dS$LR zk7P<9(aNvE%$hBjSuT-cdK$4<_7NjxsDJ4xVgukZEO-T%ham##ysI>m)@jC7{RS!P zc)69*LsuVS({Rq|+LEhxG&wG=xSg6eE@~|y{PDd#A^h{ z3C{Q6@_&J-6{OyI20_>`s7pW^ESNow5e{DJ$Ju}bMnVnh(vcCrQ%Sb3Ib+RU7V}Pr}aTT@uzBwLOo7`I=zU*6Fr@|4Z^ya4v-FUDc_%ZChRi z^wKk+j|=tsugVYM*sgmY)fyScnDkyD$tHiWPaM#hK z{TKfl#=+G`qOu~q_J~KapMs;i2`1|$1b&E_1<0~!!of2+QWq$AjE+J&?z{s6qT<94P9ciG=HXCzG$YH**%Q z`w=T|7n(;cAnqc}F_BHwQC#aC@r+frJ2oKZ0Nw&tFM!}`8WrykKnj3(e*~{@0T}=m zI5*(hzlG(?(cY2!fanxdK@uqVeb5sQT;RaT-vin$VnpDCMNuZOhXBzSI%EP6nl5xN z<`gGc)10R=aul_1-a?m|6!Elm3Y4kN|57DTfH5frT?yc44%HJ1^J1pNfx7D)q35Y( zP}ba|O$B`4+a7H?EOo)B*`By?)%C_jVYB9s*FZXjkAB;*%pYwR_Jk*{;8uvXC$4U- z)AsZS(A6o)_z*~A-O~oB@lM;Fwr!WZvpVoD`11_>bP@WZyv`$R;9onUy&H`8zzo1< zgBExQ$d5Gn*W|w9N*#gIk@7Rqlvo{rZE9#%ovh%z`)GZks~Lad0feqV+tW+FI=y z@6!U9G4HBEtuEUB-D-BbevG4PZ!31j?fMM{U5M=zYCfd5pVNvrT4`)Db_fG z)CK<-Rrg`^vlqtIr~4(gM#02rBuH)^Z61b~5144EK**uvB>I!ywH^K`s2g^cK)-5cdMn{{Uz^5C0q_(?6g+Uw|_oPHT>U zvkn8rj}pcA6PfTtV8nF{@c;!+WMR?2kSTLLrSKp1({dA8SRLSFfRGPcrxjJ@{I8_J zP(>1^btWs76+%6<2#G9Qu5;x_oNPCTC7kEV%`&VDA-<70-4Xh=q`U)|B766WZ}sY_ zLR*vmZo7cwlo1GWkwMx3^y4nfr(l(s^B;gWV8xrCN^{f%11XB2 zbp@>17qWzJok6%Xh(7Vh__EC*igN)+#z5a_K>su7q5xvUaJb0A$wy?gTwzBjmbCnsHr*Rw53gR?4B_XIa;m`|1lUDL}}l66Xe`z_GDh%S=Vob{#ztPxNI_a^XdXK1`(|R z2(w-^!R8fC%TKR&_UZ-s>5EtFTBkN4$H8qb2yeX5Y1RC3*EMVY`5m`Xu;qBd-bjD~ z*q8@-7Jq00UuvDso_wg?1_1mbcrtcJK2)MJ{m%D+xQR?4sPTS+OCcV_-!pmKFSHgF z1@|JopzWP$i#MmWpR$>tfHlTV$)yD((mw#zTqFx9eepV?3}nOmD8~b+xu<}l|0mw) zNQQPic*a8V9mNx9*N7qT04fvyQ^87tS!@P?2Y;C*hqU=@ngqiU8GMq)YFXSu0b~2= zaWfz$v}4RXxxK93xG>aD-d@#CGC#5}Y`swP!{^{P`{8!o-D7^ZJyoySet5paI-R!f zHP%~g;g8#9?e2Z-)?L5cc5Tlu-;YjU=P)}MXr2LJm(F+E2&-!d|J%6NTPyJIr6uJR z2RB3*AV%H<+{NazA^wTR2Qi9wKwH#6w7A0gCAb;Tdt)K(`PzU#-nYnl0;~qpibO$l zhv1DB^Ldp!1LkuoAT;%70T~=^#!)$G(yJtcffgCm8mtK?WZm6i2IIVj(WaMZw*!XI zw*DL7J^Qz~3^9K1gy8uz@CwIp-iXisEL*-H)YZ_%9@5y?MN-i{zj&_#!VciC&~YU~ zf35=FitXw13J}MSz`GUOkId(56|j2cHggMY?<%)$77Bjc-mVv1&kEQbK!(-wl(&5+42oT zZMn_fx$@@rY87{T%eCDrF79-q3q70xg4Y?_WU~o0lI3=#&N{S>S!=m~pxdWKQrG56bY`$ZIv;Y7XS{n6`+hN=+*Xyp0r{?W?bAiC$`2;WKGTNPd zmSSxiBbE$AjAX}P-ayiWK*_9j)U_}@;0~Bh9sp_DgoQ0e=C$Tgw0aWiCIC*b0t*)14@zunr0n3>M$6C3lnxTnOUp1Dj=@F zt&(lFU^ty`nJh^&Ip9VXL&%=J_fzKo#ZO% zaWIu2+Xx#CU`HT_VhX+^1&M`3Y$A{bD&W4=IiNRbag3%EaalhjU43U1qk(YoN5Chz zf%Bc5+*=0t1S1#FgK})(8iq=c6{Bb;oiUK?gP2SLzYmZ@V^ojyAH<+q>so^q6XwZ| zySZC`O2*#`o#w~jY=~Ohi=HLw?4?Y;Q#s1bml<;_X5~Za%NO7e>B|EJ?TRRwCjm!S z?5F%4(?ZKv$*yU)?uJm^I`dV2r(3D}D&KZZb~m)zbz7ZZgrMKh0&z?ODFVjEc%6b; zTqT&oq^kii57#w0sM!Pq83S9?{J@gYy!{Bn^AwRn8EyW4mZC<^A>iu}5NjT8bPs$! z59gO@n?T;3P~%Z_WLV82ABG>I*fg-YlsSo^P+h*QCQxU*1^0ag{vE(r43K*qm@x=w zX51g|G0rMjrqFrbWa6c_y1uP_?~y!E7vVs=`s zmW*QBol2!5uSpa>LH$y1o3`ZK$wK895$d+vG5rX2!DXf&iFQHE{Wz@ax?OL))Twq| zKTxV5)H(;mejRl3ix}RdNF53sLyu(ynZv@Ql)sF7+OzP|As}u)h&@;?20u6p@Fg^+ zDQz*B;mweCiSACy6xGQA^nv~mp(VjP@Mpy`#r$x)95-v5xRrPh3?F##n3E#i~c-O6VN2I4#*==>bh$09wGUodl>qRDr z7`&SdS6TSd0}@SePQX2jiAI=|1|Cv#5@h=$if`fSxyRCO&dXr-&EvqVX>Gd*Uf4EB zam6}~yOnCGmm;wO9a>GUCj9MG(x9WzfcL=N{u%?{WK?Br=igBn;2B_I%4t{#7(sHD z;lzD#^>c7SnK-UB`;qI-zp={hdPNsM>LE9@(l$lIb3?69k*Snc-#2^a$4qL;zqv3ihBAaXt!=xF0!)e zvToI18Qprf>M^U^wM}mvRsv9d`VF9{2}C{*1pH|hcf|R2jz2*tMq@8zc=3Id_P|Ys z;E;r}2s97~XY}lIn1`sGK<8_kLSN!oR#N%oytb&AT$HsUX3orKJ$c7CHtrX53UZ=| zkD=AYI9dXx@J5dEm%#9zM57DX;NQvEH;e*`EaQG$0Dd&LQ15{|#tu-vone(Zx=#=H z5tX^_DvC#C{kG6m4;fZI%pdQz>$Z6} z)8X$a^4$a)fnm)vrTHq*{!t*^;)3QpX3D%J0PJjkUfa&$78{UCAR4>}{x~TWdegxD zH(W;NH1;+E^Kk^`6;exspnGx{GRLhpTn{1#YvEN!&{Z2cm`1ocHZ zL+BC%RRn)@3uYv@yzvH8?JaM7MK{=zKfZMRhCeQ@3g(|LOtH5E<1X|6t80vs zpYQzge?LhCJ{h+1JtKly8>8WV4ktds4weIv!{Gsf#v|4TQG<@6_k1@ph3Gn#{?LdK zmX1un9*Lm4W5iBG40KfjpS}N|B$PiLwl?~8yfNH)rZhe|5Wp*XB8Lo}?z?a5wOEXR zd@S}F+%3IkJY_^A$d7~A{>EFzVM7ofM>u??&Bg|4j56rA0ILt zi^L{~zR~Cu-nkTuMBulD1Cl~fV=@wvsiTp}FdeSJ;lwzw!~DWS@&Wa0!|4sK87h#= zhU*7nQ9z!?%dR%_-RyR8=V&iA69MALbsB zE5-oo86??oWT0fn4CB8lVn0j-FXuDmVMXa3?16_*j*ai5XU33XcrY~;kH_H_8YaO+ zG4C)IWs7N8c@f|TpQAK?qbY-kzx3Zb+Q;X?@bv;u%OSuRL-=lyVRg))y8;{NP2!1o zocICHnVO>6<6HWi0p1Wlree_u$u%6II4>HpC{j1#P-1;P5k>X;nRoj~jBbq$Y$Y)G zP#$M2D3?vFFQ7{@O-<@ioJ1n-B&l9<3pnSt5q*O#=@NhWd%|rr!Z!mbc z6c5_vHN<=_5yKdJlqIdtO(LNx!1gd>f#Ju7;Jt%vgcMgi)Q3vV%uj`#L>eD1gZwd| zLJR~1o*$!k&qrc7yNCl%ijrf9`zw@CkO7(EpOelXY44xUtg%s0Nj<$ob8Aza^-K_f z}!ZE4Na3cp^umnG2Y%Pl-1#-Y=U>zIrn5R3ZVD%ow3Wx7# z&eLh&Xr7#s4bV<#jPP_k#8nIwvuJlP50@CEckaO4Q~xZ1C@Zv6zgY-pwYmG`0NA{ zeE_V=Mjsy>Avzetq(JgU4Ay9Q0;oL&BDNSYVyMMqs18Anz~MIHOqjS+2VBOS6MY_w zW6Zn}6+nCVId8!y6_EJN&%boJmx0>+^T9bx-yhLQvqVNvvw->pvx4tk9*M*WKcMB% zaiz|u^U=xXMjBo=JQc;o7Ku%w;s=r#aJ%CRSt6U$I z#WvY;7#0eyrqWO(j>fPY0w&XxKx4*eO0h^7Supp5XcWvJ!K5B=;3Lt=SVVevNb~Q* zgEuH!{3Ng}5|PygGSLe>g3pmZhfNzk|hw`Pa0&pvyc6%DK7z`DK>~;1kDsxi$(<%*Q9OxCGW& zB#NqJaw<;1LlZA$%2B`yG&(gIj!HaXOrSkpj2dA?Kw!C0p{FU?73_-zw3q@Yz+R^i zFMBrq`G<4%Os1>{`JhhHwr?aVS6v*#-tcS#1F4!g587?gFd`K7o&qo=b$V=aJVJ;G zVT^| z(Fo%{MKlZ?$E6sZm>7o}mm=fi6JNlm{|Ml#mvNj^sCT?)n3ifd7LJmAo)R|^?EveL z+#pMnlB;1Ln4DDD2urjTHKLQK+(>c&a{+C<7ceFWRT(g!2_)adzH!NQV|-$KT$+N( zec|y5IQ;D7{zMCitaj|Lt+Lu14)iPy;ay^(3F78d^QMIWVHy^#^HVU^lOWHi&_IB2 zVSz%rnJY(Qlaq2D5g>>}h%h7Rpuk&v++pM!?cm`e+AQmCfpvh@*FdL@MC|{ijYqvaX-PWl94)2R&sK`J%uNh!qbNd$QLk^ej<6u z2%|ua9}uW4$|(SFBo7n&_a&r|hLe5!BVX_sf0F2F!L$Nn=<#aNfbTRa(YWU{PJp)} zC2DHQ_vey_B+xHK?|mgf0{q0qS$yu&>-Qw2c|U&gez{i_7mv&zBnlBEN> zX6UTM%vk0i;m*-OYCpc;0E;K#qy5j2^%=S6vsKD}u*MbIZQ`@I*~B@LOredzQqgAo_J#4KZK5Iq*lAvsMBjyR{fNw$zzIH+UpumtU4sVtbGlsf=r zn3Ep>KauLA*)cvtA!Owyu#%}l!EI}W>R1&Oe2{#1G5i`P?Gs1}@(2WSx|Q)te((sZS^sFJ@65g}_Z)6nu``u_4;G1EOPgOq7Z| zd2u-KB<>#W*PJ+9r&-t)U;)#XHqvSC1hs+}Wln&ACqcN!a<~nMRh{q%4wnqWN*V)M zA4bVuuuh@AQa=h%z!w*bR|9v71CzYOYVBqa{5b_1C&(0i;K~CaD&efQ(RU7azw+?1 zDU4@_tkc!yhHm^7rHYpI?bNED^Y319nO}r)opq{yaYkWpOSHZ5hRYj%#R0bqD)+{3 z*&W?4&S)1_tN!`+_U&%h8}HuUWPT+=cZ+RxV7xEDX4|q*bgB#-sk&aAxS=b?Z7)t- z-EM6A*~p;_ja4}w&vS7vi}wRD|MLSTXAi=Ao(0HpUK0b9SA)f@U|qgV8&(Ov-G_Nd zz{Dn|QikNdpI;Z!WU%JcH05jxI2L+3!LVkT9iz4dz>0YkgS0FeKXgtLy;43nmPIu& zSA-qI-4S5RMJhOz$(-2C;m$nn@^2)pM;O;tSuu)b{midJ;%F_rT{~D*{YWyc%es_Csge_Ry1uD?0Zu5`OTv-Z}PYLY1>P>x#}zuNDdie%PVY|`53v2cxF)G$^@4V+*Tg+zW_i6z zFtaa&8_1ZQJet>vQ{ag$V=}`z%Cr{|SW5xm7nVI`GrxlPMBT+@8N-SZ%qASmVx|e; z2~5qzay4ZhZ9d!+OR9QNSHeTk`oM3|YjGaX-VVl8oK;9>Tr8#lXt0|HEWUYE)w$es zW|p7BBr9qYI<{cBof7&2p@GH)z1<)yv6;HEONPfb%~p%7#J1bnTOn(HOBbZ>Zn>cp zsk@cd<`#8T2<@6S>Behyo0@o(L!D5CwA@xl-|bR=1-)+44O{wxzC}-KEiXa<#F0I*34^NidrAo&GVU2y*t4Q>0v1tO1L zy|Q}+59+Sls^Gy6Yt^WKjNWML1gw~n(#hiQRm>IQKuEdD=p41eSR1M9@;b3=G3mAz z0Xeg4Tf()8whQfKg9zE)R(7g{4*=ZWkcNw;=%GuDwTP4Kwl0X1-Iazy)@k#?PJY4i7gM0fhE1}_&M=l@X0$uN zl$(R+c=IdTk)9b$3l&3YxvP8##44{`-V5ZwYtUqmKg1=8+#Rh{EAZbQ;}{ftzADANvVh2ZU6p4Y5A#3*L2<7 z^Tu~>hw3}tc-1wQ{d5_{WnJ0Dqk?AWcHy$~ zC)YHp9^RMb#kh8}2fUypd>jYO){Ff~V0fN3`f1l5ElgipE2gkCXe^Uo=2%qbV&{P^ zelWAq;hZmka}<~b6=PToCzo z<<4Q;Ioqo91_j7gm|de}P<^waOFgo_d;K~A=hSAWyG?q;b!}Qt`WA1{Na04ch9jj- z>bGN-ySiE>Y+X+>sq_je+ogH6xzZ3cL8eH(w2h5+2tMojEjs7go^Wwhmy)b;4Z{h} zkTem8fyToy8UtHCjMM`s20O@LzZqnLu;2uYo(`e*0)3Ba2P?p}*RnfP|KyGPz%qsk;IW(~W#j06`7mm8f8b!$B&t;2$SD@jMG#tmwE zw8nNCssYYdqPfK4O< zo*TrSXAs=phfm0B+ru(<$(f;&Cd_Zlx71^6R${ODOa|m%RhEG-iTceqfE}))UQ>u2 z?t&`KU}HOV-9_!~ZZ6r>vB*|znX4=6tRfx9?N-Z_$pMDjT|q^@w(PpgOd4KZ>k!qG zpx9~EtzNl$O&W0BOc6Qtf>_k1NORCK0~Hd3p+z~W6fYTv4G~f;e<0A0+?bjcDZ+^TmjU6L+Sx_p@js})rQ0~ z;J76(P0>=OTU?O}$xISS+KQ+UhlDP4 zVhqq6wftO3zuKx|+^i;6rT5-QF5TFshc%Sesytd!sxF?rRs{4OqSN+_ZBA4!=#_O6 zByciqnuxoSx`3vnblt6PWBlOCmG%<;-fUxR2L4{XLf!6kqj8N|vH2aD&~jkCDJ2-8 zu|T6ffcaelr2R>dZp_yfShkBvqgc*?>jw+Ynp421_Yq2AD)Nh-&Kd@Nrr_==Fb;k< z_W@wQiZe{|>!of@Sdy1ll)+F=Z1qvu?8;l3svO)Rk?$;;zui%XVvl=yuz6tHcw#rJ6+2 z8@rn~q^)8VQl?<01qRXPN=3GmLK3zct=nW!E-bt2^lVXWkY#CIt6m^|)pnN_$o=2x zRNI8TmaeBvGFc&0Pf3d>RM}l{^|~SGN%oezOjgk~bc2c=sOn5bpKp-BFcKb(xd{Yc z$;y@r-@>3wam7N$fN{=XLKk+l$YSs^L)|o-psW+2o+X%#8bmYRgPg-qB!V&0W0;A5 zUxqUB#lb9g+u@r``?zl=;Be|zdqP{o(4wwt2WB{nNn zif+NZR@SAAupQ!3Bc;>TV)u6I8e!aOO2&3}TgetNrO>|a(uls)SSBmRu3YHSJ8ZjR zi`cZ)xv^cqy%zV{_JwqLTTh9UL&niqp_ddpELkDw42sM_D;j+!bw#p?Uz71#ofV~>XZ$+8 zN{Ka=1uCRXP-moR7F@;iIF?L62{K;nnk}>|YgiDX%Q6yRA(5|!Nv(LWvLb{8czSn} z9+FInEA&xHv8C&y>UN5Bm8)}sENirG?9vohs+A>a?nPyXlxMxVCEc6KLQ&AwySKOG zs$pBVZj-yEw629ry5DuRK`6S)#IDbx=C1(oeF_8|@fgn~RQ{{76#+E@^jgz7hjWJ9kpnO$fl&O)MN_&tbRSpd|ZiFS=|p9VJ1QA9__{vB+Q)6Q<9DsE>st|$N!z&Zirt^=r}_L^Pr?i znJoj5%Zg6=aOIZRrC|J)sb8%~IF_msl^42ZmsT8iTP6`qm;jha#kqBz1fV8T%j9>6 z_EkoAzO}il*QM2h0fH#IO!lqZs$Q$p$qk*!vaV~adyUqLQSIp0q#$j}lXut>lQ@9w z_!e@H5$J9eLMc2s&)iRbV4;`l3Wpk(<|y>(ya3W32dPKQjOnpMu(bFMASO1n!*~Gp zGDUpHp3G3UANC?FhwEvuB%l1)lBpf^Slt}SAlFph?3t4vJNHr}S|nfe!Au?QUdWt>%T8Ct%J$e5vf z<5zWV`>tb`rS$85UBjN)rw!Y5pq{|{HN?y*j~sRZ#DM1esd@H%I3Q7=(deUw@Bj$@*yD% zvwVZCvg#$-n4|?jBPk-#j1x;c!wjAZFV1?pYYWRe~HgUwlI$F5m8Cb2GgP`P2o&)X!&f7{YH`wIGg!XPPm7_PYwNr{}6}9H^Jc0VnL`K_S7Uw|#lIHWcSIl(`c~2z(Vq0Zq zFonOv61~{1Wg}=Uv2~_ABj4cteshDd8^C4dpUH5f&ai!@3{$RvAl&vlR)~e$ei$?r zf`#CXUuBBzpWjM#H&b%_@pg-u-teuOsQJ-R03OL@KRQ~hv~?Ko13|drell#Xv{QO} zo2C{8F)`fj``HwHx?+n))g6`Nt*g83>)v>4d7E{-ahE06liqlWU1QtcxXoPFfbsqS zoAdhN#mlXBBemd#);9~R(DFj-uHa_ME4sndxh57zB39Y_e=?^rJgs_dB2-lXuy4Kr z>=;CFk|7MKv2Rh=KgH|CfTbJ`wK1VKFpKm1)St-&dgnX{L?|mE%5V-F1Y6i?10W{u z#Hn2QIhUOm=P{s!MiLuEUjRY*zp;z&_cMIE8u)ciyCu!hEdPY@KB^<9=0|)}1EJ92 z%tdgw-~T~|7efL1Jf(dckRjNkgI2(4V&pHh+>W2aj?#T5dh`a+eFid>-0e!MXR@n=VQ$}I z^buppB=5%*68019j6&6@*f$C*m~e+sX{Ld=_kx8xDSLY%k_lkz(J9&9 z74y@agSck7ObW%l+zpmVG9KXCc8~0H&DrI++|$KW(M4U>Pkqcye&;S{He^O6kUj~^ zlBL-4*LfOXI^eKl2;ppH8|_N|di4;Sp&Gt+`)*S|z>B&c>1*rBWYX`OTdXiY61QzK z*KdYbU%Gv_=y12F+qz$MU({K}8^2&A+kXGuO?Iv7NBRtQjmtfi1Bv#7q!1s}_3aT^ zU?SShf1WNEi@KXymsM9y>=Eb(4lodL2D>Yx;2woPz6&2%=QUP5i(!4-n8gafcup3{ zb6LWNZ50b!Ogi=aap?IxI8 zq&xmEs2X%XhXHi!GbPLR3 z)q0jXI>2ia!YI=Y9%ha^wLI;RV+w#nT^O*wdSUjvCe3MMb_d0->?gz^cNBm<{7n5!bsYTNuAZTozzBi+x_Gv5zn7r{jIgPxlB?*sn%SU%^011 zvIf%mXTZBqF2Re~0Pl<}P->RI-Ulu14%Va{g%9rxTfCW&IUAskKEZT?@jP`|QGAEj zc>tWMAYbaGxh@7w?fv~SF7;EE=FOmXxtK}np~p%0l-gB;-1!AzHmXDy-R>|+tKFJj zK%~9a-r=Gq!!gx{PB?hwhV2p`wu;+^jEA*bHpL25uHUAUcb1oL%l)xEce%YHkCsL?#+75q+*tA(DM|wS9{H(NHfI;hB7ine?po_kaT1bHUh$4*l!?C zI*L5NuI{e`wGlLp!5=;NJE!rNth+suuy^qWmb}iN)s793P6xh&d)mB5)}%SX*D;Ea zV0T`j2s0*74a{oIXLGo5xdCFrZz>i)rb#_sP4LU$3eMwye-0Gx6e^=7WgCm6>5nVtzL$M$JI=9oXAeHu1jLC3-6Ps)l=eoJ5WtAW?A778-aB)QlY ztwZb}mG!nevVX&LxzOp@ewWsc?b@>6OfqlR9$-mot5;~SikIck-eZ-AWX?rLR9arn zMV$%Pl-|IhTGy25J#TlLmw{y_>vrEFY!BWnkoXO%KF1Dez1YVReQP#^fPxZ%XcL^2 z0^g4Hxzz7d!<`d!x7jhQi-+I$E&%I5It?r-U6p(4$Fsy4wwR}8`(iw+-Ql2$b?rVS zj!(Y>^16Yayp@*?*f3K9L&g8yyjCoN5WESj48xNqbJEN<`|xW!V9Jkrt$ZKIu3#xR ze-<}TlDhPhzVG?;;pv74M>Yr_EaaxVu+rd2Pb%dNX8wsZ%MK^^@|`POI+vS9RP<*T1UM zHM`!p#Ct;)#k{fKHiMTGIb7w~WPTw{E$8|6K>sq*J|^=?0$6zt`s9yU9P?AC`*v_1 z{HJr;<}haLQBvyHfRWyY-IQMD6V;CEIiHJ#R^@&Y-IWd|r1-99rPXSAE@{2)wkp0* zyP)n$9nrGiAzJ*3Yu73TY7!SK7bwMZ&gucZ$GlK9N|9bsV25Kzn<5&Phfu0{q!{xFrD9)2ndCR(o$8g zt)GDr;(6^@-qgfgR{L0`mPH#q=BtczgK@2gd~#mJp1;ypSKX^O{4}^*t(xN3zh8IV zj_<>_nOXPhU9;l#@9nUSeEJpUx&>x?%?t~Lz53n8^o2dwZ&=@UYwq3l z>vsJYjVW2B<2OGP!`S;YO;I1*qG)2obs;Bv(O~A|-_C2BLm=W00RygE#1N9Z$sBEC z5H|nQoVM9-g?La8{tQ*a8UMQyw3|m|hb;V30EKGWpTcaRWJc!y1ktj}t`Lh#h6@Gv z*|p{$gWP|BUzOo~s|(tTJHLe>6xQzVz@7hPo?_laB;+#@%i+VT%71bWp2XsiV;>FjwwX0kz~;013ClBX;G-P^Uf0#aFKl)4xm(`n+nPq@in_& z=C7fs;x~3R70;xH;j_o!;wuub3lMb2n5PYQgyXCSx8{5D)L-2BpRyt4^8NhRalz~_ zb9F)C*ni~an~x+{QvNqGi0{2nT|Eoud?+bXc2?F)6MCJJ{uccML2@oOk7`bHbdK0^<(7X%ty z@#YMS7qYyl2EP@MaN-E?U*4xDco>5O z)WIdi8ljC)w8!t<&>Nc?AN1;2;xVs&Y&uU>_iGC;B&Vczk$C=MPG+Udyz}}}j*hZx zg4XcbgU?T&d73Pu-;$$ zOu@~?MBr;M+hLq--z1g+1;%3oiYx;fj>nBL+D}Q&Qul#!EVq=R+RW7QYY)uf!GmXC zJWZ-)`Q-=Cl4_|Q*Is=G4_=rGEPe?O?i*wgi)J;z#}1GqJJM&&;K67h(2KJIbF?p$ z=)d^+!Y(J#du0#^ISL4VBd8g@iY%rYj7;sL{hZ0O z)u-{`)#~w!Z{fkl6VW$5#Dj0n1Yg*|gXeo#@(><`z)$MK1N<66isyEsR*T0HsY@kKm%@twC&_v%Jy-d@pJkj&+dwB5l2(!ugzK5|Pl(w;bUe!Go{(I$Q0FGoXQ*TfS1Tlci z*~alSrT6?YN#8}^qTJ5|0p-sJKyC*|21jUVOiY9)@gQl)YUT3bL~NF*T0Q!({Q@4G zz4+d1muRxz{$QObcKl*>{dwf_Tg7+fT7LGe@Ff}AIq_=m`|rrOgT-H<3@9tel26cS zb0D0wt`EX1&~spN4n3^%ng~Ku8&%=>$isn$s?Jttpyz%PkvlnUPH-BUE zGD+08FI|36#ETm2*1wn)n+`ig2M0m~pWrYna? z1}5N+{jwx5!1`p@3u~x1L}i|bC&ngZw@$r7C(l+EU#F4S>G8GK=^YpO8}!k@D0_m`LO*A5 z68t_`;(0viWvnNSPQok(h7R}SbyS}lJjiCLAbPeO@4ZjvU~w^b@5pBhD&NsqE~kCc zkL|?Z9^=kynGJ(6J|I~fgPW74+OMz?YGiY-)-z5*wLCc*CWZgiaCjn(2d_*_#E3^< zGA8aP8D3t9uAaw(rMHg0M}gqtRrgH_v)}jI-#bfYXl`@8ObkuEaPo-MI(3;i!XE1UHs_{sZ_{`w$akcn?2y@3SUj?z#th;^?(Bt@qg^{~J`k_6rp zNKNBM(*s#qOwJ4G%)ZajBGGfXpSp)646KHZ!m`mA`!j4}!dNfmbR>dojNUq{2dQ(? z;!}|jhK|k~#w2a1y$rhQFxi%g@oAFg2cr{9WcKbUPQCpI9?XCJ@haJ$+;9H&37Wd~ zVdGJp-|U-Pg;_j!`pemaaycJ<)UxQ+XCHp}o(E+j>Y;mq z@zK5oJK~&dWs}gx8f$99J+UY?!af4|NWGlHM9w`G09%b zjKx|Mpc)#OU)H%v7Rb>X-CR#4u7)D#DYGlH`Xc4v+=O zMZ?dMcw5Kf7fA-vA3k0t7%+SF>M^3j2mkVcS$e_QwXNI?J#6mTGno|C=gu8_I)|`m z=I9gm$+HeDilcOc_@UGyy;*Ely&s=nGDbKS^Oh%in2CC#G}gx`H!d{7Q7M$PSWgCj zkK{u4AxjU<-JAMcr>Fa97x?4fr8X&u0$TlZiKsoD*}#<|OXtf;&i0YIwFX&?gyopg zN5WF7f`!F7yk|rVl9sbZ*f>slVRB-c6vTs(@ME-rv~XW^^LaeTUpn$0NmS;$ADyN( zpLYLMF-v4x-#R>xH$G53gYr{~z3_C2x>S96>D2wC;J@_13#2*J6XRcgh!n^qVfQ`}2`4EfJM8{ZKcD>;T`Gc~6oF5uFH1XM$^8ncJ3yI*L_0Me} zRYttdR*VH{(SV%j(*E=?gABzzqXDWOFF!RoGD+&>{NyCHdnvyc4o{M8d^0=|c@7SK z@Zx0Hx_Gy@M=5E1`LYMLpE#NQ=4&1Zf4p{a^I0GK|L(Qdp7h4=`wjQ2{`lNCSKoft z8;@TuT{_{7k8M7>zU++;UYfu3WpBLi`LVbB@t&EUr3d|rh>^hfL2o?R7f|Bfc(9KL zWB&L6Q^WrF2-`R2r`b%f=}~XIH_7KGY22ses`hJ|$(?HfZ%g^(|0|PchVvn|C=&U+ zGVv)vx;SS;NVW~2=swvDptPVVVPx536WRn3`3xv#V(Xg|;V>b^7Sh-+1RkGDk-~Jo(KtC~fzBxJUqW?o#G5 zt>ozkCeM^ z$XNsTe=VB`aj?&0Y$G!|uDnhbp9~c}6-0xe{&av1k}Gp?AUH~Ll^q=(CrK-ehsTL5 zMW6;v=y4D*(u=2~#_Um|#zPM;ogry_=k{@d#tgvVdFy!;kfxmP#u zeV0ytVKuc$EB1sjeu8ZKA=WoSs3*;Wj23DV4#<#(fC_{md-*3bR$lE3JZ6=R0fv15 z0I4Z#;By|>A8GI7x06igwW9+T7nk6pH1#sqgp(-&*5NH&@0|4zRyKNq0|d%qBO^L> z1&NPO$W~<2;c@ChQnn_;5u(6T$(dO+rsdTq%g++@sC@8S?-M9HUE92ftFOHB{&Qa? zLw)w*!dbH6mtKf(Q0C-YA?-10F9iLWLK{jY;itPqrMyFP(PK z67{kEexeIF_MeBHe@q?DX&>Ys+6+(hJIPFWIG_Z3`@mfpRkeP4*YMc5PAE2pokK_; zPQ|APfZ7WW%|A$7dgbEtB$?~(Z@xte_Kk0@zJc#rdhODox5z?$DX~cse`$2^`LE*$ z3+mFbdJA4d;*Li_{mAwZ{V+zp-et^Pn9i(eeY{VlAX+rQ28KWPHh2C3xm8xMjP)^? z{Xnm#^w4@34UcFv`)EXJ#e>NM(_|G67oJ!kzMOe|>(q;+6+gK2Cdt^P_nx>!0{Pad z1Jap!cYL7w0Umsv1q}LVopDYq%fX~k7_e+jJBDAgG;Njp6dq8hw@HuRY5O-aWJM zO_Gkw2S(nJF0~R|ARpk%jQ66wPiU7Dd3aVv3+&5kfrD0A4R9W8!6^q|C5(MxayJtE z@+VeVQOA@3y3|AC5sf_8eX;nY?18gCmmnW&|NYNf0Fe=L*d z{n*=utNXA)35Fw-@yG!2U5mxTv_hltd!+XtU#QFw-{(%R9U^sc^p(fIM6h7_shQVl z&ZUL1S4m?p92|a{40+=RnVWQ_0w*y!m3B$QXa%^&}aQ>C^9IX_EV2dHE3nkE!RMKDmI) z<#^GSS!KxwA6$?aEq>pF*0el&FlXU)Ytte!FClG04Bz)fy4^XXeNxHfd-r_}2^Xdi z6E($&O+|>cv8mZ9>OFbDo|=+9ld@;xve%(;e>Ekc=w$x+S%RYBgO5*3tRLS0|F?BF zyG;W@0DzsOX=q3>3bkivc6K8uqSyuk5+{TpJOL6f;77<6Bt+VZH{cm~2P6)F)B|Up zh@F`=hmxD4MB4G}uXp7yuSoBzzPmx4g5dNG>STHLoQxr=n=^L*^Q13J`B%8&;POk? zk50mk@$ZzSKs3osaJj|Xj0`82b;sL4xtmU`c+EtKKoF?);HT7|I_<7N- zZ^FgXb~mB0oZAj%l`^2u{tOOHa@F0WX64jjMGx*=sVp%IBamt+o`T~njL~qFR;FHK zsU7Xh#fS1o+4e;-TaK<4O+SWE9_sk%y_u%zezgwXdZ@r+slamLz}`C)+AQm39C2WE z1(R&IKKR_s0-?`Ap(DR18|5aol*#-`fT<-N{p(8}s~m|uur=l8PpYAmP(``0Mr$lV zv{>uDp2?yJETdH;5NjG@i+9~N#p*?Vyq(TU=6g)qfW~FvXR9hz|N9Li5A!n0! zWwNeIRb|2^0b93@Vl1k5R6f~yj)6^XQ)(|n77OoM;os$aIIT1m@6aWAK z2mt46*IK_`B067v001`0000L7001yAF)uSOFigE`bQ@=OAou|UC6OXo1?ou>BnSz5 zfCZpPKfC;pKG?9^ur1TH9uD+y5ez5=A}tD%yS=pAQbAK58+O|%w4KgkW|A}~*g3;Z z(rzZZKd_lj107_0v3WAH*|R)nAI+UQXM?lT=|<0b;IRM3p+3X9{M%ib(vo~Ux6#!0Uuos zH+JOZ=M5L$Vqo_n&Mq7dT>;k(qro(|%XOT0#aXvfF}%BYo3(55uHZ~yUEXCnwPt-? z!qrqQm6GsmD$7y;_xssnO=b@wG(6j`)td%8*5hXv+qG@h93rq;$*S3|!6FFH$5?Df zz|WQfWrH0@Xti99s`6@ejaO88b$!)|)Fr&j4R~PzcQ!Yjj)a#T$EkX7*X>p$yp?0Q zoPg`)(ldVTVr$KfwO$ctIjVX;`)VMChIUtg?Is|cOQAlVC;wNq+$&xX5qRDj7ZM|hB0?vcuI%4iDI-vk}09jZ&$+fd`xF<_5=uKs3Pm==N-_*2RO$8guYrrc)|c z^E8gpNyliM4(qJpL8)8{Fgz%4I#qg&=2lU)>8^C4fY>pCR)sVk1UctHIJkhax7J7G zFt@g9HT4O04ER!MC_s&$DJ+l(8+;rjslq3;3y3V^F9UcrV3-fY!;S?wGx%UU>{=6W znZeX#*szos$R3LT>a7TzLW)#`3^|VL{C9qQ28;$QHz=MBLRfLdv-OG#gW^yD7@GAY zo`aL_UlA*X-G-W&t<`wt9lG{HyUuDtf+lC9+lBlSBv#J>-m-G!u3B@uV&n_8Hmm&t z?y$CmXCol165c6pH7gRn;W)XxgsahwQdz=*WP!4Tr`>eDAmBlp82S`^@X@&0adud` zg!GK<!vd8EFRQBoQPHq(5gTX*9{W!c?A?7@mH;u zt>J;|)?Fau6dY6-dj?s1Afb>X-8LP!V>tiV15%*qhJ)f@?N_X!DaD%5Q6#2Nnvk;A zWL)7s)Ryd69L~m-MkH|`)TIG~KJcFmS1ctSt~4TXg&j!Dq8?>F4Q|muVY*1I(+ZzV zhQ&ZVNq7k$w3>o<1kubmYO9Vf>kHaEf(IGab?H0WcDq{IKx4XCh#Q%d8R1YBBioclgN2WU9Q1;psgu=?UFUAC1{ zSqYF*^l{%DzV2Mcwzo(%sM#!Gz6Kvhe8<&Hvq?%P8my_LO2INCDK=^`hjdQ4S}K?E zpauL)kePtmM|h~zvZ~}rSMX?yZ*G!;a&jz<8c%1jdm}L)pH{xXPQ4FmXEW!tq%|{Z z+yy#I3sHbSo<*q_oI1dJ{p?V)UzpGQ=4O6VnpOCoOh%ejlu1>>?I!#LTxobBF|F{I zlL}Xn(;EZCydCG=fVB1%$Ftk$hq$}W1lS*?;Y$Gj2jjZySg$0M#!D;CuIv0I=?>6tuc0NXcwPl?Z&$v>Y%N$X zKFOj8Uf)i)d=eaN*Hj74)_{ugoolw8YI`5Q?y61C*HDYLEx#q!WEZvbrD#AcOSg#! z0<0?Unn`cF>+-HPxFsnGcRBo#@D6LOt$7~J<__l)zQ%HEX$dcbr&pG6bu-7S!qa(f zi)S*z)j>1lq&@$^aS8=V?Tl)x83_mfCJ+#Cz1b{X)XYFB5GbvRvo-vQvqJQMwjg>2 zC^Usl0ENbMP)VSTz$UpJK8gMy7!Dwb^G>fYa1pRmJO%6MvXrLtFYoOrPJg2r?-iS(gshTgBJVtBQb{Van23zGh zyWj{GBz&v3wN>=Sua>LcIH?qqPVjMsJp>5NBy@F)&w!IRC}i}f;4o-_-B*B&WW z4jMxV6v>M5Ztn@d1*lF;f&NtC#Qb!`HU38$4~!2-ALKTGZ^Kv*!_Dltu2?!eCJ1N1 zp+i%rYMw|RPY?l(|Li~EXMWJlJu#&b0R0e*pRa)p>i&iJfL64idR{zF!RLDjvRTbj zH{j~po_C*_se2N4KEt=#&E42yjd`&J2eTCQ5W3clrKOC_rByCv1gMquG$IG*s4E#F zua-7;B)rAeSWCiVn;VV?4+Ns6l7x3udzTU2NV@Jt1Wp8`P{NDBA`g1wJNccRT?VyP zk3rRHwY;1N5uhP(5T-#i!G<*^ z5FS_E=7XMrJ)}D;>_xDHjWM6K(s=cc&ZI-eqq16}#;bui|nqtV-`}wAMU0SU)ZTp;>1qmwQ4e=@JAC zT6)J&(^5y*3h7`_KDv;OI0YG#2HnPxW4yuz+$4>tJ*_l#u9PTAfEcJb$Z zAp9g;;Zgv<07a>wb$bs4X$1*62%H=B#be!za?Mf5uP6=CXh@GK|5)yHUz4N~0Iaq9sgrh_0-;N^1@so59@s_6-gs+Gno zC}`kYK8yqYj&{-LbR73nKfQyCLAH1Y(6)YH680@%lHUb`I1GP7r0DV*nBA{w&u3E= z_pg2QIqLQZ&xlXG)aTmiIYoRXxYX?wz`?V70lc`jir|oGJGD&nF*dQ+&z=mnw}ufq zs;61wfM%-PiB{iYp?!XKxw$=;X&<1oW-!Hz?jr<;*pVOBE*q@XanFmh(T&YgS)9EL z3Uh5u-UZQIxhmm-e5_#+2fgD84U z4%P-~OG!A;s#uipE_b_J!fo(dZ2?y-DS9hP<6k7goko9L?>OuX#J-L107)DmYsH!X zIU9%TCV@C-k)|n(tp~s@woTv^ogaIxlE<3zy82{EM?%P_oyYdU_`C`D4Ul0KmieJ{}XD@>; zO&vt=QQdYM{hG;&?RxVL8}0YAs}76RDu=|`@&=m(znkS##_n0}w!~S5{nMnLPB%WE zGM#d@y7`CViXAX=IdO%_tL2USLj>0YQU0oS)yROYz9`N*kx05A&qDYIXWJ^6FnJa< zWh*DnUIn+M91 zj{=&1J%MU51WImy5MM)Y|gBSBt6j zfcHT))@`ct1n3J@^-g5$6!X3`yOy)Jyc5w4hjV!%x}8t8c2A@#!KgT)XFCmrxbN>Y zv$GS8rT|N1YKpr7 z??e_vtt(D|3P{f8c3O@nc_6b@Px4|;J{H>*W(T{3ej_Sc05=HV&6PfdB5pxddQe$D|5o z8~+K6ff^Cqd^QXhr+|2O5_-pNK#<5EMPKAO3<_SutO|EJjXkGLM`a>|Rd<3StypNc zDW`3w+FhHHs4q_-$5`VZHFGnU+i`GWXQQf? zDR<6dYa3-TmEvab9=)EnhTzS97KdPmZ*Dda&9$sZjH`fnyiIq5{B_OTjzk#4G&TFf zgt?`vwJrQdgC_)XG5rAS1qRu2;CsKOE7p^M$slN&zd&@n5;qOUsThsGX*zI;EXeVg zZ{pJ!=2|nrywAYDog}STlkUZVT5Pk z;yE0yg5*1>gL^d>1N%|J3~u9p0;QtD_|FiJ zrj#yhrE2Pyob#zvoUWWx(rwlHzIMUxrkl3>G-p%Ib>vJ@buG0Kkaz8jI0Y`@eO;s3 z@@AGC*N|}Jgjcl-oy}5gO^#M#Ya4P_F1*8EP3S5weP`-Ix~XQ}Pvqp8lP<`~vkNZ# zf`hvR=r|IN^CA@qukva%>P?9i;g5g^BVzh$HUgn)3V5sTIzmU;tg)$uw}h}*9|MD<)|4x#T;2ms^At{eKnwNK2-)Wo(risv5%(Wu>^IBU>kvelD&NeB1 z#xh$%QSb^1Pq=yi8`=tM)szh;m@*ol>eL1^V$!jhD$Vpb%VWiHJQai>62%HcY@k7+D$EEM+p33Df(C#9xu zsoc~|FwBu{9Fu`^YRP%02bzflLH%?dL@AZ(6M36;{E55`sEseb3%GqJPP2X1Wk73( zVRnXLn&vW2nqC9Zc`HF|Zv8d<2j-U_18P|@Du=iOFN9u}52%ttN^S#Li&Mg7vJQd- z&4B_t8^?T_!XbLG9syZ-5I>JK0`52WiJVxso#o<{()AW^d3jN_sd}lhEQgra%Zu76 z)tgh;QnS0MwNz_!H?R< z*2_7qmaK|+zG?54XlzH=c0}ZQz5<7o;21a4g-9gwI1Bgs+3Ufe8+26xSKD@5mGCVf zbxpw05`CdGVi=hJYYl}3oM5EbuY(A@0+MkBwIXOM_;vo@9=shh;|iMw5letXVkGlh z@ZVnprOt|fTMxlKkHGQo%qWeS7|{6`YRE9qH-b*`?;}?L3#8+(S3m_BPJrI9Qp?sV z@(p<;ABo5}PuJ{PP{P|T2XiIhnRY7Ml<*ATB_rW&Fi|N9Z}I9*hu{;lMkZSQipXVE z^EJniNl>@b%uCv-mC7#PRKQ1Yy@`vBKrHR0YIj5)^cKwOtPlem^Xo?x9!G|rbn1ng#T}UsZ2#!#Ls+xPHYM8Cd4sM zv1pHFg){8yQ_q3nD~d@UB;j|_z-S4u`td1+fgfg}CyZ_zPHBuKaQ5LZfV{* zvEvwGjtsL23j2BDA_u3a@~L3e8e5GN1gm~E)7%OQUe#+3=4IM8OEupX^h#x#wW6eB zHtX0KNk_14PDjE^+z6B;JTSx54GHI2qcA7nFF1x#k>IXd>3VGC#(3KBE{|>o0s!CR zXBlvp13?6jfq(7hHy&lvnqTie?$c~7gwTHEp-Fp`migcplNUX*Z}T9$Coz0SITqqA~LX}p9bNbCuaP0Yw? zZz_C02rGLUNc$8}@845Iq*%WNYSh$p$F&AQEn9Qwx_?HYslqYo_HYtQY!sZ$g7{3Y zfD;~5tOyL%_yG*1V+4CxSNLHp@o>A9ukEAv;h;6Rd{31*k)V7}r`aq9CA`+DI28$3 zn@!e~@a$I8^{(%#hME!Z*`3XD?omp-W=o}=Qb}H34yv($hw4ma#6!8Cn3QB0AJs9L92E7KJXBLeiRPct$cx;?-{$v$pL8_U4sf( zni>8bkjY}Ij?RE-WIJ0F%kJ>f8aW;t<#K@h^=fvm96(G&)b*^0%#2QRo8qx8;F>NS zfubOPH}6#QaP~%~<5&sN~^bUg;umd|x75 zXspD;k<@(L1gT=%+;=*>4NNR5&EOs#!j{{>z)vP{iXus#2Gh{f02AhRjE>RpLjZ;W zzXN9n&_xVGtVDCS--)9jU^4qnkr1$+hQECprQUE_@C@olkg5&_QjKRYLC!01d7d(K z3WFEy@Z)kCgY{xq+kkhg!1qJ^YgW{@h!WZQj6-RTK&l<2974*?x^${(XHt~-VBq&> z$g9hCD6%zUn*l}<*AAeK@Sb)8BGip?yXgQ1O_t)F;8{R6D}VyTcs|Ve-^Ewb8|qFD zksU6b4S`cy;ydLMIi+iMtxZm85Mr(%j;63%2@|djlq^wc#EDbZ(jB%Y(hcxKR~7sW zD%3#@hZ3Q0vj==iFGK)mCJ#bvh5=tj-BKx^V9kR9W8atocLInxE9zIM;1=2XKY~}8 zOv(v)bS3x2#ng}==V1Y-ljMUy4BUGfT!=pebYo)e=NQTUJqeOdDO3nbDh?3r^elMn z9n7~jz=~PF4mJwHolXNQE-?>_PmWB1*Jx+E7D+_Zk@*#yQ^utUG(i_%&)C-gs+n6g zwq=vs+%|*|8To3AFcJVUK+eBYOC?GcY;I=CR9vb0c!y-f0auTz(0Iq?M9-SbDUdfi zJ9!apt5~^0VXeAR5_hFCU6RV8lNJS-wJk5TgSj0MW>h$xisf1@eBp2b)%iUg^uy!~ zip7)(o<56UFo}nDCppc>)<8GiLqdnq#{UEe5s!-y==T8G`vG_xQ#`0(QdE=& z6qpHD8a<%JazLL~&|9zKY1C1FB~sbo>qEFZ5x)-t-*Fgw#(xs%^er$%2Q{YJ6bGtgS(m7iZS@t1`R7u0ol42JTv<3~XH-#T zS}fW{75UKSswjxHTN_S=l+PL~l^r_TsB%i^tf=d0cssmoGiCJAP|=Q2!vtDb#WJ^C z>>KRlZ(u^98ek=_-XOrLrGWIoH&tdx@RpNyy)p+h;<7l%+}PNtdb7L`5OQxecQenu zatYljSWWG~b^y1Y8it5SQ!@I0h?d;vCQ=r@&HxECu22 zKLTQ2(9thcSQ4cV^_NjGm>;Chn#DW@2^#PP@PxwGVmM0})MlM-#cg2Wpvt>ANf#R+w~xRY;@8RF%$LsKivVQF=T6cy*IRQtH1 zs&2GH1T26{NMh2gfDt3X>9p3UrjnPL5R*VDAY_X3c8BCzbqe($DWr1{8*lF9cYxD? zRlgfI!S-)%Am8Bx0*Y;L`&mml%T7Y9yiHY!dTSlai@! zaK6M)>d!%LoOE6PF#?L@ZTNp=!N3n=?=Fb3`xLYy6$fLGIwN~R6QDMfVBynM@ z8Sx=vBemx5Xl4r3G9$gW)l}(%CRksh4s$jg%5bY{fRlc6t1XpscAfT&&{S2YQXpj7 zj?)|=azl(j2@%7|k$C_!6;Lrz9WH-)2H2UqwKaz*nQ@(9QFuuF2ii)@ahw*~CY&Yv zGtI23s*1I<;dO=K&;btYR0LbBZ=QfyoEQ{WQ(EpTPMu?-*9M8O7iSL9f% zfKFE!&B-5t^K@kzY&52ZMoA153yit-mkFGz`K5u5Y`AID@?CoH6K&46#bz%`4r5L^(hQzw^dzf{0mJtx?rhHtTSfM>^o_8 zfs<2bNUV#s=60VrTx|<&cE5=gl~hx0W&zX`gn-W?CoLE45Rz+w(k8OwY}6@p^j5nD zP>U2D-|jXy=%{NrHBxy6gFC`O12bueDsMHgu}Ss>?7UbHkgmi?hMGaANT#M33<}eq zYvpq2d5{~Wv%oWdL-w5qQKPqp>8v&=+WAfM`RQ&i>y3%OEIx1#JzM*rDS)gTah5t?+nEVc!Lp zi;C~Ql`t!A#{stsS+Ilk?r{1T5`+H`eU0CyDsr-B4P6%w+iQt1x4;fntU1jzuu>7+ zL%qVSmo>ACm6XVM-NGCfYKu45Nep~#RjREmU^z0zsV*apmUUWPL9@Kd2zgyr&I{sI zH&pW9)SQpeIDAg6kvK8eC=hS28m>blyKc@E*1cNJJ3^6_OG5T?4yOsA6t8FKSv=?p zLZ#O_6tjRs`+7VaXy)Q3$UzbPFum2X!hk0;4*CoT1v0c9`4S1W4Fa}JY!ZnS(nP2l z+(Zs)S}q1qI9AfJfBh%{{ zVcsD82E1p(&wDn-qy+yGekXuHV5Vk6q4BYA1Wx1Jo;uc4mG{soQEmgdl0dE@O&=S> zX%g<&BV(bDa0>Z2O_Q?&;4mtr4{?mp8Q)1C_levuc=8jtuxV@@Jc+Xt6BD?$VB*x& z@k!E9)6c&2)WdXiDR<-A>&S#lH*ej%K}>jav2csD#ZvCtjT?Ay^KvG?hzHA;U&;~W z{;k5wJEYGZ+CE$I_|teWIT?nxfrIgpk+BdS99D*g z58*-o-o5+!@t|*S-`;&Bq(h2A4#d#@{=p$U=Ra# z!UF|=crBs$XIMj}hsJqW6Bq-_GGnI*cgR=z_6P4*K8J(Z%BLTHhOYJb*Uw+NfM-rb zqbH(-gr0;sdic=DD5^-MzkmNAp5C{2-`>4=FgQ3gNRXg1D3+}B26_U$zd+x#?)Uu( znZ7;vL(>-yhbP0r^l4gL)97O0BEsSK%(2jDXzWKAgG^2X%ihCPM-1>br~!5mZ^31y z;hUzVMvX}FKIoEh&`!_#PtcqxaNso62#^0~cA}?&`XxpcQjPs!*AKplNKHqMPliA7 z(PY)hN1l2pE+?x}+1%yVM;i2(~iE%kw2a*`oE(`;Y1?6lV zAb!tYc^A+Ebc>wh3o5Fd#k;T%w9GyUN3G$P)1XY94*QrIyU-ix?d_Fwdm|&GqoeZ1 z6DLodIwfwTiR&+aj!UgXB{fEi%CbH>X2ms1w^&076V&wB=o5Ryf`R@P5z_eG=Z+5C8I3 zXavF6mGJ$bdirHSJLi9JF#z%s5Jk)8p@Rnx9hCQ+JaOXW$=wp;U~pK%d+;|TmHNK~ z0pVw`_DolJQbW5sI<^`(jfh6o7gPB3io(x=q)b4B4!#gXfS{8glpGtQ+QP{xGz+h2 zxU|efQ$NmnmK95xQdp1(Jc=<74IBcU<7=dV%AleeTr6123(V&F7}kY7PRkKzj9#>BMJ2u)Eq!Td#~k&GboHTsr%#MNO*#=2fmZ$sYjoBn9Rltmls|qH}VGXEMW(< zig1~4yq;Yo+qdxC>kEXYx{t&)K zM?-|K;h{lc;P&AU4+e&Y21sWsgZqaR(%C(JTp$fT!StJ?M28xwxOx0|^!RbiDgpDV zblsjkd-tLW*L(bY60mj)oCsjN0bsE)V3>2rTGs%DU(v$jn55!^fFO*AXMxig+B8|J zbsW_9s{mIp^`N223;^bU>G)kx-gn42Dp=wQme35Jn2JuY{?q0|&tG`zVSJCvi%Sbv z@!;0={1Tz9U|zdUXq*4)CFHJ{`NFju3uF=R+3% z{r&wIltv=QBIM)`4-W^2$)ykU3X{l#lHI0pY8}j362A0Fz>6}YP~nM&>sNG;$ll)5 z0=GjFV}pp&7cm=?1mT-R9jud=jlLJyJh;RXnN;4J2!|R6fM)}MzksHPBfL0uKRS~- zeTuOk22PskOV?k1NwD9d@VKsD&o5rb1M`(@Ih4|~^Ur2+;qS`)%JLG4<_8~sKt98} z_wNXQi>Drb;RQlic>Gud1NHF`%TJl3hYlPWL2qH8zpsCQKAR`e&k~D8`}g+l>mwrg z!8G|v64m4iy1IVKT=!wo47dmrlQ_u1g9i>C#6c`8q4)OkInY!y0*gNdZtDjmoSA|H z&}F!GAG4b53{J0*aRHnGnwWn|V1|jPo?KQniA(x~XD}Q$C(v>JVDIVhgyqMDBXHNN z8ZLlU8hNl$qg-7w$4}^yN%X~%&t{)^6hHmKVnHzC;_{6GB5*dB%`GDP&8M^T#E^yT zb>WBId$05kR;7LM;KAJwKG|a&j8JOJ%se-BQkuA@U%!4nBj3|36mBef z{VBlo-;nU!%U9qI@WV`RKzPCgn#K-Rg597g|xyKgC zh(8jY&>q5^1kfD5<51i@JTy3b5Zr@sKj6|F7#ted4-y>?@>k>LUa&Z%Iz9XadK+J8 z=FyR(M~4OEWOIzhA_s10t^K3-s*S`^#Y|2KPPaeH{X) z@gR){HjHe3FGO0x;P?dJ?QP7%CzZbZ^1CK_h+{OxgYnP=CS<~-9)Xo^#W8~4kELE% zw2CY9M5)La)$}Iu#0r+yVLu0v`1JiARlSemaud|64Rn1{VyVLD6irXW*ps7_Gman6DDYNM)9f@rN3`rh^_~7Es&@vL&AaS?+xrlOCI)H-&w|x1&s88 z;bG*si3yoCfXH?qAzG?XX=MfLtpF3@8iFTj4S|?M8x*DGJR+0-as|P-h2Ee7sCWf9 z?Nhj@A4K*z_)KuK^+#}F0LPsPhyD!A&L~?D>lHytNr{3Z?$_>*h9a1KL+^1s{$!M1 zaQcGzEV)6K7H^oBNj~$}g|B!yw|JQ#^KZRVm?!pouxgXj_~D#!{T?2?bbLZ18cYKF zO%RtHNSa3v9T_A0931E$RB4vJzi}%Lp5R}_&B49Befv?8d-(ja*@L+!WIXf>i8m)E zCMPF^r_|Tq_e)HQWeIv9(3sJ5=6lk2l5qHlJ{Gb7C+x+Ts6)f(9)tApB=)kvEJ--@ zVgO7&12F}o6S9JU+B1UV&`+|0Z-VS1N5a3K(a5*NMT(;hu-*JoNspfReGs&VT-?<{mL{M?;AHR)4br~jpgg)MqgbhEC|i_*6K3(mG8X&p8Xykd~_*wi|}~y zWO#<=J&uE)7$H6hB+Ssrkx@#K92nZKlGE1@KXMueA$+IAlG3-AvM0bfZ&LU?gg@lH zN&E>1b3bwHFYtE<1RcD`09;1)c|~db*E)seYyh3>B*`jQLFb*pMAIz=)33ZQNx=vQ zM6rjLg_4_*LssD4madP6&g?tsV?7kljbb_eD3#+MqjLQFW5=c@LW1+O=U#h+Fb0vx z6*3V^%XbPC-pyZM&XeP~aQB@RiLuiAgt3q3Ghct7kQs|SPVVMZXl&vbecg#9(8|!v zBkJJr0c559z&PYtLu4|qnQH&Ofgwa^uiw{0k%={wq+0y_0|Wb!70t=;B>C(5&``st znLh9)eQ<}bSyIk`VmQl`e-e(}$1JHIzJi^kN)Kc|o$7F`L2$Vt;AjlqqNQ@kc-ACf z@*mJ~M8k<1a7u(MPwS%870m@YG=A!$Li6fac;6sn3%2@eNm`Rft0*gg@n4P4PM!)+ zya0wH@$^fN%#iN7a{ZQhm5%P*y1R4>qmaeI@*?$@nZ15{bqRIe+xGhpDB=0>(uI2; z;lawxiD!vhA08i_JS7Zm40DW{IT9Q?co=aqw6AYJnUDPgLn1a-2l|IdMECmr6oZ8Q z{Ks)jX%e=;&tZS7q5Muvpf$FpX(b^}ND3_A0_*KWxCbQ+koON{5v+bJA4pIgD5ZRk zB*|J}f$$g-iv4Vg>}!Kjt_VDu39%rbP2N^4oY`E12uLBU>EmOTu7NECyYvBOK?86~ zox&zsCQdGlVr35K!YOky3V)-Diht!?au^&WsQ*oJMhm-dbSgt|*%O;YfJlRiy&jxQQR&xga zp29LeGR}Nh6C`+`Vf2EH&d^K8zt`aJKhwe!Y%^{q9)I$Y8T1FQ=JWGpc9(D6S|JZ+ z;l>TriZOHP_Iyrc>PsKJwL;h~Jy`u%MA9F<_(TEC%F64jl zR6*9G<1C0&z8F;=#4H4;(V1lmAhArH?}_7d)lW3|yvXFl9>87vp|3nNL+009Fex0o zdF$5gWuYGz3uIBQ6>d^sZ7#n1Kt$B-~6WEPNVS4~X<# zc+lukoLd7wacIAo#~1`d3xXaC52F0{?+NVfNAcya5ZcV%-aWm&s1P6mIZBS@(ZffM z9L0kkWIa4!J|DwEfiV0}S5oTKEKWCp9X5Nxu@v6pBndn)(I1P7@kT%V_cXeLgH$&H zf(`uIxCK`zs5U_rCZ>eHgwuT-t#L%g-90ky#@O#wu<7^qp7dG0m`4Hoj?6s+3KY}& zfcSB&&k0Ym>8blu(~nJ0Gv@c7G|yknT_p{8n^yeZm z=DYTX_urx;=g#~G=!&m=_}J--cj&UY&}j5A9N`p1#A2=pY!k6)=zwx$6c2`hN6~4V zRfce42>9>zOt|MB_Bk5@2AhIl?v42UBS#J&IZSQ;%u&EL-Wd*{xC29(J_cBBpk8Gn zJ|Uk`{qm7l!K9fLqxQfo|xH{(Q=u0J}MkS-sOUk4`7?L+9of zt|4CarMpWPm z5s-c=1DXhVsmLP-M+vnD2O+>Fs|0?JB3z<9`$dWf3p3I9BopRA3}`3_#2=mg9w;|G z1~RTI_n25-MM5e9!tW|p-!x&&8pQ+}u;G49NHwTZzF(#m{lHwlDa!a*$3Pbxhk=GM z2#kv?Zs4}k;FwHAum$h*A`xc)`yS=q%C112%tXbg9S_0!aQQ z*p5hKGHe5yqYoPis_TAc@kaJFvP8FU-WHZVH@_(IJl7Vl5}V$-`Id0&-+S=MD*2)J zKX)phAV$A_@w0Cesy_J2iG_QF$Hj?JjZ?^&wC3aC32SeBW%R)Cp`+B@R8`~*y8^x_ z;x@d``Y~Xj0k1utn8mpThSdVV>mvT%x0hzwF+`Gaw`{h?k<9|4`30!@MWV6gSp-)o|GMh_-7r!~Om{}~s{mmftP z3JUs1drt%MnHAT^$1T*JkzYG?JDPc?^x=DNqh5XQ+m%l#clO}H{O6zH!AGg7w@97d4Uau?2@k#kq4`NX2!~`& zXB503GUda7FsVfc1Y-LGJ-xzpnofv_`g;lR>B0R%E!vM|3tYsMVP8p4C{0oYabagt znjYw3O^u=&KQ3P2@o6fXYJ{Y#8PX}APO&+JOV&RiTq@H)#lny`g-XELcL)?rkgL(L zAN7h^ecnUq^I4h_LNl+4fd6a^IaJkV$M6IFzyOm`!2pvFJ)Jy3ZqVZOOJq~7-M%5h z&D^|c5~p6dlDk5AqwBW{(%XOc{d>YWecP#gEEx0s4{v>rm|pqloPLk`T$&G#hn}XP zo*xZ`(foxYSV(#F$jAuA7Q;bR9j2Ru>Yy4VuHJ9`co}7QWnf@naFFIhC*Vh9*)OMr zP)~%}mqVJb#LztjRL%r_q5-j(FZT-v2vH1-rhwQt{#Bf6d8s8`JVE5MR^9~T^QP$9 zb1p%dVXS*VpB3!d+%j;whD&%*B?AU6?3#)zTd~^+&8P$4|5pipVw@d>*eZhlVR+`r z_{k4I2h8LaFFcQLeQ9}7%*rmzU%N~aKYuNEl`uN&P>a>FaK^$I6e~(Gm_9avZ5okX zKn;W^z6ux(&lnncJIQMcuhIIM*Onk|BK10NUZbqi^=k`a=6fN3TTBJz?>>;8!bhLk zlpMbOo9}*`rq|xOVSGk&yB{XTFT6`UKQqRFrrouVnw^z zyRV;89cB;Cteru|8`Q&njqNz-FsoM!4>o=*z6zvY_xWsy5B;pLYrpt3ESy`XZZ-V}>$Apo#c(4tRC-W~_kHgu9` za0<5KG*vMABg~0nUg{{^IxJ!-tkl36-!c9*px3`lh9`Irob64RAuI*JI@j?D>t!HY z1K2kC_*4YZ8@;@6j^dxQHwsHa?5`~@5Hgn+m-D0%Zr*)&S>UO z=KCL!S5SB-ZC68~BzYH)hC*YX6zt!N^3}vs zv;~0U7`v0Lv?0K5V}8SH%#X_^m}Yhi*EM8KCGHjA^)ST_{$6WM7dt1*yIjM<9@Q|6 zY_N-6l>ORy7sheL%HOaQI(Y^klr%O^WLkc_y-iy{-{;wk}|iNb|l-tu;rce~y?7GBHNytbdbw!PaQ*4{3v zUK`JRyW94<64o**^O_#k)SB%zL(F#4t_M#!o2(`m0IPvcO)gg7Dy!+XwSYDmGKz+TUW3 za{2xQZepTKTjaI$8f?HeOg59D zYUvn-u3NfjnyQ)$emOZ z;PCygI3?R9v>i6nWtMeiceP@a?WnT5S|@ME$`ZcWc1HyK$gInGZAOf40I#Iw=&h2o z*%D7Z7l=kx2@Y)JtEzmNZqv5q%VW4?@-BSl9q~e~Rx2l8Xb0QMiwEnr3J$%#z0MTv z4O&(Eo8tDf%9O7;8Q#7n-mm4fR@deGwLtU8_j9nPx%c(O;?|aY5n3}SU&Nvm_M2gc zPf-UVM^X_p3W80niNsY9cfrARo4KH5b6sXSSG0(Hg-g;pnWy4Khw{}%W_8S0%irGGtx-{4+5Vdsjqm3$uhCf@iLn~t`yWc+qvTt{ZU;$B-}IRM>DA@!YhN##8t<;C&7Ao%+&>v z{Uzq=c0Fcvm@SxeWY%f=G7k%EjkIkh+xeO)mdd7NpV~Ih3M&AkI6JDxa*=$%=D%Pq z+hfsM*Bvt$Ct> zUAw&J+HLqF;lNZo-Z(MfH;-#mjHSHych;Ttb?^Pxoz}WU>Glu8+7fHw3NvZ-*IVn` zEol=Yj77GkImHeF5dqihF59nNp@o~`uJAhNzmF;g7yqeL#tE7StF(Zp4BVONVLy2< z{A}V1aD!pU`wZ)BVivrVj%b(+j5sW_cVXewKmeM+-4t-Gp^7^(Ok-6DFe_F{U`YvP zQBK4!BfA;r(EyHudv4(}Pi!^;%u?Z=Z^mJ~mukE#T_>}mHaVA{T8Z?fIDP8qY{3p} zJtEqWj5HZ@WE+x{-BjDMJxLSTO|~bQ<+*%Yc11~Vlu};Tl0vzZ-IABrHtLSo{bX&s zxv5I{26LGQj{-N>y{0Q{!*L}XLc3D_QR+7RlH=q>d*~4}5Ga=d^5xxHw(CmYC0NIF z5wLVSbyrY}a}dZYIWS{6`Qd7c*=>36HYlH#q_MLKKM#&ZO~UaKk0;O*-j;~M1*8H| zI_DM{Y%Yp&@rmZ<~R*n=bKO+-@NiiOmM|Kcq+I`WoTOAI?((aRtV!n zL{dy8V~@8tsEy?-xCT3gri+Vy0bQbi8y$^ zJfa~Jx|PrO2tL4FygWW=7b{))*%fD1?Misl$>h@#K9XrN?|QXqH)|5E8kIJBoakue zcI@^c;oa3BoN5d2?iIHj$VsPgYm-%L(phXdY_lriYRdI_aNyOfBjL3*HEl@v4qq!p zCA{jy@_7kYODYRUc%@Qv<@I_n$mX?cOaM@YUC2Bcf zYdnnsjNy22aD`i*D-0@ZNwMY=%9%;+K4XOf*qvz~88Q`uu`RD1ZoTeE1NV!ns1=lH z{wfd+djmR7<5pZ`n$Ao?yyJ9^`tjyNSS5kY%h3XH5g`FtXRvHhGo6a#I$!vxlQ3@5 z*715iySO_9xW;!hvx80PzYx8TVTdB~4lWBnPy6pwjQ>Tp7v_uDO6?%-D#jNuN_r%& z^9ox4T{DxM?bf*aJ@I7~7Rh$ymsQk)V@uPmx^^Mzxd2;sb4$X(x6EWEyyjGzZSVS) z)2>N)inFxmO4tE)vn}Cvbd^;+S2u6(RK4--iq9J-%AHzW!n2HZ4DWj0VF3x>Y_YuO zdQ=1DT{wt=<6V#2y?HJS?v3PqR~3H}?yRLdYZBhYz2^iRgY2+ouIE?ttG9*2vfkoJ z?G3ah+pmjzfpgfl=jMRJEZt%q49oD82@Xraxh-NO{;L=tfr~7d)#DlPgjc8vm@1gq zknA?2h-poST?H+{ljx~jn}Q%IggpVm==i(_9D_;DAR42J>l6d@7@9XS(U(@@*KnT~ zSHxo&D}N1l6zsT0QM{40h}wq-Y5#;ACXnOctYCY5aF-{wYv|^>-}aGcpkR{Vcg#=InS+DVIu~_HeLInuKFcL_S>y)tAu1 zWtPH5PU()bA-@yDLU9Sko?uDx`8k0*eSOv98tRH^EzBBc<8X*2@ISEP3oMOW+5HcA z-!X6v`EkumgHN0O28#mGX9Rr*6Bn>$ogp^F!iryDg!ke!`;Be@)iDoXyKjc>$0Tl- z<+@M$DW{gkW*xu>xCZPPc2s#rw$yiUZ3r3UAT7l z{;5?uY`34}hPvq`D7(>3)!Rd;(;5kQ`)LKDs^Rr8%-7s)Z=4aAac?uF%4T(~BU^5k zS-R@&LgTb@-d0emS}J?nZ>7^~-gaGjkT(Xj^IKrHYcj0~*Og@hMZMFpMzk<*^v1Da z;rZ3Md_FH1`@_-dsvNwv4KgqLb7J4Gr`U;}A6Q_bV@l)I#CdE;75S#P&2{Q-UEWs2 zpG=OfB9VafAj2!zOkcu7UHHjMNQVS|rQ{5+Zv_nWlE z53RN^&?l`}J~Rus;Uw+B0EapnAS}o`17ls3{ok?t2{Z;q-M~pb;$hE&68a4F%tes; z8sqV_TClr=VhOT67aS>gjeFG^^ER!tx44~>aJ$Zf841U|UOjl5=hnD{bIvw#Yf0=~ zRNf4TUPKcRUi(UpT)I+bHCvTiq(IbNk4SjLU=>@!4ONY$CA^ewakCQC46u*fdRw%J2W{^-*diY3k1e0V z+klo|Zt$#Qy9yBgbqicP%hApP$^SpO8VW2-Q}#y<*Rhh6YA$d$udBGUa0>GdxCHDC zY*{;{QC$&cQ9Is#Y7b%SHYZ80pQu=SIxed8ab6M2Uq6$rX)D-99;dgzLoH&C2@!8R z8pj54&tj}%$HVEyB>o#z|3wHDD(+CPLc46)LA5K>;ZY}Akm>NK%I%uh0kvq`vPY|F zJF4S#!ps!gMODI^6{q6$bge`Kc`qHl8EBPuWNS-%q~x`>ECp*$UV6_#*HwL9%gIj5 zmC?hC=~C6}YN_U&ovKV~ujTG%rhbi81Es1uho?hkE*5LW9%B>mkY6d*ip5$`z`;jT zRSCy{qAcKmk4ez)uHmG=PJxZm7>Z|Ck=%3Qc_93&^7XLI(qv*U@k&H_Pl@@z)Wh2i zCzfU`9TAE|X_yI9&A=aTx5G7&pXB#7S{~)_v*6J^F@;+yI~^&ujZvV{&@yhJm;m+t z1GLn?4b;TmD44?(yYN1Z9b;$*SszvU0JF?ccfcAhdBdR}rb<4r+zi_m7vr=#)jEva z^Bip!Rx$olujm+JXS!Zf*_1E8>P_iH?MgG~DcGjXy1Rwf^mnx6ssXtNUm(5h?ZLNWLzpiw_Zf!j?UARlm{IYzPb_b!F>e?M7rZ_w=~ipa zn_!9t%4KiMxSZp}yz7fwYR!9{+7{5<8$Y1#UJqDL%kH*-u`6-qy&*8qdHj7$S^!8s z$LFxCZ38y|YZP?Gz@lHkHmTckugVryj({6iD9EjMv4Oj6hz|4_6YjF1)ok7Cimuua742$s zJD8F1qTS}6)^2w4-KK=EmCE@w2`_KhrGPh1)HR|Ko^4mwz46oFciNuzZ{<6N)c(=U z(vH;ro2}TIr~Tblju}#$Z>ZIBRKi=hDVT)UGMTNKgcrAJoO{=oRkbSj6l)w#TtZ{q zk&7d-LAA6b;e6xi_$8osJ}*ux4JQ%a{=r#INd=SocH~PS+BQp7G)h3G{|g^IDHtsB zqI?o&tG(UJs01Sc9@W#Jc7K~X_ye`#xH%&>;rs@W@fF%_4CougS*!>(v%`e*cj4SQ zp#NR$mi#TCJr0pZe+_#TVpRuTI-@lHC`R3)aLt4D8^B%vJy5^H|5UrwaVu_TcCUCT zUUNM(a@W~4qU&|G>XUF=&1O9#+RlJVmhi1qb}J*{c5b86_RwAmY{Y~SJ)5fq#5Qk_ z&t!^{bcJrEIOmP+8Xb=m5KQcn)QN5cJa{Y@OXs|I1O@7mnn$A^=`K0>jm^BbM;Zi| zsz>TttybKAin z7Ac`|FKx$Xk>I!~ItOx70RYDQX)&*lHRKpocMPl=1XG;E76CXp-f@0_eGtE&#A$l! z42GL$pt-e5l-I%D^d|iGP3)cvX55;aRvO=mQ#}->fEpa#GC!@WQyBVvx5a`U_8Rtk zwQyT9+M(n*4R`u+*q#^|u&zNHL-R~JOTE|%>#9%m@b7lBRF($LcuMSq-sWN-b~P3? zM1#T-1mbwWcq>X35<3xlj%tCKVc0m1o^=}+x(Xp_KS zq54A@Z4q;B*va6zIF&6oQV9%}1KJ9Z19Y%&-zl@g>NRQ}SvpjXUbw~{Ntinutu)mE;_PmT(4T9u zbXqJV$gOn{c`MP4jSVhZ-9@XSzn%(~U9?5OCZ1H}mEYlb3POrsi<>d{QRm|IR%${+ zgSeW9f1X`kUFB?Q)^S$XMUUOqI_;NqAM1>iq|ZOC{0XjaWf7ni?bKbb^M9_HwOUrq z;_mO*pHGy=SV=U57?Qk-8`6FQ3%cTBOEP$e-@2vnMa*AKf}~AMDUCP~;BOPyI}}$` zVtapV=>E3}^xZm+6~G-&#<8pTe*lrgtv89N{Qm*__!(_GfisEhb4kNo^HC@I=kh7%-_Nb1T-Da0s z3Yys5nD*l78vHjjv$MJ3P;c%)G`dNPSaLuuYP#pFbvpEnO}@E_Sf7o7%-~=dyG;+p z*hEe0`AuBG!S*Yxe@c(-G+xreEp#k6b2L4_$}BMYtJZDc+S^Ix`=C|+@dy8ZQ{Nuk z)S2aZCCd-lvabvVV(CiPGO|H0%Lban3BlJONDL&7+Zf7#`&w>UDnGDz6KGyI%aZi``(Y^j>tEj1(9oM?H*0t3$&HhJCcW2M< zoGZ3T5nrxe*7?qNUf(&tU({}t)HyqdG|0^zQ$ks$5Elqqz<{&#DT*kCJGh<8&@9|Z zpx$b6az8-auMDd>^wsG+cCF^rh&0dx_A^Ey3BuH0VaEUkAP(eY2J6{E0gI>6KZpW) zR5hwB@X$aUl@>*ruWkqEaiS;?lif;Uc~LGKQ=bn&|K}#$%JYOkZWY`X^7N{EU98t~ zal?|`h9L|+3ta)>l`5=v3pYEMN(GL%dr1Hb6NdXGi#|`gfgf5+Cf4{4_t@|ozD%Wf zcNCvmBtU)cW#-Nzd83<~EcT)@LPqdq@#RZ2E3ct(0#6*E9fGV7YeK7$E0J~i4AuIG zh0Jc-uja3G=n9hXqA?mZnUfvw(Z~#bXdvG!BnK$i00IELF1de$|Fv+)PcqbbLV>nN zgi*f#Zy0S8--+O06Img-A2L3x75jjLhL(Hq{xJ7x1U>gKaxHj242I&=V3CbkdxYIq z_ZRkkaiv)5M+xFfrUq)IN4AV@rk?74zB$Y?`MhWZx#PBRRe8=J((c~Ab@mm#?%{$E zG=(;nnEb_&R0NfM!SQ)7uaSGWTTmgFX<-<^^2N5o81Lp%&|xHHjW*;tp`^0LSg%Wo zB@00pjR|b87KGEvEG)lR7f5li+a*Ie9rhy~1&HnjRw=%=sgxo(StF+f(BWqW1$Aqi zxokw=v~@Xyike zZ+}eKL`wCv9T2^d$ufK$Jh79z69;!XJ?oojl0ww}H+Xu4-lQ1|OIB_u%FCu8Fr?Se zx*2T|cuC6DyI+6^)F`IbUzDmz?-EyS&saefWtAmPdMW_av=Rjl0Fp0LN$76>Lc&;p zX>oKdud>7@mb~-TP$JmY#;18)qV7tUyRH4@33$=#w(8@+ru9+92Pib^J&AyMnw;$CgtB>v)R?6);SB z5TRGcT=(`C88YRo$~JSGzQH!T+wKHiGunNz`voMGUEVbMEF}CbV^$!G z-R0#)M!JW(hFJ7Zw2Smh<;kC86;@Ko4Sw4s znN8k!%GNgUH?)@I6?+yl4PzszQTvcY?3xUdQWgs|DS{KA4b zHWrt+#3vP3UZytWav_mmuEV+Rfz{9 z6|{@R(guio;$)qVhrxZo`77i2f7*cx#s_5KmY=^cuuK!~*#Tait>>$K;>rsJp}4$S z=##DUIk`K&lW?bkLfV%I2&{Txpsy&zWiPfEl?4$&x45QMf_KPc+rES%S&T^$BlFaegGq!qObF%|1SGtmBn5!n=qtFz3DK@%lSbhu8UUU?g}DlV z0ZGEO0r5Yx#Z*y{$0^Z#ChxvhWI|+HX9V%x<|gl?FN}yuYmfYMe^yBpr4W#%C2ExK zo3K#C)m*$&Rrg*p9}0-KGD`ZRE6kt*G1~Hb5BH z%q%_>OP3IBj?mkHlO!j|0i_?ua7~#M4)F)TNSMnqCkCpsIG$gMn&=DczEcU$vej#p z{moV9#4J`|F44PQ&Vkmk&sb`OKJg60tL`EvtCZb5XJ@{U-;imwt zWql2HoE}VV6%ts6xUop-SO0c0v7P5M)UolBU+maOI{3w86?r+b*kIzCwzd;XyoMoV zO#(=qZn0h5dTB`dwA{O1z^`ndPg*OLNEFK}g;>-6RlU7Njzx50;dG0^e7N=##SGK-))$n>BDzN)C^=WaLNWpvz#-aSAiK!@1@f;h+Q%U# z(cUh7K>IdfREGPvwzjuQ6(MtRxgdPOg`h)W|IoEsSWd`JQkJ=jvjuK!$a6i_X9#=q za-#QhVGBzoUotmBHt1MzKNZdj_vR{_!_DV~t1xA8TFl`H1$o77uKH{!!4>u~?ltA9 zSjWV+>?O)(6%NXml1ocmB`dDwu0^nLdB+?UeA_UJyx`9Z>%t&S)-fpy&dn%dAPwGT z_Ah^>V)ByX~=wIKZPZ^|lYeMeM^fyuXT}mqo0so~M}3 zOwg7B%p$tuxtOOfeeH`-a0dbqVGUX_P?FuR{{HPSX5I!;sev*iDCNepa@c^BJcD`x(=<5;?JAV-a0~@74Y;^n^miqW(gc80 zgXm9+_HP+47IXHHxgMY;V>7h;{22>w{Y61|yI;8b)+J8ATI8CI*_)ajX8*O=SKzcM z{?wto9WnFy1ve7`DP2LSvbuYjZ)P7^@;9Ppa$}*m#-e<>@zT8@2M>wl8ibln7MGUR zBr;!0CKz6sZV9{A%a^HQh@K8Q;f1_Y&U=@hI#!BD%E-0D?%sm67E5cdC~nEFyc->& zg$u5{Z*^zYQ?O6wFf}Wun?=fyi`MBT669wVO*O^(QFMmk1R2eM0%foMG!U}=u1o#H z)$lb%;pv9c^4n|~w2(*myj-n&23{Z>Q!n4 zi8Y34wsYSI4=xV(zIfr{&IPm4?VJr*ACu_qy=s)lL6_ab<(>j#eRaKjx<9scsJ$=Qoug4hmO$qQSL9pM3Vq)XTMy_1TnDvvYK6R{6pxw6Qxdn8HVOz8FnAi@3Jor!nT2~yG#MEFUs2|}@p`pa1H;UIV+of@ zYb@Ul!kUQbp<9~xZbt1L#4|K&@>gTxaa+v9O|Lbkt7(S4BcN$ArYo%|41liK;=1>r zt+x`i-Uxr9R~p{%PV|7oLW5(j76--|!hpv2Y0}j;=mRi?)e5JYGNv#wC+#dxOt^~fBeq;>{Pjx@c!c)Q`Y^F zC--k=totMRckW)Z?%#f^<@(3g{X0JGz=iTqv*z=*TK6^2F0IU4vuB5E*Pb#r4raw) zap^c+WiA~DFqp0TOwdy1*ufv`KI2DO_jl~vxnqY#a87v$td-5i)+!jc*}9b=T^&$w zE0c40fc~r_i++Xt`Ww>=u%K$&{u;q*2j?VxeB~dOxG26 zEE^2(ZBdjjZS7{j=szf|Fo#l87f6Cz@j8D!8PX5TvJ2MQYa6Z47 zVW_&HM~|jC>>4SYnHL1lV}V&l_sF+sZ!iMD+nV3Uh%8!jlg7vsd)&26dvMWMrWXJm z1JCkTR#*fu6xx_f`U1D(Y4!+hLldJ@(FHA_9W(#7wFWy!xb5nns3G-;60-kPQIE0M zBeXX20{CSz@x?DtfvCVkKjanh{*nSQKu4m$z?r;X8ihOz41{hFpx4mfoS(Ltm&sso zQtgW}!3FbL&?ZuI!24*Nu`nwr#I|KAypCXVY5trY7`GOfAwV7hW)=7QB*WCP=a6Cg z13|w=IE#7U&SDbeNd1Ek zij(}vy@5Gik{hR5Z!^5Yd_a4P?--ijzn`T{+JXEFR6K4@_*7S2eFHQ|ac9j+`onjd z_w3p88tVtMjPTc3L||O*@mxj4|Hq6o8R&F*!Cp&PZ1y z({pJS_2BKr6l?v^!zUR=UAuJu+${zMx^X5r$H?7hG?rs|Ujnq%WY;RX|VV-`ZyJ8)OwM0=C4DckkY_d(SK90%XfwR)=(j180hMC98g^ zUbZynwJ&D0qFxys8tZ9iL7d2>Q=Acwr^Y84xh0jEnPla?aD8rqe{3=Rf2{xH%A<6O62&|LCN(2zo?p&<@K6xtxNA>8`DF0SvESZ2%}rPW8Btk4ztIeee2b(^t71ecDr6$hPTf-pF~dIt z79H7GPQ9XQ+-jsxvTec^@s(_3L)v0Pce9~dEr(*!wK@> z-NkXBtD9#ZEKah~xpep39frvHus=A@#{F(kGx*L)T5RTy@i*@jy0q6^PPZl4S_WYP zfVwISFr>&}fYI%&f@(}}D#fGbYh+u1+pkw*RtAtvjkd2k)stXLEzfKnD8sW{c6)83 z>RkrHj>E{x>>dP+rWcps1}iE#*>54tF=C8uEkKu1L1ePQC87nXHO%jla{%Oen$M}w zedPBUfyf-_rpT^*Sw)KMhgS%d++ovq==46ua0?ENo{HmJofsWU!SI?BW9c!*U%r;j zh)h$r=F%A4{vetVq|{c<0*dHM`wcbY&7og)q2@zyzAFmVz|(ocL@CD zE?14pp0A$7$}r6hWn6j?0}6s$EEcb*01PL2$tH%zZf<_f!=AGeyj_Nn&BfK92g?t^biX-T@(!HgNQG|h=^t8|*!cdQka~YBoyElqfz)Rmnwp|Sa za(+hy@I)qtA4$rC2xqR*dLS#ci(~b&Q%%sL<6X??!6#E~VNANk{W{3DeZkHa|4*bV z+IQq^tQ_M7&L_{lX~kwoMv`MA*8Q<$dUUcJb6(Gmm1D?>kM3m3vE_K7c(csYn0$PH zK4aZa-#cB*TKDHqwa$HP-M`=J>nXp_NxxSw$GR=eZjTkjn@z6jSFvTC(@6o01kUyJ zJ^QPxs;e??7Q2dC+po!ViSNcwNVg?A= zab2sl?U(cQdhwJT$YU-UlZgr_fO;Wwz>)6d@p|^5%CQJzb#nU;pto*BnLg0V4q-eB zrV2He;(>)Zkg|~_u~)UL3QDsrlmxVO1$5|=KXKs@!wT*l8NbNJ`SnW|nTWx>K%qYy zkBRB@7+dMd4{y#0O4+>!x391ze|qn(uzD5x9^Yguax8F*kqhqyd~dO@?e#SW*iQTR zG>G2ssI9he3Tp)9-E3$O+C)U_%(cKAi#Ee*Xav$`BZ5XR#qZ1lVld^;Z`2+gLhjgU zv&gi`JDTva_Bje?z_e&*%77S{JR(yh_eV171>Q;?_38lUA_JQXKai*7kJ6JNY{0!L z7G;VI2a{O|katysEO4Lk#j83%KxKb0oMrDuAPi6usVD1yFXoM3YM`K!m*=5xi0`1I>|5 z=oGd&#U7mlY+0F`5xs6IXfbwLL}1tH?~M+XBNWEkMN$MFuud=!ksryOi1Fl9X^3vN z#o#CV_jR=TbB_IHYv1r&9W0}_C#F*8rBid{f+Rlaa~FmM4|@F4xX`I(W^R4RAZ9a# z;yi2h?34M2tks2V?;>MMO$W4928 zmgzy6+p7YKj6o>wq4hSGLJ{!4R#ih&OTHhez=|UaU^}LeD};3Szv8Ge_LfZt{d9IP zyB|P!jWZp(c7o)d)3~FSEC-sWP|yzmBbH}UeG#!GT^6whFu0LB+L^Kufk{-_3GqR? zz{`3)rGr3J4AFk5U`;<51>x3QTO{C@l+_HL9C}j(esW?aEd&NL7n8{;7Wj}kBmy73 zn7PRIWGs6}2qCif9_JY&a{lp0iwqxGOuqGqA&(a$`VbfLhc#^fAZH7tSG*0P$j(E!|DMb3&<7#bN-vI#R@L$~8LMFQ*}%5-MKWebix z#$HqL1Beok?=D7-20Hxd5CDQB>Mu8j~vd|K_dPw0Ldd~sH4lne0*3t~s51=){so&05MyPtE+y*;PC!M5{cIy=VcNp>uq;wUYBA$gAF zI$~x7ZaR7G&J-K$YY(2xGl=B9M^`>!xjr83;udpruFap|Md;PE0E2x8n)g_oLk+GS zoWj&QYn^o>V5b=4dhlLZ0v3afT-}ZU9VBf?aPq$kn>8l4_V4l@?w#bic!b;fSw1r+haM^ExB^app-i!Ag{PDZYA z$}$=79mE@%agV08iYweDuCTejP9p0%XRQzsSCP?Rp}QLDS?HY5ll7R2yBZYoQl;H7 zw%*k_Z2TEWa7C?fhj4HZP;3c4DOP`mGy)Lu?jOm#j7vyC$rOOG2zBnTU~rbfJ{bqh z#Us*We!oM~whIHhM|sbBh6({5iv97lOrv(cN-CEXlesCnhJ;Wisy3)M&a~KpdYO8MW@GZ{5w7gS?Lx zAK$%Q9yYsm>EWv?e0TfBS?m5;zc2KCSF(crFh9;rA^@&SPzkj%Mn3&l_AphXPO6fGMS zY2drkA+s#Ifb@^i3gvK2xHG>8MpwV4ku5U)?Qx-K>UhuWWu)Ho)6?l=?>Ej4R|V)mXAY_{IUbV?R%xcuN&z z((RYQRV>VTcWGJjB-aGJ?TL_dK;}@tIvbwz1!;vSv8-s1M^9k}WoTwHeIDOGGnr!e z-~QADDy|`O@}t5H4m0jNnt#YC;-k@Hw>f6M5!T;gt8z%w{7mViV+Mtp%rJwp(^cGVM8;iwQf$4SI>LUvTDjOn#TujJyoE#D*Q#uq>VJix^Z zwe-E1bhT^b*MJZRRd&UMb_U%AxjQI{cJQP^$tyEFN~;vEF*OY`6%JW;FmtfS`wsa$ zWreaqM}$wJK^kOqlFC*BnwD0BM4CI?AvIR`#L{2J%wW{7DZLf@%*d&sHzI6_2WQ5U zgVH82mE?LI<%F4xj6O|%l)u4*gLgi@`2aQ1{>5*;aUGJL4*Cx;5_<>b{jj^VR!^d) zr)lSIrsis_udkEP&Ej*7SJxQdikR5(5G8A>LvhdObqWZG0C(>G`l@=oD{N(Tkim4^ z;mG}ancXPWcF3G5z9>RogbOV|_68tPC3np5a5;w>hvg@q4P#^P?9{cN*Rywf?sh2?ZWi=Dznq|Dyq*O~>l*VD8^ z*a_YBF0Qk2yhR?Vh6Ag*TKu!Y<+8A+D=Qri#-4^S011ztatryqOP%kRG#TQvEm@p_ z$1n4&h8G-fOnQQbiaI8@5`R@`5lJA;ct1ieDh7_d2*ZUi9|QPuS(!o4x&A|9& z$0sJ!Quw)cd;UX?ZXe!C2_?#tqtS5|soA21nILyRZEq2&r`Za=b~ZM>CL*n4qAuF3 z-;MH|vI{ltIzE{j(hxdM51Fy{6uf&o%pJJ1MhrR(%%L4yRA ziIBzM0lxv*_@8vJo|Y`C!jkQ(nmd4|5+HYnndKF_ock3d2v#%_Cq^oazwG2$8Js^_ zBNeK#o2A%>hyiBBh?@S`;Q%ut9T>dW%M^v9sgw}pPNh=<;h&kDNpnPdYfkuZ%_lc6 zJm6^cargc)j-bx!TId)q$dUW_7{yOvtJEeN8-$d(!BxvtdGXqsQZ_;sVD)$^3CfE@pyb&WYz}N=-CQdp;0Rzc>ng{6{g7-%-Ia)Ag!m$u1fhLW7V^ zD0QTAZ+4QOU4RGDJ7kmlrJlp8Y!gUsrlY{YuEvuPV6bQe&Fc<9lrQzt5;}w_#3Jv( zWW}83;UmK1m2GiS$3Kgpj`6(+dvWg<&_KQGjrIWR;+y9$oIc9AS2|^x#+l666xSZ7 zrm`8%ap&geZga}@{TpW=eIFNv!)-~v)9csvbN_aWR%SkH-YxZCX656Uw9Z+_K>bc^ z@hZxt;FsbqCx!iHom*|FXZur8RbA;2Kh+g?I_JR4=~8peAzBP^L8PQ6iZfHM%43TA zGqJFL6L~eb0BK+h&cH}FJDHfp!v*?61y;CI>R>paQy5%}$M{SBm<80|$(*jhfy=eh zYk=t1A47opS7DPOMyFn8_s;H4|_%r3vyj?^md^BS>;sqNY2WwNeas*8CK;9G_SUHd1}V;KZ9L*ru^PV@V(e3<1UoDUz~m00}l z&4EYkY0exDp6SO0>Gj^dEQ3skzMGreJTW6<;%F0HR64@kJmF*I#90m+Q=yax1g#qW%~M+Ekywy~Xxck9`+GG1 zUToT6S7JX;Vx78>dXGKsL~1O>H0)zzNmJ@l$>b$DI7`pm$P7uF{)58D+zNX8M*qjc z7xDJN*2Hl(hCVI8p2q_YO1#zX9ebMjIXfEa+-`mY)SpDS2-mtE{SHb5Wq2p)25w;*m2FEiagI1GX z25M~GpGb~gFs=KOW9FG*>;8vVu8gFu`wt$?-@k9&zm@I3J!{>6y)*d6>(+e@JYg0L zj3>7EZ!}GWGXwGc|R-chleAr z@h;Afa{ry|`)j41Fo;i@cER$hbxuC5VdFrSmlPW@Q%@BoOXw5mjF~8~s<6gYwJxrB zn|8`UE6Q0v=kH2OXS}{1<~UammKiY1{NQpKP@0e0VFU~^2)X}+gww+f>}u(4@=R{% z-+v@Qjzp!{=Oa4}9=4Vl>zGE0ippnX71$QviEo z->uNJwrgK&2sK+;S0^Q#&AWvMy2)K{#i>pwIz$ks!uQwID4#|28smd#yw+Lz zI?~Taz_yTC?Q+!$HM#K_>Bq0}4YT$H6Pu>hFVNr}@30+LWExgNXyj!LV`e5jnz?S>PoFi@ zQ`Y^lqa$M(>;6>#^!T)Oe}4Ys!d>hBCyNgse^P$_;Cq9Ytoz|$FxakI=t7Q|>DjZh zxmmu-xt;Z{#wP1E^)=4A2J1Do)zwa?+>bk}bN&djfts4K0DcrZr>c#rY5^M6kl%A! zuS7yyA+OYH_yk<}Q|Q&#S2+VK^^n|u8&&fV3cS}pTxQuTE=uo@QJP@5q~4+cx+V`M zBxJHJU`Xz;at4$_(CdQ-FlUW~Ie-J1%My14EcWCT5VN5{oalYCH{9Zg^7LdwSvA3WrQb@9=I z`<#dkymRthu3!fPdjrgIZgj_Bcz2_J#@ta?+hB1cIh~xnI&<-8+*!koV~;`B%JRmC>^<^ z76WOcPrDQam#SaWdMd2WCNI;rc^QU4&K`6h=)ZI73=dJ1c90=iz`$dTjUVEXgH@$rjXue&leG08PO%D5!anjGs-u{oGX_VCoA zd2@F3Bj)caK6xN4fAfX;c}{QNK6>;>4=!|nfIor~(zm1Lo$XOj~ECC*yI%>@A`IMcW*!wI?8=2l6G4#(nkF5^q7&;5~Lf2iA)(mv^Q{(n$Q z0|XQR000O8=WEwm2yVu=|4je@f{g$G2LJ#7FfTDLGA}Tdy$Nt!=XK}%VIcq#1R9{Y zb~o4rNr^=Fy|)30lGv0eUP&!W)<#LBHcJ+?*p_3Fl;l;myjC_G94$e zC-D-`_$9Ja&hSsoyHshVZZVhwzntufN(0{I? z@AdlK&7m?J=9l~WIDX#fl_5FN>GwLl8_#{&^Dir9NKfdmUi_|-hfFsNrImcB)$a7d zP@<2LcBh|@w3d4srT5JtyD`^|JS5)O=oiE3@m{CXd3)GDQjG5H^(OgZucp}PcPq2_yw&gN zb@C0Z+xeh(vya&CtoGuFx3i}H;7OfMZ#90-6j%N8MlTF6HhOOfjSU*E(=Ue~xl=dk zV!oc!1Hu@K)*}Yj^z!h?ovX~tuUY2z-lg{Koq9;OH{9QW#>HW1` z#o`*hLfhQQM_ZL*Q_^1TltV3z+FR}2GGwDN$BvKMSS?1i|Eu}1F43p)!Hr%%nl$>_ zCGB0lxm5|%ss7x==4HqF{r>YqEVt1K8oc3S7DrRGBm?Os2xXja2nqhC%Y>~o`^ zZ%*3XRSl!TiU|!?S<)2??Y;;=*G^?G({6Svqk8ggeUWl@z5Wwn&!`quh+2xkgWHvS zw$<*f@_@3^);FS|RnbtRQ*O~(w=Y)0)}|Idl`u-B9AB*D+nQ|a=Jc?RXqG3`nM7zc zAU@IJn63+=iy1!Iq8o=&4O(o`pGGG$NxRnzTlK`LRL{|J{E1Fb*y7b&*~@yRoYh<>TDqsM!Mb5i`_M1-L9ZOoD#Zp(eK&_`Gl5X*nsX=2 zGKI~0Xt76oJg@yPM)Xmk>++GL(aopzaV_P5bXJ;tRw>VGYM+)Gy+dR53D|EYtK@q$ zgh*M(FsH}&ORcn{0V+jhu~G~-D`7T$h0eX-IWes1R&|_98fc-C@6^W6v@2nZ&DSK) zW1x}6N;$ev3FoEEw9&4x2byaooDacFY7yG9PN$sHmd$5;Tq)S(3dh>(tiEvrQ)7=C zx@pFCdn7TYEF1bco82HLTKPDny30?gUvAI>i>lVzFZODQbK20lmbSAgatM=}8=G>z z<~pv)aQszm?0)?|p2D81{r@sj+Xz$lBxtk~EdRXp9#-A|Q%-3YU(IVE?HFVL#p%Q~ zu+v#jN6&%HLNgVef3aUjmU6Myxk02ku5B$x;RfBIY2@OVu6#(nBB|jf3TGC=z@&psuq+c3sO>38UucjMetWCOkR;xL?4H3bw{>|>p}Z&Cx!B+p5DcLu6N&pnh#zIJ=7 zZwq^e5mc8#LB*vyj&PxFJWoSyU{6FsVP|r(BSqBvK2)%0St?|;bHwipVu@aGbo9MR$_5Ibx)$Yj;8;(^|#( zx+>liD?jKxvc(zpSWeyBGD%&Dz~Iny{EkOgAAjixGW#60KNl)F&6|o(g;>LL1{~ zHt6drbhR(J0~Oi*;kZf8FfRt_=1pDK&_Rbwq%r%QZpTG+uiOtOHTWOovJZh?MRs1} z;HOf6O8mwZ#k@exV@rXBCP3OE~T$i7llU9@n~>D76uvRk=~* zvz7Z{;$wQq-Fnz~A`4As(>FF4^K#eaNwj z4Z=nfbVd6Af@QRWa6@Z>IxlvrM!+En$!IDNTMLxemY{iQ|uO%?H83TE^g`liP^Ut zGN$W()04-w$RSxc<D>?_CtNK|a@sM~Af`yAnu8 zRB=?}-lCK1iiGuanG}_97;&H-4x2UWx}O?74x9HzRNVus4C*lDa?yH@Z&hO3c9|<#Vj9kI8rCsxFW_oDL zj%uKfic^+b?f`VOIkH8|H?mMJ*r2OlrYG&v9pah%YVG8;==_&sSm`dQ!@Q;6x2M?E zm0}Mi4#r&aQ;Dp`)qd~qHtioOzFx`SgzV6@$dC@)4J)B^uSaS_ z(XU2b99V42atsG#;6`P($Wjs)-0#-EUiv65Q6~%yAJB|G$BaboN41$!*ZJf6TOz#} zcjqIF;84N;tmm;Mt$e}k!~B*^CVjD43~_hcZ6oODU8&h>yP|?=iaeF&5MC4Y?uAi4Ua#lPYgi1HTlD>BbsfL&5c#9012&@+ zSb3o37U4tsVnfRX>H)3w8k87^E{nL(*-61w@?X_I9g7s3gkgC~W~?lgZn5nkR*Lkr z_C_)Sg$(kN+V;>hVP0q9?)mgTD5eLT!ZlI zt>vyPp0nkKgBH5z=Ha0B$i6Io2}5&>Q$WDNnuaP;v(8LGpk(Co;Bu|XX{unU=W!Q` zhIU3`sgQuk&+5tIo&tkdVk*ba*xfd|EZ(aHeP0`cYCD9g)X(cvqjoWjh~Y;4u|0Jv z8L|yBag@WBGQM-{RotdGBt{?k)4K6x8YInR+XZ>E{cgDhBP8JnW$jENHDAw0=&pHN zYR??ZU)4tS^n|N0cC`1E1q;ob&BKC7?Mp4)i(YtRV)mI$igTCy5?-mnf2@Bunb6hM z+ie*l$ZzZFTeQAR54=u$fNWdNQ1~s|+5B+ZPB&x=*l9-F#XlAG$Wtge>DQ+1Zb#mB zCHz41{XJAe%Z>j#F-Ygl7&0|npyL_hb-L{o;+}^|H|IB?qokL)^AQArE<&+%l-78m2->iLf)?QTE++g7{V%W>JR##S!m@r9qF@imIPwEVCA&Hy>1Y5qV@ z*-VfntC*CLom9$MK}Qtt#IVC@O_u5jchcB$q}#G~=dVc|ddFGg%~I&qAg6F}s2IL$jUIpueBm5ftV+ z25F5#7JT@3S;f3^h)K&TMqLZ%-9_=u3DHESf3{z25~CFVN3z^KE4#P|2an0f!RZf+ z_lt-S zMBKT0V!ls-fpeqg2MJ>7b5@cf`D+pk}=ZJe%y*_qyF3Ui!NaJi_ z^G;2_g-tED{{DlDT|PHk~KK-wH=!gfR@=LLDGaIvPYFTqlll$dGD8$ST0*l=k zW)uhNUJd_QJXE(;(K_KqH?MmALV8u!ChF{DPaakO`{q(DLnHkdvcR(r5)*{t`gx;e z(y+KWyQbUgc0TF>XbEiDgqp-Mq2=!L7EYFOh2C{iJ6h=X+dI0UGwpZux+QA(QxeO? zJ$k^$w9aE~BAJ!qQn(8X55e^qhPaebxJauV!8aN)CrjpvM!y(CTQpIZK{LN3o4zU6 zBE|W}QhSZNMByrNk=t$h{`dmN zx!jXz>HqB}i$?VGR0otq0n;tUB$)ff6~@JnHesaDy1jq)Y`_15ArHQH*{m4O??WNs zn$%p;v*^cM-fbb97adXjPK+355)4(Nf%iI-g(F(vgwFeyb;l7=W<~$**Vg`r)MBNj zTyH!7f2$FuGm~^>o*>&R1)3(aphTtoU`B+_pK^&s;Y>G#akyU3I*Odp{R?`IjO%b? zVwN6pWYhLz=u&LAjS1T%(QuuvzOuyu_c|W95OIYXnjDHjJ?B4aOJ{FuvXr(2j`pBP z2=Jox^BF00Ou_tt#0<#tfWCT9v@p^b&6_5KA~RMK(&4@enN-L8YWwnU)CBkxl1?yRiln|Cl z@UWZc09;H=`~ObPaV|na0<2&kB`k=Zx{))ZSzc`h&{X29K3il+Y()MXcM|;}nwb-q z$Yl-o&-QxHZ!w~gAV=(7M653}ja*{n!3H;Q8shF^nc4f1+`dZO_y@#M8%7hwQCBy3 z$KeR0cwnMj(9i$qu3mAu8>r?P{7Ws4uoa=zcj@P6coG|}?fiEmSnf z@s`2=*MeJrnV6H!dd!l=4w|+oxY?B(L7Q$mo z((-4|c6&!Qvy~zu2ti(8S#ftDe}%@bcvc}N&@Nsm#V5s4ZQD=a*p}tSp48)CCeis7 zU4C3EdZ$kBPCadx1yD(Zd`ma{c4n!LUMK%9w5n@1YE9due*Z~ofn<4#mHbRQE&=_e zYs9hPJ(+na;qP@#OU~&jKb3;eA|}H-bp3YXaXVWk{LFH0>mPB>%kc9wkxR8FmnSx$ zcp0%JoBl3+@J}o{LPV>7_NIy}u70=Qb;U)p>bEtI2XxDA@ws?T1UfLzpU@6pDhj); z>DKChA?{DEP}huERu>U9d)jU1U8&1pVgnbZmUwigsl=4*hxGI1`uT5CkByLuIWM~G zWCj8(-<6$A2JcK}!S~{bOH|`fj_x9-tT5a%-#18|b;Gs#P_|I`87`hCDXPtXwpEfG#j_H+JpzTf$I9~&jk3$tPT18(<{_3v9`d`3ohFM2 z(wiGyaF#b{Zl`?TmgsF^UiSN+U=n_LY;Z&)W;=at13FUok zKJs#ZdYr7*&xSo&p6C$nZW<@%4NRHD1f8+)_-XU`2@YZu<#+1g9kMmg5O&fRP?$t_ zsJpz;36q4;_T5Xw`Zm0KQWZatgW6lrSM9{Ia)fLfo?j^w5AWmfimLMSeM^ZNU=I+# z%cU8~OcWNfhgJ36{hIEZwMXCA@1G@U7_P(B_844#b4p(1-;o{3OCm?9JER*$%vVMa z6Snc#S&l?D%81*0xs<3n+vYIq~%1nH!*@{3yTX$1QCpRnJ>9~8HSRc z`1Zs`EoF0-3lj524U@7TZ)w5np1iG;zn>8}$6k;Ofz4n$Nx%Gdx&KE&Aeeta6am#r zaNv%Zp}Rmv>$lwnuz=jGu6x=ADJt1q>Z#OYUPV(2Jlr(Gm ztD3rO!tg`g^o#m;#-&eD;0wx&k7^iyjimY3%zT|BPX5PTOV zbSlJU#|)d``I8+P!Ddm`1(r&y6u;<`$UmWFzEd|y8i#l2qL()b1L_DzTb}=)gC3`m zhXnF0D*yXV1lq7;5d5==uj!XyiOigO!py~nl%3K+V1tyu6zz~P&qYb9i=^(>7_xK2 z5sWEvT}|T(W)@z92=Q1vN$IdrGyC@$iuQx&-(s$6eQyX~sn)9X+8V4$f7PlH)>N(4 zs#S+IwX0Q<@HMSyxn8Z+Yu}8QaJ^r`@h$7GTJ6aYaY`2KZ`W!dn)Hl_XsTC5t0!t2 zruLDc2z^Read@$Qw0L(%yRY2G0Xk>n{OeTGk}% z^|uchB&uGEkf?f1qg)>LkCZ$mES%);nm=Z_TCdltuHH|wj_Q)AgV-m=Cb`G+7^N4#3+x7H9lsEt)71Itxs@DiA7V^}pVM-4m3tAf>kmLwyx&_IN zAt&x)+c}RYpGJx4(F8NiI1C1|(7Hxrl!a8SEC?-%%j%3jmq62-5V#Al+IpbT@p`pd z|Hei;@OmAzQH{`d-OwjeI8}T)Gxv0Oh38!Ltz>((7Pe?Z^MSJ_$%gkBrZpS#J5}Ht zFkJPSQ6ueofwmvf`ATTovf-4mmZ4(IH+c!DQGGqsNF*4cM#XH?0*_UToz5f{Wd>-J zZ*%EpI%ZbnGrV9XB=OR6pZ3PVMaOkgb5Bkf32G-a4w`QwW$zbT1}(zT%tsc?PFW8u z%GUvliu2>CVQ)H`NW@>QSHI_^Si`wApWz};hnBmwnwciNwSn`&Qkk`!khbSVSfVg) zTjf}yT;76CU;8~CgTfI?R9_Dzs*=`U4<)MSvIuag%1gB6U{Y!%BrGen#llsR^@$Nf z9?qaq8*>P*+8jY~m=@az#87>J7^=$+*QR*7-w;DbbQTwQnyZT62*nN%L$%rfF@&pz za5h%jrRD8znTSa|O`-)`o@>U46-9ms`Y2ExmvZ!AgsKJSe^t{kLRHHK&zY2+^~vT< zt4;(7tL84#OXWo&Rj47lD3?3)tWnfqruSz9?CP{N!1SP@|5c?H~j*&}Y&C;)mQ5q#hAJ z`6dsSly~?k)&W>q;t=*^SBsq)unb@9e(h4Jb%If=VMT`=oQR1aJ+g{Gm~rC+0TSUo zIye|(jNy?pU>5N8u3&3M>=>^gcy`)hC-Y8!rhnvBS_qh+DaogLQ%?YMAQyw&OF7%r z?nO)wlc>57CA+V0fgawK8E2K`Q%Dj-K#!~g%?soQ2eS#01AN7dnG-x!^KyayFrpDc zD9(RL2#=gs9h$t#0fNU^f+TLM?Yx)#4Zr zK8g96miHIFGJ?yunnIRY|+DG)Qu^`S{7*llM#VB78okuo1Vkz>`0st z-rP3ah9!yKqjNaq@fwND+3JVJY#BylxWO}~?SKhtCyzK($M7yh9oUB#L3O0urSGN; zi-QF?SAWOo`9tB8_;mV0gpcFlAwkY#3gnXh$jG@S?)O8e5vWslpibt;TSX6rOT_b= zq@V)Cjn_*shrBAHU%Z=dgr0mIW^=5A>tI;{FI*4TF~J~nr-qhzF*&C`D-Ri@JRT$OCLC1CkX<$n4|!w(FF~%%Ihw=N2;Aenn(%`y2jkRR z7SLJ`#;NA-(gZ%M)sh8z2`rA3jT9Tcam!PcgkPS~zk9T{Gnqx3jB3^)af$;`(i3V} z{*qx3ITbUUgCloyb{zQ4oiGL14Ic~KQZWq?X@QrFeM4|AOxR_No8*mc+qUiG-q^Nn z+qP}nwr$&X=9|SoHM^PaO?TB<^rpMIp68%YmW{g=@qYLEB*+>Gx-B%54$SuPJpqDF z5KlYk$`MGejhq*~qVB+5i8}4UqKh`!Szgp(e>vH4vl>R3z@rj%a zA-_>k&7J9B3s8jfsC-^;;l29XdhS=s>8l;OF#zcXT_$TEj@Pp4*khs=NW1B{p};om zBfg$@Nc#_bTt$wPkQ*aG&i-x6udC-&NR#z5;v z4ZXl+#N0%97~I~EeQQabtl(nXKX@8s%O2eyi}v(&W6YZ7>70-T;ow(aS}^qrI$*P4EI0F3a9qM> zO%j@M;e;_jA|Pio;le+`ll4eXr}>M?572Nu;F7*sbDi&O^I~yKyZ>|~CYs^eX7w0P zTx?c%J9%P2X-a+!)L?_PhI_#IbL#zvp5O973+sZM~|7FcxTpVu?v zFo=n!bGP|g&c#W<(!nMSU2UPW&ZhBN)ZQQ}`p3)(zuY!ynv+1yF>3~%eqR>NyvQ#+ zBc_0?Ea(}Ut)*v8N=6*l!oe&P_efoT;9`nQZj1ON`j++9qYo4Ckc8YmZS7!Rmdh86 zsLWD9{6@zbvwH~8r-sQehTx0+4}hs|qqSRhR&y6W@dK)~a=V)G=)|eX!Va5?0_h-} z^xoKj#zDO9X;9bLge4TlX@|RbR7D9?H8uC)i|5M1<9ZwGUb{yl5uX`ML4s|6*Gi)d z#mJ5*ht#%NmJTVK`ZTrWFF88gtJaT)NnFYY3;}H?qCFJm*2;8;eWpIT^UqouTaasHEpA-Cbpha6ePbyetfFT zf(E44Jl2o=WLzKN2Wa0DJvjt1`MJ_;s-P*2yVWfkJJ{pwf3LVNJApNw1za9=0muwQ z<#8axdCU>`9;%@^bzvX>IFE?PjFmD8k3gI-Vx`=ko}V_RzDon-B(?@)L8QI}3&Ncy zbwDj)Af^MsG)8OEUR<<3hpAAYDmUKN01-f$QK`AEPqSeHs8H#vWQDo=Xk@|h<7e>f zV<|w-9iA-=BbjTAVll%k#eEb71*iS@JzYG^c4TuOgK<-EY1c_%92f9RbfI!b0Xb4V+rM}eA#>$jUjS{@ZB)*gu z8G;+1ysFmKB|RM(j+=m^SEy&&@cA(9GQ93NDF$;on2@{R;U{%b_U$zrdOOyId`$xfJiHxbd$Gr=)mvWh!k)?*f2r}u;d5KD2p?;v) zred#I(WL6l^T)FGL>eL+0T#_~4wKmiUV+a9iNux!$k6qPw2tVJtsRW1t~fI0T%K8O zloZIsmI3lenU)fXn0{|aocInk+MpR-QolMm>1H@-*~glTta*~jdTz@CCco%LZ=)Hq z*TD?P^oVG@x+UMe8?vQewoKB?0fQqSu%jZUiPdJwXSzLRl&fJ(j74H;vsZVKrkVhJ zcXqwEDV_p{^79l}!pBrzgC|sr*tAWvWz3;WGPLb~QGCs`@nP6#4`OUTz=7KqoIuPc zN`r|>p<8?f0@D?0uZKJqE)ER$p=~u759Db^6+At~Kji2f_dQV3N_=Iv{D&l<7L{?` z!OZIdc_2Mn*#AIi!wCaf`Bm&x$8gYg3PL3X4B^|(@$JqAE) zWh8jxE6sZnuqN1Y>uE_k8s9tdVR-FK&tu_3IvnzlucPIfjG0l-&Nom#P+>;z%^hb4 zD_9;R3g48RHo^1aTNrfWdWt6U{+De%JX>0Uv19e~4$eM%c9Vw%$=(~=u4VEWSuApMWP3y?>9+?J9Cry<@24_vl=J{xxL_!zOMB#miOGs9mV_Prtvkl?h zk6uS1+{%IDs+A^ZS1C|H-@((-_QE(uxHcqum54UKDo*^Ni;ixHuvsu@o68^UFKwm% z`9IrMewc{$`71(sk^E~O6@&yI zn6YjeT}2yAbrL^Pppk0dY-;g!_We!)?IVSFQ8Z#HElaj*M<#pJtUrQMAS^rDL4S91 zzXH|bl?Dpet}EvL{?0s+))P4=i9@%zvS|-SAc*x%H3*$5!XzV%kit=n+nU9THQmXx zcNc}X!O8`tadnlO4+o#%$f-qXZa~bMbLVxYSY|P5zcjHMDf@_A1Xd8y3W8ly zdh{$H6`FC#+>~$^p3JrZ*by1Ti6ft?vk>x;BEF*Qi%89Bi%>%yYvrofV@shcFA9m- zuAV}RL$<@abHVEiVVw>`#T$gCe@a%l58ba`1u8DVoi`)IcuQ z&3bO)z@73}Q=7{-u7H%7P6LRVyeZPp;o)LoKlbN<$k`^(Q(181CwTSYjQ9@P68XGE zV-}x-Z`kz5t|tE}%@x!nX7}{G``ig#>)#g4yGD&kW(Ysw_UG%f59Lu=3n`o~@Z=ST zqGM$n1Ul=Uz4~w+u`5*|aH7gSOk3jqeIqC$eCk$-})H8U^E(itLZ~ zLm;YM2i+fui2pu&$+A4251|QiSV#K+-7V4g11HR-n=K@pHaQo_BLhaq7|^0groik| z)nWr5$rFt)R}Q!Rul`IVlxSQp|9ej%=Sp($q33H~RgeDkHu%SUVXO1`wZ$m_LgXGD zq!<>-=t&iUa$#3=}xHzOWG><~l8o+&7(Qf1%;nw;E!tO{u+0qMzz&kqU` z4uPr3TpO0b(w~?4u2<3wd;OH#Bm*dxLuC%{(6i0GU%bjpdAcE1qZc#4t*y>)!sMYD zaGb!&9;w*!@aB;ftd_-B$!0;pn#YYB>vk9|AE{{mlMeDNujRX707P#7wfNrS&uS(O zR%cNps+q5IiY;e`aC+f4M-oIRPY}l(lg0*#YEKP~S;v3m+?a`mk?mCO@2wouiEVqA zB1;J=*Nwz2LXoh;&0EQZYg+r#nKLU{CX)_4k^^ary?70Lo&V6j2nSb*n{7+0nOXrA z%P!$I=!Cv3fpc@zp?4PGLTmLJrUxCfaPY!SS)1GRx63ELuZ#Hefdn^)i#^)I&$c$) z+t&2(vk=@Q+J^HR%A3Ao$&&u&+Q|lkDcjJaYGe_sB&o{u-|s{I_h8#Uw=F34fM?lI zf}>6b6M6S>D87dv;$8+9*zO4b&SZczcA}+TQ>J+JqA276t$&|&G*ZLP%MB>Y(V3>` zWJ}2jCu}~%t^8ovSeebLpn^bEBN~u!G7&WG8!5CBxAsFFYgEZY+? z&q`k#WcgCTzc}3TJ$%x-vgQ}wzmOs^@4$|hSOCsQ;3TSiMyMZwc8pSl9Brl&##kzbq zE~HFZU*soMRa8{}+d1Ua*1+|?drr=p(NKHaiiZ%Ia5&E`%q`=Y6%OWt%wAGQW^&`z)YPGH6|ePe+2yw34WKC0 zy!2U`)MP< zYOy!_}8NJb%-LiWAINQ^-Gd*jL~rEoQ`@tNGI_sBsCwTBCIKVOBp3xUFb(|aLjDilrFucFu*f9pjxZd+w5?>ps$1;=M?>w7)g~CuROZ zl^Y~PN$~N%BIUtAoo4$Q{LSEhW-M|M`*V@orv!S3=KSd*SMx zWz$G3NtMqKq8AGS%Gy#>@ZP-C(XCJ#7cMbY{0XA~;F7_bG=uB(aQSUF_Yo-v(<_ie z%&H}OpBJ7cCD{o_9owD(Vf`PWlsv@y2;OKVL-0RG&hqg0GhszchlB!O__v`~CO)VAizii`#P`(z$hmsdY!>v7JC{uf8`3L1-g0_!S{II}SAd(n zSovg#clHD*$O?Cnp6~z?V9hm9GmHsbNA^$%U9L`exLQAHPHVC!B)JR8B(4iuBN|co z)5uk!J(vfQDS{gP8W4kKOA=xZ}@Fl2gBRV$^tClDCxnMm0 zaT3;+70cR;I}H9*8EqXbj7s^`i6}!i8tRPWEodj7!4GTN5qLr@p~9xXAC)kVc6Coi z!o`va+udI&?e`3$(#qlVyV?(1;Ieqyx$M+>#lxjA(6G*F)#Fg05}zpic>g!KbU~Q5 z@Se2X>9sM@zSh5)XnF3vj2%uZ`3X9FiHSBqYeXRl>Yu-U42?F3WGL0o;6zx(-reB9 zs)wm}rGbNjUeeN3{i?{!Ps*|dS$}az8>y01;eJqDe`(ZzM!`@F{5o#Yeqdjv#Wfnv zx4Xb%MSxN7Fg6?&C`B~iC$Xs&rlyJ%K-VTJbEp7I1*eaRxKqU?Kr)6_(2Lyt5^;$< zV5_2DDw%L;KB7#{( zqjx;&-^4$^QIDKC&hOVP$%&b+vVWt4I0QZcJ5E1woj(+2kvrNmVXf}6bmnwQe#0cQ zTQcn7I~KkknYh)@X79wb7uA4Z_AD0Yc=cJzkk>|-B45cgLf>0L>{XT}YedGevaGDI zEnqLst{`?(Cn}7R(jn`3aS202YVtOKNU)7!J(jvj5J z#dN$i0?keXx#xqbmIdgSC!zYYQ+5I&O#U|}-HsWu=;yzP1E){!1qX;(gXLi%`AFGo zHBVaKT@+F$w5}J! zbA&;q3`k%1pvPcz%Vzl_W8WENU;oOyY%M*I3H+-qWHEd2o$Sipx%J5P zvY%PY7V{Y^z$;D!sdiC5!!93&i!b!%Id46Otpy+fg9ykK z?i5>$B_fe2`86%BSQVI`gg?8|{m2^d=6lTEGI7!RsWi!t%Ot_(#1*{1;?<2hF|Q%e z#^No3N<@3*6#d~FiA{u>8^>W2F8)=XF!RHGSd-uUcNwa>>~K;lI?%T@b|| z9s12nm(jI!mnNya>CuM&Rk>(~o(ZQpw_Nuu=Rdc(Oo@mmN%!ApJd$Jwo#IV)iwwf& zM5um~`$+ED`fLXCJE@!22sc|}mx|#p*Kh4?qDVo*Ep^Y)XEkRgN-3wco9bSk6r<_b zqU_zv;nt?wCR@LPuz9nQ8M+=ODcCSZsn^&m*got?4XYtdYts#p^x-xf8)JpV@;KL} zi)i>U>GvFc8xi)krAb|nY2WJKz9wu{5T7(kC%<2^B9oB8sT zbuxRRoDCTKDuJVq8K8zfzxu1Gi;CP5T*NAHHpwaD4z%gry1Knkd)-H=eBo}3HilJ} z5z>{B?HFm38!4dHvIn3&`ew!nY$~AWSDYi3-$P+=o)l_OkVc|nap^^_!H<4mq>r}; zzl9c@!xuOYH5M4xn>ovHB2WV5u84Zf(=^K6-wgd>8qo1(kkOniKbuu$fpZB=4k7DS zn&T8?fVl(#+PC>H7?bLpB<*8Tg(NWeGiT#mb)6nXitNy&i`Pm$bzChnj2Qp-lIr$zhEug+hz4 z#N=wqRv~AWWA!;g0jc-`UyMi~8HeruO1b@H8tx3!z?K4L{fLX!R?!3n@$4aQ^J2B+ z8)8gVPfsUL*&}ykWE(`%kALMx`m9l>rkwFhQg~f~{?HH0v`cw9zI)w0cda0Rw3Y2q z2-Ys=ghH3GQr=!_-B1HZBzJJUa&pT?{?5>D2Bq$3@;oE=U&7>d!?E5N$?7dz@#VS$eKLG{J|-a)kE+( zHP+CpuYBZ14|s00ujo#aKeHXTYct|UE-qH9+rH9xY`_~ZT#R{M;VhY6w7)j#t&frk zUV!z9bW63%$nn!_qgY5FDWYZ237P=sTF;3GTsHBDji-%c-@eUQ_E<7xLZS|s zu59Yom8cFGVW}P_g0-lI`$FVJc<^Lk#j~dg8gENp($33HXGeVV_{LIf+x2erhE5w zg&dK>4ZU8*3b`mM=~AAUrs6xaFHXM8F8Y4A`O&KE-k{C(7i3x(_>~H%v?RlVZm*%F z**1q7Z<)#2&?B?wV59-@7{vK>ZS6*sW3G9bw00zqqX~kp_CtY($Ar~`T>rMD6^7T? zf7Y5rRO6l9_|I{c8wf1_E4f8bnrp42p>KHKiSpfQk`~OPEg+#yx)(I0Wn)29c<`7} z$7Ic1h-M`!Xzr+K{i-0ax`+L@97i@~{JWMfUG3%NvHK1s{vLt1MbI_*fc~Dai@=|Y zY65D&<%n4OPgT~j$tu;#6bR82etv`u^BZgRVe`i;VE*eedsHyOKf1Uwx*qWp)Wn{% zxkq;;9$^;C&NuF>jJ5hbvYoGt+)EG7B{j7aO+HI54d}h)4esT-z@BTnRX2DP$lr#86kS-kaNV@pn$t=c%3n}C*^9#- z-~KBp^soQ#h=#Id$xz509r`6(I3Ac{VEj|s=GvQ^U{Z>1MYMa_GfwpE4COF%Yh8qr z{7*y9$5H|M(8Bo%HpXQ5enUq{37OV|Y^;PP`l#Y78_l2Ks1cIi_)rsxOEnz@fCM2s z8cqhSYvWWA40;#IVfqFun8_d*;?bv_$po61TR;;%ElLphN zT+pUpB}1rCcaQ1|oNys4fw{?y-NBT9@|d5z?a#K$qMj_&I;nV8p1$z#tg+$50bk7v zVpod>XzBs%fmd~St)pun+;3;BDIiqi{3M({v6Vu9uH8f`x32tLEgPS)Uo3#V3YY=N z^u8tSUmZTZ;~HKrnrLmHxkfW|LZA*UUr~>N-3G_`62_Zje9m0ommrqxaJjzLn7448eok7fEoYI`lq!OqxCa8RpcAc za{gD1Bnm6nfE*G5O=Cq^Bv#lT_xOijGf2N|CXReB?UWskYsPZG^`%66klK|RJZyf} zHE0zJ>-mUPa?=Vz>avtT{vCQY!(@cW;P;7*>7T>rlorwg~?jxV)rhkrCCGJ+|rttuN>`OlDryqmRZ=Ias{Z+&Mu}E++t}UBxO4P;ubfb zR=yeyT^AQ9!QvN#pqz}iMTR-|gFU4C#mH$s33e}>s>jINPprbTFe6N?Vp$g?dI;7O zM@G4FfuzUgvyqVU z%(w9nh1RNT&IlJ|{H6G3aemE*f++54&5dw;$HSY+z&vd|QbBxW=g1e#PoG35R$Di;ia8cE>f(g@pBJp9 zt|D`!S1Y!gNfCmbrdh2&DdI9ItI@OVU!1L`X)YJFeV%Ljm(NcqnW)>bs4z$cqNPai zXrin#o;{?U2}#o~7KGXNC zrgug0@(Q=v*w`k6E+W-mP%09QEFMVI1`bGjSwEp^78F&fjNgFC)j+2p56UuyWh@2E zzhQ8GJtygd3+~UivTnAuiaLw=i5qq!Of8lY`7lcK6?n1Zi~8gw!qC?DJ?u#u>SaEa zqw}kQL3Jqp=*th2nj`F!j!*J$>uIg@M9Phw>uJ=rQdPEWi%eI%gkge}`?Nq6-Q<6o z`(wa08g_OixC0lj6NHE_>*v84j(t{a$2;7ca2&-X5*7{5Lw@rCC(MpNEN@*-ijY>O+Z0m|Bw^)s;#prpg~e8D2vm*0iFL|{~1R7Vc% zPFP@ko(($WJCW*+N{!DQH!D{0%U%t+2KU*7!(zyOPB0nJqL=OxtEzNm7=M{nMo`hm zst!OdGpNg;0-{TyuEfi9F;Qf>$ZzILpDCyFMx)8uf0X~G+bU&e<(XU`U^_9YmX6Eu z==#!u^OqWJqQMb5n6zN4o{q~8LR&=!lu5D)HJPwV@?J4yNX`1uMP4+tbf#Lg{+PJ6 zD?t?EmrZoq3Vn|;MMenOe6oQ_lf>p2xf6|ra@2;>$iDYGkxc_Q3XTb?mm#%jE(sY_ zi75?3^Qz;)zM=ZT6lC!Vg;ox;cpN&E+pY$4Aw8gw`WBT#8rWW&M9~(U2ZSxwS=UAm znD0P8;Af_rXV!tY4x)}mK+<%1E%s2FLExcFu zs?w`S2Fd)2Sy5e_*MuPtu+i*ey(f^05>BQuYUq**8_P<8_Jbg}R&wrMw`jJ%3XLwY zrb@Q)2-1h)$6#0}Q==KkdlgqeEq0v0aB&OvTIBSJZ%vG;eAb9K+dx zR3zQdUpaG-!KCj$!u0$JYAiA1APKFOnVNPB9Z!M!gj#A(ehcf~tZ(#z^vh52ZQU8_ z4gh5TkWL1EL4nXV9Pcz7JOnp5V86t*AY|Q_TLlF0(#TrMKp}W*ZK~>;OrA+)D>?ugq0q<*IPhzaElB zYv%lP7G<=nZG)GcG66bH7H}yB+!BndTxwG8>jmp}QN|@>PEj-lG;$icQ!a%&=`TDV zs2OYfDZR8Xi*Ta4)}ELD8kS=@nMnELx9CRAYWU7#XOF_6gt?t8AdQ|O!;cwc4S4ol zlqJz#$<3SKe1Xf4wo^#_+-euIhLCMhJ#-!6G7RXiL4cYu77Y`j{#_5Umo&QoXA>$@JAeTU z+ERVN0+ax?f(m9zl9)gKXw}laDQ=+Lfa8Ki`jK1-vfe^b%tA9`B2GwweBpDrk8gHm z_WLlc+`-&4=-a2FGD+NzE@cez$bzj6Fb*w3S9YNMx%vq#(3ZwEa;9c91Qv!N^*R+( zU+vacAywKw4&2pY57Pxl0+c8bf%h<>Bu}t>lvEEWIEg}FYF$yY>T670oka0G*8*dx zqz?N5(DK7e1`o)w#P9jdIKNg47psuTt>*VoKXPN+d0jYXFzIbSa_d=+s-`M&CSV;H z2?XW>@FrrpF6%jSUOzmPJ?D{)r>gIv0L;N+(=uq`o$!6_%yjT-w0pA17Xaj?D%ZDA zS2*RhrGaH#YF}m=Q7GMRLe0LcS*JR|1~m2kinJwvFbT%=%9fM>?8vc+!?;bBrG{0@ zhd~!K8=G6AfS~vAdwvJ^fh^U&yz`T8ZU(kEmrYdi9@Jj1D}F*=Rd_*! zDYhe5Uk1JZ3TgTe4GnL&xib@ptc@@Zd?y%XtxhP*`eeTOLn4gMlf0CBsU_)wC0f)l zLX-fqW&V3Znt%7;U^WEHI)*>l({G{RaT0d)uq954U~ALC`4H-(k{A2h{8HwN#%3cF zLp=~390sG;S-Kqyu-?INacW7*4NSVY5X04k`|4OobA8Id%a8F4puB@z4lxo|*uZyD zoM6tqwO`t-xZ^BYTQ<;XQ?u__$NV)6dbUZ&kG`IcL`x?6WUg@KZ#WvGicfltpp?s! z?_cHz8uKxi5y7ELeNxL>q|Rn*S)Z$K>acMPq1KF(ivCur_hcl+rI);87cqD)k+5&E zjy}fr!26;xS0q%{p$DO2Hzr<4^88Y=C4=L^!%_n3_!$W1fAmjJAgJA>YLG^zo7f=$ z1k#kdlD|nY+5%Eg`5HA=L@Hdq1kOg6&F4T$NZd78c|}NP4Gm||5{(Uv!>5PR8bxUk z5=emfS38hf2E%_Y+LG#&weg$#yhhV^Rc^5T3MvY5-IDViEOe@;Cl<@nu3S;ixubR` zHjuS&8}f7AG+NsZSxZH%Ud3oo%j$*w|Au1b*y=54UvRjI7BHOVATwN}&$=Bqa96!) zZCPQtK6pGSBV9cGFw$f6pVQx3USqRezQlqe5M)f9SD08Fy279&rnHRtnM& z>)Fd|{f_Rqn!?)IxAhoL4r5`i!i`&) zazl13PGn4>`TggRGjSZ~vU*K;|1q+n8Ec&N;_v)Zx|h1TSX@j#5rYsm8B`hjj;ay4 zg{9%#Z`i+V-z+rPXida;EmP%lUtY??U}f4|M6{N0L=7Jh>>{8%T_slq-#1=%_N6T0 z$PD5(h^^(LtZl0MMK1b8#(EuTdjul`6Fp zDbdE{b~f{&cICWO(9DSGxaozkmRGV>VeNC!Oq>$f!ZQ}*$bmqXFq@!c(;miko+BwK z9-&GPtgzUAKU0Kpz#8u3XaI%KxUlc611W;$mfKoUFM%8~Xr10{-N-RkYT*9G03T^9 zvx_u1T1YSCk5J|_*KumPHq}I%@tUP&ANhJ;AM%$wW9JG&x$2H3?3rXx&&%^9ieJDN zh+{wQj5HWgx^T>kPi1-Q;{CuPuNMM&prVJjF(w_Iu4$`8})L? z^@?pv8T3K1`rtYl9eFVybTpmRvoa)DjcAV;Cu#(}hZ*b1sRi#&-_1#9@^3ZT6PSRR zL8l(UH%YV4Jg^oVMl63`HY7d2)YUb~i%z*pQ}Qo)eFYD9peF)a3U9Qu)(~IflWq$J zM!5poRJ#DPdjVWEdifsYN#K;PD8oQUKer}qrX8L9{>lMX6k^vyy3#8iba>|6! zADS`g2PAiv0~R|-5-rypKq)~#wjOg4n=egmbiZ4m3?_QrP<#5{vXJJllA%+lf2FfS z`=hARqmLz;R$KatOL{Vg)_ok4p$X@LzEae90(d_b$^hxYx@2$Z)&5*|l9KEHs`DvB zmi+yp05numJE$up+Mz>u8F2-!-t8$?CP4C)ZGD_Nc{>xnq7bI>NWVKt=-3>?} za1+kE{wpIa+t3hpRR$l2TM`J!2R^G9)!Z#5gx;}_qMB?%eBTs-8*Ag_8qcKjp<)I% z5n(e}$3pTxG_9fwUO%CQE~Nfmjyd710d-c3flz=<*2K{EoHw{6#J!uh#(SU06=KJe z`xR%vO@6pE*rS!TEYO}2+;&YbpRfDU0Oq=yeG0=ydcDfSRQnCZb0HNl^`>Wx6)VIy zo(G*j(-jqHclT%tn)j~FCqRoG=)G>$KRSGqz&Fe6LI}WjE*E|KFty|5IAOLc;x` z3w;hWvA=f<><237!=Mdn2P96SU@HeGUP79tN1gcDQso1AjU4wSU;e%}GU zxZ_kytOkv;=100}p!6ftJBM{HrtG65*#_wC?@WQPS%joT4gwFLsU0R9JaU%L0WK) zO~c!{)Sd3Pa3EEL2&fqXu{jH=l2Oaw!t|A}AcBYj0v`c0=>;JY(PolZSbLHJV+s=r z^~0d39t7DZ>C*OROSRmp%x?|8HdMJXilKwAw{7LN})3II55UB{ml4V z?*r504rBEa(WvZDm=sZ3F(vYH@Ly?iik|?b5?G)}mvOChC8;suqaCI%*=ppYoy|$el0Gqqyzn+n#g!3Ar8T?Zi!ZU2=Cklt*&tBnn4dxB2)i(earo z?cMaA8x9mMHPTQRfD;@jmF7}@0ittQd`o(~Y@Zzy`25^|!3Dp_4|K4T!LFSSY5)Le zgfT@2fY^~;8;HZ}ZG9^D%3_Iw6km%xS3NhNnoL#80Jwrm1Adza%bhncvdyt-G z?0oGsQ!l||=^8CFV9fZoc%DEFU5Y)}3;gSTHd{R!v!UI$2(RTEJr zSPHt=RN#^vqSB#Pnsgom;ncd}ma7gKtX#41#)tW~Xr@0ssJ#=A@qg^1X2`ycF-2

MkM4KO=$6dOU*%Y`FyX9fNa>z!L!3FZkfv+-mFl5(fDTr#>r#K9)k zcQ&f~dz>Dw?RP$|$*7UH93)^exFFBDEc&ejf%8fMl4S=KkU^>bk*5CX;Bes0GvT8@ zIYH0%!IvyvEmr{#`s`Xwoz`!VNr_-330`tm^A?3(Lk*t5ske(zVfV)fk;Do1ZO2i# z!$ELHlbk1HRBJ4Jbn!+bgO5CO2}MDHEaQd$4JF5Dk`khCwD5r^fi)HR18s zy@q0Pvgr20gF%}F^^PZIOAk<#8SF)Vln7_boCd~qaqWAP)1~g4!bOwbPtxCGfwSb{ zwr#{|+60H$8P+vIlLjM8l^Hy009yBU?e#(=W6POHM*~%29EWA$jM6rqXbX+1SreHB zhDKPcB}pCUBC2(g@F$QEN~1ro%OK%pO!r};IPhqQxjgVVp(*twGF&wU z>OXYsBaZ{mni+@*0M|#?k00@$iF?rFykPjR0}?})6)FxG?hr?|;RR$Oh9wQ@`Q;8s z_H!|7nWo9(zJ+U!s?Q9d(45`=%i77^l=$A3If11?W6W8z7?nUm3+orruisyOJP!h1 z%3)Y5kIMUd7-AobNDL&~x59QwUpfo4jas(0Kk z)FAeCcr@oJ@Fsfj%6$kWm$a>s%os}|Zg5m}yz-x9n!WRqxPhVx*45RR34wsmW>$7qV*#go+Nde5$WX{>aJ!>BL=u zh9VDA1+|r~dRPQk2G@Brfj`AR8+Qr0i2#73)LC?*_8^tc-(!t`UN`C+XW0xq@ zxKC4p4A?SfJlzC6Y=8-N@(Gqv7SgVyL>*9Oe4_th66F=6xKfYEqy6IPuH+p@B4$Xk zDhXok-80HbZ*Yuqr=Q@;FKaSlaHKv;+aagbXWfFkvW0fo6C{&jtX~>`&G6-(mr92; z>r8-%U4jRhl$`I3BZ~B8J-9n|IN=ww$Z%RjLh6Fj4leUVB0~ZB6^rWsk7LQ(4mQ+e zwYre)&@ZDFRH(sk=8*IA@Wc9l!*nX4(oCx*7B%)+z^KZWM`b{t2v43J~|D#A`W1lkX^`+Kb}+dwcik z2tPpPqhtlFmU|<6rVl&Uta{VOk6c>=`XV^(H|_kV?@&N|$Vbn~114&V;c}6|0Rvdr zA3R{>Y6e799Y#WPHLe)Vk9{CU4(#Y#rX0Sj=q-`aZQH0HGWZ;r33NLtp<82NH@GlO zBYh}#(s&6c8Qcu%3AQwW-p1sTkF8RoE(Ud5kcds zfB;Xy&rS|fUrqq$h^awm%hS)o>Io1=;)0?ea}y{oh{vIgpV7+&Um;DW4T5>i(HVCx zb3!v`xd0-+s!!-3pmumy8a?nwZINBvuB>kIr19m|r35aeIhAq@Hi1>eQM1gSLVQ1$ zU|UE-fy)fskCQ1f;8BT8u?n5(7>{CNMi(Q1_8%p8Hs9&#V|I~Ny+i5hV`74NwjrPV zN?8y$Zk_;m>jSWzIdm!A6(TewBUo8RpL59XFUOxc-{6fu63=u|X<8YOV<=VCdO92& z7--TURCcj3hdEi|s8=`?B}?85C@5fD$Eu`)35WSJo-)O0rv0HZi zvjO4r!l1MUIR^#TsGKM1#6RE+%J(vpCF=sLVInZuIwqSnnYG=WVN6zl;=;zt7cCX`TJXcy{|}5&C+Ln7 zG4T+bgV#f)<4AzMuZh*l(Ef~&=F#u0-yeMqe*eVG`cC;gPVip=97eS@$J*%=vRa~YY{E>kXFwm43FjOqbY4Ny3CqIPm z_1M9SC@k?PU7&zA(8dNOi+yKg1@z1ne51ruZ@geiL`q>?WF5XQ>;>fA?d-noSvUcj zKljoouxCrVBX$kqnfKa9jI0kMDJC$2k1NDIxctoEZl|Ik@ow+}wxeFv%3&Xo%%a`z zG8EF}qNrX@b9PwFx&z`_!*3ixL8-O{cuzne#EB~E7GbuLe7||JYg)jf9Q`d-Te4{k z@xC8*QE#MsXAku=i=AWSkL5fREaDb1J`k-BJ8cru9Hbxk4AeCkLxkrw!4z9)3iQQW z*_PC}zeIt6*gHxX9P)H_mBJ0weg_sb$_F6hk~k71pf8!$ zM-SrQs$D-$T_$}hAkkP&$rHlxsFaY^*arqklIc4Pk4ZqSLs-I}_!If55#p3(p*xt! z+gq|p?#%#)+BKqGVI=KM4f|}}^b))8)nYsYT;fj*l@A$`8kf0x61)+^)fh;Wo*lx; z2jHmv6}Jf5&nr*)mangl^>q9vts`V~fx47tnKLOhJ^X;0q7DC`gBJ zDEX0AZ=XjtDCCDp%bWQKtJ8yG&=qVTn7%aI_Qjr9+pNiA(SaANeHEx(4N7(d@#q3G z0BhpX$0OPWLN3`;V*f3nY(klv6sQI9#&jL#>$_8-?73*2M-mcbhky9i5TiJQpgtN> z1WG%|ou*&&q7CtAEN~4%)QG^E`pT8L<%T$3%w(8 zQ@xXF&>y<>KzeN2N`uyYo*qy@gD5mLaa+AI~km(!hwn&+e)R|Lq_*#n_J3gN}l1n8r_P@gqX{0mBp zs8>xV*nKD2cO`1}gFG=3cuW#I@QV*z-~~Qwwzn&4pZDhqi~?IC?OPk|S$|zXQy|@4xfm4*Zwu@()-#vFt}^T9RI%C{gSFee=?~dHrS$!oZ>Xs&W|@>}FbZUbVoEK&#{i zjGvMyD^H>D_-wa0_rP0%dECr@1DHPsTYL)bURVaf=fT41F5?#X#caWapD&s2NZmf@ zI@`se5G*S(5yP)!%D`Y;_glmrAqFhn9G-IF8UA(HV5n&B!EQ&;oB=JV8=DhMo}JA+ z&0OZ@Ka2?_tyc_+wTFZ)_8808q_Hsr8wMWvDk{Enc+>`q^-DlHmw`mC0Y#n^T8Z~QpAZ2tceIUimzJ@zJr$;qB?A&edSJ|+Akkkeaka&%%_ToIV zounC!CtBFf<@_~Nd6QaH^A1&cc)WlDWyd! z?b|ZmOQ~}qpy)q9^DT!*#&&lU>G~Hkum|wC4$N=ZVTm-Dbf~vp!lR4pHUXgorYI~f z7@>B`uKydnbigBAO7mY8Z%E|9HZKSHVxGxUptHPK4D_*7r&ug@)YSXMe9#})$GI@z z|2ZqS#%VMjaQg#imDd|MmP_fJ5!AuhHn{1UY8lK9Y#-IP)v<q1d}~^at-c6jS_IgGz>SVcO-Rbud7;ds4N4rT zUUUya`DPZ#g65qSQy#&&;=+Rb0-hh7M;i+aeU``ji3gxJJgu;?9*<@p0YM0=5&IVM zI8cPxL7>K6bFdPJ;Ex2nAHc*wYLQ>Y!(t$RJfD0Fga`czLvEOKHfIL)cVRX9csXJvK|%UU zX@UX=qNcJnEx+hcWtv)5-=!MfSsB7n9w>Ou5jUj-v}5w)@cRD*xCGUgI`vP>U0(kg zdB_i}$Y!WTP6Ez81BMQnLX(`FLi78fyif4U{BOXki&IPUIC2 zvbp7QjegWfsUzPHXa<7A#mJ!5K^}%Ja6z8_pj}=+kK!3=|2bj*p>(#p6L?Z0PyA3@ zW%bN6z-p*jkXHr{!&_BcvT1R>R&YS2m$xT&JqyqMGG1Jv`g1KUOfa@PC$G9bm61v< zftPIo*rQPYd*Y4<&lz5ZS6kV$`Fzo3z!WMZJ3+rD58kS^fK=6aT&Gs+tMj;G z5OB3Qay-Brog}PSPw^~xsKXUM0L!NUS`U3oSok0i#KFmqIj}sR%79Vbb<$5;F0;&? zhCC*y3cG1|)n$pBq{At+Dqe;) zxDA3Dg$J9;iqlW_Y8JF6C+~VOd7tF64>Nf0g1Yt|JUeG^00DPLU`Krmj4t-)89bar z8w8fz%A9oqmZx8hNtx2)9W7JBel66yiB@Z?YBxn2yc7!XY@yL${zDRDK5a0)R$*gd zFwkq&SfwR(jl4ip&85KHkf~9iot3f^lluccJv(khqt zurmcdXhiBT`A&Py-&7LgmS0*owS%q~wulbx#RxdJM>|&alW1 z0Q>B)qjO;R_>}&rluDE)Ek{cwmuqDKu>m~a;V7B9c!7x5X?Q?&1TCp8fXO2{Att)V zq*l9qk4lQr8#p`0w}}p0L9+pgEISb)iSatUfOT=yK;1 zMdHn&i$_5 z_OiP^hNA&_2QP8EE5dIr&wfjujxw<5nK~WK=NZ$drVI>84F|av6crrGwLrmZwIc5* zc)ye9eFgVB#lAYSeRd_8tojPh7>zRpUtMdjHWa+nWUQp%QF9P_5?<&v*P>681cHO+ zYDK^HR%>ltq4n82w|(=rfKM0h+~U0lEPSnr&F(Q04zxV(9=Vw3&&t+~J!Vi!=c_l>`^(?8VeTlSaiIr6(Dco&#HdcR;xQV3QSLJ9O=%_5u*uyTC7gutm-OHd>14h?Ki#$Be(P1rAa8-Q~W&=CAA% zc!_0y{qK7(-U5NOzYOpHufMlzXJe0^Hnxg0)gS8rd&k6G8XgDVO#E;c57}RunKM2< zC68q1Y#-L+5p*Gfw!i!Ltj)*vh%GOwAB9$bUyGae?~ThoZhkjopUC}ii@MmY-}xW1 z_D#I~v%kOg+qNNA@~S`=p5vV`e)Wg?I4N4;RXFzXG5O({y#p<-*zdraFTlSa`+>I{ zvzN!O0i(edxG;BX{)>HbyP}g%**}K&LF8^X@0tQUeAl1a?`&7EzGEApL7jL7xJ}}2 zZ+|H(2k?q(KQz^k#9h<7yQNDB_P_e~AoMN!dt#`PewKfLh=0>&{}HI^*YLW*3)LxF|p^y@fcfW6zWIS7r5n{x?v;7Eq1jfMB{D7Wa&q+tGg(U-M^TKm6c3KW)D=J@-7Y zq?ln?VhfZ(yNSgfCWqj8GG-97K0fEi$k2=liGA^j2?77!KM==AjC}3;hWS7lFl-o~-FBoL zGe;1!fb`K3bRtG<#3Z7&ju@i?QPzkt2BPywVcTeI3p$sMZ!x#+z?$9L#^^3A9I&_T z*^h;ZJ@mi?7A7b5O-^Ftsfnpc;aNN}H8nMHk{pJiAoji{w$mqu^_%wJSy|zlZH#U^ zl8eRaV4=a{NfHsl?NC(L$g?OQhgnS*H{Vnn5C@d-k zqi$%9fkiYl(@Z`z(=5xU!xL}%3G>bAS;LzPT6Biyp5@-{2P|0C9vwPj(tl4{&m@bl z1j|rfx3Cd$CL+D#)ujmxNFS=>1r9-XIH*?6vkv~KiveO}K?{OsZ|K2+5ilHtWqo20 zBk403&Y-Sq@Wzse6Cv2&TZA|2793or?Bczv@~&j)E3LX?j>U>NE6I8)1%dspC zr^O+h;sN1ZIJG1kFXM#M9|mNIfEF?>?&k2a0fS=LK}9-9QD{R^5d?wHpqq=Gc@6_j zoS#DHjR~-6>l8gf_RJOVT>P6vdYpDgG9?UfGM|ztMBZdPpeqx2JVP@j5#aNavW1DE zFbes2kLxJpGl%B$3hpw8xe88;O#9-N9H5T8UaSu1H3jFr4zDSAzSF7c#ic-6!+wCA zTm@&fTA+M=bF~hJN^#Qjt3M)ZSL1wRRga3Wc2hmoYp%8`y0>0)*qeKcFW*vde&<#Y zC=yD!JxxMUtJjJYsUVvfk`S0$-VhG|NqE9zGr61>E)i#Yj9iR>XuN$`v%k!}rWfWV zoC67k3hpsrmI@v+#+nLVVuJxw@QqT5uIYXnWN}HsQIJsyN2;;X;u6@BZ%HeVlT$CS!Ryx-x(ui5w3ASR^X#)89-GR(H+2s{!}%?P!H8icyMFznBxFbzE&dWma5w@1Zk>MV*l6PX2PZPpi8CSM(nO#R@EDTK zx#-7lvm{>n8}jBC%x#R4NR>eAGtFJ2V)q&r=%=Xnh%m6ZoZ)ukAXZ`F^Kuv^=H#j3 z0qD|k7$_vDTQHpAh!6hQp5bBs{^p)7c#Nx;rt5Z$1&$=hNi~s(m%H z2o#WL*hkY-kqnwNnk<%1G+823D!~eu{*7pOa;edHfFuNBSbIecA=h)ddqKQb1I~U# zGB0m|bH%*e+nnB!t1r&c*v{;EJf*h&k*F6kWgeDW@(bbShv%dyNpO+DpgjrN?X!m5 z{^WE{xL=CvB3ye6&Wj24IYH5}O-2CV!5*w>7rnmlWw{aLB)|gfYyso*N(5QJ9()VB zl^W(NWZ$^(V*oWAT|^w!0UU99QZE>~Rd(!5c<4gYMpV#*Vj&Vu#03 zMahboQDH@)`wB)^bniiDP|#=Z2flF-U0LqSfbIYq!#767*bOKeYEBq`rdI$+VF-6j z!_x4gVOXw&=lU4$nd{}@H}JM%)&GWCRZg+R)NJ)r(RUE&a{grmLSbm*GcMK-s({EA|1Uu;8dvH0WkPBB^Kq9{>ut zlEokiSX{vnGI(`hv*YM5`U;Q+Dyewx-#vvMcL(QCKd@dKL0S}MI0i-FFQlwJKxy}7 zr84^{I{RX*LN}4l5lh^KlFS7QBeVafm>_Ex!;=+R_s~98SRjp6rA_!7OKoj)n7qdG3LXZ5qqUFKg~sBdwkWjAcL2TH=FRvU|JO2W}@H6w#q8TyHwP+>-=l(TmR?|e>+ z`?S--GnqQyjESH;hOtJoISlr;(VH1K2hhqWvWX-b$!~)$ID6D4{v7&b2!ELe(k0Ma zO}cAD3<)y}Xmg`qbUNC6SV?kT)xw^I8&ttVvbv_H5HzW;r*?}lriFd#PK$18flOIN z3wy6ey->luC>3g950*eUR06;<Gx$gd;`ZfyYU@%8Lt)_YwD71z1^;;OEz=8r7qK^ z%I@;=?c3^-jk|Z&H&t^#SnsLkytnRi)jTAdUQ;#q{7M)qILL+2Q_&kyx0V4t0M%L_ zwSi}W!AH@$YzVf1@9R529{TFe5ZZ$cWV4H@T-ZccarhmE|3$WIvO!bdQ8q!T*8?au z2yN?#kHvPQA>oTPpXjSdPAyAcbuP9yHuP2GfVWz@n`r&cor;3DZr{1XKP}>HA9sUw zxffuGQn!u7Y+bH=bP=)p!q)<;#o!)228!NL^i0#_hQ>` zEb0;VT|cR9LQyczE-Dz%~9@M}vYea?|gE~#^ivcp~fOy)W)y@5s6m>n)(vjxacl`5l_D^L+!e!Fvzq1 zOKH3Nb{4da(`c1Y0~AhSTHv9*DNTz+4ReY#z+5V7i)7t0*@iYeinP71439*E97qEj zC8^dcQju!4NEB%etHlZTm1gEg-G81b;N`sPG{>Xvk7vMKtlydgIsk>@U&`0F(A5Sw z2|B-kRaXD``2yIO(S(7D&~8vVXFyj3VG&*f<19u(gK1!`x? zA+U|+bE>+%5iYbIqH4d<8jdaAUu^0cz5z04ID(~>#f{;6mgt5a zb)m7i3Kb)w0&LuPM?cb}G+^qHg4b@lS+Y-5@LD_^s0uW6#M$eqdEvq>f@j5*e?14( zbv=biUNSku5jQw8a2m{>%OdJcT()a)hVVou zGG#^Nkt{Hf?u`uU94M2>&qK}cWO5$Zb?LG<00ZMvO!Nj6G-!G$*$+?Du%&pT zq-$!8MtfseLsuJI*EGl)qr)23E{3|s^GnWxuJL#y+154OT-ji{hF2{*e1@-fnvt$? zT-S0`4d^=}(G>=V&RzpHWurH>MJopS-R=-h@7BEpL+`ibOb5kdm(JNF3BoQuhuHyg zu0<}-l^N*Pv?ZR}iKcpa)uFWbqI!SIp)S|&zY{qA5I2>u)--iZD`ccMtRcM88rD=y z-qJOGL_9qk6jQl0dKvNXB{iprbuvhOH?r#99B8e{yl~bKkDwnP5Z{352gY5M~dZufd1X!D{8N^wmA#1jP1)f|=5{xk4UQQN6+CK#EjFGKn$`=Cj zpsL|*FW%EN;UZaNx+Wa-+6`4xi1S`_kZi}rC~&{kzE{0|;5B-~6>ZbS^@0u28nKDE&Tk!7Ic+At(0sQV{Mh20p)xpdMVCZ2u{>8M6 zL!{Z9>DDiy(@;jl_aC%Q(NRF%^c~ z8{!a*t-GWJ=9VTpP{Hdnpn?NO4E2*u)@DN-HwT|2%66l9w@(_sOUNE*Rl{cnzSW?5 zW=@~9k0^fT7aLAq^D}d05cV}cTZmXv&v~T{8&&sJHY&s$ zzQ4hu((sw~!eDThH#OG$;YPAn*TPl3k?6wWirz@=_(rv;w@afM=dRu^tXDOv!;M5c zwT7%CGd(ogb;`O)yn$cy-}Ptc}y zO~N4}|UO*2R?mUPV;Z6r5zO*J_%16@PIL8!-7;2X{M zJ)*oF)RhPpQ^+V#0b6V>Nu=~zP5A?+q!;|bfS_efp%IlL$x64BOO&*AMLE9OSZeD> zOxpGrbWMLTYA@-U_P|@ra6YB%bfRsDw55Q4d20XVB9yuK9l>m#ooB#m3TCK@cZ?x>mq5Fk`+k>+J+2>#TD^!5JM+QHRW-sK0Tv8) z>Lp$6g?w1;*Z(7u>3ea`w(;!#C@ui-7*Cecc>zU4aST5Nm}w&hDvIu%~@5m)Kb_eX_i`Q(pKuOQrBR2 zG!v|lMvvcBb~gMW;{=^0Vt2*!##&>jB6fQ14Xpz7lYUaF0OJMTOq!b450)ZU)B|fa z*7`$DIE+_|jUgJSu`$%Eqs91LjXP?u4TcDcLKuxkP!zGP>0IQq&!xeVB+sN1ocv}s z!Py{ zx;-_D+-+y|iF9I}fn`Ztx6}G%Z2}bYAss61ouEO7(~DQxkkCNmT(8`nc#8VNXM$U) zAqk>;hn_ghkIlpUx@NY(Irsmu+$^AR;w6m7z9b0{1bo=!YH#6L%a_x5xDLvy7Y@9p zdI}7mRWDRq30|*T4znyv{%l&XVX>(XpS_?f@ zlZd*1n*ny{h0#S>EpEFbb|eiX=48-E#*h9)zW@)+rggh#b2ga}`Amhy>hbPBgcTH- z2To!h2G_~|i6I|cbR4&)-`{d+k<0g+1?KXF8I72tn~e1ITSa%p)rg6Bes#D2QMDFv zRa4-r)jLYhEPK(~tw=xO-3o%cq_OF?!n*`eiF6HG-Cs(hBFeq8CPiL1g?5bkXXO72 z)slzo7lbVoa@ErAzMoArg*2e^iFSQ#4jA-?=N&QRTYYMVdZ3^xhIF{<5pVE;u4y(( z78}wKX;4$wHG@NZO=BbastMsNjjHej{7(zySJ^aM=Zk zaBn(6x?`Cf;q2`+OtOA|`V3fw+}kePpaBs^24=ki%o7OL`$&(W$@RN{>>}-O>zArS zN8HwmGtdsYzDqWm5?=5~+fg3FtKMQyyC2uQc%!d}%vQXCjw@Z|Jf&lUm%`1Ijt!3c zsh);+YT+;rmAZ|Jg!@g?)SllJusk#dD>d5G4#}&`S;cNJnmcgF-_Cuu9TYplxp}rc z$R|ym5e|3|3sq16FK&=f!;=l_X*gReaRraoKsT0fK>JT(eDHh$9R(!{ksQ_`c>)c|s{&4y%O;($Ma`ooLV6mm1YMW-Sp<mYkC6rP*2SgbMDl_EM8pD7@Q0pd#9J!YGH8MIm(n&lnFY-cOYCQ}HkkvAqmy4mc4hDvrf8CWT1Zv! zYcf;rx$O3)Co`XNH&xNen?rsZ*nu3%p#DPUY`f)pO@*~VguZJMryj4bq|f?cEA&oF z+~LLOLt?|(>{RCI3XqGh_FKj0zK&3CwfvThP%iteO4L#Ti++pvzKS`9eKHDS7N+d~ zs7!4^w$A5T9<%43Y59#-B$ICfN%}-R|2dx;Jr(chFA=|@yDb8rQSi`Ax@`q-=ljgi z(aPb*FdL`O7JIsVqf}kMDCW@^`FxysZ7MH}HSJ_(`gct9D2h>gNAY| z2tz{CIqI=}=|t<}nRJy@fQ3|~&m$OQex)a!vX58%in@KS5YoC|IzO~XucdQB1O2pG z%9GOf>l8T+oy$e!q-brs)YCu4Kh32{SKQNEO{zvL-j zN*3gUC4CQU8pKk!qk(18zP{}aIaRR)Wj5&h2;UwfX(n&$Vcn9>+CZ-xw-)7kPUbph z_uaX&->JD3<%F}rtFHDup=^Wr$~E0wTdArMHEXOhP;YKln^fO4hct}qn`y7)wfXP{ z8W6AUn8A{=)93LDsU>fqL0cjR()b%g366^_mnfTB(S3&KDT-QAr2UaGi{w8Om-eV- zrBXIgnTo|VJ|6ua6nV#h-y8)#Lmq)Xe?M#2cjZp{+>=SKOYsdaFFkmt3bjGF^l2G# z!h7|7>2r;ZX0fS4P8J8vxC&JHJcCK77?F4@A}tj=;#FF`ih}#SUQb8Nw|c#lf*1Ts z1>>g$xYDb%RC6F9qEeXVS`{#u&-p!|sweeBTs`!8pDd*GD|jb0d_{v*#Xu`D{o2MbQCxAOs+6091?o3el-ya} z;7rRGmRwoX(x6>qJ*MDowrFa3#N0K~(D@3CLB6UI5Y(ETno2+r#zRYGv&?Z)chl!Q zkff0g`w2bf>!jc_n0j^okgwzsFovJLDv}kl;~Ch7s8GvKDnvf~Xt4%==wSk3ah)as zG$T*Lp$S)F5LE9J%BwQ!r9`B*NBQ=tG=BX64aQ@_s(&&Aif$M^6ced+czqVAYytQe zdnEJp%0egT$;7>7Z{6C|I-cLk_cnF54AQ0=-dt(-BbnbO7e)(5=E`BEN4QFGEyla;-H?%SLW) zNtX#RJ8LU414{)gZ>=9x$Wl=Upf&w9SFh_5VW!T$=5o)_`N)kTcQm}nnwCx)RwQkr z^Hy}iQn;YttI4*nzsx{u?S@V!w%`oHKD#AMH+ip>8|JOiQ%!wzu0yVp=>1aeDe z3P2nFTZYW9@^9xwj^#*v6=PgD+rN`WGy9b^UO<*H{V62Y;$>LV>&a#Am)(@+iTKG~(bWZ6u7|so~nqW|U3)X!T z4FAF=PgOormPW8l=5noIm83rlb58xZ?4?y%NL8f%ljFq&ntpJx(~@W`Ec7`ji^|~0Q$weKp;kooa6;F&`g)iFCrO>M#i*~cR(+ip z`9^JMg$C3stts}iXnBK{VoOVo*U*+;jfF+Ut_q!wmsghF8u!>RFm=_dHgtq0<7>)b z1Pi^6Ns}*tc*azXQT+lccb?xmW=K;;Xe0G&KpNN5XFxL{N#GjK1L47+_Ri$1Iiyn8_8jyD)0Hq7H?t3hK1R= za%;1)UQvd1t2YRAgsac0yrN9g4QKV}+|w059_heay4V1F*8OQ*9AHMDU=E$)g5GX! ziL7V?2$nmknEQrr^c8crh)=m@?hCL0=Q#0;eZ|~;8uf}Y+A_Bk-Mo-`iS*hLWd&Jn zF7fz^4*87pu%V<~==GPBw5!6#=<5(z&~bIq{JuP*%f+BI}MN5w^?u+M-&1S*NN9&@1iQ(SB|kNK4Fu^D*?BwR~* z{Ym+iGrxOTX5Hmv1eD=q-e!rE47AMyF?9d2@G~vD%PCf=nUXQ~=pCJclC^L7>so>} zsXxrV$TnU5A&7NW|Jn3eUi8hLVvMXr8yi|Y^8s&ax#z95T56@5A*m>9XTe!`a;^+Z z9ai3ywoJ;UZDoU`YK;b0Hb}6NT%$^(Wi>0V6Wiq5L?^0Q3w=W;u-RDfO%3lfeM=c9 zi>?=$%J;SJMKxv0_)Xr?uBXWX@7Gi>oi?an+Q+mMg{Fe%X*5imW35FN*XeN@zG>++ zIMk=wC)FE7rgmZFO&(W1sbF1nFJ=~D%SS3KHS$0Q)k-~jIXw=>aZ7q2qv0}x_Z_cf zF(5~!9QY{!BZYfmzld9RDN?zDDm<2$}MG4EVU z7%$}WVo`c$79wu2yo5$PFMT=pmHQqKR4C1*z~g-#&Xe~z*CCvi7g>1)?=(5J6uc4g zqB{(=;;s(8i9+7jp*j)wXe8lw_vcmkA?B340Ze}q?b<21!CUolR5-e5%wQVC*`pw6 z-b+bUlD(QkLc0W8e*py$egUB%w2dc$e>^oOzoUoW;o6-Su9s{NlFQM|B@Y8OeipA! z_JI^Rigt1i83*zgk}0n-bFr@?SgDz!IwCa;+B8tpsRgSgjTYJqD|(t?ir>-GWSdL0 zqTriRV?9vt9&Lnb`j^_Yx}@XVXxuI4HQKpjQXSdK;&~a_da2!5%2#zDS=%AQ*HTJ* z3SK3Cpoh8Q`GyLREysZ)8w!p}nC_?V^OYq%El}^{3LZqDfDDJjbx>C!&m*daV{z^{ zDyEC#<||WJTK82Mg|*1NKu2K#%4?dWKx*`KR4^D2s|s$j{~*4wCO%sNMxpvTocOpL z#w`94-bWQsEU+EG5?b}kDwB5{&px_&Ot^^R;F|mv$!`2qOb%#Cq-dAf=kOTLBcGZF z!-LUOBI+hldDtyd&H;PDI1bFY>9J(C&~P`x10sXd-m6utRo>7}EADaSCB3*n!nT69xl48Q_(IZXYk0L^_a<8jlFoUGXSCd^u26Pe-hmKrJwI1^T`Qsv?T`#^PO9YcND) z1+3tKjL7#)UIE2Xq)))4f~T|Mdo%1P$bp~59N9VXjU0ksQ2EwTyPlW>l9`9)&ZO<` zxA8Lo=;jE9>CcHwW_w|kF+3%44L!}o*Qt(*eC72#N*?^$4(6v1;4S-+yZCr3{XnKn zRw|KyeME--Q5v;$SYNb?TBzS(QA>sO`AbV-YZx-vS#9fB!pNZ;O>J=tpa9-4XSp1wAqcgmipJ0Z~+QH3dY`FarV5iEkEFg~21Ys$T(5 zbkr+=3$2*?fq}=DG-ZH}Ks!SMh@w(Sg$HyKd7EVMd$@Q8eo6%#p@%dFY5;LwpBHK9 zVL#7fE^1hGmch`At1`-2WL5uQ4wcT|hh@D450{~n>+>?Z`7Zo0C>Wvm0Wq{BK+(K} z(g45yShW#njlCOu@BnY-}s0m@4nwx@EgeEw#g%ak# zV`^gm`?Id&TY0% zE3`L0zH5(yJ9~ERKcL`~&c2CB1&1+DO=~}v9LG3UDF0t13a)-4RFE{14~TdhcNN$V3X70%Y`$!#59|kOF-q(#MHNq zdt-HiY4s8_BsX^x@i>F|+wO%iCT0@Y)!}6Fo_oX?j~t#$W8n+;AN|ZjSa@NPoqp;E zM*V3_(_0=fh!Oj;b)>vyBxa6E(jK+8VdApgHhSqEfFbX%3!Ltqz#+qG*J1Nc;#WgN zR#`ObW>hHqe5Qc;(?~3Ja$sa{mSKfL5z3-pHkDxXZkNw_^{oidpe0|g) zF;ncb?Pg45f-CQ`w(Jlqus=S&XOBiaej^%o=Y-spNXL`n6VX#_JacjqmwzrX0Y+_N z0@DmkOifQtbxBnOJx$e(`P}5>--*pRIW>cnf8^#g6sAQ=zTC_Vegiz2oSmITq@~<@ z)P>H5RzM1sv{$}UX)U>9DOx%aSp7~kvV^GC&}tH1EsM;;Y(4=$I=6)e1c@k$fy{EqKX|{fEZO1vH=1Qwou;l<0B#i!eEzVp^~K@6PB$wA^Li!82lOyJ+wdF{8 z``GAKOX4zajqR{yasQ63yO2NKoZPkJz=Xv5)c##lQ;3_1{o-8c<%~eaq&VyupU+KA z)pM8@pIpTq0(2DvGY|ChsctTlgFSRAU7iO1K22bs&&im{__w3jCEhqQynV3}YDQEB0 zw1Q7f9GIF?QX5GP*vxs@%}>k&iv*@KiH;}};#0qP$v2OYmnn2(%S}z!FW@I%Gv(<- za%TD=`HjZegKjdRUUT@~BZm&D*F2ER=kf~vg#YNHpHuM57cO2@cPZtoufO@`bp?Op z-S^&mOTpj#%6splbwD>dEznRAsFb^oRF z<>wW=a`D3RFDUpkm(Rbb57a+*@m%ndfst`_Dm#BSSy`)?fh%-DycAoWMc zR>9x)?J#!<{&rxmJyf`mzajH}9L&jEK#Zsp!bSy_3@mS&EEtE8a0LTXc~SABa4Z4O zh!9}>9Mbz>n_j@Pjx6ALc4qqH7^rD8$$MsIgu*uK9u_ow{oW(FL-z_1a)17zoM7%> zV2j6v__}=d!qbAeUwz}%FTR0=SHH6S{xTL``=If`J3_L3`JFG{6qH(f^`_YD@4o!} z>w>J`x_tH}LCx1or!I@fUp(`L^MZ)aJ@wT2G8P_v?tDeO;{F#eSI=W1{qn^sO8K%| zJzrVC!pzI%XYzLm{Z3+J)y(YL-g_7T_m=kpPPYpQF+#TQ6&X{_{f?NC<4~oaI+Ko& z24#_gR7in|`oBoa-!{1-qzC39!4J9F^NER%jl(v%Dn6&Pby%g>#u;w;~Ix=;~q zFP93J1-pIXV)62eSU7(EnadXiw?1FKcp3|bE1z4$IUznSTzE*Z z_Q@}l(ld9_jE7m-#MrW#*=?Jc8~ach%>R*{5}zYv$9_yN+qHAo57-lq6cf&bBM=T| zG2jrtGKwdpG!&S&nqcUBb> zsd*Qb!<&a5csO^j~xcxbnQ1e)-kcUls^{@r$p& zArSoXTd&^~eD$?gUwv0H;TN8NOVDraxu>oOBEA09qQqzU%&E(-V&U`WOD_ttec;8) z718rt_4yZt&^s8s^xSblq|aSh6oPT;%*)5_!3BEa#iI$So1J*(u-tW%^N%KF{@Y3S zzUhe}vcDk{+5o<{kzA&{8!V!+FPp#=3^FE+17|Eog|I(Bw;VtgF zCj9fjaajjAF#-FN+yIVn9yFt$pU;7keH6cGHIM2Mpf84qPE0H7Y;tCHMjL9#k)gAj zvo5HB(vF*U(+N5Hne=B49TX+^GoL?-_QUm~i|3B##U%Z+FFbw%M|k$aYb8N*=PuVS zKZirSdgDq(v?;xF`Qr08(UJ9l_mTCDSr z&#F|!hmXw&ttpx9ZkfA2Idjj{B&u8|C#Ggli1_x{ARdi_l9(L?&{ z5$>@<{)mF-7Av3C_koW*bM;(7U;e-F#&b_8_%m1DI`;(yfBN;e%TFly+1lGzo>B11 zjkn);Nx@%ytM=M;1%L6CH(q{S!7sdU_3En%{=|zfeetS-Km7bluRgCo|6P9J@-qs4 zq;&D=#s9CWvx{vbNe(b6|E+&y+Oj3i^fYHki4r9a#S!&K{ZJB3{ZSMth7>7Ae@97> zY3S!DLDorFE3#lajmkf*$Pmka3i*Fmn82oxaR*)iH^*Il zt{E}Oeq3`|#<|s$u{9$6)?vACyk~C1o&7%X^V|FXgPfzU8=Dhk$I_#HchifoNsh+OcMzwOf zf4Xa%g8jYSgR1>;b!U4Wtmjpte6ak~J~Fa(x*><_?!%L(@}UJs;=1m9x;KB7AX75^pdRG0}tFHYOSlvU?nfI}+-g}*QhTsJ&=vt4@< z?u(NTt#^4i`OxisAGtYU5Z6W)x*EQ9YSr=~_igUQx{;feYC4KMwtupcM4mZ#zE(iK zyMJ8SN4|fwcYcZd+7d$QRJS=v#d$?yIP30(|yIJ0_5bgF4L>iLl?siJqKZaIm1e7jLFJ> z4xF^rZ-)vHXw>YYYZkc4a_TSh)R?UN{R2>k|1g@IPP<0DEC!_aUI_=q@d*?K=qhVM zC8X~yhQeztaTzqd*=DQd&Fgm+dw=@-cUo-Mk+(i{YtXqgp$@VSf(nLBC@Ukp^7=2J zNS!Gha>pMDhvs*^WiF=CTHPro+5auRz&8lR=rv39aeq82dbcm);dO{$^dt;9hL5jw zdSpjgel{Rymd4Jrr1U1t=ewIz@L}R|cP}T$!cVu3%kWpn8%Gic(F(NMNNQqjaPMOGaU&cBRO!?t2UI|Kr6e|g;x zfxrj7;3xfC5LTxeo;Yk<@W3*R+Cw3>K;0!QQeaZJ2+nJPEQ^+WU^mm1UfY~`D*Mwx zd9A>wmGY$gGlHA zVO_4yT)u%jTAV&Smw#SO&Xzajxl@_BqJ0%}WmdYKM@A_*W6MV?EG$WDyE32h+7erw z7(oYgysw-5pDx?~(e>IVrjSDK0eI~gTK-s9e-C1HN!nxz zQ_aNe^zW_(4Ck1m3szR%a{Na4NDgrK(_!H!-E8?s9H5&VciL!xzV5tFev)>psf7k& z?cR;HhGWxmPo)8!yB~Aj7`Ro=Y2*A0OX$}9AVh)<)zJku+A$?A{XPVG^&Qbu|1|Q5 z-)oXlehBEB&~N`al-1f9#QB?Qsu6ZP2o}`Ptj;iI!sd1Z4ST$MFz!eD#-X#C-Qoq+}q`n($1 zU0=OT^k7H>xCb4y8Fu##LSZdGP7aV?<#VT0i{)iLdq{e5mP>Dv zzC6#)7cVKhF+H*TjEZk2Bl&sck-5$y>1lXcFLoghB#Z^p3vbjn)X}XGA$Ss#_^i0;b+N(}6052-s`ivscneEng&#=Am@FXaHHH2#m8t=0ilKhgE3G}Py5W6DO;=W~z-yH;Zx?4O+#k5m}$eyx6m3`LQtQu z6zOrO9pc|vZNRNi$fz@^C=@ap%5w!>8)YHwZxjw)iT8PsdrFZpiskg?ddA0*&o6Wh zQ!Z?FF))}wzOWfi5YO#d+Z1cr+3c-SY^ItIZJi=NSPU*zkslRb?$G(S~%Akxoo=Ss&m}Eck)nfwHen#V11oZ!uIZj zE@4VCFpm>D(_&%KR+-#mzpw8I33m=sd&J!1_h48W5a!-#xu7Bfk0(OKm8S!*E|zY} z>z}-y{^o0J*V*~#&%VKSUF5po5kCqUS$ZBh&N>H?n?l?aOX5Nq8uD?sDj!3AZ3=P& ziVR!K4QqxWWl|M$6|>0NbhnDdi-l>RlUS+`G9|5a?QhJv$&63M1XX2W+~Sy7s^og2 zK3vu9S@w+uk@w{E$pPeJX+9N2KDD5Y6OSf66GOKSjQiH_k4Q?=2dY z3*=8{_3RPy(i6|*CRGTX;FB5T9T7e`fSmjJ5Vcd&wE#md23`-dxvWX)h}sE%YHh+6 zrR?NR=*N0cCiH-Pkj2VnkGI!iLmrP@E>-Q7X*?RQeIJ(A*#vZ`wk7`R3Q~FcgjG4a zDT~e4{Jp>b_S>_ce4B#?@bbGq`_S0T`SNEkfAj%YmS4Qje?_|;pOwN_w3~CWhsO)Z zyHz)D#|%)`29e-a*?is1wzjq@|6`}T$yris%`i)<(&1MA5RUfYsDf5kMpZFA zP#rB9D)Ggo03)6q95j%#dEZnwa^D1tg^`zU zr{kmA<|6V`jPE}~zBR!Q&ylZ>^X*gQiz9qt5Bb0VAI(vFdih8cx#;}icH~Uge2i)Z z-?5;ancVx2!5VDGh>+Y@XxU+x_oSV=C5vo3WkmpS0635jBQD2J#E+Ypt#ceI!BRB- zTW}dYu9~mU<#;59ikz6YLctlx+o|6W|1D$jk)}}jM?d}Lm*1W@$tJ%0@-JS#$0lCA z`}z4xZ2Hyrzj%Fx{PnAiM)~8t`QF_VdXzc~&?9DTZEh45gr~}CYip~5Ma$Gy<*`Cy zbnC4ocBY5h8ayzoxREQ?DsvN$ZMBm+C`&nuBUf?*(GEJ#oHrgq-Y!H+fdeB=X4~ZFPl&Z)zpVVU3$SyN*08 zI!6|{uTz^CL(bc^;m*cg3%g)*A$*uN>Jfw48`#ULAgaS7pl}3hccIrGKoL`L7Hzvw zpEq$xuvMidCYJH-klgm&;f%Oy*Y}_%xBN|J={W5yothPb*s)g_j+?!!pMUt1uYdke zFcfIzcNahW?1#7^{+omMXRk4J`sLBPvkT&Hu0DT<{B^bX@-6ao)JiNN4|;v=0py0T zcOK*#_ojkgFZzOhK;n=QwfqT-l)G-HVk@jgC*P^!bpp&fetoFe89sdMv#wjmY`Z`5zZE=5|ZW7G9$?QbS*oCe8A93G30|@R!UG&10P#V zA)oNE=``|CJDZ$F?)9-4RyHb&0e`X^x#rPKd_M5TYg2fH^)v(po8{C|hwo4wq*-+H zbs^+SVGHh=kf39mQ&?GO$iht(XA%ojPmqV>3lWpVHTCX@p}`5tG)pR=!1XYC(O$6ef{ND?-^=kbcDbdyG_G?m#i@ojRQ{)@v!ukrGXLW9Y z9^P?`1#;jEmGSi0B)E-Tnr28G!*bLc{2~C@w#Xda)0pfB@ z2(kAENd+{`uVcapbzMYnDSVgAYmrUEKs)qO%Y zpz74Msu&lfQ`yMC;q_~B0Qilt2oZt)+Abqf1K;2k{9NlzRel`ck6@=QR_5zp1U#59 zrzFXd*FFs!$o1WW(RSqilkJ5da_h3ZHHLileD$P=eCuiM_yGAqac=Jj`P2N9 z4dR9DLNSkgs<5#}=NZ~gtqmfNMtpWJ;6ZMbwnsXV_ikp=RMIh7oLZx;dA75Yn@7mE=CW%$ z$Y;|lYZ>Hynr)(Qzz)%?52CmHh{G=#}ID#*tf z3sQT=7#o^HE{=&!G?ao(Mv+fxY%Gj?P7EDXL`qna5D8!BT2F$W4`+b^>-uj%+Nq2(*M)p# zt%W~^HxJ(t>heMO1CN7^Y??Y~$oG0b=F@6aWAK2mt46*IJAO&(A6q004<5 z000L7001yAFfTAKFzs4fkQ~){{?AOWq}J}vIim}!+0}0EE`y|*>7EOOiv+vV3oA&B zq+vmb$XJ?^t;7{0X(cchaoKIz;(^P;$a%7ZP(+|8C*;JX>gs3Wcps=ZO zl~NU|T&_@ra=7RFPLI&VO5XAmrfO$er@K%8*YE%Szm-x$DUk&t;>bfQM3&*`?fD{q z(;;FUC7vi*sYChl>(BrCnR!Vm$8m(84!N-6IDcTXdz-jIIj`yqRZ6s&b54(5s+8KG zbxOR7qe3Y)c==u#PGd#I-q}~b;;B#vo*dW3A;Es>^}KVii9JNEk>L~`5t*Q(oXC{4 zRL{QqN*$LgmqB99y9SyLg}*`uos?|ivC_hIPtAHhR8fN^JWl*`g?>d#CeU^5PYPvK zmus&B&wXQ{lnO--LF%+q{9jnnwAoF6WH?3O#l3p zY^FGB5#{OA^+Dg0FFjvJstna;rBqQWyrFdNej|F{XigIM(- zg(_>g;mi$Q)iU7gu#EMsxM85;iHsItngBkIHUv7-I6Z{FMny{&zmOr8V6)@8j`O1- ztF;WCx#emd1vSt8X;+^MeZmpw0}qGg0N44qI#hNEjhxd6B%H%~9p|N{t18!(lC6jk zQ9U&11@KGVuefeREyC!Gr~F>W-EduhfY=a6RlApU@o7*r3@SPvgavV4hANPr7I=|< z4s@J>IKu@UPvAtY1UsqSIvy_SSkV`!_y17K6S&{tvTjIc$~x8+9qoi6ySQ&*tIKfd z$x=+*$*r;O;X0xDD=?Md;*{Ss4vh65$_f}Q3eE7&|iKF zYZW}OAN%MUJVO)VF9nx`xJH*7E?lt8Cc;uY!*$$>^mL~rNzNw3Gv-glo`&pa#mrUk z;d)36*GJT9q+~58b^O~yPO7+BLbL@)R(+&}Ewc+(HVE;d6dH&>#Bz}- z1?&n4JWYo+O4KS=FcmbFi<a4 zP(*1n{mwv1Umi7NJ165fBM0K!Qc3 zTa1B7k2`pLf73t`_j0k-Hcp)ddH13|S^U5vEGQk1EhMD?#MV$;2s?CKn88uD0wC2z z7&h#;c!U$uf1Bq56@f=_;5S^ym^Eo@1lPcC700kjCh&`ZQNczyRGIb4vJclau1VMj z*Ny2;%youq??U;4Yy*Lw_I(AbKmv_N!3)4*!TQvoZv#fuvCg5irAmRV0MTfWby6z* zRUDyAEdo!ov;NbdWycB8mkUrw8G{dKqz6^*1shoSAMLOh#y{Zq%)c z?>Ul`+hJ73XanjPjA`LL_emm+8xB#LV6Aa;<}s?_HBHVKvs$bv;uM~}w4$$G%B(#l z>79tNGNUj+Ssp>5SqEXHqNjCnJJJPN{?@|853n~`Mm)L`&+dd!NMqMQ^xAI-6qhO5 zh}9BtS4C{XI5a($!M=>JAi>IJjgy3hYXd=-Ho6partKSjTDEAxE-gNGWC3UW-3cmy zf-gRZkU}~{yC^P_Br-ljN{3q$HX$H{%BF&f%SdKe)m_t_aNBZ#N5_-60bI%$a5)=s zZnsJ_9px$#h~G#m@+unJKuEXkdPkNZ{Dw)FLSw>;5OtTlb z2}jE9qUDB~F7y0K;ksv8X-I=edEDe&lSDo|p?#ZcP6AMHlp)nPtwp#XuoNW0k#Lj{ z12$3zeGMCd-iMfkO0W;(6?EX&Y|8zK;-5Ts60;LN*NDK;rShuZROyZ66kTyb?S) ztQKLpG2b$t#1ureD2u-|R^fYuD+%EsiFwG}W&RyRWUVh+b|*t5^!`Q)W4d)aAM1WI zhmT2YhllMRHu*v;bAZDTvXa`Dbtu2zdmwa5_gQd~et^YfgbBvHI!Ia_=;MR1wi`j@xQ(J6L zMga@a3lR3m4l8F=p&z~n!yn(lFDi^3$WccFYwCR1L{Wrv`K0%(=zlpZaCw=f~17D`4i|x)<1}lu!3HL{RK9hePtm4CN>k7`g>eHyce0X5 zI$#qb|K|qFp zy?7duGzNr*&*Ruf&+1AajY(Z9wm(KBRI}z`R>KQ*bOdXU)^zkFa{8An<*Zy_UvebD zB3q!)c*j+O2X;F#X4S0skRV?zCb)Vu^o8e(Mymbp9ie_Hmv0(=#vXy^w)xCE2K-&H(T-;6D-G?~t#|AJ;lnK^?P&pYA z84nj$gM{}sOT+ba!y@Xl60XU4h>mEyyYBLg{BTDDZU=Oa_CgV`maS}3q zv*YGmm1&doT0YFT*R#jwo(|jV;Ro-`ecUGR;xcKh(zolFA$ngx%+%3sq(fw=k3rU7 zm-UyK66^@7Zfl8_w<+vTNQPevEVm5nlNPDt9q8dAQ)EZ}9s=TB|7NxmDpB564KQVR z2~i>amZ|*;NiYICH|->oxs@}kt;#o}9vU|h95G9#8Z)|p{&Xrzl%rOw$(%GO=xRoe{=4HQz*21)V8nh0`?U+0wYXioga*JH0IeN7Jdq~?hg{K zn}t)~167tWR{8jskXn$w@bc?rdo$U2yptVOi5LSHf(1sqi%s-?%Duv28MOm=oStNn z>*KJmOqxJ`*zQCou|boS>BZnWH|LlZ>uEnW`<+j=;F`PJvZrzJwFKd7O1HSJ?Gw3w zP86KjKfAw`D0qu;jy}{f$@-5AC#0?TEhi6%yqT<@HbV47!B!A8O$7*q@M<_pH%$^- z#y;oZlxYN7;r@O;cOui7N@fG`FYpVJ5WiJQY6!bGgM?;_-o;@*M+}Fd=HVn)6dF{7 z4hTDuN``GW4YM#6SmBu*2Uy*4`J&(!2S!w8p0$P}<8XXf%Q<(q6&;)1b4t-;`<$aE z+lq$U=H`yJ*T>EH?B@3Rc;2+!vkh=D8uKye5p50BzES;AM>6I|bJrg81I4GMsE$K5 z&Y8*c$BytT3(qJ=xp%5$md~bFP_4d!HS?Few>RMyr0UW|XP-IT2Ri#>bYCEROSGk3zYvKLElXG%7-=1v^Fz>eJ;=7Vul6+4YLYHV*U znZ`G>g`8Vn!nYBh z1q1+yri}Y?%DyhJEdjgh-{RNB@81IHZ!Bur6WnU27XOmGI^a(69VI(s2Z>-;_xE^8 zF1*2pCT_d|S$cJm0mIN-1O_?Q<8ubFqNGRfEPWfLdSVWwob&(@v~ADCh+Om_R$KXx z&E__AjGx^0{zGllEVw53W_x{mE4O{msr9*VTPs=D(Y#Z&@TiXdu}n&HPlv~JM?LQ> zaZG`TK-a%Xaenl6LhT)D5t9nc*w-%W*@);8$CIvmkFu;gdYv_h%^Pw_05I3_gn26n{d0Ab#%Y)$@F?)$7^MM+`d34Yl}Xs$~GQsdjYz~`D56H ze_u?shoM^+bbMg9j-M>B`C_LSC-TEM?B1h8$w-OhO0p$R_Q3u=OoA~QBk$M-^Gpzv zZbS%4bg8ee_WX@5VnHQCGWH9eeC`y~YvO%;jTCRnJ+!@*U6)KmX65AJA14!$o6I{( zTJ1?m>qIL&cBM7g+HKpm*SeF~d2Vj5_2#LHYm?}wP!BFw+KyjggNmMIX$cP|Ox}>_ zMkAmQpAr^5-%cBF^w(qtXjJP-%OV40l5vQ>Ki*NWj4K-8KEsJY!xZuXO>ex;znSmv z)P{By)=X6r>qVRZh2Md-F2di^vP%D({+VI`Z=yMzq}|M_ajh?x0al+cDmIn&zT?_d z$~VTHFh9zXdabq1%#O+mkYW?g9pDIkT234lu#hpFZ;i|9{dNj}a=djC(Y&e|%G~~A zIB1(?kCub>1@WJ-{d>&UQ~f1u1}s(TjgA$HZyv*<1wCTLG~WO~%9L7>ypJovXlQmK zm?35lCVTV`dpXi8li$MDRm*HR-*ilvUZrF3{%FD$87qId&i?)J+}Dk4^AkqP5vP&4UBAJqJ$k zpyjlNT6`}NuFjvd7HK{7{&NTHdx_TgT=pc6RJa+1o^G}kN{3G{2rh@>-zakoJdC=t z0QSEK-hPcuXg71oj%pDW6|y-ZhV3D7<2PAVeLG7uoc%^!!(n<0o2H95Z|0r_K$(NfcC8^Y_dR4QlBjqk+vZl_x=&Ghlt90r*T;z7n&vemu zJxg>?&-t$Ytl^~7Y5}h8&|R5@Har&fEXnoQqvid%{LuMsd#&!IQ$NoXno8@gdG^|_ zWj#HM?NRSgZ+?*BRarB%?iz&GAKrhTr;h95q)2CGe(E1Gt0tWbdX{wANL)0~JCvi$ zE5|Opo{`wx{J`3Wr_LwE{grv(E~UoerJ0VOXI3>AEML}}wIcM43|%>7k1m^9yYE&C z^T0FvpMC1Q!dwZEyE;>v?#j-i)z`{JO|`6Nagr-tHLs8uqxX)nKl8cMrB6>C{H~St zdrv=eoUd01m?8Fy>@xB=?l-@KFm#*zwpxT zm3GsC=brg<|2&(1%08pm6zN**T$?F2`vwf_krNHH>gp=MMuv-}~=g1Z|n;4j&Y6?}U&2q9;yZ8~C{spz0 zOfWe%%x=Z|eHSEqruHugRI;Bw@Abob-}Cc*-3_b7X+@|DA!I|pp&)b+S{wZcJ=cwp zY_lK-vY?|9MqmER=PRE-{(O2GyQUHOw4=j{jeK50hb>n0tJ3;cp-|mf`7KGZB4Koqg9y6QPj7aXdX8 zRrwk+Uz_faPU;0`I{jw@bYw!W>rOs{Q!iACdH)*0^C(-?V_ zN+DFKr&(_?p(l8+Qq*<5$ghfG92Lv?niyVG3Te<{nlC3Et@GtXDk`oA&>?_duSC-f z9Y3z7(=ReP)uAcWQoyRJ3ONBT@8j4*H@xyT9~vG_9^g?id*ZeL~&Z^ONB8i!~JSBBYVKu(&@rgbl7S|uT|=m zdOwq(y=a;ymmr`*Fkf3_QAt-4YI?ViNg5T?D%VfciToZ|Y61L@&w^FVv^pMvO@kzv z1w~ag{YaA0)=HzQkc>Z_E+MZ}viKsflFENVu76EJhMow8gu+czH|>16DqO1mT7?Ic zB6t=~v*lKt&Pqj?UqUYkGs7VeiNGt)Xqw}Nf-VfnUr3i6V1DpTI^P~yuh_h*mcTew zRgb25ZyKiOb2$L=rd8IVjp*?X!`L5zo4kd*uhu&$iUZvhFNCg z6sHs7!i((sXd+Z7a6Ag$qH{bA;z@H{uNTrP#|vPis=%XZmE*8#H10VCnu(_0VZERk zHOhJ&YH8eissakF@XipZAi<|3ChcTXN;vq~2L4eARklN0FVYR1lDFe1%fC6NrD9Ef zc>>i#39$p@ETqNGLVCTm(nP4j*K$g)RP-pv)1d4Y4(sJR2J0pU7>$BSF*!Rhc6b2} zzVA5&j;UAfGFz-eCU}wBzu#`+py!aY{s!rJQYuY7wv+Gp13Cho>s#)I{$=mcB--BG zkzL0Tv_dGHgFtvJX-D-$5e3mv@C*0~fD~{9q(UQ-4ms->O^~nya92#gKP^9%rI*pMuR7)n zNz`bBw$P2{y&_iS;4HVbulJx8*-X)ElShe9M4LK1q4cb)!OQFlIS5TBRz<`~Y ztiRwy6^z_uhzdP!N4hi%MxKU91IqyEPI(pBN;FFTrDmL7zh1zvk{Dg66iP5t2>dlc zrZge86rlkYhpnEk_~;Mcqin!!LzFdr`7fXU|EK?R3nG6wh1zSe5!3zJpdULdMak>1 zV&vUuLl%gx=yi0&Z?QlM{gu)GNBU=n$BJbsB)cU%?o(iLi}h!c$6+lY_pc29BgH~K zKO2C-Xw{D_C27K8L9!=eX|q_d#qGCPGZyc!T=$Yxl6+EWz~``j0du3{@Gp!2L6g#k zJRz0r{;yxNYqzwK-Azav4*2^XWCY1CeF2%_OGGaI5PX15^0f>9S-K%5qzonyy|?dAdyXkKtEJ6`iC6c-V#g;R z-x=(n?bqz!AC;j4dxr))`;IAl`nqMAI9f-WwY{A<8t7d1Qi&5W!F9iYSv?S{eGW_Z z;^bFnx~z;0!{=u2vB>b?fg$4adk1>=>?JdH+1fffp#jDulLh#sFZziGQ)T_NbZyE@ zgaDIXn)>Rb&nSaKLqmhF_8wD)Muvvztb+%KhiR~ULLS(+pGMN&c3Wo;je%{MQd0V9 zKMN15AOOEqwtjWbf5U=BdJ3V>HHazYRwZFpW!V%|C}8R>1|14DbdGPiWYx{_tR8UZ zIWC(;qx^`%)di)(1&D}(8Yi5HQ|prj-C1wp72pUhDhT|W=iRqxNV~!VthC z9~Vr1bJMlW1ygb5-E7pMh?&#mZ=fe{f>jMd)>8%9tV1H>q|m6!)fmS^TU&aFU>R-K_o#a;;00UobH;Tq*U zKCKo6kJm$}RX-)5xGRda8Z}ekp`tyJ;M5fe>mKmA@s@P{L5Xi|1sdrdIuy*NAvm)Q zZ=!8J#SV7qJAAuM5DDL|#buiwWDLPkeV|c6->R}V%v&N#Kv%cL4}Ivv=eN_`K}O82vtPgPyyyCcz+$~ z`R772T96{y6#iLq)D?<>3GBrh@{8j5Ib#apxLx zj$gc8QRBND&$?unjpORBzJoa)Mp`w$zf8lB*ZfHdRpc9vOV@>wjF zZd*6UYjzo@IBo_&r($;3PTs|FRacR~t8!D;IBpN45Z{WDu;Y4&<3(K$B{&XcbkWZ7 z5Rhso#|vt-P~mt5O7IH9BOq~r$9jP0B$%d#fH1@C&!7?5>A9F3i^bShm8u3GhCeRK z=gtMSU`;;RO$Wt-<&?}XmNnVra#G}AxomJe7YiCWF29g&1fHQ%J%{xMQunfTZCAE8 zVO_A?H)XdiyN6Ap?}m1E`6MX~YX+Y@I;gs$9IwJ^G>VTL-->TNhsMFH&d5m4Zc?`z zQ{oLhxAg)V@35j5n}%#>bJ$awuJbvHhEX*6+~j0J;GqO6I>o}_!x!!hL9xXb9)jEh z3x~NsC_(@<>Fgs)Ei8v?&oO*guk7j^H*>k1$?(Ty`u86gTCm)-chfOVt)?~kwXray z7=CR`lgpUnaxh#KxM2i?2FC+tvx+%hF#~3Z<2&&!kIS~BGCb1E#pUOagTSdUtVT>h&nOU`(rCX1%%rIfwR+`k@?- zOek1&Vf8W#b6J~B=HYBxcIERt%oXKYNR+u^2*VDkV~Y z*}yrDt2;Z}A_c&Hjpnc9r*A7cti^Kwp^J{u1BSW9uZ27k(D}8Xv?iN#++Q}HWgc5C zhr?Cwv9Yj*FGx&Nfo_PX`MXjp(4j?sak6u*ACth^Q#a+#7R{McpX2Rdra`po*Jy6Y5YzX z9aGbSVU1r~Z8l9T*4%97OtBX&hMF8FvX{m9vLQqQ8K8y)Zp1V#$VCNFRO6xoSq8;$ z6UVSvas@TrVvAYZZq~-}Y#zCU2m^X$r^0ayxVx*Ll>mmE3ctjUVRJZV1;`>9=iW zrzRAr^nj?c)dGd#XW8SAl<;>-Ic1l_FLtqW&_P#JoR6kaLgyQOt&EzQkXH=LLLC8I zm2(`A#mbt&k4>u(guJg+G154vY*xcTt+hymM0sEY5vp?BjFp=P$17X8iYObh`Q1$+ z92d&wUEhRw+pe4A`H-e^r9^@z3WJw{ z>pAMBl;=zVxNzZJ=9f-qB~;}8s;7Y&bAPSrMYH9{P{-|Zd~162Ke(%Is_^xBgQYSna)&-UpkEnwr-Axib1=b;|2!G%ke;?X$Cls&1zNP z5P8ZP!y{Fcf{5g#oI@)k4lB(tDvL;kwXharxIZ9gp7H=!Hyf4ju->fOy_4rxZD%(( z#Xi-%D~~yz#(J?XHj#i}!||M9#9E6rx6B;Jw{|vBoa38~pi9I_*&Yg38SdAerL5oCwO-VbC1F33A^P?Px*!XeWT?9HWase&P8fgo*i9Kx8q z&2e2$)dZ_EfX@^;4o-~)0}BMUOr7IfJNd0Gj@uC0%nGI@<5-j9b~`rh9Ea-DOfX6j zf!U!pV(OP`wHjB93MoS63X@fJ+a-)IR&5##cbI6-`{+F4(iu=dAi#YC(p(_GuLs7I zowLhWg}i3D8>HgT-X@m$m3bO>alX(%SlB#dOC z)%9rvyfYaR%d5T841+uRmRQpPo*hE&K* z2zBPbrG=qEO&<_y(|253g79wYMpi7%sA@4mz(ciEs>sz~H*tuoLAS#nA#R|XB5DEA zv)NiaqY>gf1LCw?6+{5EjK7}1pE(5_Mi0Ex$r2;^h{T}lrr;1}16)bqft)EgN+73U zkw}`FGiHddimFACkmV3cPjg(W;#gI1ml&`Dj>|!r=6iCQp#?KPpE!-m<+A(^i}aBH z!$BVDYhh#r`JqlNi03>?Ie-HJem_!otGZj{8QbQjO`PM{vONEcM{32IouA|2L@^{D zE68D^nd9d&fd&eg9N*eSh@4HrlAqfNZ1VG`SPZq2l3A;TQ+!DYd*-_yMTU4R^Cj(K z*N#YW+q>?a9ez~|m8&8p$`B1=;^ZxrGK{a?mHt}@Wubr`=wwN-(a;5RAR&%36NjFe z@}4FNG+D;>2XuVf;}4jnS&tv8vz$jsA-QPovM-vhV{uzs(PUs#;yy73vt_b!#4@uU zB@E(+-O#57!ce6Quml9fqQMf7->9KE&lxON(`##(y$k)nfRnE%+pvo^4k){4zW zKqNdfBYDn%qH<HhsWOzXoC(O)sv-D;5om6S(7dy~yD3Bj)uU^h z> znBSAHY~vPR$8Lm0SpiI06Xgb!uC*G+!(mP4<%6S+qD)yo^y@lucwYlQ$_J|H_n^ROujN+%;A3;fK`FjFadMl|RT>nQ5+H*#ph1KUJ;<40(?+ltOtwzKZaJ~~F( zX~cB(X@+Yxv!-#}&{8SP@g~}8V2Uj9zFO|;AH&V{UTIe@Tb{9$C-M=4DfMgAhYHH1(n_d(lF(fN}vOiJhq^K{PjS} zLauNGN?qO=pb=*747&_B@xSvZ8m@!GvoE(rLoWX1()EaE10gd8B~=m~=(i#z23e(i z5RvXDBDf}}rr1@%nyiJ{RZ6f{)A&~Wnw)vxGZVm?&c9LF(L=kte53NFEt}<6sd9c> zW%#?>NZ#c8iW-@}gaw)gh?7m(2$U8)GmX$zBOs=9ZSL?X-`#?*;xncUy;kGjWXQp) z#_@{FwZp$@#-&!Ui{r9Z3syO9+D$V>@q><_7afEKQc{pvQbWiJ|Jd6KVNXlwJrFf` z0*D$?N#L(K_LI>hc}Tow=;ln#DMHEVl4p|O|gS;aY zg2XF2LZNu5!8@|qye-c<_WP@4{QDD%9!`bBtK8;7TLF{V+!>u0tu4_} zOW9MRBLzf0B|3~)%rIDozgEkvwGlF%fjUl6wlm+ zDm$)Sw{WfPiYw3Y7?L#}V4yZH+U*=CcVq=#*5D7v>-Bo2&I1zH+z%lbgF>3^G#~&0 zAkQqINeGi(5(p))Lx+llG>;SdmO&o!(8de|LQ{XjO22`qQy0$OfZ5nLK-Kk|UJz}y z+2rxitVDIpmlZWrX%RW(T(#QThM^fv9`SHFll8o7gtan{P6p&Cz8Altp?=SdDaWc+ z9)R5@Iu3kSmACW!3-j4cBqq-1^V^tzVQ?2!8XPZLrsXup14b^#SFbcejjb)f`@o2{ zH*K2-xE`wz9JmiS?2yBiW^Su#d>{;F6Wp3>c~>_=aiMyZgAOudUWk3z3!xAQ9EjHL1&2X7&`GXj_c(MEgaM^-pTjIg zJ&s)IhS!n9hsb|quM(?jP5e9E>nJPL>+FaHi7w7r>?^Ze>;Uf!0))%B(! zhj~ZPnb3uk`x}iC_9#1*xZ4fOAu)Pa--+`W9l@zGglKw|Ttlr0plqvHCyqHl7UQ`ZO8>T64j)YbK_|=Ae?(s)qR#!$CDD#&H8kg2wTjW&|}c9@*up zz{6o#j1M)zeL23pyQ}VSTn2a9f)jhw zwCs};O1+Ni^|Od)6sEVQ905Y!klzP6rR0P3^R7?A8^nX4$RSiNVE&?mx-n>M64-?Y zuE1XUKwbdifXP!7QS`qeY8{`HO5X>iVr20|v~sQLw~#d`gEnll2>T0yEwha*DFaP<3DxuK5dJ`8 zWp4z$MIW>Gi88jyRk=Xp2h8xD#rUGhFy;Oz_CdO zE;n`2p=@oTX51&H#MmZ_o}JCCYe)2K=h0?X^w?@4dqwnsi`jp z;dAaQjJ+w9z6A*f$@D)SQc#)tU$xV#Boy@l(}Su?T$7pd5q=?2{tmgy;vrSldnAJ) zt4AswC+yx1SqvS9nE4l=GpKfRe_&0UMvWW-(Ft?qK&`(4@0D!5NxcHwh86;&E2$5T-% zT2I$oj4!9>bnXH9yluPXrg1Z*2SkiOv2ZJSZ5aVsbZpv?Y!e;%{EjWpvRVWRlJX#5 zdXYS$E|!kTlNYT`g=JZ6${!5wM?CbC4-4g7iQ7`?2fhm+>Of$BI~fCB^z!8KKtR7l zpZ@?Z0YTF=Gj7j0NOrm0eKOM!;T>b3${^wOlM*?rDEa*o_5*#Kn~VSp%>BKEoDF~< zqZdKFulO7}VgmM}Wo;tXU3V5-dx#4TD`lv?On#7HKxjAFL4v=km9`-zYqG5I=bFlp z24sHBV8`|fdFY2c#e>WIDIR?*P99L9>$aiezPIFj9-m@|1>59l7=DOgDGWwceuxm$ z46Vu!5q8x$KSao@c*n(Qp>E_1emI~6s&Z41-MFf%qC(DRv$jo+<6O)XG}2xy>VlR- z4l4>Ar{IsEqgAaMhf@iWdYf1_L`tq|T9x4rrPwf!u%XpxYKM;Cn#ocUXiUk;bm$px9p}?HZ+dQMp$Q?7>eMcp5l-1mBVJr&OHigOI>!1$;5kKhj?`-3r zdt$rW6?Nx*);rh@5*FSY%NYj0DulQ7ILGDP?cE)YgW_`HI57~~%5iU3Tsz=$9M8LU zwz;22AdqS7p|}`%xh2Gh>j^y}o(06@W}|qL(P%aej%Ue-;~KfA#&E8)X>bgvt)$W) z_<)71dg%)QB@BAF4lzw3mDHLyrUS_^-zTaXmNILgpom{W(;g+KgCYMtf2L6nG;%y> zTC|05B1zn_;>E5lgCVKq z?}?JfTSMYG6NroC?MHg+^HuErV0#C`0liyvfk!?sd->ouoCtk>$m{XAS}z}rIGxTB zeuHdiWMp`l-yj`wwtj>g??4=XkrtVr`?i>actVP0*Kge9{J*kjM)b z@XxH(qgY{-^@R1yzmXoj4)NE@$>pWRbEx~6^5WZXhJ)m74foU2Q$ErdI}B?gjbXAN z(iqym|G*$=*n4{V>B}PRZEZI4vIu?Q$3k8{v7$-(dIv`I^^QM~N>-o0&6?Q@DA7LW%> z!(#a}%dubcO4IYom5)AJzjUJKm~!iS_R>`{{ax)&`X*`I&~9D7L6^C*m{=r@hbtIRCJE<@iEdku>Xkz2T5a~cc6cOzFyPbL0_){X|!3X#EuVmEkPt*Lr1I_ zS-XfHO{wJYInWo9$9jYOdqVmt)CiW~9{Q$?gr~pqPRk!EiN%Gv`JaId*OwFO0-60< z@=_v68aJA4r5Ck^M}Lx&HM#^B)KLF%7- zbqZK!yS0sa2Sg7j`^P3=Z&TnQtI{>g5$l&zQV^^R681@=GwW}$DAUu^-P6OPOb7YU zDAU^KgtELaKezG{>~keP6Q_Edow=|~8gXTAmF^%hKfAb0x3|1JKhIk0Yb%SZWTRKt z*4Hl6VK=UPl)gq*dgrEg`(x^Hckk(R>lf3PuU;aJH{O2x?YF3%db|_#9n_K0v5`^g zX!{N@J00k^_cA-}=x!G(wp!_XaS@+%92EK|4x-f0iI%OFDs-T6pJJEovYdh8ov_W$ zuPXE>%BAIn<;y?oI;N~G&L!wtmgnO0YjmTt^GUW*RheI<+e<9O;|bbYQWxXIACt-X zrG-U0?BepuGPU&d#mkp3l7^POr4h9&x%>AY(3fp*-oEuQmBATh=KML*@ICv?Q`0oG zIGqj$jetWVgG|}`p4dZ!ad%IDH(9yTX0x@m(H)OZN>>mGfIoIv@Fj@K*r&kuIy&C5 z5Z~Unm&gp#|KslYZ6&$7u#~(7yS=!+y!H{9ab+d3PS?7)xUfRw3RDVn%M_WLouy%L zX*RAVm}t~_hAgOy3)CtS%L%&q_4SLFn2fR;*R<=jmD6wC&k-5j%iY#>I!s+(U8R#h zkB{STkj5d`lP(w2_~_^eX*>bO&NMDd{rybi5S!?>b;y2EqU0Y)8M}`JCx~Bty?t+3 zNDSzvflNY{$9MfKWSi)TH%`E=XBOsX<8*5)D{HH4`zy&c(nu^UsVidF3F6Qf)C5AW zpd-rS!i<`D86DX`Xn85VFwdGR%ZUZ@CiezxXr7N;TU}bE(_T%lT%*b5-rbEHjm^1- zdj25|gV(R#pk2Xm_^sDT!*%Sa`v{HAW1|jY^Nt~8c$K|-<-Pkd)YWa>-BkM)WM$fa z&qvd7S@x2bIa408Wu@H)e>y=BvNRx3yXore==_?+KdZRho})*IG@gFx#pj+PfQ&%$4hEv2AD%t92$Iy<|Fc}bb*V{Y?fWq25*{EO(*un9YwMF7lOW-|JI*Ga2 z_#&Bcb}mlChhrJN;)OU121tMWV0C^W!E@-^@>-fqdn@}<_G3D2E~n={A=7N!yL+25 zx3`t^GpA|#n3|mO65)=Fqx&8zo#70XPCpB&_HNt2S6+rD+?DbKOZJBJGCFEGPJV63 z?YFj}pLjNUA-41)bOU^Q0NNxN`Qfs0dUX3pSeN`GBM3@y2w@{5AhHOE474)g7$y&9 zj*hv;$H*#N6E7U4q3-EdPCxe))vU4-4U@+F%IeY_X(U&cX%dMnFAxKAD+{x#l3*sa zFh_bE3mKp(3lOFk$)t-5aq5`L>Ux5O^s6_nZBV=UICq~>jBEGq-l2keS2;IxhBVxM z54R+sgQHYp!%*BS!yu?3GOfL*UE0IkrHu*7LL>#7l1gjTjvVc!j8~Bc1|*0+BuaI3 zazbKjXLk3vJv~E7+sKJd^4k=X)VS!cS&RVJ_c}&OvNtk%Xl$fJ65*3m;|{9)iRa(+ zPO#t9IH|sMf|$X=;_4Dhx2sDl%ncLs37VcFDo{;gXLECNEGfm~^RtXZ&djP8cx#^J zu;kqO>iRlM+}E<#DMPt+_mev`THm;Pk435I%$XVL^b?a_TB!I($MBP&>7l`q5o%fc zPu)#NG>m|tBY&nM1;a1t5fgbTB5KzwH5f=aKxFax5at#gUR1hKm0 zeDZRV@xG6)X;)ct%YBl|QA5-3-lv9kN;#ua3OnKVPSd&$7Rl<3;o*afvxCG~jqlydi=w~ki;#SKbK0Di4BMIki)^8+&%RyE0bP(_srWT zsADEpSt+%&oMf30jBA$CymtVm5*5U zb93X)Et&uyKFohg#d!bjgB+7yZ0-W{PLLmU%CXY3;FKeSL&PZ=-RbV=8z7cvYqQ#T z1hcS8rwvjY5s%W{*VjuKLthUxsTV^zPn^=xma%)mBGF$wDvW>R7zUd?K0Gqo4c-Ti=P-pbQ+4JW)e#AF1F~RX62+~6w2hk1>as0qu>A(Sw_jb1T z^onQ1Awjh9M_4oO0nh3NUd5jQ1sjC`$gb(`XzvoQsDP!4Yy8AyJq~N|$B%x)WDUY? zNde(rg}R^o@`>!1=q*I_;qlSok=MIG4`^CKd)&&{*tlctPpGJ$oS1eWV^V)5eDZbj zGd>#&3(Km?+2_*AA~nn<2!J%1sOM&s^VC#lpqha|>0=>F<)pP5t&ATDycVoIXvn>>IXf^row0gx<)(UZBj={?<>T;6oG1k+JcyF;wn83M}sFiKAqtufKJMo#ZSh zR_3YGuC6XFvAjArGe1ijv$Het8S2Kf$|B`#3vq>(yve2bDjj>};>tzJi*H}O#*VZ; zyLJ2aebV^;{ZAf#pR$rW@F9)hnJDA4&Z9?;9H#Obf_P3c)WM-4rZY+Ex9?#p1>bG& zpkWD9lL4mD1&+8e0BnAMiLAS`y^91whZT=|f!`8|{M1K(Oom(5FUk3me{>knlH!Oy z%;q3Lko_PIxH0)bo>BZ=kXnX1HL$vI=h#?hH^giRew6aQc{29q8&ouFON_8Bt*gtF zWT=ZXDmAV7xfxDy=Vq4X8DUXYDZyP@V5eu-k{4I0u1CCn`7X&_?KB*ghUemQOVs$6XMyaq3TQ6A zFvnU8Dy;~TYl)>rMqI9~r7zNxhTGZOH!0W9B!~S1-{CyvGCI zc$T(C9IQZ2lAq2Qq{HOBb~`x^^4mHx$z`aMyV%(ku(AP?TKzqp8SJA+V8no^m(X84 z8t2x6B_C9qey@Lcq}0DmqS84J0sW(+;9ic=k_4H6hztT0io^d8dBA)QK@V#4D&x*W zV`DG(5bO0m`;yPY4EfzNGw+gea$_a2xU|gdd|g%NS;4K$pP#4HKYn43?qO|SQ5e@) zQD^y?-|9T$cFA=5`jxA6*qz(AKcf2ayuJ_IHVfA_%OLtbU<(39hi6X00W&){i# z#B(+lKT8jNfW|JbadD_LW-rgg6&iDr@eA`LM5wU@GneG-Y=YI*msi%37isI}#zvOZ z%*hA$?&zP;VV^yG@Y(msOjn^kqJnzy^!riDVMbkt4-=Pi3_{pY2KLzP5|K)W&DKFq zRTLZKDte#>6rLR_$^(7u1fi$1qo;>aFAJkynOUEstz`E)Y&bP3UH?(*N5Gx|=IbL5 zF@Y})fVIfrLK*Tbv<#m1dk}%755a2eD^li%AJX$H^!vogtRCf%>!{Ne20^{_${Q~q zr_n`SU^fcZ=a!aef?B>XAEzfyvlqAiXrCD|FOt zh%fBC;oiN656J|de)_%dF}k~PF?|7@29rY-z!lHi^r!NmRBUmadSSU4L&wtu+($7be@tB2D6$3GZ}!b zPqJskhfAX%n6e*yYQRGRH3?3vjwGeGe|QX&$Gq$xk{{t3B4nTZN*B~1rT^?vj`^lM z6SSgu^YposQ5J3z%k&g4nV4H-=h6N}l{^)+JQqtOiPl$UPMv2K7gNG46V9!?O_7g2 zO0Qg@fl1TuQlWkClU$w})y;?cCzKYvGIKIU&x*#59(K{Q=>rgqD4*{Kqalvu=qUXS z5!8ELrKh{6vkL^}-($}NJ^r39`a5G##AN=G`WZWI&sYdA9Tz`5_6vHi0r!6h?lnN< z1lj%nLKyN-fi11D80H`m$O^HjWc3j*1nAXeWpo7ow1XjyA3DtLa814Z%8M_M#+i9l zr5t?;>g!9y4i?o#R?jTX&n~dj>m?|USpZr%9SbW&jh^safIfZrApaRnk5@0HskyqJpMI9Q{Ltv|C@p*T?6L2q1$B2v7d@0yI&J(`MOS-g zJ4FU0nTBlzSdv6bA42kZ#WU%!l)g`Xw#`e9xgI;@+?MbNNYepg>Ic)3CL{zVhU1g| zks_HpP6s~`CaQ11EB>Uxq!zB@N>u$y@g?(6qyzRQ31 zAWzxT-101oj-JV5?6&0S(BLpVAKfdLSrT$p9nrk*>)#5Xs4_B=H^U;>MDOg4Mv3XNs=^xO0h%>TVl@y|WV z#?7nQ8)W}4y&AwTkpYhJQGVZL-`*!kAoCCOAc&Y9o!uQBFw)VPsr!^(FhqKW0Iu0b zY|WDKJ8VFBU?-&d0QcEi*^p#emVohCj(|xC|D0B!-W(Y@VFOwBPXW`q4kRCuqYv1= z0|ZasV_1O-M*&e<{_V!-@Yu*G5H{A_2Zz}0n*o`f9D;#S z%L7SvvLnRao*u>~WT~J2CZ)fly_E9spQ4;{SW(`~dfZ|}Z+ zP)h>@6aWAK2mt46*IN9K54W&w008R0000L7001yAFfTGMFr>YEa9dY;CwKsYlAzbU z(32o3LRY%71p*)hKiY<6O9%G#gMP7ZOR`Kq0>g9L4%)J0+K!!T#Ukj2(`LHceK6fg zMzgh(a0~w>jJ2l}}GBcX3ty^C>%pqC3Cz^FLh3+S#oAmwR>hw(j1}+O{4R9cOJlEESC46Q5W?M$dXqg3r?=9tQmMIy1vuNONuELI^H(KNE zgf*6AVG;XoEr(CS)dkOS9Q|4};mCn1a`w2UdOtOod zdz|m1Ngl6bx^Cr>818wV@5OL~B}zaLQ1r>D%yr|koXrnow9IH79~oFh+0M3dg`C~O zG(n(B_D^?HL!*DZl*_hg5f&c$M$zcAIfLyj8vM*$u7b5*#G%RxI8ZGhHusUuOKp(!hkOR@m0Q^b%cnWmL+O0E%oY^wU zm^7O;I4?a71ehiv{}}k)Dx&lRFg9I6WnKYsfdM{N1R@#ma(}6w1-E7&O6JDF1a=E0 zmDZu+We?oV1(V$fRIU3!g7-0_YL`8tmMII%-0vSR)NSx;MU_^tS~o7m5=H1g6vKlc z3_=ATgv~%Gcqmv?!+}93P;ei-A{4v=dE_ztE^0nBTKh}6bbntFzxESRfwvqWJb`8R z_ZBach*rLuj*-#YSA;sTP4i>bPZAuSC|x$eF?PJvI-awYcpUTzdEieJ!9w?!4feon zncFR+aM?qr-d7Xx`k*L0HD8XVdfgCjSHo>!s}jQvbXm{3Ud0~a${pd#uW+GpB6#3> z8i%3fsPah1s}M4U@3SA;#dl92_Y1`9D4l8;)3UT-mf#_9;5Hv<+Bf< z4+xQVt6nhJ{?bcnVBGxPPASBuDVe1PJcIp=*1lPT5pHUwI;v&Uf0B^g2o8M{d}>3> z8vPm?9FX*Qi9=8F1*s2!Fxz$?mgB$VLYQ2GNjU1b8V(NjxPnvlih^fd*UKun3H^}O zaPHZ*uJ3u=R&dUNdIk5vKb{`95>|Bob~xa=f0u#%bba3r{TN>MT+RwFK~4MqLR^Z8 z_b&WCv9O2QzRm zv~D?Vv;Bo~D$5cDqyJv%Vj2iBUr0z@Xtv%fs;aF@kreou0vhlH)I|S%(6XN_mR*9@ zJ+Qd-wCy8f2t0oCe;VUf%jJjOIO_$rI(!^`wDevRv~;<3Pl^JR$(Z@P_?2e3Z4^vt61kye>`raXt51U zvKCAsDP5B-Lmp;Gsmu_v$(ZEI57~D5-|dJcIzfiDBps6UA4{n#+jc)w$Z=LKLMfP8 zS1A_`m8u09qq<5dNX**`ZdS5hR>8Bb&9e%gh0ZWF9LO;>+=U7@t9s?dYp(v5u3RBI9XQH=yVfM;CS_gyNRuDiC!y|1vD9axiV!z#XPbJxzQQrq?I zY+U+sMT9QT#BfgpLbZAso{I0q@SNBB8q5f@Lh(`DWoZ5M`0UHfVxgrbIT(b4ftsWf z3`Q!g$p+5IT(H4lFj9d+Pu^%*M7*VP+GO7=3xoh?bd-Ct`4zkxD-S_JCVz|FNPOXspqet(e*%5zRmlO#|Ca$MABN z^hVis!Q5r;vG)s?!Pchz@3e{VOhxrFH~WlCGDnpP#6=likAFZ6>e|}00-apVpe($8 z9fA!5yeHY-}{vOMc5Davu4D?%!GB|Ad8SJ922_qnU_0H4R#a8OD6Ign1F{TAU> zg!X4d;D&*MLqbNjKJ>+1zX)oJY&yha9(E;=qBB(<_^oq=`T)*C@N4YY&LmqLfR+3M zva~*cN%0?y;Q@Ib3NAQ|y@JCV4RrkwiZax2A1YJ9{m=?@Kf>t^0tug9$nc)?m3Xc_ z-pgoQEM-JyX~Yxw8SzS#(L50~nPgDH)D4{M{Zhl^Y-}QO}G|=3DNI-Lg9}L8Z zOG4%=53lTou-SDl7z9H3rU+Y4h2q87ehCx=%6^3*RHU+N76fPz!ygg@OF=V?S&pim z0h*f{PIy*uh^>ee9D>@56dcmr>nXTsHb?cF)}X2TX$FC%;AJORJ~-5LkVujN8_3Q5}flGUiJ~h6)pw=0tH2=&_|%4=Nt}3bM6h` z#VUBlYC3w28L0F~qa4z{q~Sc%Rij*l#aPnOebgNEG8#Vcon8!IaC|p-gqcm&zh& zy*PUj*1`7`Dd<^8E(6-fkR4bHFebrSW+!CJxxxhtF_86~EUOO!p9!@mB?f`hRC`qc zl!&9?gC;mj?NtS>VzC}T@eks?stfS!t${2&dERHvW9;5KV}gfxNN)UNgPqJ@@Lf^i zYCJ^RTCQe3Su-J@rWhXbF}W>>NN*C zPFh-OYKtLyoQ*7r1L7!nFo0Jc!*c5$F(quPisLSMV&GQvY{G$_WjSQLUbtk1%(CR#j-MZp?IAY4fFLte#45wd-aiLc zP~BC)E4sUiFDj$RRQRr~Gz{O=vQn%w$9dqmmN4Hx6FJps0eN9Ez9TH1qdV7)y(JeW=2yoyCfV<;YudM zG~9(6(iHYsQ>Z|@ECfGSD2FclcHvUUeJ@m@J)BZ+RHwq&T%*X+MoEDNiJ&}}eaBK$K|1zZ~3-P8Bgo<1bg2?IwvD`9A9-w8f>PZ{R=7LU4HigPkOZWX{~ zt>+3*Tkn?5RNp9lC7m|aHeLlxrtyY&$Jg6zV&FBE*?LJ>L2qRKnk>?0&KFG)Xu33` zf!@Zepo*#B73O%h-hK->aE9OCp2b+4ic$@^o4mz$m)_S6oF6Y!?^3Y$T|^(;(jzA@#`n!|t z1z4BCVFDk8szF#+Vc9)N_PT>e!Z{Md5hM);F}xgl><0xnhksCfy(tis{!Uy)gdr2E zX+}7l$4$#Y&@U7W8T|DP+OaXSmF>7E!CQXe^nMvsYbQ#5m^M8@-v25Ld&To$(6f7!YysvcJj$r_a2>1m24!}1AHBcWU(UI$ z2WIQ!mN@@F*KjMA6W2gN)^a9PffaCPR1o@i3!H)9Y@%R4#&W!#$TE5zb`Z|RAZnJ_ zVSHcdU*&ek1eW7j!mYaQ7m8ZmjXH_{$LeCzxgj470 z5@^wZ>N8<1FB79@dYNcZ6>})0u5O4A-L7tk@MDSVk{&c;q)VFk(9FFHU*}A*%-sHL z!T3qDu*_KK44m+PQ6zx>6$CMDaxO7(SgE+d%c^t$_6XzB1x&=BV5Ec(m;FKizk{zD zCX*>Zg12A z&Ph+i>vvmkbJ08RI-Y6KsQ66ih#9B!m47=R%MssKbu+z;;-V+U$%Uoh_LcA-CTbvsn?b-OxZ z#(>r$F2%FGnajl46538w1to3A}+_RQ<&(=}P3F1nJ>&<}qmgcGe zKG0p=7Bn*>t_qsbU3T+@rtM%LqTXG;42MT2-&fg1i!dGC{KNv|fa}=d=gFEfQ zRR$?*4lYY+sRzxb6`o-eFnhluM9+fVi{ZVD6DW8PZH?ezZ;K5S-0ww>hP$FS@DvnnJeO4}6$_sq1N)&1CMGaJLp*(@!> zw9TyjzAP@PiVkr=xU8yQwmtS; zN_qOX#pme-`)|j@1)WXJFm@UoqloT;k8B0^;i9>k@dO+!1s@DT#SCDQ0rNCG;KJ7R z{dC3FjLOrdt(l6a)4ZbK73gPM!7JJHXxyv~&Q@^SPL1YC?=93k%ce>DyIB*A{JvU6 zwsN<(N|x*1TyVD*6CW{*t65rvB2c{zLjEB_StuVz_2vY=)l{X;p!G(3SRw^&Bq~sdxxlH`CJ*kHfDNUWc&|DkP(Kp}q?Ja^k1m!WHJjga@(wA;NjSh=2;A zmKxhdNUiWycFoomc)(`=KNRX-8u9s$m7wy9FZ8MeoQ`-^h%E2iKl=`|1g5W;r#bK) zOEF2)2?jcT6-_qq6_Z2`f4T5#hKbNotvIaMh_x&xMo~39A5+229_wx#irF`E%-RF- zo7MJ`!`kYNtGU(N+*EH|yKP?ERPgPMr43WT&GyoUhMVnZqpjeJrfAnRyz9(w#PDa^ z+}TnuZX>p|pG+DHzUPEqxl={W3X@!=4LE9Y!1O0-wCw%?#f5GDP&igpMm+a4% zC^gVki360<;;NVHWjoz37cSfI7;OFO-A<1ZQY!s3l#%pm@p2`VPG?na0`FH!ximXb zfOCd6R#zQW6h@~G=`+0Cu zL$#kY7vqyXNUTAN^`*VJF&WOf?hP*sqHbd?UQ2s;@RS*Xf-mZIbaQwX#1(O3Gxb zI# zHdl2nUip^EW{OXz0MQ(^dUHi3H$8LHzNK@XQsVZlRmGdBwMM94!Qbk1sybo9+*}lK z!bBZn!n6R@wwAi45)|GOyrmE;j3k_?qB2QC{ZS>}NV?xr9Fp3ZK8&DW_3i1OHfLQv+rLMQF| zp*s+x)CxqQajUAsbQ(fW^bgXD6yNEoHd`!+VhYSGaBIH(aJ)lmvdnf@zt!RGHJxrC z*39+W3ZC*hET!N#SJ&)yUEk!Qp>|X~)>w;oRO`cry{3~uhR*F#%EVBFRh=j^tUA>Z zyjmTq`sHDjokm0}TC8vxe*Dl;`F2$?93|PH_HdMx<2a(K)Y7oUO3$F)Fy4|aiy`Gx ziq;ba1PjBe_!n^=8`TghzYWbDq4L{?YmPHi@F8PsLj`y8VW{8>Yu;^CCk}nN!Ph-+fGC8teds%sutFE&0JJ3ife3RL+8iN zx3}~=?Wo($jNU6F%FrA1)*!G(3R1XXsAb#pdBNwO$JZqrdoD1eV!RRfuH_(zF zSa;PeB733X!V7(^5duF9e63kLcl3Hjz^0G-aVxwOrm5h!H=^!P!OdtRuag5-d37bF;J3{6QPMz|Uu~$Q()t>^ zHPmmphQlz@2{R&cI#ms){1gRupo+94tVNyS+WuH6i_Y5GBk>F5h9es4Esw*7jfQ$b zwAOGM4fVo%t*Xqq}XkHKA*)wxM1zM)R$Q z3YVPu-aJ>Yvj<&gY4kd~7wUKBIdLOLTXlY51%Xn3!goBKg)c(iigdQyAQU>=ZQcr^ zEd^f`gG^hgOZZ+|UGgQ1Rpltw`CfGUEIai%P`ob8TPteD`E{OJ*Q|5%mZw>8*tj`T zuGL|qT2*i`ozN^OI#EZ#a}GC(bryA^p?W3OsB)bX&=^Lnp|Q9on9iLJLuM4}YoZZ0 z;zs4QJpZ%8C6>?U*W$O+3;BG*c|@^Ocz*XRI5EtJGXLTvb#P)f*H}&zbB#NR!Zq+E z3md;+cH%s$H(HrlgR@HVx2X2L5bS&z6>JRI0C)XMcAEHc&EYIxXW&3qW2X~iiNsFH zli(v(DzC9ba<;q{o@cWQ=so-eJ4HEf4Hk34%)(lOISScMKF{=$hb(l~RK|g`e6ZlL zA;fOPkzn_sa-zg=ZK#|mn2j}|oHV0<0Hd$9QiY2l!+-kyYyS4_TRJ8F*7_}-aJ6!C zbzS9-mHF!O$=SchoK?Zrl>l|~oNJLc7w02=#?4vkZK-#~MlXTZCYBb_3-Sa;myd-Kd&?t49CbOH&*XvY*h2r5!*z=5j%+v zuMV|F6CI&6W^S!tEG{rnb^O?ObgGd;?ZR4>T1e=csIKV-d>Y1+?=IG(Mz|(=ahDy~ zLajVI4KY&M+{ug1NR~sPm2h{BRksyoPQg2TeKUzaWvtZ~C}lohQ)Lsyj*#j}W%4HrX784=aQAI`$5f#UcRSqIb_6kj4A z$x+8zQeG<0wZne1v7!&vY?|{?=V2KEJ`*mk#42%m!MRzzr5u~;stC1XQ}t47+CM@# zT&-&VNHjWC?KgFXk*+`NK$~fJ#H$Jpx2^@n1oDgFN2*j*hij_T8FGVsG%QrTU+1Eq zD7?H0-N@DZ_4$tAo2uuf$k{a2h*o!KW)$4tggsaAY^`GjfbUAON4Hr;Zaq!V5!8XH zw@WfCNU4nl;cSVt-rNaUb{ps=9*8^v15XxPXqjlHm={L}?o6PdF zY9}V;2X;civlTy;QgA=vX0r-zAv{;_*6Wd(;(>y9{YoGde4{tWbTxb{YS$FJ+MZwB zR`6kWlMfYqt<$Zp#qbv!aEOk?OLvCLW*(X?6Ye0uJ;t4r`D^6vgloS+P7s4_VVs>V z4;eoNYQtL*E9~?_6_%e2MpPA1Bp(EXtj6xGJFt?&^VIg%dg}IV`6QfM0{%(3_m{v)ouRWVtAiopE}(B5G(3H+11607=hXU20g zv^nQpdgyI)bAui{v)iU-_0;^PBkKgcwwJTy1yA!K%2_IxW! zaEBh&IfQ{8R_EF9HXasI?F=pC{3>sAHd|j2+fH7>8$&3HeEDX+KUt{X44p;@f3e<( z!n~Zd-4J=g#RBshjq|_+%ZJ|WHCh_W^ZZa&3dOpR;{sV8(0ls)I>V^5WqYmVgF*8w z^nk5;UaaM5RCt!`fkM4O=APh=6Rr_F*Xf@r)=jv3Lju=06A}sCcC^W4|67Yoa$SiG zvt*IaxF?I66_JQ5r%hi@WTQHnNd{^0kuM5-)Z=-)hcll*h?}@Zpfc1 zPy?q*D_I1)MAX3SM0}eb1|a#oT*+p4ejp)Rj3p#nSlx6;57iV4+w_nRQ*GIto57F} z1&5d4w&`JoFXbwY`(ru5B6;@FPHCy zVvWYk@&4Ij-E%;i7SU;Vmfb`C1L79pC})3ryEA+=_C$x<+g)v+w@u#N)Co`9=DZ5e zIa{3Xsc^f?_>RJ5wqdsQo=tb2)znGUXTe)8)ioz_}H%LlS_56xWP3XN}21p zJnV9z5448Wj+58$2%f8g-|9v}!|kqEyRDB?RP)2z%JmL!g+h6QYvKBBF>*a_>+Hl! zZI&Na@46mboBDtc+uD^#wA;}rP+%EX$BRp;N>=w%3%I3sLbiD{uU!LCYn$2ya5|Cn zt_Y~S@MZPZEQ)oQ1s40^i?+qcl$juw>{ zkZO15b&SoIYJ-GowB~0_y{nhvl_f{PQ(a$ZTN+tb7?0VEyL$>P=06+qc&B=2IBrrj9d7GW zGw{$h)fV5vHrs5++sv1@*+zRqRo||)YnzJo7Hh4?3YRxg+E%RBhMT5JpJ}6wK5Nu& zZ|N=WU~4|o=dQe7cfi$lVb2swWlccYZ^`H``k^ z+J~ptQSI(Za`u&t`T33ccpGm4bE-WU`y}lR%K0-lHrl4zVA}33|N87T*2%E;hT7)q zvPGshD68A>hT;*=-sT+zy|vB5yqd>4l+(K2_xD1sw>fX#%HLeo+niqBycy5$x!d8* zThf!s*3JByx2E1sMAhwTO}(|qZkSv89f)w4NW}0mPq3*%eUq_hUS%9c!2Gs;r@@7I zfF1iIcK7EGrWwnz#Q*DJjsG7%zm`ip{&b<7NYq#{2mM&Wxc{FjXN_f}Xq>0x>1M_F zCaRF$PHeEs->Lh@#$!gFpp|+e!4ipQ6Q>v8k)hxG-|hFDQOgvK<;vXOExPk4U3Za7 z)E+O;#S*AcGT413dAG#*1I547;89F%E|+{91{=dAlK*=D>2fj&=iX>Bbi*?8)(On} z9b?11+w8B6pHAJmvt)dhEE+#CXlo*oOePXPG47F%3F_kXa*`gTPjfy=kXc}>g|7R? zyXgLhId;b^+?~;18+;E<@aG0k+@YntW1M>tb6D9^%q96TI?nR0!T0?TYbhK3uNIBZ zOgdjjYdm8l#_zmi^pj) z4aO6ad{>O0BrswU9k(#Y{xNC+1HST{g9^D1d(bB_){5+8+-?rw6kdZMlznp z9~o>6e6XjaCy80ye>C-)cY3C5Die?4{@RHD=ah)Oa+CYmK52OHlxRRU*x zb4LMK#oU$|keJleyK4LtlORTG?JAA>r7@>U@>Y))nCIt49}s>Tb2Esp`-|tnAiH+W z0@>G$Ka*~Naeh*>#E*@i?x*R`NnCIudId~94Rk(==B$*1p7Hn8VkUn4}y62fLKpr@Z@ab zXM18v_ygm{-r2;RUGe7DDT+JFiDWH_5<7k<$yiH}R9^v$qYL&=jYQ&~8h<-RU0yYo4`61g zE5>6<@Qk5`*#FOs7G0h40?@U8POgCMo-OpL?oEs&Z$%clR?%Zj1(g_yxN+ z(Mo_diZPD*<5!K=_?(fDqx}#FEXTaaz`2BKo{Uk>M#wA}HzeiJa7W4bSsI=1oXaGf zSZRQowA^Lz>^V9RTaaTtz85G?%q72>kRtrEJpf}?{r%;{pC{!c&nF8BHe-Cs?oIYD zBzDD^zEdnD64SPEF)&#IxceHafo(Zf&vv|L+`$Naa7hd5 z`W))q7>}j*JTydqCzNe#y0n}e!w+NaXxsXC`yl;C%(;Ovl!>pC)}I<)Lh>fXkNmkP`WkB+9u|K@OidRFdkppZcMa6L8}m zaAmF(Q;9y4V6q>|(XSbNOxyIb(aOJTuoFKtTJM%(5!gp%V4j^+vjyaG@Yug(`NVm{ zsIfwCUG4xnvk~^EVUkQH%fHV5u`e%{PqJU(gE6#X58z z{eQYVp6u@})OU_0$9Galnof=FNK@#ycgI+I4?XNpr}plb;o;sLhDi^Z{prj>dN^qA zK5&R04rTTpJWNsM;RE~eH@|S?pmB)y6^O)2|O84@HF%*c%@h}{_E~LcZ$*nfhsgwdrFBXChtn_tQ0P&mP}%d zV0QxJd@;U#2wsK3e^4$XBtMo1v0#D6Q_1o1+Suv(&K+aBcF}OVca87eO%KMN9i~AK z2lnqeC^2^Az}_Ph^pHJlPRI?M$%%v6Neav-4^K_Wg-lKzot~1boSdE9W70%n#)Rcalo|>GRA{@MdYX=S; zJa|ANzyO6MS@#&meo5B!p542p0PNVcbLS2&4c_>8iahTAMYyWagJa~ICdTO0O8?ce z@x)n()&64QXZu0SSwt%Z>1M*=0Qny()yLt^jy;|@T}~%hwNT#+Z7a2unM&-C5_WLs z*d8fiNB8cCbyD`gp2J6D!8$-oJ6)fioFHQ6>(dY!IrXVy)5l04Fc?rVP5b^6(=(IV zK59=)P7~39^{MPpMGa;Y7miFEouHw!VE?Ra3!kmEZ+2ng=#hy&dpDQ8A$8mYiXkOA zR4#!06pX1Cmhf`&xhx&h&aw=CakE&SoM`2W%S1UK|C`BE#37QL33f0yL5=|egjRC4 zoIT2u#WMK7C`hJ)>OU~MjIl@^d^2&XKAAnL_z^VKPb9pY{VKFZc5+&B;Ph0M^uuX- z5oxrJlUHT=;+~C96;hj5|yCv!2?ooGy4xn&A)5^Zc_@;`0gEh(=mm|c8tsZ z{&)D4CLAzgtKEr2iWp#dUotVCjy1hGme?uV9vV-kWpCMZYQG$Da^H@Fl4er}cTW&I zmM1c;d?7c@XXeV&(?5xo+_9NyqUZAD)G;V9>J!*3Lb@QNS>mh7X>v)j^n!P4nhYm9 zRsiGgF4m_fj%KH5i}o0Fm*jhIZl?a+Y zCr-p(D6vOr`M7m*1}%Pu7Bk0BFW`uGrNyY zDfskZBRi$wQ`tk))4KlD#Ib30Vt(>iYpf9ehVq@6o>J$UC#OMt)fU8=npF8ClPy|f z%K$nbE9GVoUSF_KJhL|;tKM^LYQ|E-f9WfaDEM=a++VFK_|xako_$oopLzWJ z`I>@1|KvI6Y2D8=Pd@#Of02<0mBMKS&)r)%byAc6#68DnG?~HEnuOV7xoLGRZf>Ig zQ1Jqpv#fHcNf#bfjx(&&R|*$kHIJ%NXhfDN(3O+rscip#D2x7+MJNk--z>bGNof7a zKTF7-5Am0a7p5i;O--qur=}*R6xSKhF%DUGb(Igjx|^ChHaQt*;Tn8@=^})GQkB<_ zq3X0s)gWbXOr>fZpFVbMM!`=(CFB&mI5T6}3jP%)zWUn=e%*cKt!oPY+2z{Rj}-j#SDtzQhJt_l4fn%k1^@0_ ziytg&_|?V-8vf-6S3dew!N2>-ho5|^;9q=t{rYtU|Kj>bpIq1QPu{z(>woK$4?flX ztbFpxvc4ha)9WkCAM1-6KW%^dp@Lt(@%ars&l@+|D;oZ}zr6CHf`9Ad>o@fLS3dQx zuPFGZH$MJUkNb)L!6*7=nos;sd_B*PKDz#~p8vIv{ZBs8mlJ&8f2{le`c?mfs|x4g-Nx{!AdS81+!5?&Ac~)mg&prKoP1Ec2W6pzR1-BnKTh1$ZZmx2# zPTe_nPu@DN;MwCRr>FJpm#|(_3J$+~GOMrdtU!OUXP~T4AjEjGRGyw{nTT?&0(tt= zlYc6&3np!U3<`RZyo>3{*2`e_17(A*4L;s7iWl!aHa#=*-T2~;3OMf`HPU%2caOgH zY2jYGa$dn3XHGx%qJqDFuJU3-WBkQ)jrSD1U4P-j5ocU|W%*kQ{-y7IOXr^dVC9PV zfr8&`f7JPbg8%NfZhZND1@C;T{q1in__x3K))!wW_-}oy{rTsb1D01l9dW?*8y{=V zYkzWG-*r`A`3Q8^9Ppt(f`4@F{SP#U`B$!7(;W8Ul`HSOr{GtbSKoPC-+tA+(tJa~ zU-7>2#!H$rym#JM&=UA&v+<0Azw?Io^%oWVgE!vzx~Kbp`_1Mx4ZrgBtD3_;_{N)8 zHTDFsS za-NPI`(-p3CXoL96ad#3v8M+*M^*Pi>} zTblo_)j$7I!GEy){+F6BzyIx(?|1Z>2=VRjcQpTf_q!c^7tR-7eDUR%T7!P^`L{J+ zt}K7{d0W%zI=E5O`{U)0-q-x}AtF=zF4{5{w=MKKKt~GZ)-iZ^677Vq2+)1`WK(+`F#5Eind6X-@o$y z*A@K9H|wu!OZ&hD_xYNF&(`=O`u01kQYqY{;M4Z06WYROr)Q?7Bz)?tu}^#-V?U}! zl$xhq-P56{O0Jm-n`jeRPczk`L=$Uzt|S)W&Yw?)OPe~ zBd@x-rY~T<$rl|@!B_bJ4;mL6k^j2Rh4PdwW~MgZ5^7OToSFe5CJ#ZG#HB{w+6=(fzNsqlT^E zw%1{LJ~rd)Hx)d!nle)go?uYK6t$ej#KbzyKQzAyxV4MQ^C9K?nYam za&C)_wytkF?b@h+VJ<3o$INVV1&=nDOx-^;MQvNbO-NE#!8gtMQ9td)EeTI2+4E+1 zGd?&vf$CkecAq{1-({OB&2!OQYU||FE}k`<*ETjc^$FrGBu~M+-NjM;c6)Q9rr?|H zjd^vH{snWMbw}N|m-MiU^BZk_@_uony{ON3o8q$b-u+T2uXax)WcE~?Pb?DEA$ z1z%k1b-N0_J>MI_MXkHoQEIieQ5&kmCQh5x`qOz7x4Ak`a(<1QXXVSf3u0(C)K!t^ zZ{@jydg~2+w_^Rad29W)-YqcAbq()&>v?@gqwi!a{pBm0W+gGuQ?kUCp6bm`EnHXd z6+6#T3ck9sdQ*P~4LEsK=k1%TD=RAseruiI)crR?c3YjkxiA!bP0fCx<3v@J$-g-q zc898ZyDB!e^|63$F|WJdsCDKwe0#}k>rIWdOuI8YD^Gbo87&Tn(yrwe8of;?&d9$c zEG8Q2ct^wHI}7!w7n%BYM84!RZDkf&!qi7-+THY`wn|&wgwBb3N^EkSjXz+HK3VgW z)sFOmn`lF9DDb7FTC=U;yymoZQoLZknb8?>roE+Yq18(@d+MZAXu8e#n8^i8@XF{e zJr)Xmr>50wGEd=iu*91RpW)I{rl~lKgB6v*wwBnIHh7th#rFItqkpreGyQqD*42~g zY;SJsOi0c!cYRV}V}4Pm3wGyCb9C|`!xu+}wwE!rp{>HeXcP<6tm%HXm$qsemz!Jd zUpkSn$n`wC-R-W1ce=1=+Q4sj+PeQnwW?1TESUKQT?tEe{O0<4d|WVhzDskAIg_$- z6((0!ZjRo0u7a&s6nuS!nHnxu&6O2}%G>L=OrUZJsH{4ThCF&^*Q-OGZ^yf$-Kse> z=*9WNZo-l&!EP!HBqW_(8hA31*xvGF`fW42l$E`0rJ5<3 zncGf>T&7-k-GL`Fb2Fas0y@p>hw&0JelMi{t}TUK*2D_#t#_OA&7SOMiFM_m(4HG| z!dvt6OeXer;abSVZ!jL{PU+~q%vSs|jad$t+tph^AbRqt>)I7L>s~6I@M|<{-^<4D zLLC-XWJ)hMOV)APrYW<_=WFeGIoc*`n=<*B&$r`z;_4RLmU+-(%j`&`R_8ZOnM>Z? z*w~c0((Mh_rZn?~O>=XTrf6<2)~LVorg`VF*=uZZvprvv`R{zQR-@%yt8Uj8O}UIU z!MCZuaw^4V3iZ_LDqEo~{FN1!E7a|EzP^r+3)}hpEqa~oIMtBG;N33E$IGdOaur#z z*+|QyUfrdp?7A27Y**sNbgEmmIPcyRT_WDKVTMVM-;%^WGwtYi!rB zT6$PoY;MU>pgVe!)E4)elHHo!UPf{OnMaAV_9k3cdRSzg`5HZR+7Xkus%~In{V?L%b%Bt{~$7kkK}x#PBrSpGmokrI*@R!3P>yiRROe@jTcs#eJjq_e#%_8 z8#<5*S)>o8g`Mv9=x*c1+TFD5?#7zdvtU`Fjg2XoqfObO(~b0T;12LU>Ia%@O&h0- zGt_~U!>el}IPWrjd{{I$*yvDQTda-x;pw5CXLTs_;kkN*akbv>IGd5S6CDQ}qVM4! zR!1k=h&x8diig8dKh98$4(*})stQ2M@GO#rx&uh$>sAgbYa zTE{QXqinDP`LgJ=_Ls_>B&gmoO}HJ2m{#*98=bBbLDW@2X(g*}<2_cly(sWU!C{;0 zAg~6B&_SI!6m1>sZAQ*0h~2DKO&#oQ@h%)VDTk zTN^5A{Z=*F9^Et19p#x{4xy8`M{#b~)b|!t%&lQVPc5qD+xmV2=gwDV-vaY&^P0-+ zcebirCF4KsWQXdc-onu3jfdlu{$W#JjxbXf^O=TD-4}~K)2aT|$kdm|m#agzrMd4;{xbDP8VZ&S|kCc&X21#%!)Czjc8Q!aS6S zzY~bj*Zb`Q4P|2AncT4TZ2mIwr-;7;jfTk39mRBSLjORKu248imzqn4iK-tb;%~GV zpL+&8GP-9$Fq3XXFB&XWS^z6n|5{ztKqnN{H+|5HAv&)Z#RM^~ilXgkbdI#k zy4%WyobSzVXcscfI+k|TZDA(#wd_kvzJ_mZE_SyR96E3m&2aE-SHZz$9UUUHyXLlj z@wT+sX4+SW1~xae%fHk#NAM+U%JUb`#wW)p%>M}-JKsyd4s!6?>px}AiM zorXbF8;%@eb4?%M7wx6S2o6)BZ`c>2vNnPbowcFvXW0HF__m{UebtGEBZnKBMCco+ zhbwLYM4u@VM-c}JmMA&`if3Q^;$leEAG!NA0tTM}Whs$@5*m*|ueA0QDE;$dRCUBK zzNg&i?>_?`nI$#kh(C?D>ClriRNK=S<|K4al622O`jsj!kb*lKzaw-Q2PJ}4xbgIwOowimPmc0sJ zv({cT)wdAzdd)3u{L*IXZUn;EC^FgD*y!rWu-oC=UHvTr5rgNt$hWt6QGJ*T{hbAS=L|M0GfP3((|HgS_@ysbtoA1}7=3e&Zga`a zQobZwpD13SnEf2Jpfb5!e;HF^7%{6r{ZNnh z5GV8xf(Igguu$*tPSm+B`KfGfvd;<^mbSJww$w{!-xDm*j*#o6^;f;Z_(WP|kmuFW z*zIhN9H*uB7T4btvDw`ish-aEVx&a9UTsHdtxATTxum~A!U>&GKcbesE0oo)bC;@% zBdUUWci~P|a{>7Wr?K*fK{7_iGR}i+JYAC6{Vk(JM%nSsKok#6sWl$2P z0^~IKi8&xY4H1ILsM8Gz!|SQ|_76s>cn@>g9YZm0{sW*R|>yc4;vwF05W>sm=9H{}54}-aB!EfvMjN3^(}5VRJfLquUo8 zvHeT;$wbajyGWvSq+qZYOT?U%Kl${WOo(TBO8=Kf8?fZPz|VP5XFmWhLICy=T_2He z?8r|$2aGta3G`DbQa&uu!N;T}2TzPkmyL1s`NF%G$W?RV@7jn3W7wZ8P+kQnL-Ko> z^k?f(fiz`~q`DlZBvnbC`}fDG-YpQ4A3+nMTY_@(OZ5%}uj;4dbsG_T9P=O!>OT`_ zY7hIn=@J4;sAl)kik^m2sIpX{97V0S3YXw&b+*4u#(p3}oHqK_6T3G;ZPsBU)CzmF zCo=>kMyTy9Y2TUF@f{e4Ve2uhL$0nx`iu_D?7*C>@wu0N8476#i{>X|M4g$FW)ITw zVp%2^(>J45`wM8#)0lo*a@(WDr-V}#3pC{!Fzy_E7YDHP7=o zAhw%4Fn+cm)0+Ex%DG|fcV-P%!bB(`EC&LQ<9P;lQNUIIlT`dgtvi6eR;3ur4?fAf zd0s=!6D65aD>DpJg_k1u-r{?5MiAQ^p+7}778>zSl>Z0;QU2qP$UTd+w}Ay7Dv`df zQzspjz!gP^Vw9%obT_v<+AZiJ^1mQD2x_0#`e{*&^pLn~Md*k`Yu6d0RRBJp0Slh3 z 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

2>7P}k+F_Y74$5y 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 Bj!OUl literal 0 HcmV?d00001 diff --git a/tests/data/oct_multi_slice_zarr3.nii.zarr.zip b/tests/data/oct_multi_slice_zarr3.nii.zarr.zip new file mode 100644 index 0000000000000000000000000000000000000000..2cfcbc7fe021a220db4c6bbb1b42b41d2b83e78c GIT binary patch literal 284559 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νV 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�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∈TX8$?GZXL2|=|pqba&s?8gLs8D|({ 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 z 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 z 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 TwBUr`G;Vt(y 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

_fdK2{JH=uV{F1z->f&O)&u>*f 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 z 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’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 z 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

JI*$S$~@L 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
  • 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 Date: Tue, 24 Jun 2025 10:23:55 -0400 Subject: [PATCH 053/157] fix: zarr 3 requires python >=3.11, update project requirements --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index aba9b351..6a04f2c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ packages = [{include = "linc_convert"}] [tool.poetry.dependencies] -python = "^3.10" +python = "^3.11" cyclopts = "^3.0.0" numpy = "*" nibabel = "*" From 1b6373e0ca6a1a7cdfeba783c812a26758e19f12 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:34:31 -0400 Subject: [PATCH 054/157] chore: disable file logger for now, --- linc_convert/utils/logging.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index 119d2612..b143ba1c 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -7,19 +7,16 @@ def setup_logging(): level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) - logging.captureWarnings(True) def add_file_handler(log_file_path=None): - # Create a file handler to save logs - log_filename = "/scratch/converter.log" - file_handler = logging.FileHandler(log_filename) + file_handler = logging.FileHandler(log_file_path) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) - +#TODO: add file handler for each platform. prob ref dandi-ci. prevent logging error in unit test setup_logging() -add_file_handler() \ No newline at end of file +# add_file_handler("/scratch/converter.log") From fcab95cbb8faa5d8dac3d696a9d11ddbb45ee915 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 10:47:24 -0400 Subject: [PATCH 055/157] fix: dependency add tensorstore --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6a04f2c9..694d834a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,8 @@ df = ["glymur"] lsm = ["tifffile"] psoct = ["h5py", "scipy"] wk = ["wkw"] -all = ["glymur", "tifffile", "h5py", "scipy", "wkw"] +ts = ["tensorstore"] +all = ["glymur", "tifffile", "h5py", "scipy", "wkw", "tensorstore"] [tool.poetry.group.dev] optional = true From fdd5fcf947285576b89aacc0a08212f252f6635b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 11:29:56 -0400 Subject: [PATCH 056/157] feat: update multi_slice.py to use unified zarrio interface --- linc_convert/modalities/psoct/multi_slice.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index d523f80e..87a46d70 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -16,6 +16,7 @@ import h5py import numpy as np +from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata from linc_convert import utils from linc_convert.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ _MatArrayWrapper @@ -25,9 +26,8 @@ from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid, generate_pyramid_old -from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata - from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_io import from_config logger = logging.getLogger(__name__) multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") @@ -115,7 +115,7 @@ def convert( unit = "um" # Prepare Zarr group - omz = open_zarr_group(zarr_config) + zgroup = from_config(zarr_config) if not hasattr(inp[0], "dtype"): raise Exception("Input is not an array. This is likely unexpected") @@ -131,7 +131,7 @@ def convert( ny = ceildiv(volume_shape[-2], chunk_size[1]) nslices = len(inp) - dataset = create_array(omz, "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype)) + dataset = zgroup.create_array("0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype)) # Process and store data in chunks for i in range(nslices): @@ -157,17 +157,17 @@ def convert( ] = loaded_chunk inp[i] = None # Remove reference to free memory - generate_pyramid(omz, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + zgroup.generate_pyramid(mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") - write_ome_metadata(omz, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: logger.info("Conversion complete.") return # Write NIfTI-Zarr header - arr = omz["0"] - header = default_nifti_header(arr, omz.attrs.get("ome", omz.attrs).get("multiscales")) + arr = zgroup["0"] + header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: @@ -178,4 +178,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(to_nifti_unit(unit)) - write_nifti_header(omz, header) \ No newline at end of file + write_nifti_header(zgroup, header) \ No newline at end of file From 78f242868eee916bfb9d83e217c4c24b2541c6d3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 13:33:27 -0400 Subject: [PATCH 057/157] chore: remove unused code --- linc_convert/utils/zarr/_zarr.py | 97 -------------------------------- 1 file changed, 97 deletions(-) diff --git a/linc_convert/utils/zarr/_zarr.py b/linc_convert/utils/zarr/_zarr.py index 6fae4d4b..1700c9dd 100644 --- a/linc_convert/utils/zarr/_zarr.py +++ b/linc_convert/utils/zarr/_zarr.py @@ -130,103 +130,6 @@ def auto_shard_size( shard = [2 ** math.ceil(math.log2(x)) for x in shard] return shard - -def niftizarr_write_header( - path: os.PathLike | str, - shape: list[int], - affine: np.ndarray, - dtype: np.dtype | str, - unit: Literal["micron", "mm"] | None = None, - header: nib.Nifti1Header | nib.Nifti2Header | None = None, - zarr_version: int = 3, -) -> None: - """ - Write NIfTI header in a NIfTI-Zarr file. - - Parameters - ---------- - path : PathLike | str - Path to parent Zarr. - affine : (4, 4) matrix - Orientation matrix. - shape : list[int] - Array shape, in NIfTI order (x, y, z, t, c). - dtype : np.dtype | str - Data type. - unit : {"micron", "mm"}, optional - World unit. - header : nib.Nifti1Header | nib.Nifti2Header, optional - Pre-instantiated header. - zarr_version : int, default=3 - Zarr version. - """ - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - - path = UPath(path) - if not path.protocol: - path = "file://" / path - - # If dimensions do not fit in a short (which is often the case), we - # use NIfTI 2. - if all(x < 32768 for x in shape): - NiftiHeader = nib.Nifti1Header - else: - NiftiHeader = nib.Nifti2Header - - header = header or NiftiHeader() - header.set_data_shape(shape) - header.set_data_dtype(dtype) - header.set_qform(affine) - header.set_sform(affine) - if unit: - header.set_xyzt_units(nib.nifti1.unit_codes.code[unit]) - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - - if zarr_version == 3: - metadata = { - "chunk_grid": { - "name": "regular", - "configuration": {"chunk_shape": [len(header)]}, - }, - "codecs": [ - {"name": "bytes"}, - make_compressor_v3("gzip"), - ], - "data_type": "uint8", - "fill_value": 0, - "chunk_key_encoding": { - "name": "default", - "configuration": {"separator": r"/"}, - }, - } - tsconfig = { - "driver": "zarr3", - "metadata": metadata, - } - else: - metadata = { - "chunks": [len(header)], - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": make_compressor_v2("zlib"), - } - tsconfig = { - "driver": "zarr", - "metadata": metadata, - "key_encoding": r"/", - } - tsconfig["kvstore"] = make_kvstore(path / "nifti") - tsconfig["metadata"]["shape"] = [len(header)] - tsconfig["create"] = True - tsconfig["delete_existing"] = True - tswriter = ts.open(tsconfig).result() - with ts.Transaction() as txn: - tswriter.with_transaction(txn)[:] = header - print("done.") - - def fix_shard_chunk( shard: list[int], chunk: list[int], From 0c8f3e0c920b4547d4f7b6948e81224ef014cc11 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 24 Jun 2025 13:34:23 -0400 Subject: [PATCH 058/157] feat(wip): zarrio for tensorstore --- linc_convert/utils/zarr/zarr_io/__init__.py | 315 +++++++++++++++----- 1 file changed, 235 insertions(+), 80 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py index b4ef522e..e2b81518 100644 --- a/linc_convert/utils/zarr/zarr_io/__init__.py +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -1,7 +1,8 @@ import ast import logging -from abc import ABC, abstractmethod -from typing import Iterator, Literal, Optional +from abc import ABC, abstractmethod, ABCMeta +from os import PathLike +from typing import Iterator, Literal, Optional, Tuple, Any, Union, Mapping import dask.array as da import numpy as np @@ -25,64 +26,221 @@ class ZarrNode(ABC): Base class for any Zarr-like object (group or array). """ - def __init__(self): - pass + def __init__(self, store_path: Union[str, PathLike]): + # record where on disk (or out‐of core store) this node lives + self._store_path = store_path - # @property - # @abstractmethod - # def path(self): - # """Path to this node in the Zarr hierarchy.""" - ... + @property + def store_path(self) -> str: + return self._store_path @abstractmethod def attrs(self): """Access metadata/attributes for this node.""" ... + @property + @abstractmethod + def zarr_version(self) -> int: + """ + Return the Zarr format version (e.g., 2 or 3). + """ + ... + -class ZarrGroup(ZarrNode): +class ZarrArray(ZarrNode): """ - Abstract interface for a Zarr group (container of arrays and/or subgroups). + Abstract interface for a Zarr array (n-dimensional data). """ - # @abstractmethod - # def open_group(self, name, mode: str = 'r', **kwargs): - # """Open or create a subgroup by name.""" - # ... - # - # @abstractmethod - # def open_array(self, name, mode: str = 'r', **kwargs): - # """Open or create an array by name.""" - # ... + @property + @abstractmethod + def shape(self) -> Tuple[int, ...]: + """ + Shape of the array. + """ + ... + @property @abstractmethod - def __getitem__(self, item): + def dtype(self) -> np.dtype: + """ + Data type of the array. + """ ... + @property + @abstractmethod + def chunks(self) -> Tuple[int, ...]: + """ + Chunk shape for the array. + """ + ... -class ZarrArray(ZarrNode): + @property + @abstractmethod + def shards(self) -> Optional[Tuple[int, ...]]: + """ + Shard shape, if supported; otherwise None. + """ + ... + + @property + @abstractmethod + def ndim(self) -> int: + ... + + @abstractmethod + def __getitem__(self, key: Any) -> Any: + """ + Read data from the array. + """ + ... + + @abstractmethod + def __setitem__(self, key: Any, value: Any) -> None: + """ + Write data to the array. + """ + ... + + +class ZarrGroup(ZarrNode, metaclass=ABCMeta): """ - Abstract interface for a Zarr array (n-dimensional data). + Abstract interface for a Zarr group (container of arrays and/or subgroups). """ + @classmethod @abstractmethod - def shape(self) -> tuple[int, ...]: + def from_config(cls, zarr_config: ZarrConfig, overwrite=False) -> 'ZarrGroup': ... @abstractmethod - def dtype(self) -> np.dtype: + def __getitem__(self, name: str) -> ZarrNode: + """ + Get a subgroup or array by name within this group. + """ + ... + + @abstractmethod + def create_group(self, name: str, overwrite: bool = False) -> 'ZarrGroup': + """ + Create or open a subgroup within this group. + """ + ... + + @abstractmethod + def create_array( + self, + name: str, + shape: Tuple[int, ...], + **kwargs + ) -> 'ZarrArray': + """ + Create a new array within this group. + """ + ... + + @abstractmethod + def create_array_from_base( + self, + name: str, + shape: Tuple[int, ...], + data: Optional[Any] = None, + **kwargs + ) -> 'ZarrArray': + """ + Create a new array using metadata of an existing base-level array. + """ ... + @abstractmethod + def generate_pyramid( + self, + levels: int = -1, + ndim: int = 3, + mode: str = "median", + no_pyramid_axis: Optional[int] = None, + ) -> list[list[int]]: + """ + Generate a multiresolution pyramid across spatial dimensions. + Returns list of shapes for each level. + """ + ... + + @abstractmethod + def __delitem__(self, key): + ... + + +class ZarrPythonArray(ZarrArray): + def __init__(self, array: zarr.Array): + super().__init__(str(array.store_path)) + self._array = array + + @property + def attrs(self): + return self._array.attrs + + @property + def shape(self) -> tuple[int, ...]: + return self._array.shape + + @property + def dtype(self) -> np.dtype: + return self._array.dtype + + @property + def chunks(self) -> tuple: + return self._array.chunks + + @property + def shards(self) -> tuple: + return self._array.shards + + @property + def zarr_version(self) -> int: + return self._array.metadata.zarr_format + + @property + def ndim(self) -> int: + return self._array.ndim + + def __setitem__(self, key, value): + self._array[key] = value + + def __getitem__(self, item): + return self._array[item] + + def __getattr__(self, name): + if name == "_array": + return self._array + if hasattr(self._array, name): + return getattr(self._array, name) + else: + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{name}'") + + # def __setattr__(self, name, value): + # if name == "_array" and self._array is not None: + # raise AttributeError("Cannot set '_array' attribute directly.") + # elif hasattr(self._array, name): + # setattr(self._array, name, value) + # else: + # raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + class ZarrPythonGroup(ZarrGroup): @classmethod - def from_config(cls, zarr_config: ZarrConfig, overwrite=False) -> 'ZarrPythonGroup': + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrPythonGroup': store = zarr.storage.LocalStore(zarr_config.out) - return cls(zarr.group(store=store, overwrite=overwrite, + return cls(zarr.group(store=store, + #TODO: figure out overwrite + # overwrite=overwrite, zarr_format=zarr_config.zarr_version)) def __init__(self, zarr_group: zarr.Group): - # super().__init__(zarr_group.store.path) + super().__init__(str(zarr_group.store_path)) self._zgroup = zarr_group def create_group(self, *args, **kwargs): @@ -101,18 +259,18 @@ def attrs(self): def __iter__(self) -> Iterator[str]: yield from self.keys() - def __getitem__(self, key): - if key in self._zgroup: - item = self._zgroup[key] - if isinstance(item, zarr.Group): - return ZarrPythonGroup(item) - elif isinstance(item, zarr.Array): - return ZarrPythonArray(item) - else: - raise TypeError(f"Unsupported item type: {type(item)}") - else: + def __getitem__(self, key) -> Union[ZarrPythonArray, 'ZarrPythonGroup']: + if key not in self._zgroup: raise KeyError(f"Key '{key}' not found in group '{self.path}'") + item = self._zgroup[key] + if isinstance(item, zarr.Group): + return ZarrPythonGroup(item) + elif isinstance(item, zarr.Array): + return ZarrPythonArray(item) + else: + raise TypeError(f"Unsupported item type: {type(item)}") + def __getattr__(self, name): return getattr(self._zgroup, name) @@ -261,65 +419,58 @@ def generate_pyramid( def zarr_version(self) -> Literal[2, 3]: return self._zgroup.metadata.zarr_format + def __delitem__(self, key): + del self._zgroup[key] -class ZarrPythonArray(ZarrArray): - def __init__(self, array: zarr.Array): - # super().__init__(array.store.path) - self._array = array - +class ZarrTSArray(ZarrArray): + import tensorstore + def __init__(self, ts: tensorstore.TensorStore): + super().__init__(ts.kvstore.path) + self._ts = ts @property - def attrs(self): - return self._array.attrs - + def shape(self): return self._ts.shape @property - def shape(self) -> tuple[int, ...]: - return self._array.shape - + def ndim(self): return self._ts.ndim @property - def dtype(self) -> np.dtype: - return self._array.dtype - + def dtype(self): return self._ts.dtype.numpy_dtype @property - def chunks(self) -> tuple: - return self._array.chunks - + def chunks(self): return self._ts.chunk_layout.read_chunk.shape @property - def shards(self) -> tuple: - return self._array.shards + def shards(self) -> Optional[Tuple[int, ...]]: + if self._ts.chunk_layout.read_chunk.shape == self._ts.chunk_layout.write_chunk.shape: + return None + else: + return self._ts.chunk_layout.write_chunk.shape - def __setitem__(self, key, value): - self._array[key] = value + def __getitem__(self, idx): return self._ts[idx].read().result() + def __setitem__(self, idx, val): self._ts[idx] = val - def __getitem__(self, item): - return self._array[item] +def ZarrTSGroup(ZarrGroup): + def __init__(self, path: Union[str, PathLike]): + from upath import UPath + if not isinstance(path, UPath): + path = UPath(path) + self._path = path + super.__init__(path) - def __getattr__(self, name): - if name == "_array": - return self._array - if hasattr(self._array, name): - return getattr(self._array, name) - else: - raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'") + @property + def attrs(self) -> Mapping[str, Any]: + return {} - # def __setattr__(self, name, value): - # if name == "_array" and self._array is not None: - # raise AttributeError("Cannot set '_array' attribute directly.") - # elif hasattr(self._array, name): - # setattr(self._array, name, value) - # else: - # raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: + pass + def keys(self): + yield from self._zgroup.keys() def open(): pass - def open_group(backend=None): pass -def from_config(zarr_config: ZarrConfig, overwrite=False) -> 'ZarrGroup': +def from_config(zarr_config: ZarrConfig) -> 'ZarrGroup': """ Create a ZarrGroup from a ZarrConfig. @@ -334,6 +485,10 @@ def from_config(zarr_config: ZarrConfig, overwrite=False) -> 'ZarrGroup': An instance of ZarrGroup based on the configuration. """ if zarr_config.driver == "zarr-python": - return ZarrPythonGroup.from_config(zarr_config, overwrite=overwrite) + return ZarrPythonGroup.from_config(zarr_config) + elif zarr_config.driver == "tensorstore": + return ZarrGroup.from_config(zarr_config) + elif zarr_config.driver == "zarrita": + raise NotImplementedError(f"{zarr_config.driver} is not yet supported") else: - raise NotImplementedError(f"Driver '{zarr_config.driver}' is not implemented.") + raise NotImplementedError(f"Driver '{zarr_config.driver}' is not supported.") From 995c059bfe7542b046a3176e6c16422bb4bd776e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 25 Jun 2025 08:09:47 -0400 Subject: [PATCH 059/157] feat: zarrio implementation for tensorstore --- linc_convert/utils/zarr/zarr_io/__init__.py | 605 +++++++++++++++++--- 1 file changed, 527 insertions(+), 78 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py index e2b81518..663b0f06 100644 --- a/linc_convert/utils/zarr/zarr_io/__init__.py +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -1,7 +1,9 @@ import ast +import json import logging from abc import ABC, abstractmethod, ABCMeta from os import PathLike +import os from typing import Iterator, Literal, Optional, Tuple, Any, Union, Mapping import dask.array as da @@ -10,8 +12,11 @@ import zarr from dask.diagnostics import ProgressBar from numpy._typing import DTypeLike +from upath import UPath from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr._zarr import make_kvstore, auto_shard_size, \ + fix_shard_chunk, make_compressor_v2, make_compressor_v3 from linc_convert.utils.zarr.compressor import make_compressor from linc_convert.utils.zarr.create_array import compute_zarr_layout, \ dimension_separator_to_chunk_key_encoding @@ -112,7 +117,7 @@ class ZarrGroup(ZarrNode, metaclass=ABCMeta): @classmethod @abstractmethod - def from_config(cls, zarr_config: ZarrConfig, overwrite=False) -> 'ZarrGroup': + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': ... @abstractmethod @@ -154,19 +159,80 @@ def create_array_from_base( """ ... - @abstractmethod + # @abstractmethod + # def generate_pyramid( + # self, + # levels: int = -1, + # ndim: int = 3, + # mode: str = "median", + # no_pyramid_axis: Optional[int] = None, + # ) -> list[list[int]]: + # """ + # Generate a multiresolution pyramid across spatial dimensions. + # Returns list of shapes for each level. + # """ + # ... def generate_pyramid( self, levels: int = -1, ndim: int = 3, - mode: str = "median", + mode: Literal["mean", "median"] = "median", no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ - Generate a multiresolution pyramid across spatial dimensions. - Returns list of shapes for each level. + Generate the levels of a pyramid in an existing Zarr. + + Parameters + ---------- + omz : zarr.Group + Zarr group object + levels : int + Number of additional levels to generate. + By default, stop when all dimensions are smaller than their + corresponding chunk size. + ndim : int + Number of spatial dimensions. + mode : {"mean", "median"} + Whether to use a mean or median moving window. + no_pyramid_axis : int | None + Axis that should not be downsampled. If None, downsample + across all three dimensions. + Returns + ------- + shapes : list[list[int]] + Shapes of all levels, from finest to coarsest, including the + existing top level. """ - ... + + base_level = self['0'] + base_shape = list(base_level.shape) + chunk_size = base_level.chunks + + window_func = {"median": da.median, "mean": da.mean}[mode] + + batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + all_shapes = [spatial_shape] + + if levels == -1: + levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + + for lvl in tqdm.tqdm(range(1, levels + 1)): + prev_shape = spatial_shape + spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + all_shapes.append(spatial_shape) + logger.info(f"Compute level {lvl} with shape {spatial_shape}") + arr = self.create_array_from_base( + str(lvl), shape=batch_shape + spatial_shape) + # dat = da.from_zarr(self[str(lvl - 1)]._array) + dat = da.from_array(self[str(lvl - 1)], chunks = self[str(lvl - 1)].chunks) + dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + if arr.shards: + dat = dat.rechunk(arr.shards) + else: + dat = dat.rechunk(arr.chunks) + with ProgressBar(): + dat.store(arr) + return all_shapes @abstractmethod def __delitem__(self, key): @@ -354,66 +420,66 @@ def create_array_from_base(self, name: str, shape: tuple, data=None, arr[:] = data return ZarrPythonArray(arr) - def generate_pyramid( - self, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - omz : zarr.Group - Zarr group object - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - ndim : int - Number of spatial dimensions. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - no_pyramid_axis : int | None - Axis that should not be downsampled. If None, downsample - across all three dimensions. - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - - base_level = self['0'] - base_shape = list(base_level.shape) - chunk_size = base_level.chunks - - window_func = {"median": da.median, "mean": da.mean}[mode] - - batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] - all_shapes = [spatial_shape] - - if levels == -1: - levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) - - for lvl in tqdm.tqdm(range(1, levels + 1)): - prev_shape = spatial_shape - spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) - all_shapes.append(spatial_shape) - logger.info(f"Compute level {lvl} with shape {spatial_shape}") - arr = self.create_array_from_base( - str(lvl), shape=batch_shape + spatial_shape) - dat = da.from_zarr(self[str(lvl - 1)]._array) - dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - if arr.shards: - dat = dat.rechunk(arr.shards) - else: - dat = dat.rechunk(arr.chunks) - with ProgressBar(): - dat.store(arr) - return all_shapes + # def generate_pyramid( + # self, + # levels: int = -1, + # ndim: int = 3, + # mode: Literal["mean", "median"] = "median", + # no_pyramid_axis: Optional[int] = None, + # ) -> list[list[int]]: + # """ + # Generate the levels of a pyramid in an existing Zarr. + + # Parameters + # ---------- + # omz : zarr.Group + # Zarr group object + # levels : int + # Number of additional levels to generate. + # By default, stop when all dimensions are smaller than their + # corresponding chunk size. + # ndim : int + # Number of spatial dimensions. + # mode : {"mean", "median"} + # Whether to use a mean or median moving window. + # no_pyramid_axis : int | None + # Axis that should not be downsampled. If None, downsample + # across all three dimensions. + # Returns + # ------- + # shapes : list[list[int]] + # Shapes of all levels, from finest to coarsest, including the + # existing top level. + # """ + + # base_level = self['0'] + # base_shape = list(base_level.shape) + # chunk_size = base_level.chunks + + # window_func = {"median": da.median, "mean": da.mean}[mode] + + # batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + # all_shapes = [spatial_shape] + + # if levels == -1: + # levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + + # for lvl in tqdm.tqdm(range(1, levels + 1)): + # prev_shape = spatial_shape + # spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + # all_shapes.append(spatial_shape) + # logger.info(f"Compute level {lvl} with shape {spatial_shape}") + # arr = self.create_array_from_base( + # str(lvl), shape=batch_shape + spatial_shape) + # dat = da.from_zarr(self[str(lvl - 1)]._array) + # dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + # if arr.shards: + # dat = dat.rechunk(arr.shards) + # else: + # dat = dat.rechunk(arr.chunks) + # with ProgressBar(): + # dat.store(arr) + # return all_shapes @property def zarr_version(self) -> Literal[2, 3]: @@ -422,9 +488,10 @@ def zarr_version(self) -> Literal[2, 3]: def __delitem__(self, key): del self._zgroup[key] + +import tensorstore as ts class ZarrTSArray(ZarrArray): - import tensorstore - def __init__(self, ts: tensorstore.TensorStore): + def __init__(self, ts: ts.TensorStore): super().__init__(ts.kvstore.path) self._ts = ts @property @@ -442,26 +509,408 @@ def shards(self) -> Optional[Tuple[int, ...]]: else: return self._ts.chunk_layout.write_chunk.shape + @property + def zarr_version(self) -> int: + driver_map = {"zarr3": 3, "zarr": 2} + return driver_map[self._ts.schema.codec.to_json()['driver']] + def __getitem__(self, idx): return self._ts[idx].read().result() def __setitem__(self, idx, val): self._ts[idx] = val -def ZarrTSGroup(ZarrGroup): - def __init__(self, path: Union[str, PathLike]): + @property + def attrs(self): + return {} + + @classmethod + def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): + + conf = { + "kvstore": make_kvstore(path), + "driver": "zarr3" if zarr_version == 3 else "zarr", + "open": True, + "create": False, + "delete_existing": False, + } + return cls(ts.open(conf).result()) + +# tswriter.schema.codec.to_json() +# tswriter.schema.to_json() +def _is_array(path): + zarr2_array_file = path / ".zarray" + if zarr2_array_file.is_file(): + content = zarr2_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_array_file = path / "zarr.json" + if zarr3_array_file.is_file(): + content = zarr3_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "array": + return True + return False + + +def _is_group(path): + zarr2_group_file = path / ".zgroup" + if zarr2_group_file.is_file(): + content = zarr2_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_group_file = path / "zarr.json" + if zarr3_group_file.is_file(): + content = zarr3_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "group": + return True + return False + + +def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: + """ + Look for Zarr metadata files in `path` and return (node_type, version). + Checks zarr.json (v3), then .zarray/.zgroup (v2). + """ + # Zarr v3 + z3 = path / 'zarr.json' + if z3.is_file(): + try: + meta = json.loads(z3.read_text()) + fmt = meta.get('zarr_format') + if fmt == 3: + node = meta.get('node_type', 'array') + if node in ('array', 'group'): + return node, 3 + except json.JSONDecodeError: + pass + # Zarr v2 + for fname, ntype in (('.zarray', 'array'), ('.zgroup', 'group')): + f = path / fname + if f.is_file(): + try: + meta = json.loads(f.read_text()) + if meta.get('zarr_format') == 2: + return ntype, 2 + except json.JSONDecodeError: + pass + return None + + +def default_write_config( + path: os.PathLike | str, + shape: list[int], + dtype: np.dtype | str, + chunk: list[int] = [32], + shard: list[int] | Literal["auto"] | None = None, + compressor: str = "blosc", + compressor_opt: dict | None = None, + version: int = 3, +) -> dict: + """ + Generate a default TensorStore configuration. + + Parameters + ---------- + chunk : list[int] + Chunk size. + shard : list[int], optional + Shard size. No sharding if `None`. + compressor : str + Compressor name + version : int + Zarr version + + Returns + ------- + config : dict + Configuration + """ + from upath import UPath + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # Format compressor + if version == 3 and compressor == "zlib": + compressor = "gzip" + if version == 2 and compressor == "gzip": + compressor = "zlib" + compressor_opt = compressor_opt or {} + + # Prepare chunk size + if isinstance(chunk, int): + chunk = [chunk] + chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk + + # Prepare shard size + if shard: + if shard == "auto": + shard = auto_shard_size(shape, dtype) + if isinstance(shard, int): + shard = [shard] + shard = shard[:1] * max(0, len(shape) - len(shard)) + shard + + # Fix incompatibilities + shard, chunk = fix_shard_chunk(shard, chunk, shape) + + # ------------------------------------------------------------------ + # Zarr 3 + # ------------------------------------------------------------------ + if version == 3: + if compressor and compressor != "raw": + compressor = [make_compressor_v3(compressor, **compressor_opt)] + else: + compressor = [] + + codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} + + if shard: + chunk_grid = { + "name": "regular", + "configuration": {"chunk_shape": shard}, + } + + sharding_codec = { + "name": "sharding_indexed", + "configuration": { + "chunk_shape": chunk, + "codecs": [ + codec_little_endian, + *compressor, + ], + "index_codecs": [ + codec_little_endian, + {"name": "crc32c"}, + ], + "index_location": "end", + }, + } + codecs = [sharding_codec] + + else: + chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} + codecs = [ + codec_little_endian, + *compressor, + ] + + metadata = { + "chunk_grid": chunk_grid, + "codecs": codecs, + "data_type": np.dtype(dtype).name, + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + config = { + "driver": "zarr3", + "metadata": metadata, + } + + # ------------------------------------------------------------------ + # Zarr 2 + # ------------------------------------------------------------------ + else: + if compressor and compressor != "raw": + compressor = make_compressor_v2(compressor, **compressor_opt) + else: + compressor = None + + metadata = { + "chunks": chunk, + "order": "F", + "dtype": np.dtype(dtype).str, + "fill_value": 0, + "compressor": compressor, + } + config = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + + # Prepare store + config["metadata"]["shape"] = shape + config["kvstore"] = make_kvstore(path) + + return config + + +def _init_group(group_path: PathLike, version: int): + group_path.mkdir(parents=True, exist_ok=True) + if version == 3: + (group_path / 'zarr.json').write_text( + json.dumps({'zarr_format': 3, 'node_type': 'group'}) + ) + else: + (group_path / '.zgroup').write_text( + json.dumps({'zarr_format': 2}) + ) + + +class ZarrTSGroup(ZarrGroup): + + def __init__(self, store_path: Union[str, PathLike]): + super().__init__(store_path) from upath import UPath - if not isinstance(path, UPath): - path = UPath(path) - self._path = path - super.__init__(path) + if not isinstance(store_path, UPath): + store_path = UPath(store_path) + self._path = store_path + metadata = _detect_metadata(store_path) + assert metadata is not None + assert metadata[0] == "group" + self._zarr_version = metadata[1] + self._zarr_config = None + + @property + def zarr_version(self): + return self._zarr_version @property def attrs(self) -> Mapping[str, Any]: return {} - def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: - pass def keys(self): - yield from self._zgroup.keys() + return ( + sub_dir.name for sub_dir in self._path.iterdir() + if sub_dir.is_dir() and _detect_metadata(sub_dir) + ) + + def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: + metadata = _detect_metadata(self._path / key) + if metadata is None: + raise KeyError(key) + if metadata[0] == "group": + return ZarrTSGroup(self._path / key) + if metadata[0] == "array": + return ZarrTSArray.open(self._path / key, metadata[1]) + + def __contains__(self, key) -> bool: + if not (self._path / key).exists(): + return False + if _detect_metadata(self._path / key) is None: + return False + return True + + def __delitem__(self, key): + if key in self: + (self._path / key).rmdir(recursive=True) + + # def generate_pyramid(self, levels: int = -1, ndim: int = 3, mode: str = "median", + # no_pyramid_axis: Optional[int] = None) -> list[list[int]]: + # pass + + def create_array_from_base(self, name: str, shape: Tuple[int, ...], + data: Optional[Any] = None, **kwargs) -> 'ZarrArray': + + spec = self['0']._ts.spec().to_json() + spec['metadata']['shape'] = shape + kvstore = make_kvstore(self._path / name) + spec['kvstore'] = kvstore + spec['delete_existing'] = True + spec['create'] = True + arr = ts.open(spec).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + + def create_array(self, + name: str, + shape: tuple, + zarr_config: ZarrConfig = None, + dtype: DTypeLike = np.int32, + data=None, + **kwargs + ) -> zarr.Array: + if zarr_config is None: + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + **kwargs + ) + else: + compressor_opt = ast.literal_eval(zarr_config.compressor_opt) + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # compressor_opt=, + version=zarr_config.zarr_version, + ) + conf['delete_existing'] = True + conf['create'] = True + arr = ts.open(conf).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + def create_group(self, name: str, *, overwrite: bool = False, + zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': + if zarr_version is None: + zarr_version = self.zarr_version + if overwrite: + mode = 'w' + else: + mode = 'w-' + return self.open(self._path / name, mode=mode, zarr_version=zarr_version) + + @classmethod + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': + return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) + + @classmethod + def open(cls, path: Union[str, PathLike], mode="a", *, + zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': + """ + Open a Zarr group from a path. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the Zarr group. + mode : str + Persistence mode: + 'r' means read only (must exist); + 'r+' means read/write (must exist); + 'a' means read/write (create if doesn't exist); + 'w' means create (overwrite if exists); + 'w-' means create (fail if exists). + + Returns + ------- + ZarrTSGroup + An instance of ZarrTSGroup. + """ + p = UPath(path) + + if mode in ['r', 'r+']: + if not p.exists() or not p.is_dir(): + raise FileNotFoundError(f"Group path '{p}' does not exist") + elif mode == 'w-': + if p.exists(): + raise FileExistsError(f"Group path '{p}' already exists") + elif mode == 'a': + if not p.exists(): + _init_group(p, zarr_version) + elif mode == 'w': + if p.exists(): + p.rmdir(recursive=True) + _init_group(p, zarr_version) + else: + raise ValueError( + f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") + return cls(p) def open(): pass @@ -487,7 +936,7 @@ def from_config(zarr_config: ZarrConfig) -> 'ZarrGroup': if zarr_config.driver == "zarr-python": return ZarrPythonGroup.from_config(zarr_config) elif zarr_config.driver == "tensorstore": - return ZarrGroup.from_config(zarr_config) + return ZarrTSGroup.from_config(zarr_config) elif zarr_config.driver == "zarrita": raise NotImplementedError(f"{zarr_config.driver} is not yet supported") else: From 026d3c980e06775a6c11dfc82d4a8656fd56ac2a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 25 Jun 2025 08:10:03 -0400 Subject: [PATCH 060/157] feat: zarrio implementation for tensorstore, test update --- tests/test_oct.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index cfd5c08c..3f6604dd 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -49,7 +49,7 @@ def test_oct_single_volume(tmp_path): output_path = tmp_path / "single_volume.nii.zarr" generate_single_volume_data(input_path) single_volume.convert(input_path, out=str(output_path), key="volume", - zarr_version=2, overwrite=True, chunk=(64,)) + zarr_version=2, overwrite=True, chunk=(64,), driver = "tensorstore") assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( "data/oct_single_volume_zarr2.nii.zarr.zip", mode="r")) @@ -60,7 +60,7 @@ def test_oct_single_volume_zarr3(tmp_path): output_path = tmp_path / "single_volume.nii.zarr" generate_single_volume_data(input_path) single_volume.convert(input_path, out=str(output_path), key="volume", - zarr_version=3, overwrite=True, chunk=(64,)) + zarr_version=3, overwrite=True, chunk=(64,), driver = "tensorstore") assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( "data/oct_single_volume_zarr3.nii.zarr.zip", mode="r")) @@ -106,7 +106,7 @@ def test_oct_multi_slices(tmp_path): generate_multi_slice_data(input_path) input_path = glob.glob(str(input_path / "*.mat")) multi_slice.convert(input_path, out=str(output_path), zarr_version=2, - overwrite=True, chunk=(64,)) + overwrite=True, chunk=(64,), driver = "tensorstore") assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( "data/oct_multi_slice_zarr2.nii.zarr.zip", mode="r")) @@ -118,7 +118,7 @@ def test_oct_multi_slices_zarr3(tmp_path): generate_multi_slice_data(input_path) input_path = glob.glob(str(input_path / "*.mat")) multi_slice.convert(input_path, out=str(output_path), zarr_version=3, - overwrite=True, chunk=(64,)) + overwrite=True, chunk=(64,), driver = "tensorstore") assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( "data/oct_multi_slice_zarr3.nii.zarr.zip", mode="r")) From 20c16cd00b4c97de4047b84fdf783f3b3673f055 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Wed, 25 Jun 2025 08:12:53 -0400 Subject: [PATCH 061/157] feat: pyramid generation level data persist --- linc_convert/utils/zarr/zarr_io/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py index 663b0f06..a982164e 100644 --- a/linc_convert/utils/zarr/zarr_io/__init__.py +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -230,6 +230,7 @@ def generate_pyramid( dat = dat.rechunk(arr.shards) else: dat = dat.rechunk(arr.chunks) + dat = dat.persist() with ProgressBar(): dat.store(arr) return all_shapes From 3719aec49e3ad0804469371c9a700d39b90cc0c5 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 10:28:42 -0400 Subject: [PATCH 062/157] refactor: split zarrio into files --- linc_convert/utils/zarr/zarr_io/__init__.py | 946 +----------------- linc_convert/utils/zarr/zarr_io/abc.py | 215 ++++ .../utils/zarr/zarr_io/drivers/tensorstore.py | 444 ++++++++ .../utils/zarr/zarr_io/drivers/zarr_python.py | 192 ++++ .../utils/zarr/zarr_io/drivers/zarrita.py | 0 linc_convert/utils/zarr/zarr_io/factory.py | 53 + 6 files changed, 912 insertions(+), 938 deletions(-) create mode 100644 linc_convert/utils/zarr/zarr_io/abc.py create mode 100644 linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py create mode 100644 linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py create mode 100644 linc_convert/utils/zarr/zarr_io/drivers/zarrita.py create mode 100644 linc_convert/utils/zarr/zarr_io/factory.py diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py index a982164e..e4fc2782 100644 --- a/linc_convert/utils/zarr/zarr_io/__init__.py +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -1,944 +1,14 @@ -import ast -import json import logging -from abc import ABC, abstractmethod, ABCMeta -from os import PathLike -import os -from typing import Iterator, Literal, Optional, Tuple, Any, Union, Mapping - -import dask.array as da -import numpy as np -import tqdm -import zarr -from dask.diagnostics import ProgressBar -from numpy._typing import DTypeLike -from upath import UPath - -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr._zarr import make_kvstore, auto_shard_size, \ - fix_shard_chunk, make_compressor_v2, make_compressor_v3 -from linc_convert.utils.zarr.compressor import make_compressor -from linc_convert.utils.zarr.create_array import compute_zarr_layout, \ - dimension_separator_to_chunk_key_encoding -from linc_convert.utils.zarr.generate_pyramid import compute_next_level, default_levels, \ - next_level_shape +import warnings logger = logging.getLogger(__name__) +from .abc import ZarrNode, ZarrArray, ZarrGroup +from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup -class ZarrNode(ABC): - """ - Base class for any Zarr-like object (group or array). - """ - - def __init__(self, store_path: Union[str, PathLike]): - # record where on disk (or out‐of core store) this node lives - self._store_path = store_path - - @property - def store_path(self) -> str: - return self._store_path - - @abstractmethod - def attrs(self): - """Access metadata/attributes for this node.""" - ... - - @property - @abstractmethod - def zarr_version(self) -> int: - """ - Return the Zarr format version (e.g., 2 or 3). - """ - ... - - -class ZarrArray(ZarrNode): - """ - Abstract interface for a Zarr array (n-dimensional data). - """ - - @property - @abstractmethod - def shape(self) -> Tuple[int, ...]: - """ - Shape of the array. - """ - ... - - @property - @abstractmethod - def dtype(self) -> np.dtype: - """ - Data type of the array. - """ - ... - - @property - @abstractmethod - def chunks(self) -> Tuple[int, ...]: - """ - Chunk shape for the array. - """ - ... - - @property - @abstractmethod - def shards(self) -> Optional[Tuple[int, ...]]: - """ - Shard shape, if supported; otherwise None. - """ - ... - - @property - @abstractmethod - def ndim(self) -> int: - ... - - @abstractmethod - def __getitem__(self, key: Any) -> Any: - """ - Read data from the array. - """ - ... - - @abstractmethod - def __setitem__(self, key: Any, value: Any) -> None: - """ - Write data to the array. - """ - ... - - -class ZarrGroup(ZarrNode, metaclass=ABCMeta): - """ - Abstract interface for a Zarr group (container of arrays and/or subgroups). - """ - - @classmethod - @abstractmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': - ... - - @abstractmethod - def __getitem__(self, name: str) -> ZarrNode: - """ - Get a subgroup or array by name within this group. - """ - ... - - @abstractmethod - def create_group(self, name: str, overwrite: bool = False) -> 'ZarrGroup': - """ - Create or open a subgroup within this group. - """ - ... - - @abstractmethod - def create_array( - self, - name: str, - shape: Tuple[int, ...], - **kwargs - ) -> 'ZarrArray': - """ - Create a new array within this group. - """ - ... - - @abstractmethod - def create_array_from_base( - self, - name: str, - shape: Tuple[int, ...], - data: Optional[Any] = None, - **kwargs - ) -> 'ZarrArray': - """ - Create a new array using metadata of an existing base-level array. - """ - ... - - # @abstractmethod - # def generate_pyramid( - # self, - # levels: int = -1, - # ndim: int = 3, - # mode: str = "median", - # no_pyramid_axis: Optional[int] = None, - # ) -> list[list[int]]: - # """ - # Generate a multiresolution pyramid across spatial dimensions. - # Returns list of shapes for each level. - # """ - # ... - def generate_pyramid( - self, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - omz : zarr.Group - Zarr group object - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - ndim : int - Number of spatial dimensions. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - no_pyramid_axis : int | None - Axis that should not be downsampled. If None, downsample - across all three dimensions. - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - - base_level = self['0'] - base_shape = list(base_level.shape) - chunk_size = base_level.chunks - - window_func = {"median": da.median, "mean": da.mean}[mode] - - batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] - all_shapes = [spatial_shape] - - if levels == -1: - levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) - - for lvl in tqdm.tqdm(range(1, levels + 1)): - prev_shape = spatial_shape - spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) - all_shapes.append(spatial_shape) - logger.info(f"Compute level {lvl} with shape {spatial_shape}") - arr = self.create_array_from_base( - str(lvl), shape=batch_shape + spatial_shape) - # dat = da.from_zarr(self[str(lvl - 1)]._array) - dat = da.from_array(self[str(lvl - 1)], chunks = self[str(lvl - 1)].chunks) - dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - if arr.shards: - dat = dat.rechunk(arr.shards) - else: - dat = dat.rechunk(arr.chunks) - dat = dat.persist() - with ProgressBar(): - dat.store(arr) - return all_shapes - - @abstractmethod - def __delitem__(self, key): - ... - - -class ZarrPythonArray(ZarrArray): - def __init__(self, array: zarr.Array): - super().__init__(str(array.store_path)) - self._array = array - - @property - def attrs(self): - return self._array.attrs - - @property - def shape(self) -> tuple[int, ...]: - return self._array.shape - - @property - def dtype(self) -> np.dtype: - return self._array.dtype - - @property - def chunks(self) -> tuple: - return self._array.chunks - - @property - def shards(self) -> tuple: - return self._array.shards - - @property - def zarr_version(self) -> int: - return self._array.metadata.zarr_format - - @property - def ndim(self) -> int: - return self._array.ndim - - def __setitem__(self, key, value): - self._array[key] = value - - def __getitem__(self, item): - return self._array[item] - - def __getattr__(self, name): - if name == "_array": - return self._array - if hasattr(self._array, name): - return getattr(self._array, name) - else: - raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'") - - # def __setattr__(self, name, value): - # if name == "_array" and self._array is not None: - # raise AttributeError("Cannot set '_array' attribute directly.") - # elif hasattr(self._array, name): - # setattr(self._array, name, value) - # else: - # raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") - - -class ZarrPythonGroup(ZarrGroup): - @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrPythonGroup': - store = zarr.storage.LocalStore(zarr_config.out) - return cls(zarr.group(store=store, - #TODO: figure out overwrite - # overwrite=overwrite, - zarr_format=zarr_config.zarr_version)) - - def __init__(self, zarr_group: zarr.Group): - super().__init__(str(zarr_group.store_path)) - self._zgroup = zarr_group - - def create_group(self, *args, **kwargs): - """ - Create a new subgroup in the group. - """ - return ZarrPythonGroup(self._zgroup.create_group(*args, **kwargs)) - - def keys(self): - yield from self._zgroup.keys() - - @property - def attrs(self): - return self._zgroup.attrs - - def __iter__(self) -> Iterator[str]: - yield from self.keys() - - def __getitem__(self, key) -> Union[ZarrPythonArray, 'ZarrPythonGroup']: - if key not in self._zgroup: - raise KeyError(f"Key '{key}' not found in group '{self.path}'") - - item = self._zgroup[key] - if isinstance(item, zarr.Group): - return ZarrPythonGroup(item) - elif isinstance(item, zarr.Array): - return ZarrPythonArray(item) - else: - raise TypeError(f"Unsupported item type: {type(item)}") - - def __getattr__(self, name): - return getattr(self._zgroup, name) - - def create_array(self, - name: str, - shape: tuple, - zarr_config: ZarrConfig = None, - dtype: DTypeLike = np.int32, - data=None, - **kwargs - ) -> zarr.Array: - if zarr_config is None: - arr = self._zgroup.create_array(name, shape, dtype, **kwargs) - if data is not None: - arr[:] = data - return ZarrPythonArray(arr) - - compressor = zarr_config.compressor - compressor_opt = zarr_config.compressor_opt - chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - opt = { - "chunks": chunk, - "shards": shard, - "order": zarr_config.order, - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressors": make_compressor(compressor, zarr_config.zarr_version, - **compressor_opt), - } - - chunk_key_encoding = dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version) - if chunk_key_encoding: - opt["chunk_key_encoding"] = chunk_key_encoding - arr = self._zgroup.create_array(name=name, - shape=shape, - **opt) - if data: - arr[:] = data - return ZarrPythonArray(arr) - - def create_array_from_base(self, name: str, shape: tuple, data=None, - **kwargs) -> 'ZarrPythonArray': - """ - Create a new array using the properties from a base_level object. - """ - base_level = self['0'] - opts = dict( - dtype=base_level.dtype, - chunks=base_level.chunks, - shards=getattr(base_level, "shards", None), - filters=getattr(base_level._array, "filters", None), - compressors=getattr(base_level._array, "compressors", None), - fill_value=getattr(base_level._array, "fill_value", None), - order=getattr(base_level._array, "order", None), - attributes=getattr(getattr(base_level._array, "metadata", None), - "attributes", None), - overwrite=True, - ) - # Handle extra options based on metadata type - meta = getattr(base_level, "metadata", None) - if meta is not None: - if hasattr(meta, "dimension_separator"): - opts["chunk_key_encoding"] = dimension_separator_to_chunk_key_encoding( - meta.dimension_separator, 2) - if hasattr(meta, "chunk_key_encoding"): - opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) - if hasattr(base_level, "serializer"): - opts["serializer"] = getattr(base_level, "serializer", None) - if hasattr(meta, "dimension_names"): - opts["dimension_names"] = getattr(meta, "dimension_names", None) - # Remove None values - opts = {k: v for k, v in opts.items() if v is not None} - opts.update(kwargs) - arr = self._zgroup.create_array(name=name, shape=shape, **opts) - if data is not None: - arr[:] = data - return ZarrPythonArray(arr) - - # def generate_pyramid( - # self, - # levels: int = -1, - # ndim: int = 3, - # mode: Literal["mean", "median"] = "median", - # no_pyramid_axis: Optional[int] = None, - # ) -> list[list[int]]: - # """ - # Generate the levels of a pyramid in an existing Zarr. - - # Parameters - # ---------- - # omz : zarr.Group - # Zarr group object - # levels : int - # Number of additional levels to generate. - # By default, stop when all dimensions are smaller than their - # corresponding chunk size. - # ndim : int - # Number of spatial dimensions. - # mode : {"mean", "median"} - # Whether to use a mean or median moving window. - # no_pyramid_axis : int | None - # Axis that should not be downsampled. If None, downsample - # across all three dimensions. - # Returns - # ------- - # shapes : list[list[int]] - # Shapes of all levels, from finest to coarsest, including the - # existing top level. - # """ - - # base_level = self['0'] - # base_shape = list(base_level.shape) - # chunk_size = base_level.chunks - - # window_func = {"median": da.median, "mean": da.mean}[mode] - - # batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] - # all_shapes = [spatial_shape] - - # if levels == -1: - # levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) - - # for lvl in tqdm.tqdm(range(1, levels + 1)): - # prev_shape = spatial_shape - # spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) - # all_shapes.append(spatial_shape) - # logger.info(f"Compute level {lvl} with shape {spatial_shape}") - # arr = self.create_array_from_base( - # str(lvl), shape=batch_shape + spatial_shape) - # dat = da.from_zarr(self[str(lvl - 1)]._array) - # dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - # if arr.shards: - # dat = dat.rechunk(arr.shards) - # else: - # dat = dat.rechunk(arr.chunks) - # with ProgressBar(): - # dat.store(arr) - # return all_shapes - - @property - def zarr_version(self) -> Literal[2, 3]: - return self._zgroup.metadata.zarr_format - - def __delitem__(self, key): - del self._zgroup[key] - - -import tensorstore as ts -class ZarrTSArray(ZarrArray): - def __init__(self, ts: ts.TensorStore): - super().__init__(ts.kvstore.path) - self._ts = ts - @property - def shape(self): return self._ts.shape - @property - def ndim(self): return self._ts.ndim - @property - def dtype(self): return self._ts.dtype.numpy_dtype - @property - def chunks(self): return self._ts.chunk_layout.read_chunk.shape - @property - def shards(self) -> Optional[Tuple[int, ...]]: - if self._ts.chunk_layout.read_chunk.shape == self._ts.chunk_layout.write_chunk.shape: - return None - else: - return self._ts.chunk_layout.write_chunk.shape - - @property - def zarr_version(self) -> int: - driver_map = {"zarr3": 3, "zarr": 2} - return driver_map[self._ts.schema.codec.to_json()['driver']] - - def __getitem__(self, idx): return self._ts[idx].read().result() - def __setitem__(self, idx, val): self._ts[idx] = val - - @property - def attrs(self): - return {} - - @classmethod - def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): - - conf = { - "kvstore": make_kvstore(path), - "driver": "zarr3" if zarr_version == 3 else "zarr", - "open": True, - "create": False, - "delete_existing": False, - } - return cls(ts.open(conf).result()) - -# tswriter.schema.codec.to_json() -# tswriter.schema.to_json() -def _is_array(path): - zarr2_array_file = path / ".zarray" - if zarr2_array_file.is_file(): - content = zarr2_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_array_file = path / "zarr.json" - if zarr3_array_file.is_file(): - content = zarr3_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "array": - return True - return False - - -def _is_group(path): - zarr2_group_file = path / ".zgroup" - if zarr2_group_file.is_file(): - content = zarr2_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_group_file = path / "zarr.json" - if zarr3_group_file.is_file(): - content = zarr3_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "group": - return True - return False - - -def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: - """ - Look for Zarr metadata files in `path` and return (node_type, version). - Checks zarr.json (v3), then .zarray/.zgroup (v2). - """ - # Zarr v3 - z3 = path / 'zarr.json' - if z3.is_file(): - try: - meta = json.loads(z3.read_text()) - fmt = meta.get('zarr_format') - if fmt == 3: - node = meta.get('node_type', 'array') - if node in ('array', 'group'): - return node, 3 - except json.JSONDecodeError: - pass - # Zarr v2 - for fname, ntype in (('.zarray', 'array'), ('.zgroup', 'group')): - f = path / fname - if f.is_file(): - try: - meta = json.loads(f.read_text()) - if meta.get('zarr_format') == 2: - return ntype, 2 - except json.JSONDecodeError: - pass - return None - - -def default_write_config( - path: os.PathLike | str, - shape: list[int], - dtype: np.dtype | str, - chunk: list[int] = [32], - shard: list[int] | Literal["auto"] | None = None, - compressor: str = "blosc", - compressor_opt: dict | None = None, - version: int = 3, -) -> dict: - """ - Generate a default TensorStore configuration. - - Parameters - ---------- - chunk : list[int] - Chunk size. - shard : list[int], optional - Shard size. No sharding if `None`. - compressor : str - Compressor name - version : int - Zarr version - - Returns - ------- - config : dict - Configuration - """ - from upath import UPath - path = UPath(path) - if not path.protocol: - path = "file://" / path - - # Format compressor - if version == 3 and compressor == "zlib": - compressor = "gzip" - if version == 2 and compressor == "gzip": - compressor = "zlib" - compressor_opt = compressor_opt or {} - - # Prepare chunk size - if isinstance(chunk, int): - chunk = [chunk] - chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk - - # Prepare shard size - if shard: - if shard == "auto": - shard = auto_shard_size(shape, dtype) - if isinstance(shard, int): - shard = [shard] - shard = shard[:1] * max(0, len(shape) - len(shard)) + shard - - # Fix incompatibilities - shard, chunk = fix_shard_chunk(shard, chunk, shape) - - # ------------------------------------------------------------------ - # Zarr 3 - # ------------------------------------------------------------------ - if version == 3: - if compressor and compressor != "raw": - compressor = [make_compressor_v3(compressor, **compressor_opt)] - else: - compressor = [] - - codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} - - if shard: - chunk_grid = { - "name": "regular", - "configuration": {"chunk_shape": shard}, - } - - sharding_codec = { - "name": "sharding_indexed", - "configuration": { - "chunk_shape": chunk, - "codecs": [ - codec_little_endian, - *compressor, - ], - "index_codecs": [ - codec_little_endian, - {"name": "crc32c"}, - ], - "index_location": "end", - }, - } - codecs = [sharding_codec] - - else: - chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} - codecs = [ - codec_little_endian, - *compressor, - ] - - metadata = { - "chunk_grid": chunk_grid, - "codecs": codecs, - "data_type": np.dtype(dtype).name, - "fill_value": 0, - "chunk_key_encoding": { - "name": "default", - "configuration": {"separator": r"/"}, - }, - } - config = { - "driver": "zarr3", - "metadata": metadata, - } - - # ------------------------------------------------------------------ - # Zarr 2 - # ------------------------------------------------------------------ - else: - if compressor and compressor != "raw": - compressor = make_compressor_v2(compressor, **compressor_opt) - else: - compressor = None - - metadata = { - "chunks": chunk, - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": 0, - "compressor": compressor, - } - config = { - "driver": "zarr", - "metadata": metadata, - "key_encoding": r"/", - } - - # Prepare store - config["metadata"]["shape"] = shape - config["kvstore"] = make_kvstore(path) - - return config - - -def _init_group(group_path: PathLike, version: int): - group_path.mkdir(parents=True, exist_ok=True) - if version == 3: - (group_path / 'zarr.json').write_text( - json.dumps({'zarr_format': 3, 'node_type': 'group'}) - ) - else: - (group_path / '.zgroup').write_text( - json.dumps({'zarr_format': 2}) - ) - - -class ZarrTSGroup(ZarrGroup): - - def __init__(self, store_path: Union[str, PathLike]): - super().__init__(store_path) - from upath import UPath - if not isinstance(store_path, UPath): - store_path = UPath(store_path) - self._path = store_path - metadata = _detect_metadata(store_path) - assert metadata is not None - assert metadata[0] == "group" - self._zarr_version = metadata[1] - self._zarr_config = None - - @property - def zarr_version(self): - return self._zarr_version - - @property - def attrs(self) -> Mapping[str, Any]: - return {} - - def keys(self): - return ( - sub_dir.name for sub_dir in self._path.iterdir() - if sub_dir.is_dir() and _detect_metadata(sub_dir) - ) - - def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: - metadata = _detect_metadata(self._path / key) - if metadata is None: - raise KeyError(key) - if metadata[0] == "group": - return ZarrTSGroup(self._path / key) - if metadata[0] == "array": - return ZarrTSArray.open(self._path / key, metadata[1]) - - def __contains__(self, key) -> bool: - if not (self._path / key).exists(): - return False - if _detect_metadata(self._path / key) is None: - return False - return True - - def __delitem__(self, key): - if key in self: - (self._path / key).rmdir(recursive=True) - - # def generate_pyramid(self, levels: int = -1, ndim: int = 3, mode: str = "median", - # no_pyramid_axis: Optional[int] = None) -> list[list[int]]: - # pass - - def create_array_from_base(self, name: str, shape: Tuple[int, ...], - data: Optional[Any] = None, **kwargs) -> 'ZarrArray': - - spec = self['0']._ts.spec().to_json() - spec['metadata']['shape'] = shape - kvstore = make_kvstore(self._path / name) - spec['kvstore'] = kvstore - spec['delete_existing'] = True - spec['create'] = True - arr = ts.open(spec).result() - if data is not None: - arr[:] = data - return ZarrTSArray(arr) - - - def create_array(self, - name: str, - shape: tuple, - zarr_config: ZarrConfig = None, - dtype: DTypeLike = np.int32, - data=None, - **kwargs - ) -> zarr.Array: - if zarr_config is None: - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - **kwargs - ) - else: - compressor_opt = ast.literal_eval(zarr_config.compressor_opt) - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - # compressor_opt=, - version=zarr_config.zarr_version, - ) - conf['delete_existing'] = True - conf['create'] = True - arr = ts.open(conf).result() - if data is not None: - arr[:] = data - return ZarrTSArray(arr) - - def create_group(self, name: str, *, overwrite: bool = False, - zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': - if zarr_version is None: - zarr_version = self.zarr_version - if overwrite: - mode = 'w' - else: - mode = 'w-' - return self.open(self._path / name, mode=mode, zarr_version=zarr_version) - - @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': - return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) - - @classmethod - def open(cls, path: Union[str, PathLike], mode="a", *, - zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': - """ - Open a Zarr group from a path. - - Parameters - ---------- - path : Union[str, PathLike] - Path to the Zarr group. - mode : str - Persistence mode: - 'r' means read only (must exist); - 'r+' means read/write (must exist); - 'a' means read/write (create if doesn't exist); - 'w' means create (overwrite if exists); - 'w-' means create (fail if exists). - - Returns - ------- - ZarrTSGroup - An instance of ZarrTSGroup. - """ - p = UPath(path) - - if mode in ['r', 'r+']: - if not p.exists() or not p.is_dir(): - raise FileNotFoundError(f"Group path '{p}' does not exist") - elif mode == 'w-': - if p.exists(): - raise FileExistsError(f"Group path '{p}' already exists") - elif mode == 'a': - if not p.exists(): - _init_group(p, zarr_version) - elif mode == 'w': - if p.exists(): - p.rmdir(recursive=True) - _init_group(p, zarr_version) - else: - raise ValueError( - f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") - - return cls(p) - -def open(): - pass - -def open_group(backend=None): - pass - +try: + from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup +except ImportError: + warnings.warn("Tensorstore is not installed, driver disabled") -def from_config(zarr_config: ZarrConfig) -> 'ZarrGroup': - """ - Create a ZarrGroup from a ZarrConfig. - - Parameters - ---------- - zarr_config : ZarrConfig - Configuration for the Zarr group. - - Returns - ------- - ZarrGroup - An instance of ZarrGroup based on the configuration. - """ - if zarr_config.driver == "zarr-python": - return ZarrPythonGroup.from_config(zarr_config) - elif zarr_config.driver == "tensorstore": - return ZarrTSGroup.from_config(zarr_config) - elif zarr_config.driver == "zarrita": - raise NotImplementedError(f"{zarr_config.driver} is not yet supported") - else: - raise NotImplementedError(f"Driver '{zarr_config.driver}' is not supported.") +from .factory import open, open_group, from_config diff --git a/linc_convert/utils/zarr/zarr_io/abc.py b/linc_convert/utils/zarr/zarr_io/abc.py new file mode 100644 index 00000000..0f1e0061 --- /dev/null +++ b/linc_convert/utils/zarr/zarr_io/abc.py @@ -0,0 +1,215 @@ +from abc import ABC, abstractmethod, ABCMeta +from os import PathLike +from typing import Union, Tuple, Optional, Any, Literal + +import numpy as np +import tqdm +from dask import array as da +from dask.diagnostics import ProgressBar + +from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr.generate_pyramid import default_levels, next_level_shape, \ + compute_next_level +from linc_convert.utils.zarr.zarr_io import logger + + +class ZarrNode(ABC): + """ + Base class for any Zarr-like object (group or array). + """ + + def __init__(self, store_path: Union[str, PathLike]): + # record where on disk (or out‐of core store) this node lives + self._store_path = store_path + + @property + def store_path(self) -> str: + return self._store_path + + @property + @abstractmethod + def attrs(self): + """Access metadata/attributes for this node.""" + ... + + @property + @abstractmethod + def zarr_version(self) -> int: + """ + Return the Zarr format version (e.g., 2 or 3). + """ + ... + + +class ZarrArray(ZarrNode): + """ + Abstract interface for a Zarr array (n-dimensional data). + """ + + @property + @abstractmethod + def shape(self) -> Tuple[int, ...]: + """ + Shape of the array. + """ + ... + + @property + @abstractmethod + def dtype(self) -> np.dtype: + """ + Data type of the array. + """ + ... + + @property + @abstractmethod + def chunks(self) -> Tuple[int, ...]: + """ + Chunk shape for the array. + """ + ... + + @property + @abstractmethod + def shards(self) -> Optional[Tuple[int, ...]]: + """ + Shard shape, if supported; otherwise None. + """ + ... + + @property + @abstractmethod + def ndim(self) -> int: + ... + + @abstractmethod + def __getitem__(self, key: Any) -> Any: + """ + Read data from the array. + """ + ... + + @abstractmethod + def __setitem__(self, key: Any, value: Any) -> None: + """ + Write data to the array. + """ + ... + + +class ZarrGroup(ZarrNode, metaclass=ABCMeta): + """ + Abstract interface for a Zarr group (container of arrays and/or subgroups). + """ + + @classmethod + @abstractmethod + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': + ... + + @abstractmethod + def __getitem__(self, name: str) -> ZarrNode: + """ + Get a subgroup or array by name within this group. + """ + ... + + @abstractmethod + def __delitem__(self, key): + ... + + @abstractmethod + def create_group(self, name: str, overwrite: bool = False) -> 'ZarrGroup': + """ + Create or open a subgroup within this group. + """ + ... + + @abstractmethod + def create_array( + self, + name: str, + shape: Tuple[int, ...], + **kwargs + ) -> 'ZarrArray': + """ + Create a new array within this group. + """ + ... + + @abstractmethod + def create_array_from_base( + self, + name: str, + shape: Tuple[int, ...], + data: Optional[Any] = None, + **kwargs + ) -> 'ZarrArray': + """ + Create a new array using metadata of an existing base-level array. + """ + ... + + def generate_pyramid( + self, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, + ) -> list[list[int]]: + """ + Generate the levels of a pyramid in an existing Zarr. + + Parameters + ---------- + omz : zarr.Group + Zarr group object + levels : int + Number of additional levels to generate. + By default, stop when all dimensions are smaller than their + corresponding chunk size. + ndim : int + Number of spatial dimensions. + mode : {"mean", "median"} + Whether to use a mean or median moving window. + no_pyramid_axis : int | None + Axis that should not be downsampled. If None, downsample + across all three dimensions. + Returns + ------- + shapes : list[list[int]] + Shapes of all levels, from finest to coarsest, including the + existing top level. + """ + + base_level = self['0'] + base_shape = list(base_level.shape) + chunk_size = base_level.chunks + + window_func = {"median": da.median, "mean": da.mean}[mode] + + batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + all_shapes = [spatial_shape] + + if levels == -1: + levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + + for lvl in tqdm.tqdm(range(1, levels + 1)): + prev_shape = spatial_shape + spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + all_shapes.append(spatial_shape) + logger.info(f"Compute level {lvl} with shape {spatial_shape}") + arr = self.create_array_from_base( + str(lvl), shape=batch_shape + spatial_shape) + # dat = da.from_zarr(self[str(lvl - 1)]._array) + dat = da.from_array(self[str(lvl - 1)], chunks=self[str(lvl - 1)].chunks) + dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) + if arr.shards: + dat = dat.rechunk(arr.shards) + else: + dat = dat.rechunk(arr.chunks) + dat = dat.persist() + with ProgressBar(): + dat.store(arr) + return all_shapes diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py new file mode 100644 index 00000000..99fdf1e8 --- /dev/null +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -0,0 +1,444 @@ +import ast +import json +import os +from os import PathLike +from typing import Optional, Tuple, Literal, Union, Mapping, Any + +import numpy as np +from numpy._typing import DTypeLike +from upath import UPath +import zarr + +import tensorstore as ts +from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr._zarr import make_kvstore, auto_shard_size, \ + fix_shard_chunk, make_compressor_v3, make_compressor_v2 +from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup + + +class ZarrTSArray(ZarrArray): + def __init__(self, ts: ts.TensorStore): + super().__init__(ts.kvstore.path) + self._ts = ts + + @property + def shape(self): + return self._ts.shape + + @property + def ndim(self): + return self._ts.ndim + + @property + def dtype(self): + return self._ts.dtype.numpy_dtype + + @property + def chunks(self): + return self._ts.chunk_layout.read_chunk.shape + + @property + def shards(self) -> Optional[Tuple[int, ...]]: + if self._ts.chunk_layout.read_chunk.shape == self._ts.chunk_layout.write_chunk.shape: + return None + else: + return self._ts.chunk_layout.write_chunk.shape + + @property + def zarr_version(self) -> int: + driver_map = {"zarr3": 3, "zarr": 2} + return driver_map[self._ts.schema.codec.to_json()['driver']] + + def __getitem__(self, idx): + return self._ts[idx].read().result() + + def __setitem__(self, idx, val): + self._ts[idx] = val + + @property + def attrs(self): + return {} + + @classmethod + def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): + + conf = { + "kvstore": make_kvstore(path), + "driver": "zarr3" if zarr_version == 3 else "zarr", + "open": True, + "create": False, + "delete_existing": False, + } + return cls(ts.open(conf).result()) + + +def _is_array(path): + zarr2_array_file = path / ".zarray" + if zarr2_array_file.is_file(): + content = zarr2_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_array_file = path / "zarr.json" + if zarr3_array_file.is_file(): + content = zarr3_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "array": + return True + return False + + +def _is_group(path): + zarr2_group_file = path / ".zgroup" + if zarr2_group_file.is_file(): + content = zarr2_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_group_file = path / "zarr.json" + if zarr3_group_file.is_file(): + content = zarr3_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "group": + return True + return False + + +def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: + """ + Look for Zarr metadata files in `path` and return (node_type, version). + Checks zarr.json (v3), then .zarray/.zgroup (v2). + """ + # Zarr v3 + z3 = path / 'zarr.json' + if z3.is_file(): + try: + meta = json.loads(z3.read_text()) + fmt = meta.get('zarr_format') + if fmt == 3: + node = meta.get('node_type', 'array') + if node in ('array', 'group'): + return node, 3 + except json.JSONDecodeError: + pass + # Zarr v2 + for fname, ntype in (('.zarray', 'array'), ('.zgroup', 'group')): + f = path / fname + if f.is_file(): + try: + meta = json.loads(f.read_text()) + if meta.get('zarr_format') == 2: + return ntype, 2 + except json.JSONDecodeError: + pass + return None + + +def default_write_config( + path: os.PathLike | str, + shape: list[int], + dtype: np.dtype | str, + chunk: list[int] = [32], + shard: list[int] | Literal["auto"] | None = None, + compressor: str = "blosc", + compressor_opt: dict | None = None, + version: int = 3, +) -> dict: + """ + Generate a default TensorStore configuration. + + Parameters + ---------- + chunk : list[int] + Chunk size. + shard : list[int], optional + Shard size. No sharding if `None`. + compressor : str + Compressor name + version : int + Zarr version + + Returns + ------- + config : dict + Configuration + """ + from upath import UPath + path = UPath(path) + if not path.protocol: + path = "file://" / path + + # Format compressor + if version == 3 and compressor == "zlib": + compressor = "gzip" + if version == 2 and compressor == "gzip": + compressor = "zlib" + compressor_opt = compressor_opt or {} + + # Prepare chunk size + if isinstance(chunk, int): + chunk = [chunk] + chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk + + # Prepare shard size + if shard: + if shard == "auto": + shard = auto_shard_size(shape, dtype) + if isinstance(shard, int): + shard = [shard] + shard = shard[:1] * max(0, len(shape) - len(shard)) + shard + + # Fix incompatibilities + shard, chunk = fix_shard_chunk(shard, chunk, shape) + + # ------------------------------------------------------------------ + # Zarr 3 + # ------------------------------------------------------------------ + if version == 3: + if compressor and compressor != "raw": + compressor = [make_compressor_v3(compressor, **compressor_opt)] + else: + compressor = [] + + codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} + + if shard: + chunk_grid = { + "name": "regular", + "configuration": {"chunk_shape": shard}, + } + + sharding_codec = { + "name": "sharding_indexed", + "configuration": { + "chunk_shape": chunk, + "codecs": [ + codec_little_endian, + *compressor, + ], + "index_codecs": [ + codec_little_endian, + {"name": "crc32c"}, + ], + "index_location": "end", + }, + } + codecs = [sharding_codec] + + else: + chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} + codecs = [ + codec_little_endian, + *compressor, + ] + + metadata = { + "chunk_grid": chunk_grid, + "codecs": codecs, + "data_type": np.dtype(dtype).name, + "fill_value": 0, + "chunk_key_encoding": { + "name": "default", + "configuration": {"separator": r"/"}, + }, + } + config = { + "driver": "zarr3", + "metadata": metadata, + } + + # ------------------------------------------------------------------ + # Zarr 2 + # ------------------------------------------------------------------ + else: + if compressor and compressor != "raw": + compressor = make_compressor_v2(compressor, **compressor_opt) + else: + compressor = None + + metadata = { + "chunks": chunk, + "order": "F", + "dtype": np.dtype(dtype).str, + "fill_value": 0, + "compressor": compressor, + } + config = { + "driver": "zarr", + "metadata": metadata, + "key_encoding": r"/", + } + + # Prepare store + config["metadata"]["shape"] = shape + config["kvstore"] = make_kvstore(path) + + return config + + +def _init_group(group_path: PathLike, version: int): + group_path.mkdir(parents=True, exist_ok=True) + if version == 3: + (group_path / 'zarr.json').write_text( + json.dumps({'zarr_format': 3, 'node_type': 'group'}) + ) + else: + (group_path / '.zgroup').write_text( + json.dumps({'zarr_format': 2}) + ) + + +class ZarrTSGroup(ZarrGroup): + def __init__(self, store_path: Union[str, PathLike]): + super().__init__(store_path) + from upath import UPath + if not isinstance(store_path, UPath): + store_path = UPath(store_path) + self._path = store_path + metadata = _detect_metadata(store_path) + assert metadata is not None + assert metadata[0] == "group" + self._zarr_version = metadata[1] + self._zarr_config = None + + @property + def zarr_version(self): + return self._zarr_version + + @property + def attrs(self) -> Mapping[str, Any]: + return {} + + def keys(self): + return ( + sub_dir.name for sub_dir in self._path.iterdir() + if sub_dir.is_dir() and _detect_metadata(sub_dir) + ) + + def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: + metadata = _detect_metadata(self._path / key) + if metadata is None: + raise KeyError(key) + if metadata[0] == "group": + return ZarrTSGroup(self._path / key) + if metadata[0] == "array": + return ZarrTSArray.open(self._path / key, metadata[1]) + + def __contains__(self, key) -> bool: + if not (self._path / key).exists(): + return False + if _detect_metadata(self._path / key) is None: + return False + return True + + def __delitem__(self, key): + if key in self: + (self._path / key).rmdir(recursive=True) + + def create_array_from_base(self, name: str, shape: Tuple[int, ...], + data: Optional[Any] = None, **kwargs) -> 'ZarrArray': + + spec = self['0']._ts.spec().to_json() + spec['metadata']['shape'] = shape + kvstore = make_kvstore(self._path / name) + spec['kvstore'] = kvstore + spec['delete_existing'] = True + spec['create'] = True + arr = ts.open(spec).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + def create_array(self, + name: str, + shape: tuple, + zarr_config: ZarrConfig = None, + dtype: DTypeLike = np.int32, + data=None, + **kwargs + ) -> zarr.Array: + if zarr_config is None: + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + **kwargs + ) + else: + compressor_opt = ast.literal_eval(zarr_config.compressor_opt) + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # compressor_opt=, + version=zarr_config.zarr_version, + ) + conf['delete_existing'] = True + conf['create'] = True + arr = ts.open(conf).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + def create_group(self, name: str, *, overwrite: bool = False, + zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': + if zarr_version is None: + zarr_version = self.zarr_version + if overwrite: + mode = 'w' + else: + mode = 'w-' + return self.open(self._path / name, mode=mode, zarr_version=zarr_version) + + @classmethod + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': + return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) + + @classmethod + def open(cls, path: Union[str, PathLike], mode="a", *, + zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': + """ + Open a Zarr group from a path. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the Zarr group. + mode : str + Persistence mode: + 'r' means read only (must exist); + 'r+' means read/write (must exist); + 'a' means read/write (create if doesn't exist); + 'w' means create (overwrite if exists); + 'w-' means create (fail if exists). + + Returns + ------- + ZarrTSGroup + An instance of ZarrTSGroup. + """ + p = UPath(path) + + if mode in ['r', 'r+']: + if not p.exists() or not p.is_dir(): + raise FileNotFoundError(f"Group path '{p}' does not exist") + elif mode == 'w-': + if p.exists(): + raise FileExistsError(f"Group path '{p}' already exists") + elif mode == 'a': + if not p.exists(): + _init_group(p, zarr_version) + elif mode == 'w': + if p.exists(): + p.rmdir(recursive=True) + _init_group(p, zarr_version) + else: + raise ValueError( + f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") + + return cls(p) diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py new file mode 100644 index 00000000..fc1f6f29 --- /dev/null +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -0,0 +1,192 @@ +import ast +from typing import Iterator, Union, Literal + +import numpy as np +import zarr +from numpy._typing import DTypeLike + +from linc_convert.utils.zarr import ZarrConfig, make_compressor +from linc_convert.utils.zarr.create_array import compute_zarr_layout, \ + dimension_separator_to_chunk_key_encoding +from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup + + +class ZarrPythonArray(ZarrArray): + def __init__(self, array: zarr.Array): + super().__init__(str(array.store_path)) + self._array = array + + @property + def attrs(self): + return self._array.attrs + + @property + def shape(self) -> tuple[int, ...]: + return self._array.shape + + @property + def dtype(self) -> np.dtype: + return self._array.dtype + + @property + def chunks(self) -> tuple: + return self._array.chunks + + @property + def shards(self) -> tuple: + return self._array.shards + + @property + def zarr_version(self) -> int: + return self._array.metadata.zarr_format + + @property + def ndim(self) -> int: + return self._array.ndim + + def __setitem__(self, key, value): + self._array[key] = value + + def __getitem__(self, item): + return self._array[item] + + def __getattr__(self, name): + if name == "_array": + return self._array + if hasattr(self._array, name): + return getattr(self._array, name) + else: + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{name}'") + + +class ZarrPythonGroup(ZarrGroup): + @classmethod + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrPythonGroup': + store = zarr.storage.LocalStore(zarr_config.out) + return cls(zarr.group(store=store, + # TODO: figure out overwrite + # overwrite=overwrite, + zarr_format=zarr_config.zarr_version)) + + def __init__(self, zarr_group: zarr.Group): + super().__init__(str(zarr_group.store_path)) + self._zgroup = zarr_group + + def create_group(self, *args, **kwargs): + """ + Create a new subgroup in the group. + """ + return ZarrPythonGroup(self._zgroup.create_group(*args, **kwargs)) + + def keys(self): + yield from self._zgroup.keys() + + @property + def attrs(self): + return self._zgroup.attrs + + def __iter__(self) -> Iterator[str]: + yield from self.keys() + + def __getitem__(self, key) -> Union[ZarrPythonArray, 'ZarrPythonGroup']: + if key not in self._zgroup: + raise KeyError(f"Key '{key}' not found in group '{self.path}'") + + item = self._zgroup[key] + if isinstance(item, zarr.Group): + return ZarrPythonGroup(item) + elif isinstance(item, zarr.Array): + return ZarrPythonArray(item) + else: + raise TypeError(f"Unsupported item type: {type(item)}") + + def __getattr__(self, name): + return getattr(self._zgroup, name) + + def create_array(self, + name: str, + shape: tuple, + zarr_config: ZarrConfig = None, + dtype: DTypeLike = np.int32, + data=None, + **kwargs + ) -> zarr.Array: + if zarr_config is None: + arr = self._zgroup.create_array(name, shape, dtype, **kwargs) + if data is not None: + arr[:] = data + return ZarrPythonArray(arr) + + compressor = zarr_config.compressor + compressor_opt = zarr_config.compressor_opt + chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + + if isinstance(compressor_opt, str): + compressor_opt = ast.literal_eval(compressor_opt) + + opt = { + "chunks": chunk, + "shards": shard, + "order": zarr_config.order, + "dtype": np.dtype(dtype).str, + "fill_value": None, + "compressors": make_compressor(compressor, zarr_config.zarr_version, + **compressor_opt), + } + + chunk_key_encoding = dimension_separator_to_chunk_key_encoding( + zarr_config.dimension_separator, zarr_config.zarr_version) + if chunk_key_encoding: + opt["chunk_key_encoding"] = chunk_key_encoding + arr = self._zgroup.create_array(name=name, + shape=shape, + **opt) + if data: + arr[:] = data + return ZarrPythonArray(arr) + + def create_array_from_base(self, name: str, shape: tuple, data=None, + **kwargs) -> 'ZarrPythonArray': + """ + Create a new array using the properties from a base_level object. + """ + base_level = self['0'] + opts = dict( + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=getattr(base_level, "shards", None), + filters=getattr(base_level._array, "filters", None), + compressors=getattr(base_level._array, "compressors", None), + fill_value=getattr(base_level._array, "fill_value", None), + order=getattr(base_level._array, "order", None), + attributes=getattr(getattr(base_level._array, "metadata", None), + "attributes", None), + overwrite=True, + ) + # Handle extra options based on metadata type + meta = getattr(base_level, "metadata", None) + if meta is not None: + if hasattr(meta, "dimension_separator"): + opts["chunk_key_encoding"] = dimension_separator_to_chunk_key_encoding( + meta.dimension_separator, 2) + if hasattr(meta, "chunk_key_encoding"): + opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) + if hasattr(base_level, "serializer"): + opts["serializer"] = getattr(base_level, "serializer", None) + if hasattr(meta, "dimension_names"): + opts["dimension_names"] = getattr(meta, "dimension_names", None) + # Remove None values + opts = {k: v for k, v in opts.items() if v is not None} + opts.update(kwargs) + arr = self._zgroup.create_array(name=name, shape=shape, **opts) + if data is not None: + arr[:] = data + return ZarrPythonArray(arr) + + @property + def zarr_version(self) -> Literal[2, 3]: + return self._zgroup.metadata.zarr_format + + def __delitem__(self, key): + del self._zgroup[key] diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarrita.py b/linc_convert/utils/zarr/zarr_io/drivers/zarrita.py new file mode 100644 index 00000000..e69de29b diff --git a/linc_convert/utils/zarr/zarr_io/factory.py b/linc_convert/utils/zarr/zarr_io/factory.py new file mode 100644 index 00000000..a75590ec --- /dev/null +++ b/linc_convert/utils/zarr/zarr_io/factory.py @@ -0,0 +1,53 @@ +from typing import Literal + +from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr.zarr_io.abc import ZarrGroup +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import ZarrPythonArray, \ + ZarrPythonGroup + +_DRIVER_ARRAY = { + "zarr-python": ZarrPythonArray +} +_DRIVER_GROUP = { + "zarr-python": ZarrPythonGroup +} + +try: + from linc_convert.utils.zarr.zarr_io.drivers.tensorstore import ZarrTSArray, \ + ZarrTSGroup + + _DRIVER_ARRAY["tensorstore"] = ZarrTSArray + _DRIVER_GROUP["tensorstore"] = ZarrTSGroup +except ImportError: + pass + + +def open( + driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python"): + raise NotImplementedError + pass + + +def open_group( + driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python"): + raise NotImplementedError + pass + + +def from_config(zarr_config: ZarrConfig) -> ZarrGroup: + """ + Create a ZarrGroup from a ZarrConfig. + + Parameters + ---------- + zarr_config : ZarrConfig + Configuration for the Zarr group. + + Returns + ------- + ZarrGroup + An instance of ZarrGroup based on the configuration. + """ + if zarr_config.driver not in _DRIVER_GROUP: + raise ValueError(f"{zarr_config.driver} is not supported.") + return _DRIVER_GROUP[zarr_config.driver].from_config(zarr_config) From 8c3515424185585fd68782a2cb063f20ffe3d89c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 10:43:40 -0400 Subject: [PATCH 063/157] update dependencies --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 694d834a..c02dc33c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ tifffile = { version = "*", optional = true } h5py = { version = "*", optional = true } scipy = { version = "*", optional = true } wkw = { version = "*", optional = true } +tensorstore = { version = "*", optional = true } [tool.poetry.extras] df = ["glymur"] From fc05df09899bbf2eaeb4af131ec00114eea923bf Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 11:58:32 -0400 Subject: [PATCH 064/157] test: update testing util --- tests/test_oct.py | 10 ++-- tests/utils/compare_file.py | 100 ++++++++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 27 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index 3f6604dd..4f1777df 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -10,7 +10,7 @@ from scipy.io import savemat from linc_convert.modalities.psoct import single_volume, multi_slice -from utils.compare_file import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal # def test_oct(tmp_path): @@ -51,7 +51,7 @@ def test_oct_single_volume(tmp_path): single_volume.convert(input_path, out=str(output_path), key="volume", zarr_version=2, overwrite=True, chunk=(64,), driver = "tensorstore") - assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + assert_zarr_equal(str(output_path), zarr.storage.ZipStore( "data/oct_single_volume_zarr2.nii.zarr.zip", mode="r")) @@ -62,7 +62,7 @@ def test_oct_single_volume_zarr3(tmp_path): single_volume.convert(input_path, out=str(output_path), key="volume", zarr_version=3, overwrite=True, chunk=(64,), driver = "tensorstore") - assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + assert_zarr_equal(str(output_path), zarr.storage.ZipStore( "data/oct_single_volume_zarr3.nii.zarr.zip", mode="r")) @@ -108,7 +108,7 @@ def test_oct_multi_slices(tmp_path): multi_slice.convert(input_path, out=str(output_path), zarr_version=2, overwrite=True, chunk=(64,), driver = "tensorstore") - assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + assert_zarr_equal(str(output_path), zarr.storage.ZipStore( "data/oct_multi_slice_zarr2.nii.zarr.zip", mode="r")) @@ -120,7 +120,7 @@ def test_oct_multi_slices_zarr3(tmp_path): multi_slice.convert(input_path, out=str(output_path), zarr_version=3, overwrite=True, chunk=(64,), driver = "tensorstore") - assert _cmp_zarr_archives(str(output_path), zarr.storage.ZipStore( + assert_zarr_equal(str(output_path), zarr.storage.ZipStore( "data/oct_multi_slice_zarr3.nii.zarr.zip", mode="r")) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index 792c3283..1c35725c 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -1,6 +1,7 @@ import argparse import os import sys +from typing import Union import numpy as np import zarr @@ -34,7 +35,8 @@ def load_file(path): # Extract variable array from mat dict (ignoring metadata keys) keys = [k for k in mat.keys() if not k.startswith('__')] if len(keys) != 1: - print(f"Error: Expected one variable in the MAT file, found {len(keys)}: {keys}") + print( + f"Error: Expected one variable in the MAT file, found {len(keys)}: {keys}") sys.exit(1) return mat[keys[0]] @@ -52,26 +54,6 @@ def load_file(path): sys.exit(1) -def main(): - parser = argparse.ArgumentParser(description='Compare arrays in two files.') - parser.add_argument('file1', help='First file (.nii, .nii.gz, .mat, .zarr)') - parser.add_argument('file2', help='Second file (.nii, .nii.gz, .mat, .zarr)') - args = parser.parse_args() - - a = load_file(args.file1) - b = load_file(args.file2) - try: - np.testing.assert_array_almost_equal(a, b, decimal=4) - print("Arrays are almost equal up to 6 decimal places.") - except AssertionError as e: - print("Arrays differ:") - print(e) - - -if __name__ == '__main__': - main() - - def _cmp_zarr_archives(path1: str, path2: str) -> bool: """ Compare two Zarr archives to check if they contain the same data. @@ -85,7 +67,6 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: ------- - bool: True if both archives contain the same data, False otherwise. """ - # Open both Zarr groups zarr1 = zarr.open(path1, mode="r") zarr2 = zarr.open(path2, mode="r") @@ -110,3 +91,78 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: # If all checks pass print("The Zarr archives are identical.") return True + + +def assert_zarr_equal( + store1: Union[str, zarr.storage.StoreLike], + store2: Union[str, zarr.storage.StoreLike]) -> None: + """ + Assert that two Zarr groups—opened from either a path or a store—have identical contents. + + Parameters + ---------- + store1 : StoreLike + A filesystem path (str) or a Zarr store/mapping pointing to the first group. + store2 : StoreLike + A filesystem path (str) or a Zarr store/mapping pointing to the second group. + + Returns + ------- + None + """ + zarr1 = zarr.open(store1, mode="r") + zarr2 = zarr.open(store2, mode="r") + diffs = [] + + if dict(zarr1.attrs) != dict(zarr2.attrs): + diffs.append( + f"Group attrs differ:\n ‣ {dict(zarr1.attrs)}\n ‣ {dict(zarr2.attrs)}") + if set(zarr1.keys()) != set(zarr2.keys()): + diffs.append( + f"Group keys differ:\n ‣ {set(zarr1.keys())}\n ‣ {set(zarr2.keys())}") + + keys = set(zarr1.keys()).intersection(set(zarr2.keys())) + for key in keys: + obj1 = zarr1[key] + obj2 = zarr2[key] + if dict(obj1.attrs) != dict(obj2.attrs): + diffs.append( + f"Attributes for key '{key}' differ:\n ‣ {dict(obj1.attrs)}\n ‣ {dict(obj2.attrs)}") + if isinstance(obj1, zarr.Array) ^ isinstance(obj2, zarr.Array): + diffs.append(f"Key '{key}' is an array in one group but not the other.") + continue + elif isinstance(obj1, zarr.Array): + try: + np.testing.assert_array_equal(obj1[:], obj2[:]) + except AssertionError as e: + diffs.append(f"Array '{key}' differs:\n ‣ {e}") + elif isinstance(obj1, zarr.Group): + try: + np.testing.assert_allclose(obj1, obj2) + except AssertionError as e: + diffs.append(f"Group '{key}' differs:\n ‣ {e}") + else: + diffs.append(f"Key '{key}' is neither an array nor a group in both stores.") + + if diffs: + raise AssertionError("\n".join(diffs)) + + +def main(): + parser = argparse.ArgumentParser(description='Compare arrays in two files.') + parser.add_argument('file1', help='First file (.nii, .nii.gz, .mat, .zarr)') + parser.add_argument('file2', help='Second file (.nii, .nii.gz, .mat, .zarr)') + args = parser.parse_args() + + a = load_file(args.file1) + b = load_file(args.file2) + try: + np.testing.assert_array_almost_equal(a, b, decimal=4) + print("Arrays are almost equal up to 6 decimal places.") + except AssertionError as e: + print("Arrays differ:") + print(e) + + +if __name__ == '__main__': + main() From 1f03f2445f8ae2d29ce5946b07995440fec07ae3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 13:26:32 -0400 Subject: [PATCH 065/157] refactor --- linc_convert/utils/zarr/_zarr.py | 329 ------------ linc_convert/utils/zarr/generate_pyramid.py | 11 +- .../utils/zarr/zarr_io/drivers/tensorstore.py | 494 ++++++++++++------ 3 files changed, 341 insertions(+), 493 deletions(-) delete mode 100644 linc_convert/utils/zarr/_zarr.py diff --git a/linc_convert/utils/zarr/_zarr.py b/linc_convert/utils/zarr/_zarr.py deleted file mode 100644 index 1700c9dd..00000000 --- a/linc_convert/utils/zarr/_zarr.py +++ /dev/null @@ -1,329 +0,0 @@ -"""Zarr utilities.""" - -# stdlib -import itertools -import json -import math -import os -from typing import Literal -from urllib.parse import urlparse - -# externals -import nibabel as nib -import numcodecs -import numcodecs.abc -import numpy as np -import tensorstore as ts -from upath import UPath - -from linc_convert.utils.math import ceildiv - - -def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: - """Build compressor object from name and options.""" - # TODO: we should use `numcodecs.get_codec` instead` - if not isinstance(name, str): - return name - name = name.lower() - if name == "blosc": - Compressor = numcodecs.Blosc - elif name == "zlib": - Compressor = numcodecs.Zlib - else: - raise ValueError("Unknown compressor", name) - return Compressor(**prm) - - -def make_compressor_v2(name: str | None, **prm: dict) -> dict: - """Build compressor dictionary for Zarr v2.""" - name = name.lower() - if name not in ("blosc", "zlib", "bz2", "zstd"): - raise ValueError("Unknown compressor", name) - return {"id": name, **prm} - - -def make_compressor_v3(name: str | None, **prm: dict) -> dict: - """Build compressor dictionary for Zarr v3.""" - name = name.lower() - if name not in ("blosc", "gzip", "zstd"): - raise ValueError("Unknown compressor", name) - return {"name": name, "configuration": prm} - - -def make_kvstore(path: str | os.PathLike) -> dict: - """Transform a URI into a kvstore JSON object.""" - path = UPath(path) - if path.protocol in ("file", ""): - return {"driver": "file", "path": path.path} - if path.protocol == "gcs": - url = urlparse(str(path)) - return {"driver": "gcs", "bucket": url.netloc, "path": url.path} - if path.protocol in ("http", "https"): - url = urlparse(str(path)) - base_url = f"{url.scheme}://{url.netloc}" - if url.params: - base_url += ";" + url.params - if url.query: - base_url += "?" + url.query - if url.fragment: - base_url += "#" + url.fragment - return {"driver": "http", "base_url": base_url, "path": url.path} - if path.protocol == "memory": - return {"driver": "memory", "path": path.path} - if path.protocol == "s3": - url = urlparse(str(path)) - path = {"path": url.path} if url.path else {} - return {"driver": "s3", "bucket": url.netloc, **path} - raise ValueError("Unsupported protocol:", path.protocol) - - -def auto_shard_size( - max_shape: list[int], - itemsize: int | np.dtype | str, - max_file_size: int = 2 * 1024**4, - compression_ratio: float = 2, -) -> list[int]: - """ - Find maximal shard size that ensures file size below cap. - - Parameters - ---------- - max_shape : list[int] - Maximum shape along each dimension. - itemsize : np.dtype or int - Data type, or data type size - max_file_size : int - Maximum file size (default: 2TB). - S3 has a 5TB/file limit, but given that we use an estimated - compression factor, we aim for 2TB to leave some leeway. - compression_ratio : float - Estimated compression factor. - I roughly found 2 for bosc-compressed LSM data, when compressing - only across space and channels (5 channels). - - Returns - ------- - shard : list[int] - Estimated shard size along each dimension. - Returned shards are either max_shape or powers of two. - """ - if not isinstance(itemsize, int): - itemsize = np.dtype(itemsize).itemsize - - # Maximum number of elements in the shard - max_numel = max_file_size * compression_ratio / itemsize - - shard = [1] * len(max_shape) - while True: - # If shard larger than volume, we can stop - if all(x >= s for x, s in zip(shard, max_shape)): - break - # Make shard one level larger - new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] - # If shard is too large, stop and keep previous shard - if np.prod(new_shard) > max_numel: - break - # Otherwise, use larger shard and recurse - shard = new_shard - - # replace max size with larger power of two - shard = [2 ** math.ceil(math.log2(x)) for x in shard] - return shard - -def fix_shard_chunk( - shard: list[int], - chunk: list[int], - shape: list[int], -) -> tuple[list[int], list[int]]: - """ - Fix incompatibilities between chunk and shard size. - - Parameters - ---------- - shard : list[int] - chunk : list[int] - shape : list[int] - - Returns - ------- - shard : list[int] - chunk : list[int] - """ - shard= list(shard) - chunk = list(chunk) - for i in range(len(chunk)): - # if chunk spans the entire volume, match chunk and shard - if chunk[i] == shape[i] and chunk[i] != shard[i]: - chunk[i] = shard[i] - # ensure that shard is a multiple of chunk - if shard[i] % chunk[i]: - shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) - return shard, chunk - - -def default_write_config( - path: os.PathLike | str, - shape: list[int], - dtype: np.dtype | str, - chunk: list[int] = [32], - shard: list[int] | Literal["auto"] | None = None, - compressor: str = "blosc", - compressor_opt: dict | None = None, - version: int = 3, -) -> dict: - """ - Generate a default TensorStore configuration. - - Parameters - ---------- - chunk : list[int] - Chunk size. - shard : list[int], optional - Shard size. No sharding if `None`. - compressor : str - Compressor name - version : int - Zarr version - - Returns - ------- - config : dict - Configuration - """ - path = UPath(path) - if not path.protocol: - path = "file://" / path - - # Format compressor - if version == 3 and compressor == "zlib": - compressor = "gzip" - if version == 2 and compressor == "gzip": - compressor = "zlib" - compressor_opt = compressor_opt or {} - - # Prepare chunk size - if isinstance(chunk, int): - chunk = [chunk] - chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk - - # Prepare shard size - if shard: - if shard == "auto": - shard = auto_shard_size(shape, dtype) - if isinstance(shard, int): - shard = [shard] - shard = shard[:1] * max(0, len(shape) - len(shard)) + shard - - # Fix incompatibilities - shard, chunk = fix_shard_chunk(shard, chunk, shape) - - # ------------------------------------------------------------------ - # Zarr 3 - # ------------------------------------------------------------------ - if version == 3: - if compressor and compressor != "raw": - compressor = [make_compressor_v3(compressor, **compressor_opt)] - else: - compressor = [] - - codec_little_endian = {"name": "bytes", "configuration": {"endian": "little"}} - - if shard: - chunk_grid = { - "name": "regular", - "configuration": {"chunk_shape": shard}, - } - - sharding_codec = { - "name": "sharding_indexed", - "configuration": { - "chunk_shape": chunk, - "codecs": [ - codec_little_endian, - *compressor, - ], - "index_codecs": [ - codec_little_endian, - {"name": "crc32c"}, - ], - "index_location": "end", - }, - } - codecs = [sharding_codec] - - else: - chunk_grid = {"name": "regular", "configuration": {"chunk_shape": chunk}} - codecs = [ - codec_little_endian, - *compressor, - ] - - metadata = { - "chunk_grid": chunk_grid, - "codecs": codecs, - "data_type": np.dtype(dtype).name, - "fill_value": 0, - "chunk_key_encoding": { - "name": "default", - "configuration": {"separator": r"/"}, - }, - } - config = { - "driver": "zarr3", - "metadata": metadata, - } - - # ------------------------------------------------------------------ - # Zarr 2 - # ------------------------------------------------------------------ - else: - if compressor and compressor != "raw": - compressor = make_compressor_v2(compressor, **compressor_opt) - else: - compressor = None - - metadata = { - "chunks": chunk, - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": 0, - "compressor": compressor, - } - config = { - "driver": "zarr", - "metadata": metadata, - "key_encoding": r"/", - } - - # Prepare store - config["metadata"]["shape"] = shape - config["kvstore"] = make_kvstore(path) - - return config - - -def default_read_config(path: os.PathLike | str) -> dict: - """ - Generate a TensorStore configuration to read an existing Zarr. - - Parameters - ---------- - path : PathLike | str - Path to zarr array. - """ - path = UPath(path) - if not path.protocol: - path = "file://" / path - if (path / "zarr.json").exists(): - zarr_version = 3 - elif (path / ".zarray").exists(): - zarr_version = 2 - else: - raise ValueError("Cannot find zarr.json or .zarray file") - return { - "kvstore": make_kvstore(path), - "driver": "zarr3" if zarr_version == 3 else "zarr", - "open": True, - "create": False, - "delete_existing": False, - } diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index f9bb4347..694db0f3 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -250,8 +250,8 @@ def generate_pyramid( Shapes of all levels, from finest to coarsest, including the existing top level. """ - from linc_convert.utils.zarr._zarr import default_write_config, \ - default_read_config + from .zarr_io.drivers.tensorstore import default_read_config + from .zarr_io.drivers.tensorstore import default_write_config # Read properties from base level base_level = omz["0"] @@ -284,7 +284,7 @@ def generate_pyramid( # dat = da.from_zarr(omz[str(lvl - 1)]) - wconfig = default_write_config(str(arr.store_path),shape = batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"], + wconfig = default_write_config(str(arr.store_path), shape =batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"], version = omz.info._zarr_format) wconfig["delete_existing"] = True wconfig["create"] = True @@ -295,6 +295,7 @@ def generate_pyramid( dat = dat.rechunk(arr.shards) else: dat = dat.rechunk(arr.chunks) + dat = dat.persist() with ProgressBar(): dat.store(writer) # TODO: delay this task, write together @@ -331,12 +332,12 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): # build the coarsening factors: 2 along each pyramid dim, except 1 if skip factors = { axis: ( - 1 if (no_pyramid_axis is not None and axis == pyramid_axes[no_pyramid_axis]) + 1 if (no_pyramid_axis is not None and axis == pyramid_axes[no_pyramid_axis]) or arr.shape[axis] == 1 else 2) for axis in pyramid_axes } dtype = arr.dtype - # da.coarsen will drop any “extra” pixels at the end if trim_excess=True + return da.coarsen(window_func, arr, factors, trim_excess=True).astype(dtype) diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index 99fdf1e8..dd36397a 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -1,18 +1,20 @@ import ast import json +import math import os from os import PathLike from typing import Optional, Tuple, Literal, Union, Mapping, Any +from urllib.parse import urlparse +import numcodecs +import numcodecs.abc import numpy as np +import zarr from numpy._typing import DTypeLike from upath import UPath -import zarr - import tensorstore as ts + from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr._zarr import make_kvstore, auto_shard_size, \ - fix_shard_chunk, make_compressor_v3, make_compressor_v2 from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup @@ -72,6 +74,330 @@ def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): return cls(ts.open(conf).result()) +class ZarrTSGroup(ZarrGroup): + def __init__(self, store_path: Union[str, PathLike]): + super().__init__(store_path) + from upath import UPath + if not isinstance(store_path, UPath): + store_path = UPath(store_path) + self._path = store_path + metadata = _detect_metadata(store_path) + assert metadata is not None + assert metadata[0] == "group" + self._zarr_version = metadata[1] + self._zarr_config = None + + @property + def zarr_version(self): + return self._zarr_version + + @property + def attrs(self) -> Mapping[str, Any]: + return {} + + def keys(self): + return ( + sub_dir.name for sub_dir in self._path.iterdir() + if sub_dir.is_dir() and _detect_metadata(sub_dir) + ) + + def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: + metadata = _detect_metadata(self._path / key) + if metadata is None: + raise KeyError(key) + if metadata[0] == "group": + return ZarrTSGroup(self._path / key) + if metadata[0] == "array": + return ZarrTSArray.open(self._path / key, metadata[1]) + + def __contains__(self, key) -> bool: + if not (self._path / key).exists(): + return False + if _detect_metadata(self._path / key) is None: + return False + return True + + def __delitem__(self, key): + if key in self: + (self._path / key).rmdir(recursive=True) + + def create_array_from_base(self, name: str, shape: Tuple[int, ...], + data: Optional[Any] = None, **kwargs) -> 'ZarrArray': + + spec = self['0']._ts.spec().to_json() + spec['metadata']['shape'] = shape + kvstore = make_kvstore(self._path / name) + spec['kvstore'] = kvstore + spec['delete_existing'] = True + spec['create'] = True + arr = ts.open(spec).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + def create_array(self, + name: str, + shape: tuple, + zarr_config: ZarrConfig = None, + dtype: DTypeLike = np.int32, + data=None, + **kwargs + ) -> zarr.Array: + if zarr_config is None: + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + **kwargs + ) + else: + compressor_opt = ast.literal_eval(zarr_config.compressor_opt) + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # compressor_opt=, + version=zarr_config.zarr_version, + ) + conf['delete_existing'] = True + conf['create'] = True + arr = ts.open(conf).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) + + def create_group(self, name: str, *, overwrite: bool = False, + zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': + if zarr_version is None: + zarr_version = self.zarr_version + if overwrite: + mode = 'w' + else: + mode = 'w-' + return self.open(self._path / name, mode=mode, zarr_version=zarr_version) + + @classmethod + def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': + return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) + + @classmethod + def open(cls, path: Union[str, PathLike], mode="a", *, + zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': + """ + Open a Zarr group from a path. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the Zarr group. + mode : str + Persistence mode: + 'r' means read only (must exist); + 'r+' means read/write (must exist); + 'a' means read/write (create if doesn't exist); + 'w' means create (overwrite if exists); + 'w-' means create (fail if exists). + + Returns + ------- + ZarrTSGroup + An instance of ZarrTSGroup. + """ + p = UPath(path) + + if mode in ['r', 'r+']: + if not p.exists() or not p.is_dir(): + raise FileNotFoundError(f"Group path '{p}' does not exist") + elif mode == 'w-': + if p.exists(): + raise FileExistsError(f"Group path '{p}' already exists") + elif mode == 'a': + if not p.exists(): + _init_group(p, zarr_version) + elif mode == 'w': + if p.exists(): + p.rmdir(recursive=True) + _init_group(p, zarr_version) + else: + raise ValueError( + f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") + + return cls(p) + + +def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: + """Build compressor object from name and options.""" + # TODO: we should use `numcodecs.get_codec` instead` + if not isinstance(name, str): + return name + name = name.lower() + if name == "blosc": + Compressor = numcodecs.Blosc + elif name == "zlib": + Compressor = numcodecs.Zlib + else: + raise ValueError("Unknown compressor", name) + return Compressor(**prm) + + +def make_compressor_v2(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v2.""" + name = name.lower() + if name not in ("blosc", "zlib", "bz2", "zstd"): + raise ValueError("Unknown compressor", name) + return {"id": name, **prm} + + +def make_compressor_v3(name: str | None, **prm: dict) -> dict: + """Build compressor dictionary for Zarr v3.""" + name = name.lower() + if name not in ("blosc", "gzip", "zstd"): + raise ValueError("Unknown compressor", name) + return {"name": name, "configuration": prm} + + +def make_kvstore(path: str | os.PathLike) -> dict: + """Transform a URI into a kvstore JSON object.""" + path = UPath(path) + if path.protocol in ("file", ""): + return {"driver": "file", "path": path.path} + if path.protocol == "gcs": + url = urlparse(str(path)) + return {"driver": "gcs", "bucket": url.netloc, "path": url.path} + if path.protocol in ("http", "https"): + url = urlparse(str(path)) + base_url = f"{url.scheme}://{url.netloc}" + if url.params: + base_url += ";" + url.params + if url.query: + base_url += "?" + url.query + if url.fragment: + base_url += "#" + url.fragment + return {"driver": "http", "base_url": base_url, "path": url.path} + if path.protocol == "memory": + return {"driver": "memory", "path": path.path} + if path.protocol == "s3": + url = urlparse(str(path)) + path = {"path": url.path} if url.path else {} + return {"driver": "s3", "bucket": url.netloc, **path} + raise ValueError("Unsupported protocol:", path.protocol) + + +def auto_shard_size( + max_shape: list[int], + itemsize: int | np.dtype | str, + max_file_size: int = 2 * 1024 ** 4, + compression_ratio: float = 2, +) -> list[int]: + """ + Find maximal shard size that ensures file size below cap. + + Parameters + ---------- + max_shape : list[int] + Maximum shape along each dimension. + itemsize : np.dtype or int + Data type, or data type size + max_file_size : int + Maximum file size (default: 2TB). + S3 has a 5TB/file limit, but given that we use an estimated + compression factor, we aim for 2TB to leave some leeway. + compression_ratio : float + Estimated compression factor. + I roughly found 2 for bosc-compressed LSM data, when compressing + only across space and channels (5 channels). + + Returns + ------- + shard : list[int] + Estimated shard size along each dimension. + Returned shards are either max_shape or powers of two. + """ + if not isinstance(itemsize, int): + itemsize = np.dtype(itemsize).itemsize + + # Maximum number of elements in the shard + max_numel = max_file_size * compression_ratio / itemsize + + shard = [1] * len(max_shape) + while True: + # If shard larger than volume, we can stop + if all(x >= s for x, s in zip(shard, max_shape)): + break + # Make shard one level larger + new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] + # If shard is too large, stop and keep previous shard + if np.prod(new_shard) > max_numel: + break + # Otherwise, use larger shard and recurse + shard = new_shard + + # replace max size with larger power of two + shard = [2 ** math.ceil(math.log2(x)) for x in shard] + return shard + + +def fix_shard_chunk( + shard: list[int], + chunk: list[int], + shape: list[int], +) -> tuple[list[int], list[int]]: + """ + Fix incompatibilities between chunk and shard size. + + Parameters + ---------- + shard : list[int] + chunk : list[int] + shape : list[int] + + Returns + ------- + shard : list[int] + chunk : list[int] + """ + shard = list(shard) + chunk = list(chunk) + for i in range(len(chunk)): + # if chunk spans the entire volume, match chunk and shard + if chunk[i] == shape[i] and chunk[i] != shard[i]: + chunk[i] = shard[i] + # ensure that shard is a multiple of chunk + if shard[i] % chunk[i]: + shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) + return shard, chunk + + +def default_read_config(path: os.PathLike | str) -> dict: + """ + Generate a TensorStore configuration to read an existing Zarr. + + Parameters + ---------- + path : PathLike | str + Path to zarr array. + """ + path = UPath(path) + if not path.protocol: + path = "file://" / path + if (path / "zarr.json").exists(): + zarr_version = 3 + elif (path / ".zarray").exists(): + zarr_version = 2 + else: + raise ValueError("Cannot find zarr.json or .zarray file") + return { + "kvstore": make_kvstore(path), + "driver": "zarr3" if zarr_version == 3 else "zarr", + "open": True, + "create": False, + "delete_existing": False, + } + + def _is_array(path): zarr2_array_file = path / ".zarray" if zarr2_array_file.is_file(): @@ -180,6 +506,8 @@ def default_write_config( # Prepare chunk size if isinstance(chunk, int): chunk = [chunk] + else: + chunk = list(chunk) chunk = chunk[:1] * max(0, len(shape) - len(chunk)) + chunk # Prepare shard size @@ -257,7 +585,9 @@ def default_write_config( compressor = make_compressor_v2(compressor, **compressor_opt) else: compressor = None - + for i in range(len(shape)): + if shape[i] > chunk[i]: + chunk[i] = shape[i] metadata = { "chunks": chunk, "order": "F", @@ -288,157 +618,3 @@ def _init_group(group_path: PathLike, version: int): (group_path / '.zgroup').write_text( json.dumps({'zarr_format': 2}) ) - - -class ZarrTSGroup(ZarrGroup): - def __init__(self, store_path: Union[str, PathLike]): - super().__init__(store_path) - from upath import UPath - if not isinstance(store_path, UPath): - store_path = UPath(store_path) - self._path = store_path - metadata = _detect_metadata(store_path) - assert metadata is not None - assert metadata[0] == "group" - self._zarr_version = metadata[1] - self._zarr_config = None - - @property - def zarr_version(self): - return self._zarr_version - - @property - def attrs(self) -> Mapping[str, Any]: - return {} - - def keys(self): - return ( - sub_dir.name for sub_dir in self._path.iterdir() - if sub_dir.is_dir() and _detect_metadata(sub_dir) - ) - - def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: - metadata = _detect_metadata(self._path / key) - if metadata is None: - raise KeyError(key) - if metadata[0] == "group": - return ZarrTSGroup(self._path / key) - if metadata[0] == "array": - return ZarrTSArray.open(self._path / key, metadata[1]) - - def __contains__(self, key) -> bool: - if not (self._path / key).exists(): - return False - if _detect_metadata(self._path / key) is None: - return False - return True - - def __delitem__(self, key): - if key in self: - (self._path / key).rmdir(recursive=True) - - def create_array_from_base(self, name: str, shape: Tuple[int, ...], - data: Optional[Any] = None, **kwargs) -> 'ZarrArray': - - spec = self['0']._ts.spec().to_json() - spec['metadata']['shape'] = shape - kvstore = make_kvstore(self._path / name) - spec['kvstore'] = kvstore - spec['delete_existing'] = True - spec['create'] = True - arr = ts.open(spec).result() - if data is not None: - arr[:] = data - return ZarrTSArray(arr) - - def create_array(self, - name: str, - shape: tuple, - zarr_config: ZarrConfig = None, - dtype: DTypeLike = np.int32, - data=None, - **kwargs - ) -> zarr.Array: - if zarr_config is None: - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - **kwargs - ) - else: - compressor_opt = ast.literal_eval(zarr_config.compressor_opt) - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - # compressor_opt=, - version=zarr_config.zarr_version, - ) - conf['delete_existing'] = True - conf['create'] = True - arr = ts.open(conf).result() - if data is not None: - arr[:] = data - return ZarrTSArray(arr) - - def create_group(self, name: str, *, overwrite: bool = False, - zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': - if zarr_version is None: - zarr_version = self.zarr_version - if overwrite: - mode = 'w' - else: - mode = 'w-' - return self.open(self._path / name, mode=mode, zarr_version=zarr_version) - - @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': - return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) - - @classmethod - def open(cls, path: Union[str, PathLike], mode="a", *, - zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': - """ - Open a Zarr group from a path. - - Parameters - ---------- - path : Union[str, PathLike] - Path to the Zarr group. - mode : str - Persistence mode: - 'r' means read only (must exist); - 'r+' means read/write (must exist); - 'a' means read/write (create if doesn't exist); - 'w' means create (overwrite if exists); - 'w-' means create (fail if exists). - - Returns - ------- - ZarrTSGroup - An instance of ZarrTSGroup. - """ - p = UPath(path) - - if mode in ['r', 'r+']: - if not p.exists() or not p.is_dir(): - raise FileNotFoundError(f"Group path '{p}' does not exist") - elif mode == 'w-': - if p.exists(): - raise FileExistsError(f"Group path '{p}' already exists") - elif mode == 'a': - if not p.exists(): - _init_group(p, zarr_version) - elif mode == 'w': - if p.exists(): - p.rmdir(recursive=True) - _init_group(p, zarr_version) - else: - raise ValueError( - f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") - - return cls(p) From 78930a9f166bce4d8589cfba25960e5c78e23edf Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 13:43:54 -0400 Subject: [PATCH 066/157] fix: tensorstore fix chunk size --- linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index dd36397a..7e890129 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -586,7 +586,7 @@ def default_write_config( else: compressor = None for i in range(len(shape)): - if shape[i] > chunk[i]: + if shape[i] < chunk[i]: chunk[i] = shape[i] metadata = { "chunks": chunk, From c598f7c9e9f6b13c7602f95dc771a358500d0a3c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 13:56:43 -0400 Subject: [PATCH 067/157] refactor --- linc_convert/modalities/df/multi_slice.py | 2 +- linc_convert/modalities/df/single_slice.py | 2 +- linc_convert/modalities/lsm/mosaic.py | 171 ++++----------- linc_convert/modalities/lsm/multi_slice.py | 2 +- linc_convert/modalities/lsm/spool.py | 5 +- linc_convert/modalities/psoct/multi_slice.py | 4 +- .../modalities/psoct/single_volume.py | 4 +- .../modalities/wk/webknossos_annotation.py | 2 +- linc_convert/utils/zarr/__init__.py | 6 +- linc_convert/utils/zarr/compressor.py | 30 --- linc_convert/utils/zarr/create_array.py | 167 --------------- linc_convert/utils/zarr/generate_pyramid.py | 5 +- .../utils/zarr/zarr_io/drivers/zarr_python.py | 195 +++++++++++++++++- 13 files changed, 253 insertions(+), 342 deletions(-) delete mode 100644 linc_convert/utils/zarr/compressor.py delete mode 100644 linc_convert/utils/zarr/create_array.py diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index e8c979a2..9c82336d 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -24,7 +24,7 @@ from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv, floordiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig HOME = "/space/aspasia/2/users/linc/000003" diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 962e3216..272eb78c 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -23,7 +23,7 @@ from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig ss = App(name="singleslice", help_format="markdown") diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index 0e1e66df..7e151976 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -16,6 +16,7 @@ import nibabel as nib import numpy as np import zarr +from niizarr import write_nifti_header from tifffile import TiffFile # internals @@ -23,8 +24,8 @@ from linc_convert.modalities.lsm.cli import lsm from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.compressor import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_io import from_config mosaic = cyclopts.App(name="mosaic", help_format="markdown") lsm.command(mosaic) @@ -34,7 +35,6 @@ def convert( inp: str, *, - out: str, zarr_config: ZarrConfig = None, max_load: int = 512, orientation: str = "coronal", @@ -84,13 +84,7 @@ def convert( Voxel size along the X, Y and Z dimension, in micron. """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk[0] - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) if max_load % 2: max_load += 1 @@ -127,10 +121,9 @@ def convert( all_chunks_info["y"].append(int(parsed.group("y"))) # default output name - if not out: - out = all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] - out += ".nii.zarr" if nii else ".ome.zarr" - nii = nii or out.endswith(".nii.zarr") + + default_name = all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] + zarr_config.set_default_name(default_name) # parse all individual file names nchunkz = max(all_chunks_info["z"]) @@ -191,23 +184,9 @@ def convert( fullshape[1] = sum(shape[1] for shape in allshapes[0]) fullshape[2] = allshapes[0][0][2] - # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) - - # Prepare chunking options - opt = { - "chunks": [nchannels] + [chunk] * 3, - "dimension_separator": r"/", - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - - # write first level - omz.create_dataset("0", shape=[nchannels, *fullshape], **opt) - array = omz["0"] + omz = from_config(zarr_config) + arr = omz.create_array("0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config) + print("Write level 0 with shape", [nchannels, *fullshape]) for i, dirname in enumerate(all_chunks_info["dirname"]): chunkz = all_chunks_info["z"][i] - 1 @@ -235,76 +214,11 @@ def convert( ) f = TiffFile(fname) - array[slicer] = f.asarray() + arr[slicer] = f.asarray() print("") + omz.generate_pyramid(mode="median") - # build pyramid using median windows - level = 0 - while any(x > 1 for x in omz[str(level)].shape[-3:]): - prev_array = omz[str(level)] - prev_shape = prev_array.shape[-3:] - level += 1 - - new_shape = list(map(lambda x: max(1, x // 2), prev_shape)) - if all(x < chunk for x in new_shape): - break - print("Compute level", level, "with shape", new_shape) - omz.create_dataset(str(level), shape=[nchannels, *new_shape], **opt) - new_array = omz[str(level)] - - nz, ny, nx = prev_array.shape[-3:] - ncz = ceildiv(nz, max_load) - ncy = ceildiv(ny, max_load) - ncx = ceildiv(nx, max_load) - - for cz in range(ncz): - for cy in range(ncy): - for cx in range(ncx): - print(f"chunk ({cz}, {cy}, {cx}) / ({ncz}, {ncy}, {ncx})", end="\r") - - dat = prev_array[ - ..., - cz * max_load : (cz + 1) * max_load, - cy * max_load : (cy + 1) * max_load, - cx * max_load : (cx + 1) * max_load, - ] - crop = [0 if x == 1 else x % 2 for x in dat.shape[-3:]] - slicer = [slice(-1) if x else slice(None) for x in crop] - dat = dat[(Ellipsis, *slicer)] - pz, py, px = dat.shape[-3:] - - dat = dat.reshape( - [ - nchannels, - max(pz // 2, 1), - min(pz, 2), - max(py // 2, 1), - min(py, 2), - max(px // 2, 1), - min(px, 2), - ] - ) - dat = dat.transpose([0, 1, 3, 5, 2, 4, 6]) - dat = dat.reshape( - [ - nchannels, - max(pz // 2, 1), - max(py // 2, 1), - max(px // 2, 1), - -1, - ] - ) - dat = np.median(dat, -1) - - new_array[ - ..., - cz * max_load // 2 : (cz + 1) * max_load // 2, - cy * max_load // 2 : (cy + 1) * max_load // 2, - cx * max_load // 2 : (cx + 1) * max_load // 2, - ] = dat - - print("") - nblevel = level + nblevel = 5 # Write OME-Zarr multiscale metadata print("Write metadata") @@ -365,36 +279,39 @@ def convert( multiscales[0]["coordinateTransformations"] = [ {"scale": [1.0] * 4, "type": "scale"} ] + omz = zarr.open(zarr_config.out, mode="a") omz.attrs["multiscales"] = multiscales - if not nii: - print("done.") - return - - # Write NIfTI-Zarr header - # NOTE: we use nifti2 because dimensions typically do not fit in a short - # TODO: we do not write the json zattrs, but it should be added in - # once the nifti-zarr package is released - shape = list(reversed(omz["0"].shape)) - shape = shape[:3] + [1] + shape[3:] # insert time dimension - affine = orientation_to_affine(orientation, *voxel_size) - if center: - affine = center_affine(affine, shape[:3]) - header = nib.Nifti2Header() - header.set_data_shape(shape) - header.set_data_dtype(omz["0"].dtype) - header.set_qform(affine) - header.set_sform(affine) - header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) - header.structarr["magic"] = b"nz2\0" - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - opt = { - "chunks": [len(header)], - "dimension_separator": r"/", - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": None, - } - omz.create_dataset("nifti", data=header, shape=shape, **opt) + # if not nii: + # print("done.") + # return + + # # Write NIfTI-Zarr header + # # NOTE: we use nifti2 because dimensions typically do not fit in a short + # # TODO: we do not write the json zattrs, but it should be added in + # # once the nifti-zarr package is released + # shape = list(reversed(omz["0"].shape)) + # shape = shape[:3] + [1] + shape[3:] # insert time dimension + # affine = orientation_to_affine(orientation, *voxel_size) + # if center: + # affine = center_affine(affine, shape[:3]) + # header = nib.Nifti2Header() + # header.set_data_shape(shape) + # header.set_data_dtype(omz["0"].dtype) + # header.set_qform(affine) + # header.set_sform(affine) + # header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) + # header.structarr["magic"] = b"nz2\0" + # write_nifti_header(omz, header) + # header = np.frombuffer(header.structarr.tobytes(), dtype="u1") + # write_nifti_header() + # opt = { + # "chunks": [len(header)], + # "dimension_separator": r"/", + # "order": "F", + # "dtype": "|u1", + # "fill_value": None, + # "compressor": None, + # } + # omz.create_dataset("nifti", data=header, shape=shape, **opt) print("done.") diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index c071cac2..4df3dd02 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -23,7 +23,7 @@ from linc_convert.modalities.lsm.cli import lsm from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index a93820a2..82b41999 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -17,8 +17,9 @@ from linc_convert.modalities.lsm.cli import lsm from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.spool import SpoolSetInterpreter -from linc_convert.utils.zarr import (create_array, generate_pyramid, open_zarr_group, - ZarrConfig) +from linc_convert.utils.zarr import (generate_pyramid, ZarrConfig) +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ + create_array spool = cyclopts.App(name="spool", help_format="markdown") lsm.command(spool) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 87a46d70..1acacde9 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -25,7 +25,9 @@ from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import open_zarr_group, create_array, generate_pyramid, generate_pyramid_old +from linc_convert.utils.zarr import generate_pyramid, generate_pyramid_old +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ + create_array from linc_convert.utils.zarr.zarr_config import ZarrConfig from linc_convert.utils.zarr.zarr_io import from_config diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 14f26928..3a8788b7 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -25,7 +25,9 @@ from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import generate_pyramid, create_array, open_zarr_group, generate_pyramid_old +from linc_convert.utils.zarr import generate_pyramid, generate_pyramid_old +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ + create_array from linc_convert.utils.zarr.zarr_config import ZarrConfig logger = logging.getLogger(__name__) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index ba4b6581..f0f5d90e 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -16,7 +16,7 @@ # internals from linc_convert.modalities.wk.cli import wk from linc_convert.utils.math import ceildiv -from linc_convert.utils.zarr.compressor import make_compressor +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor webknossos = cyclopts.App(name="webknossos", help_format="markdown") wk.command(webknossos) diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py index 721534e7..22261135 100644 --- a/linc_convert/utils/zarr/__init__.py +++ b/linc_convert/utils/zarr/__init__.py @@ -1,5 +1,5 @@ """Zarr utilities.""" -from .compressor import make_compressor -from .create_array import create_array, open_zarr_group -from .generate_pyramid import generate_pyramid, generate_pyramid_old + from .zarr_config import ZarrConfig +from .zarr_io import * +from .generate_pyramid import generate_pyramid, generate_pyramid_old diff --git a/linc_convert/utils/zarr/compressor.py b/linc_convert/utils/zarr/compressor.py deleted file mode 100644 index 3c3a3a66..00000000 --- a/linc_convert/utils/zarr/compressor.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Functions for zarr compression.""" -from typing import Any, Literal - - -def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: - """Build compressor object from name and options.""" - if not isinstance(name, str): - return name - - if zarr_version == 2: - import numcodecs - compressor_map = { - "blosc": numcodecs.Blosc, - "zlib": numcodecs.Zstd, - } - elif zarr_version == 3: - import zarr.codecs - compressor_map = { - "blosc": zarr.codecs.BloscCodec, - "zlib": zarr.codecs.ZstdCodec, - } - else: - raise ValueError() - name = name.lower() - - if name not in compressor_map: - raise ValueError('Unknown compressor', name) - Compressor = compressor_map[name] - - return Compressor(**prm) diff --git a/linc_convert/utils/zarr/create_array.py b/linc_convert/utils/zarr/create_array.py deleted file mode 100644 index 8530ad80..00000000 --- a/linc_convert/utils/zarr/create_array.py +++ /dev/null @@ -1,167 +0,0 @@ -import ast - -import numpy as np -import zarr -from numpy._typing import DTypeLike -from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams - -from linc_convert.utils.zarr.compressor import make_compressor -from linc_convert.utils.zarr.zarr_config import ZarrConfig - -SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio - 2 * # TB - 2 ** 30 # TB->Bytes - # I use 2GB for now - ) - - -def open_zarr_group(zarr_config:ZarrConfig): - # TODO: check out is not none or empty - store = zarr.storage.LocalStore(zarr_config.out) - return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) - - -def create_array( - omz: zarr.Group, - name: str, - shape: tuple, - zarr_config: ZarrConfig, - dtype: DTypeLike = np.int32, - data=None -) -> zarr.Array: - compressor = zarr_config.compressor - compressor_opt = zarr_config.compressor_opt - chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - opt = { - "chunks": chunk, - "shards": shard, - "order": zarr_config.order, - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), - } - - chunk_key_encoding = dimension_separator_to_chunk_key_encoding(zarr_config.dimension_separator, zarr_config.zarr_version) - if chunk_key_encoding: - opt["chunk_key_encoding"] = chunk_key_encoding - arr= omz.create_array(name=name, - shape=shape, - **opt) - if data: - arr[:] = data - return arr - - -def dimension_separator_to_chunk_key_encoding(dimension_separator,zarr_version): - dimension_separator = dimension_separator - if dimension_separator == '.' and zarr_version == 2: - pass - elif dimension_separator == '/' and zarr_version == 3: - pass - else: - dimension_separator = ChunkKeyEncodingParams( - name="default" if zarr_version == 3 else "v2", - separator=dimension_separator) - return dimension_separator - - -def compute_zarr_layout( - shape: tuple, - dtype: DTypeLike, - zarr_config: ZarrConfig -) -> tuple[tuple, tuple | None]: - ndim = len(shape) - if ndim == 5: - if zarr_config.no_time: - raise ValueError('no_time is not supported for 5D data') - chunk_tc = ( - 1 if zarr_config.chunk_time else shape[0], - 1 if zarr_config.chunk_channels else shape[1], - ) - shard_tc = ( - chunk_tc[0] if zarr_config.shard_time else shape[0], - chunk_tc[1] if zarr_config.shard_channels else shape[1] - ) - - elif ndim == 4: - if zarr_config.no_time: - chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_channels else shape[0],) - else: - chunk_tc = (1 if zarr_config.chunk_time else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) - elif ndim == 3: - chunk_tc = tuple() - shard_tc = tuple() - else: - raise ValueError("Zarr layout only supports 3+ dimensions.") - - chunk = zarr_config.chunk - if len(chunk) > ndim: - raise ValueError("Provided chunk size has more dimension than data") - if len(zarr_config.chunk) != ndim: - chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) - - shard = zarr_config.shard - - if isinstance(shard, tuple) and len(shard) > ndim: - raise ValueError("Provided shard size has more dimension than data") - # If shard is not used or is fully specified, return early. - if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): - return chunk, shard - - chunk_spatial = chunk[-3:] - if shard == "auto": - # Compute auto shard sizes based on the file size limit. - itemsize = dtype.itemsize - chunk_size = np.prod(chunk_spatial) * itemsize - shard_size = np.prod(shard_tc) * chunk_size - B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size - multiplier = int(B_multiplier ** (1 / 3)) - if multiplier < 1: - multiplier = 1 - - shape_spatial = shape[-3:] - # For each spatial dimension, the minimal multiplier needed to cover the data: - L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] - dims = len(chunk_spatial) - - shard = tuple(int(c * multiplier) for c in chunk_spatial) - m_uniform = int(B_multiplier ** (1 / dims)) - M = [] - free_dims = [] - for i in range(dims): - # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. - if m_uniform * chunk_spatial[i] >= shape_spatial[i]: - M.append(L[i]) - else: - M.append(m_uniform) - free_dims.append(i) - - # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. - improved = True - while improved and free_dims: - improved = False - for i in free_dims: - candidate = M[i] + 1 - # If increasing would exceed the data size in this dimension, - # clamp to the minimal covering multiplier. - if candidate * chunk_spatial[i] >= shape_spatial[i]: - candidate = L[i] - new_product = np.prod( - [candidate if j == i else M[j] for j in range(dims)] - ) - if new_product <= B_multiplier and candidate > M[i]: - M[i] = candidate - improved = True - # Remove dimensions that have reached or exceeded the data size. - free_dims = [i for i in free_dims if - M[i] * chunk_spatial[i] < shape_spatial[i]] - shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) - - shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) - return chunk, shard diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index 694db0f3..a034b486 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -13,9 +13,6 @@ from linc_convert.utils.math import ceildiv -from .create_array import dimension_separator_to_chunk_key_encoding - - from dask.diagnostics import ProgressBar logger = logging.getLogger(__name__) @@ -178,6 +175,8 @@ def next_level_shape(prev_shape: tuple, no_pyramid_axis: Optional[int]) -> list: def get_zarray_options(base_level): + from .zarr_io.drivers.zarr_python import dimension_separator_to_chunk_key_encoding + opts = dict( dtype=base_level.dtype, chunks=base_level.chunks, diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py index fc1f6f29..5c07ff78 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -1,13 +1,13 @@ import ast -from typing import Iterator, Union, Literal +from typing import Iterator, Union, Literal, Any import numpy as np import zarr +import zarr.codecs from numpy._typing import DTypeLike +from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams -from linc_convert.utils.zarr import ZarrConfig, make_compressor -from linc_convert.utils.zarr.create_array import compute_zarr_layout, \ - dimension_separator_to_chunk_key_encoding +from linc_convert.utils.zarr import ZarrConfig from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup @@ -190,3 +190,190 @@ def zarr_version(self) -> Literal[2, 3]: def __delitem__(self, key): del self._zgroup[key] + + +def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: + """Build compressor object from name and options.""" + if not isinstance(name, str): + return name + + if zarr_version == 2: + import numcodecs + compressor_map = { + "blosc": numcodecs.Blosc, + "zlib": numcodecs.Zstd, + } + elif zarr_version == 3: + import zarr.codecs + compressor_map = { + "blosc": zarr.codecs.BloscCodec, + "zlib": zarr.codecs.ZstdCodec, + } + else: + raise ValueError() + name = name.lower() + + if name not in compressor_map: + raise ValueError('Unknown compressor', name) + Compressor = compressor_map[name] + + return Compressor(**prm) + + +SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio + 2 * # TB + 2 ** 30 # TB->Bytes + # I use 2GB for now + ) + + +def open_zarr_group(zarr_config:ZarrConfig): + # TODO: check out is not none or empty + store = zarr.storage.LocalStore(zarr_config.out) + return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) + + +def create_array( + omz: zarr.Group, + name: str, + shape: tuple, + zarr_config: ZarrConfig, + dtype: DTypeLike = np.int32, + data=None +) -> zarr.Array: + compressor = zarr_config.compressor + compressor_opt = zarr_config.compressor_opt + chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + + if isinstance(compressor_opt, str): + compressor_opt = ast.literal_eval(compressor_opt) + + opt = { + "chunks": chunk, + "shards": shard, + "order": zarr_config.order, + "dtype": np.dtype(dtype).str, + "fill_value": None, + "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), + } + + chunk_key_encoding = dimension_separator_to_chunk_key_encoding(zarr_config.dimension_separator, zarr_config.zarr_version) + if chunk_key_encoding: + opt["chunk_key_encoding"] = chunk_key_encoding + arr= omz.create_array(name=name, + shape=shape, + **opt) + if data: + arr[:] = data + return arr + + +def dimension_separator_to_chunk_key_encoding(dimension_separator,zarr_version): + dimension_separator = dimension_separator + if dimension_separator == '.' and zarr_version == 2: + pass + elif dimension_separator == '/' and zarr_version == 3: + pass + else: + dimension_separator = ChunkKeyEncodingParams( + name="default" if zarr_version == 3 else "v2", + separator=dimension_separator) + return dimension_separator + + +def compute_zarr_layout( + shape: tuple, + dtype: DTypeLike, + zarr_config: ZarrConfig +) -> tuple[tuple, tuple | None]: + ndim = len(shape) + if ndim == 5: + if zarr_config.no_time: + raise ValueError('no_time is not supported for 5D data') + chunk_tc = ( + 1 if zarr_config.chunk_time else shape[0], + 1 if zarr_config.chunk_channels else shape[1], + ) + shard_tc = ( + chunk_tc[0] if zarr_config.shard_time else shape[0], + chunk_tc[1] if zarr_config.shard_channels else shape[1] + ) + + elif ndim == 4: + if zarr_config.no_time: + chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_channels else shape[0],) + else: + chunk_tc = (1 if zarr_config.chunk_time else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) + elif ndim == 3: + chunk_tc = tuple() + shard_tc = tuple() + else: + raise ValueError("Zarr layout only supports 3+ dimensions.") + + chunk = zarr_config.chunk + if len(chunk) > ndim: + raise ValueError("Provided chunk size has more dimension than data") + if len(zarr_config.chunk) != ndim: + chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) + + shard = zarr_config.shard + + if isinstance(shard, tuple) and len(shard) > ndim: + raise ValueError("Provided shard size has more dimension than data") + # If shard is not used or is fully specified, return early. + if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): + return chunk, shard + + chunk_spatial = chunk[-3:] + if shard == "auto": + # Compute auto shard sizes based on the file size limit. + itemsize = dtype.itemsize + chunk_size = np.prod(chunk_spatial) * itemsize + shard_size = np.prod(shard_tc) * chunk_size + B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size + multiplier = int(B_multiplier ** (1 / 3)) + if multiplier < 1: + multiplier = 1 + + shape_spatial = shape[-3:] + # For each spatial dimension, the minimal multiplier needed to cover the data: + L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] + dims = len(chunk_spatial) + + shard = tuple(int(c * multiplier) for c in chunk_spatial) + m_uniform = int(B_multiplier ** (1 / dims)) + M = [] + free_dims = [] + for i in range(dims): + # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. + if m_uniform * chunk_spatial[i] >= shape_spatial[i]: + M.append(L[i]) + else: + M.append(m_uniform) + free_dims.append(i) + + # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. + improved = True + while improved and free_dims: + improved = False + for i in free_dims: + candidate = M[i] + 1 + # If increasing would exceed the data size in this dimension, + # clamp to the minimal covering multiplier. + if candidate * chunk_spatial[i] >= shape_spatial[i]: + candidate = L[i] + new_product = np.prod( + [candidate if j == i else M[j] for j in range(dims)] + ) + if new_product <= B_multiplier and candidate > M[i]: + M[i] = candidate + improved = True + # Remove dimensions that have reached or exceeded the data size. + free_dims = [i for i in free_dims if + M[i] * chunk_spatial[i] < shape_spatial[i]] + shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) + + shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) + return chunk, shard From 82fc791569521496b225d59ac8122d78239c82b9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 13:57:02 -0400 Subject: [PATCH 068/157] tests: recover lsm test --- tests/test_lsm.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/test_lsm.py b/tests/test_lsm.py index 68f84331..8dc6fa5d 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm.py @@ -3,8 +3,9 @@ import numpy as np import pytest import tifffile +import zarr -from utils.compare_file import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal from linc_convert.modalities.lsm import mosaic @@ -21,9 +22,12 @@ def _write_test_data(directory: str) -> None: folder / f"test_z{z}_y{y}_plane{plane}_c{c}.tiff", image ) -@pytest.mark.skip(reason="🚧 refactor in progress") + def test_lsm(tmp_path): _write_test_data(tmp_path) output_zarr = tmp_path / "output.zarr" - mosaic.convert(str(tmp_path), out=str(output_zarr)) - assert _cmp_zarr_archives(str(output_zarr), "data/lsm.zarr.zip") + mosaic.convert(str(tmp_path), out=str(output_zarr), zarr_version=2, driver="tensorstore") + assert_zarr_equal(str(output_zarr), + zarr.storage.ZipStore( + "data/lsm.zarr.zip", mode="r")) + From 7438b3d0e675084da1ee17ee4564924954530408 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 14:01:36 -0400 Subject: [PATCH 069/157] style: cleanup --- .gitignore | 3 + linc_convert/modalities/df/__init__.py | 1 + linc_convert/modalities/df/multi_slice.py | 62 +++++++++---------- linc_convert/modalities/df/single_slice.py | 51 ++++++++------- linc_convert/utils/__init__.py | 2 +- linc_convert/utils/chunk_processing.py | 1 - linc_convert/utils/j2k.py | 10 +-- linc_convert/utils/logging.py | 7 ++- linc_convert/utils/orientation.py | 2 +- linc_convert/utils/spool.py | 5 +- linc_convert/utils/unit.py | 5 +- linc_convert/utils/zarr/__init__.py | 2 +- linc_convert/utils/zarr/generate_pyramid.py | 52 +++++++++------- linc_convert/utils/zarr/zarr_config.py | 13 ++-- .../utils/zarr/zarr_io/drivers/tensorstore.py | 2 +- .../utils/zarr/zarr_io/drivers/zarr_python.py | 16 ++--- scripts/debug.py | 16 +++++ 17 files changed, 138 insertions(+), 112 deletions(-) create mode 100644 scripts/debug.py diff --git a/.gitignore b/.gitignore index 68bc17f9..0f26f128 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,6 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +scripts/* +tests/data/test_oct/ diff --git a/linc_convert/modalities/df/__init__.py b/linc_convert/modalities/df/__init__.py index 1e263071..e8be7398 100644 --- a/linc_convert/modalities/df/__init__.py +++ b/linc_convert/modalities/df/__init__.py @@ -4,6 +4,7 @@ import glymur as _ # noqa: F401 __all__ = ["cli", "multi_slice", "single_slice"] + from . import cli, multi_slice, single_slice except ImportError: pass diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index 9c82336d..c9ca8c44 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -17,15 +17,14 @@ import zarr from cyclopts import App - # internals from linc_convert import utils from linc_convert.modalities.df.cli import df from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv, floordiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor HOME = "/space/aspasia/2/users/linc/000003" @@ -33,21 +32,20 @@ LINCSET = os.path.join(HOME, "sourcedata") LINCOUT = os.path.join(HOME, "rawdata") - ms = App(name="multislice", help_format="markdown") df.command(ms) @ms.default def convert( - inp: list[str], - *, - out: str, - zarr_config: ZarrConfig = None, - max_load: int = 16384, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, + inp: list[str], + *, + out: str, + zarr_config: ZarrConfig = None, + max_load: int = 16384, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, **kwargs ) -> None: """ @@ -146,7 +144,7 @@ def convert( print(new_size) # Write each level for level in range(nblevel): - shape = [ceildiv(s, 2**level) for s in new_size[:2]] + shape = [ceildiv(s, 2 ** level) for s in new_size[:2]] shape = [new_size[2]] + [len(inp)] + shape omz.create_dataset(f"{level}", shape=shape, **opt) @@ -175,18 +173,18 @@ def convert( for channel in range(3): if max_load is None or ( - subdat_size[-2] < max_load and subdat_size[-1] < max_load + subdat_size[-2] < max_load and subdat_size[-1] < max_load ): array[ - channel, idx, x : x + subdat_size[-2], y : y + subdat_size[-1] - ] = subdat[channel : channel + 1, ...][0] + channel, idx, x: x + subdat_size[-2], y: y + subdat_size[-1] + ] = subdat[channel: channel + 1, ...][0] else: ni = ceildiv(subdat_size[-2], max_load) nj = ceildiv(subdat_size[-1], max_load) for i in range(ni): for j in range(nj): - print(f"\r{i+1}/{ni}, {j+1}/{nj}", end=" ") + print(f"\r{i + 1}/{ni}, {j + 1}/{nj}", end=" ") start_x, end_x = ( i * max_load, min((i + 1) * max_load, subdat_size[-2]), @@ -197,15 +195,15 @@ def convert( ) array[ - channel, - idx, - x + start_x : x + end_x, - y + start_y : y + end_y, + channel, + idx, + x + start_x: x + end_x, + y + start_y: y + end_y, ] = subdat[ - channel : channel + 1, + channel: channel + 1, start_x:end_x, start_y:end_y, - ][0] + ][0] print("") @@ -242,20 +240,20 @@ def convert( { "type": "scale", "scale": [1.0] * has_channel - + [ - 1.0, - (shape0[0] / shape[0]) * vxh, - (shape0[1] / shape[1]) * vxw, - ], + + [ + 1.0, + (shape0[0] / shape[0]) * vxh, + (shape0[1] / shape[1]) * vxw, + ], }, { "type": "translation", "translation": [0.0] * has_channel - + [ - 0.0, - (shape0[0] / shape[0] - 1) * vxh * 0.5, - (shape0[1] / shape[1] - 1) * vxw * 0.5, - ], + + [ + 0.0, + (shape0[0] / shape[0] - 1) * vxh * 0.5, + (shape0[1] / shape[1] - 1) * vxw * 0.5, + ], }, ] multiscales[0]["coordinateTransformations"] = [ diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 272eb78c..423edc82 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -16,15 +16,14 @@ import zarr from cyclopts import App - # internals from linc_convert import utils from linc_convert.modalities.df.cli import df from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor ss = App(name="singleslice", help_format="markdown") df.command(ss) @@ -32,15 +31,15 @@ @ss.default def convert( - inp: str, - *, - out: str, - zarr_config: ZarrConfig = None, - max_load: int = 16384, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - **kwargs + inp: str, + *, + out: str, + zarr_config: ZarrConfig = None, + max_load: int = 16384, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + **kwargs ) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. @@ -131,16 +130,16 @@ def convert( nj = ceildiv(shape[-1], max_load) for i in range(ni): for j in range(nj): - print(f"\r{i+1}/{ni}, {j+1}/{nj}", end="") + print(f"\r{i + 1}/{ni}, {j + 1}/{nj}", end="") array[ - ..., - i * max_load : min((i + 1) * max_load, shape[-2]), - j * max_load : min((j + 1) * max_load, shape[-1]), + ..., + i * max_load: min((i + 1) * max_load, shape[-2]), + j * max_load: min((j + 1) * max_load, shape[-1]), ] = subdat[ ..., - i * max_load : min((i + 1) * max_load, shape[-2]), - j * max_load : min((j + 1) * max_load, shape[-1]), - ] + i * max_load: min((i + 1) * max_load, shape[-2]), + j * max_load: min((j + 1) * max_load, shape[-1]), + ] print("") # Write OME-Zarr multiscale metadata @@ -175,18 +174,18 @@ def convert( { "type": "scale", "scale": [1.0] * has_channel - + [ - (shape0[0] / shape[0]) * vxh, - (shape0[1] / shape[1]) * vxw, - ], + + [ + (shape0[0] / shape[0]) * vxh, + (shape0[1] / shape[1]) * vxw, + ], }, { "type": "translation", "translation": [0.0] * has_channel - + [ - (shape0[0] / shape[0] - 1) * vxh * 0.5, - (shape0[1] / shape[1] - 1) * vxw * 0.5, - ], + + [ + (shape0[0] / shape[0] - 1) * vxh * 0.5, + (shape0[1] / shape[1] - 1) * vxw * 0.5, + ], }, ] multiscales[0]["coordinateTransformations"] = [ diff --git a/linc_convert/utils/__init__.py b/linc_convert/utils/__init__.py index 75fec8b0..fb295188 100644 --- a/linc_convert/utils/__init__.py +++ b/linc_convert/utils/__init__.py @@ -1,2 +1,2 @@ """Various utilities.""" -from . import logging \ No newline at end of file +from . import logging diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index fcb31219..8f4aeb55 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -35,4 +35,3 @@ def chunk_slice_generator(arr_shape, chunk_shape): # Prepend an Ellipsis to preserve any preceding (non-chunked) dimensions full_slice = (...,) + slices yield index, full_slice - diff --git a/linc_convert/utils/j2k.py b/linc_convert/utils/j2k.py index c61805b2..6bfb1579 100644 --- a/linc_convert/utils/j2k.py +++ b/linc_convert/utils/j2k.py @@ -68,7 +68,7 @@ class WrappedJ2K: def shape(self) -> tuple[int]: """Shape of the current level.""" channel = list(self.j2k.shape[2:]) - shape = [ceildiv(s, 2**self.level) for s in self.j2k.shape[:2]] + shape = [ceildiv(s, 2 ** self.level) for s in self.j2k.shape[:2]] if self.channel_first: shape = channel + shape else: @@ -119,10 +119,10 @@ def __getitem__(self, index: tuple[slice] | slice) -> np.ndarray: wstart, wstop = widx.start or 0, widx.stop or 0 # convert to level 0 indices - hstart *= 2**self.level - hstop *= 2**self.level - wstart *= 2**self.level - wstop *= 2**self.level + hstart *= 2 ** self.level + hstop *= 2 ** self.level + wstart *= 2 ** self.level + wstop *= 2 ** self.level hstop = min(hstop or self.j2k.shape[0], self.j2k.shape[0]) wstop = min(wstop or self.j2k.shape[1], self.j2k.shape[1]) area = (hstart, wstart, hstop, wstop) diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index b143ba1c..8d9022ce 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -2,6 +2,7 @@ logger = logging.getLogger() + def setup_logging(): logging.basicConfig( level=logging.INFO, @@ -13,10 +14,12 @@ def setup_logging(): def add_file_handler(log_file_path=None): file_handler = logging.FileHandler(log_file_path) file_handler.setLevel(logging.DEBUG) - file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) -#TODO: add file handler for each platform. prob ref dandi-ci. prevent logging error in unit test + +# TODO: add file handler for each platform. prob ref dandi-ci. prevent logging error in unit test setup_logging() # add_file_handler("/scratch/converter.log") diff --git a/linc_convert/utils/orientation.py b/linc_convert/utils/orientation.py index 0d26bde2..d5840d8d 100644 --- a/linc_convert/utils/orientation.py +++ b/linc_convert/utils/orientation.py @@ -33,7 +33,7 @@ def orientation_ensure_3d(orientation: str) -> str: def orientation_to_affine( - orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 + orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 ) -> np.ndarray: """ Build an affine matrix from an orientation string and voxel size. diff --git a/linc_convert/utils/spool.py b/linc_convert/utils/spool.py index 94cb7bb1..00332559 100644 --- a/linc_convert/utils/spool.py +++ b/linc_convert/utils/spool.py @@ -47,8 +47,9 @@ def __init__(self, spool_set_path, info_file=None): warnings.warn('ERROR: Info file not found.') self.assembled_spool_shape = (self.numDepths, self.spool_shape[2], - self.spool_shape[0]*len(self.spool_files), + self.spool_shape[0] * len(self.spool_files), ) + def _load_info_file(self, info_file): loaded_info = loadmat(info_file) info = loaded_info.get("info", None) @@ -187,4 +188,4 @@ def assemble(self): # this is the modified version for lsm pipeline def assemble_cropped(self): - return self.assemble().transpose(1, 2, 0)[:self.numDepths,:,:] \ No newline at end of file + return self.assemble().transpose(1, 2, 0)[:self.numDepths, :, :] diff --git a/linc_convert/utils/unit.py b/linc_convert/utils/unit.py index 04be0f29..806201a4 100644 --- a/linc_convert/utils/unit.py +++ b/linc_convert/utils/unit.py @@ -134,7 +134,6 @@ "q": -30, } - unit_space_short2long = { short + "m": long + "meter" for short, long in si_prefix_short2long.items() } @@ -169,7 +168,7 @@ unit_time_long2short = {long: short for short, long in unit_time_short2long.items()} unit_space_scale = { - prefix + "m": 10**exponent for prefix, exponent in si_prefix_exponent.items() + prefix + "m": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() } unit_space_scale.update( { @@ -185,7 +184,7 @@ ) unit_time_scale = { - prefix + "s": 10**exponent for prefix, exponent in si_prefix_exponent.items() + prefix + "s": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() } unit_time_scale.update( { diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py index 22261135..404ab578 100644 --- a/linc_convert/utils/zarr/__init__.py +++ b/linc_convert/utils/zarr/__init__.py @@ -1,5 +1,5 @@ """Zarr utilities.""" +from .generate_pyramid import generate_pyramid, generate_pyramid_old from .zarr_config import ZarrConfig from .zarr_io import * -from .generate_pyramid import generate_pyramid, generate_pyramid_old diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/zarr/generate_pyramid.py index a034b486..76bb6a8e 100644 --- a/linc_convert/utils/zarr/generate_pyramid.py +++ b/linc_convert/utils/zarr/generate_pyramid.py @@ -3,27 +3,27 @@ import math from typing import Literal, Optional +import dask import dask.array as da import numpy as np +import tensorstore as ts import tqdm import zarr -import dask +from dask.diagnostics import ProgressBar from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata -import tensorstore as ts - from linc_convert.utils.math import ceildiv -from dask.diagnostics import ProgressBar logger = logging.getLogger(__name__) + def generate_pyramid_old( - omz: zarr.Group, - levels: int = -1, - ndim: int = 3, - max_load: int = 512, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, + omz: zarr.Group, + levels: int = -1, + ndim: int = 3, + max_load: int = 512, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -190,7 +190,8 @@ def get_zarray_options(base_level): ) if isinstance(base_level.metadata, ArrayV2Metadata): opts_extra = dict( - chunk_key_encoding = dimension_separator_to_chunk_key_encoding(base_level.metadata.dimension_separator, 2) + chunk_key_encoding=dimension_separator_to_chunk_key_encoding( + base_level.metadata.dimension_separator, 2) ) elif isinstance(base_level.metadata, ArrayV3Metadata): opts_extra = dict( @@ -202,28 +203,32 @@ def get_zarray_options(base_level): opts.update(**opts_extra) return opts + class _TSAdapter: def __init__(self, ts): self._ts = ts + @property def shape(self): return tuple(self._ts.shape) + @property def ndim(self): return self._ts.ndim + @property def dtype(self): # Expose the NumPy dtype here: return self._ts.dtype.numpy_dtype + def __getitem__(self, idx): return self._ts[idx].read().result() - def generate_pyramid( - omz: zarr.Group, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, + omz: zarr.Group, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -283,8 +288,11 @@ def generate_pyramid( # dat = da.from_zarr(omz[str(lvl - 1)]) - wconfig = default_write_config(str(arr.store_path), shape =batch_shape + spatial_shape, dtype = dat.dtype, chunk = opts["chunks"], shard=opts["shards"], - version = omz.info._zarr_format) + wconfig = default_write_config(str(arr.store_path), + shape=batch_shape + spatial_shape, + dtype=dat.dtype, chunk=opts["chunks"], + shard=opts["shards"], + version=omz.info._zarr_format) wconfig["delete_existing"] = True wconfig["create"] = True writer = ts.open(wconfig).result() @@ -331,7 +339,8 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): # build the coarsening factors: 2 along each pyramid dim, except 1 if skip factors = { axis: ( - 1 if (no_pyramid_axis is not None and axis == pyramid_axes[no_pyramid_axis]) or arr.shape[axis] == 1 + 1 if (no_pyramid_axis is not None and axis == pyramid_axes[ + no_pyramid_axis]) or arr.shape[axis] == 1 else 2) for axis in pyramid_axes } @@ -376,6 +385,3 @@ def compute_next_level_old(arr, ndim, no_pyramid_axis, window_func): arr = window_func(arr, axis=-1) arr = arr.astype(dtype) return arr - - - diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index 6fa29c9d..e078eb78 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -1,14 +1,15 @@ """Configuration related to output Zarr Archive.""" +import logging import os from dataclasses import dataclass, replace from typing import Annotated, Literal -from typing_extensions import Unpack -import logging from cyclopts import Parameter +from typing_extensions import Unpack logger = logging.getLogger(__name__) + @Parameter(name="*") @dataclass class ZarrConfig: @@ -91,7 +92,7 @@ class ZarrConfig: no_time: bool = False no_pyramid_axis: Literal["x", "y", "z", None] = None levels: int = -1 - ome_version: Literal["0.4","0.5"] = "0.4" + ome_version: Literal["0.4", "0.5"] = "0.4" nii: bool = False max_load: int = 512 overwrite: bool = False @@ -119,10 +120,8 @@ def set_default_name(self, name: str): def update(self, **kwargs): return replace(self, **kwargs) -def update(zarr_config: ZarrConfig|None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: + +def update(zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: zarr_config = ZarrConfig() return replace(zarr_config, **kwargs) - - - diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index 7e890129..f30571c5 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -12,8 +12,8 @@ import zarr from numpy._typing import DTypeLike from upath import UPath -import tensorstore as ts +import tensorstore as ts from linc_convert.utils.zarr import ZarrConfig from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py index 5c07ff78..ad643124 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -227,7 +227,7 @@ def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) ) -def open_zarr_group(zarr_config:ZarrConfig): +def open_zarr_group(zarr_config: ZarrConfig): # TODO: check out is not none or empty store = zarr.storage.LocalStore(zarr_config.out) return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) @@ -254,21 +254,23 @@ def create_array( "order": zarr_config.order, "dtype": np.dtype(dtype).str, "fill_value": None, - "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), + "compressors": make_compressor(compressor, zarr_config.zarr_version, + **compressor_opt), } - chunk_key_encoding = dimension_separator_to_chunk_key_encoding(zarr_config.dimension_separator, zarr_config.zarr_version) + chunk_key_encoding = dimension_separator_to_chunk_key_encoding( + zarr_config.dimension_separator, zarr_config.zarr_version) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding - arr= omz.create_array(name=name, - shape=shape, - **opt) + arr = omz.create_array(name=name, + shape=shape, + **opt) if data: arr[:] = data return arr -def dimension_separator_to_chunk_key_encoding(dimension_separator,zarr_version): +def dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version): dimension_separator = dimension_separator if dimension_separator == '.' and zarr_version == 2: pass diff --git a/scripts/debug.py b/scripts/debug.py new file mode 100644 index 00000000..f5705bcb --- /dev/null +++ b/scripts/debug.py @@ -0,0 +1,16 @@ +import numpy as np +import psutil +import sparse + + +def print_mem(): + print(psutil.Process().memory_info().rss/1024/1024) + +print_mem() +a = np.broadcast_to(np.zeros(()),(1000,)*3) + +print_mem() +b = sparse.random(a.shape,0.0001) +print_mem() +c = a+b +print_mem() \ No newline at end of file From 299b985e1ef3b01d4e93cf58d163d036664f165c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 14:18:01 -0400 Subject: [PATCH 070/157] fix: use zarr-python for metadata --- linc_convert/modalities/psoct/multi_slice.py | 2 ++ linc_convert/modalities/psoct/single_volume.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 1acacde9..401ae363 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -15,6 +15,7 @@ import cyclopts import h5py import numpy as np +import zarr from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata from linc_convert import utils @@ -161,6 +162,7 @@ def convert( zgroup.generate_pyramid(mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") + zgroup = zarr.open(zarr_config.out, mode="a") write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 3a8788b7..5e150c95 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -16,6 +16,7 @@ from linc_convert.utils.zarr.zarr_io import ZarrPythonGroup, from_config import numpy as np from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header +import zarr from linc_convert import utils from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, _H5ArrayWrapper @@ -127,7 +128,7 @@ def convert( unit = "um" # Prepare Zarr group - zgroup = from_config(zarr_config, overwrite= ZarrConfig.overwrite) + zgroup = from_config(zarr_config) if not hasattr(inp, "dtype"): raise Exception("Input is not a numpy array. This is unexpected.") @@ -149,9 +150,9 @@ def convert( loaded_chunk = inp[slc] dataset[slc] = loaded_chunk - # generate_pyramid(zgroup, mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) zgroup.generate_pyramid( mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") + zgroup = zarr.open(zarr_config.out, mode="a") write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: From f6edb8c3bf26e8453585263a557d05a1b6487783 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 26 Jun 2025 15:12:00 -0400 Subject: [PATCH 071/157] fix: improve tensorstore import error handling --- linc_convert/utils/zarr/zarr_io/factory.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_io/factory.py b/linc_convert/utils/zarr/zarr_io/factory.py index a75590ec..4792476f 100644 --- a/linc_convert/utils/zarr/zarr_io/factory.py +++ b/linc_convert/utils/zarr/zarr_io/factory.py @@ -1,3 +1,4 @@ +import warnings from typing import Literal from linc_convert.utils.zarr import ZarrConfig @@ -18,8 +19,8 @@ _DRIVER_ARRAY["tensorstore"] = ZarrTSArray _DRIVER_GROUP["tensorstore"] = ZarrTSGroup -except ImportError: - pass +except ImportError as e: + warnings.warn(f"Tensorstore driver not available: {e}.") def open( @@ -29,7 +30,7 @@ def open( def open_group( - driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python"): + driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python") -> ZarrGroup: raise NotImplementedError pass From 6846335faa5905279e9e62254564f8cf125fd902 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 09:57:37 -0400 Subject: [PATCH 072/157] chore: cleanup --- linc_convert/modalities/psoct/multi_slice.py | 56 ++++++++++--------- .../modalities/psoct/single_volume.py | 36 ++++++------ 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 401ae363..e734209d 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -6,29 +6,27 @@ """ import json +import logging import os from functools import wraps from itertools import product from typing import Callable, Optional -import logging import cyclopts import h5py import numpy as np import zarr - from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata + from linc_convert import utils -from linc_convert.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ - _MatArrayWrapper from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct +from linc_convert.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ + _MatArrayWrapper from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import generate_pyramid, generate_pyramid_old -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ - create_array +from linc_convert.utils.zarr import generate_pyramid from linc_convert.utils.zarr.zarr_config import ZarrConfig from linc_convert.utils.zarr.zarr_io import from_config @@ -44,11 +42,13 @@ def _automap(func: Callable) -> Callable: def wrapper(inp: list[str], **kwargs: dict) -> callable: dat = _mapmat(inp, kwargs.get("key", None)) return func(dat, **kwargs) + return wrapper def _mapmat(fnames: list[str], key: Optional[str] = None) -> list[_ArrayWrapper]: """Load or memory-map an array stored in a .mat file.""" + def make_wrapper(fname: str) -> _ArrayWrapper: try: # "New" .mat file @@ -64,15 +64,15 @@ def make_wrapper(fname: str) -> _ArrayWrapper: @multi_slice.default @_automap def convert( - inp: list[str], - *, - key: Optional[str] = None, - meta: str = None, - orientation: str = "RAS", - center: bool = True, - dtype: Optional[str] = None, - zarr_config: ZarrConfig = None, - **kwargs + inp: list[str], + *, + key: Optional[str] = None, + meta: str = None, + orientation: str = "RAS", + center: bool = True, + dtype: Optional[str] = None, + zarr_config: ZarrConfig = None, + **kwargs ) -> None: """ Matlab to OME-Zarr. @@ -134,16 +134,17 @@ def convert( ny = ceildiv(volume_shape[-2], chunk_size[1]) nslices = len(inp) - dataset = zgroup.create_array("0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype)) + dataset = zgroup.create_array("0", shape=volume_shape, zarr_config=zarr_config, + dtype=np.dtype(dtype)) # Process and store data in chunks for i in range(nslices): for j, k in product(range(ny), range(nz)): loaded_chunk = inp[i][ - ..., - k * chunk_size[0] : (k + 1) * chunk_size[0], - j * chunk_size[1] : (j + 1) * chunk_size[1], - ] + ..., + k * chunk_size[0]: (k + 1) * chunk_size[0], + j * chunk_size[1]: (j + 1) * chunk_size[1], + ] logger.info( f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: {k + 1:03d}] " f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" @@ -153,10 +154,10 @@ def convert( y_start = j * chunk_size[1] y_end = y_start + loaded_chunk.shape[-1] dataset[ - ..., - z_start:z_end, - y_start:y_end, - i, + ..., + z_start:z_end, + y_start:y_end, + i, ] = loaded_chunk inp[i] = None # Remove reference to free memory @@ -171,7 +172,8 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] - header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales")) + header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get( + "multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: @@ -182,4 +184,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(to_nifti_unit(unit)) - write_nifti_header(zgroup, header) \ No newline at end of file + write_nifti_header(zgroup, header) diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 5e150c95..d1b253b4 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -13,23 +13,21 @@ import cyclopts import h5py -from linc_convert.utils.zarr.zarr_io import ZarrPythonGroup, from_config import numpy as np -from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header import zarr +from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header from linc_convert import utils -from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, _H5ArrayWrapper from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct +from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, \ + _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import generate_pyramid, generate_pyramid_old -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ - create_array from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.zarr.zarr_io import ZarrPythonGroup, from_config logger = logging.getLogger(__name__) single_volume = cyclopts.App(name="single_volume", help_format="markdown") @@ -51,6 +49,7 @@ def wrapper(inp: str, zarr_config: ZarrConfig = None, **kwargs: dict) -> None: def _mapmat(fname: str, key: Optional[str] = None) -> _ArrayWrapper: """Load or memory-map an array stored in a .mat file.""" + def make_wrapper(fname: str) -> _ArrayWrapper: try: # "New" .mat file @@ -66,15 +65,15 @@ def make_wrapper(fname: str) -> _ArrayWrapper: @single_volume.default @_automap def convert( - inp: str, - *, - key: Optional[str] = None, - meta: str = None, - no_pool: Optional[int] = None, - orientation: str = "RAS", - center: bool = True, - zarr_config: ZarrConfig = None, - **kwargs + inp: str, + *, + key: Optional[str] = None, + meta: str = None, + no_pool: Optional[int] = None, + orientation: str = "RAS", + center: bool = True, + zarr_config: ZarrConfig = None, + **kwargs ) -> None: """ Matlab to OME-Zarr. @@ -141,7 +140,7 @@ def convert( ni = ceildiv(inp.shape[2], inp_chunk[2]) dataset = zgroup.create_array("0", shape=inp.shape, zarr_config=zarr_config, - dtype=np.dtype(inp.dtype)) + dtype=np.dtype(inp.dtype)) for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): logger.info( @@ -150,7 +149,7 @@ def convert( loaded_chunk = inp[slc] dataset[slc] = loaded_chunk - zgroup.generate_pyramid( mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) + zgroup.generate_pyramid(mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") zgroup = zarr.open(zarr_config.out, mode="a") write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) @@ -162,7 +161,8 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] header = default_nifti_header(arr, - zgroup.attrs.get("ome", zgroup.attrs).get("multiscales")) + zgroup.attrs.get("ome", zgroup.attrs).get( + "multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: From 3f65c55337c5c9da27472a55ff4994ff3f22e570 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 10:04:32 -0400 Subject: [PATCH 073/157] chore: improve type hint --- linc_convert/utils/zarr/__init__.py | 1 - linc_convert/utils/zarr/zarr_io/abc.py | 8 ++++++-- linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py index 404ab578..835db1d7 100644 --- a/linc_convert/utils/zarr/__init__.py +++ b/linc_convert/utils/zarr/__init__.py @@ -1,5 +1,4 @@ """Zarr utilities.""" -from .generate_pyramid import generate_pyramid, generate_pyramid_old from .zarr_config import ZarrConfig from .zarr_io import * diff --git a/linc_convert/utils/zarr/zarr_io/abc.py b/linc_convert/utils/zarr/zarr_io/abc.py index 0f1e0061..9444f4fa 100644 --- a/linc_convert/utils/zarr/zarr_io/abc.py +++ b/linc_convert/utils/zarr/zarr_io/abc.py @@ -3,6 +3,7 @@ from typing import Union, Tuple, Optional, Any, Literal import numpy as np +from numpy.typing import DTypeLike import tqdm from dask import array as da from dask.diagnostics import ProgressBar @@ -131,8 +132,11 @@ def create_array( self, name: str, shape: Tuple[int, ...], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, **kwargs - ) -> 'ZarrArray': + ) -> ZarrArray: """ Create a new array within this group. """ @@ -145,7 +149,7 @@ def create_array_from_base( shape: Tuple[int, ...], data: Optional[Any] = None, **kwargs - ) -> 'ZarrArray': + ) -> ZarrArray: """ Create a new array using metadata of an existing base-level array. """ diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index f30571c5..1b880ede 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -142,7 +142,7 @@ def create_array(self, dtype: DTypeLike = np.int32, data=None, **kwargs - ) -> zarr.Array: + ) -> ZarrArray: if zarr_config is None: conf = default_write_config( self._path / name, @@ -159,6 +159,7 @@ def create_array(self, chunk=zarr_config.chunk, shard=zarr_config.shard, compressor=zarr_config.compressor, + #TODO: implement this # compressor_opt=, version=zarr_config.zarr_version, ) From e944d3973dac57d57b8cb3bd6b4c3b52ba17050b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 10:13:59 -0400 Subject: [PATCH 074/157] cleanup --- linc_convert/modalities/psoct/_utils.py | 2 +- linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py | 2 +- linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 0d725a96..51a9a957 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -5,7 +5,7 @@ import nibabel as nib import numpy as np import zarr -from numpy._typing import ArrayLike +from numpy.typing import ArrayLike from scipy import io as sio from linc_convert.utils.math import ceildiv diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index 1b880ede..3434d9d7 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -10,7 +10,7 @@ import numcodecs.abc import numpy as np import zarr -from numpy._typing import DTypeLike +from numpy.typing import DTypeLike from upath import UPath import tensorstore as ts diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py index ad643124..a4abd4a4 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -4,7 +4,7 @@ import numpy as np import zarr import zarr.codecs -from numpy._typing import DTypeLike +from numpy.typing import DTypeLike from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams from linc_convert.utils.zarr import ZarrConfig From 997f37c6f2768eb1ca8153438670e1ce5a758754 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 10:26:09 -0400 Subject: [PATCH 075/157] test: add linc test data dir --- tests/000051/dataset_description.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/000051/dataset_description.json diff --git a/tests/000051/dataset_description.json b/tests/000051/dataset_description.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/tests/000051/dataset_description.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 76fa2196fab723f8bf91735e434e783a228e4420 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 10:27:49 -0400 Subject: [PATCH 076/157] test: ignore real test data files --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0f26f128..9c2705aa 100644 --- a/.gitignore +++ b/.gitignore @@ -157,7 +157,8 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ scripts/* tests/data/test_oct/ +tests/000051/ \ No newline at end of file From 29fb1164204810f6126028c147bb12dd0b9274ae Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 10:36:27 -0400 Subject: [PATCH 077/157] chore: improve type hint --- linc_convert/utils/zarr/zarr_config.py | 3 ++- linc_convert/utils/zarr/zarr_io/factory.py | 9 +++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr/zarr_config.py index e078eb78..58bf400c 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr/zarr_config.py @@ -9,6 +9,7 @@ logger = logging.getLogger(__name__) +DriverLike = Literal["zarr-python", "tensorstore", "zarrita"] @Parameter(name="*") @dataclass @@ -96,7 +97,7 @@ class ZarrConfig: nii: bool = False max_load: int = 512 overwrite: bool = False - driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python" + driver: DriverLike = "zarr-python" def __post_init__(self) -> None: if self.out: diff --git a/linc_convert/utils/zarr/zarr_io/factory.py b/linc_convert/utils/zarr/zarr_io/factory.py index 4792476f..ca4586d5 100644 --- a/linc_convert/utils/zarr/zarr_io/factory.py +++ b/linc_convert/utils/zarr/zarr_io/factory.py @@ -2,6 +2,7 @@ from typing import Literal from linc_convert.utils.zarr import ZarrConfig +from linc_convert.utils.zarr.zarr_config import DriverLike from linc_convert.utils.zarr.zarr_io.abc import ZarrGroup from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import ZarrPythonArray, \ ZarrPythonGroup @@ -23,16 +24,12 @@ warnings.warn(f"Tensorstore driver not available: {e}.") -def open( - driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python"): +def open(driver: DriverLike): raise NotImplementedError - pass -def open_group( - driver: Literal["zarr-python", "tensorstore", "zarrita"] = "zarr-python") -> ZarrGroup: +def open_group(driver: DriverLike) -> ZarrGroup: raise NotImplementedError - pass def from_config(zarr_config: ZarrConfig) -> ZarrGroup: From 809b8b2cfcba79ed4be1fc06d7c2c8b4996b1652 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 13:32:41 -0400 Subject: [PATCH 078/157] fix: add dependencies --- linc_convert/utils/zarr/zarr_io/__init__.py | 3 ++- pyproject.toml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/zarr/zarr_io/__init__.py index e4fc2782..c6b885a1 100644 --- a/linc_convert/utils/zarr/zarr_io/__init__.py +++ b/linc_convert/utils/zarr/zarr_io/__init__.py @@ -7,8 +7,9 @@ from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup try: - from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup + import tensorstore as TS except ImportError: warnings.warn("Tensorstore is not installed, driver disabled") +from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup from .factory import open, open_group, from_config diff --git a/pyproject.toml b/pyproject.toml index c02dc33c..72b6527b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ zarr = "^3.0.0" nifti-zarr = "*" tqdm = "*" dask = "*" +universal_pathlib = "*" # optionals glymur = { version = "*", optional = true } From 59f68d240784b4608b15e6318da5888460237232 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 14:35:57 -0400 Subject: [PATCH 079/157] tests: move dir --- tests/{ => data}/000051/dataset_description.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{ => data}/000051/dataset_description.json (100%) diff --git a/tests/000051/dataset_description.json b/tests/data/000051/dataset_description.json similarity index 100% rename from tests/000051/dataset_description.json rename to tests/data/000051/dataset_description.json From eb5153d88c4d895b4923eb4cb4958fd476124633 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 14:37:27 -0400 Subject: [PATCH 080/157] tests: update .gitignore --- .gitignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9c2705aa..f53dcf6e 100644 --- a/.gitignore +++ b/.gitignore @@ -159,6 +159,4 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ -scripts/* -tests/data/test_oct/ -tests/000051/ \ No newline at end of file +tests/data/000051/ From 5daaad1256912e1c2e90bde2ed0119ba25f153f8 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 15:30:24 -0400 Subject: [PATCH 081/157] tests: optimize oct tests --- tests/test_oct.py | 253 +++++++++++++++++++++++++--------------------- 1 file changed, 135 insertions(+), 118 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index 4f1777df..455a07e2 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -8,134 +8,151 @@ import skimage import zarr.storage from scipy.io import savemat +import pytest from linc_convert.modalities.psoct import single_volume, multi_slice -from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal +from utils.compare_file import assert_zarr_equal -# def test_oct(tmp_path): -# files = glob.glob("data/test_oct/*") -# files.sort() -# output_zarr = tmp_path / "output.zarr" -# multi_slice.convert( -# files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True -# ) -# assert _cmp_zarr_archives(str(output_zarr), "data/oct.zarr") - -def generate_single_volume_data(path: Union[str, PathLike]) -> None: +@pytest.fixture +def single_volume_mat(tmp_path): """ - Generate a single-brain-volume test dataset and save it as a .mat file. - - Parameters - ---------- - path : Union[str, PathLike] - Path to save the .mat file. Can be: - - a directory (e.g. "tests/data/") → will write "tests/data/single_volume.mat" - - a filename (e.g. "out/myvol.mat" or "out/myvol") → will write to that file (appending .mat if needed) + Create a temporary .mat file containing a single brain volume. """ - p = Path(path) - if p.is_dir() or str(p).endswith(('/', '\\')): - p = p / "single_volume.mat" - if p.suffix.lower() != ".mat": - p = p.with_suffix(".mat") - p.parent.mkdir(parents=True, exist_ok=True) - + path = tmp_path / "single_volume.mat" volume = skimage.data.brain().T - savemat(str(p), {"volume": volume}) - - -def test_oct_single_volume(tmp_path): - input_path = tmp_path / "single_volume.mat" - output_path = tmp_path / "single_volume.nii.zarr" - generate_single_volume_data(input_path) - single_volume.convert(input_path, out=str(output_path), key="volume", - zarr_version=2, overwrite=True, chunk=(64,), driver = "tensorstore") - - assert_zarr_equal(str(output_path), zarr.storage.ZipStore( - "data/oct_single_volume_zarr2.nii.zarr.zip", mode="r")) - - -def test_oct_single_volume_zarr3(tmp_path): - input_path = tmp_path / "single_volume.mat" - output_path = tmp_path / "single_volume.nii.zarr" - generate_single_volume_data(input_path) - single_volume.convert(input_path, out=str(output_path), key="volume", - zarr_version=3, overwrite=True, chunk=(64,), driver = "tensorstore") - - assert_zarr_equal(str(output_path), zarr.storage.ZipStore( - "data/oct_single_volume_zarr3.nii.zarr.zip", mode="r")) - + savemat(str(path), {"volume": volume}) + return path -def generate_single_volume_test_result(): - with tempfile.TemporaryDirectory() as tmpdir: - tmpdir = Path(tmpdir) - try: - test_oct_single_volume(tmpdir) - except Exception as e: - pass - shutil.make_archive("data/oct_single_volume_zarr2.nii.zarr", "zip", - str(tmpdir / "single_volume.nii.zarr"), ) - try: - test_oct_single_volume_zarr3(tmpdir) - except Exception as e: - pass - shutil.make_archive("data/oct_single_volume_zarr3.nii.zarr", "zip", - str(tmpdir / "single_volume.nii.zarr"), ) - - -def generate_multi_slice_data(path: Union[str, PathLike]) -> None: +@pytest.fixture +def multi_slice_mats(tmp_path): """ - Generate a single-brain-volume test dataset and save it as a .mat file. - - Parameters - ---------- - path : Union[str, PathLike] - Path to save the .mat file. + Create a set of temporary .mat files representing slices of a volume. """ - p = Path(path) - p.mkdir(parents=True, exist_ok=True) + dir_path = tmp_path / "slices" + dir_path.mkdir(parents=True, exist_ok=True) volume = skimage.data.brain().T + files = [] for i in range(5): - savemat(str(p / f"slice_{i:03d}.mat"), {"Psi_ObsLSQ": volume[..., i]}) - - -def test_oct_multi_slices(tmp_path): - input_path = tmp_path - output_path = tmp_path / "multi_slice.nii.zarr" - generate_multi_slice_data(input_path) - input_path = glob.glob(str(input_path / "*.mat")) - multi_slice.convert(input_path, out=str(output_path), zarr_version=2, - overwrite=True, chunk=(64,), driver = "tensorstore") - - assert_zarr_equal(str(output_path), zarr.storage.ZipStore( - "data/oct_multi_slice_zarr2.nii.zarr.zip", mode="r")) - - -def test_oct_multi_slices_zarr3(tmp_path): - input_path = tmp_path - output_path = tmp_path / "multi_slice.nii.zarr" - generate_multi_slice_data(input_path) - input_path = glob.glob(str(input_path / "*.mat")) - multi_slice.convert(input_path, out=str(output_path), zarr_version=3, - overwrite=True, chunk=(64,), driver = "tensorstore") - - assert_zarr_equal(str(output_path), zarr.storage.ZipStore( - "data/oct_multi_slice_zarr3.nii.zarr.zip", mode="r")) - - -def generate_multi_slice_test_result(): - with tempfile.TemporaryDirectory() as tmpdir: - tmpdir = Path(tmpdir) - try: - test_oct_multi_slices(tmpdir) - except Exception as e: - pass - shutil.make_archive("data/oct_multi_slice_zarr2.nii.zarr", "zip", - str(tmpdir / "multi_slice.nii.zarr"), ) - try: - test_oct_multi_slices_zarr3(tmpdir) - except Exception as e: - pass - shutil.make_archive("data/oct_multi_slice_zarr3.nii.zarr", "zip", - str(tmpdir / "multi_slice.nii.zarr"), ) + file_path = dir_path / f"slice_{i:03d}.mat" + savemat(str(file_path), {"Psi_ObsLSQ": volume[..., i]}) + files.append(str(file_path)) + return sorted(files) + + +@ pytest.mark.oct +@ pytest.mark.parametrize( + "zarr_version, expected_zip", + [ + (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), + (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), + ], +) + +def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zip): + output = tmp_path / "single_volume.nii.zarr" + + single_volume.convert( + str(single_volume_mat), + out=str(output), + key="volume", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="tensorstore", + ) + + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zip, mode="r"), + ) + + +@ pytest.mark.oct +@ pytest.mark.parametrize( + "zarr_version, expected_zip", + [ + (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), + ], +) + +def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zip): + output = tmp_path / "multi_slice.nii.zarr" + + multi_slice.convert( + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="tensorstore", + ) + + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zip, mode="r"), + ) + +@pytest.mark.golden +@pytest.mark.parametrize( + "zarr_version, expected_zip", + [ + (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), + (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), + ], +) +def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, expected_zip): + """ + Rebuild single-volume golden archives. Only run with --regenerate-golden. + """ + output = tmp_path / "single_volume.nii.zarr" + single_volume.convert( + str(single_volume_mat), + out=str(output), + key="volume", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", + ) + base = Path(expected_zip).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) + + +@pytest.mark.golden +@pytest.mark.parametrize( + "zarr_version, expected_zip", + [ + (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), + ], +) +def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expected_zip): + """ + Rebuild multi-slice golden archives. Only run with --regenerate-golden. + """ + output = tmp_path / "multi_slice.nii.zarr" + multi_slice.convert( + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", + ) + base = Path(expected_zip).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) + + +# def test_oct(tmp_path): +# files = glob.glob("data/test_oct/*") +# files.sort() +# output_zarr = tmp_path / "output.zarr" +# multi_slice.convert( +# files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True +# ) +# assert _cmp_zarr_archives(str(output_zarr), "data/oct.zarr") From fabd7af1a3d5c8d94be17e45285361f38095c4d0 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 15:32:14 -0400 Subject: [PATCH 082/157] tests: refactor --- tests/test_oct.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index 455a07e2..89066a53 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -43,14 +43,14 @@ def multi_slice_mats(tmp_path): @ pytest.mark.oct @ pytest.mark.parametrize( - "zarr_version, expected_zip", + "zarr_version, expected_zarr", [ (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zip): +def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr): output = tmp_path / "single_volume.nii.zarr" single_volume.convert( @@ -65,20 +65,20 @@ def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zip): assert_zarr_equal( str(output), - zarr.storage.ZipStore(expected_zip, mode="r"), + zarr.storage.ZipStore(expected_zarr, mode="r"), ) @ pytest.mark.oct @ pytest.mark.parametrize( - "zarr_version, expected_zip", + "zarr_version, expected_zarr", [ (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), ], ) -def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zip): +def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( @@ -93,18 +93,18 @@ def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zip): assert_zarr_equal( str(output), - zarr.storage.ZipStore(expected_zip, mode="r"), + zarr.storage.ZipStore(expected_zarr, mode="r"), ) @pytest.mark.golden @pytest.mark.parametrize( - "zarr_version, expected_zip", + "zarr_version, expected_zarr", [ (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, expected_zip): +def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, expected_zarr): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. """ @@ -118,19 +118,19 @@ def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, e chunk=(64,), driver="zarr-python", ) - base = Path(expected_zip).with_suffix("") + base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) @pytest.mark.golden @pytest.mark.parametrize( - "zarr_version, expected_zip", + "zarr_version, expected_zarr", [ (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), ], ) -def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expected_zip): +def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expected_zarr): """ Rebuild multi-slice golden archives. Only run with --regenerate-golden. """ @@ -144,7 +144,7 @@ def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expe chunk=(64,), driver="zarr-python", ) - base = Path(expected_zip).with_suffix("") + base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) From b3014774b7b540c62a10c40d5a0629ce3aa18022 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 1 Jul 2025 16:02:07 -0400 Subject: [PATCH 083/157] tests: update oct test data --- tests/data/oct_multi_slice_zarr2.nii.zarr.zip | Bin 391296 -> 388654 bytes tests/data/oct_multi_slice_zarr3.nii.zarr.zip | Bin 284559 -> 281873 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/oct_multi_slice_zarr2.nii.zarr.zip b/tests/data/oct_multi_slice_zarr2.nii.zarr.zip index ee62a1578281ae58c8a6376149c10a4c86b6eeb2..026c1e560a7adb102dc8c04dcc7c06ce007c8ca1 100644 GIT binary patch literal 388654 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

    TPwLUpMmYP)S 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

    FlfNb2RJf!eui{+0b16 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 V#rVFZKmkwyJ+j^Rkskp7{|9$nx^w^l literal 391296 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

    2>7P}k+F_Y74$5y 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 Bj!OUl diff --git a/tests/data/oct_multi_slice_zarr3.nii.zarr.zip b/tests/data/oct_multi_slice_zarr3.nii.zarr.zip index 2cfcbc7fe021a220db4c6bbb1b42b41d2b83e78c..88b6893cd6181ae69168923fb30b499f4148e5c5 100644 GIT binary patch literal 281873 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

    uHz`PKKnJ>yGFcg3)c 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�x*t6ZvQ8#F6S@-G-`7ZXUC$hPCJ#=S5a{Z zuKLAz-%S-ghuNQ`N!1`wO;tp#GQ&0&lN&C=)!Mda;P=@Qa-d&3qOi4$legxUI1soe z;eWbu@c6-Cz)*!$nb?m<-CVg`#-WJ$yk91bwalI?_MAK*)K%= zWu6s;0IwIJ^%IheLj48!$*@*IkeYb(hw^fCuelGo@c2|g4 zo)t;eZOL7r)S>b@?c>B3*=8Bv;iD1nklTKVIvpwG| za9H`#p8h$Sg&S+r7<>LQi-ow3Lg8PtLmfRmNoLc6I2v+%5OY{=8_xuXD~o!{;0P`( zKyGV)?)_kH^CAH7KHVvqIN-}`4&WMY(^La>^YN$=Jo=3}di7pw6A*X}C7+36{f9w) ztLlO~bGsz!{s&v0xx%;@H5Oz7SmV?VznWOtP~^7&fQ^$3v6 zpmdVmvcP&7`e-p&j-bvCNbUsSBX{CZX4^AaW?zasGnzrsd$ttOM6@UqX=4+S za75Z82;o1+gbYfDWMZU199GUI$x?JwJ+6&P$&@(6Wn-k`<)ADM{tR$$1)_aWm0K*H z2CH8bn;K&X*qdP8T`Kqb&Jh!=@S^(hrbj%uCTjlka}GsO0pGbA;b(PUbNWNlGkXNB zq+vuWRVPf<^!!93kRNN|S7kx^WPO+`IBy*Ss=$o31Ws5ZtYqTg zX+~TM;%C$^0#~L5+nKzX*Ha|n66t|C&}TZh$vl}uiS-TNtc3@j(iAkMpYymQ{190~ zr_{WNT*2Kw!IybxKOShJk_H2~O$vQElC4>W+7Ia1Y2`X3Ih74eMXv8_8YBfRNCNP{ z3I%AUR=Hr_B{LTkBHM$50c$Wh1~c5-zX3r_utVFSm1VGZMxe03k6CNY|L(>h zO$>2ZgNrOU4DtWZET;2r$W*F*o)XGvYz@#J!1vnscWtBPyCAHw0ckt>S|x|MFvJaF z_4{L27WazH(TUxHoGaw7PiA+U@Gkzi0z4V8_%{XAvBz0%__*B{fYvbh!%3K*j_lo` zHMTc*7ineF42ze=;U5rstS0hvkPjar7bhbe5D~(^JVij?8DOW5a3D0%@Yb>r_YD#* za0~wka$p&tMKRd#oB_aVhWv;kCxUk#EZ#m1l`KHXibNW;t(?Q3sL&fGu_U{!WC38 z?GgzCJ`itmJbtn2!Uw#<#})bU2^QCEc?4MI^Dg3rrc z^Ty$c_pq;<1OwQb8(-h3IUjz55~Xzk4j0?Mka@{-hEJ(Q+^M?u<)(n9XbK1=DIM%P zL#*(o`3|b+JeAS~q0a?0c8KaTuj34xuLT{%y5JV;GAm*nWA@@P$IbfCj40Po@Cn1Ul`S*U2G;E z7(Pj&P?3m@4*!iWF-iNiBvKlQotTL3MY7v0#A-f$sKGq3mHc~uZ!tg8!T!|s35=An z13~WCdrm~y_Wy~##~koqKf*!0N%-cryQ1* zin>6+Ra!K%UpBm(7ve-vux~N4FiUxBA;NE^ z9V><{6QoR$#FDVaKVah^RADKc6|mQQgoz{2nQyQ%y>T5;C}HpzTqF~A`3r@49+uM~ zE)r1d6VCJacU>sI+uGxO;-cw@iQq*m8>U-X1z3#aXcttWvY#&s_M^;lKbo^fptEyAwPn7e6j1~_tv%A*JIP8Q@?6Y< zK85ksCXCz>H=P9{u=ABg=Q&HUmOGayOc4JJxg5Rp~5)nMY({XWNsyh88?c6X_2{;$fs~P(TSp zP}A(gp?y&QIV8ivm`}&PlxeMY3xMDEQ5duQEOV0M)&}-AXJmRDwDAn?>Cx;x^aUAb~I9k~XwtU6}!Iv>F`U_o9iVtjhMf_67v1dTLSBJ`J@Hj{V(>wZ) zP@B_(yO2n^%ndkO8FlGHg<|cN&9BNHZGYnBuEzL`%|ORxZ{cKvm#ByGRm!sWYXoFn ze7&yWsi1KuSCdi_wQOZx;Hq1`PHDDVd+5is|JI3>X&RSw1N9zPCjpszQdXT(KXqTF%|1hOa$T;w(l4-- zjogq_SrnXX?!DvF`cA9mLb;2%Qs}13p1U3w$V{79&)v_~j&8o)sXx-1s!(a!rdj_V zSNo*0xA0oTM$uZmwU4Uz3o1lO&gbP6^Uj=3T&<%T-KMf2`=L=q92Rt=sCOh+F|^fc zxmWU~XAKgHi!IW~K>yU2r|wQz6Xrl(A?0TwLG;m!|wH$?4KQS z{6qCu-qv&Y$9{@@x)WwGdf6qmq?^i%cK>e@gE`ewp~6Tc_B49s<{?^$Q>UO3SHLgSKw+vaIhCvZQa{fb<&$<`p3 z(c@*(KGe*!~7`cU-N(rJ_1`j=eolGWYa9ACYSQk3!iyj|N)hkuMU#xjq%z8uh6 zd#w4T(dfS>n(FYSgX->R zy>kujaeARq4OTheNYVKd>#aso3wbq(?|iq~+3&Wqxcgjqs!(ZT)UJsALb)&-@9-fN z@+i50_|NyQW{ZEuVsq**oSvX|HtjaKg|sT!tC&Y!e->NhTETiPjAGj*>t`rjE#0$A z<7Y%#VJ^$;?j`EhAScg{F8;`q1C7qRV(o-dqu@^|Z zzIFA1$ipm#d}&4vvKZ?U{wK$v)g$3qaP?$sgh^0@N$qkB)n;>%))^_yxBnKVa-ZAl z#@d32LKy{4PC(NpWwTcvaXVw)@m|NdiUj;aqD@!d#giX>+jOd$@%o=`Eik?9az0=8 zIWE&KQuutzJV~w6+^evj*iQdsT)oe&rqSWizBj@#O1%5u`Lw$i`tB$9+^3GWN=-#w zaL;yA_K|N-avJz(pSj4y#haN%Y7SHEr3eE0nq6<8pW1KQs#cj_{)G5V6&d>3m$Kr{aa<3 z;+3!fv*UejK*~6$BKs9JhYs)*`x<|;-+`Qq$VWb11P^WcZ;CXhPl5YKk;unR>#!vj zq}g^5*e@Y3U}h6R*XuJBy9=us!der@pp%kxkFD>wVW0jm30kH60wZN8GQdb(tl*H! zI1+|v(L~fK4a^CV&mBws(1tuybmS`FY;!^Hr0D8%*eLTQPi!UTBPQHs7mtN+YlZDBg%Ln*VQ-Q659hq}P(GF_%f zPQP;#hK30pIyh#nu(`<96QHQbDdt0|QW0T9!$gJs63Cp0TEIvNKR@V2MnxFt10C64!XtJg&_Q+7WKz(%)*Z3S_CZH1Kx> zcsNSDmybE#6Ye{J0U|Jf{s0(PFLTY32<$>oAuDP)?P>FWM_wA=g^10*6e^;_s;w}8 zTrjZ&Uan6$5ln3M3uVO<*Y8|M2UZW+X=eEevM&fRvwXQo5-2g)S)vG7ZLVz)k=Cfst#tJOMfiEdWFK+VC{Lbdud= ztgokSGeEUwiaJ954FB_30Mru^@zqBU5$|dOdXlBh6s=>#VbKcHLB+_$Id;c+Bozq> zR!B{pLi~~!Xk+KOe>6$Sg5|iPce(JIwilwH-rvz z&JR~4R53;qZDxC3+eQJ%b=m4oBg<>;B z(Y^c|uK*mil>RwKimT%|GkB3?*BEw=|>*r8j5+l9wXj&*6J_oZU zWS9CkQOhg$)&hG1D2axA{jXiYDX(N|Tn~;WvXeB@I_*+CYKUUSbZjPU`$E9!Aes}btZ~|*HE{>##q7!kf}!2e z?>8K+TB#BX%9U`6Aw#GXN~=o!3&XD$PLP3y6*!2fP)Vrn6I3u4XeWt)Olu=4ZPJ3n z6~JiC^OZ;kXCIS*-XODgkutal_yxc$2F&*XNggLC{R32f3_zn(UMR|inIuaB93QXj z>K|4>Ytkv}E1BA@g0lm(3>i}_PqwcTkFH!|bB$LYLt8qRnPB%p>>NxuM;`RrXNc2s zhry%L>cb{zzZGhv(^_-^6v-T?B)(nX*E*4b)gzS46Wy^%3mBF_2I!)?4oK4JqyVM3 z!@t?d>){XmoRQZNH$%C`Z5*otj4#<0h?^2_?&Po{%)LItd&gP4S=#Ikf-)n{88b(d z?}MWs!Qc;NE)iQz@DI)m*V~K7b=b~Rr$dGNin}R|9nkeYJi1;2pAoZKyCATh11w8| zhfA<=7d~a3Xo$F~fFy2Nfafu+-R+*U;P`8ZwFXV{fCb{c*jA2fHI5Urm zkud-45oNiPilq6caFF&e?Gyko0GbG-jS4Evcnvt5Lcc_~X_2cwM%~*EV>&rN2w}Yh z%y~;D%*gO5yT$N)_xdny^dw95@tm-Gj=wDY%qf38C*gQ4aGl2?FH}S;%rpuG%x9k0 zbD#-KL_NpqEYa}c*JY4D0bm(e%|X!dx!|&c(u9N+^aaYvVLp&`RR-SvhR#Tvp_|W| z8=-w)w^BsEAPODdCt(W8Iov^)_{(oN`_iW@>DU7e$6-!2#Wn5+==TO|>EF%9wwrLb zC~uUhp8dln{lVOnnx6>kanH^oFu9ED12ZNM&3~ErK?Dmv{!kg^eJkLx6Y!qZeb3v_hlah+HTo zdzp`&1E_N>u!zyR9Z@3N%+$)IL(9&DI<119rf!8WG;{$mWvlXw*{JC>8k`xotLy*$NcC{qw zz2Uf4uHa$}QgCOG8{q(Kw$5B9Sr&JspW9_B38e*~~a7}1;V^G~}4XTD03 z2BE$jB&igx#1C_B%;_FEGeWf4h!{$!dyM}=<~SjSfwgBeej;e1adm?hv`BN~6*$Hf zc{>JCV-b{5;V4}2$qujJ7LL%KA;%si&%%2;Dp;Rk%a>hf?PoJuQUVT5Vfk$G4&`u+ z8Cqc}I644}wj;H|oAKgrOSr+F9uQa&=Z^`;M<}!*lEO`R(Fvlw;V{0CvCL7Dri9XD z%2!a*I|P66WUnI@KB^|UcI)nbd99X$bHby1=Ac1SZ5* z4ae#t(_)aE2UGNsqT~s-d`1}Q51aZsf_*8JudyK5Qa>YjXRIgGjbEnn5!4o=Z0U{J zcidZS!67=yzm&}nfPpJ`8?7ra@CK?{;WH)6rwQm)&4RbAj726ds8RP9mBNIjEX`W) zQ^UIi`m(xM$_Ob#8P}fxOAWKS1#8x!b1!(Q3p1cF3WXNCNyC)nH!E3jN^T=*E2G~! zt%lfn7@1W78j_i&W4EoqPEA3yn4Q1^USZ=(g?c9l(Ba5KlEMK&N+mbZ+-rrhzxH$? znHwZ%<=BLNPY+*KsRl+>eMP+4@V=(0qHybWw%rbfJZA06W zU9m@oFYr0fya18sGY%^RMlE4bs{(|GT!m#t?PwstrSr!JSlUCF4PxdWa~y3z@Qr{H z!`L>dd)9<9{;aUdXcqYSPjk#$zr#h%FqG~-4_CFmxail0N}mBSH;|yBgB!!+u7#2m z&a>Vu&}@k>4vV=p!^2R%Hx0KNZd@}#q12GBL?PEt{1SMx+|BVQec)b@@DyIGmL32r zBuJR!q}?a^>E)c$^Ak98w8CpG1eFC+QeVqZ6EshX{IF(pz5IPNUK?~BADf0_}1^H3jj zIB}k>wj8YOtH8^Ey(fv3*M$f)*>3Vex2nh1b|^L!N2Sb(d3tq6b2aK|9xWpXPW zVNHYYX9U)tVK0LF`G1=G<~w}c*n$`F%;#U?g)7!7-jmVAuDcEs7U-5De?c|J$ubz(r zk``e5jy7}1ds~VBtM1C9ek$DXnE$vN#g&-o)i*x1XoPP;g%eR6XGxQS!yrgg*G1! zMf8cb4Bz)6EhwSQTQy3vbPJ(r^p^glBXDgv7+0+mme9TyMefnwe7(@^Om3S0Dj)g6 ztkI9D=X}CNxaJ+iMtzR+*D;^x^$LxHyM{O+*n+Ril1alw1ub8-a!GAe-ffJim+ z3U(v^-52O?{jcomQ=ju zQoUm3sBVsw9Wp3)`)8wE;=SjsPti>RAAce@g>pjgIqQ=4e_X>g=>=JeiM+v+MXNpK zA7PFW(>DGcrl|@)MqW5~x$5#&UH|j92Q|A^Z#wYU_h+DM;xWt89Y5%{#eU$h?B$-5 zML0tJQ<~`&RH+K?hMgbqy8aEdor|YBEL1PvH6Jp2yJ`EZ&MaZ_u1a3(UL6npilP5i zo`%-dEV=!gHe|xl@<5g_UUFe5240~lDFt#Gbzy%>)jzXXfdo!qN(Wfe?PJoNYE!ku4q?MpyWWt-_Pus7nRh@dY{fT_~;-3%C zP!X?O!f*J3dXZZ@F$d%|A@$V{3!j7%+n$yVeRflws++}+vD@C;k9T!m@r_t#cxc0$ zwci(EqatcY%c(Y-U6t#0u4;KUmuNevdj#Yyt@gCPk($0R=@Ic@&x7w9Nkvc`}DX^e++vzoYOGiXrh1VA)@}S$FxV+=-}I$@ZSGM>u!(Qdgk8o zuA7=KwonWH&=o)@&YPNkrOyt?tavhYEfo)~@sl}?3Sd*$7YS;~@t=+ND<0jutZi+4 z?`H8d@#VZ#>)Nz~B+IuBN!6DG3RVb8R}z)lYA=?{j&cGE;*u%3gJ*rS@l|`jg+9|8 z`xsVSBch%Bd5nmXU_*=V4{q?9+G{(U;4OC=bTsmED52WDwRYS-o1j{1F_b`P>!|6f zSwH!8=I@!&`O=hFawamw?%Q)DZoSR89YWdCd$G$ZR8UG0EEh9o$;a%}G&k3JYs$ae za1Z_NnZcL1tr3%ajV0AOxOCbe8`Xzecj<8$C-C~tidD;6o1S~NK7MlRjjglRrP3FU zt8X5($~kcV-kbPQIUU89_vAL-9bJ7|5b#~&@jnV~>+kx<$)-yop>=x+oM2jV2jf;v zW6(@~$`P6EzZ#OCCo&4edcyw*Pn=|<4 z_=T(2F;DLs72^m8-`Dpv`|q1>{mRok`_rCYa>8GG7i<`7&rnUi znZ_r!-rySCBQ)RLE>Nv|dN5~5F?c-9h~5+$K9E^lx@cpR7INP+#C8XAApRv~{j|pu zuG(~9w#JFtEyFiLHaw-um)9!f;JIk&kDH#NFGkv$z1?`yzW$d+tkbF7pD*-$ZX`$- z1?+#f!$sTP=UD$ejRn~w_K)_=?(san#wX%fue;Bx*I<_F(p9BzZ}{sIH=SkY4j$8r zRF(;MQ}LNBOBgrrbK6y(Huu@QPouQGIM><5N4GKVp;ua=r9mUnZH}?_ zIUauP?n4fH6^oyJy-R6aBu6|TFzW*R0P4D=c0OeWtS+r5AgFR%!DaUPwx`wwbA+q^ zqjSxZgSwKU#W$Y>%Sh^F+&1lV{tC0H_#O#855n4`tBY*R(QVzXotA~Dc8NG!bZ>Bd%fAPw|OMO7Q{q@}@N281D zlFrF|T;n;oS9ed;_ge`d{0&dCEALrbzVfMBTFAl66K;ey!sIrOR_ph#4%b-BmKyzTKHc1& z5%oQe@Z~&cAHTeZDv~!<6F!O8qHAyT53I?|Es#x;{gw6R_^G-h`8UI#ZA0myZ@XO* z=-#Ww9#-lmj`vjk6OUHg^ft8!Gxthga4&(ba%E~DRzogNt`&ER}K{Y0+P3}th zk59{;kY97qd1AjPB|x|ZsoR0ZQ~;sSyj{0H^Z_IDZN8K9rt`Y*Rtk8 zb!pb_jq-lilU;qpa-)$cBGob}J9_kC%dO8pPN#o4SQR45fl2FH=xN=J+gYdEfVm6thDi>9p!4a=|xUV_RAHJqcQ%7qaC#}A* z=jFx_M2Yf=?e_mJ^n-~EKzW*ScSN|!1H$;+k-(n_3Wi8zH)?pe&ap~kwflKbh^W%82K9=^ShD{9U z`iqG;Lm^}Y!L%OeI>V7VM-5O6VV`xrKMQoj{2>$L1xOap1eRc^=|3{9(RZ8!j6uRh zR$RS|Os|+ED7E7@!-7GM>E%3_UM|=&N%>w6J#-aNzJ%&IN%+8TTk?G*vIn*Pk_GzW z52_O!^K=S`al1?e9`haK5LD48#Pc&G{K7$k0U?7wrBJ9h&c0d-6(BM1Ff5il>PQI5 zNqSV4n!MWpjoTg&x7SbU<=26N^+ShAkEn!Smgl8T9ZvLb64B&(mL16q`07JAqz z-X+6;-^i3LUi?`R5C$~XE~b1i8wYU1a?}X;aWRE*2EGWo?IU29pj$>3XfL*f-Y>Fv zUWU_2u&J~Fc$GxT>q9iwlMr41F6h@BcT*Y1Y?^;ywhFlzcl4!TRo)O3GQrkUljaB0 z?1;RJgzB0zseJxn1%)FGBOLw;NP7dp0m^=}Euaj7I&P6J?Rswkzz6R;>v^xd)1+ZL76O&&8UtfgW z4iZt@XN7`(2xgG@--xKApTx7&+h`e?BQpY>91FdB<~H%jmM)l+jht0SLgrz{TMMy9 z(gK@%aLtBCh?G+RZH%=Qk=YQ6%_oaZg;ZAF*R7*~;{y3>x9AIAoU^MNB$0uRkrA`D zI56eTVYCpW4TXL&1#B{*ycPQ&?61Yr0J!c(G?B_6-oS{=>_Kh|JARckYu70xEOFuV z*V#T3oR>c-EyJV(bR3^E*z_3)YQ?ZTiPn$$F)S-Un8lgKC|@aspEI~@bILA;BYq5g zacvnWf)v7JO?juFo@Ds%06Xw2hZ?rTW@sU|n7mK3)Rh^k_Z&5yOetbh8#>34)>$@k z16c|p82*Bn^7RI5&rVWEQ=}LlN_`8={7Fzg^atX!bBMJNYe+J&(7iGb(9laA=B>Zm z`+iX`;((a_WYTGRqjip?p$88<81*upwpwTTMG*dpcG-ZCqdzEnB)2ZNI3pa%oiQDCI&7rziDU#FC>>kg}OZ; zMIM;L*y}(BIh+lZ5@I$dJcLQ00|#(`+v+%Wx-P^$M@WB#xo8I#MrbZ|KWqBnec*#B z$zt$c9^QWg9qaWI%;7{Be^W9LpDKZ9Il~C+8a|(Z>fbQK+Ds1Wwa|XiHp`B|DBPnV z==#t`<4@r%Tq`Frn5M%ahPA^>AEY?{JQy9rY(xfE$&`gP8U%|{Ewtmzc-;Ou!B!r? z84U#%7rEyrS+{#$QO~jQBE<^5ntQn0-=vX30l%0aO|H;iGKZ0Wrv0!2>pFe2^3rg0SZD8_phq zU(8Pcv==}hUD&P%7^YpG%@Si+8&=+HB=v**DT?D-O7pQjQK48r;*mGVHm25#%85|^ zgkS@ml&R7hSbmEQc6%YLNx)B2uP!Bs_GuBorU>CrQ-Y2T>ejhC<1pnL1Gr2S`63}W z2}ENeTEWZ_&WG0=@;Jbn04T~4+e0XhQ$XD2FtQnrwkYpzUT4dK!|Nc*gv5G`>*f1Q z&;NJ=G>1G)L;#yI<-Q*_8SFOdty>*e0RbM*{yqu&DFb{0GRz<6J*lUY z++Y2Af&rLElm^$aT*q=a7qbBOV&8H8yhP=47nCL>Ck|6ZPl+}ooXvC8jcG*OaeAXP zEiT`}xbFu?a}mb$V?+jj*l%a4`zAnN0&alJn}Pw$Ze+aiKCwgAqHb)4{b8I_GRJ~z zD%Sz=E78GQHLZ}j6_p`*dP(yYk_Sx9)x2={3(E9)F#Qp1Z`IhpCc%Iy)YZi zt!Dt%Ys^IaJ2x<1J&k$nr=<{I4#0XakHPHxp#o6!bil+#$^01RJbeu3&eDd73JhY*9HoVa6ip&BnhZzF&QoZa_vs<$(Vw zGN6Mfh$d+OtRRM74nrBA;ix%*#e+szWfl_t$(~`oU{UXo#n(dpj?b|v4hP>5fsMn$ z>%orNsGA)N6#GxC4S5VvC}oP+8r(otLlx>0P#u^KP&f@29e55jH^BU#b1p!^G3f=% zXgrWUU;_fX{ju|&;zofxo14mUNjABuL25QI1k4!o0*L&5f@BKdWB^7d9T+_bQo04l zLR!E$IX!baAUg8k@!DO95Xn4B>B-&}!JUnoOY$uDVN={MnB@f%f5p|lA~It{5@)UAZyr(syDy@r7=g~o_S zzaXLj=o|xiMeq+IaNQJeps9w&p8@3upn&;9fW~VRuQys zjJf+8RWV|Zxq>oN2nr`9xf}-qfD6I0cI!5hha4Q+LH@zRr%1foi{tWxfEYd*EiEKA zOwxtlJbh%S13ED2KU1K39C+Jb0&NP`X*vS$d(2Ep&cnRFg!CLWaPTw+(9d^b!?b?k z(LWqq*tx=Lzw2WlcKC8D=x~Ky%;9b-=X6C>PIQBH%b|qP?@U&o|Lagu^2Irj7UCCb zJk6#y!L184-iP40nDDq$M4LC?;gD(S0asyqrbXjO6q~ZOT>=UlnGo0Q;B6NFHMCaR za#mumHB}ccQ%NurN-z=r93XaCVY($)IAJEXRuEnp2Gb(V{Nta8@5TdrtA7y>;A*Of z(WE?}@qu{4nN@r5D^TaAAm#cv@UU_K*6_9M!5{9QFQqm3is09nuqX=2FA#8-mdgDI z3E!~ddg@OKdIIxbxs$;)j=@9~?QIg{lw06J!Jq3T7QBkb~qyu%* zsEc^gQR6j#Ih4Poy4~_65O9#S>0yu|P7Yx7{(N#MF2BE5i}LyDkI8?eYhl-^0?YgN zj2m4p(Q;{~GFCQ)kDG|;#0aW(rX%V<5p?*7~%v+PD;oXdwOFuzwxb8(=MVl?^{}u25@IF<_r(P0?Pn10G0Eyd2 z4biv`&%if%9@RS!vOOEsMj;%^N9%f(+ zC(b>~hLo>SWmTo`?esN^J59J3#8&F2;v@-Mia6AmDarxKpoe1QU)Gp-Lit{$1XJ>9 zj{9PqCjQSGSj0Pe`k5pCt8~!=AizBQA7f2+8FXS%Z`rQd{T6oIGyPsL{bmek&M@h@y-o7vt}mR7>1xl?xJ zJWVEo&~R*yQ;7D8{c!i}te+>Tn>T}GbN36`9&Gr_yv97`!u0x|d46tIiABQV!g7xz6#1l^ z7NPmCLkB*-9(J1V8MPzp&=;elF7dM8pQ5HKd-}S`f89$7*1&W)r!N|3_f;wyvrETQ+9g{$9AR!ov9O{oG|FizbKHE}ce9G+?Q$z0imjq-5k= z`!o&T9UJpDa(&^)8O=1x(%uR(7oUIYM|;eHxq17mG7DJ9iG7#*aa+x9 zG}rz4>)gtJmc6bxcq4twwy94xy6*cjLo{H-Zs;-hgpFO|!p)wGLpFNs8>5XECPMe_ z&3G3y33)xM$c^2;CTNatOl0X=VckXjt&nq=y4gO1)Cmfo) zcXJnLd+l;~+eNM}UI*no7<{fR&n_S5JSilIQzYIN@0v(v#fv@v-p66jV`QNv*#~!X;x`t20BX*BG$ z3Yl^7Sxr<$QXus~;-{)It5u3-%8AmCa+>!f*F^ol3{g-HcHo!TuC;#c>ZQIunWx9J zm--!iS3C4w9Q@(rfBGeD%EuE8J2}Dctyb;093=hrqvl8A?V9GfGvoiF$i6%t%CX9>Hb@Ow`&t0jgwD1Fp*e} zXD1`_lQEOiw@;U|eJ@CSxp&Jmnq1F#u~QhuM?cE#_>;bk`>)0_u%i53BjmE)h0{Al zIUkyntvz#BYq*%}>Y1Ne^YLHLiAT)uHq}*_Ae6;-|0N&T|0d4;!47rHj%~eBMkh&5S#9&#lF3h3etT2@ zYBu^$Y|zQ{z;q}7H`H$l-E$;A^ZOpj|JgA4rEoBt)pN1?@8V1Ds-WuWGp9Ug4i(C) z&;Fo%^-gx5{pxCRm)TNe=D4r%ax>R?qw90l=eRn}Uv}Tg*!L0(34GAk$iJoUo#Pg> zV^!m^(T5kJ?!7WQnw$J7HhUuRzvI>~mTWDZE7&V{ea6Zy`f}vQkk|H&VP}Wm3^p&d z$^6!mx2-EqTsQOBJZ^vH-LyNdudh@aTa2l#BTY49@*mcVMVIGx%v#TFxhFKQYA@lEBN%M_)bYMa4i>a1zd?M~a#I#itu#JACJ%^H(gxM4H<*EH^M{nI}nsMc%KTQ4c zCWOsO<}7)C@Mgl412)O47Zhjih{6?qX_57-RPm_0#Yi++%_wa^I0q%oby1n=C zalr;NoiSf~M&0J9>+F3w_f5CUuWh{_NYTem*YFPgQ7?#D`{L$;?Y!l^>k3Ki{0Vup z?0p|iE8H}F`I-wSw=_CDzdrTc`_G3-hmWr--4*8R^zv4Mg~MuX^Xv`OKjU*;|DRh< z*qCQj88+s~?AkZ|Nb1npXuAfo@63oA!3y&I(|>v;tc+e1(3ibCMnDe!?fZKf-40CU$J&^t`htVcKftR?V8q_keiEKOb#AfG|ZrxN@aoL zpCHJ{Z%o+olceEPT^^GraOArUT&q9-u(ED?FB|f|4A%wBs%spxiy4+d}{{n^N$*$a{V7Zmd4 z8|bu42C4ZwV>L;hj8_aJQAaoL?LdMSjJf~dVgH;>5>vdz%CnB5->ib zf?r*Rc|MY;NATYhclCn0qrgthT(HD+YA!U(&4}-0P%JrZvRhACax|%FFvB%a z`FPIXVZ_#mU;M4^eSp;~j2J>EWaT4tyciOe8F6k~a-^e`X#r~erB4_up}AvVsR)#D*(+lPdLAMJy1T4fCp{ zV7Jw*9?(YD8f#>pPa$5PF|-bf>gOF$lhRtyu3U&28{Jd@;T&35ukrn%#6`54M!s;N zgJ}l-Lf8rJQBM$_2dR#GQTwX}oUToD?V88<`NnXKGB`GN`mP0CbFwL?P}2=`Jq>#9 zNjwPNo(M~Lq_h&}LRl&U5W}Jc_Jm}-0}YIwQ;;aIx}_VtZQHhOyLa2RZQHhO+qP}n zw)^h7RWozu?IbUG_$!sCq>`+)zWJN3aA9qDo=7Y)_!a{CNp#);8Y@GyZO$TJ=!7UO zF4Tx#L{&gp^GeJBsXgy?>)NrUQ;&4#_Nj|pB2L+@$#R*Cf3o!ds?#oT>w)jK+yyW$vtaR)~qkZ zP%?9c)b<3FIR^bVnC8Occ75W^PT)!#`4;=75Fh!3UttgGo64a92PWI+)4Z4Z`6_!=#bI(t4i%g*fCUsQHucmC*>o zKnLZ{lP{$bn5hxQqgEwtk3|&=nwLFV*=)lFEyQN{s!Fp8G7Zk16=GM45lJs{j#l&% z5;1S)cA1jGR8o`pH6Nvcn>$)4U?{J-HnpOT5oXzgtOx zBgA(teNlqa&aK6Av0!Q5i={^r{xI03?oS+ z*$gH`FsPBdqzGYn4>HCpQ|zjT&^g_^EEED_Gmo!dsek`ux4dcBr-&r$WbGB9SUO>B z#M~5`M2?5~_6r9+A;ezzDK~O!2PXpLAN1}l&U)ztKFpuM=ZH+qL7a|X;o5MU8O&V0 z{tE>A3kyJ03y*aeJ9g)DFmz(uP-z$uCU$qpMbgk@2~7D+0UGxkx1asbnNQ^t&ksor z8Rzew>nfIJ_1k^lS3}_jX5<~-n5e8DwZ07QogYZskdM^Q^p;bdDqs;{Pgf=0z}O6J za-u&uT!QEdUm5yEW6aRn@i$|V=7u85@11_h6K_HcRzEVOuq`(xZY);maGw>&W9=c zIn$@Al2>|*4n;{ShoULh`xr?api*6sX_z{%^p3iMgN_0zhEehzp@K%RUxeb5mx)_&Is1 zv^`d|Or*+AK?6J(do`fRg~pqjyro$27!UKdO=@Udc2PyAb_#Lmjw-(ypf?KA%xH_# z&1@F&LSC{Rq;4#xzk!;3X@hn13eWV~ce z{vP_ug2Y%~0Qj5%h|hLAEG;M$rq!yR3Q#e#mgm~t_+vG7`1+lt9%fw(KrpU3#_>~G z`Nm{=19F0qDCYqgGecB^`Ek%MtlEK@;5qRgY=#OkZ>LV{iGP(^jn#Alg4HrE3)4&G z!tYemu}0+4H+{Q3DZtG!JTLz9SB+d{QYA(S8I5ON_n@S@6eMXHVTz}-R5veuRZHk- z3i5Ja9D;(2kRrpkC{9ZE5P7CL+XKL{x>~XAjG+CeyiXI(tz|FtU6|B6{EpTz04^sA z#y8%xk#_Ed0bZj;?S(fpB#_?SI>Obl*=~b!WFfy9n!w^_&;G;CeDiFX?SOus@k2^| zKNYsKVQY8Ln=67B8g>$urk9el#n7877+i{7<2f+HQXP8v8U`)9Gjf?l5i6=5igqtX z`N*|;aL3pZT;QSuK3oRXnTA?8)bfxv)B}5W5Q}TUc;{GzUYcu>SVeJQFtHY_t!LQA z*J$_Y*CGOU$nHjCRRs(;MLZ;z`uIjYM{0%sy#UgMV&Rky9Z+s0{RB0F^&CMp9P5XO z%6Xck2KzNGCAi(Zlp*$U?v|F(C#eiO!*AV1zW8Ag(nt)X03Z7`fL;6ry=Y|Q9~a$h zBe%{eH_T|pOF*C@8>}rxvsuPqx7=l_&T9ctcY17}Pa%{4vq2+)q2J05Z^{oZtry0@})o(Q(PdUOzt%DV2qsMm1IS=R{d73l#~ z%YG>|qMz_x?)hjI$2Fvakn=R^gLQ`!)1d6+p*s)GNq5)=GpT;N#*g$C6E!xXNK$(; zlgW3Re>z(EPFgUFQ|y&Jd`Qr8*@uo^D5J*hh5?RJ!b+m^5%BcwgKh0nA6 zt_?@dOJz-u<--HonBvd2H^$S)g5FHGgrw|c;Xj=~wGboS8|G*@C^8LGlQ>xmQJKa= zbuU*|-Qn*tN3=4vyGr(-$fR1!8ym!}f+Bh#RAyDDcc%*WfL(m3#XrFi4Opgg_UVs) zMgp;d8ec2mpMES*9EK7NkT$Flo@iNC9-G8WIEDgZG!ro*sQdG0sJQEQX`vn8Y~ zC5DRgt~OFR5r_hF#e6z~qMM0?-j`aW7A{{g$h0;b z5qL~w;##)eAG8Q_2VmU9Y$CLmkOPcgVvs7OC1nKR;fBnp!uqV{Zm z7NPv8+sh2MLyoW&BLLG7g0K~Q1}=M618srmd%96)y~+%Xlx3Q z@I&8?3Z<8Xp0c3?W=Sq8(1n&?zJLBbNiBHzcEny4Ob`71z^Wt?WT;At z-hr#Q1}~zeIcd*wo*e0InwUc+0ibZ^46E@*W_%i+D+5}ZqS%=p1;lH6*4l0# zTFp(BIQ_WZV$K^qm|h!@!^*_i=jVGSy1-7FbKBSJy{v8-KrZ^!BA)#H0D}nI>&}YD z*%JPEF*esUP1pAr1BF@=Yoy>b=aidqK@!MC(cg9#DMZJqU%3B2`m+s2!up&N0DzI^ zKchbx>F8zB+?9}4KYvZp$3&vH$Sn>9Nj0qOE6b^r8Pmz}q%@oBL5f$5E6U7J6f1#3 z;-Ug2mp9C+6;{j2!Xo6A3dFPVDGSWB_+1JJ@ud(Uh~u6|Uwd~s9B0!VPjWnSxMm%9 zXD_|K=f24U{t$v6#7bxQ;eYM4atXl;Z*mRTNI#kV-Uj|64*7^Os=2Bl{ZV;vt<@Rn zChKLtyPFT>^Q!mZWJF32VP7Fp`EGc-?$LjxtKspsp-IE{OsA*volh@=?e9}vMcJM5 zWHBBnZ}uj=imi~~GLm-FWW$z7V`(*68$pR|-E}8|ll>|zv)YTln;l4*_QZIvFQmQR zT5vBY7bSW(Ecd+8jR_oh8)SlaH`e&&vZCw1+OwJN4T zsY6n2!F0U@GA8+g`Y)ka-hzIk3>TxM-qljha{)eip&3HiKE)BpQfx30H<-|{X8F%h z@Wxq;xHF3?AadLN_~ocb@XS}NuBEGi5ux~nB(WhK;9OU(is6C&=ril9wl+5t{)t+= zj-qSZ?WBc|g{l|*U(3`TluMVoP|G45VG$70Em8|wr}*FWV$v`-{#X#r{k+1vun9|E z?k-_O=M?($^yqs-cS>$+(4_Ua)jVTX8s|8;FekYPi9JR>Qp=|TmUsS`N3!G>zbBF) zFHUAIzgN7wh%ncE7}~3Gg}$VUr2`&o1rabrTa%SO4oEhKLRc*>)m3Iayu zZ+;QuLBZs+5H)WNY_;Jz(~~`l#5ZxOD!0rpx*e=E4-vG(TLZq?J}e^?o07{QG0cs? z5KrjS@S;^etHhsj{N9qN`E34ozXe0?;ujMbl~n@yeu~{8(J;41du=~SIcaf-9HN+B9 zL#~JzTm)>CdW;SvQFGfj_)n($A24o5z(cW)2f(PQjads_N*8JZNA~rsA21=ye(mv+ zhCO_*3j`1jG9oZm!!@=EZ;p^AnVpQ6`M(PBU+_NL=8P*9Wsso1&~~lKjHRRsBQ9{6 z3pWL8k|WWdYzOMvAs(b7{ZR!w0k)TWFM+ZiLTKJ9QRM5Z>Y=-hk@)`TqwO9;JZv^?#CN& zzBz_nH_~}=ONI%OD9dfGI&B1Tb^zJi>F;6`xdg(^z`vEzZ;Y&3^X|Bd_Ubg^n3F4z zh3Tq7^hFG&o#T!cf5;$uL3ywFvsBlw@5EW!j!RrBm_5O#1B~2hQXQ$_o^A)L9nm>A z=cjKw>i=;Mc}z=|>`Y z?aXCdssk+s#Ik}te?tx}`(`ljy1}*$Q%U=GXqAsqO4u+K=&#}x&lX-3-!s)9D zqU&;oh;;CMkvcT$l?e_t=P2n7Txe1jgc7l5rX7k;ggezi z`6(q0wgKRh;=&&=v_pcdxx2e&AR%!y`v=I6`BUvwAe>tBdFto@OPiT|lLJ+XFg=st zWTcX?_L?zZS+@ej$oHtRx>oX4SQ$xj>tvV=z=(}y0yZHi6YEH;P|dpn?rGr7`>k5D zO4KqVEewJsob{+Sh-5;sXB_Q{6eZ4y#FM#ye*f59ibg2ine0qf%dm`Vn17(H_pLn}52-z$cT!e&cqS&km7@))%W zstk$r1aDu5$ootk{A0+mGIuT&g9bTNxTZuiY6D+z(Kl(oqUqBFZ<|Oj`+vzw6+_Bb z4md$c*Y4jJ1{TUa62LxIOP#sfwpDWe3!YHwdbW`SCu1Nlh-|V_VGVo)mvx^ zWbX|D-^!|pKiR(w{a7l>V>|Q>Uti;wZHY!vhh|c?8kQarX)Uy}^C-;Ie|NMiMqzDb zum-^w&9f~;V;|4d+Y-w(Z~ez}MohI{UgaoK){!jOBbkKRy2%!^vW=7CxK=0%ylOR; zjbK3@@u549>HF4}0A_`M8>gbjq6c^Bs{^poUG8E|pm7_NYFmgb{|SAL9JF*3fB{)N{QPko%ff`ZfR`SCyV!?aXQJ`5&*G#f6zhAM zYUV1SLwJ-;KyxKr*tkR-=9K%JE{2-hIuW%AZuxdeul5FFiuJ#(igcd^-LoF$0dbFk ztQl}nYg<_1-vvgP`r;;c9W4fLlcF0i(yZyiapLK3#0i&wui!T6oXQ+?Jp}awMvi#g z<{a}A`i>X0*u!_*BIlofVI|YZKU$Ge*tfw0AG>=Ol=PJ-M2vw7$Q>-GA=iQk#WOFr z`Vt+GvD-5lKICv$or?iHs$n@*eW^_nW2EJe5LNg`h(1fC;Xf}2owfEg>T*|wy5&s_ zQulJDExid|vE4TXy*CMjJZn5$7e;D$))vnNyTDgE1w%^k{&(+zxZcO8qG{l;(HGbuKaaaOxHrmpG5pwL52w;Ydi_**m!#61 z^c_f1a`!p5XR{FB2(g|Q%Doa5>v$Tp0uHR|bH02k%BweC(3o+U91h@OelPr1>LK^RWb1|5n z5#Q{EVit&(C`o2r7CGWY^c?|XKYEX7hFctWV}IXHAnB`T1~{(x9f!rirrIHMz#P~p zqNeFCgHn<5&JyD(522`0V{Oqibpto)y|Ve&K=bTt7oWrc$cnRVf=(R>=JyPK*Ga=k z@@UN@sREaop6%^Qkuseg{~-@qm;;z})=uITcDz5;Q+6TVGJS@k-Rp*gc2&$9tb{t7 z6{b{!zq?8>wnf03yURPF8ad}Xjxg=E6ROHbQaWLTHoOzL)EI%~R6CoJfD)#s?gqzkI}D1x^2)@|Py*f3*VZ#w?0_sBjN0GOI_nOF+) z*?QCMKfmQFW~gL97#0n6$PiQ-&meA`?#u);M@#dNn_=+!-TRsdo|*#z&V%$+d~ z4}658r{qE;7Q9ka=?+{TQWWA-tP@=&+?bF4gqGrYP>;diACI?PMgAn*5UOOF3EcM3 zs}GH-VYMs(Z%|;*T}E>8$18LnW9QqJoC~p<#H4m*go#xLETw+6 zFC(DHQWxN6zUTB<^ON@J9M#Q?vdp)YM2UDHi(7T)LnY_pn(P0_C!hq}&&8@ABi9}C zKTFz`gLV9ZL}qU+`)`dPz*2m4D|{DAvVoyJm-xm4BTNTx;_Zl}987z*Wm)3iLtLrZ zGYeiToh~kXSneS&Mv3~*Q+=bHh6?Vm zgqVp-y0@6K`y}_u*JHQlUm+Y zRqkE&JsEof)$MkNydNNJQJiA-uUeahXMR0_f`2K7D=|<_<3?-=$bH{aoN^U6c$~Pd z$!pJ!MK~mv+|yd*LR87t-H=4!z+Qo$ji8^v>pV5Q@JMMp^CGB`;kGU*Za_TWb+GS@ z^A0w)l<{8_m6iHT!G_l(V(ofTqi`}gTHM7BJlE-ec;-=#f<32vpdK@*oC#9?88AHb zNSg-P4pD%T(JXS!BOe*H>Hns>C+=Fj%-^rIP1n?`%l@!*qcjk!0=ncm^B%%>H1BoM zw;b@siU_M3yAPidn?$z}PEYXINwu7YFWS_@uSJC(tZN#rm#AAEf1v|>S$(EvDFmz< zs?(GW@FGabJyziW|WNSmIUQ4U=$#m?#L~Bn|>zi-I zkajy-{zV+agh$g0(I`0hcMiU6l4`Ln#v1+&-DFcsm*ZaHX)HkGf-03!xRk9rA6=y# z8hkWQias}*;vokVxM1HP#cSn@Z^egVldY7Z-R!wb51@l>0i1=I6DpKil^ff^^)RJ!5#7214B#X+D-q*-p*U(6cq99Y7<|@S?J*H( zf`${BnsNuJEsMX|jq&(qFGH+Sy{{3Esw)J0D{cf=1WiarW!lml#Fo=ghj&vk*alK! z>3MDX<=>CKWJSzk<$=W@kY(v17TyUvI2A@7-|jxLCvvmL`=P(3@Tr6HZT=xk^-usf zJpv1$uW5C9%fMQPZL)h~^13n3MiFuTYEs(kPH6qCwcAHAjtnZ!t8?vIf>Q zeQk6QJ=V}$V)gNRTgFBwG9l*s9d7d!llQobeU|ys^2?LBrt~zM6_R}j#laL$E*xPL zyWK%`d8!fYeOos$3GrEI*rFy_bG%K9)Vjo@j<@J5uznmwgJmda*dv{pp28!fzb^v= z0~5U&Tx490HMR=9!J%gg(1G(FJo;W-AcsEo2-k(?MrZkSbp~A6v;OeFKlL=8D293g zdUd6U!D;e3_9|fOQ1DNVAJ0X)-`i!?_*O>xZeX)MmbO06w-htQXGlBN`Q3XJ-`pOP zH^HPCXnLJ<7gnre&YY~?*u-o?kkpT3eGpG8GuDS^U~u87>I8khJ%8NO7^$iWiCB0Onl+Py;cD+7CAIN9w_ZzH z?4AAmI=?_8kPAx~{O=L}Q0)6zdlyKg&Lh;N=<4^TcD7@V#(|qzvtSygPnMSt^e6R| z;50Wdyn)T;qT578_R{E!tNe z;=PjZ^K~EcTXu#ct%{h@caLERvDdz8!3{@~epGp03$F)77iJg;jV(}ydkbe?KJ=v|>&-Tti=x=uto#5cdRt_(g~_}U)?-)16(Vwzxz zSOtki770fIz^vjTY&#_`mxwT)1w(p-f?kG`1!{qM{7P7SUL@2${fZjc*tcaUm-YBW z+J|s$Ow4cb;&cCWs8%cHW5MSE)2K$(VE>LkmU8B3J#5@(10AX6sW?E+gdfqFco0qXxnSq<6loW+96X~a01tk<+eBHrSZ(ONNU}4>yf=K zLaHew&1 z%WQoneGdC?YxV0CpP0!)OIx8k^Zm z(ZfF^I2)z5=ybwbYJE6zvSyTh+n=D6>%gL4=JfU{KIikeXo^hcoQuYDzm)sB_@I`y z0G9cGCsE6r&Vy)?Vm#yk#FFT9X*Lk#4B!0VI#P-Ln*2V^0b51c@|C>?T%zsGtoaif zVkIi$%zw4LKxN*s%f|hePz?pM;Vm>Ud4 zr2K${_8{j^*)~h;Ne&{ptXZ4C&NozKtu(=FCd_LNLpY?O zR=Jco>fr_|$uji2^Cryf>1rLgb^fb+Q|W$dXptqdMW%;kZ`nJF-cU&@P>-V4J$4?A zv^FsP6VL)6-Gg|74}d-|b?3xkXXc;$zje3oTbT^mA@VkhO|Xn8KJ{z*Y1hSwNdw{3FI)mGo=9I{Y zZX#URtit1!!@#*SqY^SSXIz3tU!Rd=Y7=wax&v=ab;VoO0g&reKlgEkZCh9q9OyQy z874;v(_sAOg-b^$Dta^rQ4#|`l9pI4$65_ze9Eu#{fhhBGy-G*R41Eha7@A-8Upe% zXqDa!YsERWal3dkB82y2^-$@Pb6=dvymPP7EnavhE^|;gYB~U9UfSvGhd=1w6_$BB zAe`qX<%EWZ99V)B?hohL(@_%ySC=Mrk|)J!tQxdEZwj7s-%HxYPk7QC0%(p#QBr)6}A4o+)jc0R42LP ziD_ZPaQxU;qF>=?sGz-c#>=q+Yrt~`y#7RkE743?dzW0a0*=3LOWxsQrCp^=$IDY# z=^FBMZOFtPtckCz!Y@Qz6yKLxQQtywNi5{q-|nIQQ`Msb`xZSnu4k`Jm7*QiZfmxA zq7=I;0F0FCGN~OLSkO2(@Dmt!aq+yHkU?Vo^MOu=$w9t_JAiemQTN?`ody$2|NNC% zg#-;b-9ev}b$hN;s;wji6AGx{yqmm?A|_1MZ^Ik-DvCA@Q)0fFz~K)FQ6Fq|gRvOb z{FJwVD)c^cylvJO2youPKQJz|v&ZzM0kCb4$V+AQro>5vpW9jEX_bhmM-*qM1Tmy2aZu5xRqjk_w1^hN=gCoS7J)b9F<+O17PfvM+hUi+v@JRm7Bs-3Xa=ZZ3CCPE{PPt` z752WynNH-o-5A0jXH*19a=>vQP9U_C1H~zy43^tR$0k?Y zZzWoG-C2m&4)ZIw8tjP^cCKhV>!WS+fD&%5WNPuflY+Wum4X`zTXl^w7z3xVv1=oT zoAEjrLcVR#;qdET#oUo`G7$YOt`Kws&Nk=xX<{#Qb`c)v| zmdYC1&O!1JU>tJSRnf37Up8`{){J}`8lgW>Hr0*>-k8wF$hXQ=Dscg~*`O3;Ef)fK zHcyx+w+uBsJn@m#8!3lHZfN>PngOk@2ss6z-E;gtaI-8KIgNDuS@;HganpL*2G)$_ zfnptVl>!i<3PHBoCF?ZOf8l6UHP9yQ7j5fSWiJI}eP<$2$yo4WRWefc2F$qS^t1b4 zcd618F0^Al;b{9-27*AHnnUlc?&cbU3!+>E?qMVzkxCW=s;Pg4&8ZQGjH{D^u1S`V z^jbltIduYP24bBhRe!Gdqba$oB-)--K7^tU+2r(_W};vM_^z%lRWB4GYPvS&DPbpT zO>=r%^xCc0IL$aENc;V>&6Y^HtFr4U;yCMG&Z2G{eV{UCgjB4IEveFAwg<+m6Fq|* zv0(Ui$O<6)bkUG8EddgL6EV1zAjSBkcAn?eYqe9%FoUFhgt7cfj!gL2mCHXHR*G3E zjxL4tLjuV3&eEi8>e>TI^4|OXp2n%dAU<)!AI1O-E^SCUUr4 zuN8L8YZc$_8DtFB`8Z}Np-A|!}_7aJM_f8Tq!u4}Kr;=2=jVs{W_qO3WYX#SaG zwX_f$FLzYQPDMwtXE|TI-4=I!r`(XZUy6oO;!(byRK}|@3`s#h7=qOsPrkUnobYmV z`_k>EFRTQ%`BlbV@s_V2lh^BMn}SGyZT)H+^Lk293w@vFY)l>uyu7(A*vwE&&izX5 zG&`T@)zA2GBcD;o9ewTD3T*X1wgU#lK&?aC*sHsLEvVj}8LHIuh@7ilP}{1GSP-Tq z+PMCbO!#+3BRoilxy>=rvuGJ~zz%9jM#EHH_kDdhM7vz|q)w=u@9fzAEE;>}=Hg>U zF{p2P5UV8SU4!Z=Q}eeR_@|m|`4?h`c=ePKx(=&3ME^;zrGG*9xHNhZsj36pEKN%O zJN#}0_2`nSzy-zELKfh?pXmTNQ!mB0ruSjoDJO%k(*N8K^MqU55&RE#Z%P<(i-Zx+ zu9+`9Q#WA!mM1K!L`C2`Vhq&dLC*JhK;kAL5U(8|p3CeVP{e`VVqFqds#S*eP+7N| zyzvZl1K{&T9ByKO&HaQucfCLcx}QtSXi5$?X-%KSq}fl0Tem{sJ-DxTUB0pI*0}g2 zU1wB*lwGoM+09{+fUa6E|K~VUr_Eo!dNJmya`5sbKp5+ z(qp2C2N#n)Antky#|Hy29+YU4p)S=CNSvYKY|hXv@AgEKj~td3ezjyd?s!&%eybP# zarc7w!F{%mbR5W!T&Q<(Lhaoj`vg?`_U+R=-(B>s6K5QR9g00%WHD#McGVF-O!RPz3&g)OAXA8@%yVwZ|2^<8HYh@3fmy(#@Xv7JyiXUz-JG0!`15wb z04?(!yb#>{Lb$G-Tz|+$&JGd_FJT(%DUGt`qv4^3$lDS)KX4#qYv=95R8mZ#o~DSt zdD%}|;nrTgrcGw(Hez;2yp1OyXa@G3w#Ns?H6{Gv2;UZOY)xro5G}BzsVuzI$w}HO zbjIAS0Rj&Bu87=FFlrY>vi|1Wa1(N?3T7TWBAbCmQuD?}Sf%{|gF8~BHKn=3K09gj z6X7NP5k_YYY|x1X_a*MccNYf+sV*w8<0uY=>TLE4;tFa`CJU{HO9rG-aIXElS%#Um zyoX$)dy`^QWy}aNygYi}v?VN=O@pfQ0NyKWJc-V^?(bvKztZ%PP4FfW+n;V7hG)9s zmMK5y1#sheO-!*qsdRa2XNqSde85jc*Rl>`QN)xIcbh=ScAu+X{ z*W8Lt0E@4mm00gaz&SxUL+5UJzLAVOe7vGJ?XpW=Gt;57Jh!5imi>p5zK$Tj0!7>` z5;E3>?oQquf4BfKwKUZ7jcx@iBh$}VtmGqb$u8gO*)j;7rqyt*{pkE;2s;FV@TBIA zNr*)D6`$7NYd?C~9)!8C>W0`0VYVLTJGG38(z{@|dXSBq7^HRhY(^aUkM=#89tc*a zkfDU9wc+5wKDHj9c2)q!Cxgyy`AwOD4P;UCYja5#vYPaXLKZa$xkn3drvz%R%o*>p z#Q`V0H-t+sh6?Z~bei%Az;GdsSjmMJG&r)Ve(epg1T+CobrHD9#y`M$+o38k`{Pa% zqC$Wme1|J0i)Qt#?kilk!8~&!jV0F!2(^|i5j;Ol5I=JuTnv5w?vr44pD;jtRuFDutI}rOmP3 zK72IKN7@-7gm%)P*2*cMaT{S}^j_3qi&hurp> zEW>TBJw4=+%?t8ueGBw?i-m!HP7slkd>+Q1tMAHB+uvq6D3KRoWZcq7v^2Js?f<8VwVGXgZ#Ki->DpJgHoRqh%%(@-~gnmul1PB-|mw z(cxu1F}&s$uPirRcf##DhqQr;{X?VMy5qCDl*#Vxj7g5^_vh4(|fLU{^)!Tr9;#=jmTzL*$!1dzN0K%W8AH zOQ;4Uyd^Zn^3J4nU-lMO-+-muXiI8db1t#uLd714-F4TGkLyd-t)WPRV;FnKW}+k~ zoX0dJn8!~toUsa+5Qj;nbNn-Snmh#XKu-f;dK&fdlUT=SZj8IyD_?RKt#264^=hjt6&z1^JQOVFB@j@B|UvnBZW^Ko7@JKQWDqzP{^yokKo|IDDoQgjs*A89Oa0hC5Yi$hrR6&4X{HjR^p`?n08 z>7^KoyJgDh4G>##u-1+Bbc~*8zpK2pz#pVfSZ&PTsGg@y26@%A$=bDdRq{zhmX!}AaBh={$dau zhJTm3SKvwp0l?6NI6rS1plzUOz%0cg0m_W6T73_s4rM;(x8)U|I4dw#{Tlu_s)P23 z|7mc50GW?#J@?o9>9Lv;#5B1O{(~r5{LKc#Oslx}&|Iu1=^;QRjBa}7`)4}@o#K;$ zp85?vXnYUS#`>jta0VuEw`N}A+b)O1KBS#m#hPBdPtVUEqb!(bL+f?NqVyDr*;I(6 zrm?IS40%mR+9T9Id$>;}Hzz+$=9sVF&RGSc(v^(}d`lFaiT3e@=mS7*YS0G$P)@4O z0wzFdoI#PaU+S`m8C3Ye+}~szbPEMGa8aMy6%z24++#f<$%X#wqy#~t!n;)$3R{am!WKFBt#o)I^K~$Se!-gnWrL>Z#RF#`=byJE zGZbP}20;^bRTe3i`jgRin7g^&Cp0dLP za}bJWD1aBg&nEh8OJycICg|XSExkvfIEl)&AO2Z{JgdLb@FFJRn^gGI2;^8?#fT~5 zvyrT3FTzKlM-Si|W?;pwb?w3>t=$=nW_t@LW6Hyhg8g*+dLryl*RxaeDjTe8>3~ll z_UMFBJqL2+Rk6w%{!L!edr$f$?0frvug+N(ZW!3%;yRh3ai28_YoH0|mK99Ib=mj8 zwKe-Us3U`3DgHI^sF4Y~xp zk{qejJpcQW<wL(Q)iU5mGr+NV z>_X2r2BIpADzcwgBj+S2HVs4s5RqXTau+_N^$Mdh!hKhq#OvkSN?dEiCXAAv<=Gz1Pn=D;fOt*__U70rAMoCs9{eO>r4Tf>C5 zU!^|s+8cF!cNkhO{aNU*l@@oF8Un8|2?T=<=-?XKxL8*7s;WvsITDKg4UH_}Gzj~} zD6NYM#o9AB3De;dhw_M!`xHzmkmoHh*Ck2Rr;E@0@8T%uociRG%-SIb(ML_M5Q&b% zhc4GFo^uH}n7Ymlyml{Zu!K!y1hFHuXTpy)d8d%3)y6vs%Lkz`6`%Wez;JGE!~eaN zpR^>vU&Cw*@eTE>bl-?`iX4XCGm~Me2ImVf%XAbk5O52S1X9J-BXZ#Yq8n=8l7{~L zHoQrGq>tF}YMSo`8Gw6XY|`ii8a^PZk9sLP0{l=>>D2ZYU^?dpTa!5SLEIE1 zaaW*LM{wOi1B=Kc#4{u+&k^3%j{LT5{N;iqRN8APG+K_AW;T;bWKsnGC=QLbkC**6 z0aJqjVT2?#0O|!yQT^0-X0XVmNs#F@(K`K@pSrH6_W*_99KR`uSX5h18N=zG~5K$>)u->t8qYBm5NjA%{GFNYZ>hAM3^U~b0Zh~h$IZr%i9KcM+LM%Nw9ugdyM zweiiHmtB*ayUfEyO^{quF4~PmD!f}-a2-4M?f&NS3VQL0&$M;4-{0MyyHvS!7;D#T zlD+Ecv+C6KX6DY`g)X}<0rtu(X1RKcYxYOA60k~)J!HOal!5xrH;))sypPuh&$qj& zR^7AiKlio+nZn&?t@A17J}Rm&lBg(_k-Fh-^G9OEI(!OGrcN6F0Bwg%<9DzQUVnve zG$5XrIwwz1A%}G~4v+#QKZTL*dgh~sv6`najMH447D zOkwWt6TiF}q?2*;#&qyk(_B3X-)&28p4{T@kyo|FC%}`C>CK+M)%{gX2TsKQlXK_J z!Bi>3Ru|~*c9n-?4!W-Uq#uk9kZ{P<>LWY1iHm52w_o)aB>t_lYhQuy~8^jvtE-VbE@Rpm9w5^WEnpw6hWo^div)^7gz}G`NU4||IK9~_qs^Q zNopKNnhS3OcgRuP>8G$o;?wEHLc4Vo3&gkGa;50j;SBMK*#moO!vFI+m{NDjv&sn1 zWdO}4Xemdv9S^?$RUH~nI1Xr;Ky1mBwo?kK@VcU+>;B*f zv0xQ;5-DfW5Bl-x_Pav)b+6rss`r=B9OUi=23v4UmPfV<#;RR#=BA^^f*|28fcdvL zvj^U^XjtOQnV)bwLthH0{$5^YDU5$7|K*LoIVeEvtc{J>%WC%K-W5>)uq${1|2kA> zv1({1f}gVGP4JO8CKqfrG%I*DM7~C)wWNbT{?Z>x%kj{iQiM2y%LZmgZwTqyD(&Y6 z#TFATP4K)7?FlwpBaNOSBF*eEuwSd7v;duuBqU|M8`C*Qx(A3Fa5rdk|JEZ-k&)vp zs3Vw@`Wz5#=Q4C31u;APAzhAvi}VLD*Ef(afmsnQok!&|A3|F{+SnN_9SJYm&uLlO z1;DIk5f&#^rbt)7ktLIHKQlkY+{5Ue{$5sC!Zzfko;G+m{Q5I+X@T{Z!ly5?E)(KL zn4rVqSw>1PVA}vLLoTyyT!;n^yMGhNL9i%|;Dt6|Ur^jCnnk6JqHq0x5L~Ff8j9{@ zSoH(fCgGYxa8e*g88UkgK5hgXyotzHGS!f38no7Fz_~j?9u9=P08ek1RXs+9=NuOs>z!tLa~J&bX>%{qhb(QBzZ5hh>klgV0#|t~InnH{3GkBu z#zpJS^kH;JYq0;Ql)aGK2|3R%;MzLuP$)JRZKS>pSVCO2xA*s2=N^JFvN%BB9NUE8 zS&qS#f|BEAG8pf+uQ1UMQIJ(SbkLeupp4mIgLbEhFjMrDC2{NzUZl%yDn5hZ?mqj@{gVAA9w>$6LrIn3WgIqQ-r81T};`1NrfDY*ql6Ya+h! zdzLihHNZZcwjQK|b}@7BVh#GT-hSn`fj9cti#Ir$kkJsse1`mYgVl5~I|R12%rKf(xNDjvDZHfu2b&5GWBBdpBuvr<^Z-AWyhd{wr>nPtr+DCPLRkZb z)*wScS{dY~5NNCP3!AL67rTd)AoUJ$!ph3|qYSmqS4}_|C@1zFLatCrDfdEgn^Qo> zI5+@Sw_b$uZ*y3bC*T;M+3wY$1GTz50A-0sp}<}FifF|TXyGpX&Ss|bJkv$lOy(EE zQg5SsJ8Fr0R+qCn?}}d0J<2cM!2LtLbNCl1KV)NOdZAO#-VAmh<1^c zlMlc$eNR0&>JoH~2_EleOtZG?0m9by3nC)u4`309_vU~tkZ>tfzD4(#pxdKs>A)2k zsNR3c=b%G>j-FACCwp`rE}^hW8>4eyLUQ~4*8qoEIF4#|%T^RevIq6G`NQ;BB4;v) zGe_%|9y`_wO{~z?g0NRGX3Ss?Vv!UNVFfI|K_J~2$1*|t|7NT%!&X7BF~Jen3Z_c* z9c*ibsvJ=)5W3o$XT%`inxSwW!<+sk9X}Wiu+T8jU&=q6&)pvo7s7G0D`QJR%E25Q zuWt@JoKg=C(I5N)><`QBNJ*!1Dk#WFxB$OGrqg3rX?MhiTiLJOcO0MAciE1l#F>@M z0`EX0B|yZc5EK!n@Rx|X+y=0Ju?OPYg2K{MIs{w*m!tvgN$!r^f2%f+)+BizPbVX1u6_s3Kl0A7Lv2uPp`y7J7)zCbEJc#i#H-w>0=B z3YP*WZqT@*qF1wzGFx7RfT#m5;r~=_7-w>g~Hy0jg>@&V6GSBsX!3pAry(BM1x%7U$~(@ z<-8xMPekO(Uj&OzLwJDX1N=UJv#(kmn5N7PLSDwuHKMPv9>R(A;Vrs;lR(b5%cb|QLc4%D`R zOxNKFIiNa^(xkwL&?{juvpfa=3Wmo(zh;5pIgizaHLPURh!gk`(5_<8)YL=iM?2%Y z43X0zB3ivcZ)gk!@p_VJz2K&>=*A`??i_(;NEn+&mu1t9*SPvpHQ+Fhtcl~JZr{Pc zroT%_2_x^3g@DdQwx)dFAG9Lo1 z9P<290`hLd{Hdm_7&aK={sWY6g?e|&3A;`*BF|GussbQ02-yJ|nvB6$W-wDfzPNwF ztjJm2f83mn!i$;t=9-bRm)nin~VFB$P zLTYY#0sd|UYwG+%x)S$)-Xat$U?~-R6$@5w++EeU#)sdokbTVUtn7Ugu{TtOM>Qj0 z$7a8u`u%Nr=1y_8dHvouW;-(Y?PvOH)z5dA|1=+;R(S&J6z`wy5E5x=``Q*`^Q}i2 zD9lng13w|;A`~K&KDxf@C=lSbOr0`zNBgmIs|j}1y9%k*yAxwX3yIY_NxcpiK8Xg) z;v!nUz)%h#ZAilgD2A(Le}O0trLf;^&o3FUQE9_C9#;XuUPreALBPQYi?Cl zlYNVm*Ee{WABXdI7JOR^bM5oITq`mrt}l{WaNZQT0JIIA^HSE_F6$56{x2)4-pwX2 zs@&K{uf*og(+{t|7+;u*+D&fQS-tURTn*Q!@2vQ;@H6u4gW2Qn%+8G^I`#VAULc*n zjB@U^)Q`-&;hQvC*|)sxoQfG-?^~u497>%KSNFR3#w+>*q2Y>3)Nrf9z^Bm}NnL8& zUVYOsk+kWEYY)2>mL%z>cuMh<{PV%1AB5(wX#Bo??%WYc_s7<`9cR0&>%UjbF1S12 zi^$(x_>WkH9+|WYE*woQ8V#M|J<>)v@J95d>}AbuQrh&+7O7c(|Dc*?Y~tRU`whWz zHj6AKc%q?eAudp6%kWCercKS?T6vAwl*o3Dd|phfwso=7_lp}}>^c&?_LgKlGriRi zlUFcbTl!pYfwQ;?tyd1#ysQkh-%<=Ji+@;k-s=8a@2BO)R)wz{-<(V^-JAU}(_7Wf zE%QfQn|3U@jw$>npaLi$`(nyk{?>lQzKjmZHeWaH!~M?P&vM{so@{cV?iFneD=|Vj zR&?%qeX-anVq)L(@pHN3=ZpiX1aH0k` zt=AV+$@?Z)otIi~UnWh(_APF1ZS{^GEqa(7RPz@%Q6}N}GW2@HWecsPFUe+FBL&lj z`J3NH8U>x&TfL%fuJ%q!ahE%{IZipWCiTRqyL?wV+q#h4!SOKc>oIv`VBTmrbjGpo z+gcP+&+xE$Z0?amH?rfI$t(ji<<>oKUX}fKdVBGyPcfakLya0sx>=ta7@Y?w zfT4QkXCWK?$V%Eaeh;X7Tpl1r7nq;+i^nM0T;7{+VRB;JtUS)Tc4Ah__)!OE_hG57 z*SUjkV@(>xr!LR#x^*h(cE`CR(}mi%gP6RQM~ab~>z+UU-2Jg7IG*>syCLR>b%x3Z z)90B>1^E5u?k@KRl#*VRkq^8<;kq6UI5x!#Jw5Sx`|}@1=2HUN%5HIXJ^N+~yNNrT zq;^qCWlH>c)%}An3LvX^+q2eT&R2kh>ZhBQ`X$=u_Fn5MGro`!wYxCX<>8)Ixep;@ zvBBxUp8z>`IfnN;^)cTH}<{3s2-mk zmkLYHDMMx*+7Y@Zr)+;daQe6g(;|0g@mA8+jDy7aJ?9mE%^nICr|i_0inn0F;!M2$ zjBu~d{ZU}-O#2 zItI&~Eec3sq@ClB-*V1a0i!K!Wy+X4bA{E; zaD0nRB{QpXHKruQ=4b7C;T^~K!JY{jN1f_a$+`94ollI?3-xZ6&tF{}kJ@cs4pG$x zROeP6zBONOmo%rZemWIsw|6n)mF=$+bH^>8!?i#C3ld^abTPFK&b5B~RdMNu=tKYC zJNY8(&BM8xfg(HHl39xd2JZ&r2m>5V!<~iKU;KzXu~e{UDMo#tq2t>-|7NA&AFDho z{PBuyg{`D$T}le?zmR_~YkMnO@_Lr%ZvORdu`>f+d^eigGwb{R85>TP9jLLFU5a~l zx-onW;p*-rGm$g+@Q+VlNI0?K*kG%3iON)DJpOuV+{OLEdF%&Y8W=>@wt(m_<6Vwk zC~GN9{PTeCLlnaNz!?MO%`qd6@xqCQ6TcgT)f{;lHm9wCr+a)K?v9td?9;Vf-(^wp zsj$2ATBCclYU@7{`0*I2YG-+y)5%Tz0HX{~i2{iNYn%*ABRO0Sj@zDiW+vS3)!T&c zItiwUT`LAz-_5k z40rU>`XGgQa5+PB?NobJ{YK0!5nH&;59yrwEMmFn!ybA)b7!@$jINCC?rzS^0($8r z;qlp9n8NDQK9K%D$248fRM6fU3+zmmeXyn^dhJ`Tn(Vimp==9Mg0{(rxWDX4dh|i( zqje?R__EWr*5BV;GT)o+>ozHufLcCb-x0RE#*t&9MLZU*-ub)EK{n&w(4TKXyusAF z59|8lv_8ltYax4kE_Wi03QNg1uI{}&m{B-htaBt;<-FEGh2oPpM#lBK7Ls~6h&H`E z@t%Jgrl*Pb+_$|Z)24{q^Ja65W}J~Cu4o>svX?AVc!tySPsZ-}yNDn8dTb&X^lyObQY0ZInB1KWfQR_*eXcm0A4jTw@tZqMz}xzIONt*K$?f}6OKDBM7<<5Q z@A+dBF;e$>nvcDaUd#NZ6zY9E4|UG*ZnIvV+0APIyWP#%^I3y;J2h@ezHKp%x`4Yd zBazz@b~N5rLO0~taXtSFxQiry8C|s z-D^Jm6{+3$O*Qj+pnxO0IKArnxcpak;vm#0C~$nX%l!N$>$3yfDSPjvrK&qwOOh|* z4h7#5H||%gr2i+bo!H^9i7bjcHU&;dE-9UUam_3J9w{ZDE;#ll?a`0+Z@)WrZ>9NG zyD)ltD6MGgoV+{Z#rkW8HyCqSggs^fYmMh}cM9z{G_cDZ##~eU*l=6-%B7_DG|loK zi@+4h-N1$X$H!Lm-%PS612amWa#;y>*T&nJ=wawSmd_4 zMn?3M+BtXa67zEH5_qRl-b4A?hnck*$2HQdW4jD^jq}k*4Sug~y|hVrb;g!!xFYEv zo`7tjQ%u*Db_tCy zBqwJIJ>BP7_%c8wkB}jqlKD`sE`FR?zWwvbyH;sOTzr~y7@a8VIpNH;s6mY9;UuhY z>;aKr_T|ng4I7C|G-py#m#B+)pqCoyM$^Y`vAW;yqEC%`x>eeTzvJz?b>@)j`Hnq{ zmxvk`w;Nmnx{K;Y3Yxb11-x&4YKL;cbk(=9+^Luv=_FCj^nVm2tG36xP?V`tBdzRobG>MFBBr##S zK=3jEBfCWU1Jc&$wSdLy^2t@!`)T+>C&1L?UieES_t6|p=HehK z7=H6g;HA5hl=q^+^J$#B7mAKeusVf8j^+5k96g!qZRCPM<(#j!33?Qp^-f}QLqik( zE}jPi=CE<`pveRq9e^$R*TvMT_cIM2+p{3BdSPLA<)RT{k z@dJbZupji2nw}!oBDZc|0lh8=0)9@CdTw(OFRU0gA?Gz17v;YgaPVC0@n3)iT6trg zl7ZQn?l%zAVZ%sEr1t_i!tpTV(TP}-55msP(=5-Uogz`lE24xXeb`^MBF6XudT$BJ zsCz^TJvB?vqU=qGpl!VqK13}W2T0!M7N?m7t#q0kt1+AG$Ca@@E;QSY(FpXF`50)=NqD!YxLoKyHIYE<05zsY%0Gg1?SFmTAesn)% zy+qnk2!;l6M)g_4B1Y7oz+EZy#$l>4s@6dAhUPQ{RN3xRpdeTuah+kYy67r|f(r(h z*!nB50&`sY)g3sb+yd-P0L^lR<+8!Ox51KG!U%g#GAd5>X9u#D>2~q@-1a`QZUV|b z&4;t{zUj1#quI!*-E_7Yj#dWKqI@k`i(KH}xP}ZwACcOhIIJ~0AKcA|+cH0Wo z=?;9=t-POfyl7b8^R0Lv{UR8+sn5N_7VEiyUU-(MRPa)t)z3UMPgy?t2e2K%!^*&O z=(0Hj?sfE~JJdB;Cx``n%7C>Y3^)gKQIN@RV5MoIgYTFY-HldIEI>HdizyZWOFy?y zOKo&A3>vn$&nj8i_e1377oEVd2~pZxpdm)+jX4H8fEI&@EV^O{OBE+(6+%-vSN)oy zz9|_UuXDtAPc5Rgsfn#Jhn+a zqjHqJc7*>r*bL;s8+*WlepFl$l#5Rq2(3nWN2eYgB2U5(yagAg>IdmbrHHb1A1Mo3xNKAAsmFz?Si5V;Mh7uyE!WgjuYr(^s#^f)J8 zCOSEPVIY1z(PP~_rO2#%IkZ%>-*N^~(c*_I^#|>L0>}QoJ<&90;PQS9*e%=p479@Q zj@ys&u>Tdz(XvO$4d9$BIGSy62@r#}0>RAx7=QcdFJ?oV{LG;1FvDBuBo|xoU6YFq zE8N>{UgIqPj2>4+M6Vqd<)v?SstO2De~af(Ib@7Z@%sbTw0AgVsX)qoQGjssdMJ`Z z!AK2ezyLbe9qJ--4iL(;3<~~Sc)5J?e2_DWZ*G7}L5dHjXuj~dJ-T69OLLVycVLXqndPESr{Jcd#N&$xu9^;4*73j z26#l2yX^CI9C$<(FmDH&o!~J=Mb($FjiYdb^>vgV4a`m>b;BQ86B)_nDDJ@xf%Q14 zQgJLd)VA70Z$)G08n(la{~Hj{1x*%P;D@IR*`U8ZWbhXtt~)~ysa*9wR(aJghV(kD znFpQ_3S?)|N4M@^dYqvsK4!-}9Jv?AxhGAet%}RFy5#|H&PWWL`E2a#Ho0 z>=hq~I>F^fPs-rsmSx?_KU12 zwUz_=zi!*n;2wpHFKvRLwdK?s0p)l_?_*HKC>(i_nIFPkCwav#(G!NjZJ?-y`;jW_ zTXqD2MI8ZQE0o5&eKU-h?r{eG5vCy&X%>V8e0~VFvzmO2iw-rmn%ICZQWQ>}W)bN< z=V17!_%U~AMVAW3NO{h{5gq>tC;8#p7}DEVBXnzg*&@P?My8Iyk3g6AAwFFEL)sjs zSNbrUI&oDblbkyAh{tJXcT@vs?W-b+le(h3Z!hIKt3!IrasW8C7rj7SyBh+28Q_Hu z3+WHD58l^9_uPgenL|14AZ;IC2?`d5xuJtCF|0`jJ%Ebb_-CG0AOto6gox2*{?$+j z$DLR^%mXL`#VTv`USQLmWluHp!&LlEPCNZxI5zzWx<)woDc?3O2T`#`d+*0Qp)>X} zpy0qftV?vr!2df?L`3u;SVwwbS21#PT(4CY56_Zpz4#n{ivt!H<7ropd_9iXy%6<8 zx~IT?ufzOY=+B&))T6Gr;Z>}Paz}fOsfgrqr75Wa~`NIdx7<~k8 zFPyha3Y z((ED6>;MjrJu^>PzX)1|khBcJXAOP3=!U2vf#}>s@u~C#zO=y*%M}bVsR2)UgUl{L z?G)DS!dPHyJ3D=Yp}*236!I2WbAcrlqFs2Ti++^HTf$r381J@c7sz=bd?d#S@R8w>;}$w(h>~7G4Kt*lG+DMknIZz`P3IBiZxF0k94d;oyAJ48;As0$Qg8M$vI5=Xz$5iH)ORi< z#l`lq-6bHsi&sWmG)EvXFev2%BW;rR(w7BneSWm-uqTg&v(}w}7YmYnkpmc7RtOkc zH^cq8@%i}{c-a>;5M1qISJL&lX>i^ajBGQ_z(^ShIrdT%qHJ z8NC+!;Edaq{m=`KUgk0$8-@|1zduQ29UjCU4e(suDfBRyh0thrB#7A(VEfhRgAQdw zL2-5~hI(V=+);lHRcK6)`#|Vx0T_f4dkPMEVa8VAc107IGSe>&&U*8ojpOtrf-$j3 z)JpSh$-NC2G1NN&G{t={9Ii#-c&AECpwt!3W@y(PLgn$|+s9T>3qmj95G|OM_`=f| zF;t8&L2R`6;tnkA1C;g#VTXf!km_{%O#%(K#2kWSOW0ffoWo|&!B%ubKjQ|MMSHgb z=N!GZ$sIJ-<{X&?1JGhF(3_h9s2)^5_<_I?H$YA~>-m44C1ogn1644#Dwu|E9+1-( zW`_spf4r)qlN`46Kx>(`a61_s_>s;XVLPx+9#?rC@4a2`SQ@^(x_9vWp4O}PH_i(k zXpuzK{{G^P)sPmpd(Tw#pJYB2DW79%c%Hg}P#%L{QkhzV#%}Cz`Quwq0>181q5>#s zDC^{DYs6<9r#_B!Potd`8i>3K-Z!T7AiM@DFF-%K$W`>y+Qsecm(sS${IrdmR zKJ(bHJOLj+=#;&+kdpE3w^jDvGoO;Yn$>>=o|WNvX{TiSEcNIg6e$qO7J4Ie+hpzT zPwrOFRYj2n_Z8{I6_c~)Cn`>= z$!v{A4o3JQn+hMl!=dUWrjzbhJbou{n?CKBL3`aJnVjLf>y{>0RAH^<*5v!jGA%0! znvUdo7|1+@wd8Me(s_TyA8xhnvh8#J)m$;7*?#r!>SJ>kh|^?i+n?1YizX0Niq_5l0f#e9>IWXHR3M~kOWO-t)lqZhX4L+;3$IlJ%Q z_WF`(R&;V8V&K$x%w)xJ{qRT0*M2Kr0X}cjN$bFy@2b91wWxi*C!T(J&rY+qna8Tb zSf-2-`r6@4POs~o#S_O5Rzy5`5NZXEAMNEWnNoU9L)2_e?k(z%TG^G@1z0lAd`A?H6Lg3*sreDa!OVJDT$O?fK!R8v<+XAAp)RETjQ9OO63HFe z#I1ja!AHfc?7D^R6$ySA+tyfgFr)t6Yekbkhay|?2a+WHcOXUZg~lVz&&pfW zof-=7nDjQ>&33LP>37OrjJTSWEu?)c7U!u>oVcA|6m` zlj?KiMWc^)T8(&)zyG{7&@S-X43b@TwPu?Po9V|Utvq?RcQncJSZq?jhhTY)sLSl? zS&h9`uMcQH3{}#<^w6O`W%m2o=Y&B^W8D|ShkC=cj1@ZD9^mX6{e?<$?sdjSy9Xkd zwXeu$GxqyjeUWPTdEkq#iFivuv5IoQH#h#9j2vCkK=iC@0y5+?}qPYU!BCSixkUp`x2?U~DIdx$|1_pl`um&106w zWPZ)oSI@B%lrjy^UQ4-ba@orZKj0(u>Y-!ug`Pc!WnNh5HClYK$eD}PecTmY8tBt; zr{e79#eGkFsv{nx^C;Kb5mSB`1B;c?L1cGj$)G+_{3xdIgTh0gi)gTQ>ziuSn&9(HdPn6l^m~hE7yLc3!olchC+E>> zxXFH>0vyVuG|=37)Gqn>qYH$m>I%DjZU3wikgovi!Lu{J7!z`5-H~I9FK_U+E25398R}ZekJQsn_HO@;T!Ex zFS22(9~QYMl$KGuT`rlwBY6Lkh#|^f;;Xa;(q&-lUos3C7_|suf~wP3L?ttx9JQ_6 z@A0_nzTbWenbL+g&ht9`1E0zJ1~SzpR6YJtn(|Ci0zCEJr2{cnoQLb4rlxBhTfDI- zITMqZS|0yy?d}65yDzUaUwI#&AUGpSo?05?hLa9;ZG&23SFB8(8{?XPt0n1_a1vAH zRPVjrBVJvc6|F33|JbQtqavb@@?Ey3FIVxc(|~@ffiL#VsEGO5vZ6gw7Dg1SL)%|F zpORG!;HL0Z=e7l$jO5%nwN257dzduAf)@Xm%>Ratop>KgY_v#r+Iw3u-$Lc<{=Ktp z0RdiWFMsMc>Xs22D0;HU63e^drNDurtsdjD6JMMgTwL80ZLwF=F8%|wbFo%PN}m6o z!#g>CDEvvUj7gS7cu%9(Q^E|{=ox5+)mHvzT1e_7;(v0vGO=V=s7-_sxydqwz zI?Ubvdc5)<%>Qj*IsfwvHqYYZ0>x5us(AT4;NdZ+seL^nS+8BWhX^%G$E&>0ZNRtm_|g}t^=|EbVX?xy*EBuu#9R^lW7eQCbHx)9 z8E)0q_1e0nuB=S@_yV_COT6LEiQ#m5~F(k3ZBJeD=ir)Ks*yrfH& zk0IRE?HwZH$v@(+(;GPKnGk#CVug$aP-*VhrBLFma~`3|^v%hWw?mr+U6V!DNKS7n zPP*TA-Ut(K)D}-H3y^S6_&fZ(IV^YgO0>b{v{Dzwt+4aKmY)z)+xB~Gex9kkw>63Q z9nv9KhCxN@56@1TyeKvmkzoIqj zCgy6pMUG}(_mRr-$T>BADJ}aWIkKBVT#1&AUz(b;#y@Mq|BF)cR7GZm4i_j)s6zw9 z(wE)$ zPv1(+!#n>y+PN)9py_Cl?9-rbe_A21Ra2*5rzFB7_nXQY)TMyqjo_gj6r>r4q%0M6 z&S+=~kYSmmE9w6K5A6#C8O4Z5KmHwb?Wz<;^{qi1G07#!tid3FnRC%=1Log}65gP{ z)E5eR0tSW&=9ej>Ujb$~`z#g9CnOmxu>wzoU}^1KglH35PCyUkLUaC@g~b0dpnL%X zGs;HmQyx75^Y$R??!Gx7YIp3<(;-yU+W0pDhhjGe6cH z@JmsEH3B`~kjJ3gU^fi@=(~KsKr`nlPI9$49YUWN#p%ZperbJVds2KIo}UKpNXE00 z`q*h}sJIKF12KOwo+kmu_lR|--x}~|lY1jWkhMyFG{^ivP{oVE5N}m*a`{VKqdxNO z0Dd1Kt`wU2QYwAXm6`itk!*H-k)d=0M_HflW`&qlH8K<$fDh`O{-f}rJ`!5)@L@db z%JcVOddqz`MgrQ_pKeH{r1BVb>wm}f`OA3N_8H1)X@Bn&G--xOuyr_2UAn713t92+ zcF^5^IowiErN0KArG+UyZx4T4qR*!Yh&jfi0bs1kBpZI`g7w!_u!x1GO;NG1P^@lf z0Wd^2y@=%j)1gdYg-KcV!0cd8F$QBqr4XTzf015m2v%pLN?+_8%;mXUm^5QmFUnC(4hbDMc_OuxtN3@tA(?!X1Gjr1V3TaT+xmlWz| zQ{4rO*TA2fO5vqzNz+y+u`ZNwH!%%&K12Ufb=J$*H{R;|*W9O)IMeLizm7{V%7Iur zfy@$C)niDsD+r^kiV!`=S*EipSg>tu5HOSf3`P9`Xw&ovV(wiF2GL(vPHZtBipF7J z)u%VGrMS-VujNe&IPneL;5jB{$3~f2re9pUJ}hE_q6<8K%ZAHtpf*gH*%J@HHC)*X z1$MHDl3zaS7c7Tnnt{{-;i|rHpB7eAIF6ER4%UAb$X^HV4Qv?r`oe0lxJUJY(OAipna@I8H4yd_Fl>ZgrA_$&`#mbzIyWp zg~p05jx$&x4@h(kxcvus*#lO0V$8OPwM|=ax&b!?^jT+iV5C;s@SJ5zb11)?$TG%E z`9jws4WbwUthGVLZh&Fkgzj`f4;ck9ll{OQXx+UUH`oI~#ecJB7}yY>@N zduwNaCvXW|fp5dKlHUU&7lHLQeXK+|gCi)ML--@slY8{#XzRRGeXMY|;M|Iyf5j=% z9!qenETY-ZLec+EKG3uCNnOqqH{r!^iN*Tjz9l-A?ztQn@D?{S3#gm!`p7!62_h?QdJ&k<*x9^77L2!?-p&r|Xe57Xfv^0IywD1lE$6K<2ufTFUQLdD zD;Lpho1tXJBowPBXdRSODEh!CekPzV7+{XlB*|=rKb|40QHAe>8f^n+d*)-gs5%wx zf6D&)2!&2tNNT=+G&R;fLM)#1H}a+`nR)6mWUl?=jGVlHg2AEYy;!kF)tPd*S&z_; zo;kPPNkL*H7G@`VrX*#(k}w?-i33lAQgs5fC_P$W)k?IU$H>K5Nnl9~x&q9}=&XLV zqs1@DoWM{pU*^V@iM?Ov5sVm?s22+D`TD=oROdb54?o7zC0;vT`mwSNuzrI5bqm|d z1jBX7s~^uuzUcwz~R zNE{xg;{SxL56tpDl-;-(Q;!_WsDHP25~yRlaTxvocurW2mCdA_sVu@F|(JgfWG4yWXm_ z#L|YX3H10NRImlGXKThg#BL`oN2`!c;$A=_?vc6<;!6W-bTAE-4iXU@t`v}G&Li6- zmqvueNhhI8)p7ISJtbXCIg!jU4y*4^!{gYdvkIGi7KpEh@EV|fHAYc5d#8e@_)4^F zjPc?sQII)Z4fph_&)Lq8G^|{$JM6L{v$EG-}Q1HnBd=2y3cq(n`i!H)BG6Z7uv@v}8i7)C% zj*TQcqo{5Wd2XSRo)X75KY%QB_Q3DR6NL+v^apwK!*DEKPCXprMn7gsJ$S6H%)``2 zxah+|k?tSz*a#`C0ZH_StBy9m1k8UA4~?X?MPwMwK7GEmJmKu<@6E=jBe#iF0Ywp z?2M;O$}hV?@k^YweYW@SQ7-OIy~Ywvs^c2*0sEzefOpASdcnvnb^nX>x(qxn2pLZ7 zDtIm)JTlHR`H0~JZz=+Bb*qMV_;4225?E&-qOF4eZdVw^LndXtE4Iygo=X?JE*C^v z7%s`wBC`%>FX(&GL2YA4hBMYqi1m76$5p`YBomjTw}dxzSV|mDEeLvqDX+fOb!!OD zcJr1j9OzcZc~AXn8*~UOvSF?&L`J=cg;TEf&q*G=afb^?V64G6c{;lr_5uIU;#x9p zoEtg$mEY~{Ce>YV$?rbl)$#jiXV^ThptYAHWxSW_eS8XvKbGDGqy< zlwJ!G6ooH;;M<@J2jB5DP4Jzl9x-orR5jo^kku=`X9`YB0IqR-n^=RQi5Y$bJr*ZZ zxuNrN72(02SWulvLTO&Rsjm@!_O0V!#bs%T4{+NIj#Wu&FP8!gc4BQUFFihFf6J@01-+iajUA2hmN66lN@7<*?jmJMZ?7(ZVwO9`GXh(AM zv@*Cu?O-MX?+z&Sq>@%=fm5$j-@AA5A=tM_XQ008A!Fs81ZRWV**k&G@GT89KV{RXenARXEo9p*!8S{`>H$C(j9ux@M--@ofU&#i7iCUe?GTeq!A=2Zy5)C+Qi@NQm2%W z=esTcdzYX@5?Hs_*NC>tGU{+eEN80J$%!?C#Dw!ZeCdmaiPHx^s>%kTZMs=rYXevoR8E$jx{t7}wJz6qw5>y{>IM?M3bygZ=xf9_tW0;# za-z|jyKzJ`TGZP0nUJe_$G!LL;kUCyLH~8%e*sWS0|XQR000O8GJfG&{5L2EZV><{9FfU^-FfTAKFinbat=; z7Qd#ziBB!IMqHVlc!GB)rEtY+%iRtE0e_GRM2^k6397ulS^vtS}A$v?!G zv;>(1ESi17hca$7RxIs+VmK+Ivcm&h`DpF?BlNMVEG4}B_Na$jfHTwTJAB=6ft@(Q z1xCe!186VLZFHNSabca;G@ublMCs=~N6OEi{Buwd9?NNjiwSAt2fg9~87hlMwaM6) zxWpyl&2UrCYdGzGEx8m^%$Sn`r~A$A!5?rB$H5A8aw)+(EQNI9gW}h41wHr)9ECC! z_GuBN3OM7jT#BZ(+ZytdN)VW7Rszu6t;2;lnS8 zx)~AH)fwG^)ZB9-zzm(@6Qs3jq#GD==b!ztaWUm?$@20CYf$zl{99l>|EhbL3OahzyHqJ2i+^ zw3!WH`=6c{UY~7$=$c`bPkQjxOQMArbN757pf~SWw)eGddhwj_m6bj9J*zMJ|GqWq zy>*-{bJA7lDXXjgL_+`UefNtCYe2x4=DD&@KzUT^Yi|tzDeBu79Uq1P&SuB$vi~TJ zTy)!vMmp)hrOen=22SG5m|ii10{W-m_auYVL%L%W;fOb8$A?wn-Tg6-Mj~T923hlTnD}yXE3|rr~42kz4s1V z;es43V7i}~V0l0okhKTx3^z>?GO|XA?m<&IH1Cg+1 z9YQ9NS6u?|b5ad3fakV!K`sLEn}uTtP)koC8M~9sIQ0;y0j*l_n~;P{G*=_>MjU*F z3@+6}LbLeSC@m8a_JcD0sDf=bYih|+g_j~$kwu!e zdlfon-Xx=&=p{8v2P6;J;uubiIraV>Q6j1ZmeY5b9ON^BPcVr4{*wA#|7!0aM_i~x zl{Y`aZA!=vrM-m%E|{`a9*AcZbe>F>y@JaTOPE~p`4n1ZAF^-D2Er>29UhhuR|P}? zMpVEadR}H99#S;TSppImA}TbaW0bukz>m}`Xy*<1{fF`>zLhV82hDOel}<2p(^YN=X++ioN7&GmHJaUt z<2=~__z8Z8QIy<=`Gw~4R<_koxQ+UmrFg`a=aiWrJ3PnfZ~3VB%XQa0Oj!q#?+GSr zk$5HafR+E1MZn~;JL_NEpo)(p$NMB~jnv3eTtR_mk@PAkK8tw%f_0za7z)8kREuj9 z*|g3+gmM?Ajx7xPo_E0MLkMb;ha4<`i?_aYfuxx*ILrn0TaiAmLgd78#9ISiAfs9X zmi_AoToN27mN8<*#W?rV5eBUru9h*bdT~nd=J{K;Q}FGY#g0h`sU2nyNQ@Kq-dgny zF*)kDpZ5=JEue;dgnr=ZLn*O|O9r?*f|ypxY!W10j%-5}r3IymVeUg!g@E{N5GrYv z*a2)7?Gse5v-B}Jeh^7+hi5|M(v6pGB4qZQja45>&*7I9h-X?XGuPe7iGY$JCZ*R$ zgtSz^?C0Jz6Ru4bQ{Ip7JQTYG7^{PV_agbpMZ;&EUMbcOD-HmP^f-l^fD}<2%XBAg zmx(@psNueESI5^q48>a>h#(3&|`H$zn1Zs zHS3dY{GCWlcbz5!R=j#2skLj{qsPxPS-J1Gb&-C@1n#*GK>Y=&z zmrn<+J!s1~?r_9zV+QJIu|@eY`Llocjv4t$lmbgXDloLAo*O(b`+07|rhd_qp{IsF zC4th*&NDoAt-(lMi1M}s{X7tx zx+rX6fXh0Ub<&W*ZIKIjjuR()g`d6^R()1%6SgAUv0)7}ZvGIB3s5F6$l~u4i!$`DaK2ZksB9^M&Dn(&H* z_RoUOSZ@3{#WmS6=%l}c{V5vFDa^rl(xZU*N4MwJs*~m!I!>E;N47*j`2YgU2W6Px=!LAk@>H9TxsECGAC%aV%gng z+sx8}|LGuoJgEH=f5o`rOX%92-5U;NB}dG0L7b*MEeoK^&YXUw+UpzOnm?6$=G(Iq zgwI{`rU_TyrB8muh@fKYhQ2?VmDG9nFMFVW`IT4N{a(1q{h&1tZ~dFV3NzXX#te@$ zx5fV!SXf7@*6NA5YnwjrUTq;!axh0oY(*}=rf;N^aKhDrt-5J(FCq)+6^8Be1EAEa3z!~boQytL z&}PaDIPR?gsdBpb2vWQ>R(H~Z{K9&asVH=uV%HDYHh``xy4}*BSPD70F|!xfjnI1&Idedas0TfRC5>XvCW< zQB~lKcFy8Bq8ZZg!$jrpf0A*XKLc38y8N#7Z4 z^hh3%_`mx0*Gr^~r-csWD@o*(HfVmWR-zHg?NCY`i0{+LWICz%zFP8S0W#<$X^#`f zJ(_Dx0L<-^K0yR4--dZQCYINN3O6b_%ngstOMAekI4c#a(e%LIzp}3P?9Vk@D{Yk_ z&v8?;WfjtBjYA(K6|`_qP5KTUcnc?0@p;x5?Y0h|@eOvLG|Dh)xN?{q+6Lmw*CLxW zQoS@K%FmLiBh;Uu3N;d<#wW8ys`Im+ts27d^Mo{O`cFxbr`!~})l)Gl)rV_VU2of1 zTl8-gG38Jc5b#aHu`i(>9kH&Y2$sm0H&&+KTbjZ2+L|Flbi4-25#S!yqK^btA-?{@HDi=3ssrXgTJFd0!rb_xATF{ zLCF+MWjE6Ws=*~eSZScnLA26@u5S;)Ej zy%O;=fM99Ap}jMnXn8U==RTX3$>&wq!j!^#XuVbu>_EcH;3y&IvD2X;hL>4OWY7Ev zmZH1fe33wP-2folTJakJ+E}Yj4B)9AZWF4uKXjw}k$)~e{iNr1=)4c*xRA_et93 zXZT_m0XVgBV(t$}l)Jmxz+njF8w!*#HV!}Q17}nrW9vkWG?eZC6fU@njNgn?tux>s zN)Uj;Q#IQ={~!&ihj9CI`^i-PkvP?x9;j7y0{j9QT5))ksI}Xc{rS=Ju8pkHS9p09 zl$?OMZ_r9Ae?x~`5b@?%sYM&an@1blz7Lh_EEy%^DFzv4(_fK=EQ^JYL2t&Snf=z& z4ALxtJj=Vv&iS)idN>oMn2;TX3OMj|Z2p@`)X}b&TGPH|fG>Z^p--NTbZw58vfP+9 zs7M;*c1xroNr)MrEX07n8xYmSm9$P)cC8MmM$V+xPo*g>QPoBe=VOXIq^};L2n-_}e zAiiob+n`9nn42YFWzn%WNO3fA2-r6We0{E$x{bs44;P&^2wcj7l%@iZCi8DaDQY-1QrsUJA`&+s?BMi(tlx{X4kdSQt%st&s<@Qg2u zvRVycI!S6Csx3lzY}N2MBL%BEPl#Ovz#y*!692^0M?gSFIEi@8dT95%728T6?uhIT zi|8U4F0A4K)HwkS32Ex)je(s4#+bKN2s)hxNQJ8C2Xq* zd<>U2!NLgQ%`n$hfQ07Il~$PI$E{w-8f|InfKP_9IYSY)L2Aj;iJRo+F3BSjq){h% z^RGzdLnf>A3GJY24FU+^XwmMvW4Gq^OS_lJ2Z>yaQkh7)Co%{kYKYKGS8UaY=dc{<{KQ$Ju)AzMBkayfGJd09GH@3i>!*Kq6%l%3XA3a~ zdwIsJ*umUl`NaBvP)h>@6aWAK2mmsE;aYQKoOk{u003bo000R9001yAV=pi-GcPbr zmw7alkN3x)XP)61+su%dWEdr;5>ph7ZAL`<6e(>+DD9IaOO_d9%bu1G5<>{t3YCZ% zOQB*UYnCA~_9fYwZ@>S3f82BLIrpD?&+FdzJr@B!1OWgA000tj&;S73zle_nfZ~5f zEYVrx{9nQs0I)~^0{leKqiUqY99gSG9Z*oS*JD~7g6|^^`eS7Z=#HF#-{-0fkLMKatN`A6;=gAKj@k^z# zUE8K?GL#jHM@9eM9VfB<4T~POZDBI%_)Ev`299n1OYcA+eBssZlsmn=;H82R4^rVhf;hW!cg9c%dQlFw z@H7w@hIknu48HW0j(l#&`EH1EF#&u{3{LHT zPh_*EJ+T7SxfxIF_~@Nu*7yzsL`#_aHitOp?MV-Bn$wqW(YPgS%LA2d?7+{Su}9Z9 zCtK4_(@(vtQ?-UAUOP0j@wTg?_!9t=rD=$xt(Vq7ht_f@xJ8l&(Z7sPk~X;b8BSlv z=c!DQ(XnfW?u#7muRCEg%;x?WYKjC2S2K44FKp*fNiq)`(2pg za8?+M_)0kIs`CCBbDM_%DquF9$l4Tww)3S73SlWj+=msj)N88PTB!$Dyjy%|S}nk0 z7pskmJ{u2Pq>OHOw65x2#?$PST#Y1i;-UOD$XLnfJzmDE!q3Wwu6K_#t&CNE%NE1? zZGApvOQvHVk5TgtQC-9!yF3_7X0=by-Ci`K8RLC-th-prqm-f8VE@=;e8+-Fbu-3< zw(QC=V!)s3z{D<%I3rI^M~nUqxOz==0ge)j#>?*rz$g8rHiLZMMznj5tfbj%NJTWY zFh_Z(^$xy`GR7mf7!eSbuh{Cl6r+d9#MXJd^x!7$IN{Dl!i3Vep8VXc|;jg@02-zm0wDM$4rS(M;W30DmBx=oZZHM$$40HTT zsD`Fb?3##*clrWhTiX`{j#&Mo(7#_(AEnSDpcy%jH$TORO-#Z%TQ!_ciqF2s^$a*Z z<7I@6B?}?(?VaF^`h6B%>>^nfHucE74x7|}P(dcM0E3LSy`A9qB=Ta0Hn21Oj=2#w zd`;}>_HQ52O#NH#$(SHgZ2fyx`4-mKH;pwFsz{{E?se0%_EBp8Pq)T>fa@VbWov#` z!w|4Ono4&-)l|96Tx3Coh|s`b7HJRT)vl(o-QRVS@zvf9)1PWCzsPkwYft|>CemH1 zvCfa8@yy2-*2;$;E?sPKl{=E7x%V0tsc6;pV=u}IjsRu>~wq1~W9+2a3Lo%}J!+X-&Z*%Lm?(4U8$%(U{ z?m3R7>fEf}r|enj=^6C`KasH7EjouevKl=pY|cz^-{5gl|9OU|z?Bir32i{m(O5Nu zM=Iow&KfssyUPrQTo^TceC1NA`UjN%z|q%^1-W}29+XbmuXKeLGeRAEfBO%$d`l&s z`?a$4$Fg~9%74-=W?g6DsQ-lLdeW8Ig%?Yv3zKD2>r-wi_hTlftM*lUFW`2JXpmWC ztH0Zl*c;$>qVC)?W@d|f#mKl2-*ezMSP74Vj}mn`xgGU>QVkI8x{)LNG0*X9|2Nq8}orT;eZSyXa!-ucW0*Bn1&o58IjAg__hhM0cndXkmOHW}o!wfDnKF4nGOY3Rzo;Or&mA1NfVH zk0?Ww<(}r-7Uz|eWOk5@HR@cug#Wcf-8!iM!tHK*-fUO(+(yC|yZakAMrhwSc~*Yj zx#66mPHT1u5R#`(Zr$OcquaXG8Jn&qC%d^xM2938f`x1+76?_kU09WfGB z?i-){qn1#3Zs$$Egx3qsal-%VMa~spWm6(Przk9w$z^->PMa)u`|1CilPU76#)fJ+ z`@7qoyhtV*45Y_xt>fwYZ2pL8J0SLEdvTWRUfYf>6-aa4l&-HUM{IR;=V$Na?XZ7$ zR7V5V;%1}#Ff)Dot+_~T4IK4L?dhd262ZqH(}YXkChlx|)g_GQMEndq;ILGAbb~@b zhvbph7mYTamP{J8TitqHXc&9DPKNf2sYDy4JuR2mDeIS(`l(OHfXZ!;QM=Sp9BT1l zEnvU?LZzt0?6#14@xqs=yguZ(Ftg>K(wTN(_N9w;s@`1MV5_MVY-|3^o8@YLD>$E~ z*k0>=TJrY0xWMxPwzaa3f!dQ=CY_oqPG8R1J*zm{A$i`?SGzZSUu$-9?W)5oi7}^_ zT+;#Q7V@rTaWM9G=B2V5642kvUTlYd;ifQY_|>6H_l^I^Np6XPtd?svR% z!?;sjDcCO|uf*vIqVnqr)){7Y^hfR90>JKg$1-7~)nAt7$x8pc=z_&7@85bykC(;1 zHQYH9Rl6WOk+-k1+L5zC%tG^2r=6kEOn+>fU5Vn`lQCPf`jFDscBd=wuSRXHkW~$T zezfV}aF#(D^6h_*8Z3Qv+$_$&ah+MzGTAGVEUS83_=_1Xz@7zimFiHha$Za^LRU80 z$0(T2bt*2qh1_qqvpgU2iDuE$@-(B5uv=2QKdmF9L+9nDo~XQ`HZ!Bn?58E9f1Iq3 zr5&+-(-ySt#zmtIZDC!K7AfXU12Uz+1;ipe!@A^OzhUNdhuHZ0K@az{zf-Rpzizx{ z8G8O>Veq9@x%{A={rh~<&s*yB6AHD)^eJF>|u24{WI`@q)<4gGcC&rxV`{ zWx8$>#ho6%^=+U-DotUG}ptxWIbIbRE1 zOlk)Pb9)r-d)2>GdD`(%qD=P9M&g1VT(0k z>G(A4gO{(*!4l`u@-2qAfrFUvj%ELPH1eY8gh>yz=|0@*C{08E2B}$?Ko;36)r`Y$ zlJ}qXAPFk?#FOyDY|4*RwDOP|n|cQ?53|Wc!nb+w^+~iHgo-tMPYi$$pO%)-o&p3} z1?g_^0WHGgNqR&8eG_tD#m4u4bcOitS-gA#%>IM#7D4Zg=znztp4`K8@2ZE`^lo-a zi2g_T!8w+Jb+KhDj6B+_f|P_=_u#|Q4bzm=G{8d45D0|IuEN06b&G_*lO- z9vRyqb~CWW;Ju#*BW6FJ>UX9aTpbe(-@;FChDSxNJ+O53HLb_f;Ewr+uK7#?>JuYb0{nbdi2|W&&Gd1&tN?6_SO1z+^$;%1+!+WYs981B2W@3AiN96NJ4y z(rgOwk)8I<^u(2YR8QvSzCLD?q)Op}>A^HVRb;tWA+Z5X>fA|^kAgRn$GpJle-QgH zd@_phJMALLb&2s6CEd7 z$!n)JB7%lUyZ~|I|I`gs{0VNyrlv#`dIxW-8lsrQ3eR**LeufE2aUM;q%gq~elS5M zen8aZLbZ{vWe#o;FfTV&o)fmCB?b0Q2UKVmeQwkPIO|+C*Byn$#pbgog^-%nG#eu! zob}y3Moj_z`d(5h57CuKFxwR$a*^@2n0_t|a2AodaTW`Ly+5TTYp|G<_p z628n~Z=N$v-!Rz?QVzj(6Qsq1K#R`c1v z{b+MqnD~OkTap)G3E>?*%}U7Zm+9i^Dx2kEw2vaGacyfWPjJa#03CJ?{-CPf%L6t^ z|3?P)NL9C-g3pX`U`RD0C~>g~jPx!OlGO)Z@o_orX4lq#z%-cgyG>wH$EF&#)snM)_r8gvX<9hAgI&48Vl_kB7OhbpEyyN-g#Ys#omn{Lq zl9Hp;{zt`d*o2K67~shrUR^tAxTrSw?+J#wnjDtpu^ejE1z7ohYKQmVM>0t6O=mOq z78OVg>Dy5L?e4iE)6RMggF92tsLb7DVC6(%YX}B$*tr>I%aO1N!GHtHTrVrIVPZ+2lkViN3Iw&AG)b3!{iCT9e-bt zQSUo4bmFsG(aif_!Qc3~J#4zhERDs0t$HACi$a|TUq)()?nU|Dcgn*V>twr!Ibnj* zUPk*exfv4CLm3N3FT)H`k={uYPHt**&CFrO_o+g5xzpi=Z8px-)=u#H`Cu|>9U168 zDPzNhu=j%}&~9oWe|R39V9(>L1`*kZed<)?F3q-zX}N~3swqYtka-AvxR@n>nEz%J z1TIyl)m-Htfphh}j7VbwHAEj{7mUJLjTG2H*YEcFCXdYIE=k5Dy%ef`E_wOs;vdnl z{#N4m@`JLy7ehh2dw!Lo6oejV0`3FR1CN6TPL}UHIAhw8bgQU{)wqaTExCACYUq?> z2@2D*t>JMiqSc3L|GREMG{a6&{Y6>*m1ZorfpugLIxx7~s>o^=K`~Y;3-OgU>5^Gx zr)#x!5iS?AURu6Vncr@DRt5dv-Wz3CSC?J$cb0E+=Dqfr&>0RZFds=P!J3bW0`l36 z(Ff0LQq~7gpi7@$(bNt%-W(QSf?8O*q?mmP0=7Mt}r+;l;)mVxv*wmPLZ6R;l<3Wp=I&sVHqFXYbC^}r}NPJj*dr%1LQ#E>K z_Zgj+-=YuxnSP$o#&UZb6aS@mTscSSPh`r>HTTGG8E@wm??&!&&R$i>4a{X(q;2ps zh{+UM>i)P(h;1{*@5w%DsFD+Wy?5#P;=2Z<5n>}NhZQ`zK{;6eba4X{w>XG?$8w?{$r{VfSZ%fburMj zvUbt>xK+FcnjteVO_q_N3)8pneIx&BTHJ&=p!uR|uKo5QJI3y}a@!u*Nalf!W>~o% z(J%c2^0wiRQ&#J@IA`78haLaroHD=6?6HzQRDJY^y482@ zUQl-ZCV9ZJx|mgwMD(B7b3N2141+omE_GmZYA3VR3 zUK$j)I`TZ#y+*$Qa@;;^!FigLp}l|qV+~uar~y0m_npb13*BDtW8&L&FMaxXdt=Z@ z{$k1Lb;&bJJKoPfx%At1IdC}9S0qaNd@FylEYgd9R^)cCakAVEU!>&rkB#F^t@kCbR!hn*pOOBz8D-}SOg5$TP3PZk#`QMb zGs(B~?Zx*h-|oEPrgZkgT>sIE!JR(Vb1A;g+d4G^&UNc=V4c(!KA}AtJ%1?ED%5`` zjy=7t7(MWITksK;imh#dsa{W}&i$N7yT!9DmCh~Q(#Kd&Q~bDn`A5-AlSpOms7cV@ zEj>b+(hPZbu{G|}eg|vYaDw_Na^a){RKm(^A%6fZ4S){mLb3Q-v`WebAeDXDlw#Df}%_BLNJm&N|?o@SM19 zgC&Wk8<=v416C-6NEER274pN$XX&Yu(;e@Jc$;$&iyp`{^R?tV)74gz5*g+GB zYT{Que(~WNm@^FmTlw&}VQv?E6sJn;^IhX{yV&+Q>m%@k{4bK!0sPGoX2D^Czu?RY zop61m(ijyVz^(3?!_mAiqO-Od(r6kbhGECoH3f!P{{ZlCE%aqh{OB z=|kKzYM>^k!^VE?aH7FP5g_ste<^8&^d=AvQUMkC67 zn$`#Q2|wD8MNoE)_pOut@q~)|42Y*=asrqUeV7NCc&K(fI~5&L1s(8%A;fz7Og5wc z0sR%7o}{KGOBq-`a48f|be};75j+HE5C?k4DK3h@Y%5FGGN9W03ww=SGZCa}?*D_= zPvxZk#T!*k(d!h$zXIPq0^u_iI><2sal6w9tRy!EaH{|e`q18pB|M>CMzXMvH|0)2 z-h;t)NrU1k!lLNWsZoj-qCUHiSJ6j(lgdsNdXr)e_e?VrU`PjpSQOEIi?1J^=27N& z%@bf%7Sub!s#RHC`v`X$cRVs86bA6^RabM{|3H)sj2>ozFuCR@&YHxCXBt|?uh5pr zDF2%P@mT&QRDzdaHBnznvanoLZrobt#{^nKe z<9vX>Ye-z9kcu zHEwks0MGfZOeZTs?J#4b|!CQ&kj&s_2H5o>EF#<&io;#q;P z6qY*#aPPs<<0AHh{mx7-qZvk|qs2!-^15cYXKaiPEo=~S_)!*AFhreMP?0xa5MQZC zdtxMe;7^XGgvZ|eFDi3edOd+N^Hj?2ztre%j5v30e|FdHBmR&XNflS^IW2us43P-e zcmZCA@bq;BXAg$#8NcCmCLxdge53y=bE=$dQ1cg@G$g(e^AX|cip%;TDa+O>W>0icMc=~kTxp7(EzIowrP$%_YV-e zE-G{LhJoqIH+wu|NgU!ZOE6ETuW*>PDq6vnY^xSnLRuBeH&^SI$qjHiS;HVt+FE{;E4FPj1d{hyD5Qe zN;wobR0E|h_^W3c#v<2EuKYaObEp`tP&=O@GU0)=^RT%RAMq^m+xc8ddq8 z*f4Uutt{dh9wUc;A(kvPzp)KWjSt9!oS#r)1I!U_Dta%^AozZia9b5UdKUCOkTrz7 zMyWrI?_eXo;>di&h1W8i@0vtWJ&Mkmco{RA0TT1FS9))4@sLPan9kwdcTD!8Q z2zLa8*wvdcX5(+k@l%iu5SoCgcQ5`$;K5Myw+ehtJj5C-7Jn6z7mV=%k!jLHL zSJUsLgtPVF#8Oim`*{2@%q~oLNb$b|q|6=$O9N>uaF_8SD|{F3uxAI`VGLq6sgC0Z zKbY`+MT#k_GI7l&d!{jutImkh23U;WphC;MC}W0B`UTcVV!7pPKpOd!EI2RtJo@=A zMV2k2AY)9pFhO{zLHS{XHJW8YS~SkH`Bm{Q!Ez_*SSmX3&HR@pFD~u}uTVnkrwC|e zIY>#`1@L-7-8w|Ayvk8<6Je6c+>A1e+8FX24qt2<_9Pj}3vw_-hShOXi65+ED69Zv zoyHRt1AX8FVu&_RV9`?82R;^U{X<~z;oqh>!8#TE0h_%?ikk@0bKe7|vnTqPE`KQA zLARuz-u9e6^t+3<8^1JFfJT-_sEEsp^^CDZ8W%y9h}<4OJ(>X!w>hMgNkz4Nddqg0&|dU7RxU5 zp%M6K=4Y@QuCWpKDXJT8+7R(M^C!cyPQ+|LCU9m3q%SGs{ z`(WrSniDy8CZ5AqmqO7zDB}o_4kMyq-YX&C(oJnP!N%vn4;Fc}*+h`LDVQ7R3y1Ng z!kHaXde13zZ6lK60{F0<&AkijE(z{PGj=h&0n%f*D2LC!Bx+xZ%%2iB_kkNXEb6p+ z&=?|-zago?fxmLRJLrgmi9LR95DtrP-_+z_vD2H7<&cAt zmP8xNL4{P~0n~|&zQlNV#9okkWJf@_9CA_H|Hyun4vOK*DK>S6*m6Tuo0#PX=xRC| zj3NtO2L77`V9&I@>H}|Bs-4O`3pZ5Qm%U@tX$Ie~{-APRK{yf2_oj6l5e`pNIU?xn zA(qJ_>#Uiyj_iq^{dJ_1#uBbfjT zHX^-+k@;*&sAM7!VpXk`chumq>X@7}?wH%{)NQ0ZL)2x5H*D)!MRm?3odF$rjFt?y z7ZPYM90i5>Q0-bwG!>zD4s;sZ{IdcnB{N&`A`gw&?B!$+3qcwpD#dP;okEm%nPCzZ zyxs6fd*XMo@H8^FSu}BHif)?^FRq3_h$k>_ycfK&8tjix5<(95VbBy_E&Idt+_Oac zA5cpJ1QY-O00;mwe&JdVd((;yNdN#jN&o-}0000mFJmt-FETGMOnP}VlOAfq*BIGD2cMKGX_a2p^}tIl8`3U7g=UdQI=82ZmijjeHmun ze((Fw`^SCGea>~xbzSGaKA+Eh-HQPH5gY~+fx%#cFvC+YnEb!l6Ezqt?B7uTq_s`^ zpF!{n%yA(ALsLBolBzQncFxI8-)SjHy<@Bub+ExcGgZo)`=1s33hWx}HY_MCu|D?L z@1=X{*=KjyoU?tuKr|Re6z~4Q4R&gp@CSSm+a2rSz z{RsQ=vO}ZBNfp7yJp;2*-CLJwd%zjL}JUzGCg z-xXyGYvt$h8Xk2xB)t;W&l{GpyF@*d8Mdqa?G24`U0r*k%`a=LSB#%HUE%5GSq*_# zH)1N*XZy4U9Cn>XHc2T|DZFYojmQbJUpIezprmpB`adHF})?bqNUEiPPRCY(0Z;ZsXgdr5Rsffu@P73XlUAY!D7XY-Y!L#6j$5@Kts6$Q3#iL%q8OVJdie|3Efm(tYdIqM zL>Oa?vRNZKPRv3Cv)yPvPIs;Acg$q!{8}u~J4WWI3!E|cqPG$i}BMkVbI2@w?3nt621W{JRv@! zxEj1rjn;e>%8D2R_R0s-&Y?o~EyHS0LWyI{(})xO#M4{*Z)ifdoFi!G2AHp@<8$!X zMeH>_ui<5^8{W?#!f&*EkdDxVW6;PJVS^E7wd*3WqXF&~X#_LjFkv^Yg5@E$#i4$s z&rPwIbrFna1pUw5vqSxpJXmSyrSt`aNsgfW7wUr^ErpQe>g|sPLAF))Bk*01a9&sB zCFsD7E?7cHH(UlVwL9BK3wD7lZ1G|g?D;T50M8Q;EH>GZ)Cc6``e>My3%SOkZj&4ChIdyZiQ>R_GgE`*?=r6$T zis)7wV}{h2i2*s|)*jKeS+c(`NR`u0lAh z9QE_wuV;$5e#faN0H(88^UuY49Ajws2*g9h5o_*SF|KAB8P@~xZav4rIp79 z`dwh(jbItzk`Hg#JV4t&0-bf(KA|lCQ1YxVd57*B#@!|IJvPLFC@*z6ZTGsJ=>D3LHxtYQimXc1axile*U(TGCux!b z`YFPkuTcbsn5R?hA$j-NQRd>2^bV>@X3RC))U!}j9*!NlgKoLWBoEF~kmvl766Zo- zPeV9*6zt}~3*cVCYY+FKy2ALF9*QADmn?dP{)wvplQ#ok;DnshCB!mLM4p+ z7p{5|K8#OCQ`H{zQPMyH1`>9{uZuEPeZ2U`ecFV)BP*xay`;~A&|(jTFGL?@J{C5t zE){mhd10)cwB00`1R*hT=T}e$!&z0hgnoW!J#f8z7lmkDW@q7IoUlZYov5irnGNw5 zC*h7vFXrJm3V>by@DUQGrMxYhi(@g92wkB#C7 z2Y`m%eA8ft8vkvmZEt9@npSf6!>tfxK01WSi-&?fib=1}F%C{!Uo^bxJ6;mgAzKF!qIzqkyC1Kh18X@R|^?P3< zZ=@|jQ|(ql&HQ+Gmu;<-Ze!Cp!{kF%;y+S`MB5KfXfo&SqDG~p+jM?xL{k}d_n#Z zCVB54suyI1o=9^byaprx!rcUC>Qlg%BgX6D;j|Bs#8=?z7ad@w4ak}XlJYS#95{kc zUT@+OXDEnhTGlFA%ao%u)k+e{V=_y;Zu`l1z(*t_zKzy~a!7g!r3kEnH+Yx0=7JY# z;6E%yHJP%Hpe&hEknelY#Xw}Z3%&*jLYqpY!Vp#_UVcJ!8AeAG&PKy%0>ODeq`*Dd z8SslZXvQK2PS{`?PghIECxg2>GpYMCP?}-du=QiEeiry0$On8z z90=YHvE9OXSx9zm-w8>kOQlx<>RZvlZ$Y0WqTM_jhr^dOz5<7F$uY&Oe&WQIX|tpR z4A0_6?tn6XQYo_RZAuz?SIpvGJ#XuxJlp!l(I}s_U4n z2i2Zi4`qx-!D!;?tyGgWeo=cXoU+U`J8dSryWyIy?VMEbMCzoUwZac^hi`{Qx-W0j2D*(all9E{8r~yVZ_~)-OP@WBygVgB zW4hODm!P@Ssdh`F<)Dh5q@Ncf0~?x>6|c@GN{%Ro+$|@S+3#!6+UXrelD+Y@w1d^fa8RGU4}VA*QwU?9ou-wn2uRkmO$Ni{_X zi?@%axP`%g1!}ev-gFCvEmjbHy1Bp4gP)SiZ+N9=8M468$Vis>!u)o7wJEs6(Iuk~lUH@Kt$1=%IYfQxb=q9yPgLWlJ{`9kM=^`Iexj4* z6TmeRUKk*oUTNM$9zm8b{o|8?6n8uQwLg81vQorb285}+dfYVV#?W`vdyAYJ`}gf( z-fIJ;6?;7HzRD=n%`5mOP7u@j6nWm}jDpIK@*IUn+U`|M)_s2=?WPulyMTdTxN)%-rYyU#Ixn(f{1!E5d2n{W4lj8IL=U!Hp(3uRX`>)|sY>h3i=4 zx38GQdT`m}P!hQXSh}>F-@IlGR0NK@$q&Jlv=IzHzVX3jt;8PTJpb+-I(q4}A3UjZ zJh7X;0$Rt65?9N~-E;;Zi2s z_OyQ-eamOaT^_ZcCB-zJjGDbM>d@=7yhRgM}@nY`()GH+JsB=3{O-P$!!cB?O!Li5mW#_a0K zJlQ}iPJ5W2>)FLFOcW?_Qojr$9LjE+=Qj^TY7u|j=Uk#UIm?>b9o%X|^lu+Lmxpns z1}&C9$7S3j)b~ZbW1~!0#f2ps_}nbuUc#T^1Y}e~jp-MXyy+)C z^nOaB9xneO*MJ-Ll2YgksiG$@lcp`N`gR%2VEuL*Z3kuy8h4qZ^i# zeSo<1=Ud^`Uax92-`$XO&zDytrF7GV*LOcuk6*i5LiSzn@jl%=XAyGpx7M2YDWh!O zmvn!7&w&QNmeH{)y*4=@v;#m~;=xkHu>3Kln;1Fx=K?+|b&Q_8kJ{U19Dni2Q)Urf z35vnj@{;53Ui9&87SantQP5OuBewC2Y0}!p>oRd;#M9Zd+jI-{xIkNDtJ&z0u3{YC ziR=M8%c1h7W)Y`iU-Tysf8O0*@j^wHT_^&0!BEIy&bthxrfPT}TmmV^n zrPY|%4s*CS{ssI_$Z}J`;*0lIY`GC%g~8X6(m( zu9WU4DGo*@tdRh_&={WXx~$Bx~@igfH4`&r~Y5+pT8XU8LOvtM#SDC{TT9H>BTLj=q<17!+HBP9$u$fp21T zP4DxjQJQoR zjeq{G+)Cv8SDC}eJxMTsf^yrp+CJNFP(F(D7V}&)_^BsW!es^Kj0zv)D>Wmfc+Mf@ zN2Uq3A?Sfr|LQgRGUs>$d$tJvM+l+FM3D9;30VYF-91qN&%|xK2uniK z{7lZmdtcQCJ5b^~rbJO^P-NgHy-naCA<>={9(5)HEFa@`c-a?VsWs6_)`8Sn`<8=y zE?M0#IThnB_sLk8UZvnm1-bv0I1k@_?vpV%HCY>wg6q{7uQso>165blA8^H0cE$EE zBh%N2DxcG*i$@`nX_PCRd0Zes5>UBj4qsog%zuncuBmsBnwK@142RoxBz{7-*p7J0 z!p4&IhAKR+1Z0I_@Uw}X!ZOLYt9ULLaNx3F!2C`{E)f#FJeje=7X&805$#4q+os!U zLm0nWJEQx8?d&bH5968QkXr3CQi^&mFjUNouGn%AVLMntUEPk0@Ys{IbkJ$dw%$qZ>p@b|nwT4X-lpqKp$42B;Qk;IYtPlE5 zi7e}dlgnVU_W1YLUg5i5?0E|)b!=vd(!0_}$@7oi?8PjFjRun|`}^TPVqt1e)AmEt ze5^{KkK^ORZP^~jG2U@rCQifSG{I%l?JfBB_hjhNy_tXQu#;g|;=Qu-U)Ff_!C~LQ zzD7Ma8qS+(h3;!gn>>5E}qA@MsTylUE1Sr-XDj4B|^?muZ!K7U2-C=l4-wx_hJrvA1>+C@jgv8ZvBxy z0oS`MBTTbCd#+F`yE>06YTq#2i^3-D@(;Fc@bVr2?fwes)Z7yCGkV@QW7f0%Wmlt4 zB5CzcxV>r0{D4sLd2kg`UG;O={~79Jx^zJhqk16}>X7LGz>^VOJ5A~_Sp3`zGU?8N*6NDu+u|u;(A@=|j;!rs|Cb`q#TaLYdR+c7=&nYC z#p?L0{2iCQ0rKo1jdxt{&Bll zzd*LC=dLjZpYYn*y%cKT6@vQrefN3+u9$9WLxAm%mXEV^=4Nt^CE;D)hA2MLxfxUB z+^KSd3BX$^lWKVEn$8a%1Y0`jVkVzc%%uu>7^qnSt1y`AQRzgYd8z?)HX5WQMj5R@1x%pB5c^bjAVXA^; zSjb=Q2`IRZ6T^q%=6Ct|$v1*MrJ>Ry-dp&9WD}fy;HR)v-T= z`21SVy?f8;x#>}($T?BKMM8`Y-Ok(r0o?(wdov`{U63&njP9c%MY%to&(%3aa4Ad* zR+0JQ{;>iA$O)F`*Hh&_%ESaf-hMvmw+L?)(!#c<%c{hN!UDqu-%)vpWxMq~3oeE{ zon>cebe0+afzhSnU>9kS0iGEAn<2$}8F*Z85k1HaF?*T0TL`El(t)79>mPoy3(s05 zDy#+)OoPly*Vk<)`uK38MI`*k_JXMqO_D)g$1khkTgYAkLJTAtX!ucI>s(`J6j?nK z8G^5RZi@Os#;wd1}_MuovE{AbD<}_2i8|Tz~;gAaeIRS?fgfmKEn|BW+gITld~x!{@T8k zP_!U^Sc+Xj53%y+UnRBy{5TWaY?^i3X+vW3)Qrg>mSs63=P2Kv)Z2{}8`a_GD=RHV zAs9po$m128*es&C%~s)UGL*CRaKnnfv|)S{Q%os)4o+fvX1U5#(A2|^MYb{40p|>! zf4YRuUyNvf9`lqrKZ|)RPk_Da+5RrBI77RRq$la&LHF7R%dCU{RlLysoK)-*&fQ!5 zp=iJHG`GH9<4rev1WMcnj=uv2h;S!>t`>p9 zd}9F+*@m3^A}dyiH+(8gW~NeC4cYiPn3Mkgh0N;JCA_Cyzjd1%&ApDt={jt zWqZOR2B3`yMJs3(btlNf?$Mt5Zrorq7+JHuK_y4qy^5Hiun|m=vFk3!nOE5F(I&(> z;t3p#yb)JEA%_nCQOB7PCPvMk zyLv@CGUJaqyvL-`cO=|p2cdfhDLCv!3M17m7Td&Q`DPnBpC&2(uG6_M+lefn@)y96 z%)fDmcBu^P+=+br2V~YJt{^&+1TANQnB@u{Rs;k)KVm?!fq*|##G9jozArO!LFFL5 zTeA|ei$|rH#-V`IwAdCV^!(+GKL~$CTwYeWYl??S`@tM(H{%Kr_SGCoG9eAVp=b7; zWxDp7`T?rG>L+5FL1o-)qxSjx3#20p8A?i;0&J0jAWbm{;lrcI?7o@Yl#<kUrkhpcA%RIB(-w`z}&vMYd+UT88Xy1i~q{2baK+Ua02fhmjN-0=m(hm?V#*S2=7)~#^Me-`BxECNTGsT)G)xj^CJP+Q`L!0>kBGf|= zn=KG|eCy<$TIc*`z5R`3joCaAmWq7vL|GSe8oe`Atb0ZvidYhcP@fbRJK0^}%bOm+ zv1t1pd){7jfk@4X%BW}#b)Q9lSM>ugF%?s|)bPpfwCaLfm-e)zpfI(w76`L#laJy= z7UGc5*FZF&fvxCGaP&*03i8*>&?Tlmig{j?8}K^EqTA4M0an763PkoB!@D7&d!l%X zX`#6T%J@5vOEpQ*!k=H6>V)y2pE%jOuC-K4>@lX(m>^%f_J9_PhF}np=Nt!PY zB4hzh>zm`>eWnNT=yBYUJQ?8WFlKOj=m$KmXK?9{^U$!o4a<~ezn!l(tz4wZN`&W2 zf%leCYgVRd{TZ&}%l0`m9{G(2bNz*F2l@2+0aj3PGK&Xn@ph0>M_HfmRy?WXa8O;} zMT1GFyV44orx1c?uyZk%l#Jv{E&xg7%af{bMX3$pTQ%0dH@Y-|zu{k>ML*yNQFkL^`i~y@ zChR&qRvUyW9?MV7KAxdWf1f%7eutm|Df5ZMYh0({QihgFE!Kh!$e53%O7z4u zviq`UnW(wGj8I>-*tD$au&G?ZMAc4Y3zfq?aHqHtYkrkCitge1*b5=+6XB2Qa|!)j zSHz(07lgMthSDhroSpM6(o=w|hXNV#!Esj|zM;FbpqA;1DC++vq79oXioq_--%dea$VJpQrb#n*KVw?o zSEqywGFcPgWDp+zYp`kGiXN8SE1_cVzZLeWGv{e0tFJCzUXQO}gEdcPvENp<8HTfI zI1F7R+O@wl;B8hPIc|Lu`cQ67do6f`I3liahPiTE zZA;A~)!wP#>42vKj!79R&@Tf4_fv)KZk(h%`GbwX`^0*|o|`Ud!5KU5D**KlC5TvX znmxF9Xs&InJ6k)yruFp+e3)T&fSZH=ndf*n^};}V z&}uF#uoXt*pZxvOvUnRknKycNLoygk8#60lv1lqgWWcWc$->bDep#0g`i7N?v;^mp zT@`jYgm~@rDKXbo%pZEv6Dqa~lCSy>7nbP3rV(Q`BvEaFV?{=G3T4PM;)+6ebwjWQ z4pbcnd~+QHTge*15H*pkj!0q>ksl1T`_*o;0;OOoR?)N^^eqhZlydQbL9M<%nI8)m zk$*6sZwg!wr6D%xwo;P3B!dbSdIAsVnZO}~!@U<*7so_u0?{fF;2GUCJ#QBO*&E2d zIFRjaR2=2Ky}cUbSz!RVD@juhb^{_8hP+pN;p;C3+;wxWLFvWj#`qHb*0= zKYXgzq1+s1EQ@Jg2rPcirprCH0Gx`%1DrJYLJC6|q+_awXNKccZGZWR)sBNhW6g^- z$^l|spdpG@0W8AZO}n(Bln_)T8`Uz|bQ4%+xoaav6sF>r&5F_R6Lb9*N}QK` zw}CChfQeE8lns)gyyv_@bzEkCs$Fb9tT%DxxfmVkh+!8_**>6$_>Wa$w_0FCHu@1k z)|F@nZbYu}KuQKW^J~aE?eq0lG^}(%eu7u(>IW%!H<1TaUObCdlE44^jG&mU`2d5Z z@dT#}Y7`&GWGQg(Ge{JJ|Y$Qsa*stV`)xgG1z0>hWR}Gi6%ItnSo!i{eKt-5#T!hd;=B1i*iLI zm?;CjO}*C&4>E}F>a#dIi-Pn4XaFE;@~Ya{%O;`WDl8iG@&gz`+~1S{isPBl$X+Pne> zFu7=S+S{*Z<=dRv)&^zpT%>l9B+Me@RPgeCEMk4qi>q(jNKR_q09Fw8#Wwg-3-ldu zmsj?_vY!rtM-1^YXfq#oILfkoGT$)9x$a=rWJsel>@&D99!~K_KMb250eu@nZ*ef< z+w#zW{W-M?FnX71bR-oU~+WBV<$xra2`wsV+i5_`Ky{(5Cb^8722cb=k zy?+K+mSN@UeiWXD+D8k1xpluI^|gdr-h^2XxJ*;6Q{W`brqWT8Tlk{i zhU$pc+Tj3Ql;we00gB9e*w~KM*TrXj!Ynf4QQ9D=)+R&S0gb5wuF^zhAl*)dsmn1K zww+)ts18PKDHO}1Vo=8tZmOqM&`*CgwiGe@i~LMWr>$fX;&aR%p9U04jkSbr^r09? z5h*#1Iy``mQww1labh4rq;IKLBzEwELfLNC-R??! zaQm(f6Ro$&r>#x^O^zBZ+77T%=F{PB+UD?=qO0qJ9;O{S8)Yuu@>}zLX5MMA3%Ouz zfa}JW!D{)y%%a<_>{9uL0@9B_#a-!_J<~P(7T=3h+(F6mvCtL!OPQa-VX`v0%M;U6 z+K}p>G5y?njCSAU8foz-b5nxY%~<&Y8-1%q1T=VDw`FmU&4##nUl!*=KFha(lCQJX zp~QcJ9gVQC8Ti~OP$J!aS6`me9e-hoH1$bHE&iMPWjIRw49g)ae5f4Y+0gkOc7*oB z)>ihGMbP}ARb}XZ-pNEIjtPF3#M*!4O26+JuOM57Rcn`@uQ)#&bypuJfwq~}#HgL` z>sWi!j@iXUX-F;K4)@IuJf@=OkMn^0;pTmLQ`~1x>=7I@9NZdQo9!ICW;yEy{*UqV zq{C~bP28setK7GnAQjmiG@W-vWHoa)owEGh&BD#YCBPSr>oT5`#T${Cyq~O3g6mOl z=%2ebsT*2HFC0WS4Zm0#&nGUS0+w&!Ba7#ewIS5REQ{W1P{p#DJuXxX{*X^6S62I@ zsgpW->c70#m_46q5$Cc$&4?|1T-9+Wn7X|$-9@)o@IOv9c-Jp27}8O5nF(>HlO4t~1WKJ2p6D{I8g!0Xmk@t(R8KJtHckHNMOz7DGW@dwGsQX^ zwTEyxxsTW8ma&|?j>ZD5Wm{iFY)AjlXXd)d?Y%Vt?-Mz;q5WKQE8q`NEepi8G)3E; zWxKLY@?pm#{fONsCmQwCwU?ZgcF1Z2X!>jl_Im4*93Kb2pnostoUX64YymCbC_*Bo zUYDNmMPuN1IjDrCn|PfpvvN7ltOLhnzd23~ zt59+NW-BP^!-?=YIW=8-rYB9|s|=cWO5glA|18NLPK~|5#pym+zJ%q0R^9y9H9OS7 zd&H|(#8O;q*83jb;GE&|FSqn?I&cz=jLI_{KOuPcOZKU1jFUKn<^(P?7k53C-3-(8 z>tC9@k%(VdR)?FHUHn1bO>TdsRb!+5?)aI1cj)SZoO+Jh<;!aaTzgDU%ZzcjrpmRG z1m9RfN&JZN<`^eoxW2jfj_{FCFikGz8Nc6% z^4v52cqWwu_$qD9DLyVYN}Ty9T!#?kO`=?3av#U42ctjk4DFcnY*@s3DYwU~AwRFY zPV-~1+EK5mmKoQiE=Y^>8`d7!Q66I9hKq~BULqkjdc?In29yL~;1f!iKhB}J#r%q3ydt($ zD$u1>+i+b)2qf35=E1~lqsktegV02L@~uC zm+Da->C9}}7&ht)5sCT%)#D}E(@SJ9)R@@$GI|8k-RCU60V66>)75ko9wM$e1PMde zbD6z%=W9JzeI;3Vd8mg3IO&)!;d9#l2p?b|KImlS^~Ht|M8+wUOIVg|0$V%6*UZig z_K^o?Gat5RRP3qc^=T7I(okH77twe$c#`4EyLxUoPyB#>1)S%aap$Q7TlBg=aP6OG z#n9K#uuVv96@V35(UP^VI+}e^uhAXb^pG^giJlE=Wi-&4-{ZYnwHgNVsTubV$vj|? zVNh@SnpOY#g1if=en2@Lq2VMhF>$%%{g^r8l z3X4;}Z9oLgf7*cty`;7N{m#213Afr4Gnx4-GV3I}tll;F&kTC&p|`S9SOj>{2KoTI zR#!AOg)9Hkq4!Iftzx<|RI{^7>b=RVh+Qi*dGY72qd+q#Npo98C%(1hD1^U|0P6f@ zO8$MX*j;T_+Q;a&;omuZ@UBiXW$y#XKy2+>gb@4_^DYe?{&Ea?kvVYC>?0}b+;REu z4Hdw{sw!sSK}gA4K5Pd0ke(1kwAHjj?`uH}p6z8k>UFq5!)XH?x#CuIkx7nX1FmG z+DgN}u={sILL`0y(-)T+%qS%kf znNY1tUDrNUa;2jA)wcb!%Qc&0C;D?VqyBKx{>@{XETZ!0hOgCNWf7RkJP=YvKGw=%T+PHvli2i!Fl$@_4+U;S|2qtvQ(gRW~M?;=gdZBVTu|x@R)1q<&BqA8z<&YQ&6J(r)~6; zR>!)L&vYt5xCUVT4f+G;4EZqe9xTueB#YO**X|9n=cI2tskwv zfw33BblC`WTh&*Sfk5OHP*-}Mkd9gA!!lBxb&e2|wXiX?wueL&NR1Y1j5DeJVWdLqk>`f{#|XX1=A~AV z4KRS3PKv*%pVG~OSYHZ!#;;rI8&I1tPG5QZit{-KM;3tCRHpE$hK(poVJk3%tYE@s z?6s4Ox(-i_SrNz9(6D&=r1|*{LTbV(9qm7Jn>x|2j$5i5q2-)6hl-xB3yy{cfWxng z%8Ua_dlwwo(Jmeky(b>Ef<@CJ*6R{6g!Addmy}>TwpQ%3E=YwOU`Tj0ax0jnr60-@ zX&Pz%>ny_jJ_Jo7K$ctd&qwS4z0*pWM8K5cV}1x}zL-8tQByb1C$OVoezHw=YldVz z2$^b@>l|3uJ4ldK4#~S6xKZ2SmpNWG1;oZb1VwYp zD6x+LaTY_LT*N%aqQ0xn^z?w}HDuF=DPZ8_=pipaJUZ!wkQ@;T<`oj0gxa45j1^>l zXrxS$Lr(c^&0!60?RW}OVO%-*$ox>q99PdNQsd*FK?T|7Be{N4V9Xj00QG{O4;p9` zZvI3=eU~R*DJJ^G9lWO!G>k!L3RCSw%oG`Dp(Aq!l=q2KX&%=+4OhI%1KCyJ$6Sj7RE-UAc#FDm4tq4p-4?qTyiBJOHxgYblCp5_KtQ z`t=D9kr%tUTQroSv@WP&sv3H9+{$(+nZTf1$#Z}X?HjzLG>)1F`qVpQMVaJ`Gr?I- z8A7L!0b~>hgct&-g7tO(DOUo^@XzqgF*)SY-|9?R>b;YFUj)Gijgr8}xiK2u0D#N98y z`-kpzUhp+#Pyg8gmzJQW-4dnIB=e+IM8lv_dSJj2hHTV$AB3wc&GSc<&D4h^8GkTH zl^~Xswi(0^8?5Hqd~ji4l$p{Rx`+cWssPLu@R+wPCeG(9=(BL6c0!TgEf{8K!hhm5oSp1ETjO zZbvf8L4mBV5aFt1HG1t}Gp>di|C&UzVhKh)i9)L6?g%9Yc4SVR>l0XuI?%5#f!XyJ z`DKMYLabrwn!-XFVQ3SD@f}K`N~Q}#mOrp4G~j)g0N=!_!P2nr`12GatH;LDM}yI)}Thj^}rSoTOjTV4Z75S~i*MQk%ritPfs zJS`!zcv!#hjoipsc9)y%@5PTWeg^48R$`9mm{7!r>QClUMlYfi&g7LHi>a!?gzOeh zn}$7xui+U5A@j+lL>e06O_!ljEJ6~Sfx_N1MiT0O9mEfTkmI4RH#6uTz{{ka=mGzx z%&MmD>yC(z?2sak!NPS0HT#C`cOHQg%Ix!h#Y`9CHd-%XDs2Q-i3%42yDL=^I?WRr zpk$~olbS^Ee#~M>H6`^695m&4VOo4J?ELJ%nO}YKNW`}O%5j;7N~f+wNfy@B-WB21rzdxu=>(C8$C=`z3i|bqy@xGax6gWylx>}XE?n9 z_nZ1lG;bTT@Mgyb$ro){Eu@i(j=w&dMX@aMTdOy#(t%hB$$_gEg1hARMhtM?|4I3C zYYfu4knKmR@}a$ChUnx>)+`ZtV1r&L4Ev3MG7V6OZiDL65&C4`FK=)D5nQZm%n@hKxzFFP1tgjd`nRFXYA5@OtC zjRpp2y@@V_(k>+^Yk)S>nB;gLKHhHQcr)WjBs$zB@L^iSQN4*%zZ2!W0Qw4xlf3K& z@8waMFTC5kpeH@E!Cun68`C)xUDp&0)H05Fww-CD$EykB!pH zpmW+h#9=5T+r&Usk@>kPBU5l$>lWGP7;fQQ;eLQ=#jn*B#!1 zi^Ihu+iIyx4YI$tZ#dJ2_+e54vEVc8U26V!53}%Exh7jMKz8Ec#0iY8@Kr5AQPYyj zaugH1XhkF>kpYC|MrN10Rv+S z`-(nk-yWyF$XG=*KMSl#FKQTX)dwUfV?ywgwV9NyUl=4s-!Tn3h}D)R)!3pxx=Kb{ zsL+rD+DZt8EiAoFTOXuvKQ6j{kqrCF4F0|YA34EmwWtzoYmcN=**FmhM&4Pax`L(| zQY63_{>=q}SY2JDG_G)mkQqM68-J-9*TBZYF65rNVwTJ-68T)~GGv8&Ebcc&ty_P{ zK9~{G6LfN&pp%#e!>aMcgZD1gPHm3+AhdIGtH>We$6u8*j5@hOP~Jh816TBS^sdW6jBWzAvG0O0m6 z^;NUBVXEhg{P+`};dxtAut7eM5iC2OD5EDst(esz!#$7i>6L1}(vM^PoPQKKs+Wy$ z&*!(^ewk;M%Ycg6D8yZ=AH#9+-4Z2z6mB&WVTocYw~T0X=UQdUOnWqGMrGNkLu_J~+<~_DLzqIw#NZ5cpEY zJpfnbV+J}9aNggj@!e)ey zr6v3Xw9u`_NjWB06EPc3!&@=qe9Qf4Y1UtFWw`=Sv`EcvhNq&8*h#%t-qM6=(4moy zCXAkwQNH)G-r*JSduh{a^l~8an-Kp={mvX{5A{l7 zm%D9hSdZu@ck+=D&&ze-dCuJ~>AC$)CTE?vsYNE8g7j(=O)+n`A`SuA`zRA$YJG`ikVmHi^=!8>vU{n!oZ>lcgX}+q?JB ziB~~DXLE!c28q(a1`51As;8z)4)s_Dv>}`yh#nhkS-p# za4dEm!`^#kZEpr5`~&J;@XV)>^d92XVvyi@m|sC>7SnD7pXoTL!UmkXA#g^1#TNRB zOxzYgg!5Cj=XhtiFO%;c8h0GUdJkU3rcIQjrAxKX)oQ6s1c-2{x$>lSEm1<8sBfhA zDW5lF4Nk`nYgwUZt7$etXIVdwjKir^_4ZGC7utSO6~Hed{O1%VnhFL>JVIz{|v zn^~qOQ~qcPbIN92?*bl8uthEn4iR(T4&KKd=)zG(z3g~X6c}9*TAM{V1s|j%%?&F- zqpot!Z;`gxQfNt;HE0mv7~XYF2I)HmmL z@fz~1fvAC{hYlcV3wfxX1Msmh(Y}|*rlEs%iR4yrM+-%Y3Sgcd4chLwL2s3?rt5^a zHxyb|c&G@mXs1#%x^#T6Bo_(n=Q)>B0Mc``+lX}zSd~W|PkD*oFvy08_z95}B0Buo zZ3@Xbr6JXPa~>kSpIqC3ez`a3>7NGmqHJR#o>9Xd61GIiF>ZLa0VGr3f{EUw`ZKnx zJ;Ft}G^tVXk7P$L(PxYC(Ky*R4f77JeaE_CBj2#sFRsxP%zf7upA|%ABQJqBxGJe! zgUkkSGr9AJ+bI|+bzQR-Zr_vdSMbqZ{9`f84xAnzL!j*MPM_I=3NC9`TlmO?88ioT;jsylM8S3{m#vDds#Ca0@x%!8JU_JC~K)9Ds|X ziu-BUk>dWuZu3soz6%`|RjU=((0nG_;>tly*n#sNf|t(Rgpn+y$^Ej2wyud-*s|9} z&_{d`Go7?*LCd|q-w?-ta+c%MsP`3`)x1DmyldgMyNt1_OJKS^dcq>KySL&#-DM*) z9BTCLP~cZSRki%Nl(-arnLpfMfaTX z5qKG{c`;#f-_T1^!{|CE;dmL>Wv|;tUYa7EBkC>?a|nbX)OZJ4KNu9^dm6kCMqq{C z<_n9u7KV3p=5@EBaIC}6FKu{n@F6&O*E`ZZFcjOsHBLQ;L-mr<56NRkk>rvZ>UvFw z{O4su=2P;JVBy9(uudZabPctIY+OA62R|v6mwp?eZ-1UG;gJBQX*&75ptNkZy%HW@ zt2pKHSs0~?eJ$|+cdQssNE_=)7v2Zyn=ysGoS5Z_0Z`=Hv0r>m&gzcS~Y`3(rVr}z}zw1(t z`hEf?y`8rU)C;@C5;W!5^omhO?B7!bJo-y|ggM9>_{`Ja^bYPBVZ70=WNgcx5xk7L zWN`@}(FsN=GOW2i<~<7;F{7x-ZlJlC0o+m4lFQ{SM)rTt#hLyMt8Y;obL{F#8(gYZ z3bGB&#y$XjleH896mzmC{m2)7SX4A*y~f*}%r%%d|Hw02=ga<{USiw)(uI$Q zYFf@Hk+6neup(Pib~WX^mYXlXcEMDR(tE_BC{L2hUp6xkB9D}WHky~Pee^f!Ft8zD zD}c!Nt%spp9zvkontUcwLz z>;Np3X>9Ac=-eHxtdEVLEJaHvW-+?+f49HFeVR07aoqcIM*yGOX<%_)Za#$uWesmJ`E$3)R z$H)bT$M907`xWmF;44FCxkwh#+{6eo%yK#>)DAh^*tpHfA*PG}!%I{1$$wb!mfUx^ z^yFuxXE&nCw&>+7Tsx`&B(3@P5SRnXj=;+IR~FonDt`5tY30rq_(szDlV*`XOg%>r z=$9ChW{dH?Y}FQljSWY>-6aq%Zil24*?gAONz(qdkUAAO@KJ(Wo1y-kDsq(^)>$H4 z8zGrxFzoG<%j)3)Nxpw$*lJ1;y>$2v5i_a6d)Jy}kFMj}Zi?)X&7U%kRRrngO zHLAN^QdDY=50!p9%s}|*L|dkF#1ln)E2j11pgh4rBdeNnzE)pq~(>Q@^7|jRDu`?Z(X@R~6&1*(U$63ew+V-!X7?z?V+c`Y3Rnw#nc( z(v$$*&LBf8wB9*x<}QAWDrU=UZb%6U!dnmM6WW`8UDC!J8WdgFX1_6P0|n=MS4jgiXM12=z0osb`c`2{gX=FKR~|2wLH< zz!_mYo&qT3BT+H{iC>J~zLIs@1o|?zt>)t{t2Pdl)_<1H94xostE%5C_~e`)l}zLk zupu7eXM%sk3qD88iZj)9hB2Rm>~Ug+1mhedz>4&zQwSS1Gxyp&Hz5amy4>Jh}h}m~f3+VqXsDFD#1|x=lT0MsU zB#P-jiemncq5%IJ1@+(OTDsP!cOV1;LM8q`mJ@)1>7Vc~-Aw~^?d8V|Yg`m=v%PRQ zHR8Imx|6H3yqpv;5Nd*cQCK*$-ruRANN9qk;=IM0s;aZG+F($v9|TQZNNgyGj1;H> zOq3iP|91pEG3l!$iJut?J6Zt%{W4AFB$j*R7Dw=KkU_&go5giDM$p;Z zr3N8W>51z5_9VSC@AQoD0;CJ5qS)%q@K!s=_}rfRs$H^a(`x-#tOFJ=?pS$Te}jGl z2-6D3x<_(V%drl}QzS1gjE>E8(1)~6u4~jDPpQE+wh=^}%HOIa#dDri~ zoHH`Vjk8(~<`buRM2Vek=z&7_G+2T{HYODf?xwYw%S3lBUnl!{CgR_wzzCfS)$!pJ zhw*8HheR3o!$GaW5Ll@oK{?I*(bzB38)=uc&cA`JYk3%*8*v<5Fc^P;>nu4=Yr(Hj zy3&xAwS^>RwGrU=4P)P-xA3WvbvFV2`_z$LD>UZXsJNJuc|n!xSa7*1(I0w{ETK8m zA}cHglXih1nO$44^D%+g!26dYmNs=2nDzx)oumj9YHw>9K1|_p^J}uFi&s(%@RF0# z=LPn{tO5l7*V zzx_0gKDUjTsWk4vY!0i!X|=I)mg7lR?V3iPhDr>(-h|F~NpFlvH4m8GAaS<_ zTdrllN($`YTnlKhNZ*1Nb!^!he7mPOU=MDrdzAz2X=~b;_=VV>@7U4Kl05K&H;5Z7 zdeQ*=qjC2g_hiNlJk4D#TBtOvlJH(wa4|cl63dbM`^F+hGVwzr#sxlw@%w`k2Xq{y z#_P33Hfg8|3IzFH(L|KLw3scG7#GE|=zdv<1!~^-Ip|en)Iz-XVtj~||K!p`wXPBW zsTS9n6_ad8YL)b{aQ z$aFpg#lg6%YhlP0iE*Ax+isH~5~areMalW=q1z&hA#{-gWb81oOXi&T2+-32`3zKR z&?T{oZB5K?OWWPCe7gaQP!jv>QiCKUvPmzp+YF-%!2m?N;f6A5R0v#S;bFn!Hd@xm zM)GuScL!G>0~m6*{*XiesZG((Mfb{)g`}ya=gPni4VpK)UN7<$wywpaKAy&f+c5UR zozz*a$;W&(Z+qIY;7)=<|C<8jNQ2vXdD?3Ci$P}W+e($Dpb}m*D@K?#HgFyl*hV_3 z>?TDvPaRF)WM|`*+O7Ecsr8_CgbcAW45}2pP|-u%(6PRW&n?*5{u!=J5Yjl45YaFj zN9M1^-536IEOTdFtZqP)A;7h`lBw=l2`1hEOAmuxgJ?d;_@a||TkNIwsX}4;pWWSA z+<4vH9;drw0)uvF7fVN9a`LC`$XWC*^i)dA_sBP%EZy!w*8F`af%$5qntC)sU8DXC zIM@!t1Vo2VFV};X^b_s+Oc(OGqy?*D@f9Azgg*HBcFpS={cRAjQz@MuV=ysYO3}V$ zKG)Ljkz7YC^WPbbrJY}x3XpE%3QT}(P^xtrSh8lGn;^hTtSMsE4cLXh*zox%JGI(d zQ^!uRQ5#ixr*LBtXei9Kv;VzshjJsfbSzC-*i*aA==uCSnD`DG>2OiQVzqvKTEEK0 z$6=O$4eD}3cTcH3;ym-R5=7;Kgs(mWIJt3K7g~q1?ig~VnfllXbIZo|!t}LM{!W=Q zO@I*&_Ko{Bm^_cnjq7 z;KfQ{u<^Og`s>i&#au;&dso=$v*T)fhgsSUHmq+IuzrL6Na;H;*ydo$X(Y`@qu<=K z9&B?^>VBXMX6j?Fp zSVPKYa9EDCwzB#@R-^$htpWQ5g5q?Pt*ZvS(kEa=!{;!EqPc;s zu!4{{JS>f{L`dQ=cFYT~rW*Z=(Lbr}E_hml=^dX-o5A8VI6XgFW8rqSD5KiBt~RDh zNxRT4`5@r~>)q{|8*=1^Vz9wb2V5q_Mx~15L9{$=;mMJ>`*Bbp5+l=`n)r26;r#eh z5heWKU24(mK8b|5Ua9*T_dN9D;)jQv23o-Cpzku$zrnjXNbDP}yv7=ufiYeKj56Gxo@L0G07S=UOD77jWe3?XQv5uYx$b$l$= z4E8v{i6*QcmY|r^gkBG~D9*@}&#DY{zkUK<0->b=2^m9&8qLTtJbB_uc!j5*{V}@c z&K30Iteu~~O8h$s_YRqd`}Ze3Yb9HLWUv8oHiRIa-+?+X_Gv!sXJv5)y&*4{6URLR zdCPW6^0IQVQ03hHxTX=hl?~K<#}dq%&+MZZ%7S4xEoi+@t|Xxn^l9cem^Kpy6X16i z|6<~i?aQt+_rcc|!#&1|_zLG6*{pS?(rFHQ_I|6PTt)Biq01})W37e>q@@kTZk{WL zk5Zh}V|mgj!gC{t?=9R_0ICKZG#LoHboXzh@fjFcjg9+GIavSkRh(@RUIKp9@^Ia>MP^kFapt zG?ayti%!s*eL58qIo#P`#cth)JIPpWl+qBYxu*Vj)*K6b;sbp5~ic8mHfoZ^NfJ&|6>FhtZZ zfhiw8;@;xEA_2YHPaqAJzL@uiCxwX9L$HZs^c$s{?nQ_tZo|9%d#UEfpy@AqW_EqC z23=l!>+CY{L*VeskyFYLNwX2=n)zLFPwQ})*ML>v2_>Iw zY`seNR+94v5XlocGIVkkqV^Bh75lQy6SQqttYcEHFo}32^a2OIp|t z?=H2{7h|Pqwc}Ov9s)Tm=Vw~=S4z~xc^N5UgGvc+I8Osp-?hdIwzXP}!5X|7|$8mVHOs zm_{=18Ay&c0Y3M5HvxG{X&Bj=k|F7s@J_X2Aq@}P;j-H}Rm7fkB9Y@s`hYz2uqvvz zIMD$6H7FtlB){E{FeEEePg{{dweA`|WTPFm!Fn4v?()z+U$Irsabz`2kr9@?$3};; zYMyS9YbPBlcd+giOn(UyAA=niu&X};yNk+}d9G;G!vhNM9Eq{CBa2acBT(StYZfMq zCL(8;4PC}a#GW4|VSDg>=S<9cWnS0GPV`EV32Kr+o~PiW18z}ijsk5f(=%35Ko;c5 zLPg@BsSf=`8)Z<6HY&N}*}SF*Yi>ZPCRN@5GIFI&qa-bjU{^7l?J(?C>Xvld(XN<| z7jRJf5bS&aur@Zy$tJrA78SGlYQX0M^~XJRq`x#)qs0*$7lDf+VEj`Y};UOTgf zNN$nXZ>uS-Qu-U||6Veob31#+23kP*)F#XfrUf>zZz{p0O?7tK_y!mMh#Pai@<>vd zV#!w^IA|3RTwyD#XjJ6O0t@`E!(A$Tt~uw9i@m%=jcgxM$DrA*7;RO2T4UvQGKyPP z<|#>3HR#J?d3V8t7ohIE1+7XSZaCjJKAQE3m0Gc}ZTeSBdl6Bxj2x&9%=4p>$ab_t zIR%~HUK)^lXU?WSrP2&d_ud$bh_*GMiv7{lS~*4G;YuQ@atnV-h1BiHS^kE`Q! zM_sL~%}aRYUMyE43Hhf~(E^gK>-ZWtpwvf@u`$a|wW2%fy-(Q{MJXil1s8J=X<)ba z{SC*7f@jULkO=%l3r{6lkUWq5Kx_;plf;j|!=5R%L-HaIAy9YwaABh&#|>?_q^p_edsMDy~U>5T4|wng7I4X4WU~#R;XzQU|u= zU{fa*%6iru#=Z{i<#xMd=4%#(yyFFjVrKFUO9U9bu~SD$Xh77F=Z z!s&FBE{^-De3(3J)I&XKHZZZ;M6#d?pWglj!^&`J=$~$%z*939TW7^4t`wkxJ0qu_ zDTDC?JUoI&keW6_ekXRY?K!DkAH#~FV8#Gre2q-3j0%V~EZT2F2^QV^m??9y<98{I zgm`+7nU3ZyWX)A4ssln_Gjp0GGOY-0n;%zzxozwuwEm+GHL0leO3_;~GAK4`2adF{ z%!ORI4+u_P-=K>+)?cDBT!w4(r$=-b-h*cgS_SK4skbhvGhJS=(o>L8EfE%z{!S0E zxcA~Vm97O`uUBa;ok>F=DSDIN3&~Y|gI|+*{^)mXr2tzzirhY;5dSH;9;m7T;zYl- zFdHR?f8#XmlE`f6Gs;_%2E9H@c)Ma^G3XplAW05`(WcmBMN(1rLT$L7GAaJCNGrjJ z&II?XnxdMp6KP<*uSb>~0$78gyJs zHA^Gv+U9gs>7;gaw+qd)V?WK`7K;0ppx7@k%v-Q6qYjhW_;HwFEByZ^Q0t~3<^@uL zHhRnxC)x-3pY<(ubxnU5I{2lFfBy0J>^5@wb*VWaG+@Z!6Me;lW+!_;sTuOnXWp{) zzs}kd6qB+w$-l9pW#UO)sE0`2oUik^O;~;#zvu2P;`e#yy9rI(V!W=xnDO0Xy*FN( z-w#1UXV&M9@W}cvc>aR^JweON_ranI{_NZ2O^+)H!T*hto`m(BR5a!XX5c=>&pV>tKLL*}w9$N5C!Z@%YCC`@wi#}MJ?rG+ z;dprE&e_jym*B0%gKV0a9$3gYGO7#9^o}tIN1xpI)+(K@M8twKX-d9$Si+azZHO7K zZ$)K57#J@7UD-#t0=~>zT&?Dhy>{xg@Vu<16#k&=N_b9Z&QmYp++w(IiY|?Twrt$pXgqo~APEgSyS1K-@S?x4Teu#|8yZysX z!dQzvJr=8RqVzEdJtCt4Y}nT!=D(XcDiKfCpI0JhVkt_gizN;BK$({?*%oG193|x+ zPLkq;rFM;C9*GFZw8^}o6l4~$Wdg60AWyQwPCZ&0*TD{XtKcJ>1~aR zJz>I1PiPoB9{3q6F8v05oXlUxHvqx%R9MW0+vqJg6--lwtbH?rU5~*lS};2vl;&3s zG@n}q?k((;JJn$6gQ+4K;hGJZb)d-1E>&^MmD-tRRMWuH->|!GOsur0i&ea7V4rvk z2|Ih}*N!p*tVd03s65-wPHDl|zjrFNgj)L?L_UH+jm%MFBO4jlQA?+P`~s8Oq>bR^ z1ZFY*lY`BugbA%+Q!9F{>az4ocZ3<7zh>kYo(k%vrc&ji{HBJ#;;74JrXKEdD2kK@ zRz(CYuHI1f00xy=_XLTP`iOg9gG=hie`E2`^4Vn;dbFxryp1lxe$mSERzr6yzu#5! z6&q+)T*zgosF96i$Vfdh5fAwYN>}qb@RI?owP1#NHq}FDsK#U!;N36Y;<>M(UMP4O4O_ z&Z!al9b9HBwSnXF9U&+r?8?VB=r_9Zdy{1P8x9EqMFoMThvAy-!^ESmbr%j$XS6;B_ zEnH^kD%@SE$!4hZAfC*imKP1MqtzGs~@{j=k?AcrGVC zg9UaU((_fErV^~K1JAqf#XT?JQZGVU3g+XL-)i|I>^rxkrg$q}@VYAhAqY^R5rCn%Zft+dp0Zw-02XO8?yTBd0(13;tjik2N zH@b(||CX{4WVJAgHP$(}|7RC{)Q%n;7@7qvvDCFzHsrK}UWg|=_^dkuHjUTZ2glxH z*)m##Vku+n3R5fB{*l!A(!_=m%s7QWgt^6bLkInLs>A+tfg}fActWk4i~EoNFp?%7 zwJTgGspOv1((@{$+|J*6@CjYl78lP=+!S73e_JY0x1tygR09s=CY%=T7tzwic( z&T8EyRSl=Akj*vfKfmg z6c_anlz%ZxCM4xP!GamA+q!5?Berj{O|cOVTlQBuFa^NrNvF)T))ZS^>F0(S>1e*|Cvak{B68Pfmt+kg4e``wR!Z*681cuRQGGM#A45HjP4(Fk6*mlN4S8FW zCvQs3d6*I!zau&Re+=}_OPnA@haap6Z>;*iNl;(+f$lEXz`JY59!-0AvH|&kYokBn z+n+h?=f0$(yocbnNBF+U_3VoVa`tlWwMtW?)GoSjl5x$Fic>QF7%E7sX1Dh~B@?~B zcMjEE!UGJL=*c=fAiSd)j~%%xqMb>1GLO+&_ZKbR_?Q`|3^mAV9%<(FWE9<$zlNQh zhzrLZ1<4G0u#UyA-~rt#;a7|FMQ7RMsDJLMC=Xtm@{G{~Gh+drUxM!6+0`TIsD<@d zA=Ss9PHQws_GQGnVTN+>QErT`)n~Ae9ELY?x@S808xiczD_7Axp0h+npM=_=Ut1N; zY7|2%p>gJgl7AVLzarUP^~i+2^==Cgxv+3;MiZoC(n-s5E7w-fT#*|uSZKZttC!SI zCf%`m3AbN>nf=F!#UCr!YZ{F0v7@ulGuKA%*@oxn_Rry^(a%(K@q$@yEoQoB zn&oGggQ#*G0iHg`BkUgy^Hb<6h z3*fFlK*k=hFg4rP(EMzbCQNSFQp=VN6khv=E$rsxBS~rDLK#vE?Xmo6^h>MTL#XO0 z&S^&u4ec+~G%D_>sew1<;DQb%oOb*RAY1VI%|pAbBg2wSM&?XqI=H)oK$hT<@4*=p zRxoBazFncGzFDQ+8W=PCyqP+HPyZHc*UUi#6WZuJ(Dxgwobt1$E(_1`}Txi*JgGTwt3Wy=_)-xah)<+njWbv7UMz(%lvT&*j5sj)O(%3 zV*}#h5+{A`*-uXXnaZ8bG#k!3=to-Ejtd!4Erp&i@#;sC&*Sy^YnFV=&r-3<-=SiW>px@UOtucA)t{C+(_ngj`b6 zvs||uu_c{w?Wk6)$4uB!ao+IAtO!E7OoO{SxhA#lX9q8t~sR|+OoD^liDSN{Gi7nMS{r_oqvmGK<8T}gFm>s5+44Z6W(&6!5Ic;BmD*}1*= z^F)*{zU4LCD+z&Kel~nkTw-m?->boB||b2@|TVP zAz&DgMFsh0A#z4R@Bhq(h8x~--$(^)9*7w))&>FwX|19-w!DYHjGyfG}T9|Q7 z_=L^AzW$3WpVW0TyHBjXyEtV1kuPt~S4|Kv$=X|(b-hI<=nWM4?C||kye4CGh&*(- zPpH4a>&+W+rg^K}1b^}>e(#6>_|m2~H9?@n1fSii1Ea)|v1I+TM<~sT)|;_B52Oxj zir0NC@bYaB$tMfnco_5eputiPv3j^Hyytos&)1>+IbQuEc(xxC*r57{Z}Mqao)}-Ms`*sDNflIb5cz~NO6Q+8)EBb+DkYi<@I)#b>=kW-PA`bFg=~=hMaQo5V8S0m(GDTkx^PaA4lH znQI0WJ0z3p&m)=tpXDQDk$pTx4nTHhCa8CzXox3VMuG^M|9mHW$<25$r0C#)B2Udv z62EDC2lJ_P$HY!eTp2w1v(K5)X2md0arig%*zv8Fn3QVWLVLM!e{s_^bkb1|{_9O! z(pM#-3-<}xO!1^uCWswGqC02-FMS@J-UeZoMn6id-1->)Vd2JlO*6WR(Bn5KBuEy1 z?_YgtGat^+fJfB7ASTr}1hD#>W=~aUHK=4;h&(tl@V8t_GEq7n8!gvb3K6)72Yu^Z8vcyyqtaE%#u}#m!dhx`>yK2Ff&A7P}QGyJ1Z${5?aqNiGfd;WSQ@%E|q_`br}#3Doi$1P&3) zB<-Buk%&8%5(^fTQ8^b-)>#r1<~r%hJ!^>Y?G%3raMKK=D7N0PIj+RjEOBnMbm7lBj?Z7gp(q ztMe#+YJ(pHJEU`{nq{vZFpGGeLQBmc3TCBITz1M6{kRi_mmf&$ovieue(b|? znEevw_-4qx_@;4<@S%h6ielDl4SK2Fp!gwq2R5Z2bGTX1qkVeBLp-*zF)E9S7O9+k zJ`IXu)?HtXXOQXZ)J!}bXT5J=#%_}us?nR!exdlAzKd`;n@8N!sKY7}C>5xQRwDL; z4lHW2Tb^K{`e|jP*JNhcwiy5NMP?IxXNCv7^nX{V`&kDpts@fp;Tey@;$>H;Eg#tM zb1I;s2A;xaUgpR+J4>W*{^laOSC8+SCj(wmI@~h_L}rS*8WkvaTijjl@{mjw=u%*cmnppr`=;8KSZT>;dqwa6(i2zZ)$V~f5GiYp&2i8>x1WtguYtQ*QX`Y zK7FDUcfOx41os%g2|W5_TGubVS|qS6Q7)ZeCP7nVIkWS+0%th zW~FeY-)!;J`9n9K!9z@arJuSLb_oW|KPEhTs8eQiLv@K$gyM#)cUT`aI2HOp&R9Q2o z_?wP(Nv2Uc+Z3_rJ5t}IZSoQ3I6yn(R%!`h(>DFDgREo`6F)&b`~_i*b?Q5!;#)@p zbGma1nB0mIyd$3S(!P=6;Ttsaqi*Tn)1Wx51ZNFqmt0MiUi^Dv7Mm&AKejkV4Py5p ze1eR*fF^s$ggBuf?p-m`oL$14;R6rcQW4gNL#iaao4q_}IH)!)CuA9Agj^ytz8Wjk z#dsJS9pJOsz$U|LuAu0Otlu`H5y%w0|1Up|!YC3nS z>-rsc6~aWP2vj;9xRR8jG;7v9`(J6I^SDmn?vZ|F$AhwdVI zyP?GI)o$`o%5lA&#e3oGgH++P{3nc9=&7^evva8MJdN>_kET-Hl>ZDnKI`EXTv!|^ z8z@27+TTFF^7I{YAWsEC1(_N8J(G?_fB|&O1^dY+{KsUi$SIMk@g&0X6mIX~npt)x zdlUAo?TVIPJi;nE+`wmaJz){KVdhD+tcO*sBwSBWb-y>)#@pe-U4;Hq@xa=kV#xuB z+1Wla7N_L6D1a*U6BoT~SQzpX3@*p-UnxT)KNP;%U%?u3@rv5F zhNRl*TE2%AD^u!-)n7F#DV_eU!j%b1RdJ2@Dvz{N%h=hc5@jn)^(wAXd?Pp9qxaXu zHNvvVGLS<0|J5xh`Lwj+b@m9E{#3q?7yExi8jZlzD!-hMfCzxPS^kIS4poRmEpT$DY<;B{yl zOx}Tfd#(7*$1bd5O>b}IHM<(@w{YHIVR`j6i7#hZX@|3$D9ea6X5UzxQ#+&Tx`4^T z)ABxU)=`adg^L-T>yRh;ZF;pCf*KT9_6P_viR}j60sXeBe#H{+oac`)&`yYMZw+;E zaYVWsx<`oVcd#ygdcuX<7*ixOm3vIaZUbc4Ms&DB6H3vqW$03755zPynCI} z*cQU-B?rzs8Gs3LPSvh^+49}8Q_BmSk)Ye`rS%<7(`NxynS}BLtv@>Pt`j8n6XJ&} zw$PUA`ril50!0?X{zT=x!7^lC{6+)!yV}^_$#!72J{bLw0K)p10ju?GT)~=5V_$3- zYe2u)6nStiLHsIhoXA(r3 zF{Tb>7r;KCV=?dx`owm-`I+gq4eS-Z0hymmOwk(M3p~$9U~ws;XZ_K!e;BcKJuxml zEJ*4}vJKNtp8fsw#lwm#1qBSfMB%gW{X6l+fXn;2$mc&$O9KQH0000805X2zS~UrZ zfKDO+0QVvQ00{s905C6OFEcMQFECA+c{G%b_rRaWGdx1iNJ3?n7Nt^zHZzz>Z%K(Z zX=6&g?IFvIb!I%I^);zbim_DMUW!CvW+YpBja0}ok0r)7GqO#LnP1=ke&?Qh&OPV; zbI(2ZbC+|qz*`^y=mG$M111*(fY~35NdSPuf7J4g^$h=ijtAF(`#vl~TaLwUm~zgg zM)=al0(x5_0rm;saa~x;byn_(FW&33r*Gv&pyvfWbc;sQm)uh-o}e3AGgT+$JP5w-;G6&xehe?OT1mo4dW|5#Be)p z%qur9rY#n3HodkHW0`2(x=I!r&>1(^C6Ba)CgtyXyUA&AlVNq^rF-ZEa>>xH?tIk+ zIPgK;`Su^zA6`<`9@trYe(m2T-BR*k{p%x@KM27AgD0+auYa+r`XI7vO~f|-C-0yn zG_Ct#-|WlVeJ0!5n!Bc5{QQEo{l51FLK;?$IBkltsF&2{T$@ zwRiH<)=Bbjqf~-w6}-g4alMwORwgIMeBa+2ZC$Lxr(_pa+1`a>j~FfXTLcEu!pL?P zqtc*2R((NA9C;(_%+H6z%(nhl-a!G&i<);GW{=z`%)LtqF(zek?Rh$QG@cvzczD?V zux8-E=O1&mWB0lG+E|&H?C#HArnh~IIUik8Rn)xRjw(Spj8eOw3>RzwO;~yVl#2SPKSw2LAkhfp{`C z^xd!4+5?oC<9hUJ;ZG8wSS+?-gu zjn8`;RW;Du=>`N@Uf1?=S(7#ev%94?j6P=9-*yo+_T&gy9ydZ4-Hq` z_~lxVxo9NMGj^wO+LG29?#^Dq>%SKT4Q{x$A}!&~q_=TM8gdP}loykr*O5cqzMO;O z2|1{y@JXvpT;0;b%nZ|aN5YoQ<05d_rTh#7fQ1X#w3o8hV$~-4?daRs___OKlI)dk zXZLK{V<{@SqL)xQ?kF(3Q8sYF=V(G1pL52hQsw!!O?3+ zi60xUta<1&li5UZ@K3v!-!pza>x+IAnWOvEoQ%v5_H3){#o}l;-@Ft!cv%PNm9=r_ zc|B3PU9J3aME*RmWwEXK@`fFo_uRf#cgpcvac0a%bKKhL#+Yr2S8v}xr5tN`;4ZMx z+rA$$)5R9Av448_{n?!0)s-7x-`y{ucRunpwxe7?Yj!lNliSv8&rOQ0J7~XV?39(& ztXgQ%?JKmc;h$dCjdAGKb;~H_4Ik9Gycf{tJM!1%K^ngraFy z#TPrv2%)1wxE~4sh6oi-*1wTpYkY7LNMr)!P(x|?>T-0IUY#zbIU`8>_q%^*%vDxl zoQhKPX)(8U3qcu-k971V0R=u}-jZvCu|Rvvt$C=^EVZBl3D1Qu`cilndNa3)s#h?l zktD|9aiLLeZo|P>+@`9xOq6SipsRiGmg}ef!+a%lj5Zr^A7ac((^yeY*HT#vgT$A) z@ZY&*8vT@PPV2#;pCKK0W*bwdpV9-ElGvUzQ6w6f1^FT~p+yi9p3kn{8e6vY7;aiQl3< z<&b*-CNF7cOJoqyoQSQQxcQkCB7HT0Ew4v!{EMdD1E=o)65*#m?Q9p-kFz&3#r0E( z1DF{U$Ajk{;N!;s8USO2Q2$$e#W+HC!h7fG0A&?K@2|n zy)D&2x{JaRBhhWNtdEdDk^4x(HH-j;35JftpGr_}Q5lwWZ_L^A`WRI0 zCSVL<&Kj*`7)TY|%tpHO{FmWl7Ex&|!%L~e7Lc)#U60bJx(q3Iy%veJ{r0$UJjGCnBPC9&;EtKAQgN@#fj#ZWel~)g)j<0rY~_x8d*)%z*7` z_~3wW^2Q+tr5{DPXZI(H;^o)LtWZE0S8|($@%6Q|iS{aI7dg$SPA7T5!DixD8kc0BBI(k2>y5xOD-Oa@Ci)eu`C)1`ToYpf4EeOr?#0t={-6^l1q1z7g z|L~4VcVs{3UaEzBJGg)xlV71_E+Yc&QPXqX^n)YewQYwyztJy*Rx`)Um+pZ0Y)bVE z)WcmX%^j#=GxEyN*7wf-bGt-?ouY;wk!h7p&H`di1`9hl!|nxH=87}$KeJ0HiYYaa zc$xxal1hEi+;%W=US|a|HIYj_`S~_+NG$QFjuNMPvp+*vJ;aFS4E{(09)@A9=8B_# znJVuJeG_U10dm|{22kSw&}f}14=)&aY}i8G7<14tiBSDim{^Wh60YQ+@jeQyiE`RF zYFiigpT=#^nz(k_9D1v$YC6DyICeG)rvPYQbFVQCPw0=S5Op2fZy&tn2zW<9i`q~7 z8Nx9zPS>~x!b^e--I#{zDZ5;B0`r@KEdR9CsP+r6#MG-5EN zDGW{{tUf(cN9CE(T#!8aL!TW1i>36ff$$t-W8EBd^&#FP37)J3flicUp#2AQ$m27= zhTyHH;Ul?~X!_xN19cee+zu^cDmXf^;V{kxXh|l^Ih?bd;to)f5c4%0&JlDKpe{pD z0%7Q>c$8pyo|mfnHoz6V`UdhA82%EXed)d|fHjsNrvf_D%AK>)LB90%7QzW@1`pVi z*`#ak(MJU~0|jBlM#O9VkOO`QVt(|zFRC_*vm!)vTm1xR*#!KW%sn*|YSnIh~ zW!6(Iiqc>Tb#D=Ie+!;Fn6;4-Hl!>Eq0pM!&f=){H$eG2sg^PiI<{LhD-wGirdU-Y z1oGn424!sP52rP^yKucMpwcEQ4j2A)3PaQO<0GTF9rtgT0Ofc!S zT-7P^pIEegKn<+SLip;2Sq}e#6ND4*v5DvCNj~;1DR0@tj{L&CG~BShCv5MVVp;@Q z^dJgvz_Udp7$U_J%nH<-=f13T#{=Q8R=M^E86d2H8>Fl12zPv0*WpDF?>jda3Y`#$ z2q{-ZYZ8lf91}u02B#4suFdx(MyIFKDa!7q_unB2-+kgAt=XLKbO`r2V#b|h#S4EB zFBsL3D0%NhmP}7wZFOL%0;lm0Gt|9CHC&J9EG8*()XwUiq|@uoiW_E&tF4{WUyG~< z`Ib1{dH5UtyvSeV9}uks%?!Z`bgZZ=?W3?=l}Mq1*`B!zP6Xx^R6%r!g3%HJl$b^e z=prbxf5#ZbRiF`s2H0A0_Q64&NqrzTze3hjj?zXGMIT$h8=J`|-b3v;+-Jn6UP2$H z0*7Qmbf#U7R5<004q>DhXKBw|%{@1vswGWad7vXU5Qfbe1Zng6PSWWpo35cxn8rJC zh1EV7@tNlZJEf0G^#6u#Y!g5*1R92J%(OP#mVMFlIfcZ9f8;oK6{>40W*YFE;vUpTP)7g)cg=B*qqgQ z5I+ks-e_=fTmTpkldnt{d=~}4C*}}YuxO0lR)l`l`5+fg&ZO5+bp05g8mpl{lSN^t z_;0Sxrty>K?BIV-<~4t%UzO#S5)4|Jy7cfiP2ewmVQP>muo)k-Eh0z3XrGQNV*`23 z38I9qA(q%tJN!TP+E-{*tt4Rtu=$Isv>Km50D1a{L9R!L*tC!OIp*O2*@Vh@c1xuO z@|Su$tM;ZM=Es3w2(g)KWDwJT-=*gpgc+S$giNaz%e~#COQIqSNmrZbl+2fj<`oM{xmy%1e44G29V=Vp$KE5 zN{KjhqfyrJv+9#26BOC6jb4QLyoENsL0L7DFgX^-IT|tsV1cl20Q{1m>+0?e&mABGg$5Mhvaoh~ zWYbS0;i-kLP&as%Xm5byBdiF;*7W!i4Ltwz;mKa<9K&U`)K`d!aq2-5e*b>?=BrKM z9$3WP;N*T{o#H9#6*wHYS?Fxg%#CoTHug7j<-Kob*VfN%da-7_8RY9oLwWbK@bygb zU@>n@wcT?ld^zu>m6g=$2bkovM8@&b^d(-HdxK0+ zg)MS%t6o8#OIz31?=aBNa&8yXsFYYhxWR#U%xv5Z&*_8h>U+TU&%Qu!_eE>I#Tn?- zUje83W@;>n_O%@pJ4Q|4=q|tY=avOToQlyOWp8MG-|}~=MUv|Y`5mp}fDga`M%(Le z_N?5n2oTYD9ASEbp5!K_SohoHj3UCUjUF>SePizHiLAN?jX?7?ql+*b; z_HCbPdblv%#YfX#x`@f!`h_80>J=;OX{$TXIBBMx)hw=0Zf_asjGXP~Y_tBLUAN~~ zf!$8y#LMr^&xZw9$#)*=yKpzsXohgcNA-_)EZ*SwCYx)kJRNIRKTxOfmd&)fGapQi zOsd{0Yg8XU+3IM`X}15GF}W@IZR*_M#1FH|ryAzTHXv$RC4+U$Lh|%_8RzP<8w^*g zw}v|o>)x>0?|$%o$%?Qii3v_^S9wwTjN|k{Pp@?g?nZ_A_*V2Bxpbp`|g=y>4 z)v4!Rw*1(}HPk;Yvih;7Ym3~u+LUA$61v(9=VUmKWX6{YuC6?@@SM{BOZvluCAQx( z@-6RcH8bY;wPn-&EmGAf8FL3u@<|18TQa!z=FZ6^Iydurgb^d( zwZc%P(ezq;)S00_>rT*7Umry;SPM7op$51lp6(Lsyh78os%X2~K(R`{G&_%uze(Xg zB3XI{z|>Op4@&c04YvsDsMGGk4+)cXu>~UlXUMOR*b^XTikY6zE7_+n!Q~%BHkxIN+C|5qw1L!;dYfQ++H9jG-- z^Bs+rvG`p|x|Jiv$-QltfGCQWbDq)JQ0{zd4`6nzfx1|4xk+`AG~S^IWCJ zO#9e-FTh1_OuSmT$1Q<{)o95F=hdm9iU^3^Ne?u^xKvLI6>>snOAqbs-^A)wa!> zVbkHS$RSnofdK?qLjqRd$6mFjJFtFh7fa|z7x16-iaf$SCl}zI@Rxs66cJt1!LE6?10z2p%#<>SOqUWoe`ZEE0d2tBG*IKt1dPpG`fe#79rLo*wb?E#J z?;xr{+awF%y_7upgobt_*EZz5?gt)GQnuXu^NVtjI)%4tzsG)szAcNhbYrU zwxJCV5m`(iXD_?{4sXt`3`BWvX5l20H*_D?Izu$OrmZ6AhKB_Bf~r)5V3@;9j!$a?wiFZLWQTblO9?D zPvkUUE^i$GOF*>0lNN!(BQfzsehhA0ASODn8o&ixV&p;8DcZvkZHt2txJj`FKX)^jkVnm#$IrC@HHr8gPWO zOVq(NQZLV!i~Ji1QYm<_t3*dGX67;D(xk|*q?q(D9_h32(Cs9hYp`%5zmclkt&aiplOvA5X3X+^=suM1xknJ?$y-f>okLN{Aa%B{L{fZLM(~GcA zhm!)omk4B?$UY-8v7Avk55X8(kV20C_UDqTLV_DLv>~MD5j+}5ejTQ`O>ZN&!}de1 zw@P8B-e6L57_7;|X$8Ozx{yyhXg(=$dKOEc!clCN(_9sRG!q_Qr_Ff>k%)Qc*Ub1n zW+~>Io~@OOtlH_UC~!hXc7GH1u6PPrziZO8m{_-&$&;AgaSb(81qrRY!CVK$sDmPk zIyKFZbK69r8on|IK3_yJTlPf|41e_9I7MjYFHl7Ha=9mnK-|Q0LiHTBqzcUta;)*q zCYtsRk>gm?HaS^B!Y;wTZo~0&@v&u~V+kr;fw`sh?y-qy+VFLPZ4DYxw$5rBqHe|t z-D?z9zff}(mgrv@A`~3uu5W>H#r*3cUq9O0D%3kuv?v47DpB=ym7whANjML})bD1H z6XRf3RxNmZ5Me#iuicM{i1@|7gp4_!!$|fJxEmunoOJ)2U&? zi@WM+Dn*%~I`aV;FvI;vRS4kQ4G9>MC>FY0hZ6xXiITTltEh=my&Z}goD zRG|ZW%dZzkXvNd)5O{hi&F{M?OAZvEw3Q+w* z;r#cgQ?NK9lzh2>KTSD3qbI=sDNfCXA1rKzCYb{0YJyg<3?cQIr{gHMe5f%@xa1fg zhzO8NxP~#f-hg3@rsvx89*Xvp;CD7D6{G?Ff%Ye86MePqmk*k?iIyU698go1y#Gr@4sEM)8* z4&Jg>?vS%AKg_0;oKga-Poy zNqV!R!v<-FYnDE20jq#7fA&ca-^&uwBDfGD0@;PmrBM5Tzmm{n&i)n+Ygan&7C{py z!)Z=bMGzcnQ#8s{1mO$JsC>65zjjgGZ%B&hEe6Yrq2q;`7>UTk0u|nckKcw?0UzN zR|mooM>**=TcC_Uq7^!AhS%GkQA^<%!Tuml zK>HP(S#laSF^LwSS-YEODKOdm967eH%eNamoNOiIEO+MnPcW!|XiSc5xnsgz@}G07Eb31_c8e@4x$p_qPJnSt_c}N3-8*&)lDw1ncLB zgGpbBEWY^^JQ6}n$1CTf=~jr3@YG@0DVa^IM?%vzJ^}Dwr;i$LiP9@a7q7?j)a=wW zuF#g;EI_w1I9LaWjVFu|q&DM67vc@SMHTkT_$NC=drYrwnGv)hdYKxlI*J$?_F(do zm6~xv?Bw@J7B8nq^HW5}>;6Q-bHGEd(XdImh6CfA#NRZ_&G1`BMZ2g)ehR_7Va`pk zc?edHPQGUfcO2%i)AMpsUw8i=innlgDe<()tT0{`22V+m=r%miPH(h^wC9B=f}TqW zL%kZR<&e-CG4>=X2c~se30pW5dt95z;aRxD`D#yWr1OPN)6uf^BH6&)f03yl4ciB?qha5<`7gd-)?IW$(^~lG zj;(eOa1l5UI5-AAu9?SlHcz5B+c(9Hb094QGzJ1dW3$X-AaH${}y;GKl9Tmjwm>fzqvb|+_tG4 z@9~c!epC6pYnGRov8ys~u0NHAW6SPWZ10-yC(C1Mb$9po z#cxiZoWJk6b$`~@zhp)6jt6DNVO{aLb`2|LybN%EMBh*^BU{v5=9spA)tM~u>*)Mk zLDg%oJNvF5@Lhf9L{3s7byAwM+cvWlyz4&)Lx!V=_>YES#iNaJKMc2X_3Q^s&lrk3?75@;jY(N z`?L0sH^&@$@hx$oho6J1nQpJ!wL>}D^(Xb?Sevi+e3QO@oweEC?C|!Nafb{ZB^qc> zpGfh3T2xL8;PHYF)iBPAJQo$c(Q0zrG`Y@a?TAvjEm^YLGFJ53WBZBpL)6K?W@dBg zIT^2l?NWQdPTXbPS+=pdFCIG@@hc2AbN+WjG;DL*5XHdG%s45(Qd2B+!sU%5h5n4A z!ou1M)1MiAMXmle+sSO&V9l*E!qDY@ILw#p)D@~Qg(zp4o(sn{g-Enm`|LLo(Dhe6 zipOj71qohop-AW(qPVS!JEAA2CCf(3WV9!$nGl$^mDCr(2E0?E;f|GKx1PU4HTFtL z89|JwzH<+1+^R`aHz+CTE5uJV;SCi2dpOK%3=YZgfTMd6<#NU09z?4$lwXg>VqND@ zfXz@e%wDf-C&LYdAs?249rwE&QTgEpj!eux(IgELPiu!SlF%D|fI^>U<~#I#zvK~N zNEDhU7?H#~R4ar}QF#|KbU#!~Sv__wRB@Pnc#B3}X3n}oB@-Lmn0ccebRYB)UY$bt z`rBFI943TYM5GTf_^%@WRoGkj-ACJ+1BmJ=K07tqJkkjzAH!}xgR*sv(;O5oYsQY` zqh&He_C{qXL3(GObRG-ypPIh^pUGLDujZ=X$a$56!gLsWQl+&AW|wB51ZBUb>S9AY z>TH155)RYM#15{lT+J9@L}{J|6fGkDWK`EXUe~)7utX8waCaA?DIPpqXe9;!Dvn4|9UDV#eo&18a10 zPXuVfU1Vv2@I5$mwsV2xLQN9U5$_4Z_)@-l;_H|~Ra)*?>Nq@70Ha#&kpt=B! zJq3d`kn7%>R?!@vZFVyuyl4}LBC!d;QkyXiI@%jKG-?o<5?52LtfYB0}Sd#OT*;|?CN z4=X{IvBS)txdVVM4g^%1O@>%aG( zJ@f4VM;UX*4me`ZcOG!`){hZ$x7}E`^pf+G+uMpqjL5inr|{IF>r?D^w=9s}yL{tD zXNH*oy9?w{V8DHK;)zZowkuxH7Y<2K*Q9vQ_P>bhmx&Ae>`bYkj`_OZcv>1Qhv z7Vio7x*x+=IzCE>-*Gwh{!3rQ$Z1z@_wT(DyDz6RId<;dF+1F*ZE?GOrJONUqZQlz z`-u9!;bC(%{+>3Pad63%+Yx=m$(}DAD0Uo%T4%R&{ekB>FO$rOE0qI7&J+C?KUtA; zC;wUO-DfM2$gN2uKV2An3V!1vV@UP>b7l;Rt=&J6w7sW$NK{d0^Rs_zqBBQ2Y?!{or2Exm?Fp$Dj$C_m_ z8pZAbS~CG=TKv%^Roc@q?UfNG1=(ewNscY5ccE>lC*(qfG0UU0SC)^fj9r>Dg~Yvj zuRi@ArEE_tV$OR4EX_?#0M~(`Dm4$Pr!bzPpCnv&T?YK)ppp}UC5d?q8fbiS&5QaQ z=AK{{tA>l1ZU@@52_WDbQEc&Dy9Sf;BXnCxeP}N<@)w&sso}Un+9EN}#v|g zi)P`F;8ea@tR2fdaR+VgB|}l#(-)nvhC+eOQ1-Z=Q|#4VyAh$G9>hj5|eaV6P$JBM5u|ott3-)qJ{HdZ@EW?Cjb@rSHhVAh zOA5w-@^*-dOyqj2RexKQ?fpbZeHu}U9(jzc59c_JqN}(E6J3I6+)GKn`Q} z#k55GPcu%|5~1H4qFPm50$G^;5qeb#l`8$?!9wt=8E)r6hj2cck zx*U*k5a?Z=peY%>GB(j@1c=Z-XaO!6-N(rX$IZ~nPJ85|yeCGXpKK8;BQ!^fz%(1j zGlUF4T^x%V!yHItd1Wej zFccxH)fxnx_(8*R2_KBhg@nw zimilv1)r7DD@5iIrA#5pxvkwODM=3fb+KXha={F4R15;c9BZoH7ZIN^x&MRymV@ z@+&Sym|y-tROs&EOiX`s})|_tS`Z!djg%QpM}#6@{B}k7-w&^LKi2Z?m$gweGmL1hbU+iwRFN+ ze04W`LCDP)P^*@dU~%7xPelm(4G^5d44)BtH5hnB$qkcT{;A+*vpH3f+G51HjaZX& zM0>ss?*Zl52DYBCD*UI8by;}d4BhgIAZrQLb2<~+WQA@DlA7xT&}~4oEA3R>fC^O) zH>Sg=yq;&uN1=8MGO+EvvTEJ$+mK zlngHg@dLOVdrc+Cv`U~`7^EgSCCKW55!^EmCerXrzzSyDVCegdHgMr=A7^s0z7@_F za+|f4)z>EYxAa13LUkT^P=lz=H1YVEoKQxp^oAwJ#ZISFMcK2&0MnW|A{iyvFFrA@k z*Joo2U3(8+>tIhgvfr5$>$>oCHztFo(3JpRE72dOjCyWB=6rb#u7oz&pawvTk$>9$ zSiv2{bWiO-7I&)b&Du_6K_#;3*;!Gx(wfS1>ZsV@*g{gm|PVrVDsKo0Ojd!Yxqp=gD2- z8muEk;lEatv;mWT17}AuEnhoi2Z})dA?=(In4WDDwR`@xXxoYvizWW2k(~X%v`_xi zEPA^po5Lo*+SnHaj1y>fFZ{`@*9U6x=sta}KuUD8gfc_$OI#YpGHH5I>jvj)Rjk0U z$kGBXoL`UgBRCT}#cf0G&Hu5!A1y6ptbgY&G?o?4Ioyy($jg2+&Y&AGs2`U6ndrBa z3?ZlElCnCug-&lrvfZIhsDDc^I^xowaup4xiFIHePi*!+f0o5DaacU#1phlRWs()P z*Tm(?wP)&8n;$HY4*CjCHjYAa0KRsB({pbT{y@m>fO$jxx@GP{`B0^LC;GGq&4el5 ziub+xwIztBk+=z1cFYqi&|+|~1i6QDv6xT9d^g6d#l$sqUX3>Ij91(wC=^VzUEJ|t z*oMt5c+CV|Bsl#F7+9tuaYMHyZ0P46ES@n0*%=I8W+84A_eFjKce?EEiB(db>@FQv z2QFWFPCwnq-?$qZ^ymOvGim{ly}B%S^th81eZE`}UG_pyxNY2>AyXR{Y;)WM?S%F~ zuaw;_dkXJ7cDwN*d(f)C^F$?m%E<$d&2w$Icc~`DR`JG`x^d{}39F9IOHCX<=JU0% z67TUt7p@#N^;k~+wtxeV6OYf$>N>fzV&Bj{_WAx%XHG20<1ZfhN>~`&Ew6xuSus0_ zei9DEu#cIlj8BtC84F!Hje7^cjWhFQD@upBRAZR?Plyd z8+RzUJFNR>>g*J4+a@BWUw;G9%HW_0A$hmmUDtk9jC z124(4rRV>8BTKqK9iQ>VW%;28wuW@?h2f*D>9wyjj=91-$MLjF(l;q9N1Sfhx@Cjq z--g@iuIHR0W0Q%olh&LI80jKr#6^wV5~9h-PDkWoHxwe_Eqmm$B+VS7OjrNff0d$; z^xb|SnBx+yEj%{9ar*mqxAVhH&p?(ti8OwfuuU>{%nD}s)%i||4i?TGuYpGe7S1@U ztPQPBM9ZCYax_mLcG)ieoU5#$SG+rR zn5BYc+%wVspI{@pmz;=BI}Zj+KTFTfCTX04wzkU8zHO)IQIoGK9xYI?tqD^6=50@iU&$6kvWBP%o&87-A;S_gXr zgSj$Tl;+g?`F=Mz*ar=5tal)?7NI8!z$Z&BDDPA?g@pKPkjHNn;_g2pjFx5-G7DbC zjy))ZI&Ank7L#kj3_M1%BV<}-#w^rmz|W*pP2V>Uy){5ov?56JCQ)<%@CwB}0KRI7Bjh6}dWV$n*N>@t_lIch z9kJx^i1`nJmw+!p<=+NU(g$@R`YvQ&IO!zRDcPB|lAEeU?OK=1c@3bo3wpW~LWI4X zEf)OQ$Dz#dA9FWzWP(^sf3*OO=mY0|V!7$v4ZrP{zW?9@18BeruOzU)Oo^{U=nDRpZcoRV8;ul>`;iED4Ir+$?I!Qi=>5sW2 z^L5?Gq`YE~$o6{yN3=_BonmG07BaYB!F?0N#pHbSvK`a@0TYgQ^@HN-B`-V0w^l?8 z^*NoAkxBT_2q-_o*o{GELe~ZRh8c6PjiftcZ4 z0>=4-=ts5b4Ob&5a6n69uFwZO8~KylQngcS4^=1O+OkzKhy>p(F*q9ev;{61!@}BY1E68o$Ym zvoYvX=T8vzfd1Br$6Y2QtnKueedK?6bm$(ah;`)g4130^{n9)h`d#-)B7Ql=tVhSK zM`@d0ZWljWC16U044-x1PSM>{+c~zQRRt@U3)#k3l&n*1{|HF_jaZOLT%}iqw=-y= zGh-F{E8rPCy&7p4)2&^pr_VD(!(MA9H=uU70ylMYv_#=JGtOPid|IuFJlqG*Mv$Yr zE0>>W3bCTDUU3n))&D1e>JcNDXX9AcRm`3HoXEPXgp%t?(!=WDx!u`nKn^VIfMksl z$@!V?_4Kx?VQLS)VRIYDe?1ZxVzhP39--864wlQI>I>Jx5}}G3*jSA$4n|$KfNlE) zrd0x67Rcy3_yNS&_lTEQ62HQv8=^^B<5eKgYA%+wqx42hpFG}~Nu7lnb(mpN3o)+- zIFutk7BFimi48k$#Sf#4z9+%N@&pmL2Fq7K?IDaoNGjct*kUFRqw$6BkwkkmLTR3r z!m^)U?@K0q1ro0@jQOGB{Z4V)jyWzXjz;o6P~wGF$(%#z)m`f}B(cI)k_PC-|9xb+ABOq~sa__|d`vIsASQPsAt+^+_sza$ zaLR~yenw9TJT2Y|vlxg{TC_;GdW=~=RpuYotUXr)ZfAm-&zE7`ew46Y@q?UpjQdGx zOc#-)mF#DrAG0Z7KS26%#Q7{}KINE}l~&IAcxQaaBmvo3aS*8HyQBn@SDZd8K}I%o zribn?r&E1gg()qP8#A%DS5Y?_nr&Kb+t^0>?vTZy(9fEba>*qBz>10L4)Web@O6jb z^IbIKBf46s*(Z%e6K6%}8RDNriNe2^@M<9*Cj~f4s!+yi?8GRD2<$}UJ%EPq?j<)x z7~AlFMA8rk;Fq^3IQ+NB z1-7Le*=r}c7n*Cf9A7HADdnWadrAns#kNb&8{%=h&W z??SFL<4`QjeNU*`S>b{3(O}I2XS0Y;mH$D3b5i14rs1iZ3$r8Cc=T?VRGeYc3aqwJ zmRMl8$cB~(lk&yo;~MP#RxA9Ewa+vILkNcZi}ZsDxX}#ZX8qZ2S&G7F1S2YuEf>Nx zd}g*X!k;V3Udz?IKwWB`e%jrflj!p}r`4Xht2ZF#?l%_t#$_;7W}!lXVY8sjHQ z_6X!2GHAO3DiAqIn~}@6dJwxdpnls4SqT=5BzA)H*=VN27A&~|v3&SbhHqSoS`jNk z`D(js#jjMOuihy*CUoT$Fl_u-=H8N2f;=uJj)OU=Q0ow0QJ8T(>%^pvhvo}%<9a&- zJ!lM~*ybgF|AZMnlwCToUbXm{cqd5Qp}+8gcu9;XFo-9PXLndXY%r6~p9oSwEydis z;ae2S+I;Y7jaly@P&b;j+;X-!@vR3Z9i{fbct$f(A>w@LBXw`TqPH87t0zVjH&@zHw`vkuAFoxZwJB6Ogb6l(i{6yFvks|$ZFV&VvU$iJ+;r7-uM3UAXF zR;$F_*4};tP|NqG7EM9=#KwPEhR@MC`3V0sOpy7AK*aYmFa2kSi(}R|q~K}RMun5S z`caZ7i54y^d5nH%Lvt;v@-U+Tmy|1T?I+ZXXKi}Qg<_ishk>;4nZ2?Q5rez>=qKd$ zUi3CVmOLAFn@<*4NRAcniAeDxRAaEJFJSjkcV>)LcD!g2m&!-!=fGEcVx5rchPwA@ zj|jNq43g<}PGeAO0kLe7`zi2p4tk1bJn57YI@okm%b5#?EpC`8UipZWE$l@0T>z^b zW*h-UZvpR~5Y7#51?Nf4jWCFY#V9eu_6SC5ng`UFgfec0F-UY)J7<o+u)> z%fzb~Us-iTgNT`;1Za1k;Q7PO1_}00bp?|hS zkkG*3D7z1=|2NKjbR6u?1pUwS7)RTz6Am)n5B+enZ0}`ZqQ2 z-?>z@K4yzD-MI8+v@7G=s{DQf`Q?J#uh$MJt_*E#&!hD3-_rHC(!1TP*pypqJ~X$s zz4wkXep9}5c7N}={g-+a78+m0TlQ~?pBxhvB_9*~?qS*IpG#haoDG>Xd+OWY=ganI z`Q?3_S^N3J3zqBc%LxxJU;NG6@uDJclgE=6H~%_9yMJBASbm-QWapcu#Z{bH5mAY; zN2>a21|EucIMbTxw|)C3hrs*n$Z`CaE_eMSqf%z>c>Wvp&3-Wa!knynNcsmdcffvlq{N<9q2+OL{uH=e*m}RTc|BDSG~iR{6Qw zwzBa9@;$~!k$0{iyE!gj>amF7_4n8*J1>q@{2gFYP;b;ddNhUm)N!{d=)Z^cGwhF9C!7}+M2}U>M5dJ{)j=v@w{yf*d0D*%L8OEUb%aUgOwJOQ(>DW=*==YkR<>pMb3IVT}1tPli%=#`G$1o zZ(sI5Tt6!4=!m2vTNpBf&h;*rN~j$jVwb0X6B_<=8vf>F^GvVL=EZIvA?3VTX{ANO zFRz+HrT92(oIQQbvbO_^v59v+&s>qW@}l5QPR)xeqgo#rdz0;sMkf(Tf`El*>3IWj z4%IDY8uKKj-@8gM5bsAE@udFmc&SbiBJ0HsfCqfk3ZCeP%8kC5p_XoT zVm3~wrUxYQAg{lmIn$k`ZQ_Sa`!g(K<*Zh^<9rUY6XKL%ZIam!fy7VFojs&THEs%Z zCCdKJvX7ZvS*M4i%U~B5`n3-6(sr4+Cr{3}3TEpics>Gq5Iywp(YB{S;H;m$=Bkb` zhv@Fzn{z#@T2*J$bcE{MULkOx6T=y^d;*7#qT9ZN`?tZWSJTrz^M9gNnU(Wcz;yRV z>)Yws-{FWlRrFjmpu^GcR+|K?&%J;~EtNqha>Dfrj5a|9!wtRAWns}objf>#{}jQB zrki$*+)JoLmXfr#g9l}kxfFiPWHxhMcl&-IY_|?w36Ny*ndAZ%<4nD_I8d+Le39+{ zrkj&phG~h-za{^^LocT^FA5bem8UGQJ9!!`UL#-}l3DoKPS#1&(5ij{&i4@YxON+B z=Q%t5PsDSv@_Q)P#!9IhR2;S4tBCJYf#Bhutru?~%hfto5LuV*C5glQF$A2HalofsoxJ4UPK zbFK>JOUb2d%?8Z)4tSP;H7pc*Pp1ybcuLP_xh(h7hpe9(gukaa)Y7eGfabihS;JOr zwW5#bA#0m*4^)j%NK1S8D3%;w4*nH?u;5rmxk;nbaR+WIIwRA6r$ELp7m1$h<)8-@^)Tt_Y3- zq6%1iWuT$($!*rLOa!hRo8+JS>l*Pe8pU~R|4Kfzq!N=GKcm5n?@lvo&7gij@>im-nemM+q>Bq@MXUB;u=L4~D9nC%<5NIh zF?NaTgwnuwnu8!d3%K!-`XF%G_b3i#T9K3;0%KPSTkx+nHC!- zFrGJxO^3jFolRxO*1bGnqsQ#w{8uM|nnZeuG=%%qA#xCEHrZf7QU*`=t$)gQgp&wH z6%ma%@NlSaQpI*7ot&4*XnN5pp8I~wPo0;4sNJtSAH+FRe`hhT0o6!jUe%E?=fUs5 zXw*GXDF5C^X0!AEMts<`Fvzc-W$2b1W28MnXX0&may$NEJXdjSurcLL-_mF_yqXn0 zblQs`O42xVOBiQORhYi3`xPLb02+-lq74+UQb6{LncD)5^jK-2xcLqA3YojGvb&Pc z)$Gx0>1Ta24*6HW{mR6)M}*cE0j|Ujiffldx8sLt_SN*|jai*9iNy8pA6RNnhUxI4 zUrvHJHgub>&xIExE1^Zf#w!EJV8%c34hba|@g4TGZW)aH0OE-P-EFo$F+wxHPNFZ< z?wTUKEfAl(L*Ev{DQnknn8vu2@1bjGBpmEp9rVgBE1w1bPG)>e*x zhkk}om(%O9^bE+NhiZ~vD#W#z+io=UFjzf8-$djK40T+T@5F_^hil>w0%GEjlMR~T zG&>bfT4Pp*^V~myXe&K@lii!C=$r$hUHRHGgFB`M8!L%+Xk;k2!wC6}H^J=u>$bBC z|2Dn-4Ik))^^bOlpd&ope|FDb5RPNRV!Wr9=SRY=&0VmsC>RUk01xQhw%+kSNnS>h3Y`S2uf~y{eb1y$6 zY=opLw~h`Ol+f5u$9YsoG^PvQDyda*Dq;A^tR?L@-b6<429tPcA4vc2Z%{}L%1dj< zn}Z6rNurBdU%;dc7Mjuxa8QW)VYpb!=8Cv zgq&~n+MPMRiv{y5v>v^^Py0AY!BVb+#tzMx1f$Sy)Xo^tuIJO;4g!w9>`56sr5-3U ziGW8q^Fo{I+#ik^h0&*-yNy8ssP(l>Q+-ziP5a`_gaQGrPdufZ#T{kazn=AUAH-_i~fNY zUnJx%XJ4&RWuspGCiKdfy<-0qS7rx(1ZV{i#B<-aLW%{Fm6Itf<}hlq@@a{xb(?I- zPXxly8@6vO+E;UTE6Z{hz1oET&GD2Q?;+v>$x2RUOKmG&-f!9GcIb4aiqZ;_g18gq zN5IGbWJlPU^ibnS)D$#`Uxe;1?uBsc_=kDz9-Ovr$*5=rITVu(!1V2^rd~WZ6dKm1 zmE=oi4@>P{YV4xZi!e_<#{o?}OBqvKgEVxAej~Xb|K!4P6uXFNnJ(wFfT;_G`0fqp zW80;61V(A%6c7^*mNdc5m6+cpglqVw3qhYgAof2KyA{FTTqy78b{ntzJx0>G@vBv- zh~8SU7dZT911SAdR{3u@>;50TpVt@sfxd31GDU(_Iptqf{?WYV;p#xL!f_MbzK!m0 z%_<1yY8gddMI8<`f60QOLdxS7Xml;|dPo(DXM!zZMr8>4)+XM%QpEkWM3@a>)Q?0z zqlzOk^m7_E61B(VA+pFy*wtZm3gK=~c`4V8!e1eoc3YdSgXk4WyDILNI}1z=^qP1a z^x-v~lGA2QDcik&d_LBJg*UVdb;l}^gkH$Uvs1#@!i}3!HilVskk@dj0=jC1>Qr<-*D_S2)!xb_Qb0V|lPF0DO}S{R3s(>Sh73+9GeL%K z@G+bVrItyW3V`cA8Rv&U{{#!T-ukV~8P`sF2=G8L$8Q@R#HKbn_NF|OGj!}E%M#8e zwp$c3ns3xdh6MWS9Y^d%Uv;;9SeMW@JBZPtrMGE(DPH4yQbauCkg*&7+jX=qGI3ba zseMYF4H!CMCRBR5mwdw~HGn2pK>22UEb91k%b74~8sB$08bC}AJd1lLk_yw4a}BCmV#8`@#Ld4MabwGj8@81_Uxlj{eE5XoUwR-) zP#?^2ZiUfi6@36xe-}|u>?ZKyhO0AJ+`9*!G>&(Fic~a<(&!7358sY03QY#SDMN57~aTl5MubI4kj{uC+t#SE<^UMaun$#RM$lJ*KM%cPyrL zLIY`MyHt@O`uy-6xXKfu%zutDCo#i)yS0A_WYXP1J;aIBAE>?45U%N;_mL-*BYFDv z5(#%=GBU)KoA(3KE-L>w;)!e;Prs`hi0>h{&&RuDoVdSkwE5T@;=lw^jdrqWl+RkH zQa0nN5bDzIdV%5Ez_65Hy;l?1>dKtvcOX8`o<_TeF&}{JaT zyd+fDQKN8NQ!7!c7GeQ48y6!4-Umt7il8q9eKg8^X(g7v3rejL8SbL^jc)wQb#T25 zX;4`hWQX?APsvru+A{cKd`*eA=H|c~N_mOv;*e!OCZOdv=*Es+$ET&F8=%2$&6hXi zqM2g?{_B!;0QXh1>?ne?z?(H88;A&YATr)8QU4AWKSPh0IQ%tB_ZJGKe_`_<|0Pr3 zV9WD^JM{Yw^s26#ZnD!NK9V=5rcX$NS~wFIr5}ZUBf+iLa(^!oYQSz$+_UpzWv__k z5t`4exPzM3=I_(-1Hi3*;mqs3V>JK$b$&M#b(k2X9<__!PCj~@#0#B1Y1#O%!ycIN z+`FHD{frqOr}HC9{8H5uR|G;~Pz1DR;tqal=Md$R5#^clMr!Sy--_2wX}HbI%B}xe z_IBmSrQU}V{_8)*{^mO=?c+D4^JykMFk`m&f#lqV`}-2Ub>8*8pm^(*u=B-=bHBzq z+>BDk&RXCCkBE~EZRsw)7Wx4DXTiq0;(~;TSuK0=4lmAGbypMzBYv5@+3pT=;@0h~ z4qokB_%!}U=(;tZ2W`AKYwxxxY+pZ4Pxvp%O|Hvs#x2d-{{DVJ%3Xd~4^LuuC&SpIE)VQvT-0)4eanP;WY9UU#vNi;b1F(Wbc^YTmQv zujz|>`0ML8WZ79h90+@xQC=8Tz8X^uKQh48@pMOVdU@bxZp<(P4F?yIMW>$6sw({) z_VV%Jg$F8vR^RTu)vKG4Sy2;J~@B7zd-@j8VRyc}H;V%b3}TE-C-qV9KTeG!i5Y zoVoA(qU*@i0b+(!!yQHg^yHOa(ShWr5r?_|_gS=Q(G^5-=$i-e^QlRdiFWO2A>s`R zhzWWT8^Z2@BX%di@I~{G#z4xn7M@A#{uteq44y=xJ{_B} zB@Z7c9w`+glEbJB$^|=n$VI622ZA+9)=cTbe__;BXi$9UI8*VwU!s)f`}ZGF>38)) zx$KSs03mC8>6133ws0OgdVVsf+#e&q-&3HBdqAM$k)LfhDkPeZqRL`ewnj^qsg6wb zw=ae_O$v8v=hVd zY?I~hi3jThhPO6noSprPWpuDDEIe6&hzHS zf>CT;oPyjLqVYz#zmY5wc{#5V=cVM>efbxk)FI|?26iv)9)rlJ9V9N=LrAN+K`UB)tt3JD^B=1ptHJBae zPzCoF8VSo7iypISwxSWsTZS@1PyUqv=diOwh#oJrJO&)OP#yhcrsi0P?uA`&5ggs6 zT+4>y$8%SNiYd#{$aI4i{e|G!0IGqLzaqIpxyUmrRK{&k&FB!Xtrou|T*qtvCiV11 z6Niv_r7G84UwljCW2Baor4D*f_~G@h4gUqaO07~a!qj&T{y|OumDcA!^|DkS~}Y@umK)8pRKph zH-+CeRs^fDL!1rhkwUMP9b&o6X>b<;B?B)buv^S#T*-1x*wyiSvE09df*;%TBZ6nmCXpi7=KS8ZK{O>&_T^2uY-W!U|su|{gx@0 zuI!j^+GzeMdVn%^{g-#T{Mx**LE(;Mgx5jNHmd!bs@kN=1a4OT1qR2sU= zFmzBW?hU?l(Ko3b9H+h_&YvS^=N{b~g4%sTm>rsQ;o8UJRTA-?ojfiipAtaNbTPsK zrx$+drf(CmzvMD?3s_eN$<-dsn%L#k-TXi3{CzEiQPb1^XhJPL^Dyb8mwY??d~j$d z-4t(kVP73kt^&nzkn=>j?sA)C91lIUpiQrt`WvQ|kXSQR+aOBvN~@fu*@(t4fIu7~ z_GVdLpjN*gO>`nC_|r9?MF-?}YC7ol3()0y`pQxotx88wJq2lQ0(RQTF0F5YgyA?e z5`4d8TUe&mlxqL2mLwGGFFrCnZ--^B`Naam($}cGpc_#&!nzi_IJBt!V>xGoWr}fo zo4AF#@%3JBkbVxgYP^zOF47Dt((av!cuMcqbFv1Y#;1DNcJqOD@jbq5+%d5Jm0lua zu#>{@`#jG^@rO#u70=!$10o$AwMu@>DnZ&)!)!km%?-1}fYe(6lCNWT#DWb<+#O>2ZfwQRYfp4RVEu8DlO_FX5YG8Lkukj2U5V{0ipV)HfWIb zfRSEPprxreTEv+EN4{E%aj^PSwboIe6$l1$Lm?gZ)*?`vRCtpld7)3-#1h2E@T-ISnjrSOFPh&3Ha_?b}d zkDgt`_ld9(Cc52UNcc%X(pzDm@T5V(RJU%{+&?NJEWvibOyWp#)nXWHO?@w-Xi7IDiOxL);qfX^@0@WuM*Hdeq=?fVM3 zxaB_4s9w?fLGC}5Qe3LdbcH^&;7rGkNo@OdS*LrDQ zuMk^)60h77$?#^pp>r z=;fV*B0eA*t0;=^L((i&+A;Lhx5Q0Szk&t=`wQZ70D3AuZ#}7uol}fx(XvI`wr$(C zjnlSm+jgI}ZQHhO+qV0iQTK6~L+MONN1{T?njo zv|I>1waA*D63mlUScPFdT%#733B^q(yr}jY^9(b|sc7DdZhx_g&LMuX_GJ<$g^ z(rAFz`!gCyaq8}4A9+RUZt9QNnJh|@1I7I8U=*c$`P(jE{Vz9K(lYHA_&*LQ001W6 zea(N|kN0jp+aRqv-#aD#rh*is^rogg-tA&MMLVR@`QvU!!f9u2-jQF8I9xOXpJ!w;)@V8 zMpcDgXd~)P%&t1$-+x}YPkm-Rav%9_y>1_Sa%x9?ww>s(kN6<~`Tzj*!CRgH1&;2j zpHTo%@YvRo-hDQH`O3%u3`Fi^)AIC(6Ue@P)J}B-Z)>(*-=lG z*3#rvpS)Ys?p>Fq-FsoVe)4;TgoZ-~=h9DS$1?~5+Cmc)~a6-DhcG zJV3o8k}YAqTHS@x?Xon}%uTm8Qlh6GI)tC!##~0h zuD(dJP&EifQ;D;YU!E*FODX4V)Dt}n9?Amd)#6$>^25mFRIHq!Q{?zwxG#bg4mJ(o z%KK98)Z;Qs2D^2+%$&iS`a;(R^zc-1wQ2@&CW%&X$aVYbFKF}hp5{;1L6-{&yGmVm zX0~DF)pfZ)lC68MkeGPAFgg_pr6DvhC!5}$vb`Xn3$g0=Uxal8YBYy3WDfNz+&skdKGZYK6> za(l?8RQ9hj;u{!&&75myWnNo(uuN{BsifUw<68`%Wq7}f%YT#4J})o6(D8CO_F1q_ zm$%q#PgtJ$D}B8bT_#`DnOn)9lza76`vZ?@e&{xzGnT#hW*@_8^I``mPRT137Pax9 zHEMIO?)}WXe@+M92Q^TWdg^xDmschC^Yq?-favlARZf?asu@tcp#9k0 zw7<$l&_wI;-%&E1EF`PWb5l4`cf6_gxOh(%H_5fbna$~jR?&*b0W0ybcbI^~3Y6eM zwQq6{`Hb$4cso{Vx3Epf2#|j==f@pE>zVE+ZIH~k5|eYV2k9iSA<*8dBW;mB<+o(* zpixwp5Fx{(FHkJ`Tm*w?%*1^{f_=e3SD@Cyx^jAKwLXm27&=N;ZNE+B2K_{KsJ3g4Vglxw_U~ z%QrX@sa@Z~V&wV0t5F7uy@JtNz6pAgE$_1;ruS_2`y7{zj9n6-)~kAUd$H&=KP8as zXJH$uT{UEhvbIiqQOjnFOPNU7l`b0H&0#*XNnCneXUk`tpkg;eB0%#)sOWox-BP>0 z6}0g0$s+R;@N%PZPx-A7&^iw@95cT+Jjw=RlD?R2$0f!p+4eWWFMLDU7QC}0VmrW2f2U0!>)U& zuG~lrG^mIaY7{6}&la30vES0?di=<5rLr;QBajzZGm-kHJ~K|(brt~VQmLhU;n9-W z^`T{A!D<+x;ar4I8-t}hO3W*L{mAl*SIK{}kk1Ty3-872lX_4&-tis8`acgL-3UcQDnEjXr477`+Ve-la5e{E@oASuw72t z(5Q>-afCK^V-e!3snaY3 z_kwE-M*HB()R8fbkOD;As|ESZcP&dNosmZ3LB4TbF~!||0|NyqP*0)*bpZzHA2;F( zZIeDJB{wDlw zPj<#!yy?Qe+67tiY_#&xJE1G$R-2pTp^3R&T(q+@=c-valo77~ks1ozXI?HOJ-N95H;1p`t@Vi-Kf8<74p&3z@( z54<&mUk2e?K9U9V1t7R#9VA|0iIChNa0;|YLT*4i8=wvtfKR+J0E?a8GTOL8i&6_ni5tnZ8Ba6^CC!2ABw;rTxjuQ?4f z?NePRQ-xF^d*x3GtlU1AHPrQtyLz4ugM_Ja<^M!<3byWE>Nc?Nj)B_dvxR<63%C6Ct zOz&Iy9g^c#d!KJdeDIBjT_CHt5Bwu;fNNtbs7Yy8cU0We6)q_Z+|rfRJ`5Tl>y@*j z9eiT}di={Qj=&573)Mlg6;IebWIpJFVmrqVh*){0N{rsa}d;m>4xrEpBLXv zA*xwwq5;D;K!kv6`#nSFCj^i*@9cA(9-D;TF(i)wyF9xB3@r+Lpe~=uicNDABeHFi zBT5M0I!uFo5*BjjdSG*Y=oimf(IXtO0q&y`qrGo}a1;c5vBNai0DYU4v%esM>zyDT ze||=fD&rrG!Nn~zgvHM=QjB?GPv(KoM1IvGZH7eOSo*^QoaAe5CL!LvXI zm1MB`r#Vvbr9HsaIH#0fL1yU>k_LWbyR$u4v$1Ma+w7HcC8VZ* z${o{#bk1EZhR19^SQA+><7DCeIy%k?{E&dei?8jtvw^oGdu8!p8O;SE%TmXEL!7$aDA!iQ}A zKoO=+>EHbl5LGM7AW7sH+uR=bLAfN{eTcEIQa~e!bYzV@f#Vkr_)NutN{smJwR!Ht zKe5yS`mh1!YZLk+Yz!ix24R&{+$O+=B#UrGcc*E0-S1(7)O!9C`nPXgjOKo( z_@6zr?v-8xFJTT+E@e|&>s#_8xY~Ul=)~SjE zNjQ*$H5Aa;)`&jO5{(6#t8b%}?M036lE78T@f9pkKrk6%C&c*k7nD&ImyfI3DpY#n z-Q`8iEfRhjTT^A+NE&|;7&v~#Pi_Xs;u0yq^40VAp{*uZ^de-(aH!#R_SiF>2w$~f%NY>UUrT%D3~nWe2P}U;Ov*9>j4FR5-e~Zwo2&liIbGg zW4tq{lZxA0f$OgS?O77X+@Y=xUib|nAQC`~tu@Un_|oj$3yO~Pbh%g{L+A#qFE9F0 zNfyiDp!0t=>@F&p{Lh`%@_uM0lsP7b{5oT{v zqy&!&2WT|fJCLV3!pZRJ&)w}6W^&Et8x3^6(m%5_acLyNDOKvX`cU>}w!NIFX|$c{ zIgth1>dgt1%jTQ>$(i=6+z#SQ;Pp4Gns(XqKgyrw=tC=3j`1|7^EG;9BbjA#*n7C#sE)#eD*0|84lLZ=$6eMGcDaS3n z)d-LRZm)PJTCrn)N5B+73z}u^z^USd*NQq1A?qPSO;bu|mF59hT>%$l@Aoh0J3MlX z3eOy$5w}o4NHDPXc_Gywkf9H{NuAg{ci0fg4N&nZLUc+5u&ihpBPUFP$huc-?i~7# z3syb9;*o{CG=Ro%LmaiU83GF`5}?q?@ULbMG|&A`aeBY|xK+3%^3#Sb zZnrMc0Zl7^LOx;T)vDkzcESEsPMG|kGY@Lw=Gv(rg@_Sm<*$QTA-6J;07Z+;$XdEx!06ZQF zqaK@^LAChm<9*&#-)*3TWdy0te%MC{{a)MeD;@?BjBSu`Q2Pg0w`_ur2ACX9+cnYn z;$(QBDbA1fpl&RxyJsZ*&Tv6Z;wEl}GqGOMeMFtnon>1gMN=MJQoE(Y_WYeY6_@ za`Eyx=nL-{I|o4uG2*+Z`+Y6I0>=Xk#jJcGWaY|%jM1x*Ib6WycWfHPr1iC58Jy*U zZz0|Y0INa^0Fha47oqU`tRt=@NOJMP4$<>Pc|trx)Ypq{3h7zF{%jtRS5(rc(iWyy z5PtG>4Y!nEf(vAFO?fq<^@wkzj9qLM*Qey=YzV=R2cmC|r$ZyaLxwS`G_Z<<*1S?- z0Myswc&N}<4UD7ZjYfVKdu6p}QyfVI(Wl`9A5ing+jZQ6@Lm*UBl$1LRoa4Kdf={?Ujl5rqh>ejH0WJMkkzh^SpOt5d~*8+iJ0z(vI*|l;kV5UT%Ok|Y0e3p za}Mb@kRt>}zJPm#mW}sT)fR&>iI44&#;eG7t94%G=B4qEB_da$w?^v93B)#mv;`dc z?p@fSc=4fjjN|fxx4H4Hk-e62$UvBO0uSZPtBipspTExadMJN4X8@g!FR7D!(i_0P>GPGKqi_QLMVUVorGElMS>+4Ajjzme zrI;#Byb=QT>5L9xtk2)1=lFRXVaW%oyvykY(Kl%W1d3Wx^7_$d{~0>g*Jb<8`~odX zzv7t)LuiLP9la|h(q^veXV7mCM3OOhOE* z$K-gG{nP3h1)?+)RKjW7DVp11rH!T$hS~;F zl^$kM+v&ZArex=RclNhcK z^v|LGmGj=$_N3=ZyzAjT#gx_ZM-+Qvr4gq1ZR}!_$-_bN5GN$(icNNNo+Q zAYgOYG!U7Gg=NG^!_B4{|NYAsx}SnByAxTlYt8u-P}tb#!nWih#;sjDWg}8yL6q9G zQ4yDHA;UT9VM)BJix%({W#kq4htHHhEwc5B;^|GylIXb7LMifG573zWrAzOt8ttQV zIwd;36I_fe3XUsuN7l^a>hrvLzWU%C+f2_vYB2bE9urc5%-$Iv%td_&W4mj3f=O{o=&1HX{dE?@7fZoMq8=%?%9(ZB>r+CjAmH7lMtnY`qnUf1&-F`XF+ z7|*h>e{sVlt696qG=@$EGXT6}6(1yKG0BmCzw0%_EKF=-j?>uvMmSX=#zq*@BgSgR z3xOAj%s_JqE^(bv`WEx`tOxC8T5P3PMuh8{jZc!Xx z>TRLedx$-miu#Nv^%o5Vev~A&Rk*>;6-F$!L&~JfbK)fu^BhTgmx|KoJBXP6QZq1X zu_+H|b+s8vpVcZqM({b5--v%bV_qYLEN+|Cv+Q-mao_gzViH!+Y@5Lbd)T-8&+b*= z_-9N(lomhB7x!oN3W{QjUbogxC&nWAKDkfoa}^pr3}hOQ54)uyfx_94U4q))hOYy? zy37IN?~c0TolY8QDfOt*4>RBm;B~V>1FOe6I&8sT2reHGN{Y@lHjYZB%sPXmS z4=ijZ8SI5oRINL=7=D{K0e{i9Jq+IYUFHP@&Y=O3B5(bW^u%oe3S#z$$yW01LJUpr z5RwWVMwcHRU#7yv6BgtCqs{)?Nb}X{w@|)^YfR#4O(^&VJ?jLb?CcVkrZ@7P(dzmXW4=3WjFa>c{>bAt|${|H{Hq`5q@by2B z{;)3NPCm8M$DZElczj;o#7}SZgA;t`8~)i)w4qS%?~TEZeevbP_Fv3JXJZbbjbIyS zC2ZP3MiNufi13j0dVtI0O}v|@y{ElyhW5qAVby2)G(CY@<@rp58;U}@n_tuyONFmRo3JcEIX7m zQ!eH=F7o7I*@W+tM9>>#Q5C9;Ka(k?Eq5dw83QkJPo_!%7EB zapBKViJd>vjw$Xk3+_420aUr@(#mvl%)f2%#yfovbXNPBui6NtwwFe`A3OQ5EZ)I&9hDkpGZ!L0 zET2`tUf3GU&WXNH^Rpjj3LwA@!@=d46dgJkH*S*FQ@6Bj_MR7R$9u~NNMq7 zfi`FBvg;nJIk<827O?Wq0C_Y7ekz>6#6ds9{D%49>Z_H!V%yT1yPaDNZI&hWCx3oS z(qOjw>X06!?ng6fJ9W8Ic?~Szr5Ww`@-KEXxAV2@Z^$RvGmc1aT;d9?rapQ-aZ{*Y zVm?f?M+2+JRw}fA*rSb^YhY%$xINB7>(^u8&MbzTMbb@3EKM$7OCqqInE9buZSVC7 z=d~9JbQ8`7{2s`D$7hbJQkE>X2b*+#jHKfgA33Aoc#l(m*xzm?f66GxJ zoqF%?j8OGwyL5xlc*nhVgdsnQe0(3usz2jfN(97b8#(x=Z)Lm5*?YM@?bE?T$X3GA z!1L7aGR~39e6?k?^2IcIi$iGXkmOblk|}09HfK`dp%0$F&@*!i22NnRutWnz ziV%_G_D}Z4F@K?Igrg-S*wL=pqkKn86(&pLhdj8OH{v7?cS9uD79+aP0L{?44>5@d zX2V=hB8K`RNDo-yAC91O8*>*pAiq88)j)x@pnA&f-@(aQwvy@Cg3x5Q{`{p~t9Cf` z`+I}MCIU?91d9fw0V1MEbgRRT-W>w}LkEs#3U?adu}wb~9@-#joC$>zX<+CYaz2kf#fNsQXBO!=Dp0Vmy21IcSEB$*1k)Er7mY`J zF|s-Lj(Ds2BXU&x{6A@`ILHn01P#?(nrLwA=5B|N=7gsW81yYcn2GHbQlV=<8P}c7 z8ETVxildt*P)p%wM1_4smlA-_SrMQHE0}0H4sIaWM0-0}dQuNN7sU=_Q_ySeD8(ry znhCSEesJLr`*Xj?kau_&*$^CUPr$j25Wo(^OCz>|w`4TCsb9E4NXW2HAXN9Z3VmKI zxP^pg?^M|0&Son_$Ip!3wP3M#=;y_FDM=Wga7omu`IhKEl?y|f;df(r9Z&EnDLx4s z81MHSyp#U~)kYC|U}h?M|G&sbp~yp|9Fm86R}fBX{DO%dKu08RwtG3^V0U?j%53A^ zT0^#}KoU81x#zs8iv}g9?eI;kw4>$&6f#8qeL*D#fhm`| z)4OEy)(SQ&f-R~Qu3RikTEWbmo5<@KR&$vHsmpoxMzY0&j_Y$j*ObHz81Ugk?l&Or z`6s9nSfC2&lr0$GW)&+qmPDO6pEi;DO>pT7#A-9Ep*H#rt9v1v=T1R$R1Er!Dvj3Yt13`b_)SAJz(|ULD9wm`2JI8_$t6T~m+QI-tPA zt#)+wUZ^8A2-B|wX{pXcM#8|D2Z!Dr_W%@N`QojFgW6p;n+iRz+-YPgjr7}A@lqgr z%~6QLz<$eMD@))wYD59WKOX!AzSYwgH1NMu1ADaHG^1Z z;EqE*fC7BZQbEBrfAW9(u;CC3G~_5N1vqw)oQ~I<6mE*#z z-b)^a7uM#|1d^~-So4nZ0rv6_mmc`ryX_r64SgxZv`h%U)#QPWE+swjjPaTuV7w{& z!pVF_+<~J3x>Jl{_QLzHyi}(Sh}^wvzq3OlbiWT3W$s^zpM(dq7p)!UR;L%n@%-y1 z2)64rOgK&rs)7p)smhXVyQOLXS)u!1h3BRN74uTET)xI0GouDC~@u}qxiX9xe*NlW53(Lae%?=zP}8_ykJgn z61p!@6h`kQtU$0i*XmDsT5i%}>htl?NXyO*xQ7YBEB9MB&&CMcbmt)|*@xV#%w4%> zRgt8WRIrHS2UxdD2HRUR;pKxwS&}R!-;OTT@%MOH!3?*-qP5(6H%}i*O@9J?2LPiL zpXRkoFa14@%5vnut57+hLm8`-6NRZ@EjMt|{S~>Jv0cFB7C1KZeM(CG9O~o!YISwq zzo!*&h147FpX8&fU+yT6MS%gWsey(v6p22LJ*gVL zJcv-Jtl$AoJb}Fyjc~dXvR4<~>bqN#LzawGMdT5K^*Wv#DLAW>;551i*DWxZ2tS~) z@Zgkdeh?(W)>-fH(fvs7Rcf=clQ0K2+>b}|Hxq@Av^nliJf^*yVjAuR48Qgf>Z-oY zB{%96$m=9*;G~vqn# z-tS}$yB<-kqpTj{L;%_!d%dyOiVjtbnF`&t5Dln)e8lcDp<8nCC=su(V*OqQiKr%4 z?yff+e^Hz7{$yN*;Fi4MU3iEEi%#P}x_^vteQXdtIfVy&Lz9R>eGxRFb9}-t>f?41 z)qoMzLm~=_Xjj~#kL%@s_LAjv$OcN&&cLo2C%&596Z_5*ho6t?W{l;o_WA&@Jjp8?pu6=482f!Y2 z!E=5Z>s- z{5Lr8snuURLbkVkv+{uAi+RWk!T=hf6TmUsQ~9V6A?gcDKpMyZ91(!d@R+#Wv*-)b zF;?9jrFJhC3zHbQQ7!^y`0f_K6XMcusJPWcs8ZelaHYFuFqCN{mjDc24KGwsEk1oO z4FDCcxjikSi4qU*yq<3nA0vb5rDQo<^Rv>d&E2aTHv8*^RXvBnDM!2VkV=MD#CIO6 zv?yB*XXET4)e|m4UJarTeNg6(!M#7j%9{WIco?#n0=c4^!tYFCU*RT72)rq0MDs>b zG@ZE32)&{%+67};3_%dR-vGo&x@%#aFwI;XG}%>B#MB7% zw}IAwFSM@o1eN2kc&j2ZLX%zoZMat4MMBU9kx3|xUTh_zDgG?q@Z(fjl%=q&&8b7^7bHO_xXJF!_huoVS)+58{TP0q*ZM1$v+9LLXHgm@sswYDTX={{RpB zQJruI)PG7T5)|Xf-1$!%!w|6wl1}fFpLuIo*!u-sBIP9Z%yVT3uo4Mc#S!qr(eh`4 zz(qWGY9dl3l^a154BI4b$X(s7gIu}Z4epHUu$WIa&LX6s(tOQ;nY>r=+Z_4t57IH# z3G-jmwnjP-97Oc;gbBlPRQG#9z;`vM9XI-ZkV>bZME8GCm`#&>Hq*sWp1qr&OlK!Cp_uX?lcEPi|b7zA? z7NnvM1onpUVgD+Y3!g=zGiy!BPw;}+(#tJx)n*mhDJOgteDM^S>dA1zPOcNkn^uIC zXQ=Z9AT|m4;*ukFfZcA)i|zN`E_;3}$uak}MyJ00@{5MOu=3>3TwXC?KV$==rZF>DL=adT(7}h=<2IJNgC~K zY3BcP%$@@)p(d!*!m0sI!DaPYAI3ZjaVST>^^7&%n~q#>4$0?68a`HGP|?@Ak_Xd4 z1IMEvdXjgN{VRmtBP7oz9J`(B-VsQ@6Ch{F!0&#uLWE8+gGVD&4!;o)VnDa-NvQk6 zCmO{t9fG`Ty?6Z&2T@+3KC2C~88|eAXK3^H!a*v=0eXPDQ<^u0mzwH;l3Vco2kZ); zWC4E|WrZ*YWLtY6F^mxz_!Q%T-C3cBFCpajg;Kgz!AoQ#P8VoSh<{Bx&(HH$COYm* zA3o9u;z{rgC2+|WMKQY$g6+U-E;srz9OjQf0a#DFIP?jiaOIoUj+%EG&>{-n(*~AY zScqPp4EJ2{W**$MwphcT-`kmsAUppF`ohH#++QMH0E-As$t5co2NgEfbm@K7XOC#k zVXDoJ%gA9-eKa#eyx^M6$W-EI@I+_BSkSIEpUa7z#A*95wV&X%z&1MT z)z~jlAPg?4i$zQhzk(UN%OYMHp-Ce*xi%%D(1{kGzmA`%52Txa+-*LaUM_=k zD9=tCtM3TqdS^ayRl`5feOSgh&dfB-irw~komQ+YqU^M$y21D(KFTmiP+=FUx=TAA zpI1bP*9D|VV=5&hcU+?M4WKgbSmHhmrJfQeWNkmv$g_12-1d7Dm43v1Uq8)4Bf+$1 z!8Ks7ENM8K(~)~dzYjbI#p9CpO#j`8lB>n8J~9%5$3Kz`e6~(^qx^k&au(0`7hmO_MKP3crR}@K=j;=(DrQBBoB2$yC}tJNP1CUWtkBN} zt|K6oH^82`l{NZ&T8mC39$L z(1J=?lfJa3! zU(E8W-==iwc{vLA4(i;V=w>~!9MoLlSOel<_;ivUez#}SOfg_hT+n&Pblc_Bn^cI> zL}+>Z$uK)yO1_|q7lAHO;~%q-*o%P?@mn{(kYTsv+AOxR;I3s-aFloRyNu@V)#-;Y zy?&xkPIzSwls@27h`-Wvk$k_R;Hm9t(s$XkJI02Z*xr7+sCyF!f;D z;y=sUZu?=PHr25#)A5 z^|hm13ytT+ZQ}B1I789pR4|BFvI(VEn4Q}>S17SU!_X(R4B_%yzPYa%JC$lL8z% zV?TB)8T5J9@^+^d^693xlh(}8OPK#8E*7cRk6`NFScsq;63<75N6M1IRpMJv)lw;> zOL>yV+OJF^`@7Rv9h2g*{_7_<@x<%gkMDc^u_noF9e!J9`2ET*U4)l^jg&TKsp!&} z%HtgIXKXvZkpc8ymtQDY+E_z3h>=wR7|A^1*|iBoCI<1T5aIA|(qBRZChAdeQX*t( zR(bKQ9Wuq>dU1TFd(BOVRhogHE;l{h*@5nA)!LfL-|qP&I0W9AuXtXk1-XcR(z2`L zTiMC*q0hg@zgRtZgzd(6E8vshAPC|HURvUx+#HvauN{jp?aA)k|AYYNmu+2KDlgY9 z>5Y!Qpc(i6MK!1{zd6`^i36xeodel<(je8S5yeS|c}EmQLd(jY-EM1xN{C|b0sV5% z7u~#0mmdp%2`rq8Dvf)zEJ5Mw0bc&u(&L%cqov|y!r_x4Y-DG*C^^WbYs49qRNkq< zoqkhjmyDy!(@{Lih`YASBg-x3q`}8dyRe&!J31obD~)&|xHY_{GZDcx z%Eqht-fsCeaaFV_xKx#duuS*(K$@RUVVjlNDW+RFp#{wt8|Wq{KP$FV;S}5Kl}34K z%|7+QNWiS;YRgDhO}(O5%P4ryZ*hp_7tF7F#xFG(avAiu10+yX!n+` zxXovmQ_p7e0QL=MEM10=L8VcOu?7C2tG3y`VEK{Gba3@dGQCUcG4WRBSRil(bh@dq zxCO@>;bXFdsysfR5C`1mnQ@4JE+lF#ok$yqVOdNB$1?c*bs@Bq^FcB3&}{&h?g zwd~;Oq>mq3a;Y{&u!$!9b8R`bPw;qqu$kD(>0&TM^MUcwTHl@-H-O1 z=gwa<<$Gr$Kh&n(_k!a3{L+V~_PBk5kZ;WE3Xkb|u|aY9j)V+DrdSgEDt;{8Vt5<%06zE znm2gU3dI^Q4Xb@!9L|;LGO|+~Lw6yIw4To@xn@B0L{TD@7jcOuU`jGI!75_xndJSYC)VpyNlqG zWU;ndT&;cPrIRzk%P(!(%EP0Ua}P_0FW=<0j?=`8EJ0kXA_ef~re)uOre)-1*~7fY zop-mRaTiE5c}Ujq=*2R0G($~lcF>J!qkYM%HO2Ez`FhTz=`E?1>wdW_0+A~z63>gkB zrt%G5Yp*Z)B)xY|hp}GjVw%GR9L_$=KC#*v*^fgZd*AJhoTPqcvTOT~f8v&r3v zNFZt%u&gHOGk>IO0ACO8fRQ{oMWwXn;V z{o(qq?F;z1d=YSXTS*_ueR%Cwtt{n>!Ftw9r?|?r?cViE?Go{yyNWoz*t7^s2al!2 z8;R-!n@zf%hZl*KpI2%MF!OcZM|fLOMqQ$VGJl-PDtM67*oXSTzuq08;vA2apRdQ@ z#$q?4q_sZJ+GEtU)e=}A7(F{KG<%ynk2fyVUhOy{rp}YrhvXZ8YLLH|3=loe{u`pAy6;s zD?xsw`@JWOnbbcL{k)c!pU&d?+)*k2{Nxqx&Zm#@j- zQ^n}mr+U#4L8Kes{O$bvLjBQ*>NQqWQZ(8{yHr^G-(|6k8xY zw~dMO$YZD}K8~*)&s7_Q;&ij=mMxfJg@1pGW=IfIchb;Bck_0jWhm@%b7)^=I!VIY0?LJp)mLG)FUZ-*!D;vCq zru|hlK^Jl`y+9A8d3gO?`q2MASD=F8a2~kUnb4)7f~tn0}44uz`rVb^$*PuahFhxKW%Z0jc$!fQ5Ft zdj4Y&tLF^}tC10c=dplL{1#a9IJFfyliaZqudayJ zWiK&KStv)xz)VXt`R6|Ik0Z|LKsfOpFPz*a5zt0r0odjtOr7}d4$zpdNaj7~g)Q{U{KXRNVZP{3+z#6-z;z1nw>E`V-i+FIcr0 ziSN8V#Bo7=e|R_m`>Ab`<>nOImk8bNyd+0!Mj-h*{t-=*m6}c0{c`qIo|P&QT~E*; z`z=5_T^bl<)hdlL=MXYLGW0m#UNbhau}_3Z?$yxYY#&XU)XbfiA(-6D3pe4+uMjoE z!8gg30DKvzKY%T;vNL7IHaxD`xgLZ)4Po1_)+n{7nxh!P-%^A?YmttgFyYXM=MMfB z_sqL?OEFLuja`y2O~ZM5+r7p@ii5{yTrlTga>$Tn&d3(+tT}~*8(RXmZSsxJsf6Bg zSCZ+fh&~_{1{vvs9~@q@!k^&V)J=IK)AvY$7DtdQz}IagbJ6--%~XV=UC;$h1q@>T zGQ=^(slWMeU!AAgc+}#Nt&=|GJk$}&HTkv z^U&usj>CtV3??5Pg_KJ6JmQTus*S`#Gyp-@5o;1`qrtFf+gjNoTXFIyIpDi8D3P=6zq{rqKEqTp>1y2*{{8D^~r4HS_{Uf6LiQJFo_Z$qami535V& zT$6YX)#-i!^|V8E2j-j}pe~D;;`D++s#ibOCiy{ZXd zbIb+Xm;*|rtFHBXM{-#R?B2Xb*oJe{ItP-hyj1V-YQfahKlX!|iPy_p|OB)8-b%7vYD2aIKg{yanGY?VyWygU9mKaeF! zgB>ih=4_1V9{pU@Z^BKB>uF0$tKRYV@NOvmfgi)LW4s9HeoH0k>Iv={(0du?%QJo0 z;tpcE@;1o+6%Ykb9{$59#eRw=-!#J40L*fy&DA>iK_3OeB8mg+?XTu$(4Xa7HekEN z{72IaQ{sQ)F6#lnYd@_nYx983qha}$isX;61_JTD*`7)67!BJowrp~upC`y75+7lHAIqknoAt^z@^WY z!Xv6`>h56MhXXbh*R-+0ahN)qOd~2*}Z5&>^%f zx1;M5CPKG>B1V`YWx8h4Z4B=CttX{a^&vSA`Q_{Z_?~4SatWnKV~-AhO}!cR@8Bpp zu8ROz2sm!L9|p%L+>kOTbP%)6Wvpcvyw2K1DG}sX^J~#%;$gPXa~x>{p?g6^D-deo zGJVPacA!Vt9>Z+tBUqj4aS*_Do|oxYsOSm`d9-F~cR6>ytrF@V#`YLf{){SQwp4 z@RbE3??t$`UBQJn#;YEggABBCCMt$U<=TEa;!YlIJ?U>2>9i|zDd~%y=`{DDy&W{~ z3|BnlG$*69x5N#Jqxk3z8h3_gL^q3&EGwEp*w^eXV<2v&{eJ+3KzhG9wpfS7`BOSF z!}%rzRNZ2%K>~tmWc;0{HZdI@n0-Kb9@;!7@a>m^UvXk(-zjT$8;T)~t32 zf*pojt-|olR=HtsJOXF4)4r#)iF!CIP9_lxsCP)Kn|&M*}+MWAUQwBsN9 zV;allkL?XZM!i|uUP#Z~qMmj&qdb;4a)*X#Y$ zC(oyg`bidgZNZ_h{^OG-2>)k928*3MbH!gv9{fON)e=ub^7VIa0I3ZriK+(SXNs99 zE7F7A9K;iFLU#~9`2G#1Zh^h)Qbw@Fn<3Gzx?@n0MT=wimpy5Zsr+NjmS4)8(p6zspwi=ri!*+u2$qPR1n-zn?lxW+)-~scQ4ZDBEY8SBEL6ZO>P2@ zHH_O_mbX1K#YwvUHrFGD2*znOXxJ}EnEhp}zO+-jwR}JL)QJ$AdY7qqlP;I#G682h z+%J@z{or}q$?Dcx6=DFgQPtdRp}ufydJ7sCi1$BbGM%3E8TX97t?cvVH0m7gpL7ye zP9A$nH&HxQcAe4qYn1|h!0Kz4THUKIwPalM>khbd;;Yr~50T5d(W(@t;bRxIwJI;Z z-IWtfYhuY;Az!{dt73)_`4xq`0UabJ{<(o#|GFBTyGnfZZmmS9?uU6k+VxnV-{03O zja!?ZTn==aw^zDx{p@Ykfw>E|LS~~==F(a8D(8pjn_Kk{}Tn@Z(3QsZ*=&|frMYDM~;hBzODW}X5Vg6)?)d>-SDf1_eF0P z+&p$dzH#K>uhUWaC+q7Xj}6m?vL{5YtMrQcd3m*R^Mx0lJt0|&^LK-?qH~vjyY`T< zs_&xn5pE8XD=1pAuuV^H!PSBB95FL>=WQdxA}po0qYW zUNlHEpwcvR5_aLC4p7+G3F*F8@SewY&x7ZD_y=QPluGyDnUyXKvDIAzP7109JZr~} zIf(1PWF;1uG{f2+=1a(3ze41F9yp(-=zi>U^jf!OLHO=rRHPt#+96M9JYaxFH}G4S z=065>-#GE5PE3G}YG?ojX2?QA9-b2+MNz+lBPOP=45=8R3t_|nhWARMx3r6j57D~n zAr-F(3Qel@`*EW!^gdKZ`;z=-kZM&)<%G8dU4*hvmXE0u@`~-mDN*ve-El}H(!tp8 z;jfw)*!vi)#fj{fUUVBnXjHlug;6dbl7#h5&C1lQ5+(v3wu+-p*BXDuC$Dly{;i}I zChOoxzLJLV=7RnnX2lpKk&JVGQ_5B;$rph0Np-_7ZCW@lRKfEjku*H{Ao$GyyegT1 z31r%Og{*8;{DMY*Z$oY3yPoh-k2tMzZN-Is@PrfIUy-XswC5G(@xjAX{=H>rJBFE5 z0WH}1m@RW>sH5TZZ_Y?G%KUZn?7Bufr515&26xWGko3DO_I-G@rV#3T8N&eDat&jr z_voazpmJEQe|H{6HNv!pyQ7klSK!uPmLNRb%6vTlHw{YCQN|GV6uf+;+lyH2a&6*hp~m!lAS#xE>^^gawr>L+U4 z%-H9N`mmi-kT8L4VJCQ813wCC#*+1sIQP$5Ae{F#zecEz;_)d5Q{Tw^R)SW8PyY+< z0GxyI`v>XAw5lym`vh@_Y}y`4t{S3Y?DaW#$Zy`gzPgjNXdmU_1q~FO1f~zwx%G)5%U@$Mg76>IZfZ&Naf(E?wXm zFS496I|RHc0n4pRmD+{QP0*+LQa4TrxD8F-CdmUf6DvDZDNK$tPGU1nOwTAG?$ePr zt&5denP9H=pvXaSodeZ+*948L(ixjg;C2Tnw_#UOlw`3^P27X&cJVzp$ALa@;qHZD zpADh)E_}{&zkG{!_E>HyG}emhTQ3`-@i`VVtWLeYOG{1aC5#V!y}6vT%I*1Az?PFj zOQ@dVe!yr(l`&1$%rxN%GYT4wPudlFe>_z&M4JR{KB>)r;;dvR3C?}5I?uJja198l zgA=oNQ)GhCM@f?FaD>akEZ|;_;(zX674e>eCG+{7TX4gUdhBlj{biD5GcIcxOUB*? zl|{p9mRCJH7AP?4zl5d#1{n@@3mDv_QAtRmQ%J`SgV-~2N&~`1(83<-n{5{5Zj8}Zzp{!! zuQmi>Mk8>f1Sm#OgdMRaQTAk;DD4GUVO77z_;|jPLL6Xk@RZuq=7cq=FP9qwtx6LtutIdF1d zn9loyBwtv38z{BLEf=Y-U+fh2+O?iDjnu#f7kve|WHr`%@v`47L)b^VB&I6nAzWfb zo{H+DyvmR&Xh7%v3a?J-lH7R&Q-tbOqUA$Or8NNu|yQmL$&6C2jU`T-eo$ z#xAxHZBSh+sBtpj$ZUw%UAQ;K6a$qW9Ik@F{ovUr#_RD$p^=MM+{am;>3yU5}W z-UKxcW}7{ZYaGv8>YBEcJ+<7)?~8@{Z#8i-oodyUkqh=1nb`Kt7u&&9kN(Dq z9+F&tiG6m)Khyc1hJYzYz7P;`qkb2b%&`np-or-iU1x5L24=I_>{nn#FqN7-pfmO} zgeoLa8es+7#*@ZIfIa{`z1(abQt90i&9j9@-$rJZ$WrO}p3i%O3EyCuqK?Kvt=?~t zIM4OAiHn9&$vA%YlsCw?cz>dTmsJC~$N(am_p&-h4uqW+_; zsT8-!gz8f_6U=kF8G}RJuccyJmyP)^P)h>@6aWAK2mmsE;aXp)YmvVw001f~000R9 z001yAV=poj`XRW=~d2z~jf6xBxb*#`h z6hWv6f>lX+5gDPr|=;m*2V&IEbLsKm=x<2U0b*Pzqm;oadsmZ3`II&ux^8UMjw=#=li z{zCIKEo;RK<$I3LqziFL0;PL$!JDaH%3o7z5AWEMW!dteBlCo+UGUGM#?6l7ulU3) zh|CWCdu-R#V(}()I-J)Gz+*zjk!~=+~^y#Rt~JO?h{);!s@BB=^5o zM@_z!Ui7MU=EL;mFD5Y-Q%?u5_p+|MmHQMdZdAo-*2#9=OOLU%gN{u z5sr8M@_Te;)%>y}^GS`bH8=i`W_6V;W?P8UZ5sxdKTBL8-jfz;zpl7B!{_Uv=_AqcXSVjA zev%y;;(M0;^2Y}toE`Y*bZT?L1=M_dbbi}{#RB;PZ^thi_k7%8KGMKCjr$e4E<6M|T>fU%=}jvq|recY9` z-=xn-e~e;V?VPTTif8!--WwGfK8-pf=4!&rcYB`Rcl(0gagwp9Zc6V7FsO4ZK8jz! zpBY58My=%*%d<>;6x*HtqXqrut&5pY_cNil^i1ksh8|b?wEgBhbCrMN;~akFi%K zRu14HiJg=wo$@p5^{S9CtBc@|=d{Ni=+-SU9WJw%)`8r1^%2y|D68p}Z8HSVDgs}I zjmYNx5g{)hL&njqNV||ETd;>3w2qThNh0dtK7QptOseApqbPP(BZpC{cV%Q`VYgCh z1tmp!GiAGS#`$Cy;_7w>>xcS<``&Pb(MS$a9i^UEGHFO4S`KBOKu+WgE~4QTUc8J8 zw>1LQ6+4lpnOKJsiinU_p2j#VSb9`TrR2Q?juFb=e7|6$3GeXJW8PzpD6QJh=04m# zdw4sp?4D0DdEp6vcEHBqcScvpR6RFA*R1d;V$es1s7G#KNab_UdwKz984 zp7n>8kFmb{X*9B#GO%()pFgq&vfCWagfwGIQYG{@iBe5$HXVrg-!S&4n4fK6J@n(U zlTz@?n@b4+Tg*!EPC9}TQlnW`e;N+nPKvjJ$mqr_qO>MH6KAJCfeg&q}y7pFU;% zAK3)!IeKKq*tQJMG;7o%gXJihl{dvaHz|c#-b2WSs}?A>6an#urXQ;QNag7$#cxT0 zxTX$xZmT0QX_2xXsLO-iC*kHcVmA7B>4MK6Tp6@xhoJ4GdLzy#Bvvf2JOqNTQ?LDT zMZxZSTCc{yOc*mE4H3wUs)F-u87?MSM+DL{PK3l8$eNLirePI6pdOr$=;a18*|475_SgB- za`bUOsIRrcX_+;i=d`TgPD<`~pb7zu^n!1IJS$hVThv=l>ye}bOT1Xg^#WlO`Y^$k zy5*nM8kbGRa7~fr#~LSXAb;;dVl?ix;kbOowM+^BZ$X0qa1=DJf%vKGQ8 zkj8#&lIxWneXLr|3vtpYuKQuUwjT&7lx3lPM3b{9q(9RrQ?B9(uZT-tPBI{mv?${> z>kZRG%=$zKw&+@z@!Y@13O=@ZQ`_>4%C~yKfDX}XQCSocbO5Jb;vl!}tnIdn=|S^Z zWEMvDNfWHTqryWbf*OXz|F@{D_DsChjo0>+;1%Dn{RoYI8A$EfLA_{gAceMhK>1iF zdczd)(Rj02U5K4$mT&7Empz}Y3B@bVJ)J^pTi+-$zvp_DF#qPcbBBnzjY1>3I+K)> z-N?8Yn4nkO>~VNyPYHrEEnT)BWrPof~4^JtI9_#jgYchKS`S3DKgb^sGF@wGuQ* zm8_!z&-Q)Jf8bH~cgt1q9SmBAO^jlPUA0+iRzBq<^ zDu0a;de>r8O61wc`QQ3}YJ3vX?tf*9NO8$CF124Iv{e6vr@zP4Tlng*l3SKVVomG4 z)~OSuIMOHFzwnu%10e;hpn9}q`rN4@8o|X!=07F);ptpmi=3@j>!v$1Tr^+}H$e&> z4>~76k~Lhg30Ag*fr49u38P2C=f|P(4nh zn9Qy88WJcx7>?qkPV~khbnWy`Cti@5RY{!Gj%Doa#H2&2d0i|cPdT6dUZtLX7fW_P z4lmoJj^iL!4%QMNOXnjg4iXjFjFJMLVm>mEt+veh@3DhqbU(aov`YizQg|+?WTk`k z4jT=zV}Pg~QhlDx4lf7Gy9v<-vRr{>XDk-c>-*7nL#PiSUw^`$rZB1U^-4vtY8+pM zHw8e34E@i5?13?p?^uao`7m)h51wh0-(K7VN2b+-QZBoaiXG}jGpYfvM^Im7K&ZD~ z)u}~k@<5not(nLn{=Cjt9s^c~fweD5uwF*Ea7(K8+;43WT)65$$!JFBO<^d$ zD`BlCBM!vA1c!%68y=D;C3%?=(PxSJGvITRY?ga>V}DAMuywy=y)NE1C=f6^lO2+b z{0VTG4jDzN3qZx{|L~-5(xi6cfR4`RxqT*@K`(N>TSP~_A z&wS!YBC4*{xiIG=ltt2Ci$#@=%KZUszpAwDUm(TBSWFlQ-y!60wqCRe=vBww`>^?c z<49&5A^Jev3O0*Q>dd%Uf50?6u$)7in1!q|TqGZMM$T-OCOgp+lh8G5*O{P1-4OC8doGnl;qjb zvM|y!3h;Pz_aPEY5^{8>m^y=c!;^eMbdZVsm}^%3I=gJ`f%`oO-GX>JwdhoZzb|3O z=Kb>@@HCT6BWR34w2E=Yr4LM~7b~{I_1(a3-H0xUhGJ0GNmwteD4d&~>J<1MV5VxkZ+=E48Y$X@sl-*R5_vl_ksQnX$j_LDhqjNB5{&zxw5yAx>}mj-wB*_%QhB92QwjX1Gt{{}i}LO*NlHp6XfXu4 zhCeZ62xg{=n8hblfCzC_=+Lnyz)y!KQa!j59E!ULE}nW!YrBs<7s z)dWV#azKXzA|=0e9sn^Sem3^%u5t)iMY7h&RW?6SjLYZ}NIzi$?FDG3)5f!ojME$Exo(uJE8TSt5j1vFzv|=egxbx33c|Eq) z&#q_gCVC%#+)(rTqrmf$ju@Y1=xIcbD3GDQR{f4_8}snosaDClv5zjuieedx*-dL> zmY7?IJNFKS{_%Bi+=G4IjJaK^i|6yNcBl%176+a@!wwq%LMeS)pC&OGcF^{DyDg!A zE%@K-OvNgy&Ar7-CT?2j=9X{o@wwA;`M=qo<4^wbK;Y+8daQgr>J&(2*q_X2l?J`g z42B2fO6$4rO5M5)0sE>-6UDrSh65X|sEh@U_Gc&$LeIUP-9*L>yUR8vsoa=nuAX+5 zotb5|xTQF-?nU697l%!`+F`>DuLXX4zq={V#FjY*DPwO_-+MfFAAA4Eiu&Fs!&kYR zs`s8Z7u6)6a4wDG+nik8`l$4G&4k~7`?zg?!m_37uLkCrv~xQ210TD4yQ{pHj*SVG zZTrqNmPS=SR8TyYAK&l8=VmnR(+BL)<~HOq=06zGwcxN#n`jJ`JvRPSro!WL%bWg( z3$FSFBq~n^{#Cl8C^fa{-y`B2OHFvl8pqM2eqVmfZR?%Mfn2}i@{yd8c8wW!8@)n& zC*I(SZ@lVXX4vlj7tz1BET`dmn0Ikj zS?ix0rbf?OnfPbJc}rdPtfH6V{>w7vv}t#X#x!1%ElVBjS&{qdaYPs|?e_O~v5)2q zr`w&bu`L|VE8O@sIik9|xUn~CXt+#{HJ(fgk2{iq+Ba?`?z->mTm9J8GO;d)W2#1D zMkZXWnyT1w2g965x-jH`H%sU>rxP7TVz*}aQ2(#r!CPy9PRLT__R7dow1Kd>YO%xp z9)7X4b_v&X>d=D;IQ0=UKH*WHa+9`13sM@fM>DomjB(eB5gA6LN`&c3Qf)EFXX&w? z2@IDW;>m84DA$Ivtp_`ym;Ir~5@GZ`5(yL|S9v8j$Me$jb^M*zo_Z(rsd9Z2QN4YdnhZWMkw}53WIuG`e1`rPl38jMR>6=0JHOVbjzW3mOw;02TMqzKz~RBclaW!8akZ26ru_Tdcr zKo^O;Dw|GqA#vpF5*u^39PMWf4Uxk6Nqg{YlWLeal!r;3#z-`|-1w`I`#$%ppICvh zlYm6C1IB-^vTNjTRrje9%VCbFgP^AC(8N|Sa^q_xd`Q(JUmuKT-+>ezr)^QB&?BSv z_5=p)Tsb^Sf29$M)V*M5MULEnox4X#yo9}9_IT001!H3>``lz1kQR?Cc?upZ;Ki0Q z9n)~{Ve)s5?lq_yEs^C*SQ><~ElMMuwxUa=5z~idtxO+R71G9$Wy0)wV$g~fg(D&@ z9)t^1K=gRz%Cs(`bpn-gL|j6F%pRZ?t8?MroKy$O?qL##No5vO27KBlmj^4E>3hy0 zhu0XQsb5|R^u#Ddaz-?}D=+i?qC?}oif>AhX5_wvTml_7b6KhVh-nxQiBSjc0%Q}M zcMQfvBHaRy4nWDT08Ld`f>F5_PTLPIM$wzN>8rSWv2xw1*DSwNxH^iL{)=;70y8fa zSm3`>+&Z#(9But2rd#d78S=-GKe0OuU!fDL?`)#t499ff_6q~K#S?0kFP@w)a$tN; zwOl;hJTPBZ^uo05u%XhyOzxo#3R?4kOTVbsTQA}d5V=hCExj6#QunaV{A%P65s8tx z5}8L0v1NNO*@ZqQjt;24HhcPsmCbni(PQZI(S6|cZdiVE5LCW&DDf6MJ;M9c+eRoe zhEzu`@ZyOE@v(Rw&Zup# zfqIm3)&vFy)Lrr=xXWacUoR16gG~$JL6nx64a4`hVbe^kbGLB*jj^Kqdyrf43RSfA zhz>ZHX`Q1xDi&p?3}hAVx>=`J-IS`|sbq}>k>p3hVZ&=|{CBK-JwjVBq^=Yp5l>cd zMCzN2Ne7XGVp#;sX+-!Wdqy&sDhxJHQz`eDGGY57Hht!0C#0U!7CX%#+R3EiY~(A` z@e+sOYlX?Gi36Kyc3zhy>Ur#vAl!$>q5ssl0(x}Hi>zqtn`aZ~uRmBNcc;>)b>MUn^J~+v4P?PVmy?EQsefGreXvx z>>7RY+g2pfcj>^pAR==n?OAxQnc7Sc-pF}CZ4VQVnw|F5{9u(-Ov0HdPH$9hd&@| z%2*M}@3i}{a@Vk|f*D_W<{K|$TGI>g<}rx$#xMD6sGb1Be#Mi*#$(NYx4JTX|2X?; z%2xh>s`^-PBrhRKBj2Hu=l02x!IcXPb_7W0=&CpK(rt~17W;`ANwq|u4UavlfS3%I zY)9^v5G#r>+=E`gjU7hk9c9J$$_x4hXVu57S{F=1iHgtI{p@kbANVmrkYa_OdHP6s zJ6U*e<;=QPPustd?VO}_!|045qAfCHF78%;0S=tn7bYqXA&b9;KpB%-##9=`JvyQS zAld+-%!yGsEIS)#xgT8cfzU8T!#B-{8#u^Q{^wBgaro7cJlmRf->6;Rvw8Po($5NmAB6m|lS<*@W9yXiCNB2F!t)W@${ zHXzHEp##yQITljm?VbgiI`s0d_P$bNTB20or%q{e(4FK}x*rhJe}h)#KuO{>|6kFc z^1v1gr*a2W6ueOpBb1%kY30aW#}nLzt}ZM~C$;Jd4} zGUl~5f}CGQ*mT%nR-drk)OKQR07|)(0(zz6Kkcc<$lbbQ-J`CXh}h5&n_7#&IxAh0pcITBBn?Q6{xRFF3tlHamqfS20 zN&>Ay0NR0__&r8%0ajhar-auV%CRlGSa-eEfA7St+kW<&^}uI4j`-Fz!zo%(ytgt_ z*p>l9w5qR-hxoHol8U zA^20TZu=)fl(dA2cy(i&Ef{OZ`G8x>8er4mnzUUR(kb9~%}+3COZGc=u|zYTmB|W? zRUWcXu_#F?K-R{QXP>PS+gnv(<4yJa&@(6lS@f*hyKn=C-2?KsGhN&*4>PSO<0DM) z+N%-Cc;|PnMh%k(!E%#OedS*Zae*0suz@f=z+-a6=AVaDv5=#RYZ9StA1EAFllx&c zd-FAuI+8y~7|pDBE^^^FhSg5`|MyLEcrh~P+N2Rl6I~rcC5_`oOho>NOhCe@_Oy=^ zCyX3Vr>p*3R($i(xt8B2PFQ{UUCOzhYg*$o=igf5tpYPA?!X6)Z|BUHy3M>S!!*yN z&J%x|@QZWyt=~W9t{)jU^0M70o$^k8e8UsIZ0r{lGaZMdcp-+38$$HZVMx`-rQd>z zPFqUAe^T;&GdH|KqDY|zAdBvS^<9{277&*n72aFPqgOLsF5_;IM$9@=z0iuX@J6tR zF2F-Hg6B+D1`$NTHs`=g_4^zKQnP-R|1v1a{lR5CWwXk_13x=A9>H-EhZ_z)A<#5kB46F)A(d_Ii3dVF3-9%a_%&%;|8*kuspS+9G0I93(o8 zf;KGmyL`TSBs}lvZjB{!DJByC#ED05Vs!i=rL5OriQ7gU=E}k$?*uW=wE9}ZA8)= z1Gz$~7%5_>ORX9!VCGJ7(ydO&>c%J`r_TXK!c85qKh-;4jZwB#F=%6lzz1sSe&v7g zQ5s%b-4ZFB0T^ojrbhfjC9%MQ+=~n`f_L~|oeij>8;zR;DRWSpl$(HKX&FWm2UX3> z$5%(H8<~gW^yGZFz6m(i1JMv#z*BsekhLWIm!}J;gVl@J)E2Ht%%DnYsTB=b6 zaokILMEr}Wd<>83##M@37vjo4k1gOCY$(4b!zUJ^(VKpV?fwdc7h_$P^E2^9;)TeS z#g1P~A^mNjgcQw9*OO8?htUqa(mV9X!%7fGp$vV3vXP!#nJP>!kOz9wPotFDPGHrE z`r^vG$aGkWT_U3Bc4{!yBocg@+52==Hb5X$S|9h~GAala(|T71_~}%Co{v8d$%B)T zWRSBE+bu>84?3J>u4o0)_m8?LEp+_DibgJZg6Z=OAL!pZNNj93n~Ahptr8@8p%u{< z3foouBLlLx62zaW94D8zbQ32=Q$};sA7W4an&9M=hKA2zW-+u{--K?7LhknPQ*dgD zgdYmICwP}QlNhn>g4`M@Qi3+9S&xfO6m)`RQca8|I4s?7+GJKd;?701HAx+ICR#CCikP9{ll#A7O2yFd<&Cl#=7wcW}O1U-;H7? z?K?7pQTxNN4JATWiMe(S2)#ov4Q8);1iro_e(y#Nh%eP`-yL35Gnxy-3&7t|vYQmE=$d0RfE$# z#O^pxKa+(>=PG)WtGb99gUVCSCnt-9o4;gnKjF?`>$TW)dqI#@7I#M->#frvbyQ>|*YUvz4> zR@5{=sKo4YTaAf7IF=W?fU617t6JqAhg#$%27bjm02-p=qhBqk&ZNe%xR-wF5<@@;w?4;CotVmjBbdWm!8C^f^?TnOfT6nGO0c}YX zSjRz5jK;?zE(nhF&f007vGSK=kvqGt`=>hSrnh*A|JpQm?|wVIG?o4B7xR{{oYG~B zj5iz3EDC7PO`WhcE=1G1WYL6?J+5)o-_H~}UdGPuUgXBxb;@U8ICpB`<_R=xe_m|t z>IowkyPogO_hG~>^SkTFFZrcl!oo9f^#0 zv>H!USuDj)4;&)tvLXrJCqmt2eJ+i|5aKim)c>WEU!aOKO{ijGIPTpHTZ~9hJ8t~O zj5&p0iXc0Q>qDxi(A}PvTH{YD=e&jNHcz(9f1F5ZiPovAzd@Eo1-h~99>I38Y!+Z^ zZWx;1NfC_`J7|ZLmDGWWZeVM&#_)ndr0jDfKx@izc6k4TFYnPRY~O)@hDAz)8onrY-=h!wXfi3j`Qd@21;V=gFM1BQP<~@(9EHCs&F_Bk?1J$I?g0~&(xc%ifLVIQLeu*`S8%+C@E8Xr+vd|#RGhIHhb@oN*el>RvUo~UBTOeL?Ls- zt{PmChy1N2+NQx@a=VCS8^_l2ki%jT|C&Law)rLOrd+xYcSmv*l>~@P>f|MPa2bP9 z3Z+SzVIk#u5pVHY!Q66i%MPV2Sl^6lm;rF6kqClbQ`tzX7M1_NW}i%_hYtt>6Nfh% z1R^s=!+ozd3*Ksa?h>lL^!xa=2)4G)HlOLC=LZ;w{~hlmZm}2vS+Qb;3r4Z{H4^?E zIGMdtsxAiF0gT^;+6}P+f701Xv24!ksWcP<|99YXB=YS&De}{na5Zhvx*0mWn_t*s z&3{GV$(X!CrB;RgPq#ycmasuI z^1PJfN;L+v{K<1%D(qb?`H4o91qmQUD|^%G?LHuXSpb@cSr)9E$0}sHO|QpRd1wW3 z;2oDt=)i7A2`ei>Ok$)Xug)2HShaW1VZ{ZNjMDX2m+X#UksciGEOv9suo>EqYC*#sL z;4gi^jrSEN;g7$N>M}5x0XVVU#9R&ZTB}zDNo1Q!8bG1MNR;YS8*(@T9)IX3Z}K(> zKkwtl25iGzk`)1IodjW!nVl;uuHf+o!M+bx#JY$j!>Vi&PxfoTQmcMaC#IG6(nDS} zC^v2Oc*7TKF6G#>!@E_W=L&6?H zV(r*hATl2|!c|{!@;JO;#Vzc_@L?^{0R|4>?B97M<7_0Ni2FF%hXq@RaUJ$!e>2KY zi%V+Zna`1|u?&x87cI(U3%ML;-8)JjXC{lMbxPP3pzT$L+{RZw1_^=*#lXH?j5HmT zp@&SOYbsU)upL6XB(k-^!EaP>ujvy)k@lhnb-h?oV~{bd+3ZYS$uA#vD)S`tD*P}p zC%gm7Oypg&S@nX)SQnv~G@x4ACGTv6oo3ZXBmZ_6Kp&eKNb>98{|8V@0|XQR000O8 zGJfG&(078l{96D3gk1mt2><{9FfU^-GA}bPFid-SIFw)5|1%yuvdlA;Ld?>x%~FyK zX3(NiWGR&xB~e87eP)cMqEHc029-TRk#z=rqwM=`D!XCEJ~3wA-uL?b@w?9X<6PId z&T@b5`~KYbIp;beh*$&wNB{sJ3WVMS0QvuIsRO{I8UQGNR^6cgZ-+(=up`HDk0s;B z6E9_X$#C;d&0-ms-Av-Zq@&c2n%U%c4R@N(g8HqWe-}#__=)RFJo{br0YPU}exz}X zL((7qJ}7lQcF!XK2QW_Gc_4YQF4%OQV8r`t9xn%lFw9OD3ZlDfI`7;$ED;dGb@HTKSlD z?Pa~mrhAhI$mDvTe@B!#NK(>JvKTwsB;&#ygPlaS7oku zj@=74bP)Eu*#G(K+mf#zXM&}IlD?1nwO#a_QEz?o@L+~}2J-p3+a0;b;LX+}1kBN! zm#6Yl1SHe0Z$j)K;t%n(Qi$}PiB(^}3Ii>T3k3b+`dx?UM`P5SW$=3siG54^@OQ7n z<@*eqf5pvFOT(+fZO7a31h3`7%>4_~cP_Wxy?oX6^^Hs0m-l+x+5Xl@#}<_pY){yp zu)|rl`!4Rzq>?f61N6#1I;eAJZh3ux#OkMrg8I{fn|kH!zInE9nUlZq+`#bom)Vj@ z4?&9mQX9GB_8PX~%u(d)`m-+K#-?IFaB=vD2Up{jireNWexpLSpwflN^GFL%sc#1A zmp4_dGhsmn;YeB7Ev&R2?=Rk{?PA^OI}%4i#h(*OVHJ%FpUj-udjjmy>-A+jHyE27 z32rY^+VWh3BrRofU)*Pq-d(b}dE$MU>v^UAsQ9Uzp0GSdr~8-W1DRa`&#kQzo(iUK zR;uA0?p(gv`^xIhe`z1+HoxP|sqMiKU+YhQJllOa(pnf<5y8zQvv*;=GU8qsn=B?}<|W&gJ(f9z`E{@0g6H#ukb9|` z0EaaFf5V^kb&h^870fwCmP#5>k50zZpVXzMj9)?zd`j7|Y9l1&d))KUGkW&r`=OeP zBC0`C7e1jh?;tFs0}T6_p6#zQ-(UOC!A-s@lOU6LDW3Vw_gCxndaJ>EB)KnRr|jO- zP2&_AZ7PqxIUP5(IpL9GYQdFDlL2mql=TMqSL;7ToxL)2R(D$ES@~j7htJTLW##_D zuRAorrc!8ZNMG-<$DMyhbg)${CEzx0+sk8<0_f~-;?b#Xhk_iRz1~yBa94wk!T|lz zxED|T%)i9^Y9+msQHTnS?Rsihe&E`mW2y1gEGLyVbJK%fXUYo>#+?r9Q=Ol_SY#Z1 zt8Vj#L7~wl*eZw%e3~H!A*ge`##|;$rX_&UG^xtw8@Al7)Ui;+VZME z*1|kkbVVRxY}C7tNEVBTwHsAXQ5dW>l22TGGXMJ5+V-Q{Pspn87%pX{QA6Z z?A1$$_9x8Nd`VUt2n%{_r`f3IbgtK^_q^xQA^Q3FutDZapzqu*^SPZ$H8)3h4hC@i zJJa=ahl>8Fe|1S(>*SaOJ)!-l|A%<8^;5a>+}BqDCzmy!``N3M8|AZqe=_mOJ!tRF zfoT0>^E(>OtD2oDJx$!}2wXa<7JXIu3n4GWB99=zDTto&_Z!`mZFb^!BU^Y?qOGI-RT;xvsSJ?cYT5jO5C%1Dv`BmTSN{} zBVX>iQ@{OWgXY+ll?&a_gYg&Mq3egUB~SeKGh8|%-XLsOeDmb1QcAogm7;X*^zhj$ zv8%)Q^*(I;ewUML%9Bs{D_MRs-z(q#H4?8X@t%ih4}9G7C13juEOp29Eq|}Hc@k%E zOyfA)v3C>VnVY%kkql$ko#{-b5mGa%cxMjcr{6poQKWABJFa6otnZ)~;!?=Pn(d4% zksk(m_FigJsJUI7U7X5)^ip15UQ*sWFzoPf?%aT@i_1W8WO>@cN>%H!l_pZ#9{Nw7p?Q4@64{p|-J`p47e$upAf1PDQn~N}R zm3~<%V5amCWU4lm?N%^C_U(HA=#ZKBa~FTuC^0c~c28=7)u6qbhL%A4ueeM2&#>W_ z$GK4tDveEwez5o2Y&y8=o#+$Y&|NjK7XLH2pYKNH-3_R)z(Pat_^|mu34K0&zrSbe zfeTh00Sm^Ix5aYr0j#=|h_Bx-Vy7tL$$j2*^(o!pLgBG*AGAehgL&6ReWrO2I?`= z`r`WHB0p862S#Oxn|mdkx5tI2KgwgBcn_5*YA7C6P>PD$<#797kg=&$yK(0VIFO*} zAbC*iPTGHI&5rP#h>}=^Pwf3znuS19@kxIf?+-@dzb$cTTRbb9D(Tl&2g_Gf1f`-X zzn_$Dwb%<>T2SCVa=cSOt1+;vlxnBlfHMCPV0i4b4fCp-Vn>*l-Ca)^YcRvKVJYFb z$W{p>i-XGtl-SKDHD_BAd*j_|or0uHy<3%920BE~c(g$P5pgld5uMY2pt~ znkS%(ek>^r`OALlA>}k`B`BJ`P_;Yfz3Gs9Y=oOcWMF4HrhLV-n=iYj{G$mK|8yn8 zd-@-rq3!GWJjh3VHG62vMa%v{bR#t+dsDWAV?E{?sO9Ijno_)f6DSagUz`S(SzpQ= zN=c(#UgpCuo&Hh#hD&4D`j!?))JahuF-xSw-1MTVm}PYC&C$x$Sj$oD-Jssi#k}<+ zKMZ|~Z7+p+iH2{>ysd0-;7W5V&rp`MQ$mA?Lv5-NzY`2^1)hf7B1(u-g+i=9b_vlM z$ZTcd+~Szz8A~?etevY z2(0peq*uZa1%qJvDa^YKM5|daOKO!hK{hq_!)XQC#TXXj#cB8@MD!fUXhE{)grbLi z0V}M;BRxP6zNXJ=g2?_DK2jZX7!{(gGC8CYK1<)sQ4)>s5zLY9$<=?6a?w0ex~I2AetvrZ*Up5Xf3!; zU$2EqZl-D9iZMj979_h)=HOZ8;K(pD--yLj3)-3svgTLCjw|qnXhGb|XNayvNQn%w zpf}pQ8{5LGw0ZTy%0LLXDWvo;RmIo*pi(;pzNde4Tv*9X=pl|#zOj75hc4jQE|ES% z;z)mPoKUf05F+&I!Q!I3R`q;qVc)`XSkh9|J7*qf+aRjGgv>fg03*sqT?bh51LU1? z3Af>X9pJoJ)oECS4g1f0MBrjDqC6JJ(!}rzARU)%X~!BgAOTUXL7~?a-5x-U{kVMm zBN_fi8O=6Tb}d<(cMT~%wg40eDL=s9xx%6u(%#+_Mj^6$7K@#J%tlNc2*Y~fc`4HL zEIg1P?!S(nG@)XK(A-aYCSD{dmDZz~1B~cAkY%8TcN>@U-<|0E$}NmlS$!-yztId5 zZnWHRgLJ3JZ%jBq!6;MZ23>vf{wc6BhWs`a52WGiBawWyN{@Ib`Uzt|6L#hyxElzw zS^c(H=m#72U8l!9g4f)1MZnQ1n6%8)hJk7=FFq9H#CH_|8F#TC1bu35?gr{GaJnXU z3r`sI2D3CGS6-SnoDKo$NOq)11s;$fe-9MTMkIR!fg8dWWUxSZHp!8yn=-?KzxQd^ zbGAzulMMkpuQKR&6gojpls$vXU;F-z!y?O?*`rNoqzc@Du^h*jH!1kM2o9+1EYDxbu+_N;G=qJ4V= z7`aZwNDDN>fTaWF&nY22X7yF&JrD{%vlbX7Q=Bj_29fAn2uTmq(t=`6B|!cb0*F{8 zDqcE{kx%Hu0(4knWf`HSTOf51wo(ovI>El~goIDX5PR_uZ*QPjk!uN4T0*pd)-{}C zKNti722{Zmm}Ufvxc)2XkeIHNZl|uGqC@s(VQ+S-}fd&R>JZ|MyPKOG=2m@ zNN8PwmoS4Uf#}{-RG&EjcU2;Ju|vjP)2Fpkuip~iDj???u-xGBPAU`a-=kXIhrDI? zW089S&7Tt)6v1ABs&;a3H~x%^5ny|#E~INN;(On}iLidAjq^kKq62ZPq_sswpVkO0 zS6lTlno>2=qTM?*u`Xbu+4plmTf&7>a;f%xKURR9n)Suqfvus6h9t(gesmY4tyU1w ztVevNrCItbf#0~!8 z%oYCR07SvWdnCnPl3fPAxs)PV;kT#)Ka(kPsQK%R{Z{8nauz!YpGiAoN&Dttpr^6-7_{$%YS^8nF!Dlp!bMrYHv!UB(PY~2DGR( zmM_7lC+SLQJhsw4Q1Wpn-I-Bi`243^Yo3KF10c*5` z2=l{j$d=96Dn@BU23xT<%>$2?{qEj^_@&GVFG^~yi4;#|niU~Je)B}vaZQGQW>Kf1 zXplrWaaN|p_~`s{DqNIhZNuap~Z)F;|A;nxna288@hF1 zmAaXbz(*9=5R8@)!g1>1 zHPTN=oLG=J11gmvz$kO~AADiT4{adL2ap$G;2i6h5v{1ke?BDulUQW{>+s$O$JT+E zZ3O|8pU|H`3`%(#aCB)$D_JP;Ecl&hpk5f^Q4LdS@Dfq86#9{ZFdv9~1r6+w`itkX zRKlSEVKuf(UvF!|!;8)~ONc<~DQ?unF;_U4-!Q1OhODBIEB>JxXbJ^uF^(R<{r05xwZf7YuxgWflf##2;~b{Q98`|) z(8_H1OptKwmX{F8g6IN<)EZ?Ga3B*sF`{RO;o>z&!J5QacYG{D%mpbjTMl>w_83v3 zKK^HSx%Jeb|q#x~I3Q4xz zRMk`=ZohNQghooq_)8sB;cK%_4xTs5*q=)qIQ5HgsUvCv5h&E<>ipwZU_X53*rmla z5W}GXnS;=7b@=%jDczX>IKvWkx(QeHN(n1Ks2?kM+hl4fT%pIyfc*h*XP((f!v?x6;DlKDY1lbD7OSy_`)>mro~8Ax5`0Oz0GsLqL~WxyhaT&~KAJ+oWscgL6DZDgKl`C>{75!ghsGdSz#E7lhSX=1}7*&d|qHYYadk(5G&9gN)|; z?+uCwm%o6FSx%c5?g|fIN3*?%_MH-ZKd^5l0BG!G!XGGxO?hxKC--fyXv?Tm(qe@* zRMiQ^PrW&9u1ENbE73(^{J77du2)R|ztE|dP;xK53AfW*Y_5t2)#Wac`k`k+T>V$$ zw|F8CT-qTT!(%;3C-{CngY1lhq}J%Oek2H7>VDZb7h6oTUx|%CqhvnQb7-jwlC>*e zp~P!;AJn8Ny<5#9@e(NN$J&t@fOl=LJ5=Iy7{V1YN#AM{9jC`dOm#12GIjv-vN9nF zF>l0@ykfQv#myl2Nfn5zO@BL|!+d;4(T64xoc7(KuSfx3F4;j(e`{JC>ErfIDi^QO zrv-IM9#m?Su2x!P4GJd$Yy{bf|o30s;Ux|}+;Ku8os7b4$@>Z&EeEs%IeMa^_W{9KqPzB|+Q3CH+ z#~T9=)*LbXuIA4UKL_)sF2vpL2`80i*XJ3_NV7rEe2e@Na=O#tJhpTiwEUJ-v(XMZ zP9W;^=!3er({z0_%V3B`;onn~3+3w9q3LP){6ib+s!bjrZ2c|2O_7=#%7*r z`@VjsOxqrrdhNlXENIihJK%ZU!_P;4Ub{G7s~h-tx6ZXQn&%MC2seZa!gbE&E6b(J zX2-ebZaf4 zpCnp_lvJHdjPQ68a^akL`->gxHMgBlK8(~f+F!Uez=WKD-o_YU^ledMxvSS!_wJ z`#mM|+rCfUW_o;V-pKFhjQh5CgbTzqNHa2}OoPpYdvD^irnXs(={A(^sW^PGPEx@y zj1}m%t32PU@j++c$S0@3U01sF)1%}x%S%n5=j1DIcMioML!T^ZJ0}Idw$k4F^DyCf zA^#n+-s-|>a6urPaWNcyD0!tvx2f#I_&Ng40<=PkS~mZ(j* z<*fQi#4JhqTHU46sw;PML;kZ6=H{>54QoPcK3)B_r^a$;HTPAoeuSwR>F;6NOHV&! zjP$q!al_m7T|w@}(oH?@AH4YWwLx`X!%X1Y37C<_GV?xwe`!O>r|)0cS94@0e9L2{ zC#p5GYcq<+cXKv-8tr(uwQnln@5kv~vPQw5b=91^f9Y~#R2*~dT$E$q_G$mR*Q&ym z>4(T6kt}1@HNm6y2E-o6;G3F>pS12hBJ9~)h<`oXd(=ij)mi*Gb(Fr@DE#4vf>fT8 z=2V+6)c-PhhpuBt$*Sdz^}4iT!S&;@xkkaNQ-SMwepj+n+=)$Wp)$uu#&q-fI?b&P}w+q*Mxcpm-$DD!>r7D-cTsjqY&_wyoj{tM0 z*z(4``(qX7Umt<@?!ZDvpzr!Q^R#gqIq!D&?e$B4wtgy5_-|8^-7#nHhd&>mF5M}( z_@g~HSyXJae!;G^yqd;eJeALXzd!t#lZ=Vr8*wr6#NW>Yu3MIN|Ln=CfcoR({wtco zS)f;>Gv=RKOt-Ney)_0t5jG!M3Lx$3&Zu?hoow9v&-&5FGOq;#4*R}yyFHcct5cbypBdlOJ0`b7rq+xYx8cgRMdbng1a zq8B@|t?%Gh{^4`fadcig`Sjua-3Ldv+`3TPV4z)iG}A$={=)Jr(`AsiH|TTlhl^i! zLP7N>{(iH)aZgUeZmY&;#eo8+_~&WoSBR0Um)v_=ZN3_Bkr7S0nsDFcr*CAEW1l=i zw~IZ^*L0L!JH^iNn)j6}K^L9Qsl9KtSLjwar5(a!okg84y|eKte`rw7XOGJAE2CE0 zKHq`ifG?`vy05O5RV8@FvL%x{dqo8XIWx}#l-qoBjQ=}y!BY2~$HPDKg!{1cpV9eD z!o~g8`_AuhH9S}A6yD*R(|dux<%A<#Y!ldZMdrP^hjz&Y&eK86gO=Vyx&uOE)@)>= z(Su`s#AoeSO<#WOJbt*yazPYfv} zGFnm%|KF7<#nzqr-C2LDBc`h)U-ocqo(5L6RZh47T((KN8h7Xn>Zc$o(fnd3t}WV88CSSo%t!P7`lB>K!iKOA zFV9Ati-z`HT+8leMnhZMNtfmUmyL)dliLOE7}A?gY9)c;PN>!(FPrj*Me!E#zCABwp951o2X$a58}sG=>pspA6h7jkFwEk<*- zQRwZR*)1b_z}gqMiRK&$5o!pFqxz^;IAmN$;xK`Cc^!vnf&@blxefAlMdJ>AtptBQ zL>=;Jy_+QXjRf!_OJ4AUL&MBgij2P=;|BWF#CEszB4p^^8TKbI>9mggI4flfy7vp9 zLm%T1E5#cG$Ti0%lHYrlxIrNFlXaUdC$b7WXpO_w2sfGIc@8L#8QcYGN;E|Hg$(|P zEWL5BlX~u;MCvW2P+dIBaD^!Il6u_^QV0W&EmvPG)mDB;-55hpGFZ%Njr#Za-n}w` zcGD!SDeNBgWul#yx5!Ba?Su`t){E=G-n+DTk85eKozR2&!r)$)0`Q%sxqM$a#Yq&O_q^9-znF3N%hlFz^>519WQ15kB&CsE)D2@QLk*nmF! zi0R%T#KUn|hDFooFlAn22g}SnXgfv_qS~xP+UV|FqKyxh;YVp%nP3v&b|KLVuck&# z3xdM=^vOBK*<;)>A4X1LiYEl9Spt1ZRU zc}7$SSF6|S(^^7~;~;O50f9fXybKAukQNxR@e6;bkC#=So|nfxX0v*5F>>R)u(H9H zk2KaYiXqg?1u@rvOV|Y1ixsWfy8W076&dbTaKHNPAVQDdqUcv(vb-AU_V* zhZZRN*b`&;%oiIE|4h^8R$bVaoG3H!ios^I>1I~o(Ap3)Pm3{tsUIM-$Umkapqx?U zidMeN+J7qo9G9#-p@!;*h$9+U-oaNPRO~cpEeE55D3nV_#H)8>_%r9os9>mgsM@XT zAq6zamvQ@f4IZCFdLLP@{DEHjA`;B-K(4I-C@ygb1r`>I%64J3<|%G7TV-I896^Mx zI7Fa8>p!X~TXV9&gjxFNWYX$~C~#h1mr|<$uc=wJFu{TX`(QF8% z4M8^z(DXjRQp~a;v`fsHsE63=$@+}6$Nxc9^MCEXe59^7kCw`VpIqcokY12$e~s=q znz2cI;afH>lp#Hh6yMt_+!!9Dk~p{#ChH`H!#Z=AzN7MO1E>`qeCaE#;-SAcG(8J( z_PlKr&r(Qe&{o#p&B*CwCJqQM+<<~kvKJ})hXYsj7~jdjQhyn9B&XV>k|y{y(vsZ) zZ@&$Typ}cHleNmM?xghi0sL+np@)Wr?%)e7@yb>NQlJmcg>NWbK|2Y{wqY6>er|U= zXyx(bfFHC3a5NIx&o3W(YME?jtsFS*Gi&K8cACL#5#Cp`@>^!gY~x zDvC$0MOTcFT~^Sg@j9#tV$v{j+*9nA1$0Q(K-U)#A5E#k8>w&joI*3iAd3O*$$7-K zwTUwGKWGUb07XT+LmPkTK4^Z0>0!PMy^~5dvhEsl#JhYr z7b$X&;^Ra4?jOTx2Fvniw7U=#zLV}8s~LH3a7aILg>brC{~in$8LGGGpUei|2+j-a zerU6Xgd;p%`f)#i)Cby`RnE}xvjUKK)u@b_a%*`f>%{~j#*c+{S*k#3jWa7Gum8#j z8N%@2iOtQh1UB?9J778@D6PR6W6|Vo8k#|r*6@E1EzQj^m-J;M@!aEGgw%h6L%KZW zIh+T|KH3*}8Av=kh)~;b(eeYhLY+l4uP-Q=L%NgIKMxN@V+<4f}%oix$yX-pzxs`!ltGHGlH}X0Gy}%4MUZ(aSS9V>h-WTWk!nmr<1B4Q>FGtxP@3El*| zo0%cPnbJ#q+l2RRP;-3IMI~g-S}ubI-H^}JaR$s=g&z=w1fcsSme={4_@5s4X8JdX zI!R--L)DgtuN?c5`x_`-rwNtt(v#cKrkO89^fmB2S6KdapDS+U;6I4R5tsneR|mQ4 zUJSxnMqD|_4=376Z)n!<<`CQX(3={l{xi*1hQ5+howcfs;_qzLWptDw^j!6neF_f6F*EM!Jo-vh`pZ9RrM~YFwAplioO;s5(yw7&bMZHbgo*jHqh1z02yio{U}7x&i4# zt5OxmJU(QBVRY5YYB&mULb6*#Ne*4z098 z{=gwki6Dgw49&MOxpeGVI4~7YJV>Keg1G&RtKVqJY3n*OXcRMOm%bOppZ71o8oY!5 z`A06nbp+97%PiS=Qwttk^{UyYL7BILI7>rsy(n_-^+ex`>j-*-_jQ!+AL?Oo_fdot zyr6m4n{M_U^lt7UyA&mBb6^xRbsHN0C$D#1_>&tDYcM{l&%`!i;;a800i<7 zM3}(Ct|L&R`tU3t@>Nqpvae`Myn|)fbQlB|2p&)pOX*$J;?9zXpO=4@SIfSXMc%|UwNgR3#3*e3?X(Py^`3eKE)CptNjz0TD94BaU}6WjsVg)%&Qx zBvf+c@Mwh9HID`%HJXpl>z`Zf%SfY0t_(#>j}v3ogeqUTIt!Vo*;uw zEnB7c+1-qIpN$2k_27_s9#!=dM0J8GAQT+eN~>yH5;uHD&da9JZE%y5^oP_39LmFS z{ptmhU=Zw|;!t&c?<^wyg#wRR2K-(z_SGjt4>syEIhW^8~P z-fs8Qz`?<9;O=WsVNBBCSs%dku+ae1RqQQtsR6yzR&_BK{DpIS)d;@X0~Fv*FNkAP zG?DF1hqESP@(aP*5h2nFsuFI>&CuW~2yLvKWVm(6!af1`Poc-D8sv}PUw2jHD4S25hD&vbbn z*)XL7wodE=hfA)ISn6Bk0sJyk)$X8YEv?!K4ld9ILTX^aFMpK8swhZN@%ICw&N1i{ z^|YO7Re&W#106;Yq4EJc*Q5`3*g%b9h#eC4lO2$UHPPFTJHGz?7DVW)#%9t86O=*@ zh4IQ@3|%ZL#%UI$7_2iaEn~TBgxj>4Vr1d|h23R_!wqmDp z&~?Ep9Ncf_J;puVas=HUn!Zks;M(V1FxKXN(B}S$NWLAz$r2?>>AmN)col5jk!hF* z+I|-b{UOQ#F}j_!8_8<=6Lb*jh&6{@&SFq#ES zSAgC;#1>iD?KN{%J5w^2aVXDWM4!X2zB0#Jr>1liWXGKN8>P)n@n9LwMsbMI{DE)Q zP>?KxU;==AI?9Xt%69TGhsBYh92`Lad9)3g(ZxZ1+m-uy=z2zLO5D4H%jdi>t64zT6X7$rZTb!4PADO1Bc>;!(v|pxckKFh{bI+Q{-@sL~-| zh$!9AQ;2f~BDI%3QbKp}lV>O6dL@3Sp^3-_&B&{H1mKgw! z3mlxZ?Slx%duaV5a7Z;o2*vVvIufEwa>;=x-!W#(6ACkbo`gtX;EIrGGe9!2R=kx7 z&YlSAM2v_f;}cv&0lYu(ii0aa0>fzD6``=1X8W6L;-lucP1Jp!ad%P9zmsYz8Jv%N z{u7DfA{|zVltS7Y4r>B0@kkU1_a}1@w7NSWt4Kv2v=weom?Bocv`RJwHL#{qR#ipg5FwZ+> zqM0@n4EaO}brYegj)}Ny2h_pper@jTq27Y$d{QrgvHS~6QidrufOKgV6jnD)ZT?85 zHm1?BqDKPgr(yBHB8a>WQ*u{GBWSJf)gxk9fS+}Pcaau=>!gh=ux!~7Gim-cj}(FN zEkz$z7S@^+9yrw~M2bJh16NMtGC9O}UEFtV<<|zWN0t3C+_a513UKg6s?ZM--Zo`8 zLsg5eZa%0}rQ8z^kcNom1funmaA=5$6>$7?BuxDQXA(V959c&Tmy>3xd2{i8tO@PO z+whW1auHL`2MwHLXt0q>B7!YRHJ3=3rHA;h)ch=(QgsYm4hj}Y6v6NpUfSUBE7qAQWl8LI<*hhiq5bAW8O$+jaW18%+j@DRUQcq2AgXBo) z9fbNPIW&D9t=hB`I&oJ>*Oa<;B=GS6_t(L*9=MkhiZf$9d*s2@i9Ml38)2YTqE{(+ z>))%?gt)-Z#hvX<&X!667e328+m-1Z6{V)Xwf6XOgYSYu8L`vtFD-C>myqyyYBO;x z#PswbO7MFB(><|A#rOyzVi}P*PIj(S39qpX5CnAGRM%~b4lW*Od)Dh{n5Yc?c9fZz zeCAZ^K8Wmy5VXplITDL*KUxxBk3qzhic4&ByEh31O0hSw#Vhrff$a#)in{(vHw37=LP}7tJRAFCUf_Hz4UQ>mIzfFJcgo3HVZSC;7n7pRJ z#@XW^#m~`-cMcPr)|Ow@^kBoQ35SDt@5^fD#y|Hdbvd}|yl(risPA%M?;maaTw{Af`RtG-`;iZY z_s=S7&pdvrG&X5IccGfV-$)LA8L&NQt!?X&XNOHoS&gyU*7d$7ikfkgtBt}~c(2`W zWx`U}Y~S^rc}ndfzXl>ko1`0(PKxY6#K!Egk7%dwjM>W4%SCljmh}nOyoh0LZ+xFx zg_YJkzZLm2oEwe1BIzia zRVch5{}gxi`k}nIE4*E5=dbo1{vcr-GHH86r-9; zSmsP`#4uf50vr;J>)TN^@2vBBLK&~^Au9V^U+WQ6Yh(|)d1p$WsLiIBi`@Uc(J*Z& z`924=`eN4sJ*oV{8+JdR$(rDv_SRjxT;-Ye;Fq$+KJQH?yd%k{kiSG8_P4ICuX3sj z^mXJ`zR%PMkmhH5>=sP@GS9R~o%~VPCjY_V-LKb|KZHG9@7|_)1w|{0e7d4;;oUFm zVD?#Z#gg!F|7(5Y>TEmqv%beu@_vi$&i^J@i?S=OtXE;~RZ;0mmDbwJI8H}%5B6%- z<5(}^Bv$KwetVf_e7P#JkbQk{n`dNFnzfzz%e^{#+=e(m(q8RH9=F>#=lCq zgn3EZJLyYt-RBR9X@nRfQav~G$`9Z+_Zm)??~dB@XmZo&`}Xk`_3(cSp4sUaAiWzU zxLWahqjkN96NVj%w!4+Eqss50##vXJ9dF-clw~K(p}fuIC36oMw@?a`9v4Oy+8!@c ze<9g^Jrp0}{7-vnS9X5X8c}#JejvSZ^62?3g`%%WTiiw8`85SZV*@z4;fW`1*c)Pp zMkYGWtxx&z&|}Ia$0Tl@h(pYCSckl^`N`^0M4h)+5c@&9M-N&Rml`DN9=Bi4G%Zj$ zFZW(DTW;Sri^E1oK1P~_S$%#om7-a*pHd92JYUs)G~Sxy)PVK%I`bVOljV_acL=M;*Vf& z#b?!yOUG6Z`}=n%eAS4K#ea~wy!)Z`v*#~jte;TSYnLgT+)$pfjyhUFMp-V=?@oF_muYx)L-U&pu*1bIJpVf+0$L7R0PF`+j`qb}u zi@!wJ`R}{_%UGY?y|uhY;PLw8T2S)JqV?=uua9ld?1B~AxAeV@={8b*D2Ds}AUrPo zBVbFKNJ7XtDKTVCrLdnO8@?^ojHV6d8yH`nBTrd8Qu(mu?dFJ)nqyZptj{eze;hIW zXDoHC6`K#cT(An*HkkkPd)%8oC&OZb_w1uL@<+E$8Ji@|NeW(Fy`I%^5tLUTH0|qM zw(dTj{_Xj_;gcoVxDD^K1beUH`+C(=BS$y55eHVk zCjR_jruq3mWVAzXnDw`|(XN9Z2y7Zd-QSf)^Yu(D0?;ZI*JrxHZC6aEF zn-8pdc5nm}<=-=MNAQ&nm2+j>lin`M9$z)zKAWlD{ZmLu3Z!A&1WbkY$_M^V! z=kC`{QXR*m6Ln??hu7K~{hJSztbboP&nw^987Z|IK(<|c72Mavj=EIz4zB#Hd2Eks zweF*cP*IjFNrzD7_r31&9nT#n(ihz(pDMxG>e0FS{RN8Mpl$EYyo;1i0b8C^+9(|&_>hZ+5%hAvr@-WjFpkx9;r_-BLwAe5 z#3_}BLmtr%Yf8a_1Wxuw(NTw6hC7-sdl@UmMNAt8u$l&mTEK+R2#d3490+Nun<04s zCq%>JGCh?4^ryX!^)}zi!b$AW+JoA3y1}ysyOr|nHcd-fL?|S$wTo|1sgAZU1AzB! zV9MS=?oW+XX8w79N�`FiQ{2qmq9*D<%7HN)>xw#(_7lFiq~mfqu&@lL(zjb9ik` zn9F7gLm=^B?3z&kxlCXj3RSiSyEbmtV-!Hs@^G3lk0lg0T_7dy!t6L)4R)|N+P?J2 zO`}6hH4Y=h9o^VP!CjvtR^qkl*E}Pjht(U2<4B$Rf*!nb)JZE>NTZfO_hy_E3?w2_yMp+I;{u1B5DtQg`M+zn;ucKkuELrpm+I2Qy6cFlp*v zI>tQ!XRgwc%V>FFX@CzmN?dD*naDFS>8IZ0+D2=~tU`K;uOQ4#==Ge|lsw-IE9>G< zU+jkTEA?2Hvmt-{Ea{S{-zU&RlZzZ@!uk1T6A0B7l6m?Ndh)U#k-d|F<8dgP)hK7Uzhiyds)5>X;(;DTkEV4C)#9GI%$1t!^EG{k5dov*^rRp^-P5|3Zq_ zN85=vVvH>PLUh7QI4%pj-cpW~7I`4K1&;TI{-RNQ9f{q7<;Q3oqVfW!Rc39U4+{o& z%;7?n1OG0uilU&Gm;^%~dczPc7b7Qr4==Hx$eQvZDsGs}vgV=SZy;q+#d|K14~A;9~o+95!(Q)CwFzNaWBi{Z*an(YI(OkKTaz9pqMD zAp*x{v=X?K!@62uIK+kd6OTG*q#$TwktrN)$?ryBT*Mw#B5_7xD_O`uYbnJyIy`fw z!=e5_U?9%EX6vDcz$j+v4-8!Pqttn^L~MYoke)UkID|K4&PSIt3Xqd^Gk_lb=mhp4 z>^(L^m#|hw(IC$)z9ctr6#4t5P)bRDbcX0TW-oQ>ijI7p7fO6u=?H{pfb_o|X*yaH z^N1LbGK`>Oc{iS)(XXE)k!-2hr4~9E=ST{u221(py1Yq?6iO{^q=s~mhKgC81FFY} zax5xm9#~ashxIhwp(P!0o6At`R2Y=393=NUk7ft5(vW)TLakaa#@`K}#C&j5n?N`| zUQp{t-|fVz4l3BPjtusOo;eCpE9k%~aNkk8*RaNU9;3zP?UN}_u1OCr~a;R-TzGq~3m7fCR!0(Y#fp2sI_fwUKitS-_75?4mK z;q6wSs4Vq-$Ook<^1VaVokI-V@QK+^N7zmvJv*U5xfVRv8GgBfwvb#Kq7}V>ZnY5e z2NB~G^4(MD%V(RtO93(cFwqvRnF$q2mG};?z<0-6k?=L-Kj`14_SZR3J zZJIuGF|i8(vS}9+g@Pgdy7Bz1KOpXfZfO82W`W7chbVt&LNytaNw8IxOHIfpb0CN!Hj7&uP0_D*%X${?a zhnPN2&66?ytlUhCo=!r*+YN0)Lm|gH+Rt=Q$&0%o7MG0A+=&k5aTz;`gvnnuCe?jf z-IqU$6jdPSURSGqfwb&k=UM!us<7V;@_ohln5aQN;T7XUAgb!lI?M(^#2{!FUnnt# z4txkzJTt-YViZLebgZ=GHUOR-4&7fs-_v^b1xrm^$co$(DXXRCgZe6S&&wxf1%Xoh zP_i9hBPsM?E^Usn8UYSWvy@E`s~nce7qzc>AW5;CnXw%yzqa+Vu2nr~G_H^9BI*A? zJ~*BFZJO0d`?mFBDhdaO|5EKlD@p%PiPqxJ)c?589QJnW92G@u_Nhqsb(f88U3Ej{ zqmnY^6J692Ho|r~DW#%MM83&NMdec}B_%tPP>J-T#8gXi@; z&+BbX^hTaK#^}*dtDLc`+#uvQaPCRb{hdNhiPSd0^?1@l)5BAH48M?$^02E=B zG;5{?df}#=M)%vQ|G4a9klU5T?l=0U91?eY#fj1=NcnLt6l|}#iCkzh7-{Q)a!O*{ z0Y^H2=4T}OxLGkZfBalR88S z6*2!TSQ*XDbl;zgQ~bCV%){w^q`v(wTEfqiAM@zJj;v%nsKh-tr`fjo13t#=XVhh| z)!z+IJw-Du5P$X_d9LMInM*(Hq;M!=-T7Pb?|OF2rOp`9J|fX=tE= z#R!K}9b=5O;n$wZ{h#1XRsKr4D`Po*CMM3zf!pZT{w!rW(f-1-a3Z9x60ZE9D7#kXo2D zfNJF|cRzaD1+nMn();&ux2z54ryj}l;3uVSGx=DjstzaL5f`gzZ3)Edk23-NH-$Md zD$ic4)_uO^1oY}Ys4W`$fma7@n`c?cQY_b$Ut$?MH&Pai>d8Z+ML_R;Rl#rJwYB)P8+k zH+KZ327@|k(nDDITeauJu10x+{+A9}*Dk*C44%3;zQ{x*EpprkXjYUwgt|*Dv9yj3 z2V-RBj@x%=#$wV$QocN50@_CCapWyE1s2ujB0GKMRTdz}ZsA ztG0nsg=8FU&2Pl50_c<~4!Sg2+I*uey`W}icvt~4`q{2OC7guywC|gl>dU3km=iwc>_y;$(koyl7;E$RP zQ|zC?m=w**E^Fsu67|SY{n&u-WN+Ga zJ^AX^ArJE?Q6!nkQv3wh!x#LLthe>@N^)=z^LGHrPrs5r8Oy=tw{!)g%;>+C-DlDk zAeLy6FwFn{r1qUk+em@`&PAt!khC}V{ssPSqYK8`A!a!D(at=-ZmGT0ZU_=x(;|kyC0DGJF#M7R zeb$fH$|q^=0qrB)Q=2KX5zvwwRjPvl8z7^`S__J>}DTSs!Lh( zX~L=FEaR)PggiJ9vVI0%`wYIbslPS;K>3ytREIq>T2ubcF6YS8ZzRhXiEe~)-o2HJ zVJHVqG{_icy`x3Dsa;Q$nrC+1K^*7*t(X0%8pS!+{xf<75e+!5#4Dj9A#ut>xFPcc zdzX5B6J_D>$&7XOp{;KGfpPp;KJ1B^iO8*^W7iMPhPuAs6MLL@R+Z+Ltf;}VD3Y`^ zAN773n__Bl$Y+sp(Yr3GfNuJgOSuDtH5~?Ap+$oqS>UkRp!p+L#T3C;#LUI*&7#AAc!YB|ANL%ee269*r=W@wFcE6{YOIjiFl@O{<8aB+}SrOBSivg!#bR`sFq~WU8w=8@3;@L^;KJw{UWc z*Gw!L*(Ek3SRWwO0uHWnAom4M}6f0yYYji)FB6Uu!hj4w3KSYU=-jd^huy z_RuqA&8av=8SdY6I6IHz(dK>Od9_$X+W$!l^tk!#->$ERsr}}EYPLi}7d%|zbvnE~ zRkDgh%XPN)&iaZ=qRdE#i*VCMFT>)N2%@&O%zc&CL1pp)hgRkVUu5%lf#u(feAvzw zc3yXIUqT!OAOL3#e8Y%9jJbxE15559)Vb#+buf=hgRnUP;0ryko~C`^|Kv3sNlHIq z{$s+wM;4DcwkCh>C+YfOA3L--K(_k~po{+Y+|&M-#cf8D)px7aAF?G23^w(>hAU?) zY0<3e-1{&WU0UGKChhD|)qE-)wn<-eEN!M=Ge7&>oo(PjpHbry$#Rc)Bza6_#7Qhnaf)e4LsL`VE%ZLhJ-&C9rTfPv>o1;&_=Y|0$Xm;CK97U^U0)snwrVxfavv`o zlFZ6>+f;`g@V97h6Tj^0jF8MvuKYr2@_V97%t%<$dA-_n3%IA_&HQV}r@>`A?jCjV zNDN~<8(sfPV(9xR`dV@4@k<^fOVgjXJAI`LTiz_fI|qSu;>D}<7mJ=gz}GJQA2;(( z_+OnH=Rl3)>Cn}}+~txL2Vqu9fVLz{p#3Xz&izBA?`p-%f*{dF^%T3Q{m|H(b*Hr| zeTNBc!s=nMrtxb;Lc?sM8_@Ot@YKyJv}}5^!%d%0*}?ghiEXiIYZw1GzxfP~-{g-$Np--N! zsNl@AbV;B1Chp+-&azdOWfx6eZBN~Q@VxmEGi`lyUg?#Xt9A@!^{| z$QWt5yMA$1^@C-O??=Gw(T@wyg(PHC3zxaCJ-p8_PS9@sr`xP0i|m@DlXj$vqHf&2 zyXbtV%D3#pMxXr?*Rp(7JF1?fV5oB23B&f<={co_+y|fUtcs@WomF@w!BMBH>wd~T zbBQ`37vq@@9E>tJ^P}wOXg_OW$IFflq15L_mzK4g#82<9FS)QYec|D<5~G=`&V(kv z>K8t;eW!kI>)%{lnRvR}%#`HrGr0VRtE16U z0H{1WCU_nCQ+#7H-shDf?(MtnI_wHrIj{AzpY@r_rM_7<5^0=PU~gF(`>d*? zrQ_h5!jALny#H+KbpP|}?eLl{f4vJ?w_wwoQ`7^qr%zTG&YYM-z7OwD4()#`kUL$Z ze)}?A6+gS9HY@a*!Ae_3$C;O?^h6ZsZi0w)V|YC>>Zddy@=LRPZ-|KH1F-ce$pd878)$H(g@Z$`ui&c>}7 zqPu_Nq&<#Q&&ULF$&F;-+OALhH(`LxJedc!z~h{6E_q)fK#a+#?yVg&enWt#3vo)! zi8f(aS0o4p2Y;WtGeA;b;-7069aQUW0x+s~2?M_qbpb_i#Yz6RNK$E&+a&Lww)vP^ z>OR!`O$4o(q>+8+wN_8Q2*RhhCH%AmTnke6foP$+0XnpzAuo{+NqTr1!qo~xC=h8VsBmbuyw4$-^AM<~@XVDtYZ zs|#@FWO0-7$kaAF^=}n7@fT*Fk2}8S%zX#*_198<$xjLZ^aQ%{e)2TM#Tf9xwyhUAlY*I+$x;mc~CXHKMAHTTKsyS}LV2O&g(%d2w6 z$m)NIg7s*(4$*$a@-{~?;V(FmwQLFWz6<-!@>(ozeF?|j=ZPy_l7{T>S{0i0PHL2U z{^o;k+{DvhKB;?phXx(+f6+@MO(vG-;o0^{jTB5F9cramMQ{UqxxijiQ;v`C*AF1E z{W~gX(hPZq3H`-Qy|Mcv6q<^j{v#i%=_9=RIMFI@`BH%$TOHRNB=o{(I}w|h6##q1 zKdPkJ4QYeu(d)Y4xC)k}6*4=~%2NWg{Rve6L%wPB(X0qTtu}IZAOC+lND?ROac(OR zpX;(U{sc1c;#x^_AR20n54j!y!pe(%Py*ZOVz5x_b|ub z+)b0QGb9=ctidxHu=V4dTeX$8O64wKzg51Y5o_^o-uV{h(%L#MfDMzzv0jFgoi)Ky zTQSKn8B&S41=1~p!rCyyEvTpv?R7v6?BL8_g>4Ju-_ zNUk(SHF*XGT}Y@8zoiMkT?iKjSah@MiZId9(O54tbGB0yTRB~+o9TU!f2I*T^9N&H zDI7G6Gi0#!gwinj3kTiy`o#dtW+~*a>GsfuLDF+e4E5CBugmIIAKV_a&Dt>ds=`tu zz5sNe+c7nyxQFrPkArdJ=tyWYvrgW}OB_KWRwmU(2yTw3?)3AsKXnuy zp%r!Mzxl5cnLih!X}^S0iz%8&zNiIcK{F-pjTo~-THb(phY?aC_lVZ^ zjjM7i_4?zFNNcQN1Euc(G#!;x<9iNThDMT;_3)uyZj$+$7UaMSeQ*lE^Tmk~7KTQ> z({u4@rUy8X(4v64F{PWaPUm@y&A*3lIw^_C$1lxekgS~jNU$8v3DmV;W=R_-*qKE^ zr$uUi2+-dgdR z9%Qj6KlL@t9a?YNDXjLQKphYkhx zvY4SabqpDpW;mYsk>=&icP+$a6$EV{T)j}Qb7VPte6_bY>6I);W?EwQ-SBRyz6H24 zqb(pIcN>S?F~oo3A|YKQtBsll-C|zhbsnSQi@^0?^E??W(!FbOpRavzsXr z3+}Uaq`g(c$Q!ftrRB^Om*K$822hTiDY9^HkT0lX^vmIqW1Mzg|2~OXKmSe&ctYA~ z)_%m{&%F#`y(H6?&c1A}{YJTv#7S3ivyJw~f>v7Ge7fPLmcNEiIHH3EVyKZ9`_unx zFOfIiSwoA@f@eHL-9FGNaw*{t5AaVk%frkrn2Ct}6Vu#WD>POUmUFC^@nEpF6S-ib!FtvWk=@Asc6`%q zG-{Vy9dAIAeG}*xxwCs1#dWcq`*>!!8k-RPI^3(XB(zU{cV+@Aa?(IFC34GZS~^H@ z*R6~JFYZx|4g*MHc)s%|7W$pVxNB~Ai*ENZ(6!hHQZwV&G3&SOka z>gzC#Y_|%!I-%jNN^13;L0=c4Fw0*ky>g4Y=Y#m33-dE1bD%q`8Hx$lQ-y*V?D+EY zV2&PfGo@VqAumHKi$%-=-LGwOWB2Vs$X@^4+Ma(;l+>lmypI&SYR+LP(;wZPl!0>| z0MmOV@*lw_kKg#4l>Z`Zv`UxYW%IbYMtLC8AYj$CXrJwEG$(H-n7CKZ|8+ULffIED-8FKD7+mUJp*-zbvP(LAG^)1n_kEl-TW(dbm&Bz6f|prY`F(j{z( zYJ@>4$1|5OfBzy(jJ+#drT4+nPJfxmf{i`D04~g;+ikkZX-8fdMa?RaSfrj?gdY*37AW)sF(7$sMMCE2 z=2$SYR6F?@95sSze<76`%6}@kc1-*dZeEzzQ3@CCC425W*SSB#$84aFEDQSqsY4NQ zrU7%a#;&=bN2eQ-uW;5<#TlWr$IZ(-LIP>0hKkfK+8;&uK#;&c1VrfOlf0Pk`tvO7 zOuf}>_=}xU{6;i7TTiqfl!!Ha&sqrudgnlq)q(mA9K5*-abousUK#8qrwa_^rwq{k z0;KfsvnsuK!=g+&MAl=+rm5Hd1N47`NIekNJbTQoA+>T@qx^u5@cd($oyMESIE|^k zV0+vlK>&?^VpKW*J7wJ{Qqe8Z&5)l0gFYg4z#!wUg?K*8D;BeVhcl*ol{911sfN>r z7%8~>1Ni$$$6xfCn>5QeLIw8kti27CWS*oPHyrM3rzvj1p1nPgP-<8JJC&QJHB(-3 z>>;+|b+6>lCyzcH2R$zIXdm&J1fU!eyGD9R*ZH?o5=-^V(+}m9nG_`f!AbqZ3qr=5 zVw`7hJYPk`EQ0p@7nrE~R5Um>&Z~u@Feg1&P>tyl;z&=N-(00V^!bauns`fS*bJ3! zHy70@Xl#`@xQD+rTW|30ttABcWVsKX8e$dV3sKQo2Q+L1**pyE?V_aG^|b@MDtvz= zkzl3x(M;JojSv*ScMvkyh)LVs2cp5%9(e2;lkf3~0*AA?D{!7s1UJCklE>QliMK4C z20g$Q6~o_iWb?j8Kn(q3p_go8&SRSN^%y4#Kp`#acreWT#V%8lDY)S(@!;vwd+u2~{hYzU7wV!PW^#1@G8lHP_r zR%Iau+XyFAvy{@9MR%%8cWgvw>B(wZrb6iDuANawWByMj>z6LNC_`gI90DM(X89wX zs{(;1tbAs3x}Vmd97Sex?xO?h)GjetOz0&I*bM2!J_x>c6zL+=9B&xlWy&n<_F9 z1GP@nh{KVL^+JK2rn&cd)@Y2mb6#Dw-CNzBZ*NFSGAuV*?E5s z_?ys49qYv>;2R|?aS@zb<#Iqhv5{iCtPU5d4_udweT3&|5sh{t@xVp13x$ShTgO3S;m=-zXz8sqg}k4^mGSWK*L-U-Zpcw%rMqbVan#%O9yy zvU4oZwp-}pf83~?4um1Jj}j)`vywhXPsvd2(!=KW6^Fm_m_@kwQ}fx%5s4=_H(}2b zqI0G3l+ee2(+wA*+U2OE9M*>c9vGJn(00y7OH>SgJ9$-0tMOzxasOHM$3J+XC25JK zpJ+b6^#qmHDEHq?K^x_6F2rL=goThSI?A_FLp!Lxu^@jLJiZqkhHguDfIp0^lUdS? zlTx9Gx!P7Tgh&Dod(a1 zAXiCzRq5i z&ZFUK)>-kOYN48JGVfkjjThy&(jg05<8yAt`KCd{PkgTz8sRHqdKg?#A$~=Y!vR1q zBC|#i(=!mk0PjNvKa?DO!>W6{z@irMUd4(ilj{gTxO9KQH0000805X2zT3%)?f^$Lu z0G2}l00{s905C6OFETGOFEC7ac{Ei2|Nk8q7vaiMQ<Yk%2ARq*AUb#(D5=TZeo2nMnmUA1 zC$IEUi{?wEt)s9OT@5jSdvMW9#33oHR0I!XmT=!ZmU8HHuRvVsbI49!J~9dCTs+YdjMMqaD)RDiBtTG!%L%1%o|n+^{WMx}RS0in5$|!G6F32x zO@NFpqJ>em>_AQ&@LQmmSAYn|1Gb;U)jr4ZpV9gGW^F|D zf%rQlOPwFcZXs)Z4_wKEw#dH4@l@u3dE_*m7E9y};M{FLL;q5xsvqcT;{Bl<%WWDe z=;*2F+e`f45>70OXv`*7*$HWngy4dCFku%%ZCb=>9fp;<9=E|w6*#X&xT6I+C`9fC z6WVTb|Gg)Ag)9M>_b|0U$Tx*0el$*}2)|x}x6B&>7wCdnQqNyr7yjZBEf+4mOlNnQ19a&O5j_u%2jVf{%PF?3v`55lNG8*;lWw13Ij^pMp{eyZ$G#ff_9--hyk$oOG&iP5Mx|-!QunHYLM5Hw_ zW1)vjY}*MDcyt8W(+r8FKsUI50kj)Og>g9Kg+(D}>Po(dd?pgh9)4d$`Dw1!5=eH3 zj`x2f96$_dmup&;3e??-yhNC4w7j$kOs%wDiZ_&MKxxlRnWb&yi7Z)#@u0g^>f z15Uhp4%ojihYT&i1z~2)YEl$?juU`mN@&$Wa*dQ$f*U)BQyz!iKf%|eU>=9&lZs0J79`rrkwZ3t1}gPCUetwiP^+%?Xs+1>UI zQV(U2lRwGJ|0gZfM%#aq;4DS>Qw+5UbM|U2`8_k-qhpj7|Cl{f_&&II7jAw5E66oV z;NXm7&0HC5l>nRqsY^s|!8s@36i#BqG8gip@I@jm(-Yny#aDBfH;vlrMBLeNWH41m z0$v+I0^6ZIlU!SsOSaw6Q7L~4zBGiK5+Z~|9C-#Z>Thl#U-R0_w>>N2Z|*?Umsph~ znme7!9maam3GpD3+5?r%LaD)O336cZB&vxd*!M_l=n0V!lMfa3->QK4Bgi^~9~SPo zS}9~Sj@nlil~9f}vR zf8i`0n`q2TIG=-ay=aTG-^^j|nFCZOke+F70ExC39_lsEh_T0M8&<&)=|lwrMwu`H zDo#Pq6V2z{;RF(A1R2nyv!}4GJxrq!#PUx_K868=kQkgVL!iVQZ_Fabl)<_ZL}CiZ zT?*x8(0L*pZw`OkJnF$9OQKD741hnh&N8>6K&A<)Ef+on$&XKR*NIta{BL} z;U_)j99A~oPQrvG{2aI>N{G7R?_Ez)SOBp-P)#emVFBrw0=uwD%9ggF`P&FU(|h;= zjq_E?an!p#kLm`OBGv-iN#ry*=Is;d8W7C|p7g z#6<;vgs=U&ZPr!{u90#u3c`v#GvkzwY;$`z9QpbTYFI_Bur;s4OphT5g7%wGGl@VG zCtj2+TPkH2z+LA==YsINRW) z>0epbjO-3~23D%c%7T@6<>|4c5#y|^totLz_x~=3%m_SgG-rH&!8J&`c^3*P%?Tr( zc)vzn>A10ivzy-22Jn#*8UL^eVl46%g2_R}Z(;Wzs0=vkCw#w~LHJg-h<6wRmq*_< znuOi!04qx}Kw~kd9KJ*iW{b!bEY=cSum}Smme~Fci2F2hj}%2`PO6l4gNuk%#F-}2 z(3OB?D0$=hVEkYohgrivivw(&cqJpCmBr!`a~!oK0(W#ll#kAo@1bfJ`zak9{0SCU zuam^gHjmmvGM;p&d�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νV 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 Date: Tue, 1 Jul 2025 16:02:31 -0400 Subject: [PATCH 084/157] tests: add heavy tests data from dandi --- tests/conftest.py | 31 +++++++++++++++++++++++++++++ tests/test_oct.py | 50 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 tests/conftest.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..7a638114 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,31 @@ +import hashlib +import subprocess +from pathlib import Path +import pytest + +DOWNLOAD_CMD = ["dandi", + "download", + "https://lincbrain.org/dandiset/000051/draft", + "-i", + "linc", + "-e", + "refresh", + "--preserve-tree" + ] + +@pytest.fixture(scope="session") +def test_data_heavy_dir(request): + + data_dir = Path(__file__).parent / "data" + if not any(data_dir.iterdir()): + subprocess.check_call(DOWNLOAD_CMD) + yield data_dir / "000051" / "sourcedata" + if request.node.get_closest_marker("golden"): + print("updating dandi archive") + # if request.config.getoption("--upload-data"): + # # subprocess.check_call() + # pass + +@pytest.mark.heavy +def test_heavy(test_data_heavy_dir): + assert True \ No newline at end of file diff --git a/tests/test_oct.py b/tests/test_oct.py index 89066a53..b9f2d72e 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -49,7 +49,6 @@ def multi_slice_mats(tmp_path): (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) - def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr): output = tmp_path / "single_volume.nii.zarr" @@ -147,12 +146,45 @@ def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expe base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) +@ pytest.mark.heavy +@ pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "zarr2.nii.zarr.zip"), + (3, "zarr3.nii.zarr.zip"), + ], +) +def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr): + files = glob.glob(test_data_heavy_dir / "sub-test_oct_multi_slice" / "*.mat") + files.sort() + output_zarr = tmp_path / "output.zarr" + multi_slice.convert( + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True + ) + assert_zarr_equal( + str(output_zarr), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output_zarr)) + +@ pytest.mark.golden +@ pytest.mark.heavy +@ pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "zarr2.nii.zarr.zip"), + (3, "zarr3.nii.zarr.zip"), + ], +) +def test_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr): + multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" + files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) + files.sort() + output_zarr = tmp_path / "output.zarr" + multi_slice.convert( + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = zarr_version, overwrite=True + ) + base = Path(multi_slice_heavy_data_dir / expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output_zarr)) -# def test_oct(tmp_path): -# files = glob.glob("data/test_oct/*") -# files.sort() -# output_zarr = tmp_path / "output.zarr" -# multi_slice.convert( -# files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True -# ) -# assert _cmp_zarr_archives(str(output_zarr), "data/oct.zarr") From 14c06e0929729a037d35e8c762514125b1452603 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Jul 2025 13:18:02 -0400 Subject: [PATCH 085/157] tests: cleanup --- tests/test_oct.py | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index b9f2d72e..52f15f81 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -1,14 +1,11 @@ import glob import shutil -import tempfile -from os import PathLike from pathlib import Path -from typing import Union +import pytest import skimage import zarr.storage from scipy.io import savemat -import pytest from linc_convert.modalities.psoct import single_volume, multi_slice from utils.compare_file import assert_zarr_equal @@ -24,6 +21,7 @@ def single_volume_mat(tmp_path): savemat(str(path), {"volume": volume}) return path + @pytest.fixture def multi_slice_mats(tmp_path): """ @@ -41,8 +39,7 @@ def multi_slice_mats(tmp_path): return sorted(files) -@ pytest.mark.oct -@ pytest.mark.parametrize( +@pytest.mark.parametrize( "zarr_version, expected_zarr", [ (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), @@ -68,15 +65,13 @@ def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr) ) -@ pytest.mark.oct -@ pytest.mark.parametrize( +@pytest.mark.parametrize( "zarr_version, expected_zarr", [ (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), ], ) - def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): output = tmp_path / "multi_slice.nii.zarr" @@ -95,6 +90,7 @@ def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): zarr.storage.ZipStore(expected_zarr, mode="r"), ) + @pytest.mark.golden @pytest.mark.parametrize( "zarr_version, expected_zarr", @@ -103,7 +99,8 @@ def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, expected_zarr): +def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, + expected_zarr): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. """ @@ -129,7 +126,8 @@ def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, e (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), ], ) -def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expected_zarr): +def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, + expected_zarr): """ Rebuild multi-slice golden archives. Only run with --regenerate-golden. """ @@ -146,8 +144,9 @@ def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, expe base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) -@ pytest.mark.heavy -@ pytest.mark.parametrize( + +@pytest.mark.heavy +@pytest.mark.parametrize( "zarr_version, expected_zarr", [ (2, "zarr2.nii.zarr.zip"), @@ -159,7 +158,7 @@ def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = 2, overwrite=True + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True ) assert_zarr_equal( str(output_zarr), @@ -168,23 +167,25 @@ def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) -@ pytest.mark.golden -@ pytest.mark.heavy -@ pytest.mark.parametrize( + +@pytest.mark.golden +@pytest.mark.heavy +@pytest.mark.parametrize( "zarr_version, expected_zarr", [ (2, "zarr2.nii.zarr.zip"), (3, "zarr3.nii.zarr.zip"), ], ) -def test_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr): +def test_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, zarr_version, + expected_zarr): multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version = zarr_version, overwrite=True + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, + overwrite=True ) base = Path(multi_slice_heavy_data_dir / expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) - From ec871b0a02cfc0de95e11e73a3ffcd01e210f5e0 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 3 Jul 2025 14:05:04 -0400 Subject: [PATCH 086/157] wip: refresh df modality --- linc_convert/modalities/df/multi_slice.py | 39 +++++------------------ tests/test_df.py | 2 +- 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index c9ca8c44..7d766e4d 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -23,6 +23,7 @@ from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv, floordiv from linc_convert.utils.orientation import center_affine, orientation_to_affine +from linc_convert.utils.zarr import from_config from linc_convert.utils.zarr.zarr_config import ZarrConfig from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor @@ -40,7 +41,6 @@ def convert( inp: list[str], *, - out: str, zarr_config: ZarrConfig = None, max_load: int = 16384, orientation: str = "coronal", @@ -83,8 +83,6 @@ def convert( ---------- inp Path to the input slices - out - Path to the output Zarr directory [.ome.zarr] max_load Maximum input chunk size orientation @@ -95,23 +93,9 @@ def convert( Slice thickness """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk[0] - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii + zarr_config.set_default_name(os.path.splitext(inp[0])[0]) - # Default output path - if not out: - out = os.path.splitext(inp[0])[0] - out += ".nii.zarr" if nii else ".ome.zarr" - nii = nii or out.endswith(".nii.zarr") - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) + omz = from_config(zarr_config) nblevel, has_channel, dtype_jp2 = float("inf"), float("inf"), "" @@ -130,24 +114,16 @@ def convert( if has_channel: new_size += (3,) print(len(inp), new_size, nblevel, has_channel) - - # Prepare chunking options - opt = { - "chunks": list(new_size[2:]) + [1] + [chunk, chunk], - "dimension_separator": r"/", - "order": "F", - "dtype": dtype_jp2, - "fill_value": 0, - "compressor": make_compressor(compressor, **compressor_opt), - } - print(opt) + chunks = list(new_size[2:]) + [1] + list(zarr_config.chunk[-2:]) + zarr_config.update(chunk = tuple(chunks)) print(new_size) # Write each level for level in range(nblevel): shape = [ceildiv(s, 2 ** level) for s in new_size[:2]] shape = [new_size[2]] + [len(inp)] + shape - omz.create_dataset(f"{level}", shape=shape, **opt) + # omz.create_dataset(f"{level}", shape=shape, **opt) + omz.create_array(str(level), shape, dtype=dtype_jp2, zarr_config=zarr_config) array = omz[f"{level}"] # Write each slice @@ -289,6 +265,7 @@ def convert( } omz.create_dataset("nifti", data=header, shape=shape, **opt) + out = zarr_config.out # Write sidecar .json file json_name = os.path.splitext(out)[0] json_name += ".json" diff --git a/tests/test_df.py b/tests/test_df.py index 7f7db694..e417e103 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -18,7 +18,7 @@ def _write_test_data(directory: str) -> None: data=image, ) -@pytest.mark.skip(reason="🚧 refactor in progress") + def test_df(tmp_path): # _write_test_data(tmp_path) with zipfile.ZipFile("data/df_input.zip", "r") as z: From 9e3a223dd819238bf20908bc9892bda77e1e87b9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 8 Jul 2025 14:41:14 -0400 Subject: [PATCH 087/157] feat: add optional argument to skip compare nii header for fast debugging --- tests/utils/compare_file.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index 1c35725c..fb295780 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -95,7 +95,8 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: def assert_zarr_equal( store1: Union[str, zarr.storage.StoreLike], - store2: Union[str, zarr.storage.StoreLike]) -> None: + store2: Union[str, zarr.storage.StoreLike], + ignore_nii: bool = False) -> None: """ Assert that two Zarr groups—opened from either a path or a store—have identical contents. @@ -123,6 +124,8 @@ def assert_zarr_equal( keys = set(zarr1.keys()).intersection(set(zarr2.keys())) for key in keys: + if ignore_nii and key == 'nifti': + continue obj1 = zarr1[key] obj2 = zarr2[key] if dict(obj1.attrs) != dict(obj2.attrs): From 237bdf2f7b205a5fce0349e0307a0df86fc9e67f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Jul 2025 10:29:10 -0400 Subject: [PATCH 088/157] tests: add pytests config --- tests/pytest.ini | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tests/pytest.ini diff --git a/tests/pytest.ini b/tests/pytest.ini new file mode 100644 index 00000000..fa502818 --- /dev/null +++ b/tests/pytest.ini @@ -0,0 +1,6 @@ +[pytest] +markers = + heavy: marks tests as slow or data-intensive + golden: regenerate golden Zarr archives +addopts = -m "not heavy and not golden" + From 3e3e60897fabde2ab4f17d09641682d3e4144c56 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Jul 2025 10:29:54 -0400 Subject: [PATCH 089/157] docs --- linc_convert/modalities/df/single_slice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 423edc82..61e89b9c 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -42,7 +42,7 @@ def convert( **kwargs ) -> None: """ - Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. + Convert a JPEG2000 file generated by MBF-Neurolucida into a Zarr pyramid. It does not recompute the image pyramid but instead reuse the JPEG2000 levels (obtained by wavelet transform). From 9bb8245e09519cd3ff8166a19377f8c195689d27 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Jul 2025 10:35:47 -0400 Subject: [PATCH 090/157] tests: refresh regression test for df pipelines --- tests/test_df.py | 135 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 16 deletions(-) diff --git a/tests/test_df.py b/tests/test_df.py index e417e103..8a4d2dfb 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -1,30 +1,133 @@ import glob import os -import zipfile +import shutil +from pathlib import Path import glymur import numpy as np import pytest +import skimage +import zarr -from utils.compare_file import _cmp_zarr_archives from linc_convert.modalities.df import multi_slice +from utils.compare_file import assert_zarr_equal +from utils.sample_data import generate_sample_data_variation -def _write_test_data(directory: str) -> None: - for level in range(5): - image = np.zeros((1024, 768, 3), dtype=np.uint8) + level * 10 +@pytest.fixture +def single_slice_jp2(tmp_path): + path = tmp_path / "slice.jp2" + image = skimage.data.brain().T[..., :3] + glymur.Jp2k( + path, + data=image, + ) + return path + + +@pytest.fixture +def multi_slice_jp2(tmp_path): + image = generate_sample_data_variation(3) + image = np.array(image).transpose(2, 3, 0, 1) + for i in range(4): glymur.Jp2k( - f"{directory}/{level}.jp2", - data=image, + f"{tmp_path}/slice{i:03d}.jp2", + data=image[..., i], ) + files = glob.glob(str(os.path.join(tmp_path, "*.jp2"))) + files.sort() + return files -def test_df(tmp_path): - # _write_test_data(tmp_path) - with zipfile.ZipFile("data/df_input.zip", "r") as z: - z.extractall(tmp_path) - output_zarr = tmp_path / "output.zarr" - files = glob.glob(os.path.join(tmp_path, "*.jp2")) - files.sort() - multi_slice.convert(files, out=str(output_zarr), zarr_version=2) - assert _cmp_zarr_archives(str(output_zarr), "data/df.zarr.zip") +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/df_single_slice_zarr2.nii.zarr.zip"), + (3, "data/df_single_slice_zarr3.nii.zarr.zip"), + ], +) +def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr): + """ + Convert a single JP2 slice into a Zarr store and compare against golden. + """ + output = tmp_path / "single_slice.zarr" + multi_slice.convert( + [str(single_slice_jp2)], + out=str(output), + zarr_version=zarr_version, + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ignore_nii=True, + ) + + +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/df_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/df_multi_slice_zarr3.nii.zarr.zip"), + ], +) +def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): + """ + Convert multiple JP2 slices into a Zarr store and compare against golden. + """ + output = tmp_path / "multi_slice.zarr" + multi_slice.convert( + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ignore_nii=True, + ) + + +@pytest.mark.golden +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/df_single_slice_zarr2.nii.zarr.zip"), + (3, "data/df_single_slice_zarr3.nii.zarr.zip"), + ], +) +def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version, + expected_zarr): + """ + Rebuild single‐slice golden Zarr archives. Run only with --regenerate-golden. + """ + output = tmp_path / "single_slice.zarr" + multi_slice.convert( + [str(single_slice_jp2)], + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) + + +@pytest.mark.golden +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/df_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/df_multi_slice_zarr3.nii.zarr.zip"), + ], +) +def test_multi_slice_df_regen_golden(tmp_path, multi_slice_jp2, zarr_version, + expected_zarr): + """ + Rebuild multi‐slice golden Zarr archives. Run only with --regenerate-golden. + """ + output = tmp_path / "multi_slice.zarr" + multi_slice.convert( + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) From 92cfefd706b58c33a589deecaf2cac683fd0338a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 10 Jul 2025 10:35:52 -0400 Subject: [PATCH 091/157] tests: refresh regression test for df pipelines --- tests/utils/generate_trusted_result.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 3d76f376..0d84aef1 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -14,16 +14,6 @@ from linc_convert.modalities.wk import webknossos_annotation if __name__ == "__main__": - with tempfile.TemporaryDirectory() as tmp_dir: - test_df._write_test_data(tmp_dir) - output_zarr = os.path.join(tmp_dir, "output.zarr") - files = glob.glob(os.path.join(tmp_dir, "*.jp2")) - files.sort() - with zipfile.ZipFile("data/df_input.zip", "w") as z: - for file in files: - z.write(file, os.path.basename(file)) - multi_slice.convert(files, output_zarr) - zarr.copy_all(zarr.open(output_zarr), zarr.open("data/df.zarr.zip", "w")) with tempfile.TemporaryDirectory() as tmp_dir: test_lsm._write_test_data(tmp_dir) From 3e0b0be33d285b38ed74d0624f2a4a350f99adf2 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 11:11:36 -0400 Subject: [PATCH 092/157] fix: update single_slice.py for df pipeline with new apis --- linc_convert/modalities/df/single_slice.py | 42 +++++----------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 61e89b9c..51c6c792 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -15,6 +15,7 @@ import numpy as np import zarr from cyclopts import App +from niizarr import write_nifti_header # internals from linc_convert import utils @@ -22,6 +23,7 @@ from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine +from linc_convert.utils.zarr import from_config from linc_convert.utils.zarr.zarr_config import ZarrConfig from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor @@ -33,7 +35,6 @@ def convert( inp: str, *, - out: str, zarr_config: ZarrConfig = None, max_load: int = 16384, orientation: str = "coronal", @@ -83,37 +84,12 @@ def convert( Slice thickness """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - - if not out: - out = os.path.splitext(inp)[0] - out += ".nii.zarr" if nii else ".ome.zarr" - - nii = nii or out.endswith(".nii.zarr") - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) + zarr_config.set_default_name(os.path.splitext(inp)[0]) + omz = from_config(zarr_config) j2k = glymur.Jp2k(inp) vxw, vxh = get_pixelsize(j2k) - # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) - - # Prepare chunking options - opt = { - "chunks": list(j2k.shape[2:]) + [chunk, chunk], - "dimension_separator": r"/", - "order": "F", - "dtype": np.dtype(j2k.dtype).str, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - # Write each level nblevel = j2k.codestream.segment[2].num_res has_channel = j2k.ndim - 2 @@ -121,8 +97,8 @@ def convert( subdat = WrappedJ2K(j2k, level=level) shape = subdat.shape print("Convert level", level, "with shape", shape) - omz.create_dataset(str(level), shape=shape, **opt) - array = omz[str(level)] + array = omz.create_array(str(level), shape=shape, zarr_config=zarr_config) + if max_load is None or (shape[-2] < max_load and shape[-1] < max_load): array[...] = subdat[...] else: @@ -193,7 +169,7 @@ def convert( ] omz.attrs["multiscales"] = multiscales - if not nii: + if not zarr_config.nii: print("done.") return @@ -214,7 +190,7 @@ def convert( header.set_sform(affine) header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) header.structarr["magic"] = b"n+2\0" - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") + # header = np.frombuffer(header.structarr.tobytes(), dtype="u1") opt = { "chunks": [len(header)], "dimension_separator": r"/", @@ -223,5 +199,5 @@ def convert( "fill_value": None, "compressor": None, } - omz.create_dataset("nifti", data=header, shape=shape, **opt) + write_nifti_header(omz, header) print("done.") From 170ce6ba7b9725fa77bf04f693bbf877fed72758 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 11:12:05 -0400 Subject: [PATCH 093/157] test: update df single_slice tests --- tests/test_df.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/tests/test_df.py b/tests/test_df.py index 8a4d2dfb..b3ad4ff3 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -9,7 +9,7 @@ import skimage import zarr -from linc_convert.modalities.df import multi_slice +from linc_convert.modalities.df import multi_slice, single_slice from utils.compare_file import assert_zarr_equal from utils.sample_data import generate_sample_data_variation @@ -51,15 +51,15 @@ def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr Convert a single JP2 slice into a Zarr store and compare against golden. """ output = tmp_path / "single_slice.zarr" - multi_slice.convert( - [str(single_slice_jp2)], + single_slice.convert( + str(single_slice_jp2), out=str(output), zarr_version=zarr_version, + # driver="tensorstore" ) assert_zarr_equal( str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ignore_nii=True, + zarr.storage.ZipStore(expected_zarr, mode="r") ) @@ -79,11 +79,11 @@ def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): multi_slice_jp2, out=str(output), zarr_version=zarr_version, + driver="tensorstore" ) assert_zarr_equal( str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ignore_nii=True, + zarr.storage.ZipStore(expected_zarr, mode="r") ) @@ -97,12 +97,9 @@ def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): ) def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version, expected_zarr): - """ - Rebuild single‐slice golden Zarr archives. Run only with --regenerate-golden. - """ output = tmp_path / "single_slice.zarr" - multi_slice.convert( - [str(single_slice_jp2)], + single_slice.convert( + str(single_slice_jp2), out=str(output), zarr_version=zarr_version, ) @@ -120,9 +117,6 @@ def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version, ) def test_multi_slice_df_regen_golden(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): - """ - Rebuild multi‐slice golden Zarr archives. Run only with --regenerate-golden. - """ output = tmp_path / "multi_slice.zarr" multi_slice.convert( multi_slice_jp2, From 8e177f4ee0505d801a780decc37c8dba75d4113c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:17:24 -0400 Subject: [PATCH 094/157] feat: unified ome_metadata and nifti_header write interface --- linc_convert/utils/zarr/zarr_io/abc.py | 41 ++++++++++++++++++- .../utils/zarr/zarr_io/drivers/tensorstore.py | 6 ++- .../utils/zarr/zarr_io/drivers/zarr_python.py | 6 ++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/linc_convert/utils/zarr/zarr_io/abc.py b/linc_convert/utils/zarr/zarr_io/abc.py index 9444f4fa..7e0440ed 100644 --- a/linc_convert/utils/zarr/zarr_io/abc.py +++ b/linc_convert/utils/zarr/zarr_io/abc.py @@ -1,12 +1,14 @@ from abc import ABC, abstractmethod, ABCMeta from os import PathLike -from typing import Union, Tuple, Optional, Any, Literal +from typing import Union, Tuple, Optional, Any, Literal, List import numpy as np +from nibabel import Nifti1Header, Nifti2Header from numpy.typing import DTypeLike import tqdm from dask import array as da from dask.diagnostics import ProgressBar +import niizarr from linc_convert.utils.zarr import ZarrConfig from linc_convert.utils.zarr.generate_pyramid import default_levels, next_level_shape, \ @@ -101,7 +103,7 @@ def __setitem__(self, key: Any, value: Any) -> None: class ZarrGroup(ZarrNode, metaclass=ABCMeta): """ - Abstract interface for a Zarr group (container of arrays and/or subgroups). + Abstract interface for a Zarr group (container of arrays/subgroups). """ @classmethod @@ -217,3 +219,38 @@ def generate_pyramid( with ProgressBar(): dat.store(arr) return all_shapes + + def write_ome_metadata(self, axes: List[str], + space_scale: Union[float, List[float]] = 1.0, + time_scale: float = 1.0, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: Union[str, int, List[str], List[int]] = 2, + levels: Optional[int] = None, + no_pool: Optional[int] = None, + multiscales_type: str = "", + ome_version: Literal["0.4", "0.5"] = "0.4"): + + zg = self._get_zarr_python_group() + niizarr.write_ome_metadata(zg, + space_scale = space_scale, + time_scale = time_scale, + space_unit = space_unit, + time_unit = time_unit, + axes = axes, + name= name, + pyramid_aligns = pyramid_aligns, + levels = levels, + no_pool = no_pool, + multiscales_type = multiscales_type, + ome_version = ome_version) + + + def write_nifti_header(self, header: Union[Nifti1Header, Nifti2Header]) -> None: + zg = self._get_zarr_python_group() + niizarr.write_nifti_header(zg, header) + + @abstractmethod + def _get_zarr_python_group(self): + ... \ No newline at end of file diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index 3434d9d7..33c4fc7e 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -57,6 +57,7 @@ def __getitem__(self, idx): def __setitem__(self, idx, val): self._ts[idx] = val + # TODO: implement @property def attrs(self): return {} @@ -184,6 +185,7 @@ def create_group(self, name: str, *, overwrite: bool = False, def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) + @classmethod def open(cls, path: Union[str, PathLike], mode="a", *, zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': @@ -227,7 +229,9 @@ def open(cls, path: Union[str, PathLike], mode="a", *, f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") return cls(p) - + def _get_zarr_python_group(self): + import zarr + return zarr.open_group(self._path, mode='a') def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: """Build compressor object from name and options.""" diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py index a4abd4a4..eb3a85b6 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -191,6 +191,8 @@ def zarr_version(self) -> Literal[2, 3]: def __delitem__(self, key): del self._zgroup[key] + def _get_zarr_python_group(self): + return self._zgroup def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: """Build compressor object from name and options.""" @@ -222,8 +224,7 @@ def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio 2 * # TB - 2 ** 30 # TB->Bytes - # I use 2GB for now + 2 ** 30 # GB->Bytes ) @@ -379,3 +380,4 @@ def compute_zarr_layout( shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) return chunk, shard + From 9ad0f04f90f7e7dd9b7887333cf915e3486e859d Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:18:03 -0400 Subject: [PATCH 095/157] feat: update using new interface --- linc_convert/modalities/df/multi_slice.py | 75 +++------------------- linc_convert/modalities/df/single_slice.py | 68 ++------------------ 2 files changed, 13 insertions(+), 130 deletions(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index 7d766e4d..bad21458 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -6,7 +6,6 @@ """ # stdlib -import ast import json import os @@ -14,7 +13,6 @@ import glymur import nibabel as nib import numpy as np -import zarr from cyclopts import App # internals @@ -25,7 +23,6 @@ from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.zarr import from_config from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor HOME = "/space/aspasia/2/users/linc/000003" @@ -115,7 +112,7 @@ def convert( new_size += (3,) print(len(inp), new_size, nblevel, has_channel) chunks = list(new_size[2:]) + [1] + list(zarr_config.chunk[-2:]) - zarr_config.update(chunk = tuple(chunks)) + zarr_config.update(chunk=tuple(chunks)) print(new_size) # Write each level for level in range(nblevel): @@ -185,57 +182,11 @@ def convert( # Write OME-Zarr multiscale metadata print("Write metadata") - multiscales = [ - { - "version": "0.4", - "axes": [ - {"name": "z", "type": "space", "unit": "micrometer"}, - {"name": "y", "type": "distance", "unit": "micrometer"}, - {"name": "x", "type": "space", "unit": "micrometer"}, - ], - "datasets": [], - "type": "jpeg2000", - "name": "", - } - ] + axes = ["z", "y", "x"] if has_channel: - multiscales[0]["axes"].insert(0, {"name": "c", "type": "channel"}) - - for n in range(nblevel): - shape0 = omz["0"].shape[-2:] - shape = omz[str(n)].shape[-2:] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - # I assume that wavelet transforms end up aligning voxel edges - # across levels, so the effective scaling is the shape ratio, - # and there is a half voxel shift wrt to the "center of first voxel" - # frame - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": [1.0] * has_channel - + [ - 1.0, - (shape0[0] / shape[0]) * vxh, - (shape0[1] / shape[1]) * vxw, - ], - }, - { - "type": "translation", - "translation": [0.0] * has_channel - + [ - 0.0, - (shape0[0] / shape[0] - 1) * vxh * 0.5, - (shape0[1] / shape[1] - 1) * vxw * 0.5, - ], - }, - ] - multiscales[0]["coordinateTransformations"] = [ - {"scale": [1.0] * (3 + has_channel), "type": "scale"} - ] - omz.attrs["multiscales"] = multiscales + axes.insert(0, "c") + omz.write_ome_metadata(axes=axes, space_scale=[1.0] + list(get_pixelsize(j2k)), + multiscales_type="jpeg2000", no_pool=0) # Write NIfTI-Zarr header # NOTE: we use nifti2 because dimensions typically do not fit in a short @@ -254,20 +205,10 @@ def convert( header.set_sform(affine) header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) header.structarr["magic"] = b"n+2\0" - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - opt = { - "chunks": [len(header)], - "dimension_separator": r"/", - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": None, - } - omz.create_dataset("nifti", data=header, shape=shape, **opt) - - out = zarr_config.out + omz.write_nifti_header(header) + # Write sidecar .json file - json_name = os.path.splitext(out)[0] + json_name = os.path.splitext(zarr_config.out)[0] json_name += ".json" dic = {} dic["PixelSize"] = json.dumps([vxw, vxh]) diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 51c6c792..88daf11b 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -6,16 +6,12 @@ """ # stdlib -import ast import os # externals import glymur import nibabel as nib -import numpy as np -import zarr from cyclopts import App -from niizarr import write_nifti_header # internals from linc_convert import utils @@ -25,7 +21,6 @@ from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.zarr import from_config from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor ss = App(name="singleslice", help_format="markdown") df.command(ss) @@ -120,54 +115,9 @@ def convert( # Write OME-Zarr multiscale metadata print("Write metadata") - multiscales = [ - { - "version": "0.4", - "axes": [ - {"name": "y", "type": "space", "unit": "micrometer"}, - {"name": "x", "type": "space", "unit": "micrometer"}, - ], - "datasets": [], - "type": "jpeg2000", - "name": "", - } - ] - if has_channel: - multiscales[0]["axes"].insert(0, {"name": "c", "type": "channel"}) - - for n in range(nblevel): - shape0 = omz["0"].shape[-2:] - shape = omz[str(n)].shape[-2:] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - # I assume that wavelet transforms end up aligning voxel edges - # across levels, so the effective scaling is the shape ratio, - # and there is a half voxel shift wrt to the "center of first voxel" - # frame - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": [1.0] * has_channel - + [ - (shape0[0] / shape[0]) * vxh, - (shape0[1] / shape[1]) * vxw, - ], - }, - { - "type": "translation", - "translation": [0.0] * has_channel - + [ - (shape0[0] / shape[0] - 1) * vxh * 0.5, - (shape0[1] / shape[1] - 1) * vxw * 0.5, - ], - }, - ] - multiscales[0]["coordinateTransformations"] = [ - {"scale": [1.0] * (2 + has_channel), "type": "scale"} - ] - omz.attrs["multiscales"] = multiscales + axes = ["c", "y", "x"] if has_channel else ["y", "x"] + omz.write_ome_metadata(axes=axes, space_scale=get_pixelsize(j2k), + multiscales_type="jpeg2000") if not zarr_config.nii: print("done.") @@ -190,14 +140,6 @@ def convert( header.set_sform(affine) header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) header.structarr["magic"] = b"n+2\0" - # header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - opt = { - "chunks": [len(header)], - "dimension_separator": r"/", - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": None, - } - write_nifti_header(omz, header) + + omz.write_nifti_header(header) print("done.") From 43acb8b93a39b144c6240b184b9897495ddd1e39 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:18:14 -0400 Subject: [PATCH 096/157] tests: multi driver tests --- tests/conftest.py | 4 ++++ tests/test_df.py | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7a638114..864b012f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -26,6 +26,10 @@ def test_data_heavy_dir(request): # # subprocess.check_call() # pass +@pytest.fixture(scope="module", params= ["zarr-python", "tensorstore"]) +def driver(request): + return request.param + @pytest.mark.heavy def test_heavy(test_data_heavy_dir): assert True \ No newline at end of file diff --git a/tests/test_df.py b/tests/test_df.py index b3ad4ff3..33a73a63 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -46,7 +46,7 @@ def multi_slice_jp2(tmp_path): (3, "data/df_single_slice_zarr3.nii.zarr.zip"), ], ) -def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr): +def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr, driver): """ Convert a single JP2 slice into a Zarr store and compare against golden. """ @@ -55,7 +55,7 @@ def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr str(single_slice_jp2), out=str(output), zarr_version=zarr_version, - # driver="tensorstore" + driver=driver ) assert_zarr_equal( str(output), @@ -70,7 +70,7 @@ def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr (3, "data/df_multi_slice_zarr3.nii.zarr.zip"), ], ) -def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): +def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr, driver): """ Convert multiple JP2 slices into a Zarr store and compare against golden. """ @@ -79,7 +79,7 @@ def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr): multi_slice_jp2, out=str(output), zarr_version=zarr_version, - driver="tensorstore" + driver=driver ) assert_zarr_equal( str(output), From 44a9c783b4508e096ac713ab03eaf97814d3052c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:20:58 -0400 Subject: [PATCH 097/157] chore --- tests/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 864b012f..3b722788 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,3 @@ -import hashlib import subprocess from pathlib import Path import pytest From 972b18418aa9c19b5513f914a6920ba73a525489 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:25:16 -0400 Subject: [PATCH 098/157] tests: use multi-driver tests --- tests/test_oct.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/test_oct.py b/tests/test_oct.py index 52f15f81..d3e79bc8 100644 --- a/tests/test_oct.py +++ b/tests/test_oct.py @@ -46,7 +46,8 @@ def multi_slice_mats(tmp_path): (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr): +def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, + driver): output = tmp_path / "single_volume.nii.zarr" single_volume.convert( @@ -56,7 +57,7 @@ def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr) zarr_version=zarr_version, overwrite=True, chunk=(64,), - driver="tensorstore", + driver=driver, ) assert_zarr_equal( @@ -72,7 +73,7 @@ def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr) (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), ], ) -def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): +def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr, driver): output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( @@ -82,7 +83,7 @@ def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr): zarr_version=zarr_version, overwrite=True, chunk=(64,), - driver="tensorstore", + driver=driver, ) assert_zarr_equal( @@ -153,12 +154,15 @@ def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, (3, "zarr3.nii.zarr.zip"), ], ) -def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr): - files = glob.glob(test_data_heavy_dir / "sub-test_oct_multi_slice" / "*.mat") +def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr, + driver): + files = glob.glob(str(test_data_heavy_dir / "sub-test_oct_multi_slice" / "*.mat")) files.sort() + expected_zarr = test_data_heavy_dir / "sub-test_oct_multi_slice" / expected_zarr output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True, + driver=driver ) assert_zarr_equal( str(output_zarr), From af0ee9831971a5510c44f7c12f336b799e08843c Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 13:31:25 -0400 Subject: [PATCH 099/157] style --- linc_convert/modalities/psoct/__init__.py | 1 + linc_convert/modalities/psoct/_utils.py | 8 +-- linc_convert/modalities/psoct/multi_slice.py | 8 ++- .../modalities/psoct/single_volume.py | 14 ++--- linc_convert/utils/zarr/zarr_io/abc.py | 51 +++++++++---------- .../utils/zarr/zarr_io/drivers/tensorstore.py | 6 +-- .../utils/zarr/zarr_io/drivers/zarr_python.py | 2 +- linc_convert/utils/zarr/zarr_io/factory.py | 1 - tests/conftest.py | 9 ++-- tests/test_df.py | 3 +- tests/test_lsm.py | 11 ++-- tests/test_wk.py | 13 ++--- tests/utils/generate_trusted_result.py | 9 +--- tests/utils/sample_data.py | 18 ++++--- 14 files changed, 71 insertions(+), 83 deletions(-) diff --git a/linc_convert/modalities/psoct/__init__.py b/linc_convert/modalities/psoct/__init__.py index d9bb1a68..c842709e 100644 --- a/linc_convert/modalities/psoct/__init__.py +++ b/linc_convert/modalities/psoct/__init__.py @@ -5,6 +5,7 @@ import scipy as _scipy # noqa: F401 __all__ = ["cli", "multi_slice", "single_volume"] + from . import cli, multi_slice, single_volume except ImportError: pass diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 51a9a957..f7edb4e4 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -1,14 +1,10 @@ -import itertools import re -from typing import Any, Literal, Generator +from typing import Any, Generator -import nibabel as nib import numpy as np -import zarr from numpy.typing import ArrayLike from scipy import io as sio -from linc_convert.utils.math import ceildiv from linc_convert.utils.unit import convert_unit @@ -34,7 +30,7 @@ def make_json(oct_meta: str) -> dict: """ def _parse_value_unit( - string: str, n: int = None + string: str, n: int = None ) -> tuple[float | list[float], str | Any]: number = r"-?(\d+\.?\d*|\d*\.?\d+)(E-?\d+)?" value = "x".join([number] * (n or 1)) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index e734209d..67879c90 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -15,8 +15,7 @@ import cyclopts import h5py import numpy as np -import zarr -from niizarr import default_nifti_header, write_nifti_header, write_ome_metadata +from niizarr import default_nifti_header from linc_convert import utils from linc_convert.modalities.psoct._utils import make_json @@ -163,8 +162,7 @@ def convert( zgroup.generate_pyramid(mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") - zgroup = zarr.open(zarr_config.out, mode="a") - write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + zgroup.write_ome_metadata(axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: logger.info("Conversion complete.") @@ -184,4 +182,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(to_nifti_unit(unit)) - write_nifti_header(zgroup, header) + zgroup.write_nifti_header(header) diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index d1b253b4..dd0b6944 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -14,8 +14,7 @@ import cyclopts import h5py import numpy as np -import zarr -from niizarr import write_ome_metadata, default_nifti_header, write_nifti_header +from niizarr import default_nifti_header from linc_convert import utils from linc_convert.modalities.psoct._utils import make_json @@ -23,11 +22,10 @@ from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, \ _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator -from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io import ZarrPythonGroup, from_config +from linc_convert.utils.zarr.zarr_io import from_config logger = logging.getLogger(__name__) single_volume = cyclopts.App(name="single_volume", help_format="markdown") @@ -135,9 +133,6 @@ def convert( raise Exception("Input array is not 3d:", inp.shape) inp_chunk = [min(x, zarr_config.max_load) for x in inp.shape] - nk = ceildiv(inp.shape[0], inp_chunk[0]) - nj = ceildiv(inp.shape[1], inp_chunk[1]) - ni = ceildiv(inp.shape[2], inp_chunk[2]) dataset = zgroup.create_array("0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype)) @@ -151,8 +146,7 @@ def convert( zgroup.generate_pyramid(mode="mean", no_pyramid_axis=zarr_config.no_pyramid_axis) logger.info("Write OME-Zarr multiscale metadata") - zgroup = zarr.open(zarr_config.out, mode="a") - write_ome_metadata(zgroup, axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) + zgroup.write_ome_metadata(axes=["z", "y", "x"], space_unit=to_ome_unit(unit)) if not zarr_config.nii: logger.info("Conversion complete.") @@ -173,4 +167,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(to_nifti_unit(unit)) - write_nifti_header(zgroup, header) + zgroup.write_nifti_header(header) diff --git a/linc_convert/utils/zarr/zarr_io/abc.py b/linc_convert/utils/zarr/zarr_io/abc.py index 7e0440ed..6ebe2acf 100644 --- a/linc_convert/utils/zarr/zarr_io/abc.py +++ b/linc_convert/utils/zarr/zarr_io/abc.py @@ -2,13 +2,13 @@ from os import PathLike from typing import Union, Tuple, Optional, Any, Literal, List +import niizarr import numpy as np -from nibabel import Nifti1Header, Nifti2Header -from numpy.typing import DTypeLike import tqdm from dask import array as da from dask.diagnostics import ProgressBar -import niizarr +from nibabel import Nifti1Header, Nifti2Header +from numpy.typing import DTypeLike from linc_convert.utils.zarr import ZarrConfig from linc_convert.utils.zarr.generate_pyramid import default_levels, next_level_shape, \ @@ -221,31 +221,30 @@ def generate_pyramid( return all_shapes def write_ome_metadata(self, axes: List[str], - space_scale: Union[float, List[float]] = 1.0, - time_scale: float = 1.0, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: Union[str, int, List[str], List[int]] = 2, - levels: Optional[int] = None, - no_pool: Optional[int] = None, - multiscales_type: str = "", - ome_version: Literal["0.4", "0.5"] = "0.4"): + space_scale: Union[float, List[float]] = 1.0, + time_scale: float = 1.0, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: Union[str, int, List[str], List[int]] = 2, + levels: Optional[int] = None, + no_pool: Optional[int] = None, + multiscales_type: str = "", + ome_version: Literal["0.4", "0.5"] = "0.4"): zg = self._get_zarr_python_group() niizarr.write_ome_metadata(zg, - space_scale = space_scale, - time_scale = time_scale, - space_unit = space_unit, - time_unit = time_unit, - axes = axes, - name= name, - pyramid_aligns = pyramid_aligns, - levels = levels, - no_pool = no_pool, - multiscales_type = multiscales_type, - ome_version = ome_version) - + space_scale=space_scale, + time_scale=time_scale, + space_unit=space_unit, + time_unit=time_unit, + axes=axes, + name=name, + pyramid_aligns=pyramid_aligns, + levels=levels, + no_pool=no_pool, + multiscales_type=multiscales_type, + ome_version=ome_version) def write_nifti_header(self, header: Union[Nifti1Header, Nifti2Header]) -> None: zg = self._get_zarr_python_group() @@ -253,4 +252,4 @@ def write_nifti_header(self, header: Union[Nifti1Header, Nifti2Header]) -> None: @abstractmethod def _get_zarr_python_group(self): - ... \ No newline at end of file + ... diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py index 33c4fc7e..acaada69 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py @@ -9,7 +9,6 @@ import numcodecs import numcodecs.abc import numpy as np -import zarr from numpy.typing import DTypeLike from upath import UPath @@ -160,7 +159,7 @@ def create_array(self, chunk=zarr_config.chunk, shard=zarr_config.shard, compressor=zarr_config.compressor, - #TODO: implement this + # TODO: implement this # compressor_opt=, version=zarr_config.zarr_version, ) @@ -185,7 +184,6 @@ def create_group(self, name: str, *, overwrite: bool = False, def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) - @classmethod def open(cls, path: Union[str, PathLike], mode="a", *, zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': @@ -229,10 +227,12 @@ def open(cls, path: Union[str, PathLike], mode="a", *, f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") return cls(p) + def _get_zarr_python_group(self): import zarr return zarr.open_group(self._path, mode='a') + def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: """Build compressor object from name and options.""" # TODO: we should use `numcodecs.get_codec` instead` diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py index eb3a85b6..78e9bba7 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py @@ -194,6 +194,7 @@ def __delitem__(self, key): def _get_zarr_python_group(self): return self._zgroup + def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: """Build compressor object from name and options.""" if not isinstance(name, str): @@ -380,4 +381,3 @@ def compute_zarr_layout( shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) return chunk, shard - diff --git a/linc_convert/utils/zarr/zarr_io/factory.py b/linc_convert/utils/zarr/zarr_io/factory.py index ca4586d5..1ddbedda 100644 --- a/linc_convert/utils/zarr/zarr_io/factory.py +++ b/linc_convert/utils/zarr/zarr_io/factory.py @@ -1,5 +1,4 @@ import warnings -from typing import Literal from linc_convert.utils.zarr import ZarrConfig from linc_convert.utils.zarr.zarr_config import DriverLike diff --git a/tests/conftest.py b/tests/conftest.py index 3b722788..0fe1cb27 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,6 @@ import subprocess from pathlib import Path + import pytest DOWNLOAD_CMD = ["dandi", @@ -12,9 +13,9 @@ "--preserve-tree" ] + @pytest.fixture(scope="session") def test_data_heavy_dir(request): - data_dir = Path(__file__).parent / "data" if not any(data_dir.iterdir()): subprocess.check_call(DOWNLOAD_CMD) @@ -25,10 +26,12 @@ def test_data_heavy_dir(request): # # subprocess.check_call() # pass -@pytest.fixture(scope="module", params= ["zarr-python", "tensorstore"]) + +@pytest.fixture(scope="module", params=["zarr-python", "tensorstore"]) def driver(request): return request.param + @pytest.mark.heavy def test_heavy(test_data_heavy_dir): - assert True \ No newline at end of file + assert True diff --git a/tests/test_df.py b/tests/test_df.py index 33a73a63..08c9d4b8 100644 --- a/tests/test_df.py +++ b/tests/test_df.py @@ -46,7 +46,8 @@ def multi_slice_jp2(tmp_path): (3, "data/df_single_slice_zarr3.nii.zarr.zip"), ], ) -def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr, driver): +def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr, + driver): """ Convert a single JP2 slice into a Zarr store and compare against golden. """ diff --git a/tests/test_lsm.py b/tests/test_lsm.py index 8dc6fa5d..5273a721 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm.py @@ -1,12 +1,11 @@ from pathlib import Path import numpy as np -import pytest import tifffile import zarr -from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal from linc_convert.modalities.lsm import mosaic +from utils.compare_file import assert_zarr_equal def _write_test_data(directory: str) -> None: @@ -26,8 +25,8 @@ def _write_test_data(directory: str) -> None: def test_lsm(tmp_path): _write_test_data(tmp_path) output_zarr = tmp_path / "output.zarr" - mosaic.convert(str(tmp_path), out=str(output_zarr), zarr_version=2, driver="tensorstore") + mosaic.convert(str(tmp_path), out=str(output_zarr), zarr_version=2, + driver="tensorstore") assert_zarr_equal(str(output_zarr), - zarr.storage.ZipStore( - "data/lsm.zarr.zip", mode="r")) - + zarr.storage.ZipStore( + "data/lsm.zarr.zip", mode="r")) diff --git a/tests/test_wk.py b/tests/test_wk.py index 7e1718e0..cba82298 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -4,9 +4,9 @@ import pytest import wkw import zarr -from utils.compare_file import _cmp_zarr_archives from linc_convert.modalities.wk import webknossos_annotation +from utils.compare_file import _cmp_zarr_archives def _write_test_data(directory: str) -> None: @@ -54,8 +54,8 @@ def _write_test_data(directory: str) -> None: "scale": [ 1.0, 1.0, - float(2**n), - float(2**n), + float(2 ** n), + float(2 ** n), ], }, { @@ -63,13 +63,14 @@ def _write_test_data(directory: str) -> None: "translation": [ 0.0, 0.0, - float(2**n - 1) * 0.5, - float(2**n - 1) * 0.5, + float(2 ** n - 1) * 0.5, + float(2 ** n - 1) * 0.5, ], }, ] omz.attrs["multiscales"] = multiscales + @pytest.mark.skip(reason="🚧 refactor in progress") def test_wk(tmp_path): _write_test_data(tmp_path) @@ -98,4 +99,4 @@ def get_mask_name(level): if level == 0: return "1" else: - return f"{2**level}-{2**level}-1" + return f"{2 ** level}-{2 ** level}-1" diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 0d84aef1..2543b4ae 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -1,20 +1,15 @@ -import glob import os import tempfile -import zipfile from pathlib import Path -import test_df -import test_lsm -import test_wk import zarr -from linc_convert.modalities.df import multi_slice +import test_lsm +import test_wk from linc_convert.modalities.lsm import mosaic from linc_convert.modalities.wk import webknossos_annotation if __name__ == "__main__": - with tempfile.TemporaryDirectory() as tmp_dir: test_lsm._write_test_data(tmp_dir) output_zarr = os.path.join(tmp_dir, "output.zarr") diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py index b1a97887..6107551e 100644 --- a/tests/utils/sample_data.py +++ b/tests/utils/sample_data.py @@ -1,11 +1,13 @@ +from typing import List, Optional, Tuple + import numpy as np import skimage -from typing import List, Optional, Tuple + def sample_data_variation( - param: float, - image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None + param: float, + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None ) -> np.ndarray: """ Scale global intensity by (1+param), then wrap values modulo the output dtype range. @@ -48,10 +50,10 @@ def sample_data_variation( def generate_sample_data_variation( - n: int, - param_range: Tuple[float, float] = (-0.95, 0.95), - image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None + n: int, + param_range: Tuple[float, float] = (-0.95, 0.95), + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None ) -> List[np.ndarray]: """ Generate `n` deterministic, wrapped‐intensity variations. From ae73445f78bb88541228bbb77ecdc6b94328e82a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 14:49:35 -0400 Subject: [PATCH 100/157] test: improve testing logic and fix typo --- tests/utils/compare_file.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index fb295780..d042c432 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -1,4 +1,5 @@ import argparse +import json import os import sys from typing import Union @@ -117,7 +118,7 @@ def assert_zarr_equal( if dict(zarr1.attrs) != dict(zarr2.attrs): diffs.append( - f"Group attrs differ:\n ‣ {dict(zarr1.attrs)}\n ‣ {dict(zarr2.attrs)}") + f"Group attrs differ:\n ‣ {json.dumps(dict(zarr1.attrs))}\n ‣ {json.dumps(dict(zarr2.attrs))}") if set(zarr1.keys()) != set(zarr2.keys()): diffs.append( f"Group keys differ:\n ‣ {set(zarr1.keys())}\n ‣ {set(zarr2.keys())}") @@ -128,20 +129,19 @@ def assert_zarr_equal( continue obj1 = zarr1[key] obj2 = zarr2[key] - if dict(obj1.attrs) != dict(obj2.attrs): - diffs.append( - f"Attributes for key '{key}' differ:\n ‣ {dict(obj1.attrs)}\n ‣ {dict(obj2.attrs)}") if isinstance(obj1, zarr.Array) ^ isinstance(obj2, zarr.Array): diffs.append(f"Key '{key}' is an array in one group but not the other.") - continue elif isinstance(obj1, zarr.Array): + if dict(obj1.attrs) != dict(obj2.attrs): + diffs.append( + f"Attributes for key '{key}' differ:\n ‣ {dict(obj1.attrs)}\n ‣ {dict(obj2.attrs)}") try: np.testing.assert_array_equal(obj1[:], obj2[:]) except AssertionError as e: diffs.append(f"Array '{key}' differs:\n ‣ {e}") elif isinstance(obj1, zarr.Group): try: - np.testing.assert_allclose(obj1, obj2) + assert_zarr_equal(obj1, obj2) except AssertionError as e: diffs.append(f"Group '{key}' differs:\n ‣ {e}") else: From 4db69b33d50479032ba5899b9ce5ead226485bfa Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 15 Jul 2025 14:51:22 -0400 Subject: [PATCH 101/157] feat: lsm mosaic use new api --- linc_convert/modalities/lsm/mosaic.py | 119 +++++--------------------- 1 file changed, 23 insertions(+), 96 deletions(-) diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index 7e151976..997586f1 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -85,7 +85,6 @@ def convert( """ zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - if max_load % 2: max_load += 1 @@ -121,7 +120,6 @@ def convert( all_chunks_info["y"].append(int(parsed.group("y"))) # default output name - default_name = all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] zarr_config.set_default_name(default_name) @@ -218,100 +216,29 @@ def convert( print("") omz.generate_pyramid(mode="median") - nblevel = 5 - # Write OME-Zarr multiscale metadata print("Write metadata") - multiscales = [ - { - "version": "0.4", - "axes": [ - {"name": "z", "type": "space", "unit": "micrometer"}, - {"name": "y", "type": "space", "unit": "micrometer"}, - {"name": "x", "type": "space", "unit": "micrometer"}, - ], - "datasets": [], - "type": "median window 2x2x2", - "name": "", - } - ] - multiscales[0]["axes"].insert(0, {"name": "c", "type": "channel"}) - - voxel_size = list(map(float, reversed(voxel_size))) - factor = [1] * 3 - for n in range(nblevel): - shape = omz[str(n)].shape[-3:] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - # We made sure that the downsampling level is exactly 2 - # However, once a dimension has size 1, we stop downsampling. - if n > 0: - shape_prev = omz[str(n - 1)].shape[-3:] - if shape_prev[0] != shape[0]: - factor[0] *= 2 - if shape_prev[1] != shape[1]: - factor[1] *= 2 - if shape_prev[2] != shape[2]: - factor[2] *= 2 - - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": [1.0] - + [ - factor[0] * voxel_size[0], - factor[1] * voxel_size[1], - factor[2] * voxel_size[2], - ], - }, - { - "type": "translation", - "translation": [0.0] - + [ - (factor[0] - 1) * voxel_size[0] * 0.5, - (factor[1] - 1) * voxel_size[1] * 0.5, - (factor[2] - 1) * voxel_size[2] * 0.5, - ], - }, - ] - multiscales[0]["coordinateTransformations"] = [ - {"scale": [1.0] * 4, "type": "scale"} - ] - omz = zarr.open(zarr_config.out, mode="a") - omz.attrs["multiscales"] = multiscales - - # if not nii: - # print("done.") - # return - - # # Write NIfTI-Zarr header - # # NOTE: we use nifti2 because dimensions typically do not fit in a short - # # TODO: we do not write the json zattrs, but it should be added in - # # once the nifti-zarr package is released - # shape = list(reversed(omz["0"].shape)) - # shape = shape[:3] + [1] + shape[3:] # insert time dimension - # affine = orientation_to_affine(orientation, *voxel_size) - # if center: - # affine = center_affine(affine, shape[:3]) - # header = nib.Nifti2Header() - # header.set_data_shape(shape) - # header.set_data_dtype(omz["0"].dtype) - # header.set_qform(affine) - # header.set_sform(affine) - # header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) - # header.structarr["magic"] = b"nz2\0" - # write_nifti_header(omz, header) - # header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - # write_nifti_header() - # opt = { - # "chunks": [len(header)], - # "dimension_separator": r"/", - # "order": "F", - # "dtype": "|u1", - # "fill_value": None, - # "compressor": None, - # } - # omz.create_dataset("nifti", data=header, shape=shape, **opt) + omz.write_ome_metadata(["c", "z", "y", "x"], list(map(float, reversed(voxel_size)))) + + if not zarr_config.nii: + print("done.") + return + + # Write NIfTI-Zarr header + # NOTE: we use nifti2 because dimensions typically do not fit in a short + # TODO: we do not write the json zattrs, but it should be added in + # once the nifti-zarr package is released + shape = list(reversed(omz["0"].shape)) + shape = shape[:3] + [1] + shape[3:] # insert time dimension + affine = orientation_to_affine(orientation, *voxel_size) + if center: + affine = center_affine(affine, shape[:3]) + header = nib.Nifti2Header() + header.set_data_shape(shape) + header.set_data_dtype(omz["0"].dtype) + header.set_qform(affine) + header.set_sform(affine) + header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) + header.structarr["magic"] = b"nz2\0" + omz.write_nifti_header(header) print("done.") From bb3fe91bc21e637c8d687a22b02ca81e1699adac Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 12:10:01 -0400 Subject: [PATCH 102/157] refactor --- linc_convert/modalities/df/multi_slice.py | 9 ++++----- linc_convert/modalities/df/single_slice.py | 9 ++++----- linc_convert/modalities/psoct/multi_slice.py | 10 ++++------ linc_convert/modalities/psoct/single_volume.py | 9 ++++----- linc_convert/modalities/wk/webknossos_annotation.py | 2 +- .../zarr_io/drivers/zarrita.py => io/__init__.py} | 0 linc_convert/utils/{ => io}/_array_wrapper.py | 0 linc_convert/utils/{zarr => io}/generate_pyramid.py | 0 linc_convert/utils/{ => io}/j2k.py | 0 linc_convert/utils/{ => io}/spool.py | 0 .../utils/{zarr/zarr_io => io/zarr}/__init__.py | 0 linc_convert/utils/{zarr/zarr_io => io/zarr}/abc.py | 13 ++++++++++--- linc_convert/utils/io/zarr/drivers/__init__.py | 0 .../zarr_io => io/zarr}/drivers/tensorstore.py | 8 +++++--- .../zarr_io => io/zarr}/drivers/zarr_python.py | 4 ++-- linc_convert/utils/io/zarr/drivers/zarrita.py | 1 + .../utils/{zarr/zarr_io => io/zarr}/factory.py | 9 ++++----- linc_convert/utils/zarr/__init__.py | 4 ---- linc_convert/utils/{zarr => }/zarr_config.py | 3 ++- 19 files changed, 41 insertions(+), 40 deletions(-) rename linc_convert/utils/{zarr/zarr_io/drivers/zarrita.py => io/__init__.py} (100%) rename linc_convert/utils/{ => io}/_array_wrapper.py (100%) rename linc_convert/utils/{zarr => io}/generate_pyramid.py (100%) rename linc_convert/utils/{ => io}/j2k.py (100%) rename linc_convert/utils/{ => io}/spool.py (100%) rename linc_convert/utils/{zarr/zarr_io => io/zarr}/__init__.py (100%) rename linc_convert/utils/{zarr/zarr_io => io/zarr}/abc.py (95%) create mode 100644 linc_convert/utils/io/zarr/drivers/__init__.py rename linc_convert/utils/{zarr/zarr_io => io/zarr}/drivers/tensorstore.py (98%) rename linc_convert/utils/{zarr/zarr_io => io/zarr}/drivers/zarr_python.py (99%) create mode 100644 linc_convert/utils/io/zarr/drivers/zarrita.py rename linc_convert/utils/{zarr/zarr_io => io/zarr}/factory.py (75%) delete mode 100644 linc_convert/utils/zarr/__init__.py rename linc_convert/utils/{zarr => }/zarr_config.py (97%) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index bad21458..a28834ca 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -16,13 +16,12 @@ from cyclopts import App # internals -from linc_convert import utils from linc_convert.modalities.df.cli import df -from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize +from linc_convert.utils.io.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv, floordiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr import from_config -from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.io.zarr import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config HOME = "/space/aspasia/2/users/linc/000003" @@ -89,7 +88,7 @@ def convert( thickness Slice thickness """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) zarr_config.set_default_name(os.path.splitext(inp[0])[0]) omz = from_config(zarr_config) diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 88daf11b..131eb749 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -14,13 +14,12 @@ from cyclopts import App # internals -from linc_convert import utils from linc_convert.modalities.df.cli import df -from linc_convert.utils.j2k import WrappedJ2K, get_pixelsize +from linc_convert.utils.io.j2k import WrappedJ2K, get_pixelsize from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr import from_config -from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.io.zarr import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config ss = App(name="singleslice", help_format="markdown") df.command(ss) @@ -78,7 +77,7 @@ def convert( thickness Slice thickness """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) zarr_config.set_default_name(os.path.splitext(inp)[0]) omz = from_config(zarr_config) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 67879c90..a58d8e84 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -17,17 +17,15 @@ import numpy as np from niizarr import default_nifti_header -from linc_convert import utils from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ +from linc_convert.utils.io._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ _MatArrayWrapper from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr import generate_pyramid -from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config +from linc_convert.utils.io.zarr import from_config logger = logging.getLogger(__name__) multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") @@ -98,7 +96,7 @@ def convert( dtype : Optional[str] Data type to write into. """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) zarr_config.set_default_name(os.path.splitext(inp[0].file)[0]) # Process metadata if provided diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index dd0b6944..684e54e3 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -16,16 +16,15 @@ import numpy as np from niizarr import default_nifti_header -from linc_convert import utils from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils._array_wrapper import _ArrayWrapper, _MatArrayWrapper, \ +from linc_convert.utils.io._array_wrapper import _ArrayWrapper, _MatArrayWrapper, \ _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit -from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config +from linc_convert.utils.io.zarr import from_config logger = logging.getLogger(__name__) single_volume = cyclopts.App(name="single_volume", help_format="markdown") @@ -106,7 +105,7 @@ def convert( center Set RAS[0, 0, 0] at FOV center """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) zarr_config.set_default_name(os.path.splitext(inp.file)[0]) # Process metadata if provided diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index f0f5d90e..65cbccde 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -16,7 +16,7 @@ # internals from linc_convert.modalities.wk.cli import wk from linc_convert.utils.math import ceildiv -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor +from linc_convert.utils.io.zarr.drivers.zarr_python import make_compressor webknossos = cyclopts.App(name="webknossos", help_format="markdown") wk.command(webknossos) diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarrita.py b/linc_convert/utils/io/__init__.py similarity index 100% rename from linc_convert/utils/zarr/zarr_io/drivers/zarrita.py rename to linc_convert/utils/io/__init__.py diff --git a/linc_convert/utils/_array_wrapper.py b/linc_convert/utils/io/_array_wrapper.py similarity index 100% rename from linc_convert/utils/_array_wrapper.py rename to linc_convert/utils/io/_array_wrapper.py diff --git a/linc_convert/utils/zarr/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py similarity index 100% rename from linc_convert/utils/zarr/generate_pyramid.py rename to linc_convert/utils/io/generate_pyramid.py diff --git a/linc_convert/utils/j2k.py b/linc_convert/utils/io/j2k.py similarity index 100% rename from linc_convert/utils/j2k.py rename to linc_convert/utils/io/j2k.py diff --git a/linc_convert/utils/spool.py b/linc_convert/utils/io/spool.py similarity index 100% rename from linc_convert/utils/spool.py rename to linc_convert/utils/io/spool.py diff --git a/linc_convert/utils/zarr/zarr_io/__init__.py b/linc_convert/utils/io/zarr/__init__.py similarity index 100% rename from linc_convert/utils/zarr/zarr_io/__init__.py rename to linc_convert/utils/io/zarr/__init__.py diff --git a/linc_convert/utils/zarr/zarr_io/abc.py b/linc_convert/utils/io/zarr/abc.py similarity index 95% rename from linc_convert/utils/zarr/zarr_io/abc.py rename to linc_convert/utils/io/zarr/abc.py index 6ebe2acf..ea954618 100644 --- a/linc_convert/utils/zarr/zarr_io/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -10,10 +10,10 @@ from nibabel import Nifti1Header, Nifti2Header from numpy.typing import DTypeLike -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr.generate_pyramid import default_levels, next_level_shape, \ +from linc_convert.utils.zarr_config import ZarrConfig +from linc_convert.utils.io.generate_pyramid import default_levels, next_level_shape, \ compute_next_level -from linc_convert.utils.zarr.zarr_io import logger +from linc_convert.utils.io.zarr import logger class ZarrNode(ABC): @@ -42,6 +42,13 @@ def zarr_version(self) -> int: Return the Zarr format version (e.g., 2 or 3). """ ... + # TODO: implement these and more built-in methods + # def __repr__(self): + # ... + # def __str__(self): + # ... + # def __eq__(self, other): + # ... class ZarrArray(ZarrNode): diff --git a/linc_convert/utils/io/zarr/drivers/__init__.py b/linc_convert/utils/io/zarr/drivers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py similarity index 98% rename from linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py rename to linc_convert/utils/io/zarr/drivers/tensorstore.py index acaada69..7333ca36 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -13,8 +13,8 @@ from upath import UPath import tensorstore as ts -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup +from linc_convert.utils.zarr_config import ZarrConfig +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup class ZarrTSArray(ZarrArray): @@ -525,7 +525,9 @@ def default_write_config( # Fix incompatibilities shard, chunk = fix_shard_chunk(shard, chunk, shape) - + else: + for i, c in enumerate(chunk): + chunk[i] = min(chunk[i], shape[i]) # ------------------------------------------------------------------ # Zarr 3 # ------------------------------------------------------------------ diff --git a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py similarity index 99% rename from linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py rename to linc_convert/utils/io/zarr/drivers/zarr_python.py index 78e9bba7..21cb3608 100644 --- a/linc_convert/utils/zarr/zarr_io/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -7,8 +7,8 @@ from numpy.typing import DTypeLike from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr.zarr_io.abc import ZarrArray, ZarrGroup +from linc_convert.utils.zarr_config import ZarrConfig +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup class ZarrPythonArray(ZarrArray): diff --git a/linc_convert/utils/io/zarr/drivers/zarrita.py b/linc_convert/utils/io/zarr/drivers/zarrita.py new file mode 100644 index 00000000..30e73a04 --- /dev/null +++ b/linc_convert/utils/io/zarr/drivers/zarrita.py @@ -0,0 +1 @@ +raise NotImplementedError diff --git a/linc_convert/utils/zarr/zarr_io/factory.py b/linc_convert/utils/io/zarr/factory.py similarity index 75% rename from linc_convert/utils/zarr/zarr_io/factory.py rename to linc_convert/utils/io/zarr/factory.py index 1ddbedda..2fe29602 100644 --- a/linc_convert/utils/zarr/zarr_io/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,9 +1,8 @@ import warnings -from linc_convert.utils.zarr import ZarrConfig -from linc_convert.utils.zarr.zarr_config import DriverLike -from linc_convert.utils.zarr.zarr_io.abc import ZarrGroup -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import ZarrPythonArray, \ +from linc_convert.utils.zarr_config import DriverLike, ZarrConfig +from linc_convert.utils.io.zarr.abc import ZarrGroup +from linc_convert.utils.io.zarr.drivers.zarr_python import ZarrPythonArray, \ ZarrPythonGroup _DRIVER_ARRAY = { @@ -14,7 +13,7 @@ } try: - from linc_convert.utils.zarr.zarr_io.drivers.tensorstore import ZarrTSArray, \ + from linc_convert.utils.io.zarr.drivers.tensorstore import ZarrTSArray, \ ZarrTSGroup _DRIVER_ARRAY["tensorstore"] = ZarrTSArray diff --git a/linc_convert/utils/zarr/__init__.py b/linc_convert/utils/zarr/__init__.py deleted file mode 100644 index 835db1d7..00000000 --- a/linc_convert/utils/zarr/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Zarr utilities.""" - -from .zarr_config import ZarrConfig -from .zarr_io import * diff --git a/linc_convert/utils/zarr/zarr_config.py b/linc_convert/utils/zarr_config.py similarity index 97% rename from linc_convert/utils/zarr/zarr_config.py rename to linc_convert/utils/zarr_config.py index 58bf400c..cf791ccf 100644 --- a/linc_convert/utils/zarr/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -122,7 +122,8 @@ def update(self, **kwargs): return replace(self, **kwargs) -def update(zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: +def update_default_config(zarr_config: ZarrConfig | None, + **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: if zarr_config is None: zarr_config = ZarrConfig() return replace(zarr_config, **kwargs) From 3fe8c699399ba3e871902c1fcdc7daf1712ecdbd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:13:48 -0400 Subject: [PATCH 103/157] feat: update lsm pipelines to new api --- linc_convert/modalities/lsm/mosaic.py | 15 +- linc_convert/modalities/lsm/multi_slice.py | 182 ++------------------- linc_convert/modalities/lsm/spool.py | 31 ++-- tests/conftest.py | 5 + tests/test_lsm.py | 85 +++++++--- tests/test_lsm_multi_slice.py | 72 ++++++++ tests/test_lsm_spool.py | 141 ++++++++++++++++ tests/utils/generate_trusted_result.py | 10 +- 8 files changed, 320 insertions(+), 221 deletions(-) create mode 100644 tests/test_lsm_multi_slice.py create mode 100644 tests/test_lsm_spool.py diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index 997586f1..cb894856 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -6,7 +6,6 @@ """ # stdlib -import ast import os import re from glob import glob @@ -14,18 +13,13 @@ # externals import cyclopts import nibabel as nib -import numpy as np -import zarr -from niizarr import write_nifti_header from tifffile import TiffFile # internals -from linc_convert import utils from linc_convert.modalities.lsm.cli import lsm -from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.zarr_config import ZarrConfig -from linc_convert.utils.zarr.zarr_io import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config +from linc_convert.utils.io.zarr import from_config mosaic = cyclopts.App(name="mosaic", help_format="markdown") lsm.command(mosaic) @@ -83,7 +77,7 @@ def convert( voxel_size Voxel size along the X, Y and Z dimension, in micron. """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) if max_load % 2: max_load += 1 @@ -197,7 +191,8 @@ def convert( zstart = sum(shape[0][0] for shape in allshapes[:chunkz]) ystart = sum( - shape[1] for subshapes in allshapes for shape in subshapes[:chunky] + shape[1] + for shape in allshapes[chunkz][:chunky] ) print( f"Write plane " diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index 4df3dd02..0a146274 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -6,7 +6,6 @@ """ # stdlib -import ast import os import re from glob import glob @@ -15,16 +14,13 @@ import cyclopts import nibabel as nib import numpy as np -import zarr from tifffile import TiffFile # internals -from linc_convert import utils from linc_convert.modalities.lsm.cli import lsm -from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import make_compressor -from linc_convert.utils.zarr.zarr_config import ZarrConfig +from linc_convert.utils.io.zarr import from_config +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") lsm.command(multi_slice) @@ -34,7 +30,6 @@ def convert( inp: str, *, - out: str, zarr_config: ZarrConfig = None, overlap: int = 30, max_load: int = 512, @@ -93,15 +88,8 @@ def convert( voxel_size Voxel size along the X, Y and Z dimensions, in microns. """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) - chunk: int = zarr_config.chunk[0] - compressor: str = zarr_config.compressor - compressor_opt: str = zarr_config.compressor_opt - nii: bool = zarr_config.nii - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - + zarr_config = update_default_config(zarr_config, **kwargs) + chunk = zarr_config.chunk if max_load % 2: max_load += 1 @@ -124,10 +112,8 @@ def convert( all_chunks_info["y"].append(int(parsed.group("y"))) # default output name - if not out: - out = all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] - out += ".nii.zarr" if nii else ".ome.zarr" - nii = nii or out.endswith(".nii.zarr") + zarr_config.set_default_name( + all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0]) # parse all individual file names nchunkz = max(all_chunks_info["z"]) @@ -168,22 +154,13 @@ def convert( fullshape[2] = allshapes[0][0][2] # Prepare Zarr group - omz = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=omz, overwrite=True) - print(out) - # Prepare chunking options - opt = { - "chunks": [chunk] * 3, - "dimension_separator": r"/", - "order": "F", - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } + omz = from_config(zarr_config) + print(zarr_config.out) # write first level - omz.create_dataset("0", shape=fullshape, **opt) - array = omz["0"] + array = omz.create_array("0", shape=fullshape, dtype=np.dtype(dtype).str, + zarr_config=zarr_config) + print("Write level 0 with shape", fullshape) for i, filename in enumerate(all_chunks_info["filename"]): @@ -215,132 +192,16 @@ def convert( ) array[slicer] = dat print("") - - # build pyramid using median windows - level = 0 - while any(x > 1 for x in omz[str(level)].shape[-3:]): - prev_array = omz[str(level)] - prev_shape = prev_array.shape[-3:] - level += 1 - - new_shape = list(map(lambda x: max(1, x // 2), prev_shape)) - if all(x < chunk for x in new_shape): - break - print("Compute level", level, "with shape", new_shape) - omz.create_dataset(str(level), shape=new_shape, **opt) - new_array = omz[str(level)] - - nz, ny, nx = prev_array.shape[-3:] - ncz = ceildiv(nz, max_load) - ncy = ceildiv(ny, max_load) - ncx = ceildiv(nx, max_load) - - for cz in range(ncz): - for cy in range(ncy): - for cx in range(ncx): - print(f"chunk ({cz}, {cy}, {cx}) / ({ncz}, {ncy}, {ncx})", end="\r") - - dat = prev_array[ - ..., - cz * max_load : (cz + 1) * max_load, - cy * max_load : (cy + 1) * max_load, - cx * max_load : (cx + 1) * max_load, - ] - crop = [0 if x == 1 else x % 2 for x in dat.shape[-3:]] - slicer = [slice(-1) if x else slice(None) for x in crop] - dat = dat[(Ellipsis, *slicer)] - pz, py, px = dat.shape[-3:] - - dat = dat.reshape( - [ - max(pz // 2, 1), - min(pz, 2), - max(py // 2, 1), - min(py, 2), - max(px // 2, 1), - min(px, 2), - ] - ) - dat = dat.transpose([0, 2, 4, 1, 3, 5]) - dat = dat.reshape( - [ - max(pz // 2, 1), - max(py // 2, 1), - max(px // 2, 1), - -1, - ] - ) - dat = np.median(dat, -1) - - new_array[ - ..., - cz * max_load // 2 : (cz + 1) * max_load // 2, - cy * max_load // 2 : (cy + 1) * max_load // 2, - cx * max_load // 2 : (cx + 1) * max_load // 2, - ] = dat - + omz.generate_pyramid(mode="median") print("") - nblevel = level # Write OME-Zarr multiscale metadata print("Write metadata") - multiscales = [ - { - "version": "0.4", - "axes": [ - {"name": "z", "type": "space", "unit": "micrometer"}, - {"name": "y", "type": "space", "unit": "micrometer"}, - {"name": "x", "type": "space", "unit": "micrometer"}, - ], - "datasets": [], - "type": "median window 2x2x2", - "name": "", - } - ] - voxel_size = list(map(float, reversed(voxel_size))) - factor = [1] * 3 - for n in range(nblevel): - shape = omz[str(n)].shape[-3:] - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - # We made sure that the downsampling level is exactly 2 - # However, once a dimension has size 1, we stop downsampling. - if n > 0: - shape_prev = omz[str(n - 1)].shape[-3:] - if shape_prev[0] != shape[0]: - factor[0] *= 2 - if shape_prev[1] != shape[1]: - factor[1] *= 2 - if shape_prev[2] != shape[2]: - factor[2] *= 2 - - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": [ - factor[0] * voxel_size[0], - factor[1] * voxel_size[1], - factor[2] * voxel_size[2], - ], - }, - { - "type": "translation", - "translation": [ - (factor[0] - 1) * voxel_size[0] * 0.5, - (factor[1] - 1) * voxel_size[1] * 0.5, - (factor[2] - 1) * voxel_size[2] * 0.5, - ], - }, - ] - multiscales[0]["coordinateTransformations"] = [ - {"scale": [1.0] * 3, "type": "scale"} - ] - omz.attrs["multiscales"] = multiscales - - if not nii: + + omz.write_ome_metadata(["z", "y", "x"], voxel_size) + + if not zarr_config.nii: print("done.") return @@ -360,14 +221,5 @@ def convert( header.set_sform(affine) header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) header.structarr["magic"] = b"nz2\0" - header = np.frombuffer(header.structarr.tobytes(), dtype="u1") - opt = { - "chunks": [len(header)], - "dimension_separator": r"/", - "order": "F", - "dtype": "|u1", - "fill_value": None, - "compressor": None, - } - omz.create_dataset("nifti", data=header, shape=shape, **opt) + omz.write_nifti_header(header) print("done.") diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 82b41999..5d4f0b36 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -9,16 +9,15 @@ import cyclopts import nibabel as nib import numpy as np -from niizarr import default_nifti_header, write_nifti_header -from niizarr._nii2zarr import write_ome_metadata +from niizarr import default_nifti_header # internals -from linc_convert import utils from linc_convert.modalities.lsm.cli import lsm +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.spool import SpoolSetInterpreter -from linc_convert.utils.zarr import (generate_pyramid, ZarrConfig) -from linc_convert.utils.zarr.zarr_io.drivers.zarr_python import open_zarr_group, \ +from linc_convert.utils.io.spool import SpoolSetInterpreter +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config +from linc_convert.utils.io.zarr.drivers.zarr_python import open_zarr_group, \ create_array spool = cyclopts.App(name="spool", help_format="markdown") @@ -36,7 +35,6 @@ def convert( inp: str, *, - out: str, overlap: int = 192, orientation: str = "coronal", center: bool = True, @@ -71,7 +69,7 @@ def convert( ---------- inp Path to the root directory, which contains a collection of - subfolders named `*_y{:02d}_z{:02d}*`, each containing a + subfolders named `*_y{:02d}_z{:02d}*_HR`, each containing a collection of files named `*spool.dat`. TODO: add instrution for metadata file and info file out @@ -89,7 +87,7 @@ def convert( kwargs used for internal api """ - zarr_config = utils.zarr.zarr_config.update(zarr_config, **kwargs) + zarr_config = update_default_config(zarr_config, **kwargs) CHUNK_PATTERN = re.compile( r"^(?P\w*)" @@ -202,8 +200,8 @@ def convert( fullshape = (full_shape_z, full_shape_y, full_shape_x) # Initialize Zarr group and array - omz = open_zarr_group(zarr_config) - array = create_array(omz, "0", shape=fullshape, zarr_config=zarr_config, dtype=dtype) + omz = from_config(zarr_config) + array = omz.create_array("0", shape=fullshape, zarr_config=zarr_config, dtype=dtype) # TODO: logger # print(out) @@ -240,15 +238,17 @@ def convert( print("") # Generate Zarr pyramid and metadata - generate_pyramid(omz, levels=zarr_config.levels) - write_ome_metadata(omz, axes = ["z","y","x"],space_scale=voxel_size) + omz.generate_pyramid(levels=zarr_config.levels) + omz.write_ome_metadata(axes=["z", "y", "x"], space_scale=voxel_size) # Write NIfTI-Zarr header: if not zarr_config.nii: return # TODO: header has some problem with unit when deal with zarr 2, furthur debugging needed - header, _ = default_nifti_header(omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None)) + header = default_nifti_header(omz["0"], + omz.attrs.get("ome", omz.attrs).get("multiscales", + None)) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension affine = orientation_to_affine(orientation, *voxel_size) @@ -260,5 +260,4 @@ def convert( header.set_sform(affine) header.set_xyzt_units(nib.nifti1.unit_codes.code["micron"]) - write_nifti_header(omz, header) - + omz.write_nifti_header(header) diff --git a/tests/conftest.py b/tests/conftest.py index 0fe1cb27..04b9f668 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -32,6 +32,11 @@ def driver(request): return request.param +@pytest.fixture(scope="module", params=[2, 3]) +def zarr_version(request): + return request.param + + @pytest.mark.heavy def test_heavy(test_data_heavy_dir): assert True diff --git a/tests/test_lsm.py b/tests/test_lsm.py index 5273a721..2902e190 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm.py @@ -1,32 +1,73 @@ +import shutil from pathlib import Path import numpy as np +import pytest +import skimage import tifffile import zarr -from linc_convert.modalities.lsm import mosaic +from linc_convert.modalities.lsm import mosaic, spool from utils.compare_file import assert_zarr_equal +from utils.sample_data import generate_sample_data_variation -def _write_test_data(directory: str) -> None: - root_path = Path(directory) - for z in range(1, 2, 1): - for y in range(1, 3, 1): - folder = root_path / f"test_z{z}_y{y}" +@pytest.fixture +def mosaic_tiff(tmp_path): + root = Path(tmp_path) + brain = np.array(generate_sample_data_variation(3)) + brain = brain.reshape(3, 2, 5, 4, 64, 256) + + for z in range(1, 6): + for y in range(1, 5): + folder = root / f"test_z{z}_y{y}" folder.mkdir(parents=True, exist_ok=True) - for plane in range(1, 4, 1): - for c in range(1, 3, 1): - image = np.zeros((1024, 768)) + z * y * plane * c - tifffile.imwrite( - folder / f"test_z{z}_y{y}_plane{plane}_c{c}.tiff", image - ) - - -def test_lsm(tmp_path): - _write_test_data(tmp_path) - output_zarr = tmp_path / "output.zarr" - mosaic.convert(str(tmp_path), out=str(output_zarr), zarr_version=2, - driver="tensorstore") - assert_zarr_equal(str(output_zarr), - zarr.storage.ZipStore( - "data/lsm.zarr.zip", mode="r")) + for plane_index in range(1, 3): + for c in range(1, 4): + out_path = folder / f"test_z{z}_y{y}_plane{plane_index}_c{c}.tiff" + image = brain[c - 1, plane_index - 1, z - 1, y - 1, :] + tifffile.imwrite(out_path, image) + return root + + +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/lsm_mosaic_zarr2.nii.zarr.zip"), + (3, "data/lsm_mosaic_zarr3.nii.zarr.zip"), + ], +) +def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, expected_zarr, driver): + """ + Convert multiple JP2 slices into a Zarr store and compare against golden. + """ + output = tmp_path / "mosaic.nii.zarr" + mosaic.convert( + str(mosaic_tiff), + out=str(output), + zarr_version=zarr_version, + driver=driver + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +@pytest.mark.parametrize( + ("zarr_version", "expected_zarr"), + [ + (2, "data/lsm_mosaic_zarr2.nii.zarr.zip"), + (3, "data/lsm_mosaic_zarr3.nii.zarr.zip"), + ], +) +def test_mosaic_lsm_regen_golden(tmp_path, mosaic_tiff, zarr_version, expected_zarr): + output = tmp_path / "mosaic.nii.zarr" + mosaic.convert( + str(mosaic_tiff), + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py new file mode 100644 index 00000000..ea7212ed --- /dev/null +++ b/tests/test_lsm_multi_slice.py @@ -0,0 +1,72 @@ +import shutil +from pathlib import Path + +import numpy as np +import pytest +import skimage +import tifffile +import zarr + +from linc_convert.modalities.lsm import multi_slice +from utils.compare_file import assert_zarr_equal +from utils.sample_data import generate_sample_data_variation + + +@pytest.fixture +def multi_slice_tiff(tmp_path): + root = Path(tmp_path) + brain = skimage.data.brain() + brain = brain.reshape(10, 4, 64, 256) + for z in range(1, 11): + for y in range(1, 4): + out_path = root / f"test_y{y:02d}_z{z:02d}.tiff" + image = brain[z - y, y - 1][None, ...] + tifffile.imwrite(out_path, image) + return root + + +@pytest.mark.parametrize( + "zarr_version, expected_zarr", + [ + (2, "data/lsm_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/lsm_multi_slice_zarr3.nii.zarr.zip"), + ], +) +def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, expected_zarr, + driver): + """ + Convert multiple JP2 slices into a Zarr store and compare against golden. + """ + output = tmp_path / "multi_slice.zarr" + multi_slice.convert( + multi_slice_tiff, + overlap=0, + out=str(output), + zarr_version=zarr_version, + driver=driver + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +@pytest.mark.parametrize( + ("zarr_version", "expected_zarr"), + [ + (2, "data/lsm_multi_slice_zarr2.nii.zarr.zip"), + (3, "data/lsm_multi_slice_zarr3.nii.zarr.zip"), + ], +) +def test_lsm_multi_slice_regen_golden(tmp_path, multi_slice_tiff, zarr_version, + expected_zarr): + output = tmp_path / "single_slice.zarr" + multi_slice.convert( + str(multi_slice_tiff), + overlap=0, + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py new file mode 100644 index 00000000..87bf8ace --- /dev/null +++ b/tests/test_lsm_spool.py @@ -0,0 +1,141 @@ +import os +import shutil +from pathlib import Path + +import numpy as np +import pytest +import skimage +import tifffile +import zarr + +from linc_convert.modalities.lsm import mosaic, spool +from utils.compare_file import assert_zarr_equal +from utils.sample_data import generate_sample_data_variation + + +@pytest.fixture +def spool_dat(tmp_path): + brain = skimage.data.brain() + brain = brain.reshape(10, 4, 64, 256) + for z in range(1, 11): + for y in range(1, 4): + out_path = tmp_path / f"test_run{y:02d}_y{y:02d}_z{z:02d}_HR" + image = brain[z - y, y - 1][None, ...] + + write_zyla_spool_set(image, out_path, images_per_file=128) + + return tmp_path + + +def write_zyla_spool_set( + image: np.ndarray, + spool_set_path: str, + *, + pixel_encoding: str = 'Mono16', + images_per_file: int = None, +): + """ + Given `image` of shape (numDepths, numColumns, numFrames), + create a Zyla‑compatible spool directory at `spool_set_path` + such that SpoolSetInterpreter(...).assemble_cropped() == image. + + Parameters + ---------- + image : np.ndarray + 3D array with shape (numDepths, numColumns, numFrames). Must be dtype uint16 if + pixel_encoding='Mono16' (or uint8 if 'Mono8'). + spool_set_path : str + Path to the directory to create. Will be mkdir'd if necessary. + pixel_encoding : {'Mono16','Mono8'} + Selects dtype and controls AOIStride = numColumns * itemsize. + images_per_file : int, optional + How many frames to pack into each spool file. Defaults to all frames in one file. + """ + numDepths, numColumns, numFrames = image.shape + if images_per_file is None: + images_per_file = numFrames + if pixel_encoding == 'Mono16': + dtype = np.uint16 + elif pixel_encoding == 'Mono8': + dtype = np.uint8 + else: + raise ValueError("pixel_encoding must be 'Mono16' or 'Mono8'") + if image.dtype != dtype: + raise ValueError(f"Expected image.dtype={dtype}, got {image.dtype}") + + # compute padded rows: odd heights get +1, even get +2 + if numDepths % 2: + numRows = numDepths + 1 + else: + numRows = numDepths + 2 + + # stride in bytes + stride = numColumns * dtype().nbytes + # how many bytes per frame + frame_bytes = numRows * numColumns * dtype().nbytes + + # make directory + os.makedirs(spool_set_path, exist_ok=True) + + # marker for format detection + open(os.path.join(spool_set_path, 'Spooled files.sifx'), 'wb').close() + + # write acquisitionmetadata.ini + ini = f""" +[data] +AOIHeight = {numDepths} +AOIWidth = {numColumns} +AOIStride = {stride} +PixelEncoding = {pixel_encoding} +ImageSizeBytes = {frame_bytes} + +[multiimage] +ImagesPerFile = {images_per_file} +""" + with open(os.path.join(spool_set_path, 'acquisitionmetadata.ini'), 'w', + encoding='utf-8') as f: + f.write(ini) + + # split into as many spool files as needed + n_files = (numFrames + images_per_file - 1) // images_per_file + for file_idx in range(n_files): + start_f = file_idx * images_per_file + end_f = min(start_f + images_per_file, numFrames) + this_count = end_f - start_f + + # prepare buffer: shape (this_count, numRows, numColumns) + buf = np.zeros((this_count, numRows, numColumns), dtype=dtype) + # fill the real depths into row 0..numDepths-1 + # image has shape (numDepths, numColumns, numFrames) + # buf[f, d, c] = image[d, c, f] + for f in range(this_count): + buf[f, :numDepths, :] = image[:, :, start_f + f] + + # name = reversed zero‑padded index + "spool.dat" + rev = str(file_idx).zfill(10)[::-1] + fn = f"{rev}spool.dat" + with open(os.path.join(spool_set_path, fn), 'wb') as f: + f.write(buf.tobytes()) + + +def test_spool_convert(tmp_path, spool_dat, zarr_version): + expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "spool.nii.zarr" + spool.convert(inp=spool_dat, out=str(output), overlap=0) + + # assert_zarr_equal is assumed available from your test utils + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +def test_spool_regen_golden(tmp_path, spool_dat, zarr_version): + expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "spool_output.nii.zarr" + spool.convert(inp=spool_dat, out=str(output), overlap=0) + + # Write out new golden archive + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 2543b4ae..7ddfff60 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -2,20 +2,14 @@ import tempfile from pathlib import Path -import zarr - import test_lsm import test_wk +import zarr + from linc_convert.modalities.lsm import mosaic from linc_convert.modalities.wk import webknossos_annotation if __name__ == "__main__": - with tempfile.TemporaryDirectory() as tmp_dir: - test_lsm._write_test_data(tmp_dir) - output_zarr = os.path.join(tmp_dir, "output.zarr") - mosaic.convert(tmp_dir, output_zarr) - zarr.copy_all(zarr.open(output_zarr), zarr.open("data/lsm.zarr.zip", "w")) - with tempfile.TemporaryDirectory() as tmp_dir: test_wk._write_test_data(tmp_dir) From 171f02ee01f34015c1d098c01c3cedacfe166ba0 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:13:57 -0400 Subject: [PATCH 104/157] tests --- tests/utils/compare_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index d042c432..c58f7e8e 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -121,7 +121,7 @@ def assert_zarr_equal( f"Group attrs differ:\n ‣ {json.dumps(dict(zarr1.attrs))}\n ‣ {json.dumps(dict(zarr2.attrs))}") if set(zarr1.keys()) != set(zarr2.keys()): diffs.append( - f"Group keys differ:\n ‣ {set(zarr1.keys())}\n ‣ {set(zarr2.keys())}") + f"Group keys differ:\n ‣ {set(zarr1.keys())} in {zarr1.store_path}\n ‣ {set(zarr2.keys())} in {zarr2.store_path}") keys = set(zarr1.keys()).intersection(set(zarr2.keys())) for key in keys: From 45a7c8d198465c4367e18a034950457aae5411a3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:23:54 -0400 Subject: [PATCH 105/157] tests --- tests/test_df.py | 128 ------------------ tests/test_df_multi_slice.py | 55 ++++++++ tests/test_df_single_slice.py | 49 +++++++ tests/{test_lsm.py => test_lsm_mosaic.py} | 23 +--- tests/test_lsm_multi_slice.py | 30 +--- tests/test_lsm_spool.py | 4 +- ...{test_oct.py => test_oct_single_volume.py} | 0 7 files changed, 116 insertions(+), 173 deletions(-) delete mode 100644 tests/test_df.py create mode 100644 tests/test_df_multi_slice.py create mode 100644 tests/test_df_single_slice.py rename tests/{test_lsm.py => test_lsm_mosaic.py} (74%) rename tests/{test_oct.py => test_oct_single_volume.py} (100%) diff --git a/tests/test_df.py b/tests/test_df.py deleted file mode 100644 index 08c9d4b8..00000000 --- a/tests/test_df.py +++ /dev/null @@ -1,128 +0,0 @@ -import glob -import os -import shutil -from pathlib import Path - -import glymur -import numpy as np -import pytest -import skimage -import zarr - -from linc_convert.modalities.df import multi_slice, single_slice -from utils.compare_file import assert_zarr_equal -from utils.sample_data import generate_sample_data_variation - - -@pytest.fixture -def single_slice_jp2(tmp_path): - path = tmp_path / "slice.jp2" - image = skimage.data.brain().T[..., :3] - glymur.Jp2k( - path, - data=image, - ) - return path - - -@pytest.fixture -def multi_slice_jp2(tmp_path): - image = generate_sample_data_variation(3) - image = np.array(image).transpose(2, 3, 0, 1) - for i in range(4): - glymur.Jp2k( - f"{tmp_path}/slice{i:03d}.jp2", - data=image[..., i], - ) - files = glob.glob(str(os.path.join(tmp_path, "*.jp2"))) - files.sort() - return files - - -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/df_single_slice_zarr2.nii.zarr.zip"), - (3, "data/df_single_slice_zarr3.nii.zarr.zip"), - ], -) -def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, expected_zarr, - driver): - """ - Convert a single JP2 slice into a Zarr store and compare against golden. - """ - output = tmp_path / "single_slice.zarr" - single_slice.convert( - str(single_slice_jp2), - out=str(output), - zarr_version=zarr_version, - driver=driver - ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) - - -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/df_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/df_multi_slice_zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, expected_zarr, driver): - """ - Convert multiple JP2 slices into a Zarr store and compare against golden. - """ - output = tmp_path / "multi_slice.zarr" - multi_slice.convert( - multi_slice_jp2, - out=str(output), - zarr_version=zarr_version, - driver=driver - ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) - - -@pytest.mark.golden -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/df_single_slice_zarr2.nii.zarr.zip"), - (3, "data/df_single_slice_zarr3.nii.zarr.zip"), - ], -) -def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version, - expected_zarr): - output = tmp_path / "single_slice.zarr" - single_slice.convert( - str(single_slice_jp2), - out=str(output), - zarr_version=zarr_version, - ) - base = Path(expected_zarr).with_suffix("") - shutil.make_archive(str(base), "zip", str(output)) - - -@pytest.mark.golden -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/df_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/df_multi_slice_zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice_df_regen_golden(tmp_path, multi_slice_jp2, zarr_version, - expected_zarr): - output = tmp_path / "multi_slice.zarr" - multi_slice.convert( - multi_slice_jp2, - out=str(output), - zarr_version=zarr_version, - ) - base = Path(expected_zarr).with_suffix("") - shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_df_multi_slice.py b/tests/test_df_multi_slice.py new file mode 100644 index 00000000..e306b5f1 --- /dev/null +++ b/tests/test_df_multi_slice.py @@ -0,0 +1,55 @@ +import glob +import os +import shutil +from pathlib import Path + +import glymur +import numpy as np +import pytest +import zarr + +from linc_convert.modalities.df import multi_slice +from utils.compare_file import assert_zarr_equal +from utils.sample_data import generate_sample_data_variation + + +@pytest.fixture +def multi_slice_jp2(tmp_path): + image = generate_sample_data_variation(3) + image = np.array(image).transpose(2, 3, 0, 1) + for i in range(4): + glymur.Jp2k( + f"{tmp_path}/slice{i:03d}.jp2", + data=image[..., i], + ) + files = glob.glob(str(os.path.join(tmp_path, "*.jp2"))) + files.sort() + return files + + +def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, driver): + expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.zarr" + multi_slice.convert( + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + driver=driver + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +def test_multi_slice_df_regen_golden(tmp_path, multi_slice_jp2, zarr_version): + expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.zarr" + multi_slice.convert( + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_df_single_slice.py b/tests/test_df_single_slice.py new file mode 100644 index 00000000..fa6b35b5 --- /dev/null +++ b/tests/test_df_single_slice.py @@ -0,0 +1,49 @@ +import shutil +from pathlib import Path + +import glymur +import pytest +import skimage +import zarr + +from linc_convert.modalities.df import single_slice +from utils.compare_file import assert_zarr_equal + + +@pytest.fixture +def single_slice_jp2(tmp_path): + path = tmp_path / "slice.jp2" + image = skimage.data.brain().T[..., :3] + glymur.Jp2k( + path, + data=image, + ) + return path + + +def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, driver): + expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "single_slice.zarr" + single_slice.convert( + str(single_slice_jp2), + out=str(output), + zarr_version=zarr_version, + driver=driver + ) + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version): + expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "single_slice.zarr" + single_slice.convert( + str(single_slice_jp2), + out=str(output), + zarr_version=zarr_version, + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm.py b/tests/test_lsm_mosaic.py similarity index 74% rename from tests/test_lsm.py rename to tests/test_lsm_mosaic.py index 2902e190..8ffbdefb 100644 --- a/tests/test_lsm.py +++ b/tests/test_lsm_mosaic.py @@ -3,11 +3,10 @@ import numpy as np import pytest -import skimage import tifffile import zarr -from linc_convert.modalities.lsm import mosaic, spool +from linc_convert.modalities.lsm import mosaic from utils.compare_file import assert_zarr_equal from utils.sample_data import generate_sample_data_variation @@ -30,17 +29,11 @@ def mosaic_tiff(tmp_path): return root -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/lsm_mosaic_zarr2.nii.zarr.zip"), - (3, "data/lsm_mosaic_zarr3.nii.zarr.zip"), - ], -) -def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, expected_zarr, driver): +def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, driver): """ Convert multiple JP2 slices into a Zarr store and compare against golden. """ + expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( str(mosaic_tiff), @@ -55,14 +48,8 @@ def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, expected_zarr, driver): @pytest.mark.golden -@pytest.mark.parametrize( - ("zarr_version", "expected_zarr"), - [ - (2, "data/lsm_mosaic_zarr2.nii.zarr.zip"), - (3, "data/lsm_mosaic_zarr3.nii.zarr.zip"), - ], -) -def test_mosaic_lsm_regen_golden(tmp_path, mosaic_tiff, zarr_version, expected_zarr): +def test_mosaic_lsm_regen_golden(tmp_path, mosaic_tiff, zarr_version): + expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( str(mosaic_tiff), diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py index ea7212ed..afd96ce3 100644 --- a/tests/test_lsm_multi_slice.py +++ b/tests/test_lsm_multi_slice.py @@ -1,7 +1,6 @@ import shutil from pathlib import Path -import numpy as np import pytest import skimage import tifffile @@ -9,7 +8,6 @@ from linc_convert.modalities.lsm import multi_slice from utils.compare_file import assert_zarr_equal -from utils.sample_data import generate_sample_data_variation @pytest.fixture @@ -25,21 +23,12 @@ def multi_slice_tiff(tmp_path): return root -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/lsm_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/lsm_multi_slice_zarr3.nii.zarr.zip"), - ], -) def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, expected_zarr, driver): - """ - Convert multiple JP2 slices into a Zarr store and compare against golden. - """ - output = tmp_path / "multi_slice.zarr" + expected_zarr = f"data/lsm_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - multi_slice_tiff, + str(multi_slice_tiff), overlap=0, out=str(output), zarr_version=zarr_version, @@ -52,16 +41,9 @@ def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, expected_zarr @pytest.mark.golden -@pytest.mark.parametrize( - ("zarr_version", "expected_zarr"), - [ - (2, "data/lsm_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/lsm_multi_slice_zarr3.nii.zarr.zip"), - ], -) -def test_lsm_multi_slice_regen_golden(tmp_path, multi_slice_tiff, zarr_version, - expected_zarr): - output = tmp_path / "single_slice.zarr" +def test_lsm_multi_slice_regen_golden(tmp_path, multi_slice_tiff, zarr_version): + expected_zarr = f"data/lsm_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( str(multi_slice_tiff), overlap=0, diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index 87bf8ace..ff7d444e 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -5,12 +5,10 @@ import numpy as np import pytest import skimage -import tifffile import zarr -from linc_convert.modalities.lsm import mosaic, spool +from linc_convert.modalities.lsm import spool from utils.compare_file import assert_zarr_equal -from utils.sample_data import generate_sample_data_variation @pytest.fixture diff --git a/tests/test_oct.py b/tests/test_oct_single_volume.py similarity index 100% rename from tests/test_oct.py rename to tests/test_oct_single_volume.py From f93b95b70a41ad88df705abad2861690c93193bf Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:34:37 -0400 Subject: [PATCH 106/157] tests --- tests/test_df_multi_slice.py | 4 +- tests/test_df_single_slice.py | 4 +- tests/test_lsm_mosaic.py | 4 +- tests/test_lsm_multi_slice.py | 3 +- tests/test_lsm_spool.py | 4 +- tests/test_oct_multi_slice.py | 100 ++++++++++++++++++++++++++ tests/test_oct_single_volume.py | 124 +------------------------------- 7 files changed, 112 insertions(+), 131 deletions(-) create mode 100644 tests/test_oct_multi_slice.py diff --git a/tests/test_df_multi_slice.py b/tests/test_df_multi_slice.py index e306b5f1..f9ba2c24 100644 --- a/tests/test_df_multi_slice.py +++ b/tests/test_df_multi_slice.py @@ -27,7 +27,7 @@ def multi_slice_jp2(tmp_path): return files -def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, driver): +def test_df_multi_slice(tmp_path, multi_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.zarr" multi_slice.convert( @@ -43,7 +43,7 @@ def test_multi_slice_df(tmp_path, multi_slice_jp2, zarr_version, driver): @pytest.mark.golden -def test_multi_slice_df_regen_golden(tmp_path, multi_slice_jp2, zarr_version): +def test_df_multi_slice_regen_golden(tmp_path, multi_slice_jp2, zarr_version): expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.zarr" multi_slice.convert( diff --git a/tests/test_df_single_slice.py b/tests/test_df_single_slice.py index fa6b35b5..32bfdff0 100644 --- a/tests/test_df_single_slice.py +++ b/tests/test_df_single_slice.py @@ -21,7 +21,7 @@ def single_slice_jp2(tmp_path): return path -def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, driver): +def test_df_single_slice(tmp_path, single_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "single_slice.zarr" single_slice.convert( @@ -37,7 +37,7 @@ def test_single_slice_df(tmp_path, single_slice_jp2, zarr_version, driver): @pytest.mark.golden -def test_single_slice_df_regen_golden(tmp_path, single_slice_jp2, zarr_version): +def test_df_single_slice_regen_golden(tmp_path, single_slice_jp2, zarr_version): expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "single_slice.zarr" single_slice.convert( diff --git a/tests/test_lsm_mosaic.py b/tests/test_lsm_mosaic.py index 8ffbdefb..f52b2be8 100644 --- a/tests/test_lsm_mosaic.py +++ b/tests/test_lsm_mosaic.py @@ -29,7 +29,7 @@ def mosaic_tiff(tmp_path): return root -def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, driver): +def test_lsm_mosaic(tmp_path, mosaic_tiff, zarr_version, driver): """ Convert multiple JP2 slices into a Zarr store and compare against golden. """ @@ -48,7 +48,7 @@ def test_mosaic_lsm(tmp_path, mosaic_tiff, zarr_version, driver): @pytest.mark.golden -def test_mosaic_lsm_regen_golden(tmp_path, mosaic_tiff, zarr_version): +def test_lsm_mosaic_regen_golden(tmp_path, mosaic_tiff, zarr_version): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py index afd96ce3..c3ebeb80 100644 --- a/tests/test_lsm_multi_slice.py +++ b/tests/test_lsm_multi_slice.py @@ -23,8 +23,7 @@ def multi_slice_tiff(tmp_path): return root -def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, expected_zarr, - driver): +def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, driver): expected_zarr = f"data/lsm_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index ff7d444e..9c6e11b5 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -116,7 +116,7 @@ def write_zyla_spool_set( f.write(buf.tobytes()) -def test_spool_convert(tmp_path, spool_dat, zarr_version): +def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "spool.nii.zarr" spool.convert(inp=spool_dat, out=str(output), overlap=0) @@ -129,7 +129,7 @@ def test_spool_convert(tmp_path, spool_dat, zarr_version): @pytest.mark.golden -def test_spool_regen_golden(tmp_path, spool_dat, zarr_version): +def test_lsm_spool_regen_golden(tmp_path, spool_dat, zarr_version): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "spool_output.nii.zarr" spool.convert(inp=spool_dat, out=str(output), overlap=0) diff --git a/tests/test_oct_multi_slice.py b/tests/test_oct_multi_slice.py new file mode 100644 index 00000000..a541cce2 --- /dev/null +++ b/tests/test_oct_multi_slice.py @@ -0,0 +1,100 @@ +import glob +import shutil +from pathlib import Path + +import pytest +import skimage +import zarr.storage +from scipy.io import savemat + +from linc_convert.modalities.psoct import multi_slice +from utils.compare_file import assert_zarr_equal + + +@pytest.fixture +def multi_slice_mats(tmp_path): + """ + Create a set of temporary .mat files representing slices of a volume. + """ + dir_path = tmp_path / "slices" + dir_path.mkdir(parents=True, exist_ok=True) + + volume = skimage.data.brain().T + files = [] + for i in range(5): + file_path = dir_path / f"slice_{i:03d}.mat" + savemat(str(file_path), {"Psi_ObsLSQ": volume[..., i]}) + files.append(str(file_path)) + return sorted(files) + + +def test_oct_multi_slice(tmp_path, multi_slice_mats, zarr_version, driver): + expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.nii.zarr" + multi_slice.convert( + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver=driver, + ) + + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) + + +@pytest.mark.golden +def test_oct_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version): + expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "multi_slice.nii.zarr" + multi_slice.convert( + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) + + +@pytest.mark.heavy +def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driver): + multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" + expected_zarr = multi_slice_heavy_data_dir / f"zarr{zarr_version}.nii.zarr.zip" + files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) + files.sort() + output_zarr = tmp_path / "output.zarr" + multi_slice.convert( + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True, + driver=driver + ) + assert_zarr_equal( + str(output_zarr), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output_zarr)) + + +@pytest.mark.golden +@pytest.mark.heavy +def test_oct_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, + zarr_version): + multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" + expected_zarr = multi_slice_heavy_data_dir / f"zarr{zarr_version}.nii.zarr.zip" + files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) + files.sort() + output_zarr = tmp_path / "output.zarr" + multi_slice.convert( + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, + overwrite=True + ) + base = expected_zarr.with_suffix("") + shutil.make_archive(str(base), "zip", str(output_zarr)) diff --git a/tests/test_oct_single_volume.py b/tests/test_oct_single_volume.py index d3e79bc8..24ea2d63 100644 --- a/tests/test_oct_single_volume.py +++ b/tests/test_oct_single_volume.py @@ -1,4 +1,3 @@ -import glob import shutil from pathlib import Path @@ -7,7 +6,7 @@ import zarr.storage from scipy.io import savemat -from linc_convert.modalities.psoct import single_volume, multi_slice +from linc_convert.modalities.psoct import single_volume from utils.compare_file import assert_zarr_equal @@ -22,23 +21,6 @@ def single_volume_mat(tmp_path): return path -@pytest.fixture -def multi_slice_mats(tmp_path): - """ - Create a set of temporary .mat files representing slices of a volume. - """ - dir_path = tmp_path / "slices" - dir_path.mkdir(parents=True, exist_ok=True) - - volume = skimage.data.brain().T - files = [] - for i in range(5): - file_path = dir_path / f"slice_{i:03d}.mat" - savemat(str(file_path), {"Psi_ObsLSQ": volume[..., i]}) - files.append(str(file_path)) - return sorted(files) - - @pytest.mark.parametrize( "zarr_version, expected_zarr", [ @@ -46,7 +28,7 @@ def multi_slice_mats(tmp_path): (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, +def test_oct_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, driver): output = tmp_path / "single_volume.nii.zarr" @@ -66,32 +48,6 @@ def test_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, ) -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr, driver): - output = tmp_path / "multi_slice.nii.zarr" - - multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver=driver, - ) - - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ) - - @pytest.mark.golden @pytest.mark.parametrize( "zarr_version, expected_zarr", @@ -100,7 +56,7 @@ def test_multi_slice(tmp_path, multi_slice_mats, zarr_version, expected_zarr, dr (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), ], ) -def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, +def test_oct_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, expected_zarr): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. @@ -119,77 +75,3 @@ def test_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, shutil.make_archive(str(base), "zip", str(output)) -@pytest.mark.golden -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/oct_multi_slice_zarr2.nii.zarr.zip"), - (3, "data/oct_multi_slice_zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version, - expected_zarr): - """ - Rebuild multi-slice golden archives. Only run with --regenerate-golden. - """ - output = tmp_path / "multi_slice.nii.zarr" - multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver="zarr-python", - ) - base = Path(expected_zarr).with_suffix("") - shutil.make_archive(str(base), "zip", str(output)) - - -@pytest.mark.heavy -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "zarr2.nii.zarr.zip"), - (3, "zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, expected_zarr, - driver): - files = glob.glob(str(test_data_heavy_dir / "sub-test_oct_multi_slice" / "*.mat")) - files.sort() - expected_zarr = test_data_heavy_dir / "sub-test_oct_multi_slice" / expected_zarr - output_zarr = tmp_path / "output.zarr" - multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True, - driver=driver - ) - assert_zarr_equal( - str(output_zarr), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ) - base = Path(expected_zarr).with_suffix("") - shutil.make_archive(str(base), "zip", str(output_zarr)) - - -@pytest.mark.golden -@pytest.mark.heavy -@pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "zarr2.nii.zarr.zip"), - (3, "zarr3.nii.zarr.zip"), - ], -) -def test_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, zarr_version, - expected_zarr): - multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" - files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) - files.sort() - output_zarr = tmp_path / "output.zarr" - multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, - overwrite=True - ) - base = Path(multi_slice_heavy_data_dir / expected_zarr).with_suffix("") - shutil.make_archive(str(base), "zip", str(output_zarr)) From 0851a6386edeed003d1bf7382e7f6fbda3666c44 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:38:59 -0400 Subject: [PATCH 107/157] tests --- tests/test_lsm_spool.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index 9c6e11b5..2b1b82f4 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -117,7 +117,7 @@ def write_zyla_spool_set( def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): - expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" + expected_zarr = f"data/lsm_spool_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "spool.nii.zarr" spool.convert(inp=spool_dat, out=str(output), overlap=0) @@ -130,7 +130,7 @@ def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): @pytest.mark.golden def test_lsm_spool_regen_golden(tmp_path, spool_dat, zarr_version): - expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" + expected_zarr = f"data/lsm_spool_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "spool_output.nii.zarr" spool.convert(inp=spool_dat, out=str(output), overlap=0) From 22e2f1b67b33a361f9341a53cefe70878c77d277 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:49:17 -0400 Subject: [PATCH 108/157] style --- tests/test_df_multi_slice.py | 30 ++++++------ tests/test_df_single_slice.py | 30 ++++++------ tests/test_lsm_mosaic.py | 24 ++++----- tests/test_lsm_multi_slice.py | 28 +++++------ tests/test_lsm_spool.py | 11 +++-- tests/test_oct_multi_slice.py | 57 ++++++++++----------- tests/test_oct_single_volume.py | 68 +++++++++++++------------- tests/test_wk.py | 16 +++--- tests/utils/compare_file.py | 19 ++++--- tests/utils/generate_trusted_result.py | 8 ++- tests/utils/sample_data.py | 6 +-- 11 files changed, 151 insertions(+), 146 deletions(-) diff --git a/tests/test_df_multi_slice.py b/tests/test_df_multi_slice.py index f9ba2c24..2c41da0b 100644 --- a/tests/test_df_multi_slice.py +++ b/tests/test_df_multi_slice.py @@ -19,9 +19,9 @@ def multi_slice_jp2(tmp_path): image = np.array(image).transpose(2, 3, 0, 1) for i in range(4): glymur.Jp2k( - f"{tmp_path}/slice{i:03d}.jp2", - data=image[..., i], - ) + f"{tmp_path}/slice{i:03d}.jp2", + data=image[..., i], + ) files = glob.glob(str(os.path.join(tmp_path, "*.jp2"))) files.sort() return files @@ -31,15 +31,15 @@ def test_df_multi_slice(tmp_path, multi_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.zarr" multi_slice.convert( - multi_slice_jp2, - out=str(output), - zarr_version=zarr_version, - driver=driver - ) + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + driver=driver + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) @pytest.mark.golden @@ -47,9 +47,9 @@ def test_df_multi_slice_regen_golden(tmp_path, multi_slice_jp2, zarr_version): expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.zarr" multi_slice.convert( - multi_slice_jp2, - out=str(output), - zarr_version=zarr_version, - ) + multi_slice_jp2, + out=str(output), + zarr_version=zarr_version, + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_df_single_slice.py b/tests/test_df_single_slice.py index 32bfdff0..2b893934 100644 --- a/tests/test_df_single_slice.py +++ b/tests/test_df_single_slice.py @@ -15,9 +15,9 @@ def single_slice_jp2(tmp_path): path = tmp_path / "slice.jp2" image = skimage.data.brain().T[..., :3] glymur.Jp2k( - path, - data=image, - ) + path, + data=image, + ) return path @@ -25,15 +25,15 @@ def test_df_single_slice(tmp_path, single_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "single_slice.zarr" single_slice.convert( - str(single_slice_jp2), - out=str(output), - zarr_version=zarr_version, - driver=driver - ) + str(single_slice_jp2), + out=str(output), + zarr_version=zarr_version, + driver=driver + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) @pytest.mark.golden @@ -41,9 +41,9 @@ def test_df_single_slice_regen_golden(tmp_path, single_slice_jp2, zarr_version): expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "single_slice.zarr" single_slice.convert( - str(single_slice_jp2), - out=str(output), - zarr_version=zarr_version, - ) + str(single_slice_jp2), + out=str(output), + zarr_version=zarr_version, + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_mosaic.py b/tests/test_lsm_mosaic.py index f52b2be8..1e60aae6 100644 --- a/tests/test_lsm_mosaic.py +++ b/tests/test_lsm_mosaic.py @@ -36,15 +36,15 @@ def test_lsm_mosaic(tmp_path, mosaic_tiff, zarr_version, driver): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( - str(mosaic_tiff), - out=str(output), - zarr_version=zarr_version, - driver=driver - ) + str(mosaic_tiff), + out=str(output), + zarr_version=zarr_version, + driver=driver + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) @pytest.mark.golden @@ -52,9 +52,9 @@ def test_lsm_mosaic_regen_golden(tmp_path, mosaic_tiff, zarr_version): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( - str(mosaic_tiff), - out=str(output), - zarr_version=zarr_version, - ) + str(mosaic_tiff), + out=str(output), + zarr_version=zarr_version, + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py index c3ebeb80..bc53f1a3 100644 --- a/tests/test_lsm_multi_slice.py +++ b/tests/test_lsm_multi_slice.py @@ -27,16 +27,16 @@ def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, driver): expected_zarr = f"data/lsm_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - str(multi_slice_tiff), - overlap=0, - out=str(output), - zarr_version=zarr_version, - driver=driver - ) + str(multi_slice_tiff), + overlap=0, + out=str(output), + zarr_version=zarr_version, + driver=driver + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) @pytest.mark.golden @@ -44,10 +44,10 @@ def test_lsm_multi_slice_regen_golden(tmp_path, multi_slice_tiff, zarr_version): expected_zarr = f"data/lsm_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - str(multi_slice_tiff), - overlap=0, - out=str(output), - zarr_version=zarr_version, - ) + str(multi_slice_tiff), + overlap=0, + out=str(output), + zarr_version=zarr_version, + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index 2b1b82f4..e5240ea0 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -31,7 +31,7 @@ def write_zyla_spool_set( *, pixel_encoding: str = 'Mono16', images_per_file: int = None, -): + ): """ Given `image` of shape (numDepths, numColumns, numFrames), create a Zyla‑compatible spool directory at `spool_set_path` @@ -47,7 +47,8 @@ def write_zyla_spool_set( pixel_encoding : {'Mono16','Mono8'} Selects dtype and controls AOIStride = numColumns * itemsize. images_per_file : int, optional - How many frames to pack into each spool file. Defaults to all frames in one file. + How many frames to pack into each spool file. Defaults to all frames in one + file. """ numDepths, numColumns, numFrames = image.shape if images_per_file is None: @@ -123,9 +124,9 @@ def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): # assert_zarr_equal is assumed available from your test utils assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) @pytest.mark.golden diff --git a/tests/test_oct_multi_slice.py b/tests/test_oct_multi_slice.py index a541cce2..063e6a8f 100644 --- a/tests/test_oct_multi_slice.py +++ b/tests/test_oct_multi_slice.py @@ -32,19 +32,19 @@ def test_oct_multi_slice(tmp_path, multi_slice_mats, zarr_version, driver): expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver=driver, - ) + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver=driver, + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) @pytest.mark.golden @@ -52,14 +52,14 @@ def test_oct_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version): expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver="zarr-python", - ) + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) @@ -72,13 +72,14 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True, - driver=driver - ) + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, + overwrite=True, + driver=driver + ) assert_zarr_equal( - str(output_zarr), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + str(output_zarr), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) @@ -93,8 +94,8 @@ def test_oct_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, - overwrite=True - ) + files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, + overwrite=True + ) base = expected_zarr.with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) diff --git a/tests/test_oct_single_volume.py b/tests/test_oct_single_volume.py index 24ea2d63..c196baf8 100644 --- a/tests/test_oct_single_volume.py +++ b/tests/test_oct_single_volume.py @@ -22,56 +22,54 @@ def single_volume_mat(tmp_path): @pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), - (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), - ], -) + "zarr_version, expected_zarr", + [ + (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), + (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), + ], + ) def test_oct_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, - driver): + driver): output = tmp_path / "single_volume.nii.zarr" single_volume.convert( - str(single_volume_mat), - out=str(output), - key="volume", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver=driver, - ) + str(single_volume_mat), + out=str(output), + key="volume", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver=driver, + ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), + ) @pytest.mark.golden @pytest.mark.parametrize( - "zarr_version, expected_zarr", - [ - (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), - (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), - ], -) + "zarr_version, expected_zarr", + [ + (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), + (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), + ], + ) def test_oct_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, - expected_zarr): + expected_zarr): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. """ output = tmp_path / "single_volume.nii.zarr" single_volume.convert( - str(single_volume_mat), - out=str(output), - key="volume", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver="zarr-python", - ) + str(single_volume_mat), + out=str(output), + key="volume", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) - - diff --git a/tests/test_wk.py b/tests/test_wk.py index cba82298..fdc43847 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -37,12 +37,12 @@ def _write_test_data(directory: str) -> None: {"name": "z", "type": "space", "unit": "millimeter"}, {"name": "y", "type": "space", "unit": "micrometer"}, {"name": "x", "type": "space", "unit": "micrometer"}, - ], + ], "datasets": [], "type": "jpeg2000", "name": "", - } - ] + } + ] for n in range(5): multiscales[0]["datasets"].append({}) level = multiscales[0]["datasets"][-1] @@ -56,8 +56,8 @@ def _write_test_data(directory: str) -> None: 1.0, float(2 ** n), float(2 ** n), - ], - }, + ], + }, { "type": "translation", "translation": [ @@ -65,9 +65,9 @@ def _write_test_data(directory: str) -> None: 0.0, float(2 ** n - 1) * 0.5, float(2 ** n - 1) * 0.5, - ], - }, - ] + ], + }, + ] omz.attrs["multiscales"] = multiscales diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index c58f7e8e..93b60977 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -11,7 +11,8 @@ def load_file(path): """ Load data from a file based on its extension. - Supports .nii, .nii.gz (via nibabel), .mat (via scipy.io), and .zarr (via zarr-python). + Supports .nii, .nii.gz (via nibabel), .mat (via scipy.io), and .zarr (via + zarr-python). """ ext = os.path.splitext(path)[1].lower() # Handle .nii and .nii.gz @@ -37,7 +38,8 @@ def load_file(path): keys = [k for k in mat.keys() if not k.startswith('__')] if len(keys) != 1: print( - f"Error: Expected one variable in the MAT file, found {len(keys)}: {keys}") + f"Error: Expected one variable in the MAT file, found " + f"{len(keys)}: {keys}") sys.exit(1) return mat[keys[0]] @@ -99,7 +101,8 @@ def assert_zarr_equal( store2: Union[str, zarr.storage.StoreLike], ignore_nii: bool = False) -> None: """ - Assert that two Zarr groups—opened from either a path or a store—have identical contents. + Assert that two Zarr groups—opened from either a path or a store—have identical + contents. Parameters ---------- @@ -118,10 +121,12 @@ def assert_zarr_equal( if dict(zarr1.attrs) != dict(zarr2.attrs): diffs.append( - f"Group attrs differ:\n ‣ {json.dumps(dict(zarr1.attrs))}\n ‣ {json.dumps(dict(zarr2.attrs))}") + f"Group attrs differ:\n ‣ {json.dumps(dict(zarr1.attrs))}\n ‣ " + f"{json.dumps(dict(zarr2.attrs))}") if set(zarr1.keys()) != set(zarr2.keys()): diffs.append( - f"Group keys differ:\n ‣ {set(zarr1.keys())} in {zarr1.store_path}\n ‣ {set(zarr2.keys())} in {zarr2.store_path}") + f"Group keys differ:\n ‣ {set(zarr1.keys())} in {zarr1.store_path}\n " + f"‣ {set(zarr2.keys())} in {zarr2.store_path}") keys = set(zarr1.keys()).intersection(set(zarr2.keys())) for key in keys: @@ -134,7 +139,9 @@ def assert_zarr_equal( elif isinstance(obj1, zarr.Array): if dict(obj1.attrs) != dict(obj2.attrs): diffs.append( - f"Attributes for key '{key}' differ:\n ‣ {dict(obj1.attrs)}\n ‣ {dict(obj2.attrs)}") + f"Attributes for key '{key}' differ:\n" + f" ‣ {dict(obj1.attrs)}\n" + f" ‣ {dict(obj2.attrs)}") try: np.testing.assert_array_equal(obj1[:], obj2[:]) except AssertionError as e: diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 7ddfff60..1bcdbada 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -2,11 +2,9 @@ import tempfile from pathlib import Path -import test_lsm -import test_wk import zarr -from linc_convert.modalities.lsm import mosaic +import test_wk from linc_convert.modalities.wk import webknossos_annotation if __name__ == "__main__": @@ -20,8 +18,8 @@ basename = os.path.basename(ome_dir)[:-9] initials = wkw_dir.split("/")[-2][:2] output_zarr = os.path.join( - tmp_dir, basename + "_dsec_" + initials + ".ome.zarr" - ) + tmp_dir, basename + "_dsec_" + initials + ".ome.zarr" + ) webknossos_annotation.convert(wkw_dir, ome_dir, tmp_dir, "{}") zarr.copy_all(zarr.open(output_zarr), zarr.open("data/wk.zarr.zip", "w")) diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py index 6107551e..f869d008 100644 --- a/tests/utils/sample_data.py +++ b/tests/utils/sample_data.py @@ -8,7 +8,7 @@ def sample_data_variation( param: float, image: Optional[np.ndarray] = None, output_dtype: Optional[np.dtype] = None -) -> np.ndarray: + ) -> np.ndarray: """ Scale global intensity by (1+param), then wrap values modulo the output dtype range. @@ -54,7 +54,7 @@ def generate_sample_data_variation( param_range: Tuple[float, float] = (-0.95, 0.95), image: Optional[np.ndarray] = None, output_dtype: Optional[np.dtype] = None -) -> List[np.ndarray]: + ) -> List[np.ndarray]: """ Generate `n` deterministic, wrapped‐intensity variations. @@ -80,4 +80,4 @@ def generate_sample_data_variation( return [ sample_data_variation(p, image=image, output_dtype=output_dtype) for p in params - ] + ] From e069e876405160342beecc0159f42f824316ba97 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 13:50:40 -0400 Subject: [PATCH 109/157] style --- linc_convert/__init__.py | 3 +- linc_convert/modalities/__init__.py | 1 + linc_convert/modalities/df/multi_slice.py | 26 ++--- linc_convert/modalities/df/single_slice.py | 4 +- linc_convert/modalities/lsm/__init__.py | 1 + linc_convert/modalities/lsm/mosaic.py | 86 ++++++++-------- linc_convert/modalities/lsm/multi_slice.py | 59 +++++------ linc_convert/modalities/lsm/spool.py | 69 +++++++------ linc_convert/modalities/psoct/_utils.py | 4 +- linc_convert/modalities/psoct/multi_slice.py | 17 ++-- .../modalities/psoct/single_volume.py | 14 +-- linc_convert/modalities/wk/__init__.py | 2 +- .../modalities/wk/webknossos_annotation.py | 75 +++++++------- linc_convert/utils/chunk_processing.py | 3 +- linc_convert/utils/io/_array_wrapper.py | 6 +- linc_convert/utils/io/generate_pyramid.py | 77 ++++++++------- linc_convert/utils/io/spool.py | 13 +-- linc_convert/utils/io/zarr/abc.py | 18 ++-- .../utils/io/zarr/drivers/tensorstore.py | 86 ++++++++-------- .../utils/io/zarr/drivers/zarr_python.py | 63 ++++++------ linc_convert/utils/io/zarr/factory.py | 14 +-- linc_convert/utils/logging.py | 11 ++- linc_convert/utils/orientation.py | 4 +- linc_convert/utils/unit.py | 98 +++++++++---------- linc_convert/utils/zarr_config.py | 6 +- 25 files changed, 389 insertions(+), 371 deletions(-) diff --git a/linc_convert/__init__.py b/linc_convert/__init__.py index 812c643e..2d53f363 100644 --- a/linc_convert/__init__.py +++ b/linc_convert/__init__.py @@ -1,4 +1,5 @@ """Data conversion tools for the LINC project.""" __all__ = ["modalities", "utils"] -from . import utils, modalities + +from . import modalities, utils diff --git a/linc_convert/modalities/__init__.py b/linc_convert/modalities/__init__.py index 0c741d82..9e16b930 100644 --- a/linc_convert/modalities/__init__.py +++ b/linc_convert/modalities/__init__.py @@ -1,4 +1,5 @@ """Converters for all imaging modalities.""" __all__ = ["df", "lsm", "wk", "psoct"] + from . import df, lsm, psoct, wk diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index a28834ca..2bb86770 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -18,9 +18,9 @@ # internals from linc_convert.modalities.df.cli import df from linc_convert.utils.io.j2k import WrappedJ2K, get_pixelsize +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.math import ceildiv, floordiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.io.zarr import from_config from linc_convert.utils.zarr_config import ZarrConfig, update_default_config HOME = "/space/aspasia/2/users/linc/000003" @@ -43,7 +43,7 @@ def convert( center: bool = True, thickness: float | None = None, **kwargs -) -> None: + ) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. @@ -129,15 +129,15 @@ def convert( subdat = WrappedJ2K(j2k, level=level) subdat_size = subdat.shape print( - "Convert level", - level, - "with shape", - shape, - "for slice", - idx, - "with size", - subdat_size, - ) + "Convert level", + level, + "with shape", + shape, + "for slice", + idx, + "with size", + subdat_size, + ) # offset while attaching x = floordiv(shape[-2] - subdat_size[-2], 2) @@ -160,11 +160,11 @@ def convert( start_x, end_x = ( i * max_load, min((i + 1) * max_load, subdat_size[-2]), - ) + ) start_y, end_y = ( j * max_load, min((j + 1) * max_load, subdat_size[-1]), - ) + ) array[ channel, diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 131eb749..9d3304a8 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -16,9 +16,9 @@ # internals from linc_convert.modalities.df.cli import df from linc_convert.utils.io.j2k import WrappedJ2K, get_pixelsize +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.io.zarr import from_config from linc_convert.utils.zarr_config import ZarrConfig, update_default_config ss = App(name="singleslice", help_format="markdown") @@ -35,7 +35,7 @@ def convert( center: bool = True, thickness: float | None = None, **kwargs -) -> None: + ) -> None: """ Convert a JPEG2000 file generated by MBF-Neurolucida into a Zarr pyramid. diff --git a/linc_convert/modalities/lsm/__init__.py b/linc_convert/modalities/lsm/__init__.py index c605f13d..402fb20f 100644 --- a/linc_convert/modalities/lsm/__init__.py +++ b/linc_convert/modalities/lsm/__init__.py @@ -4,6 +4,7 @@ import tifffile as _ # noqa: F401 __all__ = ["cli", "mosaic", "multi_slice", "spool"] + from . import cli, mosaic, multi_slice, spool except ImportError: pass diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index cb894856..1fe6e97e 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -17,9 +17,9 @@ # internals from linc_convert.modalities.lsm.cli import lsm +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.zarr_config import ZarrConfig, update_default_config -from linc_convert.utils.io.zarr import from_config mosaic = cyclopts.App(name="mosaic", help_format="markdown") lsm.command(mosaic) @@ -27,16 +27,16 @@ @mosaic.default def convert( - inp: str, - *, - zarr_config: ZarrConfig = None, - max_load: int = 512, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - voxel_size: list[float] = (1, 1, 1), - **kwargs -) -> None: + inp: str, + *, + zarr_config: ZarrConfig = None, + max_load: int = 512, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + voxel_size: list[float] = (1, 1, 1), + **kwargs + ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into ZARR. @@ -83,26 +83,27 @@ def convert( max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" r"_z(?P[0-9]+)" r"_y(?P[0-9]+)" r"(?P\w*)$" - ) + r"^(?P\w*)" r"_z(?P[0-9]+)" r"_y(?P[0-9]+)" r"(" + r"?P\w*)$" + ) all_chunks_dirnames = list(sorted(glob(os.path.join(inp, "*_z*_y*")))) all_chunks_info = dict( - dirname=[], - prefix=[], - suffix=[], - z=[], - y=[], - planes=[ - dict( - fname=[], - z=[], - c=[], - yx_shape=[], + dirname=[], + prefix=[], + suffix=[], + z=[], + y=[], + planes=[ + dict( + fname=[], + z=[], + c=[], + yx_shape=[], + ) + for _ in range(len(all_chunks_dirnames)) + ], ) - for _ in range(len(all_chunks_dirnames)) - ], - ) # parse all directory names for dirname in all_chunks_dirnames: @@ -127,18 +128,18 @@ def convert( for ychunk in range(nchunky): for i in range(len(all_chunks_info["dirname"])): if ( - all_chunks_info["z"][i] == zchunk + 1 - and all_chunks_info["y"][i] == ychunk + 1 + all_chunks_info["z"][i] == zchunk + 1 + and all_chunks_info["y"][i] == ychunk + 1 ): break dirname = all_chunks_info["dirname"][i] planes_filenames = list(sorted(glob(os.path.join(dirname, "*.tiff")))) PLANE_PATTERN = re.compile( - os.path.basename(dirname) + r"_plane(?P[0-9]+)" - r"_c(?P[0-9]+)" - r".tiff$" - ) + os.path.basename(dirname) + r"_plane(?P[0-9]+)" + r"_c(?P[0-9]+)" + r".tiff$" + ) for fname in planes_filenames: parsed = PLANE_PATTERN.fullmatch(os.path.basename(fname)) @@ -177,7 +178,8 @@ def convert( fullshape[2] = allshapes[0][0][2] omz = from_config(zarr_config) - arr = omz.create_array("0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config) + arr = omz.create_array("0", shape=[nchannels, *fullshape], dtype="float64", + zarr_config=zarr_config) print("Write level 0 with shape", [nchannels, *fullshape]) for i, dirname in enumerate(all_chunks_info["dirname"]): @@ -191,20 +193,20 @@ def convert( zstart = sum(shape[0][0] for shape in allshapes[:chunkz]) ystart = sum( - shape[1] - for shape in allshapes[chunkz][:chunky] - ) + shape[1] + for shape in allshapes[chunkz][:chunky] + ) print( - f"Write plane " - f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", - end="\r", - ) + f"Write plane " + f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", + end="\r", + ) slicer = ( subc, zstart + subz, slice(ystart, ystart + yx_shape[0]), slice(None), - ) + ) f = TiffFile(fname) arr[slicer] = f.asarray() diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index 0a146274..66b5752a 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -18,8 +18,8 @@ # internals from linc_convert.modalities.lsm.cli import lsm -from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.io.zarr import from_config +from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.zarr_config import ZarrConfig, update_default_config multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") @@ -28,17 +28,17 @@ @multi_slice.default def convert( - inp: str, - *, - zarr_config: ZarrConfig = None, - overlap: int = 30, - max_load: int = 512, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - voxel_size: list[float] = (1, 1, 1), - **kwargs -) -> None: + inp: str, + *, + zarr_config: ZarrConfig = None, + overlap: int = 30, + max_load: int = 512, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + voxel_size: list[float] = (1, 1, 1), + **kwargs + ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into a Zarr. @@ -94,8 +94,9 @@ def convert( max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" r"_y(?P[0-9]+)" r"_z(?P[0-9]+)" r"(?P\w*)$" - ) + r"^(?P\w*)" r"_y(?P[0-9]+)" r"_z(?P[0-9]+)" r"(" + r"?P\w*)$" + ) all_chunks_filenames = list(sorted(glob(os.path.join(inp, "*_y*_z*.tiff")))) all_chunks_info = dict(filename=[], prefix=[], suffix=[], z=[], y=[]) @@ -103,8 +104,8 @@ def convert( # parse all directory names for filename in all_chunks_filenames: parsed = CHUNK_PATTERN.fullmatch( - os.path.splitext(os.path.basename(filename))[0] - ) + os.path.splitext(os.path.basename(filename))[0] + ) all_chunks_info["filename"].append(filename) all_chunks_info["prefix"].append(parsed.group("prefix")) all_chunks_info["suffix"].append(parsed.group("suffix")) @@ -113,7 +114,7 @@ def convert( # default output name zarr_config.set_default_name( - all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0]) + all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0]) # parse all individual file names nchunkz = max(all_chunks_info["z"]) @@ -125,8 +126,8 @@ def convert( for ychunk in range(nchunky): for i in range(len(all_chunks_info["filename"])): if ( - all_chunks_info["z"][i] == zchunk + 1 - and all_chunks_info["y"][i] == ychunk + 1 + all_chunks_info["z"][i] == zchunk + 1 + and all_chunks_info["y"][i] == ychunk + 1 ): break filename = all_chunks_info["filename"][i] @@ -148,8 +149,8 @@ def convert( fullshape = [0, 0, 0] fullshape[0] = sum(shape[0][0] for shape in allshapes) fullshape[1] = ( - sum(shape[1] for shape in allshapes[0]) - - (len(set(all_chunks_info["y"])) - 1) * overlap + sum(shape[1] for shape in allshapes[0]) + - (len(set(all_chunks_info["y"])) - 1) * overlap ) fullshape[2] = allshapes[0][0][2] @@ -170,10 +171,10 @@ def convert( pages = f.pages dat = f.asarray() - if len(set(all_chunks_info["y"])) != 1 and overlap!=0: + if len(set(all_chunks_info["y"])) != 1 and overlap != 0: if chunky != 0: - dat = dat[:, overlap // 2 :, :] - if chunky != max(all_chunks_info["y"])-1: + dat = dat[:, overlap // 2:, :] + if chunky != max(all_chunks_info["y"]) - 1: dat = dat[:, :-overlap // 2 - (overlap % 2), :] zstart = sum(shape[chunky][0] for shape in allshapes[:chunkz]) @@ -181,15 +182,15 @@ def convert( if chunky != 0: ystart += overlap // 2 print( - f"Write plane " - f"( {zstart} :{zstart+len(pages)}, {ystart}:{ystart + dat.shape[1]})", - end="\r", - ) + f"Write plane " + f"( {zstart} :{zstart + len(pages)}, {ystart}:{ystart + dat.shape[1]})", + end="\r", + ) slicer = ( slice(zstart, zstart + len(pages)), slice(ystart, ystart + dat.shape[1]), slice(None), - ) + ) array[slicer] = dat print("") omz.generate_pyramid(mode="median") diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 5d4f0b36..2b6f429b 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -2,7 +2,7 @@ import os import re import warnings -from collections import namedtuple, defaultdict +from collections import defaultdict, namedtuple from glob import glob # externals @@ -13,18 +13,17 @@ # internals from linc_convert.modalities.lsm.cli import lsm +from linc_convert.utils.io.spool import SpoolSetInterpreter from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine -from linc_convert.utils.io.spool import SpoolSetInterpreter from linc_convert.utils.zarr_config import ZarrConfig, update_default_config -from linc_convert.utils.io.zarr.drivers.zarr_python import open_zarr_group, \ - create_array spool = cyclopts.App(name="spool", help_format="markdown") lsm.command(spool) """ -Convert a collection of spool .dat files generated by the LSM pipeline into either a NIfTI-Zarr or OME-Zarr. +Convert a collection of spool .dat files generated by the LSM pipeline into either a +NIfTI-Zarr or OME-Zarr. Example input files can be found at https://lincbrain.org/dandiset/000010/draft/files?location=sourcedata%2Frawdata%2Fmicr%2Fsample18_run10__y10_z01_HR&page=1 @@ -41,7 +40,7 @@ def convert( voxel_size: list[float] = (1, 1, 1), zarr_config: ZarrConfig | None = None, **kwargs -) -> None: + ) -> None: """ Convert a collection of spool files generated by the LSM pipeline into Zarr. @@ -90,13 +89,13 @@ def convert( zarr_config = update_default_config(zarr_config, **kwargs) CHUNK_PATTERN = re.compile( - r"^(?P\w*)" - r"_run(?P[0-9]+)" - r"_?" - r"_y(?P[0-9]+)" - r"_z(?P[0-9]+)" - r"(?P\w*)$" - ) + r"^(?P\w*)" + r"_run(?P[0-9]+)" + r"_?" + r"_y(?P[0-9]+)" + r"_z(?P[0-9]+)" + r"(?P\w*)$" + ) all_tiles_folders_names = sorted(glob(os.path.join(inp, "*_y*_z*_HR/"))) if not all_tiles_folders_names: @@ -105,28 +104,28 @@ def convert( all_tiles_info = [] tiles_info_by_index = {} TileInfo = namedtuple( - "TileInfo", - ["prefix", "run", "y", "z", "suffix", "filename", "reader"] - ) + "TileInfo", + ["prefix", "run", "y", "z", "suffix", "filename", "reader"] + ) for tile_folder_name in all_tiles_folders_names: tile_folder_name = tile_folder_name.rstrip("/") parsed = CHUNK_PATTERN.fullmatch(os.path.basename(tile_folder_name)) tile = TileInfo( - parsed.group("prefix"), - int(parsed.group("run")), - int(parsed.group("y")), - int(parsed.group("z")), - parsed.group("suffix"), - tile_folder_name, - SpoolSetInterpreter(tile_folder_name, tile_folder_name+"_info.mat") - ) + parsed.group("prefix"), + int(parsed.group("run")), + int(parsed.group("y")), + int(parsed.group("z")), + parsed.group("suffix"), + tile_folder_name, + SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat") + ) all_tiles_info.append(tile) # Check for duplicate tiles if (tile.y, tile.z) in tiles_info_by_index: raise ValueError( - f"Duplicate tile, file {tile.filename} conflicts with " - f"{tiles_info_by_index[(tile.y, tile.z)].filename}" - ) + f"Duplicate tile, file {tile.filename} conflicts with " + f"{tiles_info_by_index[(tile.y, tile.z)].filename}" + ) tiles_info_by_index[(tile.y, tile.z)] = tile # Set default output path if not provided @@ -175,7 +174,7 @@ def convert( if diff_sx.any(): y_idxs, z_idxs = np.where(diff_sx) raise ValueError( - f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}") for y_tile in range(min_y_tile, max_y_tile + 1): if y_tile not in expected_sy: raise ValueError(f"Missing y tile {y_tile}") @@ -183,7 +182,7 @@ def convert( if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sy) raise ValueError( - f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}") for z_tile in range(min_z_tile, max_z_tile + 1): if z_tile not in expected_sz: raise ValueError(f"Missing z tile {z_tile}") @@ -191,7 +190,7 @@ def convert( if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sz) raise ValueError( - f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}") # Calculate full dataset dimensions full_shape_x = expected_sx @@ -225,15 +224,15 @@ def convert( if rel_y != 0: ystart += overlap // 2 print( - f"Write plane " - f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:{ystart + dat.shape[1]})", - end="\r", - ) + f"Write plane " + f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:{ystart + dat.shape[1]})", + end="\r", + ) slicer = ( slice(zstart, zstart + dat.shape[0]), slice(ystart, ystart + dat.shape[1]), slice(None), - ) + ) array[slicer] = dat print("") diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index f7edb4e4..08d7b8ec 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -31,7 +31,7 @@ def make_json(oct_meta: str) -> dict: def _parse_value_unit( string: str, n: int = None - ) -> tuple[float | list[float], str | Any]: + ) -> tuple[float | list[float], str | Any]: number = r"-?(\d+\.?\d*|\d*\.?\d+)(E-?\d+)?" value = "x".join([number] * (n or 1)) match = re.fullmatch(r"(?P" + value + r")(?P\w*)", string) @@ -45,7 +45,7 @@ def _parse_value_unit( "BodyPart": "BRAIN", "Environment": "exvivo", "SampleStaining": "none", - } + } for line in oct_meta.split("\n"): if ":" not in line: diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index a58d8e84..3e66ea76 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -19,13 +19,13 @@ from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.io._array_wrapper import _ArrayWrapper, _H5ArrayWrapper, \ - _MatArrayWrapper +from linc_convert.utils.io._array_wrapper import (_ArrayWrapper, _H5ArrayWrapper, + _MatArrayWrapper) +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit from linc_convert.utils.zarr_config import ZarrConfig, update_default_config -from linc_convert.utils.io.zarr import from_config logger = logging.getLogger(__name__) multi_slice = cyclopts.App(name="multi_slice", help_format="markdown") @@ -70,7 +70,7 @@ def convert( dtype: Optional[str] = None, zarr_config: ZarrConfig = None, **kwargs -) -> None: + ) -> None: """ Matlab to OME-Zarr. @@ -143,9 +143,10 @@ def convert( j * chunk_size[1]: (j + 1) * chunk_size[1], ] logger.info( - f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: {k + 1:03d}] " - f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" - ) + f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: " + f"{k + 1:03d}] " + f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" + ) z_start = k * chunk_size[0] z_end = z_start + loaded_chunk.shape[-2] y_start = j * chunk_size[1] @@ -169,7 +170,7 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get( - "multiscales")) + "multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 684e54e3..89430533 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -18,13 +18,13 @@ from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.io._array_wrapper import _ArrayWrapper, _MatArrayWrapper, \ - _H5ArrayWrapper from linc_convert.utils.chunk_processing import chunk_slice_generator +from linc_convert.utils.io._array_wrapper import (_ArrayWrapper, _H5ArrayWrapper, + _MatArrayWrapper) +from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit from linc_convert.utils.zarr_config import ZarrConfig, update_default_config -from linc_convert.utils.io.zarr import from_config logger = logging.getLogger(__name__) single_volume = cyclopts.App(name="single_volume", help_format="markdown") @@ -71,7 +71,7 @@ def convert( center: bool = True, zarr_config: ZarrConfig = None, **kwargs -) -> None: + ) -> None: """ Matlab to OME-Zarr. @@ -138,8 +138,8 @@ def convert( for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): logger.info( - f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] - ) + f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] + ) loaded_chunk = inp[slc] dataset[slc] = loaded_chunk @@ -155,7 +155,7 @@ def convert( arr = zgroup["0"] header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get( - "multiscales")) + "multiscales")) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/wk/__init__.py b/linc_convert/modalities/wk/__init__.py index 728fe3af..0eaf5831 100644 --- a/linc_convert/modalities/wk/__init__.py +++ b/linc_convert/modalities/wk/__init__.py @@ -1,10 +1,10 @@ """Webknossos annotation converters.""" - try: import wkw as _ # noqa: F401 __all__ = ["cli", "webknossos_annotation"] + from . import cli, webknossos_annotation except ImportError: pass diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index 65cbccde..f16c5263 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -8,15 +8,14 @@ import cyclopts import numpy as np - # externals import wkw import zarr # internals from linc_convert.modalities.wk.cli import wk -from linc_convert.utils.math import ceildiv from linc_convert.utils.io.zarr.drivers.zarr_python import make_compressor +from linc_convert.utils.math import ceildiv webknossos = cyclopts.App(name="webknossos", help_format="markdown") wk.command(webknossos) @@ -24,16 +23,16 @@ @webknossos.default def convert( - wkw_dir: str = None, - ome_dir: str = None, - out: str = None, - dic: str = None, - *, - chunk: int = 1024, - compressor: str = "blosc", - compressor_opt: str = "{}", - max_load: int = 16384, -) -> None: + wkw_dir: str = None, + ome_dir: str = None, + out: str = None, + dic: str = None, + *, + chunk: int = 1024, + compressor: str = "blosc", + compressor_opt: str = "{}", + max_load: int = 16384, + ) -> None: """ Convert annotations (in .wkw format) from webknossos to ome.zarr format. @@ -83,8 +82,8 @@ def convert( for idx in range(n): offset_x, offset_y = 0, 0 data = wkw_dataset.read( - off=(offset_y, offset_x, idx), shape=[size[1], size[0], 1] - ) + off=(offset_y, offset_x, idx), shape=[size[1], size[0], 1] + ) data = data[0, :, :, 0] data = np.transpose(data, (1, 0)) [t0, b0, l0, r0] = find_borders(data) @@ -113,7 +112,7 @@ def convert( "dtype": "uint8", "fill_value": None, "compressor": make_compressor(compressor, **compressor_opt), - } + } print(opt) # Write each level @@ -136,7 +135,7 @@ def convert( top, bottom, left, right = [ k * 2 ** (nblevel - level - 1) for k in low_res_offsets[idx] - ] + ] height, width = size[0] - top - bottom, size[1] - left - right data = wkw_dataset.read(off=(left, top, idx), shape=[width, height, 1]) @@ -144,28 +143,28 @@ def convert( data = np.transpose(data, (1, 0)) if dic: data = np.array( - [ - [dic[data[i][j]] for j in range(data.shape[1])] - for i in range(data.shape[0]) - ] - ) + [ + [dic[data[i][j]] for j in range(data.shape[1])] + for i in range(data.shape[0]) + ] + ) subdat_size = data.shape print( - "Convert level", - level, - "with shape", - shape, - "and slice", - idx, - "with size", - subdat_size, - ) + "Convert level", + level, + "with shape", + shape, + "and slice", + idx, + "with size", + subdat_size, + ) if max_load is None or ( - subdat_size[-2] < max_load and subdat_size[-1] < max_load + subdat_size[-2] < max_load and subdat_size[-1] < max_load ): array[ - 0, idx, top : top + subdat_size[-2], left : left + subdat_size[-1] + 0, idx, top: top + subdat_size[-2], left: left + subdat_size[-1] ] = data[...] else: ni = ceildiv(subdat_size[-2], max_load) @@ -173,17 +172,17 @@ def convert( for i in range(ni): for j in range(nj): - print(f"\r{i+1}/{ni}, {j+1}/{nj}", end=" ") + print(f"\r{i + 1}/{ni}, {j + 1}/{nj}", end=" ") start_x, end_x = (i * max_load,) min((i + 1) * max_load, subdat_size[-2]) start_y, end_y = (j * max_load,) min((j + 1) * max_load, subdat_size[-1]) array[ - 0, - idx, - top + start_x : top + end_x, - left + start_y : left + end_y, + 0, + idx, + top + start_x: top + end_x, + left + start_y: left + end_y, ] = data[start_x:end_x, start_y:end_y] print("") @@ -209,7 +208,7 @@ def get_mask_name(level: int) -> str: if level == 0: return "1" else: - return f"{2**level}-{2**level}-1" + return f"{2 ** level}-{2 ** level}-1" def cal_distance(img: np.ndarray) -> int: diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index 8f4aeb55..490a1f36 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -5,7 +5,8 @@ def chunk_slice_generator(arr_shape, chunk_shape): """ - Generate slice indices for chunking an array based on its shape and the provided chunk_shape + Generate slice indices for chunking an array based on its shape and the provided + chunk_shape for the last dimensions. Parameters: diff --git a/linc_convert/utils/io/_array_wrapper.py b/linc_convert/utils/io/_array_wrapper.py index 45602393..1c7a7e84 100644 --- a/linc_convert/utils/io/_array_wrapper.py +++ b/linc_convert/utils/io/_array_wrapper.py @@ -18,9 +18,9 @@ def _get_key(self, f: Mapping) -> str: break if len(f.keys()) > 1: warn( - f"More than one key in .mat file {self.file}, " - f'arbitrarily loading "{key}"' - ) + f"More than one key in .mat file {self.file}, " + f'arbitrarily loading "{key}"' + ) if key not in f.keys(): raise Exception(f"Key {key} not found in file {self.file}") diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index 76bb6a8e..1dd5d706 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -24,7 +24,7 @@ def generate_pyramid_old( max_load: int = 512, mode: Literal["mean", "median"] = "median", no_pyramid_axis: Optional[int] = None, -) -> list[list[int]]: + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -90,21 +90,22 @@ def generate_pyramid_old( slicer = [Ellipsis] + [ slice(i * max_load, min((i + 1) * max_load, n)) for i, n in zip(chunk_index, prev_shape) - ] + ] dat = omz[str(lvl - 1)][tuple(slicer)] # Discard the last voxel along odd dimensions # if one dimension has length 1, it should not be cropped crop = [ 0 if y == 1 else x % 2 for x, y in zip(dat.shape[-ndim:], prev_shape) - ] + ] # Only crop the axes that are downsampled if no_pyramid_axis is not None: crop[no_pyramid_axis] = 0 slcr = [slice(-1) if x else slice(None) for x in crop] dat = dat[tuple([Ellipsis, *slcr])] - # last strip had a single voxel and become empty after cropping, nothing to do + # last strip had a single voxel and become empty after cropping, nothing + # to do if 0 in dat.shape: continue @@ -113,7 +114,7 @@ def generate_pyramid_old( # Reshape into patches of shape 2x2x2 windowed_shape = [ x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] + ] if no_pyramid_axis is not None: windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] windowed_shape[2 * no_pyramid_axis + 1] = 1 @@ -121,10 +122,10 @@ def generate_pyramid_old( dat = dat.reshape(tuple(batch_shape + windowed_shape)) # -> last `ndim` dimensions have shape 2x2x2 dat = dat.transpose( - list(range(len(batch_shape))) - + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) - + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) - ) + list(range(len(batch_shape))) + + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) + + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) + ) # -> flatten patches smaller_shape = [max(n // 2, 1) for n in patch_shape] if no_pyramid_axis is not None: @@ -143,7 +144,7 @@ def generate_pyramid_old( if axis_index != no_pyramid_axis else slice(i * max_load, min((i + 1) * max_load, n)) for i, axis_index, n in zip(chunk_index, range(ndim), spatial_shape) - ] + ] arr[tuple(slicer)] = dat @@ -154,12 +155,12 @@ def default_levels( spatial_shape: tuple, spatial_chunk: tuple, no_pyramid_axis: Optional[int] -) -> int: + ) -> int: default_levels = max( - int(math.ceil(math.log2(s / spatial_chunk[i]))) - for i, s in enumerate(spatial_shape) - if no_pyramid_axis is None or i != no_pyramid_axis - ) + int(math.ceil(math.log2(s / spatial_chunk[i]))) + for i, s in enumerate(spatial_shape) + if no_pyramid_axis is None or i != no_pyramid_axis + ) levels = max(default_levels, 0) return levels @@ -178,26 +179,26 @@ def get_zarray_options(base_level): from .zarr_io.drivers.zarr_python import dimension_separator_to_chunk_key_encoding opts = dict( - dtype=base_level.dtype, - chunks=base_level.chunks, - shards=base_level.shards, - filters=base_level.filters, - compressors=base_level.compressors, - fill_value=base_level.fill_value, - order=base_level.order, - attributes=base_level.metadata.attributes, - overwrite=True, - ) + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=base_level.shards, + filters=base_level.filters, + compressors=base_level.compressors, + fill_value=base_level.fill_value, + order=base_level.order, + attributes=base_level.metadata.attributes, + overwrite=True, + ) if isinstance(base_level.metadata, ArrayV2Metadata): opts_extra = dict( - chunk_key_encoding=dimension_separator_to_chunk_key_encoding( - base_level.metadata.dimension_separator, 2) - ) + chunk_key_encoding=dimension_separator_to_chunk_key_encoding( + base_level.metadata.dimension_separator, 2) + ) elif isinstance(base_level.metadata, ArrayV3Metadata): opts_extra = dict( - chunk_key_encoding=base_level.metadata.chunk_key_encoding, - serializer=base_level.serializer, - dimension_names=base_level.metadata.dimension_names, ) + chunk_key_encoding=base_level.metadata.chunk_key_encoding, + serializer=base_level.serializer, + dimension_names=base_level.metadata.dimension_names, ) else: opts_extra = {} opts.update(**opts_extra) @@ -229,7 +230,7 @@ def generate_pyramid( ndim: int = 3, mode: Literal["mean", "median"] = "median", no_pyramid_axis: Optional[int] = None, -) -> list[list[int]]: + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -343,7 +344,7 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): no_pyramid_axis]) or arr.shape[axis] == 1 else 2) for axis in pyramid_axes - } + } dtype = arr.dtype return da.coarsen(window_func, arr, factors, trim_excess=True).astype(dtype) @@ -364,17 +365,17 @@ def compute_next_level_old(arr, ndim, no_pyramid_axis, window_func): # Reshape into patches of shape 2x2x2 windowed_shape = [ x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] + ] if no_pyramid_axis is not None: windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] windowed_shape[2 * no_pyramid_axis + 1] = 1 arr = arr.reshape(tuple(batch_shape + windowed_shape)) # -> last `ndim` dimensions have shape 2x2x2 arr = arr.transpose( - list(range(len(batch_shape))) - + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) - + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) - ) + list(range(len(batch_shape))) + + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) + + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) + ) # -> flatten patches smaller_shape = [max(n // 2, 1) for n in patch_shape] if no_pyramid_axis is not None: diff --git a/linc_convert/utils/io/spool.py b/linc_convert/utils/io/spool.py index 00332559..579d07fa 100644 --- a/linc_convert/utils/io/spool.py +++ b/linc_convert/utils/io/spool.py @@ -1,5 +1,6 @@ """ -The following script is derived from https://github.com/CBI-PITT/holis_tools/blob/main/holis_tools/zyla_spool_reader.py. +The following script is derived from +https://github.com/CBI-PITT/holis_tools/blob/main/holis_tools/zyla_spool_reader.py. Copyright (c) 2021, Alan M Watson @@ -62,7 +63,7 @@ def _load_info_file(self, info_file): except (KeyError, IndexError, ValueError) as e: warnings.warn( - f"ERROR: Unable to extract frame information from info file. {e}") + f"ERROR: Unable to extract frame information from info file. {e}") return None num_frames_per_spool = int(self.config['multiimage']['ImagesPerFile']) num_frames_to_load = num_total_frames - num_bg_frames @@ -86,10 +87,10 @@ def _what_spool_format(self): def _list_spool_files(self): return sorted( - tuple( - [x for x in self.entries if '0spool.dat' in x] - ) - ) + tuple( + [x for x in self.entries if '0spool.dat' in x] + ) + ) def _get_acquisitionparameters_str(self): file = self._make_filename_from_spool_set('acquisitionmetadata.ini') diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index ea954618..a3411e4c 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -1,6 +1,6 @@ -from abc import ABC, abstractmethod, ABCMeta +from abc import ABC, ABCMeta, abstractmethod from os import PathLike -from typing import Union, Tuple, Optional, Any, Literal, List +from typing import Any, List, Literal, Optional, Tuple, Union import niizarr import numpy as np @@ -10,10 +10,10 @@ from nibabel import Nifti1Header, Nifti2Header from numpy.typing import DTypeLike -from linc_convert.utils.zarr_config import ZarrConfig -from linc_convert.utils.io.generate_pyramid import default_levels, next_level_shape, \ - compute_next_level +from linc_convert.utils.io.generate_pyramid import (compute_next_level, default_levels, + next_level_shape) from linc_convert.utils.io.zarr import logger +from linc_convert.utils.zarr_config import ZarrConfig class ZarrNode(ABC): @@ -145,7 +145,7 @@ def create_array( *, zarr_config: ZarrConfig = None, **kwargs - ) -> ZarrArray: + ) -> ZarrArray: """ Create a new array within this group. """ @@ -158,7 +158,7 @@ def create_array_from_base( shape: Tuple[int, ...], data: Optional[Any] = None, **kwargs - ) -> ZarrArray: + ) -> ZarrArray: """ Create a new array using metadata of an existing base-level array. """ @@ -170,7 +170,7 @@ def generate_pyramid( ndim: int = 3, mode: Literal["mean", "median"] = "median", no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -214,7 +214,7 @@ def generate_pyramid( all_shapes.append(spatial_shape) logger.info(f"Compute level {lvl} with shape {spatial_shape}") arr = self.create_array_from_base( - str(lvl), shape=batch_shape + spatial_shape) + str(lvl), shape=batch_shape + spatial_shape) # dat = da.from_zarr(self[str(lvl - 1)]._array) dat = da.from_array(self[str(lvl - 1)], chunks=self[str(lvl - 1)].chunks) dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 7333ca36..e87ee955 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -3,18 +3,18 @@ import math import os from os import PathLike -from typing import Optional, Tuple, Literal, Union, Mapping, Any +from typing import Any, Literal, Mapping, Optional, Tuple, Union from urllib.parse import urlparse import numcodecs import numcodecs.abc import numpy as np +import tensorstore as ts from numpy.typing import DTypeLike from upath import UPath -import tensorstore as ts -from linc_convert.utils.zarr_config import ZarrConfig from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup +from linc_convert.utils.zarr_config import ZarrConfig class ZarrTSArray(ZarrArray): @@ -40,7 +40,8 @@ def chunks(self): @property def shards(self) -> Optional[Tuple[int, ...]]: - if self._ts.chunk_layout.read_chunk.shape == self._ts.chunk_layout.write_chunk.shape: + if (self._ts.chunk_layout.read_chunk.shape == + self._ts.chunk_layout.write_chunk.shape): return None else: return self._ts.chunk_layout.write_chunk.shape @@ -70,7 +71,7 @@ def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): "open": True, "create": False, "delete_existing": False, - } + } return cls(ts.open(conf).result()) @@ -78,6 +79,7 @@ class ZarrTSGroup(ZarrGroup): def __init__(self, store_path: Union[str, PathLike]): super().__init__(store_path) from upath import UPath + if not isinstance(store_path, UPath): store_path = UPath(store_path) self._path = store_path @@ -99,7 +101,7 @@ def keys(self): return ( sub_dir.name for sub_dir in self._path.iterdir() if sub_dir.is_dir() and _detect_metadata(sub_dir) - ) + ) def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: metadata = _detect_metadata(self._path / key) @@ -145,24 +147,24 @@ def create_array(self, ) -> ZarrArray: if zarr_config is None: conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - **kwargs - ) + self._path / name, + shape=shape, + dtype=dtype, + **kwargs + ) else: compressor_opt = ast.literal_eval(zarr_config.compressor_opt) conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - # TODO: implement this - # compressor_opt=, - version=zarr_config.zarr_version, - ) + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # TODO: implement this + # compressor_opt=, + version=zarr_config.zarr_version, + ) conf['delete_existing'] = True conf['create'] = True arr = ts.open(conf).result() @@ -224,12 +226,13 @@ def open(cls, path: Union[str, PathLike], mode="a", *, _init_group(p, zarr_version) else: raise ValueError( - f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") + f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") return cls(p) def _get_zarr_python_group(self): import zarr + return zarr.open_group(self._path, mode='a') @@ -296,7 +299,7 @@ def auto_shard_size( itemsize: int | np.dtype | str, max_file_size: int = 2 * 1024 ** 4, compression_ratio: float = 2, -) -> list[int]: + ) -> list[int]: """ Find maximal shard size that ensures file size below cap. @@ -349,7 +352,7 @@ def fix_shard_chunk( shard: list[int], chunk: list[int], shape: list[int], -) -> tuple[list[int], list[int]]: + ) -> tuple[list[int], list[int]]: """ Fix incompatibilities between chunk and shard size. @@ -400,7 +403,7 @@ def default_read_config(path: os.PathLike | str) -> dict: "open": True, "create": False, "delete_existing": False, - } + } def _is_array(path): @@ -476,7 +479,7 @@ def default_write_config( compressor: str = "blosc", compressor_opt: dict | None = None, version: int = 3, -) -> dict: + ) -> dict: """ Generate a default TensorStore configuration. @@ -497,6 +500,7 @@ def default_write_config( Configuration """ from upath import UPath + path = UPath(path) if not path.protocol: path = "file://" / path @@ -543,7 +547,7 @@ def default_write_config( chunk_grid = { "name": "regular", "configuration": {"chunk_shape": shard}, - } + } sharding_codec = { "name": "sharding_indexed", @@ -552,14 +556,14 @@ def default_write_config( "codecs": [ codec_little_endian, *compressor, - ], + ], "index_codecs": [ codec_little_endian, {"name": "crc32c"}, - ], + ], "index_location": "end", - }, - } + }, + } codecs = [sharding_codec] else: @@ -567,7 +571,7 @@ def default_write_config( codecs = [ codec_little_endian, *compressor, - ] + ] metadata = { "chunk_grid": chunk_grid, @@ -577,12 +581,12 @@ def default_write_config( "chunk_key_encoding": { "name": "default", "configuration": {"separator": r"/"}, - }, - } + }, + } config = { "driver": "zarr3", "metadata": metadata, - } + } # ------------------------------------------------------------------ # Zarr 2 @@ -601,12 +605,12 @@ def default_write_config( "dtype": np.dtype(dtype).str, "fill_value": 0, "compressor": compressor, - } + } config = { "driver": "zarr", "metadata": metadata, "key_encoding": r"/", - } + } # Prepare store config["metadata"]["shape"] = shape @@ -619,9 +623,9 @@ def _init_group(group_path: PathLike, version: int): group_path.mkdir(parents=True, exist_ok=True) if version == 3: (group_path / 'zarr.json').write_text( - json.dumps({'zarr_format': 3, 'node_type': 'group'}) - ) + json.dumps({'zarr_format': 3, 'node_type': 'group'}) + ) else: (group_path / '.zgroup').write_text( - json.dumps({'zarr_format': 2}) - ) + json.dumps({'zarr_format': 2}) + ) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 21cb3608..8925384c 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -1,5 +1,5 @@ import ast -from typing import Iterator, Union, Literal, Any +from typing import Any, Iterator, Literal, Union import numpy as np import zarr @@ -7,8 +7,8 @@ from numpy.typing import DTypeLike from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams -from linc_convert.utils.zarr_config import ZarrConfig from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup +from linc_convert.utils.zarr_config import ZarrConfig class ZarrPythonArray(ZarrArray): @@ -57,7 +57,7 @@ def __getattr__(self, name): return getattr(self._array, name) else: raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'") + f"'{self.__class__.__name__}' object has no attribute '{name}'") class ZarrPythonGroup(ZarrGroup): @@ -133,10 +133,10 @@ def create_array(self, "fill_value": None, "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), - } + } chunk_key_encoding = dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version) + zarr_config.dimension_separator, zarr_config.zarr_version) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding arr = self._zgroup.create_array(name=name, @@ -153,23 +153,23 @@ def create_array_from_base(self, name: str, shape: tuple, data=None, """ base_level = self['0'] opts = dict( - dtype=base_level.dtype, - chunks=base_level.chunks, - shards=getattr(base_level, "shards", None), - filters=getattr(base_level._array, "filters", None), - compressors=getattr(base_level._array, "compressors", None), - fill_value=getattr(base_level._array, "fill_value", None), - order=getattr(base_level._array, "order", None), - attributes=getattr(getattr(base_level._array, "metadata", None), - "attributes", None), - overwrite=True, - ) + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=getattr(base_level, "shards", None), + filters=getattr(base_level._array, "filters", None), + compressors=getattr(base_level._array, "compressors", None), + fill_value=getattr(base_level._array, "fill_value", None), + order=getattr(base_level._array, "order", None), + attributes=getattr(getattr(base_level._array, "metadata", None), + "attributes", None), + overwrite=True, + ) # Handle extra options based on metadata type meta = getattr(base_level, "metadata", None) if meta is not None: if hasattr(meta, "dimension_separator"): opts["chunk_key_encoding"] = dimension_separator_to_chunk_key_encoding( - meta.dimension_separator, 2) + meta.dimension_separator, 2) if hasattr(meta, "chunk_key_encoding"): opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) if hasattr(base_level, "serializer"): @@ -202,16 +202,18 @@ def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) if zarr_version == 2: import numcodecs + compressor_map = { "blosc": numcodecs.Blosc, "zlib": numcodecs.Zstd, - } + } elif zarr_version == 3: import zarr.codecs + compressor_map = { "blosc": zarr.codecs.BloscCodec, "zlib": zarr.codecs.ZstdCodec, - } + } else: raise ValueError() name = name.lower() @@ -242,7 +244,7 @@ def create_array( zarr_config: ZarrConfig, dtype: DTypeLike = np.int32, data=None -) -> zarr.Array: + ) -> zarr.Array: compressor = zarr_config.compressor compressor_opt = zarr_config.compressor_opt chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) @@ -258,10 +260,10 @@ def create_array( "fill_value": None, "compressors": make_compressor(compressor, zarr_config.zarr_version, **compressor_opt), - } + } chunk_key_encoding = dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version) + zarr_config.dimension_separator, zarr_config.zarr_version) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding arr = omz.create_array(name=name, @@ -280,8 +282,8 @@ def dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version) pass else: dimension_separator = ChunkKeyEncodingParams( - name="default" if zarr_version == 3 else "v2", - separator=dimension_separator) + name="default" if zarr_version == 3 else "v2", + separator=dimension_separator) return dimension_separator @@ -289,7 +291,7 @@ def compute_zarr_layout( shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig -) -> tuple[tuple, tuple | None]: + ) -> tuple[tuple, tuple | None]: ndim = len(shape) if ndim == 5: if zarr_config.no_time: @@ -297,11 +299,11 @@ def compute_zarr_layout( chunk_tc = ( 1 if zarr_config.chunk_time else shape[0], 1 if zarr_config.chunk_channels else shape[1], - ) + ) shard_tc = ( chunk_tc[0] if zarr_config.shard_time else shape[0], chunk_tc[1] if zarr_config.shard_channels else shape[1] - ) + ) elif ndim == 4: if zarr_config.no_time: @@ -351,7 +353,8 @@ def compute_zarr_layout( M = [] free_dims = [] for i in range(dims): - # If the uniform guess already overshoots the data, clamp to the minimal covering multiplier. + # If the uniform guess already overshoots the data, clamp to the minimal + # covering multiplier. if m_uniform * chunk_spatial[i] >= shape_spatial[i]: M.append(L[i]) else: @@ -369,8 +372,8 @@ def compute_zarr_layout( if candidate * chunk_spatial[i] >= shape_spatial[i]: candidate = L[i] new_product = np.prod( - [candidate if j == i else M[j] for j in range(dims)] - ) + [candidate if j == i else M[j] for j in range(dims)] + ) if new_product <= B_multiplier and candidate > M[i]: M[i] = candidate improved = True diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index 2fe29602..f0b27c8f 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,20 +1,20 @@ import warnings -from linc_convert.utils.zarr_config import DriverLike, ZarrConfig from linc_convert.utils.io.zarr.abc import ZarrGroup -from linc_convert.utils.io.zarr.drivers.zarr_python import ZarrPythonArray, \ - ZarrPythonGroup +from linc_convert.utils.io.zarr.drivers.zarr_python import (ZarrPythonArray, + ZarrPythonGroup) +from linc_convert.utils.zarr_config import DriverLike, ZarrConfig _DRIVER_ARRAY = { "zarr-python": ZarrPythonArray -} + } _DRIVER_GROUP = { "zarr-python": ZarrPythonGroup -} + } try: - from linc_convert.utils.io.zarr.drivers.tensorstore import ZarrTSArray, \ - ZarrTSGroup + from linc_convert.utils.io.zarr.drivers.tensorstore import (ZarrTSArray, + ZarrTSGroup) _DRIVER_ARRAY["tensorstore"] = ZarrTSArray _DRIVER_GROUP["tensorstore"] = ZarrTSGroup diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index 8d9022ce..90b47778 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -5,9 +5,9 @@ def setup_logging(): logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' - ) + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) logging.captureWarnings(True) @@ -15,11 +15,12 @@ def add_file_handler(log_file_path=None): file_handler = logging.FileHandler(log_file_path) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) -# TODO: add file handler for each platform. prob ref dandi-ci. prevent logging error in unit test +# TODO: add file handler for each platform. prob ref dandi-ci. prevent logging error +# in unit test setup_logging() # add_file_handler("/scratch/converter.log") diff --git a/linc_convert/utils/orientation.py b/linc_convert/utils/orientation.py index d5840d8d..171de120 100644 --- a/linc_convert/utils/orientation.py +++ b/linc_convert/utils/orientation.py @@ -21,7 +21,7 @@ def orientation_ensure_3d(orientation: str) -> str: "coronal": "LI", "axial": "LP", "sagittal": "PI", - }.get(orientation.lower(), orientation).upper() + }.get(orientation.lower(), orientation).upper() if len(orientation) == 2: if "L" not in orientation and "R" not in orientation: orientation += "R" @@ -34,7 +34,7 @@ def orientation_ensure_3d(orientation: str) -> str: def orientation_to_affine( orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 -) -> np.ndarray: + ) -> np.ndarray: """ Build an affine matrix from an orientation string and voxel size. diff --git a/linc_convert/utils/unit.py b/linc_convert/utils/unit.py index 806201a4..f4057589 100644 --- a/linc_convert/utils/unit.py +++ b/linc_convert/utils/unit.py @@ -28,7 +28,7 @@ "yottameter", "zeptometer", "zettameter", - ], + ], "time": [ "attosecond", "centisecond", @@ -53,8 +53,8 @@ "yottasecond", "zeptosecond", "zettasecond", - ], -} + ], + } nifti_valid_units = [ "unknown", @@ -67,7 +67,7 @@ "hz", "ppm", "rads", -] + ] si_prefix_short2long = { "Q": "quetta", @@ -98,7 +98,7 @@ "y": "yocto", "r": "ronto", "q": "quecto", -} + } si_prefix_long2short = {long: short for short, long in si_prefix_short2long.items()} @@ -132,68 +132,68 @@ "y": -24, "r": -27, "q": -30, -} + } unit_space_short2long = { short + "m": long + "meter" for short, long in si_prefix_short2long.items() -} -unit_space_short2long.update( - { - "m": "meter", - "mi": "mile", - "yd": "yard", - "ft": "foot", - "in": "inch", - "'": "foot", - '"': "inch", - "Å": "angstrom", - "pc": "parsec", } -) +unit_space_short2long.update( + { + "m": "meter", + "mi": "mile", + "yd": "yard", + "ft": "foot", + "in": "inch", + "'": "foot", + '"': "inch", + "Å": "angstrom", + "pc": "parsec", + } + ) unit_space_long2short = {long: short for short, long in unit_space_short2long.items()} unit_space_long2short["micron"] = "u" unit_time_short2long = { short + "s": long + "second" for short, long in si_prefix_short2long.items() -} -unit_time_short2long.update( - { - "y": "year", - "d": "day", - "h": "hour", - "m": "minute", - "s": "second", } -) +unit_time_short2long.update( + { + "y": "year", + "d": "day", + "h": "hour", + "m": "minute", + "s": "second", + } + ) unit_time_long2short = {long: short for short, long in unit_time_short2long.items()} unit_space_scale = { prefix + "m": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() -} -unit_space_scale.update( - { - "mi": 1609.344, - "yd": 0.9144, - "ft": 0.3048, - "'": 0.3048, - "in": 25.4e-3, - '"': 25.4e-3, - "Å": 1e-10, - "pc": 3.0857e16, } -) +unit_space_scale.update( + { + "mi": 1609.344, + "yd": 0.9144, + "ft": 0.3048, + "'": 0.3048, + "in": 25.4e-3, + '"': 25.4e-3, + "Å": 1e-10, + "pc": 3.0857e16, + } + ) unit_time_scale = { prefix + "s": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() -} -unit_time_scale.update( - { - "y": 365.25 * 24 * 60 * 60, - "d": 24 * 60 * 60, - "h": 60 * 60, - "m": 60, } -) +unit_time_scale.update( + { + "y": 365.25 * 24 * 60 * 60, + "d": 24 * 60 * 60, + "h": 60 * 60, + "m": 60, + } + ) def convert_unit(value: float, src: str, dst: str) -> float: @@ -226,7 +226,7 @@ def to_nifti_unit(unit: str) -> str: "second": "sec", "millisecond": "msec", "microsecond": "usec", - }.get(unit, "unknown") + }.get(unit, "unknown") def unit_to_scale(unit: str) -> float: diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index cf791ccf..3f4a77af 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -11,6 +11,7 @@ DriverLike = Literal["zarr-python", "tensorstore", "zarrita"] + @Parameter(name="*") @dataclass class ZarrConfig: @@ -113,10 +114,11 @@ def set_default_name(self, name: str): self.out += ".nii.zarr" if self.nii else ".ome.zarr" if os.path.exists(self.out) and not self.overwrite: answer = input( - f"The output path '{self.out}' already exists. Do you want to overwrite it? (y/n): ") + f"The output path '{self.out}' already exists. Do you want to " + f"overwrite it? (y/n): ") if answer.lower() not in ("y", "yes"): raise FileExistsError( - f"Output path '{self.out}' exists and overwrite was not confirmed.") + f"Output path '{self.out}' exists and overwrite was not confirmed.") def update(self, **kwargs): return replace(self, **kwargs) From aa266017cd5f633b2b52825560e673b2b4e628aa Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 17 Jul 2025 14:01:27 -0400 Subject: [PATCH 110/157] cleanup --- linc_convert/utils/io/generate_pyramid.py | 318 +--------------------- 1 file changed, 1 insertion(+), 317 deletions(-) diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index 1dd5d706..01438aac 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -1,156 +1,13 @@ -import itertools import logging import math -from typing import Literal, Optional +from typing import Optional import dask import dask.array as da -import numpy as np -import tensorstore as ts -import tqdm -import zarr -from dask.diagnostics import ProgressBar -from zarr.core.metadata import ArrayV2Metadata, ArrayV3Metadata - -from linc_convert.utils.math import ceildiv logger = logging.getLogger(__name__) -def generate_pyramid_old( - omz: zarr.Group, - levels: int = -1, - ndim: int = 3, - max_load: int = 512, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - omz : zarr.Group - Zarr group object - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - ndim : int - Number of spatial dimensions. - max_load : int - Maximum number of voxels to load along each dimension. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - no_pyramid_axis : int | None - Axis that should not be downsampled. If None, downsample - across all three dimensions. - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - if max_load % 2: - max_load += 1 - - # Read properties from base level - base_level = omz["0"] - base_shape = list(base_level.shape) - chunk_size = base_level.chunks - opts = get_zarray_options(base_level) - - # Select windowing function - window_func = {"median": np.median, "mean": np.mean}[mode] - - batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] - all_shapes = [spatial_shape] - - # Compute default number of levels based on chunk size - if levels == -1: - levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) - - for lvl in tqdm.tqdm(range(1, levels + 1)): - # Compute downsampled shape - prev_shape = spatial_shape - spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) - all_shapes.append(spatial_shape) - logger.info("Compute level", lvl, "with shape", spatial_shape) - - arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) - - # Iterate across `max_load` chunks - # (note that these are unrelated to underlying zarr chunks) - grid_shape = [ceildiv(n, max_load) for n in prev_shape] - - for chunk_index in tqdm.tqdm( - itertools.product(*[range(x) for x in grid_shape])): - - # Read one chunk of data at the previous resolution - slicer = [Ellipsis] + [ - slice(i * max_load, min((i + 1) * max_load, n)) - for i, n in zip(chunk_index, prev_shape) - ] - dat = omz[str(lvl - 1)][tuple(slicer)] - - # Discard the last voxel along odd dimensions - # if one dimension has length 1, it should not be cropped - crop = [ - 0 if y == 1 else x % 2 for x, y in zip(dat.shape[-ndim:], prev_shape) - ] - # Only crop the axes that are downsampled - if no_pyramid_axis is not None: - crop[no_pyramid_axis] = 0 - slcr = [slice(-1) if x else slice(None) for x in crop] - dat = dat[tuple([Ellipsis, *slcr])] - - # last strip had a single voxel and become empty after cropping, nothing - # to do - if 0 in dat.shape: - continue - - patch_shape = dat.shape[-ndim:] - - # Reshape into patches of shape 2x2x2 - windowed_shape = [ - x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] - if no_pyramid_axis is not None: - windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] - windowed_shape[2 * no_pyramid_axis + 1] = 1 - - dat = dat.reshape(tuple(batch_shape + windowed_shape)) - # -> last `ndim` dimensions have shape 2x2x2 - dat = dat.transpose( - list(range(len(batch_shape))) - + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) - + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) - ) - # -> flatten patches - smaller_shape = [max(n // 2, 1) for n in patch_shape] - if no_pyramid_axis is not None: - smaller_shape[no_pyramid_axis] = patch_shape[no_pyramid_axis] - - dat = dat.reshape(tuple(batch_shape + smaller_shape + [-1])) - - # Compute the median/mean of each patch - dtype = dat.dtype - dat = window_func(dat, axis=-1) - dat = dat.astype(dtype) - - # Write output - slicer = [Ellipsis] + [ - slice(i * max_load // 2, min((i + 1) * max_load // 2, n)) - if axis_index != no_pyramid_axis - else slice(i * max_load, min((i + 1) * max_load, n)) - for i, axis_index, n in zip(chunk_index, range(ndim), spatial_shape) - ] - - arr[tuple(slicer)] = dat - - return all_shapes - - def default_levels( spatial_shape: tuple, spatial_chunk: tuple, @@ -175,141 +32,6 @@ def next_level_shape(prev_shape: tuple, no_pyramid_axis: Optional[int]) -> list: return new_shape -def get_zarray_options(base_level): - from .zarr_io.drivers.zarr_python import dimension_separator_to_chunk_key_encoding - - opts = dict( - dtype=base_level.dtype, - chunks=base_level.chunks, - shards=base_level.shards, - filters=base_level.filters, - compressors=base_level.compressors, - fill_value=base_level.fill_value, - order=base_level.order, - attributes=base_level.metadata.attributes, - overwrite=True, - ) - if isinstance(base_level.metadata, ArrayV2Metadata): - opts_extra = dict( - chunk_key_encoding=dimension_separator_to_chunk_key_encoding( - base_level.metadata.dimension_separator, 2) - ) - elif isinstance(base_level.metadata, ArrayV3Metadata): - opts_extra = dict( - chunk_key_encoding=base_level.metadata.chunk_key_encoding, - serializer=base_level.serializer, - dimension_names=base_level.metadata.dimension_names, ) - else: - opts_extra = {} - opts.update(**opts_extra) - return opts - - -class _TSAdapter: - def __init__(self, ts): - self._ts = ts - - @property - def shape(self): return tuple(self._ts.shape) - - @property - def ndim(self): return self._ts.ndim - - @property - def dtype(self): - # Expose the NumPy dtype here: - return self._ts.dtype.numpy_dtype - - def __getitem__(self, idx): - return self._ts[idx].read().result() - - -def generate_pyramid( - omz: zarr.Group, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: - """ - Generate the levels of a pyramid in an existing Zarr. - - Parameters - ---------- - omz : zarr.Group - Zarr group object - levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. - ndim : int - Number of spatial dimensions. - mode : {"mean", "median"} - Whether to use a mean or median moving window. - no_pyramid_axis : int | None - Axis that should not be downsampled. If None, downsample - across all three dimensions. - Returns - ------- - shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. - """ - from .zarr_io.drivers.tensorstore import default_read_config - from .zarr_io.drivers.tensorstore import default_write_config - - # Read properties from base level - base_level = omz["0"] - base_shape = list(base_level.shape) - chunk_size = base_level.chunks - opts = get_zarray_options(base_level) - - # Select windowing function - window_func = {"median": da.median, "mean": da.mean}[mode] - - batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] - all_shapes = [spatial_shape] - - # Compute default number of levels based on chunk size - if levels == -1: - levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) - - rconfig = default_read_config(str(omz["0"].store_path)) - reader = ts.open(rconfig).result() - - reader = _TSAdapter(reader) - dat = da.from_array(reader, chunks=opts["chunks"]) - tasks = [] - for lvl in tqdm.tqdm(range(1, levels + 1)): - prev_shape = spatial_shape - spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) - all_shapes.append(spatial_shape) - logger.info(f"Compute level {lvl} with shape {spatial_shape}") - arr = omz.create_array(str(lvl), shape=batch_shape + spatial_shape, **opts) - - # dat = da.from_zarr(omz[str(lvl - 1)]) - - wconfig = default_write_config(str(arr.store_path), - shape=batch_shape + spatial_shape, - dtype=dat.dtype, chunk=opts["chunks"], - shard=opts["shards"], - version=omz.info._zarr_format) - wconfig["delete_existing"] = True - wconfig["create"] = True - writer = ts.open(wconfig).result() - dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - # TODO: this exists even without sharding - if arr.shards: - dat = dat.rechunk(arr.shards) - else: - dat = dat.rechunk(arr.chunks) - dat = dat.persist() - with ProgressBar(): - dat.store(writer) - # TODO: delay this task, write together - return all_shapes - - def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): """ Compute the next (half-resolution) level of a dask array pyramid along the @@ -348,41 +70,3 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): dtype = arr.dtype return da.coarsen(window_func, arr, factors, trim_excess=True).astype(dtype) - - -def compute_next_level_old(arr, ndim, no_pyramid_axis, window_func): - batch_shape, prev_shape = arr.shape[:-ndim], arr.shape[-ndim:] - batch_shape = list(batch_shape) - crop = [ - 0 if i == 1 else i % 2 for i in prev_shape] - if no_pyramid_axis is not None: - crop[no_pyramid_axis] = 0 - slcr = [slice(-1) if x else slice(None) for x in crop] - arr = arr[tuple([Ellipsis, *slcr])] - if 0 in arr.shape: - return - patch_shape = arr.shape[-ndim:] - # Reshape into patches of shape 2x2x2 - windowed_shape = [ - x for n in patch_shape for x in (max(n // 2, 1), min(n, 2)) - ] - if no_pyramid_axis is not None: - windowed_shape[2 * no_pyramid_axis] = patch_shape[no_pyramid_axis] - windowed_shape[2 * no_pyramid_axis + 1] = 1 - arr = arr.reshape(tuple(batch_shape + windowed_shape)) - # -> last `ndim` dimensions have shape 2x2x2 - arr = arr.transpose( - list(range(len(batch_shape))) - + list(range(len(batch_shape), len(batch_shape) + 2 * ndim, 2)) - + list(range(len(batch_shape) + 1, len(batch_shape) + 2 * ndim, 2)) - ) - # -> flatten patches - smaller_shape = [max(n // 2, 1) for n in patch_shape] - if no_pyramid_axis is not None: - smaller_shape[no_pyramid_axis] = patch_shape[no_pyramid_axis] - arr = arr.reshape(tuple(batch_shape + smaller_shape + [-1])) - # Compute the median/mean of each patch - dtype = arr.dtype - arr = window_func(arr, axis=-1) - arr = arr.astype(dtype) - return arr From 90215b4b234c03517b5cff275870860f825a23d3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 18 Jul 2025 15:37:19 -0400 Subject: [PATCH 111/157] style --- linc_convert/utils/io/zarr/abc.py | 230 +++++++++++++----------------- 1 file changed, 101 insertions(+), 129 deletions(-) diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index a3411e4c..c1ba88c9 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -1,176 +1,144 @@ +"""Abstract base classes for ZarrIO interfaces.""" + from abc import ABC, ABCMeta, abstractmethod +from numbers import Number from os import PathLike -from typing import Any, List, Literal, Optional, Tuple, Union +from typing import Any, List, Literal, Mapping, Optional, Sequence, Tuple, Union import niizarr import numpy as np import tqdm +import zarr from dask import array as da from dask.diagnostics import ProgressBar from nibabel import Nifti1Header, Nifti2Header -from numpy.typing import DTypeLike +from numpy.typing import ArrayLike, DTypeLike -from linc_convert.utils.io.generate_pyramid import (compute_next_level, default_levels, - next_level_shape) +from linc_convert.utils.io.generate_pyramid import ( + compute_next_level, + default_levels, + next_level_shape, +) from linc_convert.utils.io.zarr import logger from linc_convert.utils.zarr_config import ZarrConfig +NiftiHeaderLike = Union[Nifti1Header, Nifti2Header] + class ZarrNode(ABC): - """ - Base class for any Zarr-like object (group or array). - """ + """Base class for any Zarr-like object (group or array).""" - def __init__(self, store_path: Union[str, PathLike]): - # record where on disk (or out‐of core store) this node lives + def __init__(self, store_path: Union[str, PathLike]) -> None: self._store_path = store_path @property - def store_path(self) -> str: + def store_path(self) -> Union[str, PathLike]: + """Path to the Zarr store for this node.""" return self._store_path @property @abstractmethod - def attrs(self): + def attrs(self) -> Mapping[str, Any]: """Access metadata/attributes for this node.""" ... @property @abstractmethod - def zarr_version(self) -> int: - """ - Return the Zarr format version (e.g., 2 or 3). - """ - ... - # TODO: implement these and more built-in methods - # def __repr__(self): - # ... - # def __str__(self): - # ... - # def __eq__(self, other): - # ... + def zarr_version(self) -> Literal[2, 3]: + """Get the Zarr format version.""" + + @abstractmethod + def __repr__(self) -> str: + """Return the string representation of the Zarr node.""" + + @abstractmethod + def __str__(self) -> str: + """Return the string representation of the Zarr node.""" class ZarrArray(ZarrNode): - """ - Abstract interface for a Zarr array (n-dimensional data). - """ + """Abstract interface for a Zarr array (n-dimensional data).""" @property @abstractmethod def shape(self) -> Tuple[int, ...]: - """ - Shape of the array. - """ - ... + """Shape of the array.""" @property @abstractmethod def dtype(self) -> np.dtype: - """ - Data type of the array. - """ - ... + """Data type of the array.""" @property @abstractmethod def chunks(self) -> Tuple[int, ...]: - """ - Chunk shape for the array. - """ - ... + """Chunk shape for the array.""" @property @abstractmethod - def shards(self) -> Optional[Tuple[int, ...]]: - """ - Shard shape, if supported; otherwise None. - """ - ... + def shards(self) -> Tuple[int, ...] | None: + """Shard shape, if supported; otherwise None.""" @property @abstractmethod def ndim(self) -> int: - ... + """Number of dimensions of the array.""" @abstractmethod - def __getitem__(self, key: Any) -> Any: - """ - Read data from the array. - """ - ... + def __getitem__(self, key: str) -> ArrayLike: + """Read data from the array.""" @abstractmethod - def __setitem__(self, key: Any, value: Any) -> None: - """ - Write data to the array. - """ - ... + def __setitem__(self, key: str, value: ArrayLike | Number) -> None: + """Write data to the array.""" class ZarrGroup(ZarrNode, metaclass=ABCMeta): - """ - Abstract interface for a Zarr group (container of arrays/subgroups). - """ + """Abstract interface for a Zarr group (container of arrays/subgroups).""" @classmethod @abstractmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': - ... + def from_config(cls, zarr_config: ZarrConfig) -> "ZarrGroup": + """Create a Zarr group from a configuration object.""" @abstractmethod def __getitem__(self, name: str) -> ZarrNode: - """ - Get a subgroup or array by name within this group. - """ - ... + """Get a subgroup or array by name within this group.""" @abstractmethod - def __delitem__(self, key): - ... + def __delitem__(self, name: str) -> None: + """Delete a subgroup or array by name within this group.""" @abstractmethod - def create_group(self, name: str, overwrite: bool = False) -> 'ZarrGroup': - """ - Create or open a subgroup within this group. - """ - ... + def create_group(self, name: str, overwrite: bool = False) -> "ZarrGroup": + """Create or open a subgroup within this group.""" @abstractmethod def create_array( - self, - name: str, - shape: Tuple[int, ...], - dtype: DTypeLike, - *, - zarr_config: ZarrConfig = None, - **kwargs - ) -> ZarrArray: - """ - Create a new array within this group. - """ + self, + name: str, + shape: Tuple[int, ...], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, + **kwargs, + ) -> ZarrArray: + """Create a new array within this group.""" ... @abstractmethod def create_array_from_base( - self, - name: str, - shape: Tuple[int, ...], - data: Optional[Any] = None, - **kwargs - ) -> ZarrArray: - """ - Create a new array using metadata of an existing base-level array. - """ - ... + self, name: str, shape: Sequence[int], data: ArrayLike = None, **kwargs + ) -> ZarrArray: + """Create a new array using metadata of an existing base-level array.""" def generate_pyramid( - self, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: + self, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -189,14 +157,14 @@ def generate_pyramid( no_pyramid_axis : int | None Axis that should not be downsampled. If None, downsample across all three dimensions. + Returns ------- shapes : list[list[int]] Shapes of all levels, from finest to coarsest, including the existing top level. """ - - base_level = self['0'] + base_level = self["0"] base_shape = list(base_level.shape) chunk_size = base_level.chunks @@ -214,7 +182,8 @@ def generate_pyramid( all_shapes.append(spatial_shape) logger.info(f"Compute level {lvl} with shape {spatial_shape}") arr = self.create_array_from_base( - str(lvl), shape=batch_shape + spatial_shape) + str(lvl), shape=batch_shape + spatial_shape + ) # dat = da.from_zarr(self[str(lvl - 1)]._array) dat = da.from_array(self[str(lvl - 1)], chunks=self[str(lvl - 1)].chunks) dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) @@ -227,36 +196,39 @@ def generate_pyramid( dat.store(arr) return all_shapes - def write_ome_metadata(self, axes: List[str], - space_scale: Union[float, List[float]] = 1.0, - time_scale: float = 1.0, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: Union[str, int, List[str], List[int]] = 2, - levels: Optional[int] = None, - no_pool: Optional[int] = None, - multiscales_type: str = "", - ome_version: Literal["0.4", "0.5"] = "0.4"): - - zg = self._get_zarr_python_group() - niizarr.write_ome_metadata(zg, - space_scale=space_scale, - time_scale=time_scale, - space_unit=space_unit, - time_unit=time_unit, - axes=axes, - name=name, - pyramid_aligns=pyramid_aligns, - levels=levels, - no_pool=no_pool, - multiscales_type=multiscales_type, - ome_version=ome_version) + def write_ome_metadata( + self, + axes: List[str], + space_scale: Union[float, List[float]] = 1.0, + time_scale: float = 1.0, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: Union[str, int, List[str], List[int]] = 2, + levels: Optional[int] = None, + no_pool: Optional[int] = None, + multiscales_type: str = "", + ome_version: Literal["0.4", "0.5"] = "0.4", + ) -> None: + niizarr.write_ome_metadata( + self._get_zarr_python_group(), + space_scale=space_scale, + time_scale=time_scale, + space_unit=space_unit, + time_unit=time_unit, + axes=axes, + name=name, + pyramid_aligns=pyramid_aligns, + levels=levels, + no_pool=no_pool, + multiscales_type=multiscales_type, + ome_version=ome_version, + ) def write_nifti_header(self, header: Union[Nifti1Header, Nifti2Header]) -> None: - zg = self._get_zarr_python_group() - niizarr.write_nifti_header(zg, header) + """Write a NIfTI header to the Zarr group.""" + niizarr.write_nifti_header(self._get_zarr_python_group(), header) @abstractmethod - def _get_zarr_python_group(self): - ... + def _get_zarr_python_group(self) -> "zarr.ZarrGroup": + """Get the underlying Zarr Python group object.""" From 588831088fe87eeed6d38d10b8fc1ae11e48304b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 10:22:09 -0400 Subject: [PATCH 112/157] docs --- linc_convert/utils/zarr_config.py | 51 +++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 3f4a77af..392b3690 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -79,6 +79,7 @@ class ZarrConfig: driver : {"zarr-python", "tensorstore", "zarrita"} library used for Zarr IO Operation """ + out: Annotated[str, Parameter(name=["--out", "-o"])] = None zarr_version: Literal[2, 3] = 3 chunk: tuple[int] = (128,) @@ -101,13 +102,38 @@ class ZarrConfig: driver: DriverLike = "zarr-python" def __post_init__(self) -> None: + """ + Perform post-initialization checks and adjustments. + + - Automatically enable NIfTI mode if the output path ends with ".nii.zarr". + - Ensure that sharding options (shard, shard_channels, shard_time) are only + used when zarr_version == 3; otherwise raise NotImplementedError. + """ if self.out: - self.nii |= self.out.endswith(".nii.zarr") + self.nii |= str(self.out).endswith(".nii.zarr") if self.zarr_version == 2: if self.shard or self.shard_channels or self.shard_time: raise NotImplementedError("Shard is not supported for Zarr 2.") - def set_default_name(self, name: str): + def set_default_name(self, name: str) -> None: + """ + Assign a default output name if none was specified. + + Parameters + ---------- + name : str + Base filename (without extension) to use for the output archive. + + Returns + ------- + None + -------- + - If `self.out` is already set, does nothing. + - Otherwise sets `self.out` to `name + ".nii.zarr"` if NIfTI mode + is active, or `name + ".ome.zarr"` otherwise. + - If the resulting path exists and `overwrite` is False, prompts + the user for confirmation and raises FileExistsError if not confirmed. + """ if self.out is not None: return self.out = name @@ -118,14 +144,27 @@ def set_default_name(self, name: str): f"overwrite it? (y/n): ") if answer.lower() not in ("y", "yes"): raise FileExistsError( - f"Output path '{self.out}' exists and overwrite was not confirmed.") - - def update(self, **kwargs): - return replace(self, **kwargs) + f"Output path '{self.out}' exists and overwrite was not " + f"confirmed.") def update_default_config(zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: + """ + Merge user overrides into an existing ZarrConfig or create a new one. + + Parameters + ---------- + zarr_config : ZarrConfig or None + Existing configuration to update. If None, a fresh ZarrConfig is created. + **kwargs + Fields of ZarrConfig to override in the returned instance. + + Returns + ------- + ZarrConfig + A new ZarrConfig instance with the given overrides applied. + """ if zarr_config is None: zarr_config = ZarrConfig() return replace(zarr_config, **kwargs) From 74054a0d57dd525449cfbfe502fe78b4bb685955 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 13:56:45 -0400 Subject: [PATCH 113/157] fix: skip wkw unit test --- tests/test_wk.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/test_wk.py b/tests/test_wk.py index fdc43847..35f7f04a 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -2,10 +2,14 @@ import numpy as np import pytest +import skimage import wkw import zarr +import niizarr +from nibabel import Nifti1Image from linc_convert.modalities.wk import webknossos_annotation +from linc_convert.modalities.wk.webknossos_annotation import get_mask_name from utils.compare_file import _cmp_zarr_archives @@ -13,7 +17,7 @@ def _write_test_data(directory: str) -> None: wkw_dir = f"{directory}/wkw" ome_dir = f"{directory}/ome" - store = zarr.storage.DirectoryStore(ome_dir) + store = zarr.storage.LocalStore(ome_dir) omz = zarr.group(store=store, overwrite=True) for level in range(5): @@ -25,7 +29,7 @@ def _write_test_data(directory: str) -> None: with wkw.Dataset.create(wkw_filepath, wkw.Header(np.uint8)) as dataset: dataset.write((0, 0, 0), wkw_array) - omz.create_dataset(f"{level}", shape=[1, 5, size, size]) + omz.create_dataset(f"{level}", shape=[1, 5, size, size], dtype=np.uint8) array = omz[f"{level}"] array[...] = ome_array @@ -71,7 +75,7 @@ def _write_test_data(directory: str) -> None: omz.attrs["multiscales"] = multiscales -@pytest.mark.skip(reason="🚧 refactor in progress") +@pytest.skip("Jingjing said she wants to rewrite this part herself") def test_wk(tmp_path): _write_test_data(tmp_path) @@ -82,7 +86,7 @@ def test_wk(tmp_path): output_zarr = os.path.join(tmp_path, basename + "_dsec_" + initials + ".ome.zarr") print("starting the convert process") - webknossos_annotation.convert(wkw_dir, ome_dir, tmp_path, "{}") + webknossos_annotation.convert(wkw_dir, ome_dir, out=tmp_path, dic="{}") z = zarr.open(output_zarr, mode="r") for level in range(5): @@ -93,10 +97,3 @@ def test_wk(tmp_path): print("trusted result has", np.shape(z[level]), np.unique(z[level])) assert _cmp_zarr_archives(str(output_zarr), "data/wk.zarr.zip") - - -def get_mask_name(level): - if level == 0: - return "1" - else: - return f"{2 ** level}-{2 ** level}-1" From 7fd73fde9cd4a02b1cae77b6a8559a5d2c93b806 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 14:11:13 -0400 Subject: [PATCH 114/157] fix: update chunk correctly --- linc_convert/modalities/df/multi_slice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index 2bb86770..dc2cdf49 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -111,7 +111,7 @@ def convert( new_size += (3,) print(len(inp), new_size, nblevel, has_channel) chunks = list(new_size[2:]) + [1] + list(zarr_config.chunk[-2:]) - zarr_config.update(chunk=tuple(chunks)) + zarr_config.chunk = tuple(chunks) print(new_size) # Write each level for level in range(nblevel): From b4b508ab22f4e0a1012ffd4d6231ecaa385dd57e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 14:42:04 -0400 Subject: [PATCH 115/157] docs --- linc_convert/utils/io/zarr/__init__.py | 5 +- linc_convert/utils/io/zarr/abc.py | 249 ++++++++++------- .../utils/io/zarr/drivers/zarr_python.py | 250 +++++++++--------- linc_convert/utils/io/zarr/factory.py | 12 +- 4 files changed, 295 insertions(+), 221 deletions(-) diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index c6b885a1..6a985a77 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -3,7 +3,7 @@ logger = logging.getLogger(__name__) -from .abc import ZarrNode, ZarrArray, ZarrGroup +from .abc import ZarrArray, ZarrGroup, ZarrNode from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup try: @@ -11,5 +11,4 @@ except ImportError: warnings.warn("Tensorstore is not installed, driver disabled") from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup - -from .factory import open, open_group, from_config +from .factory import from_config, open, open_group diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index c1ba88c9..29343d0f 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -3,7 +3,18 @@ from abc import ABC, ABCMeta, abstractmethod from numbers import Number from os import PathLike -from typing import Any, List, Literal, Mapping, Optional, Sequence, Tuple, Union +from typing import ( + Any, + List, + Literal, + Mapping, + Optional, + Sequence, + Tuple, + TypedDict, + Union, + Unpack, + ) import niizarr import numpy as np @@ -25,6 +36,16 @@ NiftiHeaderLike = Union[Nifti1Header, Nifti2Header] +class ZarrArrayConfig(TypedDict): + chunks: tuple[int, ...] + shards: Optional[tuple[int, ...]] + compressors: Literal["blosc", "zlib", None] + compressor_options: dict[str, Any] + dimension_separator: Literal[".", "/"] + order: Literal["C", "F"] + fill_value: Number | None + + class ZarrNode(ABC): """Base class for any Zarr-like object (group or array).""" @@ -46,189 +67,235 @@ def attrs(self) -> Mapping[str, Any]: @abstractmethod def zarr_version(self) -> Literal[2, 3]: """Get the Zarr format version.""" + ... - @abstractmethod - def __repr__(self) -> str: - """Return the string representation of the Zarr node.""" + # @abstractmethod + # def __repr__(self) -> str: + # """Return the string representation of the Zarr node.""" + # ... - @abstractmethod - def __str__(self) -> str: - """Return the string representation of the Zarr node.""" + # @abstractmethod + # def __str__(self) -> str: + # """Return the string representation of the Zarr node.""" + # ... class ZarrArray(ZarrNode): """Abstract interface for a Zarr array (n-dimensional data).""" + @property + @abstractmethod + def ndim(self) -> int: + """Number of dimensions of the array.""" + ... + @property @abstractmethod def shape(self) -> Tuple[int, ...]: """Shape of the array.""" + ... @property @abstractmethod def dtype(self) -> np.dtype: """Data type of the array.""" + ... @property @abstractmethod def chunks(self) -> Tuple[int, ...]: """Chunk shape for the array.""" + ... @property @abstractmethod def shards(self) -> Tuple[int, ...] | None: """Shard shape, if supported; otherwise None.""" - - @property - @abstractmethod - def ndim(self) -> int: - """Number of dimensions of the array.""" + ... @abstractmethod def __getitem__(self, key: str) -> ArrayLike: """Read data from the array.""" + ... @abstractmethod def __setitem__(self, key: str, value: ArrayLike | Number) -> None: """Write data to the array.""" + ... -class ZarrGroup(ZarrNode, metaclass=ABCMeta): +class ZarrGroup(ZarrNode): """Abstract interface for a Zarr group (container of arrays/subgroups).""" @classmethod @abstractmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrGroup": """Create a Zarr group from a configuration object.""" + ... @abstractmethod def __getitem__(self, name: str) -> ZarrNode: """Get a subgroup or array by name within this group.""" + ... @abstractmethod def __delitem__(self, name: str) -> None: """Delete a subgroup or array by name within this group.""" + ... + + @abstractmethod + def _get_zarr_python_group(self) -> "zarr.ZarrGroup": + """Get the underlying Zarr Python group object.""" + ... + + # @abstractmethod + # def _create_array(self, **kwargs: Unpack[ZarrArrayConfig]) -> ArrayLike: + # ... @abstractmethod def create_group(self, name: str, overwrite: bool = False) -> "ZarrGroup": """Create or open a subgroup within this group.""" + ... @abstractmethod def create_array( - self, - name: str, - shape: Tuple[int, ...], - dtype: DTypeLike, - *, - zarr_config: ZarrConfig = None, - **kwargs, - ) -> ZarrArray: + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, + **kwargs: Unpack[ZarrArrayConfig], + ) -> ZarrArray: """Create a new array within this group.""" ... @abstractmethod def create_array_from_base( - self, name: str, shape: Sequence[int], data: ArrayLike = None, **kwargs - ) -> ZarrArray: + self, + name: str, + shape: Sequence[int], + data: ArrayLike = None, + **kwargs: Unpack[ZarrArrayConfig], + ) -> ZarrArray: """Create a new array using metadata of an existing base-level array.""" + ... def generate_pyramid( - self, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: + self, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. Parameters ---------- - omz : zarr.Group - Zarr group object levels : int - Number of additional levels to generate. - By default, stop when all dimensions are smaller than their - corresponding chunk size. + Number of additional levels to generate. By default, stop when + all dimensions are smaller than their corresponding chunk size. ndim : int Number of spatial dimensions. mode : {"mean", "median"} - Whether to use a mean or median moving window. + Use mean or median downsampling. no_pyramid_axis : int | None - Axis that should not be downsampled. If None, downsample - across all three dimensions. + Axis to leave unsampled. Returns ------- shapes : list[list[int]] - Shapes of all levels, from finest to coarsest, including the - existing top level. + Shapes of each level, from finest to coarsest. """ - base_level = self["0"] - base_shape = list(base_level.shape) - chunk_size = base_level.chunks - - window_func = {"median": da.median, "mean": da.mean}[mode] - - batch_shape, spatial_shape = base_shape[:-ndim], base_shape[-ndim:] + base = self["0"] + batch_shape, spatial_shape = base.shape[:-ndim], base.shape[-ndim:] all_shapes = [spatial_shape] + chunk_size = base.chunks[-ndim:] + window = {"median": da.median, "mean": da.mean}[mode] if levels == -1: - levels = default_levels(spatial_shape, chunk_size[-ndim:], no_pyramid_axis) + levels = default_levels(spatial_shape, chunk_size, no_pyramid_axis) for lvl in tqdm.tqdm(range(1, levels + 1)): - prev_shape = spatial_shape - spatial_shape = next_level_shape(prev_shape, no_pyramid_axis) + spatial_shape = next_level_shape(spatial_shape, no_pyramid_axis) all_shapes.append(spatial_shape) logger.info(f"Compute level {lvl} with shape {spatial_shape}") - arr = self.create_array_from_base( - str(lvl), shape=batch_shape + spatial_shape - ) - # dat = da.from_zarr(self[str(lvl - 1)]._array) + arr = self.create_array_from_base(str(lvl), (*batch_shape, *spatial_shape)) dat = da.from_array(self[str(lvl - 1)], chunks=self[str(lvl - 1)].chunks) - dat = compute_next_level(dat, ndim, no_pyramid_axis, window_func) - if arr.shards: - dat = dat.rechunk(arr.shards) - else: - dat = dat.rechunk(arr.chunks) - dat = dat.persist() + dat = compute_next_level(dat, ndim, no_pyramid_axis, window) + dat = dat.rechunk(arr.shards or arr.chunks).persist() with ProgressBar(): dat.store(arr) + return all_shapes def write_ome_metadata( - self, - axes: List[str], - space_scale: Union[float, List[float]] = 1.0, - time_scale: float = 1.0, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: Union[str, int, List[str], List[int]] = 2, - levels: Optional[int] = None, - no_pool: Optional[int] = None, - multiscales_type: str = "", - ome_version: Literal["0.4", "0.5"] = "0.4", - ) -> None: + self, + axes: List[str], + space_scale: Union[float, List[float]] = 1.0, + time_scale: float = 1.0, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: Union[str, int, List[str], List[int]] = 2, + levels: Optional[int] = None, + no_pool: Optional[int] = None, + multiscales_type: str = "", + ome_version: Literal["0.4", "0.5"] = "0.4", + ) -> None: + """ + Write OME-compatible metadata into this group. + + Parameters + ---------- + omz : zarr.Group + Zarr group to write metadata + axes : list[str] + Name of each dimension, in Zarr order (t, c, z, y, x) + space_scale : float | list[float] + Finest-level voxel size, in Zarr order (z, y, x) + time_scale : float + Time scale + space_unit : str + Unit of spatial scale (assumed identical across dimensions) + time_unit : str + Unit of time scale + name : str + Name attribute + pyramid_aligns : float | list[float] | {"center", "edge"} + Whether the pyramid construction aligns the edges or the centers + of the corner voxels. If a (list of) number, assume that a moving + window of that size was used. + levels : int + Number of existing levels. Default: find out automatically. + no_pool: int + Index of the spatial dimension that was not downsampled + when generating pyramid levels. + multiscales_type: str + Override the type field in multiscale attribute. + ome_version: {"0.4", "0.5"} + Version of the OME-Zarr specification to use + + Returns + ------- + None. + """ niizarr.write_ome_metadata( - self._get_zarr_python_group(), - space_scale=space_scale, - time_scale=time_scale, - space_unit=space_unit, - time_unit=time_unit, - axes=axes, - name=name, - pyramid_aligns=pyramid_aligns, - levels=levels, - no_pool=no_pool, - multiscales_type=multiscales_type, - ome_version=ome_version, - ) - - def write_nifti_header(self, header: Union[Nifti1Header, Nifti2Header]) -> None: + self._get_zarr_python_group(), + space_scale=space_scale, + time_scale=time_scale, + space_unit=space_unit, + time_unit=time_unit, + axes=axes, + name=name, + pyramid_aligns=pyramid_aligns, + levels=levels, + no_pool=no_pool, + multiscales_type=multiscales_type, + ome_version=ome_version, + ) + + def write_nifti_header(self, header: NiftiHeaderLike) -> None: """Write a NIfTI header to the Zarr group.""" niizarr.write_nifti_header(self._get_zarr_python_group(), header) - - @abstractmethod - def _get_zarr_python_group(self) -> "zarr.ZarrGroup": - """Get the underlying Zarr Python group object.""" diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 8925384c..0931da46 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -1,99 +1,135 @@ +"""ZarrIO Implementation using the zarr-python library.""" import ast -from typing import Any, Iterator, Literal, Union +from numbers import Number +from typing import ( + Any, + Iterator, Literal, + Mapping, + Optional, + Sequence, + Tuple, + Union, + Unpack, + ) import numpy as np import zarr import zarr.codecs -from numpy.typing import DTypeLike +from numpy.typing import ArrayLike, DTypeLike from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams -from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.zarr_config import ZarrConfig class ZarrPythonArray(ZarrArray): - def __init__(self, array: zarr.Array): + """Zarr Array implementation using the zarr-python library.""" + + def __init__(self, array: zarr.Array) -> None: + """ + Parameters + ---------- + array : zarr.Array + Underlying Zarr array. + """ super().__init__(str(array.store_path)) self._array = array @property - def attrs(self): - return self._array.attrs + def ndim(self) -> int: + """Number of dimensions of the array.""" + return self._array.ndim @property - def shape(self) -> tuple[int, ...]: + def shape(self) -> Tuple[int, ...]: + """Shape of the array.""" return self._array.shape @property def dtype(self) -> np.dtype: + """Data type of the array.""" return self._array.dtype @property - def chunks(self) -> tuple: + def chunks(self) -> Tuple[int, ...]: + """Chunk shape for the array.""" return self._array.chunks @property - def shards(self) -> tuple: - return self._array.shards + def shards(self) -> Optional[Tuple[int, ...]]: + """Shard shape, if supported; otherwise None.""" + return getattr(self._array, "shards", None) + + @property + def attrs(self) -> Mapping[str, Any]: + """Access metadata/attributes for this node.""" + return self._array.attrs @property def zarr_version(self) -> int: + """Get the Zarr format version.""" return self._array.metadata.zarr_format - @property - def ndim(self) -> int: - return self._array.ndim + def __getitem__(self, key) -> ArrayLike: + """Read data from the array.""" + return self._array[key] - def __setitem__(self, key, value): + def __setitem__(self, key, value: ArrayLike | Number) -> None: + """Write data to the array.""" self._array[key] = value - def __getitem__(self, item): - return self._array[item] - - def __getattr__(self, name): + def __getattr__(self, name: str): + # Delegate any unknown attributes to the underlying array if name == "_array": return self._array if hasattr(self._array, name): return getattr(self._array, name) - else: - raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'") + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{name}'" + ) class ZarrPythonGroup(ZarrGroup): + """Zarr Group implementation using the zarr-python library.""" + + def __init__(self, zarr_group: zarr.Group) -> None: + """ + Parameters + ---------- + zarr_group : zarr.Group + Underlying Zarr Python group. + """ + super().__init__(str(zarr_group.store_path)) + + self._zgroup = zarr_group + @classmethod def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrPythonGroup': + """Create a Zarr group from a configuration object.""" store = zarr.storage.LocalStore(zarr_config.out) return cls(zarr.group(store=store, # TODO: figure out overwrite # overwrite=overwrite, zarr_format=zarr_config.zarr_version)) - def __init__(self, zarr_group: zarr.Group): - super().__init__(str(zarr_group.store_path)) - self._zgroup = zarr_group - - def create_group(self, *args, **kwargs): - """ - Create a new subgroup in the group. - """ - return ZarrPythonGroup(self._zgroup.create_group(*args, **kwargs)) - - def keys(self): - yield from self._zgroup.keys() - @property - def attrs(self): + def attrs(self) -> Mapping[str, Any]: + """Access metadata/attributes for this node.""" return self._zgroup.attrs - def __iter__(self) -> Iterator[str]: - yield from self.keys() + @property + def zarr_version(self) -> Literal[2, 3]: + """Get the Zarr format version.""" + return self._zgroup.metadata.zarr_format - def __getitem__(self, key) -> Union[ZarrPythonArray, 'ZarrPythonGroup']: - if key not in self._zgroup: - raise KeyError(f"Key '{key}' not found in group '{self.path}'") + def keys(self): + yield from self._zgroup.keys() - item = self._zgroup[key] + def __getitem__(self, name: str) -> Union[ZarrPythonArray, "ZarrPythonGroup"]: + """Get a subgroup or array by name within this group.""" + if name not in self._zgroup: + raise KeyError(f"Key '{name}' not found in group '{self.store_path}'") + item = self._zgroup[name] if isinstance(item, zarr.Group): return ZarrPythonGroup(item) elif isinstance(item, zarr.Array): @@ -101,17 +137,36 @@ def __getitem__(self, key) -> Union[ZarrPythonArray, 'ZarrPythonGroup']: else: raise TypeError(f"Unsupported item type: {type(item)}") + def __delitem__(self, name: str) -> None: + """Delete a subgroup or array by name within this group.""" + del self._zgroup[name] + + def __iter__(self) -> Iterator[str]: + yield from self.keys() + def __getattr__(self, name): return getattr(self._zgroup, name) - def create_array(self, - name: str, - shape: tuple, - zarr_config: ZarrConfig = None, - dtype: DTypeLike = np.int32, - data=None, - **kwargs - ) -> zarr.Array: + def _get_zarr_python_group(self) -> zarr.Group: + """Get the underlying Zarr Python group object.""" + return self._zgroup + + def create_group(self, name: str, overwrite: bool = False) -> "ZarrPythonGroup": + """Create or open a subgroup within this group.""" + subgroup = self._zgroup.create_group(name, overwrite=overwrite) + return ZarrPythonGroup(subgroup) + + def create_array( + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig] + ) -> ZarrPythonArray: + """Create a new array within this group.""" if zarr_config is None: arr = self._zgroup.create_array(name, shape, dtype, **kwargs) if data is not None: @@ -120,7 +175,7 @@ def create_array(self, compressor = zarr_config.compressor compressor_opt = zarr_config.compressor_opt - chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) + chunk, shard = _compute_zarr_layout(shape, dtype, zarr_config) if isinstance(compressor_opt, str): compressor_opt = ast.literal_eval(compressor_opt) @@ -131,11 +186,11 @@ def create_array(self, "order": zarr_config.order, "dtype": np.dtype(dtype).str, "fill_value": None, - "compressors": make_compressor(compressor, zarr_config.zarr_version, - **compressor_opt), + "compressors": _make_compressor(compressor, zarr_config.zarr_version, + **compressor_opt), } - chunk_key_encoding = dimension_separator_to_chunk_key_encoding( + chunk_key_encoding = _dimension_separator_to_chunk_key_encoding( zarr_config.dimension_separator, zarr_config.zarr_version) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding @@ -146,11 +201,14 @@ def create_array(self, arr[:] = data return ZarrPythonArray(arr) - def create_array_from_base(self, name: str, shape: tuple, data=None, - **kwargs) -> 'ZarrPythonArray': - """ - Create a new array using the properties from a base_level object. - """ + def create_array_from_base( + self, + name: str, + shape: Sequence[int], + data: ArrayLike = None, + **kwargs: Unpack[ZarrArrayConfig] + ) -> ZarrPythonArray: + """Create a new array using the properties from a base_level object.""" base_level = self['0'] opts = dict( dtype=base_level.dtype, @@ -168,7 +226,7 @@ def create_array_from_base(self, name: str, shape: tuple, data=None, meta = getattr(base_level, "metadata", None) if meta is not None: if hasattr(meta, "dimension_separator"): - opts["chunk_key_encoding"] = dimension_separator_to_chunk_key_encoding( + opts["chunk_key_encoding"] = _dimension_separator_to_chunk_key_encoding( meta.dimension_separator, 2) if hasattr(meta, "chunk_key_encoding"): opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) @@ -184,18 +242,8 @@ def create_array_from_base(self, name: str, shape: tuple, data=None, arr[:] = data return ZarrPythonArray(arr) - @property - def zarr_version(self) -> Literal[2, 3]: - return self._zgroup.metadata.zarr_format - - def __delitem__(self, key): - del self._zgroup[key] - - def _get_zarr_python_group(self): - return self._zgroup - -def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: +def _make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: """Build compressor object from name and options.""" if not isinstance(name, str): return name @@ -225,56 +273,7 @@ def make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) return Compressor(**prm) -SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio - 2 * # TB - 2 ** 30 # GB->Bytes - ) - - -def open_zarr_group(zarr_config: ZarrConfig): - # TODO: check out is not none or empty - store = zarr.storage.LocalStore(zarr_config.out) - return zarr.group(store=store, overwrite=True, zarr_format=zarr_config.zarr_version) - - -def create_array( - omz: zarr.Group, - name: str, - shape: tuple, - zarr_config: ZarrConfig, - dtype: DTypeLike = np.int32, - data=None - ) -> zarr.Array: - compressor = zarr_config.compressor - compressor_opt = zarr_config.compressor_opt - chunk, shard = compute_zarr_layout(shape, dtype, zarr_config) - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - - opt = { - "chunks": chunk, - "shards": shard, - "order": zarr_config.order, - "dtype": np.dtype(dtype).str, - "fill_value": None, - "compressors": make_compressor(compressor, zarr_config.zarr_version, - **compressor_opt), - } - - chunk_key_encoding = dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version) - if chunk_key_encoding: - opt["chunk_key_encoding"] = chunk_key_encoding - arr = omz.create_array(name=name, - shape=shape, - **opt) - if data: - arr[:] = data - return arr - - -def dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version): +def _dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version): dimension_separator = dimension_separator if dimension_separator == '.' and zarr_version == 2: pass @@ -287,7 +286,13 @@ def dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version) return dimension_separator -def compute_zarr_layout( +SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio + 2 * # TB + 2 ** 30 # GB->Bytes + ) + + +def _compute_zarr_layout( shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig @@ -361,7 +366,8 @@ def compute_zarr_layout( M.append(m_uniform) free_dims.append(i) - # Iteratively try to increase free dimensions while keeping the overall product ≤ B_multiplier. + # Iteratively try to increase free dimensions while keeping the overall + # product ≤ B_multiplier. improved = True while improved and free_dims: improved = False diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index f0b27c8f..9b3f25aa 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,8 +1,11 @@ import warnings +from linc_convert.utils.io.zarr import ZarrNode from linc_convert.utils.io.zarr.abc import ZarrGroup -from linc_convert.utils.io.zarr.drivers.zarr_python import (ZarrPythonArray, - ZarrPythonGroup) +from linc_convert.utils.io.zarr.drivers.zarr_python import ( + ZarrPythonArray, + ZarrPythonGroup, + ) from linc_convert.utils.zarr_config import DriverLike, ZarrConfig _DRIVER_ARRAY = { @@ -13,8 +16,7 @@ } try: - from linc_convert.utils.io.zarr.drivers.tensorstore import (ZarrTSArray, - ZarrTSGroup) + from linc_convert.utils.io.zarr.drivers.tensorstore import ZarrTSArray, ZarrTSGroup _DRIVER_ARRAY["tensorstore"] = ZarrTSArray _DRIVER_GROUP["tensorstore"] = ZarrTSGroup @@ -22,7 +24,7 @@ warnings.warn(f"Tensorstore driver not available: {e}.") -def open(driver: DriverLike): +def open(driver: DriverLike) -> ZarrNode: raise NotImplementedError From 03bb132802e5429772414154c3687a6c363e83cb Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 14:42:18 -0400 Subject: [PATCH 116/157] fix: api update --- linc_convert/modalities/df/single_slice.py | 3 ++- linc_convert/modalities/psoct/single_volume.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 9d3304a8..6df025dc 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -91,7 +91,8 @@ def convert( subdat = WrappedJ2K(j2k, level=level) shape = subdat.shape print("Convert level", level, "with shape", shape) - array = omz.create_array(str(level), shape=shape, zarr_config=zarr_config) + array = omz.create_array(str(level), shape=shape, zarr_config=zarr_config, + dtype=j2k.dtype) if max_load is None or (shape[-2] < max_load and shape[-1] < max_load): array[...] = subdat[...] diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 89430533..ea3cb196 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -66,7 +66,6 @@ def convert( *, key: Optional[str] = None, meta: str = None, - no_pool: Optional[int] = None, orientation: str = "RAS", center: bool = True, zarr_config: ZarrConfig = None, From 4c0da188ea4bd2c4d7c7dc6aa13f5b473b4d7b26 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 14:42:24 -0400 Subject: [PATCH 117/157] fix: api update --- tests/test_wk.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_wk.py b/tests/test_wk.py index 35f7f04a..b89fbe9a 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -75,7 +75,7 @@ def _write_test_data(directory: str) -> None: omz.attrs["multiscales"] = multiscales -@pytest.skip("Jingjing said she wants to rewrite this part herself") +@pytest.mark.skip("Jingjing said she wants to rewrite this part herself") def test_wk(tmp_path): _write_test_data(tmp_path) From cc43bbef5c08a1c4dbe2b6205fc0a974f19b2b8b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 15:18:59 -0400 Subject: [PATCH 118/157] docs --- linc_convert/modalities/psoct/_utils.py | 27 +- linc_convert/modalities/psoct/multi_slice.py | 7 +- .../modalities/psoct/single_volume.py | 7 +- linc_convert/utils/chunk_processing.py | 9 +- linc_convert/utils/io/generate_pyramid.py | 2 - linc_convert/utils/io/spool.py | 7 +- linc_convert/utils/io/zarr/__init__.py | 6 +- linc_convert/utils/io/zarr/abc.py | 4 +- .../utils/io/zarr/drivers/__init__.py | 1 + .../utils/io/zarr/drivers/tensorstore.py | 412 +++++++++++------- .../utils/io/zarr/drivers/zarr_python.py | 35 +- linc_convert/utils/io/zarr/drivers/zarrita.py | 1 + linc_convert/utils/io/zarr/factory.py | 1 + 13 files changed, 333 insertions(+), 186 deletions(-) diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 08d7b8ec..0bca181c 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -111,10 +111,12 @@ def struct_arr_to_dict(arr: np.void) -> dict: """ Convert a NumPy structured array (single record) to a dictionary. - Parameters: + Parameters + ---------- arr (np.void): A structured array element. - Returns: + Returns + ------- dict: Dictionary mapping field names to their values. """ return {name: arr[name].item() for name in arr.dtype.names} @@ -124,15 +126,18 @@ def find_experiment_params(exp_file: str) -> tuple[dict, bool]: """ Load experiment parameters from a .mat file, detecting if it's a Fiji experiment. - Parameters: + Parameters + ---------- exp_file (str): Path to the .mat file. - Returns: + Returns + ------- tuple: - dict: Experiment parameters. - bool: True if it's a Fiji experiment, False otherwise. - Raises: + Raises + ------ ValueError: If no experiment key is found in the file. """ is_fiji = False @@ -157,10 +162,12 @@ def mat_vars(mat_file: str) -> Generator[str, None, None]: """ Yield variable names from a .mat file, excluding internal variables. - Parameters: + Parameters + ---------- mat_file (str): Path to the .mat file. - Yields: + Yields + ------ str: Variable names not starting with '__'. """ yield from (name for name, *_ in sio.whosmat(mat_file) if not name.startswith('__')) @@ -174,10 +181,12 @@ def atleast_2d_trailing(arr: ArrayLike) -> np.ndarray: If the input is 0D (scalar), it becomes shape (1, 1). If it's already 2D or more, it's returned unchanged. - Parameters: + Parameters + ---------- arr (ArrayLike): Input array-like object. - Returns: + Returns + ------- np.ndarray: A 2D or higher NumPy array with at least two dimensions. """ arr = np.asarray(arr) diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 3e66ea76..f2d35ffe 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -19,8 +19,11 @@ from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct -from linc_convert.utils.io._array_wrapper import (_ArrayWrapper, _H5ArrayWrapper, - _MatArrayWrapper) +from linc_convert.utils.io._array_wrapper import ( + _ArrayWrapper, + _H5ArrayWrapper, + _MatArrayWrapper, + ) from linc_convert.utils.io.zarr import from_config from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index ea3cb196..86ce0ed7 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -19,8 +19,11 @@ from linc_convert.modalities.psoct._utils import make_json from linc_convert.modalities.psoct.cli import psoct from linc_convert.utils.chunk_processing import chunk_slice_generator -from linc_convert.utils.io._array_wrapper import (_ArrayWrapper, _H5ArrayWrapper, - _MatArrayWrapper) +from linc_convert.utils.io._array_wrapper import ( + _ArrayWrapper, + _H5ArrayWrapper, + _MatArrayWrapper, + ) from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index 490a1f36..d71cb2b9 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -9,11 +9,14 @@ def chunk_slice_generator(arr_shape, chunk_shape): chunk_shape for the last dimensions. - Parameters: + Parameters + ---------- arr_shape (tuple): The shape of the array. - chunk_shape (tuple): A tuple of integers representing the chunk size for each of the last dimensions. + chunk_shape (tuple): A tuple of integers representing the chunk size for each + of the last dimensions. - Yields: + Yields + ------ tuple: A tuple (index, full_slice) where: - index is a tuple representing the multi-index of the chunk. - full_slice is a tuple of slice objects (prefixed by an Ellipsis to preserve any non-chunked dimensions) diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index 01438aac..c530a2b8 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -2,7 +2,6 @@ import math from typing import Optional -import dask import dask.array as da logger = logging.getLogger(__name__) @@ -54,7 +53,6 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): Array of shape (..., ceil(N1/2), ceil(N2/2), ...,ceil(Nndim/2)) except on `no_pyramid_axis` where the length is unchanged. """ - # figure out which global axes we’re coarsening start = arr.ndim - ndim pyramid_axes = list(range(start, arr.ndim)) diff --git a/linc_convert/utils/io/spool.py b/linc_convert/utils/io/spool.py index 579d07fa..b1ce6b64 100644 --- a/linc_convert/utils/io/spool.py +++ b/linc_convert/utils/io/spool.py @@ -162,11 +162,12 @@ def __len__(self): return len(self.spool_files) def _get_spool_names_in_order(self): - ''' - Spool files are ordered sequentially in the order they were collected 0,1,2,...,201,202,203,... + """ + Spool files are ordered sequentially in the order they were collected 0,1,2, + ...,201,202,203,... but file names are recorded as the reversed number padded to 10 digits (0000000000,1000000000,20000000000,...,1020000000,2020000000,3020000000,...) + spool.dat - ''' + """ spool_files = self._list_spool_files() for idx in range(len(spool_files)): # Convert index to string, pad with zeros to 10 digits and reverse diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index 6a985a77..9ef2aad8 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -1,3 +1,4 @@ +"""ZarrIO module for handling Zarr data structures.""" import logging import warnings @@ -5,10 +6,11 @@ from .abc import ZarrArray, ZarrGroup, ZarrNode from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup +from .factory import from_config, open, open_group try: import tensorstore as TS + + from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup except ImportError: warnings.warn("Tensorstore is not installed, driver disabled") -from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup -from .factory import from_config, open, open_group diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index 29343d0f..74ef1908 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -1,6 +1,6 @@ """Abstract base classes for ZarrIO interfaces.""" -from abc import ABC, ABCMeta, abstractmethod +from abc import ABC, abstractmethod from numbers import Number from os import PathLike from typing import ( @@ -37,6 +37,8 @@ class ZarrArrayConfig(TypedDict): + """Configuration for creating a Zarr Array.""" + chunks: tuple[int, ...] shards: Optional[tuple[int, ...]] compressors: Literal["blosc", "zlib", None] diff --git a/linc_convert/utils/io/zarr/drivers/__init__.py b/linc_convert/utils/io/zarr/drivers/__init__.py index e69de29b..2d9e2a33 100644 --- a/linc_convert/utils/io/zarr/drivers/__init__.py +++ b/linc_convert/utils/io/zarr/drivers/__init__.py @@ -0,0 +1 @@ +"""Implmenetaiton of ZarrIO using different libraries.""" diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index e87ee955..0c10ebd7 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -1,159 +1,301 @@ -import ast +"""TensorStore driver for Zarr arrays and groups.""" import json import math import os +from numbers import Number from os import PathLike -from typing import Any, Literal, Mapping, Optional, Tuple, Union +from typing import ( + Any, + Iterator, + Literal, + Mapping, + Optional, + Sequence, + Tuple, + Union, + Unpack, + ) from urllib.parse import urlparse import numcodecs import numcodecs.abc import numpy as np import tensorstore as ts -from numpy.typing import DTypeLike +import zarr +from numpy.typing import ArrayLike, DTypeLike from upath import UPath -from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrGroup +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.zarr_config import ZarrConfig class ZarrTSArray(ZarrArray): - def __init__(self, ts: ts.TensorStore): - super().__init__(ts.kvstore.path) - self._ts = ts + """Zarr array backed by TensorStore.""" - @property - def shape(self): - return self._ts.shape + def __init__(self, ts_array: ts.TensorStore) -> None: + """ + Initialize the ZarrTSArray with a TensorStore array. + + Parameters + ---------- + ts_array : tensorstore.TensorStore + Underlying TensorStore array. + """ + super().__init__(str(ts_array.kvstore.path)) + self._ts = ts_array @property - def ndim(self): + def ndim(self) -> int: + """Number of dimensions of the array.""" return self._ts.ndim @property - def dtype(self): + def shape(self) -> Tuple[int, ...]: + """Shape of the array.""" + return self._ts.shape + + @property + def dtype(self) -> np.dtype: + """Data type of the array.""" return self._ts.dtype.numpy_dtype @property - def chunks(self): + def chunks(self) -> Tuple[int, ...]: + """Chunk shape for the array.""" return self._ts.chunk_layout.read_chunk.shape @property def shards(self) -> Optional[Tuple[int, ...]]: - if (self._ts.chunk_layout.read_chunk.shape == - self._ts.chunk_layout.write_chunk.shape): - return None - else: - return self._ts.chunk_layout.write_chunk.shape + """Shard shape, if supported; otherwise None.""" + read_shape = self._ts.chunk_layout.read_chunk.shape + write_shape = self._ts.chunk_layout.write_chunk.shape + return None if read_shape == write_shape else write_shape @property - def zarr_version(self) -> int: - driver_map = {"zarr3": 3, "zarr": 2} - return driver_map[self._ts.schema.codec.to_json()['driver']] + def attrs(self) -> Mapping[str, Any]: + """Access metadata/attributes for this node.""" + # TODO: TensorStore currently doesn’t expose arbitrary attrs, so return empty. + return {} - def __getitem__(self, idx): - return self._ts[idx].read().result() + @property + def zarr_version(self) -> Literal[2, 3]: + """Get the Zarr format version.""" + driver = self._ts.schema.codec.to_json().get("driver", "") + return 3 if driver == "zarr3" else 2 - def __setitem__(self, idx, val): - self._ts[idx] = val + def __getitem__(self, key: str) -> ArrayLike: + """Read data from the array.""" + return self._ts[key].read().result() - # TODO: implement - @property - def attrs(self): - return {} + def __setitem__(self, key: str, value: ArrayLike | Number) -> None: + """Write data to the array.""" + self._ts[key] = value @classmethod - def open(cls, path: PathLike, zarr_version: Literal[2, 3] = 3): + def open( + cls, + path: Union[str, PathLike], + *, + zarr_version: Literal[2, 3] = 3, + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + ) -> "ZarrTSArray": + """ + Open an existing TensorStore-based Zarr array. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the array’s directory. + zarr_version : {2, 3} + Zarr format version to use. + mode : {'r','r+','a','w','w-'} + Access mode; see TensorStore docs. - conf = { + Returns + ------- + ZarrTSArray + """ + spec = { "kvstore": make_kvstore(path), "driver": "zarr3" if zarr_version == 3 else "zarr", "open": True, "create": False, "delete_existing": False, } - return cls(ts.open(conf).result()) + ts_array = ts.open(spec).result() + return cls(ts_array) + class ZarrTSGroup(ZarrGroup): - def __init__(self, store_path: Union[str, PathLike]): + """Zarr Group implementation using TensorStore as backend.""" + + def __init__(self, store_path: Union[str, PathLike]) -> None: + """ + Initialize the ZarrTSGroup. + + Parameters + ---------- + store_path : Union[str, PathLike] + Path to the group’s directory. + """ super().__init__(store_path) from upath import UPath - if not isinstance(store_path, UPath): - store_path = UPath(store_path) - self._path = store_path - metadata = _detect_metadata(store_path) - assert metadata is not None - assert metadata[0] == "group" - self._zarr_version = metadata[1] - self._zarr_config = None + self._path = UPath(store_path) + meta = _detect_metadata(self._path) + assert meta and meta[0] == "group" + self._zarr_version = meta[1] - @property - def zarr_version(self): - return self._zarr_version + @classmethod + def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": + """ + Create a ZarrTSGroup from a configuration object. + + Parameters + ---------- + zarr_config : ZarrConfig + Configuration with .out and .zarr_version. + + Returns + ------- + ZarrTSGroup + """ + return cls.open(zarr_config.out, mode="a", + zarr_version=zarr_config.zarr_version) + + @classmethod + def open( + cls, + path: Union[str, PathLike], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + *, + zarr_version: Literal[2, 3] = 3, + ) -> "ZarrTSGroup": + """ + Open or create a Zarr group backed by TensorStore. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the Zarr group. + mode : {'r','r+','a','w','w-'} + Persistence mode; see TensorStore docs. + zarr_version : {2,3} + Zarr format version. + + Returns + ------- + ZarrTSGroup + """ + from upath import UPath + + p = UPath(path) + if mode in ("r", "r+"): + if not p.exists() or not p.is_dir(): + raise FileNotFoundError(f"Group path '{p}' does not exist") + elif mode == "w-": + if p.exists(): + raise FileExistsError(f"Group path '{p}' already exists") + elif mode == "a": + if not p.exists(): + _init_group(p, zarr_version) + elif mode == "w": + if p.exists(): + p.rmdir(recursive=True) + _init_group(p, zarr_version) + else: + raise ValueError(f"Invalid mode '{mode}'") + return cls(p) @property def attrs(self) -> Mapping[str, Any]: + """Access metadata/attributes for this node.""" return {} - def keys(self): + @property + def zarr_version(self) -> Literal[2, 3]: + """Get the Zarr format version.""" + return self._zarr_version + + def __getitem__(self, name: str) -> Union[ZarrTSArray, "ZarrTSGroup"]: + """Get a subgroup or array by name within this group.""" + meta = _detect_metadata(self._path / name) + if not meta: + raise KeyError(f"Key '{name}' not found") + if meta[0] == "group": + return ZarrTSGroup(self._path / name) + return ZarrTSArray.open(self._path / name, zarr_version=meta[1]) + + def __delitem__(self, name: str) -> None: + """Delete a subgroup or array by name within this group.""" + target = self._path / name + if target.exists(): + target.rmdir(recursive=True) + + def keys(self) -> Iterator[str]: + """Get the names of all subgroups and arrays in this group.""" return ( - sub_dir.name for sub_dir in self._path.iterdir() - if sub_dir.is_dir() and _detect_metadata(sub_dir) + p.name + for p in self._path.iterdir() + if p.is_dir() and _detect_metadata(p) ) - def __getitem__(self, key) -> Union[ZarrTSArray, 'ZarrTSGroup']: - metadata = _detect_metadata(self._path / key) - if metadata is None: - raise KeyError(key) - if metadata[0] == "group": - return ZarrTSGroup(self._path / key) - if metadata[0] == "array": - return ZarrTSArray.open(self._path / key, metadata[1]) - - def __contains__(self, key) -> bool: - if not (self._path / key).exists(): - return False - if _detect_metadata(self._path / key) is None: - return False - return True + def __contains__(self, name: str) -> bool: + """Check whether a subgroup or array exists in this group.""" + p = self._path / name + return p.exists() and bool(_detect_metadata(p)) - def __delitem__(self, key): - if key in self: - (self._path / key).rmdir(recursive=True) + def _get_zarr_python_group(self) -> "zarr.Group": + """Get the underlying Zarr Python group object.""" + return zarr.open_group(self._path, mode="a") - def create_array_from_base(self, name: str, shape: Tuple[int, ...], - data: Optional[Any] = None, **kwargs) -> 'ZarrArray': + def create_group(self, name: str, overwrite: bool = False) -> "ZarrTSGroup": + """ + Create or open a subgroup within this group. - spec = self['0']._ts.spec().to_json() - spec['metadata']['shape'] = shape - kvstore = make_kvstore(self._path / name) - spec['kvstore'] = kvstore - spec['delete_existing'] = True - spec['create'] = True - arr = ts.open(spec).result() - if data is not None: - arr[:] = data - return ZarrTSArray(arr) + Parameters + ---------- + name : str + overwrite : bool + If True, delete existing before creating. + + Returns + ------- + ZarrTSGroup + """ + mode = "w" if overwrite else "w-" + return self.open(self._path / name, mode=mode, zarr_version=self._zarr_version) + + def create_array( + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike = np.int32, + *, + zarr_config: Optional[ZarrConfig] = None, + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig], + ) -> ZarrTSArray: + """ + Create a new array within this group. - def create_array(self, - name: str, - shape: tuple, - zarr_config: ZarrConfig = None, - dtype: DTypeLike = np.int32, - data=None, - **kwargs - ) -> ZarrArray: + Parameters + ---------- + name : str + shape : Sequence[int] + dtype : DTypeLike + zarr_config : ZarrConfig | None + data : ArrayLike | None + + Returns + ------- + ZarrTSArray + """ if zarr_config is None: - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - **kwargs - ) + conf = default_write_config(self._path / name, shape=shape, dtype=dtype, + **kwargs) else: - compressor_opt = ast.literal_eval(zarr_config.compressor_opt) conf = default_write_config( self._path / name, shape=shape, @@ -162,78 +304,43 @@ def create_array(self, shard=zarr_config.shard, compressor=zarr_config.compressor, # TODO: implement this - # compressor_opt=, + # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), version=zarr_config.zarr_version, ) - conf['delete_existing'] = True - conf['create'] = True + conf.update(delete_existing=True, create=True) arr = ts.open(conf).result() if data is not None: arr[:] = data return ZarrTSArray(arr) - def create_group(self, name: str, *, overwrite: bool = False, - zarr_version: Literal[2, 3] = None) -> 'ZarrGroup': - if zarr_version is None: - zarr_version = self.zarr_version - if overwrite: - mode = 'w' - else: - mode = 'w-' - return self.open(self._path / name, mode=mode, zarr_version=zarr_version) - - @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrGroup': - return cls.open(zarr_config.out, zarr_version=zarr_config.zarr_version) - - @classmethod - def open(cls, path: Union[str, PathLike], mode="a", *, - zarr_version: Literal[2, 3] = 3) -> 'ZarrTSGroup': + def create_array_from_base( + self, + name: str, + shape: Sequence[int], + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig], + ) -> ZarrTSArray: """ - Open a Zarr group from a path. + Create a new array using metadata of an existing base-level array. Parameters ---------- - path : Union[str, PathLike] - Path to the Zarr group. - mode : str - Persistence mode: - 'r' means read only (must exist); - 'r+' means read/write (must exist); - 'a' means read/write (create if doesn't exist); - 'w' means create (overwrite if exists); - 'w-' means create (fail if exists). + name : str + shape : Sequence[int] + data : ArrayLike | None Returns ------- - ZarrTSGroup - An instance of ZarrTSGroup. + ZarrTSArray """ - p = UPath(path) - - if mode in ['r', 'r+']: - if not p.exists() or not p.is_dir(): - raise FileNotFoundError(f"Group path '{p}' does not exist") - elif mode == 'w-': - if p.exists(): - raise FileExistsError(f"Group path '{p}' already exists") - elif mode == 'a': - if not p.exists(): - _init_group(p, zarr_version) - elif mode == 'w': - if p.exists(): - p.rmdir(recursive=True) - _init_group(p, zarr_version) - else: - raise ValueError( - f"Invalid mode '{mode}'. Use 'r', 'r+', 'a', 'w', or 'w-' ") - - return cls(p) - - def _get_zarr_python_group(self): - import zarr - - return zarr.open_group(self._path, mode='a') + base = self["0"]._ts.spec().to_json() + base["metadata"]["shape"] = shape + base["kvstore"] = make_kvstore(self._path / name) + base.update(delete_existing=True, create=True) + arr = ts.open(base).result() + if data is not None: + arr[:] = data + return ZarrTSArray(arr) def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: @@ -406,7 +513,7 @@ def default_read_config(path: os.PathLike | str) -> dict: } -def _is_array(path): +def _is_array(path: PathLike) -> bool: zarr2_array_file = path / ".zarray" if zarr2_array_file.is_file(): content = zarr2_array_file.read_text() @@ -423,7 +530,7 @@ def _is_array(path): return False -def _is_group(path): +def _is_group(path: PathLike) -> bool: zarr2_group_file = path / ".zgroup" if zarr2_group_file.is_file(): content = zarr2_group_file.read_text() @@ -443,6 +550,7 @@ def _is_group(path): def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: """ Look for Zarr metadata files in `path` and return (node_type, version). + Checks zarr.json (v3), then .zarray/.zgroup (v2). """ # Zarr v3 @@ -619,7 +727,7 @@ def default_write_config( return config -def _init_group(group_path: PathLike, version: int): +def _init_group(group_path: PathLike, version: int) -> None: group_path.mkdir(parents=True, exist_ok=True) if version == 3: (group_path / 'zarr.json').write_text( diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 0931da46..b21e9e3b 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -3,7 +3,8 @@ from numbers import Number from typing import ( Any, - Iterator, Literal, + Iterator, + Literal, Mapping, Optional, Sequence, @@ -16,7 +17,8 @@ import zarr import zarr.codecs from numpy.typing import ArrayLike, DTypeLike -from zarr.core.chunk_key_encodings import ChunkKeyEncodingParams +from zarr.core.array import CompressorsLike +from zarr.core.chunk_key_encodings import ChunkKeyEncodingLike, ChunkKeyEncodingParams from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.zarr_config import ZarrConfig @@ -27,6 +29,8 @@ class ZarrPythonArray(ZarrArray): def __init__(self, array: zarr.Array) -> None: """ + Initialize the ZarrPythonArray with a zarr.Array. + Parameters ---------- array : zarr.Array @@ -70,16 +74,16 @@ def zarr_version(self) -> int: """Get the Zarr format version.""" return self._array.metadata.zarr_format - def __getitem__(self, key) -> ArrayLike: + def __getitem__(self, key: str) -> ArrayLike: """Read data from the array.""" return self._array[key] - def __setitem__(self, key, value: ArrayLike | Number) -> None: + def __setitem__(self, key: str, value: ArrayLike | Number) -> None: """Write data to the array.""" self._array[key] = value - def __getattr__(self, name: str): - # Delegate any unknown attributes to the underlying array + def __getattr__(self, name: str) -> Any: # noqa: ANN401 + """Delegate any unknown attributes to the underlying array.""" if name == "_array": return self._array if hasattr(self._array, name): @@ -94,6 +98,8 @@ class ZarrPythonGroup(ZarrGroup): def __init__(self, zarr_group: zarr.Group) -> None: """ + Initialize the ZarrPythonGroup with a zarr.Group. + Parameters ---------- zarr_group : zarr.Group @@ -122,7 +128,8 @@ def zarr_version(self) -> Literal[2, 3]: """Get the Zarr format version.""" return self._zgroup.metadata.zarr_format - def keys(self): + def keys(self) -> Iterator[str]: + """Get the names of all subgroups and arrays in this group.""" yield from self._zgroup.keys() def __getitem__(self, name: str) -> Union[ZarrPythonArray, "ZarrPythonGroup"]: @@ -142,9 +149,11 @@ def __delitem__(self, name: str) -> None: del self._zgroup[name] def __iter__(self) -> Iterator[str]: + """Iterate over the names of all subgroups and arrays in this group.""" yield from self.keys() - def __getattr__(self, name): + def __getattr__(self, name: str) -> Any: # noqa: ANN401 + """Delegate attribute access to the underlying Zarr group.""" return getattr(self._zgroup, name) def _get_zarr_python_group(self) -> zarr.Group: @@ -243,7 +252,11 @@ def create_array_from_base( return ZarrPythonArray(arr) -def _make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) -> Any: +def _make_compressor( + name: str | None, + zarr_version: Literal[2, 3], + **prm: dict + ) -> CompressorsLike: """Build compressor object from name and options.""" if not isinstance(name, str): return name @@ -273,7 +286,9 @@ def _make_compressor(name: str | None, zarr_version: Literal[2, 3], **prm: dict) return Compressor(**prm) -def _dimension_separator_to_chunk_key_encoding(dimension_separator, zarr_version): +def _dimension_separator_to_chunk_key_encoding( + dimension_separator: Literal[".", "/"], + zarr_version: Literal[2, 3]) -> ChunkKeyEncodingLike: dimension_separator = dimension_separator if dimension_separator == '.' and zarr_version == 2: pass diff --git a/linc_convert/utils/io/zarr/drivers/zarrita.py b/linc_convert/utils/io/zarr/drivers/zarrita.py index 30e73a04..6c8ac3fa 100644 --- a/linc_convert/utils/io/zarr/drivers/zarrita.py +++ b/linc_convert/utils/io/zarr/drivers/zarrita.py @@ -1 +1,2 @@ +"""Zarrita driver for Zarr groups and arrays.""" raise NotImplementedError diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index 9b3f25aa..9cac6806 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,3 +1,4 @@ +"""Factory module for creating/opening Zarr Nodes with different drivers.""" import warnings from linc_convert.utils.io.zarr import ZarrNode From ab24a582136db8b68b34dc794969545b9cb2fecd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 16:31:21 -0400 Subject: [PATCH 119/157] fix: update api --- linc_convert/modalities/wk/webknossos_annotation.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index f16c5263..12279735 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -14,7 +14,10 @@ # internals from linc_convert.modalities.wk.cli import wk -from linc_convert.utils.io.zarr.drivers.zarr_python import make_compressor +from linc_convert.utils.io.zarr import from_config +from linc_convert.utils.io.zarr.drivers.zarr_python import ( + _make_compressor as make_compressor, + ) from linc_convert.utils.math import ceildiv webknossos = cyclopts.App(name="webknossos", help_format="markdown") From eaa8d6c6210d52b5592a6064ed421e93fa1ce3c8 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 17:28:57 -0400 Subject: [PATCH 120/157] fix: update api --- .../modalities/wk/webknossos_annotation.py | 41 +++++---------- tests/test_wk.py | 51 +++++++++++++++++-- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index 12279735..5968b277 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -19,6 +19,7 @@ _make_compressor as make_compressor, ) from linc_convert.utils.math import ceildiv +from linc_convert.utils.zarr_config import ZarrConfig, update_default_config webknossos = cyclopts.App(name="webknossos", help_format="markdown") wk.command(webknossos) @@ -28,13 +29,10 @@ def convert( wkw_dir: str = None, ome_dir: str = None, - out: str = None, dic: str = None, *, - chunk: int = 1024, - compressor: str = "blosc", - compressor_opt: str = "{}", - max_load: int = 16384, + zarr_config: ZarrConfig = None, + **kwargs ) -> None: """ Convert annotations (in .wkw format) from webknossos to ome.zarr format. @@ -69,6 +67,8 @@ def convert( - 6: Dense Terminal - 7: Single Fiber """ + zarr_config = update_default_config(zarr_config, **kwargs) + dic = json.loads(dic) dic = {int(key): int(value) for key, value in dic.items()} @@ -79,7 +79,7 @@ def convert( wkw_dataset = wkw.Dataset.open(wkw_dataset_path) low_res_offsets = [] - omz_res = omz_data[nblevel - 1] + omz_res = omz_data[str(nblevel - 1)] n = omz_res.shape[1] size = omz_res.shape[-2:] for idx in range(n): @@ -95,39 +95,23 @@ def convert( # setup save info basename = os.path.basename(ome_dir)[:-9] initials = wkw_dir.split("/")[-2][:2] - out = os.path.join(out, basename + "_dsec_" + initials + ".ome.zarr") - if os.path.exists(out): - shutil.rmtree(out) - os.makedirs(out, exist_ok=True) - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) # Prepare Zarr group - store = zarr.storage.DirectoryStore(out) - omz = zarr.group(store=store, overwrite=True) - - # Prepare chunking options - opt = { - "chunks": [1, 1] + [chunk, chunk], - "dimension_separator": r"/", - "order": "F", - "dtype": "uint8", - "fill_value": None, - "compressor": make_compressor(compressor, **compressor_opt), - } - print(opt) + omz = from_config(zarr_config) + max_load = zarr_config.max_load # Write each level for level in range(nblevel): - omz_res = omz_data[level] + omz_res = omz_data[str(level)] size = omz_res.shape[-2:] shape = [1, n] + [i for i in size] wkw_dataset_path = os.path.join(wkw_dir, get_mask_name(level)) wkw_dataset = wkw.Dataset.open(wkw_dataset_path) - omz.create_dataset(f"{level}", shape=shape, **opt) + omz.create_array(f"{level}", shape=shape, dtype="uint8", + zarr_config=zarr_config) array = omz[f"{level}"] # Write each slice @@ -191,8 +175,7 @@ def convert( # Write OME-Zarr multiscale metadata print("Write metadata") - omz.attrs["multiscales"] = omz_data.attrs["multiscales"] - + omz._get_zarr_python_group().attrs["multiscales"] = omz_data.attrs["multiscales"] def get_mask_name(level: int) -> str: """ diff --git a/tests/test_wk.py b/tests/test_wk.py index b89fbe9a..75276f5e 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -1,16 +1,18 @@ import os +import shutil +from pathlib import Path +import niizarr import numpy as np import pytest -import skimage import wkw import zarr -import niizarr from nibabel import Nifti1Image from linc_convert.modalities.wk import webknossos_annotation from linc_convert.modalities.wk.webknossos_annotation import get_mask_name -from utils.compare_file import _cmp_zarr_archives +from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal +from utils.sample_data import generate_sample_data_variation def _write_test_data(directory: str) -> None: @@ -75,7 +77,7 @@ def _write_test_data(directory: str) -> None: omz.attrs["multiscales"] = multiscales -@pytest.mark.skip("Jingjing said she wants to rewrite this part herself") +@pytest.mark.skip def test_wk(tmp_path): _write_test_data(tmp_path) @@ -97,3 +99,44 @@ def test_wk(tmp_path): print("trusted result has", np.shape(z[level]), np.unique(z[level])) assert _cmp_zarr_archives(str(output_zarr), "data/wk.zarr.zip") + + +@pytest.fixture +def wk_annotation(tmp_path): + image, annotation = generate_sample_data_variation(2, output_dtype=np.uint8) + image, annotation = Nifti1Image(image, np.eye(4)), Nifti1Image(annotation, + np.eye(4)) + + niizarr.nii2zarr(image, tmp_path / "image.nii.zarr", chunk=64) + niizarr.nii2zarr(annotation, tmp_path / "annotation.nii.zarr", chunk=64) + wkw_dir = tmp_path / "wkw" + annotation_data = zarr.open(tmp_path / "annotation.nii.zarr", mode="r") + for level in range(3): + wkw_filepath = str(wkw_dir / get_mask_name(level)) + + with wkw.Dataset.create(wkw_filepath, wkw.Header(np.uint8)) as dataset: + dataset.write((0, 0, 0), np.array(annotation_data[str(level)]).T) + return tmp_path + + +def test_wkw(tmp_path, wk_annotation, zarr_version, driver): + expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "wkw.nii.zarr" + webknossos_annotation.convert(str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), out=output, + dic="{}") + assert_zarr_equal( + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r") + ) + + +@pytest.mark.golden +def test_wkw_regen_golden(tmp_path, wk_annotation, zarr_version): + expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" + output = tmp_path / "wkw.nii.zarr" + webknossos_annotation.convert(str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), out=output, + dic="{}") + base = Path(expected_zarr).with_suffix("") + shutil.make_archive(str(base), "zip", str(output)) From 80b9eb037d56d938baff361ab567b35db8f2f5d3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 21 Jul 2025 17:29:34 -0400 Subject: [PATCH 121/157] fix: update api --- tests/test_wk.py | 88 +----------------------------------------------- 1 file changed, 1 insertion(+), 87 deletions(-) diff --git a/tests/test_wk.py b/tests/test_wk.py index 75276f5e..9b19885c 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -11,96 +11,10 @@ from linc_convert.modalities.wk import webknossos_annotation from linc_convert.modalities.wk.webknossos_annotation import get_mask_name -from utils.compare_file import _cmp_zarr_archives, assert_zarr_equal +from utils.compare_file import assert_zarr_equal from utils.sample_data import generate_sample_data_variation -def _write_test_data(directory: str) -> None: - wkw_dir = f"{directory}/wkw" - ome_dir = f"{directory}/ome" - - store = zarr.storage.LocalStore(ome_dir) - omz = zarr.group(store=store, overwrite=True) - - for level in range(5): - size = 2 ** (4 - level) - wkw_array = np.zeros((size, size, 5), dtype=np.uint8) - ome_array = np.zeros((1, 5, size, size), dtype=np.uint8) - - wkw_filepath = os.path.join(wkw_dir, get_mask_name(level)) - with wkw.Dataset.create(wkw_filepath, wkw.Header(np.uint8)) as dataset: - dataset.write((0, 0, 0), wkw_array) - - omz.create_dataset(f"{level}", shape=[1, 5, size, size], dtype=np.uint8) - array = omz[f"{level}"] - array[...] = ome_array - - multiscales = [ - { - "version": "0.4", - "axes": [ - {"name": "c", "type": "space", "unit": "millimeter"}, - {"name": "z", "type": "space", "unit": "millimeter"}, - {"name": "y", "type": "space", "unit": "micrometer"}, - {"name": "x", "type": "space", "unit": "micrometer"}, - ], - "datasets": [], - "type": "jpeg2000", - "name": "", - } - ] - for n in range(5): - multiscales[0]["datasets"].append({}) - level = multiscales[0]["datasets"][-1] - level["path"] = str(n) - - level["coordinateTransformations"] = [ - { - "type": "scale", - "scale": [ - 1.0, - 1.0, - float(2 ** n), - float(2 ** n), - ], - }, - { - "type": "translation", - "translation": [ - 0.0, - 0.0, - float(2 ** n - 1) * 0.5, - float(2 ** n - 1) * 0.5, - ], - }, - ] - omz.attrs["multiscales"] = multiscales - - -@pytest.mark.skip -def test_wk(tmp_path): - _write_test_data(tmp_path) - - wkw_dir = str(tmp_path / "wkw") - ome_dir = str(tmp_path / "ome") - basename = os.path.basename(ome_dir)[:-9] - initials = wkw_dir.split("/")[-2][:2] - output_zarr = os.path.join(tmp_path, basename + "_dsec_" + initials + ".ome.zarr") - - print("starting the convert process") - webknossos_annotation.convert(wkw_dir, ome_dir, out=tmp_path, dic="{}") - - z = zarr.open(output_zarr, mode="r") - for level in range(5): - print("output_zarr has", np.shape(z[level]), np.unique(z[level])) - - z = zarr.open("data/wk.zarr.zip", mode="r") - for level in range(5): - print("trusted result has", np.shape(z[level]), np.unique(z[level])) - - assert _cmp_zarr_archives(str(output_zarr), "data/wk.zarr.zip") - - @pytest.fixture def wk_annotation(tmp_path): image, annotation = generate_sample_data_variation(2, output_dtype=np.uint8) From 89c4d6a1f941fc2adf25fd16e84503a36390350a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 22 Jul 2025 14:16:36 -0400 Subject: [PATCH 122/157] docs and style --- linc_convert/modalities/df/multi_slice.py | 16 +- linc_convert/modalities/df/single_slice.py | 13 +- linc_convert/modalities/lsm/mosaic.py | 20 +- linc_convert/modalities/lsm/multi_slice.py | 19 +- linc_convert/modalities/lsm/spool.py | 58 +++-- linc_convert/modalities/psoct/_utils.py | 9 +- linc_convert/modalities/psoct/multi_slice.py | 14 +- .../modalities/psoct/single_volume.py | 15 +- .../modalities/wk/webknossos_annotation.py | 20 +- linc_convert/utils/__init__.py | 3 +- linc_convert/utils/chunk_processing.py | 37 +-- linc_convert/utils/io/__init__.py | 1 + linc_convert/utils/io/generate_pyramid.py | 75 +++++- linc_convert/utils/io/spool.py | 223 ++++++++++++------ linc_convert/utils/io/zarr/__init__.py | 19 +- linc_convert/utils/io/zarr/abc.py | 3 +- .../utils/io/zarr/drivers/tensorstore.py | 36 ++- .../utils/io/zarr/drivers/zarr_python.py | 82 ++++--- linc_convert/utils/io/zarr/drivers/zarrita.py | 1 + linc_convert/utils/io/zarr/factory.py | 63 ++++- linc_convert/utils/logging.py | 14 +- linc_convert/utils/zarr_config.py | 12 +- tests/conftest.py | 4 +- 23 files changed, 497 insertions(+), 260 deletions(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index dc2cdf49..66ebd34c 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -8,6 +8,7 @@ # stdlib import json import os +from typing import Unpack # externals import glymur @@ -38,11 +39,10 @@ def convert( inp: list[str], *, zarr_config: ZarrConfig = None, - max_load: int = 16384, orientation: str = "coronal", center: bool = True, thickness: float | None = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. @@ -79,8 +79,6 @@ def convert( ---------- inp Path to the input slices - max_load - Maximum input chunk size orientation Orientation of the slice center @@ -90,7 +88,7 @@ def convert( """ zarr_config = update_default_config(zarr_config, **kwargs) zarr_config.set_default_name(os.path.splitext(inp[0])[0]) - + max_load = zarr_config.max_load omz = from_config(zarr_config) nblevel, has_channel, dtype_jp2 = float("inf"), float("inf"), "" @@ -184,8 +182,12 @@ def convert( axes = ["z", "y", "x"] if has_channel: axes.insert(0, "c") - omz.write_ome_metadata(axes=axes, space_scale=[1.0] + list(get_pixelsize(j2k)), - multiscales_type="jpeg2000", no_pool=0) + omz.write_ome_metadata( + axes=axes, + space_scale=[1.0] + list(get_pixelsize(j2k)), + multiscales_type="jpeg2000", + no_pool=0, + ) # Write NIfTI-Zarr header # NOTE: we use nifti2 because dimensions typically do not fit in a short diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 6df025dc..5d398dc0 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -7,6 +7,7 @@ # stdlib import os +from typing import Unpack # externals import glymur @@ -34,7 +35,7 @@ def convert( orientation: str = "coronal", center: bool = True, thickness: float | None = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a JPEG2000 file generated by MBF-Neurolucida into a Zarr pyramid. @@ -91,8 +92,9 @@ def convert( subdat = WrappedJ2K(j2k, level=level) shape = subdat.shape print("Convert level", level, "with shape", shape) - array = omz.create_array(str(level), shape=shape, zarr_config=zarr_config, - dtype=j2k.dtype) + array = omz.create_array( + str(level), shape=shape, zarr_config=zarr_config, dtype=j2k.dtype + ) if max_load is None or (shape[-2] < max_load and shape[-1] < max_load): array[...] = subdat[...] @@ -116,8 +118,9 @@ def convert( # Write OME-Zarr multiscale metadata print("Write metadata") axes = ["c", "y", "x"] if has_channel else ["y", "x"] - omz.write_ome_metadata(axes=axes, space_scale=get_pixelsize(j2k), - multiscales_type="jpeg2000") + omz.write_ome_metadata( + axes=axes, space_scale=get_pixelsize(j2k), multiscales_type="jpeg2000" + ) if not zarr_config.nii: print("done.") diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index 1fe6e97e..8a0da4bd 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -9,6 +9,7 @@ import os import re from glob import glob +from typing import Unpack # externals import cyclopts @@ -35,7 +36,7 @@ def convert( center: bool = True, thickness: float | None = None, voxel_size: list[float] = (1, 1, 1), - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into ZARR. @@ -83,7 +84,10 @@ def convert( max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" r"_z(?P[0-9]+)" r"_y(?P[0-9]+)" r"(" + r"^(?P\w*)" + r"_z(?P[0-9]+)" + r"_y(?P[0-9]+)" + r"(" r"?P\w*)$" ) @@ -123,7 +127,6 @@ def convert( nchunky = max(all_chunks_info["y"]) allshapes = [[(0, 0, 0) for _ in range(nchunky)] for _ in range(nchunkz)] nchannels = 0 - dtype = None for zchunk in range(nchunkz): for ychunk in range(nchunky): for i in range(len(all_chunks_info["dirname"])): @@ -148,7 +151,6 @@ def convert( all_chunks_info["planes"][i]["c"] += [int(parsed.group("c"))] f = TiffFile(fname) - dtype = f.pages[0].dtype yx_shape = f.pages[0].shape all_chunks_info["planes"][i]["yx_shape"].append(yx_shape) @@ -178,8 +180,9 @@ def convert( fullshape[2] = allshapes[0][0][2] omz = from_config(zarr_config) - arr = omz.create_array("0", shape=[nchannels, *fullshape], dtype="float64", - zarr_config=zarr_config) + arr = omz.create_array( + "0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config + ) print("Write level 0 with shape", [nchannels, *fullshape]) for i, dirname in enumerate(all_chunks_info["dirname"]): @@ -192,10 +195,7 @@ def convert( yx_shape = planes["yx_shape"][j] zstart = sum(shape[0][0] for shape in allshapes[:chunkz]) - ystart = sum( - shape[1] - for shape in allshapes[chunkz][:chunky] - ) + ystart = sum(shape[1] for shape in allshapes[chunkz][:chunky]) print( f"Write plane " f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index 66b5752a..76794ebf 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -9,6 +9,7 @@ import os import re from glob import glob +from typing import Unpack # externals import cyclopts @@ -37,7 +38,7 @@ def convert( center: bool = True, thickness: float | None = None, voxel_size: list[float] = (1, 1, 1), - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into a Zarr. @@ -89,12 +90,14 @@ def convert( Voxel size along the X, Y and Z dimensions, in microns. """ zarr_config = update_default_config(zarr_config, **kwargs) - chunk = zarr_config.chunk if max_load % 2: max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" r"_y(?P[0-9]+)" r"_z(?P[0-9]+)" r"(" + r"^(?P\w*)" + r"_y(?P[0-9]+)" + r"_z(?P[0-9]+)" + r"(" r"?P\w*)$" ) @@ -114,7 +117,8 @@ def convert( # default output name zarr_config.set_default_name( - all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0]) + all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] + ) # parse all individual file names nchunkz = max(all_chunks_info["z"]) @@ -159,8 +163,9 @@ def convert( print(zarr_config.out) # write first level - array = omz.create_array("0", shape=fullshape, dtype=np.dtype(dtype).str, - zarr_config=zarr_config) + array = omz.create_array( + "0", shape=fullshape, dtype=np.dtype(dtype).str, zarr_config=zarr_config + ) print("Write level 0 with shape", fullshape) @@ -175,7 +180,7 @@ def convert( if chunky != 0: dat = dat[:, overlap // 2:, :] if chunky != max(all_chunks_info["y"]) - 1: - dat = dat[:, :-overlap // 2 - (overlap % 2), :] + dat = dat[:, : -overlap // 2 - (overlap % 2), :] zstart = sum(shape[chunky][0] for shape in allshapes[:chunkz]) ystart = sum(shape[1] - overlap for shape in allshapes[chunkz][:chunky]) diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 2b6f429b..50ebf4b3 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -1,9 +1,18 @@ +""" +Convert spool .dat files set generated by the LSM pipeline into a zarr. + +Example input files can be found at +https://lincbrain.org/dandiset/000010/draft/files?location=sourcedata%2Frawdata +%2Fmicr%2Fsample18_run10__y10_z01_HR&page=1 +""" + # stdlib import os import re import warnings from collections import defaultdict, namedtuple from glob import glob +from typing import Unpack # externals import cyclopts @@ -21,14 +30,6 @@ spool = cyclopts.App(name="spool", help_format="markdown") lsm.command(spool) -""" -Convert a collection of spool .dat files generated by the LSM pipeline into either a -NIfTI-Zarr or OME-Zarr. - -Example input files can be found at -https://lincbrain.org/dandiset/000010/draft/files?location=sourcedata%2Frawdata%2Fmicr%2Fsample18_run10__y10_z01_HR&page=1 -""" - @spool.default def convert( @@ -39,7 +40,7 @@ def convert( center: bool = True, voxel_size: list[float] = (1, 1, 1), zarr_config: ZarrConfig | None = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of spool files generated by the LSM pipeline into Zarr. @@ -104,8 +105,7 @@ def convert( all_tiles_info = [] tiles_info_by_index = {} TileInfo = namedtuple( - "TileInfo", - ["prefix", "run", "y", "z", "suffix", "filename", "reader"] + "TileInfo", ["prefix", "run", "y", "z", "suffix", "filename", "reader"] ) for tile_folder_name in all_tiles_folders_names: tile_folder_name = tile_folder_name.rstrip("/") @@ -117,7 +117,7 @@ def convert( int(parsed.group("z")), parsed.group("suffix"), tile_folder_name, - SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat") + SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat"), ) all_tiles_info.append(tile) # Check for duplicate tiles @@ -170,27 +170,30 @@ def convert( dtype = next(iter(dtypes)) # Ensure tiles's shapes are compatible - diff_sx = (all_shapes[:, :, 0] != expected_sx) + diff_sx = all_shapes[:, :, 0] != expected_sx if diff_sx.any(): y_idxs, z_idxs = np.where(diff_sx) raise ValueError( - f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}" + ) for y_tile in range(min_y_tile, max_y_tile + 1): if y_tile not in expected_sy: raise ValueError(f"Missing y tile {y_tile}") - diff_sy = (all_shapes[:, :, 1] != expected_sy[y_tile]) + diff_sy = all_shapes[:, :, 1] != expected_sy[y_tile] if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sy) raise ValueError( - f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}" + ) for z_tile in range(min_z_tile, max_z_tile + 1): if z_tile not in expected_sz: raise ValueError(f"Missing z tile {z_tile}") - diff_sz = (all_shapes[:, :, 2] != expected_sz[z_tile]) + diff_sz = all_shapes[:, :, 2] != expected_sz[z_tile] if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sz) raise ValueError( - f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}") + f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}" + ) # Calculate full dataset dimensions full_shape_x = expected_sx @@ -217,15 +220,17 @@ def convert( # if not last y tile, crop half overlapped rows at the end # if overlap is odd, we need to crop an extra column if tile_info.y != max_y_tile: - dat = dat[:, :-overlap // 2 - (overlap % 2), :] - ystart = sum(expected_sy[min_y_tile + y_idx] - overlap for y_idx in - range(rel_y)) + dat = dat[:, : -overlap // 2 - (overlap % 2), :] + ystart = sum( + expected_sy[min_y_tile + y_idx] - overlap for y_idx in range(rel_y) + ) zstart = sum(expected_sz[min_z_tile + z_idx] for z_idx in range(rel_z)) if rel_y != 0: ystart += overlap // 2 print( f"Write plane " - f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:{ystart + dat.shape[1]})", + f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:" + f"{ystart + dat.shape[1]})", end="\r", ) slicer = ( @@ -244,10 +249,11 @@ def convert( if not zarr_config.nii: return - # TODO: header has some problem with unit when deal with zarr 2, furthur debugging needed - header = default_nifti_header(omz["0"], - omz.attrs.get("ome", omz.attrs).get("multiscales", - None)) + # TODO: header has some problem with unit when deal with zarr 2, furthur + # debugging needed + header = default_nifti_header( + omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None) + ) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension affine = orientation_to_affine(orientation, *voxel_size) diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 0bca181c..7392de0b 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -1,4 +1,5 @@ import re +from os import PathLike from typing import Any, Generator import numpy as np @@ -144,11 +145,11 @@ def find_experiment_params(exp_file: str) -> tuple[dict, bool]: exp_key = None for key in mat_vars(exp_file): - if 'Experiment_Fiji' in key: + if "Experiment_Fiji" in key: exp_key = key is_fiji = True break - if 'Experiment' in key: + if "Experiment" in key: exp_key = key if not exp_key: @@ -170,7 +171,7 @@ def mat_vars(mat_file: str) -> Generator[str, None, None]: ------ str: Variable names not starting with '__'. """ - yield from (name for name, *_ in sio.whosmat(mat_file) if not name.startswith('__')) + yield from (name for name, *_ in sio.whosmat(mat_file) if not name.startswith("__")) def atleast_2d_trailing(arr: ArrayLike) -> np.ndarray: @@ -197,6 +198,6 @@ def atleast_2d_trailing(arr: ArrayLike) -> np.ndarray: return arr -def load_mat(mat_path, varname): +def load_mat(mat_path: str | PathLike[str], varname: str) -> np.ndarray: data = sio.loadmat(mat_path, squeeze_me=True) return data[varname] diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index f2d35ffe..1af1d5d7 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -10,7 +10,7 @@ import os from functools import wraps from itertools import product -from typing import Callable, Optional +from typing import Callable, Optional, Unpack import cyclopts import h5py @@ -72,7 +72,7 @@ def convert( center: bool = True, dtype: Optional[str] = None, zarr_config: ZarrConfig = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Matlab to OME-Zarr. @@ -134,8 +134,9 @@ def convert( ny = ceildiv(volume_shape[-2], chunk_size[1]) nslices = len(inp) - dataset = zgroup.create_array("0", shape=volume_shape, zarr_config=zarr_config, - dtype=np.dtype(dtype)) + dataset = zgroup.create_array( + "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype) + ) # Process and store data in chunks for i in range(nslices): @@ -172,8 +173,9 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] - header = default_nifti_header(arr, zgroup.attrs.get("ome", zgroup.attrs).get( - "multiscales")) + header = default_nifti_header( + arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") + ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 86ce0ed7..43ac14fa 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -9,7 +9,7 @@ import logging import os from functools import wraps -from typing import Callable, Optional +from typing import Callable, Optional, Unpack import cyclopts import h5py @@ -72,7 +72,7 @@ def convert( orientation: str = "RAS", center: bool = True, zarr_config: ZarrConfig = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Matlab to OME-Zarr. @@ -135,8 +135,9 @@ def convert( inp_chunk = [min(x, zarr_config.max_load) for x in inp.shape] - dataset = zgroup.create_array("0", shape=inp.shape, zarr_config=zarr_config, - dtype=np.dtype(inp.dtype)) + dataset = zgroup.create_array( + "0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype) + ) for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): logger.info( @@ -155,9 +156,9 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] - header = default_nifti_header(arr, - zgroup.attrs.get("ome", zgroup.attrs).get( - "multiscales")) + header = default_nifti_header( + arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") + ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index 5968b277..6ee146d5 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -1,13 +1,13 @@ """Convert annotation downloaded from webknossos into ome.zarr format.""" # stdlib -import ast import json import os -import shutil +from typing import Unpack import cyclopts import numpy as np + # externals import wkw import zarr @@ -15,9 +15,6 @@ # internals from linc_convert.modalities.wk.cli import wk from linc_convert.utils.io.zarr import from_config -from linc_convert.utils.io.zarr.drivers.zarr_python import ( - _make_compressor as make_compressor, - ) from linc_convert.utils.math import ceildiv from linc_convert.utils.zarr_config import ZarrConfig, update_default_config @@ -32,7 +29,7 @@ def convert( dic: str = None, *, zarr_config: ZarrConfig = None, - **kwargs + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert annotations (in .wkw format) from webknossos to ome.zarr format. @@ -93,9 +90,8 @@ def convert( low_res_offsets.append([t0, b0, l0, r0]) # setup save info - basename = os.path.basename(ome_dir)[:-9] - initials = wkw_dir.split("/")[-2][:2] - + os.path.basename(ome_dir)[:-9] + wkw_dir.split("/")[-2][:2] # Prepare Zarr group omz = from_config(zarr_config) @@ -110,8 +106,9 @@ def convert( wkw_dataset_path = os.path.join(wkw_dir, get_mask_name(level)) wkw_dataset = wkw.Dataset.open(wkw_dataset_path) - omz.create_array(f"{level}", shape=shape, dtype="uint8", - zarr_config=zarr_config) + omz.create_array( + f"{level}", shape=shape, dtype="uint8", zarr_config=zarr_config + ) array = omz[f"{level}"] # Write each slice @@ -177,6 +174,7 @@ def convert( print("Write metadata") omz._get_zarr_python_group().attrs["multiscales"] = omz_data.attrs["multiscales"] + def get_mask_name(level: int) -> str: """ Return the name of the mask for a given resolution level. diff --git a/linc_convert/utils/__init__.py b/linc_convert/utils/__init__.py index fb295188..8abbdf80 100644 --- a/linc_convert/utils/__init__.py +++ b/linc_convert/utils/__init__.py @@ -1,2 +1,3 @@ """Various utilities.""" -from . import logging + +from . import logging # noqa: F401 diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index d71cb2b9..ac6eaf61 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -1,26 +1,32 @@ +"""Utilities for Processing Array in Chunks.""" + +from typing import Generator, Sequence + import numpy as np from linc_convert.utils.math import ceildiv -def chunk_slice_generator(arr_shape, chunk_shape): +def chunk_slice_generator( + arr_shape: Sequence[int], chunk_shape: Sequence[int] + ) -> Generator: """ - Generate slice indices for chunking an array based on its shape and the provided - chunk_shape - for the last dimensions. + Generate slice indices for chunking an array based on the chunk size. Parameters ---------- - arr_shape (tuple): The shape of the array. - chunk_shape (tuple): A tuple of integers representing the chunk size for each - of the last dimensions. + arr_shape (tuple): The shape of the array. + + chunk_shape (tuple): A tuple of integers representing the chunk size for each + of the last dimensions. Yields ------ - tuple: A tuple (index, full_slice) where: - - index is a tuple representing the multi-index of the chunk. - - full_slice is a tuple of slice objects (prefixed by an Ellipsis to preserve any non-chunked dimensions) - that can be used to index into an array of shape arr_shape. + tuple: A tuple (index, full_slice) where: + - index is a tuple representing the multi-index of the chunk. + - full_slice is a tuple of slice objects (prefixed by an Ellipsis to preserve + any non-chunked dimensions) that can be used to index into an array of shape + arr_shape. """ # Ensure chunk_shape is a tuple chunk_shape = tuple(chunk_shape) @@ -33,9 +39,12 @@ def chunk_slice_generator(arr_shape, chunk_shape): # Generate all multi-indices for the chunk grid for index in np.ndindex(*n_chunks): - # Create slice objects for each dimension, ensuring we don't go beyond the array's bounds - slices = tuple(slice(i * c, min((i + 1) * c, dim)) - for i, c, dim in zip(index, chunk_shape, shape)) + # Create slice objects for each dimension, + # ensuring we don't go beyond the array's bounds + slices = tuple( + slice(i * c, min((i + 1) * c, dim)) + for i, c, dim in zip(index, chunk_shape, shape) + ) # Prepend an Ellipsis to preserve any preceding (non-chunked) dimensions full_slice = (...,) + slices yield index, full_slice diff --git a/linc_convert/utils/io/__init__.py b/linc_convert/utils/io/__init__.py index e69de29b..a0072f0d 100644 --- a/linc_convert/utils/io/__init__.py +++ b/linc_convert/utils/io/__init__.py @@ -0,0 +1 @@ +"""Utils related to IO and file formats.""" diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index c530a2b8..4c6d7456 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -1,6 +1,8 @@ +"""Functions related to generation of downsampled layers in ome-zarr.""" + import logging import math -from typing import Optional +from typing import Callable, Optional, Sequence import dask.array as da @@ -8,10 +10,32 @@ def default_levels( - spatial_shape: tuple, - spatial_chunk: tuple, - no_pyramid_axis: Optional[int] + spatial_shape: tuple, spatial_chunk: tuple, no_pyramid_axis: Optional[int] ) -> int: + """ + Compute the default number of downsampling levels for a spatial pyramid. + + For each axis in `spatial_shape` (except the one indexed by + `no_pyramid_axis`, if given), this computes how many times you can + halve the dimension (from `spatial_shape[i]`) by the corresponding chunk + size (`spatial_chunk[i]`) before reaching chunk ≤ 1, and returns the + maximum of those halving‐counts (rounded up), with a lower bound of 0. + + Parameters + ---------- + spatial_shape : tuple of int + The full size of each spatial dimension. + spatial_chunk : tuple of int + The chunk size used for each spatial dimension. + no_pyramid_axis : int or None + If not None, that axis index will be excluded when computing levels. + + Returns + ------- + int + The number of pyramid levels (≥ 0) needed to reduce all applicable + axes by repeated factors of two. + """ default_levels = max( int(math.ceil(math.log2(s / spatial_chunk[i]))) for i, s in enumerate(spatial_shape) @@ -21,7 +45,30 @@ def default_levels( return levels -def next_level_shape(prev_shape: tuple, no_pyramid_axis: Optional[int]) -> list: +def next_level_shape( + prev_shape: Sequence[int], no_pyramid_axis: Optional[int] + ) -> list[int]: + """ + Compute the shape of the next coarser level by halving each dimension. + + Each axis in `prev_shape` is divided by two (integer division), + clamped to a minimum of 1, except for the axis indexed by + `no_pyramid_axis`, which remains unchanged. + + Parameters + ---------- + prev_shape : sequence of int + Shape of the current level (e.g., [N1, N2, …]). + no_pyramid_axis : int or None + Axis index to leave unchanged; if None, all axes are halved. + + Returns + ------- + list of int + New shape for the next level, same length as `prev_shape`, + with each entry equal to `max(1, prev_shape[i] // 2)` or + unchanged if `i == no_pyramid_axis`. + """ new_shape = [] for i, length in enumerate(prev_shape): if i == no_pyramid_axis: @@ -31,10 +78,14 @@ def next_level_shape(prev_shape: tuple, no_pyramid_axis: Optional[int]) -> list: return new_shape -def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): +def compute_next_level( + arr: da.Array, + ndim: int, + no_pyramid_axis: int | None = None, + window_func: Callable = da.mean, + ) -> da.Array: """ - Compute the next (half-resolution) level of a dask array pyramid along the - last `ndim` dimensions, optionally skipping reduction along one axis. + Compute the next level of a dask array pyramid. Parameters ---------- @@ -60,9 +111,11 @@ def compute_next_level(arr, ndim, no_pyramid_axis=None, window_func=da.mean): # build the coarsening factors: 2 along each pyramid dim, except 1 if skip factors = { axis: ( - 1 if (no_pyramid_axis is not None and axis == pyramid_axes[ - no_pyramid_axis]) or arr.shape[axis] == 1 - else 2) + 1 + if (no_pyramid_axis is not None and axis == pyramid_axes[no_pyramid_axis]) + or arr.shape[axis] == 1 + else 2 + ) for axis in pyramid_axes } dtype = arr.dtype diff --git a/linc_convert/utils/io/spool.py b/linc_convert/utils/io/spool.py index b1ce6b64..0974199e 100644 --- a/linc_convert/utils/io/spool.py +++ b/linc_convert/utils/io/spool.py @@ -1,10 +1,13 @@ """ +Reader for spool files set. + The following script is derived from https://github.com/CBI-PITT/holis_tools/blob/main/holis_tools/zyla_spool_reader.py. Copyright (c) 2021, Alan M Watson -For more information, see the [`holis_tools` LICENCE](https://github.com/CBI-PITT/holis_tools/blob/main/LICENCE) +For more information, see the [`holis_tools` LICENCE]( +https://github.com/CBI-PITT/holis_tools/blob/main/LICENCE) """ # stdlib @@ -13,6 +16,8 @@ import os import warnings from glob import glob +from os import PathLike +from typing import Iterator import numpy as np from scipy.io import loadmat @@ -21,19 +26,30 @@ class SpoolSetInterpreter: - - def __init__(self, spool_set_path, info_file=None): - if os.path.isfile(spool_set_path) and \ - os.path.splitext(spool_set_path)[-1] == '.zip': + """ + Interpreter for a set of spool files produced by a Zyla camera. + + This class loads spool files from a directory, parses acquisition parameters, + and provides methods to iterate over or assemble the image data. + """ + + def __init__( + self, spool_set_path: str | PathLike[str], + info_file: str | PathLike[str] = None + ) -> None: + if ( + os.path.isfile(spool_set_path) + and os.path.splitext(spool_set_path)[-1] == ".zip" + ): raise NotImplementedError("Zip storage is not supported.") pass elif os.path.isdir(spool_set_path): - self.type = 'dir' + self.type = "dir" self.parent = spool_set_path - self.file_list = glob(os.path.join(spool_set_path, '*')) + self.file_list = glob(os.path.join(spool_set_path, "*")) self.spool_set = tuple([os.path.split(x)[-1] for x in self.file_list]) else: - assert False, 'The input data structure is not a ZIP file or Directory' + assert False, "The input data structure is not a ZIP file or Directory" self._what_spool_format() self.spool_files = tuple(self._get_spool_names_in_order()) # In order @@ -45,92 +61,99 @@ def __init__(self, spool_set_path, info_file=None): if os.path.isfile(info_file): self._load_info_file(info_file) else: - warnings.warn('ERROR: Info file not found.') - self.assembled_spool_shape = (self.numDepths, - self.spool_shape[2], - self.spool_shape[0] * len(self.spool_files), - ) - - def _load_info_file(self, info_file): + warnings.warn("ERROR: Info file not found.") + self.assembled_spool_shape = ( + self.numDepths, + self.spool_shape[2], + self.spool_shape[0] * len(self.spool_files), + ) + + def _load_info_file(self, info_file: str | PathLike[str]) -> None: loaded_info = loadmat(info_file) info = loaded_info.get("info", None) if info is None: warnings.warn("ERROR: 'info' structure not found in the MAT file.") return None try: - num_total_frames = int(info['camera'][0][0]['kineticSeriesLength']) - num_bg_frames = int(info['camera'][0][0]['backgroundFramesNum']) + num_total_frames = int(info["camera"][0][0]["kineticSeriesLength"]) + num_bg_frames = int(info["camera"][0][0]["backgroundFramesNum"]) except (KeyError, IndexError, ValueError) as e: warnings.warn( - f"ERROR: Unable to extract frame information from info file. {e}") + f"ERROR: Unable to extract frame information from info file. {e}" + ) return None - num_frames_per_spool = int(self.config['multiimage']['ImagesPerFile']) + num_frames_per_spool = int(self.config["multiimage"]["ImagesPerFile"]) num_frames_to_load = num_total_frames - num_bg_frames num_spool_files_to_load = ceildiv(num_frames_to_load, num_frames_per_spool) self.spool_files = self.spool_files[:num_spool_files_to_load] - def _make_filename_from_spool_set(self, spool_entry): + def _make_filename_from_spool_set( + self, spool_entry: str | PathLike[str] + ) -> PathLike[str]: return os.path.join(self.parent, spool_entry) @property - def entries(self): + def entries(self) -> tuple[str, ...]: + """List of all entries (filenames) in the spool set.""" return self.spool_set - def _what_spool_format(self): - if 'Spooled files.sifx' in self.entries: - format = 'zyla' + def _what_spool_format(self) -> None: + if "Spooled files.sifx" in self.entries: + format = "zyla" else: raise TypeError("Unknown or unsupported spool file format") self.format = format - def _list_spool_files(self): - return sorted( - tuple( - [x for x in self.entries if '0spool.dat' in x] - ) - ) + def _list_spool_files(self) -> list[str]: + return sorted(tuple([x for x in self.entries if "0spool.dat" in x])) - def _get_acquisitionparameters_str(self): - file = self._make_filename_from_spool_set('acquisitionmetadata.ini') - with open(file, 'rb') as f: + def _get_acquisitionparameters_str(self) -> None: + file = self._make_filename_from_spool_set("acquisitionmetadata.ini") + with open(file, "rb") as f: ini = f.read() - ini = ini.decode('UTF-8-sig') # Encoding for acquisitionmetadata.ini + ini = ini.decode("UTF-8-sig") # Encoding for acquisitionmetadata.ini self.acquisitionparameters_str = ini - def _get_config(self): + def _get_config(self) -> None: buf = io.StringIO(self.acquisitionparameters_str) self.config = configparser.ConfigParser() self.config.read_file(buf) - def _extract_config_values(self): - self.acquisition_metadata = {'height': self.config.getint('data', 'AOIHeight'), - 'width': self.config.getint('data', 'AOIWidth'), - 'stride': self.config.getint('data', 'AOIStride')} + def _extract_config_values(self) -> None: + self.acquisition_metadata = { + "height": self.config.getint("data", "AOIHeight"), + "width": self.config.getint("data", "AOIWidth"), + "stride": self.config.getint("data", "AOIStride"), + } # ini info - dtype = self.config.get('data', 'PixelEncoding') + dtype = self.config.get("data", "PixelEncoding") - if dtype == 'Mono16': - dtype = np.dtype('uint16') - elif dtype == 'Mono8': - dtype = np.dtype('uint8') + if dtype == "Mono16": + dtype = np.dtype("uint16") + elif dtype == "Mono8": + dtype = np.dtype("uint8") - self.acquisition_metadata['dtype'] = dtype + self.acquisition_metadata["dtype"] = dtype self.dtype = dtype - self.spool_nbytes = self.config.getint('data', 'ImageSizeBytes') - self.acquisition_metadata['nbytes'] = self.spool_nbytes + self.spool_nbytes = self.config.getint("data", "ImageSizeBytes") + self.acquisition_metadata["nbytes"] = self.spool_nbytes - self.acquisition_metadata['images'] = self.config.getint('multiimage', - 'ImagesPerFile') + self.acquisition_metadata["images"] = self.config.getint( + "multiimage", "ImagesPerFile" + ) - numDepths = self.acquisition_metadata['height'] - numColumns = self.acquisition_metadata['stride'] // 2 - imageBytes = self.acquisition_metadata['nbytes'] - numFramesPerSpool = self.acquisition_metadata['images'] + numDepths = self.acquisition_metadata["height"] + numColumns = self.acquisition_metadata["stride"] // 2 + self.acquisition_metadata["nbytes"] + numFramesPerSpool = self.acquisition_metadata["images"] - if numDepths % 2: # if there is an odd number of rows -> KPEDIT - odd rows means 1 less column for some reason + if ( + numDepths % 2 + ): # if there is an odd number of rows -> KPEDIT - odd rows means 1 less + # column for some reason numRows = numDepths + 1 else: numRows = numDepths + 2 @@ -138,50 +161,100 @@ def _extract_config_values(self): self.spool_shape = (numFramesPerSpool, numRows, numColumns) self.numDepths = numDepths - def _load_spool_file(self, spool_file_name): + def _load_spool_file(self, spool_file_name: str | PathLike[str]) -> np.ndarray: + """Load a single spool file into a NumPy array.""" file = self._make_filename_from_spool_set(spool_file_name) - print(f'Reading file {spool_file_name}') - with open(file, 'rb') as f: + print(f"Reading file {spool_file_name}") + with open(file, "rb") as f: array = np.frombuffer(f.read(), dtype=self.dtype) return np.reshape(array, self.spool_shape) - def __getitem__(self, key): + def __getitem__(self, key: str | int) -> np.ndarray: + """ + Retrieve a spool file by name or index. + + Parameters + ---------- + key: str | int + Filename (str) or index (int) in self.spool_files. + + Returns + ------- + The loaded spool data as an ndarray. + """ if isinstance(key, str): - assert key in self.spool_files, 'Must be a spool file in self.spool_files OR integer index in self.spool_files' + assert key in self.spool_files, ( + "Must be a spool file in self.spool_files OR integer index in " + "self.spool_files" + ) return self._load_spool_file(key) elif isinstance(key, int): return self._load_spool_file(self.spool_files[key]) - def __iter__(self): + def __iter__(self) -> Iterator[str]: + """ + Iterate over all spool files in order. + + Yields + ------ + ndarrays for each spool file. + """ yield from (self[x] for x in range(len(self))) - def __contains__(self, item): + def __contains__(self, item: str) -> bool: + """ + Check if a given filename is part of the spool files. + + Parameters + ---------- + item : str + Filename to check. + """ return item in self.spool_files - def __len__(self): + def __len__(self) -> int: + """ + Return the number of spool files to be loaded. + + Returns + ------- + Length of self.spool_files. + """ return len(self.spool_files) - def _get_spool_names_in_order(self): + def _get_spool_names_in_order(self) -> Iterator[str]: """ + Get list of sorted spool names. + Spool files are ordered sequentially in the order they were collected 0,1,2, ...,201,202,203,... - but file names are recorded as the reversed number padded to - 10 digits (0000000000,1000000000,20000000000,...,1020000000,2020000000,3020000000,...) + spool.dat + but file names are recorded as the reversed number padded to 10 digits + (0000000000,1000000000,20000000000,...,1020000000,2020000000,3020000000, + ...) + spool.dat. """ spool_files = self._list_spool_files() for idx in range(len(spool_files)): # Convert index to string, pad with zeros to 10 digits and reverse tmp = str(idx).zfill(10)[::-1] - tmp = f'{tmp}spool.dat' + tmp = f"{tmp}spool.dat" if tmp in spool_files: yield tmp else: warnings.warn(f"{tmp} not located in spool directory") - def assemble(self): + def assemble(self) -> np.ndarray: + """ + Assemble all spool files into a single 3D volume. + + Returns + ------- + A NumPy array of shape (frames_total, rows, columns), + where frames_total = images_per_file * number_of_files. + """ axis_0_shape = self.spool_shape[0] - canvas = np.zeros((axis_0_shape * len(self), *self.spool_shape[1:]), - dtype=self.dtype) + canvas = np.zeros( + (axis_0_shape * len(self), *self.spool_shape[1:]), dtype=self.dtype + ) for idx, spool_file in enumerate(self): start = idx * axis_0_shape stop = start + axis_0_shape @@ -189,5 +262,13 @@ def assemble(self): return canvas # this is the modified version for lsm pipeline - def assemble_cropped(self): - return self.assemble().transpose(1, 2, 0)[:self.numDepths, :, :] + def assemble_cropped(self) -> np.ndarray: + """ + Assemble and transpose the volume, then crop to original depth. + + Returns + ------- + A NumPy array transposed to (height, width, frames) + and cropped to self.numDepths along the first axis. + """ + return self.assemble().transpose(1, 2, 0)[: self.numDepths, :, :] diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index 9ef2aad8..a3adba29 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -1,16 +1,27 @@ """ZarrIO module for handling Zarr data structures.""" -import logging -import warnings -logger = logging.getLogger(__name__) +import warnings from .abc import ZarrArray, ZarrGroup, ZarrNode from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup from .factory import from_config, open, open_group try: - import tensorstore as TS + import tensorstore as TS # noqa: F401 from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup except ImportError: warnings.warn("Tensorstore is not installed, driver disabled") + +__all__ = [ + ZarrArray, + ZarrGroup, + ZarrNode, + ZarrPythonArray, + ZarrPythonGroup, + from_config, + open, + open_group, + "ZarrTSArray", + "ZarrTSGroup", + ] diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index 74ef1908..bb4d8c73 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -1,5 +1,6 @@ """Abstract base classes for ZarrIO interfaces.""" +import logging from abc import ABC, abstractmethod from numbers import Number from os import PathLike @@ -30,7 +31,6 @@ default_levels, next_level_shape, ) -from linc_convert.utils.io.zarr import logger from linc_convert.utils.zarr_config import ZarrConfig NiftiHeaderLike = Union[Nifti1Header, Nifti2Header] @@ -210,6 +210,7 @@ def generate_pyramid( shapes : list[list[int]] Shapes of each level, from finest to coarsest. """ + logger = logging.getLogger(__name__) base = self["0"] batch_shape, spatial_shape = base.shape[:-ndim], base.shape[-ndim:] all_shapes = [spatial_shape] diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 0c10ebd7..d5631a14 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -1,4 +1,5 @@ """TensorStore driver for Zarr arrays and groups.""" + import json import math import os @@ -126,7 +127,6 @@ def open( return cls(ts_array) - class ZarrTSGroup(ZarrGroup): """Zarr Group implementation using TensorStore as backend.""" @@ -161,8 +161,9 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": ------- ZarrTSGroup """ - return cls.open(zarr_config.out, mode="a", - zarr_version=zarr_config.zarr_version) + return cls.open( + zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version + ) @classmethod def open( @@ -236,9 +237,7 @@ def __delitem__(self, name: str) -> None: def keys(self) -> Iterator[str]: """Get the names of all subgroups and arrays in this group.""" return ( - p.name - for p in self._path.iterdir() - if p.is_dir() and _detect_metadata(p) + p.name for p in self._path.iterdir() if p.is_dir() and _detect_metadata(p) ) def __contains__(self, name: str) -> bool: @@ -293,8 +292,9 @@ def create_array( ZarrTSArray """ if zarr_config is None: - conf = default_write_config(self._path / name, shape=shape, dtype=dtype, - **kwargs) + conf = default_write_config( + self._path / name, shape=shape, dtype=dtype, **kwargs + ) else: conf = default_write_config( self._path / name, @@ -554,24 +554,24 @@ def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: Checks zarr.json (v3), then .zarray/.zgroup (v2). """ # Zarr v3 - z3 = path / 'zarr.json' + z3 = path / "zarr.json" if z3.is_file(): try: meta = json.loads(z3.read_text()) - fmt = meta.get('zarr_format') + fmt = meta.get("zarr_format") if fmt == 3: - node = meta.get('node_type', 'array') - if node in ('array', 'group'): + node = meta.get("node_type", "array") + if node in ("array", "group"): return node, 3 except json.JSONDecodeError: pass # Zarr v2 - for fname, ntype in (('.zarray', 'array'), ('.zgroup', 'group')): + for fname, ntype in ((".zarray", "array"), (".zgroup", "group")): f = path / fname if f.is_file(): try: meta = json.loads(f.read_text()) - if meta.get('zarr_format') == 2: + if meta.get("zarr_format") == 2: return ntype, 2 except json.JSONDecodeError: pass @@ -730,10 +730,8 @@ def default_write_config( def _init_group(group_path: PathLike, version: int) -> None: group_path.mkdir(parents=True, exist_ok=True) if version == 3: - (group_path / 'zarr.json').write_text( - json.dumps({'zarr_format': 3, 'node_type': 'group'}) + (group_path / "zarr.json").write_text( + json.dumps({"zarr_format": 3, "node_type": "group"}) ) else: - (group_path / '.zgroup').write_text( - json.dumps({'zarr_format': 2}) - ) + (group_path / ".zgroup").write_text(json.dumps({"zarr_format": 2})) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index b21e9e3b..66e9b6b7 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -1,4 +1,5 @@ """ZarrIO Implementation using the zarr-python library.""" + import ast from numbers import Number from typing import ( @@ -99,7 +100,7 @@ class ZarrPythonGroup(ZarrGroup): def __init__(self, zarr_group: zarr.Group) -> None: """ Initialize the ZarrPythonGroup with a zarr.Group. - + Parameters ---------- zarr_group : zarr.Group @@ -110,13 +111,17 @@ def __init__(self, zarr_group: zarr.Group) -> None: self._zgroup = zarr_group @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> 'ZarrPythonGroup': + def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": """Create a Zarr group from a configuration object.""" store = zarr.storage.LocalStore(zarr_config.out) - return cls(zarr.group(store=store, - # TODO: figure out overwrite - # overwrite=overwrite, - zarr_format=zarr_config.zarr_version)) + return cls( + zarr.group( + store=store, + # TODO: figure out overwrite + # overwrite=overwrite, + zarr_format=zarr_config.zarr_version, + ) + ) @property def attrs(self) -> Mapping[str, Any]: @@ -173,7 +178,7 @@ def create_array( *, zarr_config: ZarrConfig = None, data: Optional[ArrayLike] = None, - **kwargs: Unpack[ZarrArrayConfig] + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrPythonArray: """Create a new array within this group.""" if zarr_config is None: @@ -195,17 +200,17 @@ def create_array( "order": zarr_config.order, "dtype": np.dtype(dtype).str, "fill_value": None, - "compressors": _make_compressor(compressor, zarr_config.zarr_version, - **compressor_opt), + "compressors": _make_compressor( + compressor, zarr_config.zarr_version, **compressor_opt + ), } chunk_key_encoding = _dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version) + zarr_config.dimension_separator, zarr_config.zarr_version + ) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding - arr = self._zgroup.create_array(name=name, - shape=shape, - **opt) + arr = self._zgroup.create_array(name=name, shape=shape, **opt) if data: arr[:] = data return ZarrPythonArray(arr) @@ -215,10 +220,10 @@ def create_array_from_base( name: str, shape: Sequence[int], data: ArrayLike = None, - **kwargs: Unpack[ZarrArrayConfig] + **kwargs: Unpack[ZarrConfig], ) -> ZarrPythonArray: """Create a new array using the properties from a base_level object.""" - base_level = self['0'] + base_level = self["0"] opts = dict( dtype=base_level.dtype, chunks=base_level.chunks, @@ -227,8 +232,9 @@ def create_array_from_base( compressors=getattr(base_level._array, "compressors", None), fill_value=getattr(base_level._array, "fill_value", None), order=getattr(base_level._array, "order", None), - attributes=getattr(getattr(base_level._array, "metadata", None), - "attributes", None), + attributes=getattr( + getattr(base_level._array, "metadata", None), "attributes", None + ), overwrite=True, ) # Handle extra options based on metadata type @@ -236,7 +242,8 @@ def create_array_from_base( if meta is not None: if hasattr(meta, "dimension_separator"): opts["chunk_key_encoding"] = _dimension_separator_to_chunk_key_encoding( - meta.dimension_separator, 2) + meta.dimension_separator, 2 + ) if hasattr(meta, "chunk_key_encoding"): opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) if hasattr(base_level, "serializer"): @@ -253,9 +260,7 @@ def create_array_from_base( def _make_compressor( - name: str | None, - zarr_version: Literal[2, 3], - **prm: dict + name: str | None, zarr_version: Literal[2, 3], **prm: dict ) -> CompressorsLike: """Build compressor object from name and options.""" if not isinstance(name, str): @@ -280,49 +285,49 @@ def _make_compressor( name = name.lower() if name not in compressor_map: - raise ValueError('Unknown compressor', name) + raise ValueError("Unknown compressor", name) Compressor = compressor_map[name] return Compressor(**prm) def _dimension_separator_to_chunk_key_encoding( - dimension_separator: Literal[".", "/"], - zarr_version: Literal[2, 3]) -> ChunkKeyEncodingLike: + dimension_separator: Literal[".", "/"], zarr_version: Literal[2, 3] + ) -> ChunkKeyEncodingLike: dimension_separator = dimension_separator - if dimension_separator == '.' and zarr_version == 2: + if dimension_separator == "." and zarr_version == 2: pass - elif dimension_separator == '/' and zarr_version == 3: + elif dimension_separator == "/" and zarr_version == 3: pass else: dimension_separator = ChunkKeyEncodingParams( name="default" if zarr_version == 3 else "v2", - separator=dimension_separator) + separator=dimension_separator + ) return dimension_separator -SHARD_FILE_SIZE_LIMIT = (2 * # compression ratio - 2 * # TB - 2 ** 30 # GB->Bytes - ) +SHARD_FILE_SIZE_LIMIT = ( + 2 # compression ratio + * 2 # TB + * 2 ** 30 # GB->Bytes +) def _compute_zarr_layout( - shape: tuple, - dtype: DTypeLike, - zarr_config: ZarrConfig + shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig ) -> tuple[tuple, tuple | None]: ndim = len(shape) if ndim == 5: if zarr_config.no_time: - raise ValueError('no_time is not supported for 5D data') + raise ValueError("no_time is not supported for 5D data") chunk_tc = ( 1 if zarr_config.chunk_time else shape[0], 1 if zarr_config.chunk_channels else shape[1], ) shard_tc = ( chunk_tc[0] if zarr_config.shard_time else shape[0], - chunk_tc[1] if zarr_config.shard_channels else shape[1] + chunk_tc[1] if zarr_config.shard_channels else shape[1], ) elif ndim == 4: @@ -399,8 +404,9 @@ def _compute_zarr_layout( M[i] = candidate improved = True # Remove dimensions that have reached or exceeded the data size. - free_dims = [i for i in free_dims if - M[i] * chunk_spatial[i] < shape_spatial[i]] + free_dims = [ + i for i in free_dims if M[i] * chunk_spatial[i] < shape_spatial[i] + ] shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) diff --git a/linc_convert/utils/io/zarr/drivers/zarrita.py b/linc_convert/utils/io/zarr/drivers/zarrita.py index 6c8ac3fa..57428e8b 100644 --- a/linc_convert/utils/io/zarr/drivers/zarrita.py +++ b/linc_convert/utils/io/zarr/drivers/zarrita.py @@ -1,2 +1,3 @@ """Zarrita driver for Zarr groups and arrays.""" + raise NotImplementedError diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index 9cac6806..dcb8c308 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,5 +1,8 @@ """Factory module for creating/opening Zarr Nodes with different drivers.""" + import warnings +from os import PathLike +from typing import Literal from linc_convert.utils.io.zarr import ZarrNode from linc_convert.utils.io.zarr.abc import ZarrGroup @@ -9,12 +12,8 @@ ) from linc_convert.utils.zarr_config import DriverLike, ZarrConfig -_DRIVER_ARRAY = { - "zarr-python": ZarrPythonArray - } -_DRIVER_GROUP = { - "zarr-python": ZarrPythonGroup - } +_DRIVER_ARRAY = {"zarr-python": ZarrPythonArray} +_DRIVER_GROUP = {"zarr-python": ZarrPythonGroup} try: from linc_convert.utils.io.zarr.drivers.tensorstore import ZarrTSArray, ZarrTSGroup @@ -25,11 +24,59 @@ warnings.warn(f"Tensorstore driver not available: {e}.") -def open(driver: DriverLike) -> ZarrNode: +def open( + path: str | PathLike[str], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + zarr_version: Literal[2, 3] = 3, + driver: DriverLike = "zarr-python", + ) -> ZarrNode: + """ + Open a Zarr Node (Array or Group) based on the specified driver. + + Parameters + ---------- + path : str | PathLike[str] + Path to the Zarr Node. + mode : Literal["r", "r+", "a", "w", "w-] + Mode in which to open the Zarr Node. + zarr_version : Literal[2, 3] + Zarr version to use (default is 3). + driver : DriverLike + Driver to use for opening the Zarr Node (default is "zarr-python"). + + Returns + ------- + ZarrNode + An instance of ZarrNode, which can be either a ZarrArray or Zarr + """ raise NotImplementedError -def open_group(driver: DriverLike) -> ZarrGroup: +def open_group( + path: str | PathLike[str], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + zarr_version: Literal[2, 3] = 3, + driver: DriverLike = "zarr-python", + ) -> ZarrGroup: + """ + Open a Zarr Group based on the specified driver. + + Parameters + ---------- + path : str | PathLike[str] + Path to the Zarr Group. + mode : Literal["r", "r+", "a", "w", "w-"] + Mode in which to open the Zarr Group. + zarr_version : Literal[2, 3] + Zarr version to use (default is 3). + driver : DriverLike + Driver to use for opening the Zarr Group (default is "zarr-python"). + + Returns + ------- + ZarrGroup + An instance of ZarrGroup based on the specified driver. + """ raise NotImplementedError diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index 90b47778..7a3f2422 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -1,21 +1,27 @@ +"""Logging utility for the linc_convert application.""" + import logging +from os import PathLike logger = logging.getLogger() -def setup_logging(): +def setup_logging() -> None: + """Set up the logging configuration for the application.""" logging.basicConfig( level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) logging.captureWarnings(True) -def add_file_handler(log_file_path=None): +def add_file_handler(log_file_path: str | PathLike[str] = None) -> None: + """Add a file handler to the logger to log messages to a file.""" file_handler = logging.FileHandler(log_file_path) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 392b3690..bc009aa1 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -1,4 +1,5 @@ """Configuration related to output Zarr Archive.""" + import logging import os from dataclasses import dataclass, replace @@ -141,15 +142,18 @@ def set_default_name(self, name: str) -> None: if os.path.exists(self.out) and not self.overwrite: answer = input( f"The output path '{self.out}' already exists. Do you want to " - f"overwrite it? (y/n): ") + f"overwrite it? (y/n): " + ) if answer.lower() not in ("y", "yes"): raise FileExistsError( f"Output path '{self.out}' exists and overwrite was not " - f"confirmed.") + f"confirmed." + ) -def update_default_config(zarr_config: ZarrConfig | None, - **kwargs: Unpack[ZarrConfig]) -> ZarrConfig: +def update_default_config( + zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] + ) -> ZarrConfig: """ Merge user overrides into an existing ZarrConfig or create a new one. diff --git a/tests/conftest.py b/tests/conftest.py index 04b9f668..0e66b025 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,10 +16,10 @@ @pytest.fixture(scope="session") def test_data_heavy_dir(request): - data_dir = Path(__file__).parent / "data" + data_dir = Path(__file__).parent / "data" / "000051" / "sourcedata" if not any(data_dir.iterdir()): subprocess.check_call(DOWNLOAD_CMD) - yield data_dir / "000051" / "sourcedata" + yield data_dir if request.node.get_closest_marker("golden"): print("updating dandi archive") # if request.config.getoption("--upload-data"): From 5692afa4123bd2a2b812fba0e355bea383e7bdcd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 24 Jul 2025 10:00:54 -0400 Subject: [PATCH 123/157] docs --- linc_convert/modalities/df/multi_slice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index 66ebd34c..da6fbe03 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -65,7 +65,7 @@ def convert( * the second letter corresponds to the vertical dimension and indicates the anatomical meaning of the _bottom_ of the jp2 image, * the third letter corresponds to the slice dimension and - indicates the anatomical meaninff of the _end_ of the stack. + indicates the anatomical meaning of the _end_ of the stack. We also provide the aliases From d9635b4d35d4e2c39fc8b23079ffda3dbefd2576 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 11:09:57 -0400 Subject: [PATCH 124/157] style: fix indent --- linc_convert/modalities/df/multi_slice.py | 10 ++-- linc_convert/modalities/df/single_slice.py | 6 +-- linc_convert/modalities/lsm/mosaic.py | 18 +++---- linc_convert/modalities/lsm/multi_slice.py | 14 ++--- linc_convert/modalities/lsm/spool.py | 24 ++++----- linc_convert/modalities/psoct/_utils.py | 4 +- linc_convert/modalities/psoct/multi_slice.py | 10 ++-- .../modalities/psoct/single_volume.py | 10 ++-- .../modalities/wk/webknossos_annotation.py | 15 +++--- linc_convert/utils/chunk_processing.py | 4 +- linc_convert/utils/io/_array_wrapper.py | 2 +- linc_convert/utils/io/generate_pyramid.py | 10 ++-- linc_convert/utils/io/spool.py | 14 ++--- linc_convert/utils/io/zarr/__init__.py | 2 +- linc_convert/utils/io/zarr/abc.py | 12 ++--- .../utils/io/zarr/drivers/tensorstore.py | 52 +++++++++---------- .../utils/io/zarr/drivers/zarr_python.py | 42 +++++++-------- linc_convert/utils/io/zarr/factory.py | 6 +-- linc_convert/utils/logging.py | 4 +- linc_convert/utils/orientation.py | 4 +- linc_convert/utils/unit.py | 38 +++++++------- linc_convert/utils/zarr_config.py | 6 +-- tests/test_df_multi_slice.py | 8 +-- tests/test_df_single_slice.py | 8 +-- tests/test_lsm_mosaic.py | 6 +-- tests/test_lsm_multi_slice.py | 6 +-- tests/test_lsm_spool.py | 4 +- tests/test_oct_multi_slice.py | 18 ++++--- tests/test_oct_single_volume.py | 26 ++++++---- tests/test_wk.py | 3 +- tests/utils/compare_file.py | 3 +- tests/utils/generate_trusted_result.py | 2 +- tests/utils/sample_data.py | 6 +-- 33 files changed, 201 insertions(+), 196 deletions(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index da6fbe03..6289792c 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -43,7 +43,7 @@ def convert( center: bool = True, thickness: float | None = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. @@ -135,7 +135,7 @@ def convert( idx, "with size", subdat_size, - ) + ) # offset while attaching x = floordiv(shape[-2] - subdat_size[-2], 2) @@ -158,11 +158,11 @@ def convert( start_x, end_x = ( i * max_load, min((i + 1) * max_load, subdat_size[-2]), - ) + ) start_y, end_y = ( j * max_load, min((j + 1) * max_load, subdat_size[-1]), - ) + ) array[ channel, @@ -187,7 +187,7 @@ def convert( space_scale=[1.0] + list(get_pixelsize(j2k)), multiscales_type="jpeg2000", no_pool=0, - ) + ) # Write NIfTI-Zarr header # NOTE: we use nifti2 because dimensions typically do not fit in a short diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index 5d398dc0..bd1c8e7d 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -36,7 +36,7 @@ def convert( center: bool = True, thickness: float | None = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert a JPEG2000 file generated by MBF-Neurolucida into a Zarr pyramid. @@ -94,7 +94,7 @@ def convert( print("Convert level", level, "with shape", shape) array = omz.create_array( str(level), shape=shape, zarr_config=zarr_config, dtype=j2k.dtype - ) + ) if max_load is None or (shape[-2] < max_load and shape[-1] < max_load): array[...] = subdat[...] @@ -120,7 +120,7 @@ def convert( axes = ["c", "y", "x"] if has_channel else ["y", "x"] omz.write_ome_metadata( axes=axes, space_scale=get_pixelsize(j2k), multiscales_type="jpeg2000" - ) + ) if not zarr_config.nii: print("done.") diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index 8a0da4bd..a6910574 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -37,7 +37,7 @@ def convert( thickness: float | None = None, voxel_size: list[float] = (1, 1, 1), **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into ZARR. @@ -89,7 +89,7 @@ def convert( r"_y(?P[0-9]+)" r"(" r"?P\w*)$" - ) + ) all_chunks_dirnames = list(sorted(glob(os.path.join(inp, "*_z*_y*")))) all_chunks_info = dict( @@ -104,10 +104,10 @@ def convert( z=[], c=[], yx_shape=[], - ) + ) for _ in range(len(all_chunks_dirnames)) - ], - ) + ], + ) # parse all directory names for dirname in all_chunks_dirnames: @@ -142,7 +142,7 @@ def convert( os.path.basename(dirname) + r"_plane(?P[0-9]+)" r"_c(?P[0-9]+)" r".tiff$" - ) + ) for fname in planes_filenames: parsed = PLANE_PATTERN.fullmatch(os.path.basename(fname)) @@ -182,7 +182,7 @@ def convert( omz = from_config(zarr_config) arr = omz.create_array( "0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config - ) + ) print("Write level 0 with shape", [nchannels, *fullshape]) for i, dirname in enumerate(all_chunks_info["dirname"]): @@ -200,13 +200,13 @@ def convert( f"Write plane " f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", end="\r", - ) + ) slicer = ( subc, zstart + subz, slice(ystart, ystart + yx_shape[0]), slice(None), - ) + ) f = TiffFile(fname) arr[slicer] = f.asarray() diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index 76794ebf..d19b06d3 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -39,7 +39,7 @@ def convert( thickness: float | None = None, voxel_size: list[float] = (1, 1, 1), **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into a Zarr. @@ -99,7 +99,7 @@ def convert( r"_z(?P[0-9]+)" r"(" r"?P\w*)$" - ) + ) all_chunks_filenames = list(sorted(glob(os.path.join(inp, "*_y*_z*.tiff")))) all_chunks_info = dict(filename=[], prefix=[], suffix=[], z=[], y=[]) @@ -108,7 +108,7 @@ def convert( for filename in all_chunks_filenames: parsed = CHUNK_PATTERN.fullmatch( os.path.splitext(os.path.basename(filename))[0] - ) + ) all_chunks_info["filename"].append(filename) all_chunks_info["prefix"].append(parsed.group("prefix")) all_chunks_info["suffix"].append(parsed.group("suffix")) @@ -118,7 +118,7 @@ def convert( # default output name zarr_config.set_default_name( all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] - ) + ) # parse all individual file names nchunkz = max(all_chunks_info["z"]) @@ -165,7 +165,7 @@ def convert( # write first level array = omz.create_array( "0", shape=fullshape, dtype=np.dtype(dtype).str, zarr_config=zarr_config - ) + ) print("Write level 0 with shape", fullshape) @@ -190,12 +190,12 @@ def convert( f"Write plane " f"( {zstart} :{zstart + len(pages)}, {ystart}:{ystart + dat.shape[1]})", end="\r", - ) + ) slicer = ( slice(zstart, zstart + len(pages)), slice(ystart, ystart + dat.shape[1]), slice(None), - ) + ) array[slicer] = dat print("") omz.generate_pyramid(mode="median") diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 50ebf4b3..522f93f3 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -41,7 +41,7 @@ def convert( voxel_size: list[float] = (1, 1, 1), zarr_config: ZarrConfig | None = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert a collection of spool files generated by the LSM pipeline into Zarr. @@ -96,7 +96,7 @@ def convert( r"_y(?P[0-9]+)" r"_z(?P[0-9]+)" r"(?P\w*)$" - ) + ) all_tiles_folders_names = sorted(glob(os.path.join(inp, "*_y*_z*_HR/"))) if not all_tiles_folders_names: @@ -106,7 +106,7 @@ def convert( tiles_info_by_index = {} TileInfo = namedtuple( "TileInfo", ["prefix", "run", "y", "z", "suffix", "filename", "reader"] - ) + ) for tile_folder_name in all_tiles_folders_names: tile_folder_name = tile_folder_name.rstrip("/") parsed = CHUNK_PATTERN.fullmatch(os.path.basename(tile_folder_name)) @@ -118,14 +118,14 @@ def convert( parsed.group("suffix"), tile_folder_name, SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat"), - ) + ) all_tiles_info.append(tile) # Check for duplicate tiles if (tile.y, tile.z) in tiles_info_by_index: raise ValueError( f"Duplicate tile, file {tile.filename} conflicts with " f"{tiles_info_by_index[(tile.y, tile.z)].filename}" - ) + ) tiles_info_by_index[(tile.y, tile.z)] = tile # Set default output path if not provided @@ -175,7 +175,7 @@ def convert( y_idxs, z_idxs = np.where(diff_sx) raise ValueError( f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}" - ) + ) for y_tile in range(min_y_tile, max_y_tile + 1): if y_tile not in expected_sy: raise ValueError(f"Missing y tile {y_tile}") @@ -184,7 +184,7 @@ def convert( y_idxs, z_idxs = np.where(diff_sy) raise ValueError( f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}" - ) + ) for z_tile in range(min_z_tile, max_z_tile + 1): if z_tile not in expected_sz: raise ValueError(f"Missing z tile {z_tile}") @@ -193,7 +193,7 @@ def convert( y_idxs, z_idxs = np.where(diff_sz) raise ValueError( f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}" - ) + ) # Calculate full dataset dimensions full_shape_x = expected_sx @@ -223,7 +223,7 @@ def convert( dat = dat[:, : -overlap // 2 - (overlap % 2), :] ystart = sum( expected_sy[min_y_tile + y_idx] - overlap for y_idx in range(rel_y) - ) + ) zstart = sum(expected_sz[min_z_tile + z_idx] for z_idx in range(rel_z)) if rel_y != 0: ystart += overlap // 2 @@ -232,12 +232,12 @@ def convert( f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:" f"{ystart + dat.shape[1]})", end="\r", - ) + ) slicer = ( slice(zstart, zstart + dat.shape[0]), slice(ystart, ystart + dat.shape[1]), slice(None), - ) + ) array[slicer] = dat print("") @@ -253,7 +253,7 @@ def convert( # debugging needed header = default_nifti_header( omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None) - ) + ) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension affine = orientation_to_affine(orientation, *voxel_size) diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index 7392de0b..c3fb6cd3 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -32,7 +32,7 @@ def make_json(oct_meta: str) -> dict: def _parse_value_unit( string: str, n: int = None - ) -> tuple[float | list[float], str | Any]: + ) -> tuple[float | list[float], str | Any]: number = r"-?(\d+\.?\d*|\d*\.?\d+)(E-?\d+)?" value = "x".join([number] * (n or 1)) match = re.fullmatch(r"(?P" + value + r")(?P\w*)", string) @@ -46,7 +46,7 @@ def _parse_value_unit( "BodyPart": "BRAIN", "Environment": "exvivo", "SampleStaining": "none", - } + } for line in oct_meta.split("\n"): if ":" not in line: diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 1af1d5d7..0c22ccf0 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -23,7 +23,7 @@ _ArrayWrapper, _H5ArrayWrapper, _MatArrayWrapper, - ) +) from linc_convert.utils.io.zarr import from_config from linc_convert.utils.math import ceildiv from linc_convert.utils.orientation import center_affine, orientation_to_affine @@ -73,7 +73,7 @@ def convert( dtype: Optional[str] = None, zarr_config: ZarrConfig = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Matlab to OME-Zarr. @@ -136,7 +136,7 @@ def convert( dataset = zgroup.create_array( "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype) - ) + ) # Process and store data in chunks for i in range(nslices): @@ -150,7 +150,7 @@ def convert( f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: " f"{k + 1:03d}] " f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" - ) + ) z_start = k * chunk_size[0] z_end = z_start + loaded_chunk.shape[-2] y_start = j * chunk_size[1] @@ -175,7 +175,7 @@ def convert( arr = zgroup["0"] header = default_nifti_header( arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") - ) + ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 43ac14fa..9195462b 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -23,7 +23,7 @@ _ArrayWrapper, _H5ArrayWrapper, _MatArrayWrapper, - ) +) from linc_convert.utils.io.zarr import from_config from linc_convert.utils.orientation import center_affine, orientation_to_affine from linc_convert.utils.unit import to_nifti_unit, to_ome_unit @@ -73,7 +73,7 @@ def convert( center: bool = True, zarr_config: ZarrConfig = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Matlab to OME-Zarr. @@ -137,12 +137,12 @@ def convert( dataset = zgroup.create_array( "0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype) - ) + ) for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): logger.info( f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] - ) + ) loaded_chunk = inp[slc] dataset[slc] = loaded_chunk @@ -158,7 +158,7 @@ def convert( arr = zgroup["0"] header = default_nifti_header( arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") - ) + ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) if center: diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index 6ee146d5..d8b893cf 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -7,7 +7,6 @@ import cyclopts import numpy as np - # externals import wkw import zarr @@ -30,7 +29,7 @@ def convert( *, zarr_config: ZarrConfig = None, **kwargs: Unpack[ZarrConfig], - ) -> None: +) -> None: """ Convert annotations (in .wkw format) from webknossos to ome.zarr format. @@ -83,7 +82,7 @@ def convert( offset_x, offset_y = 0, 0 data = wkw_dataset.read( off=(offset_y, offset_x, idx), shape=[size[1], size[0], 1] - ) + ) data = data[0, :, :, 0] data = np.transpose(data, (1, 0)) [t0, b0, l0, r0] = find_borders(data) @@ -108,7 +107,7 @@ def convert( omz.create_array( f"{level}", shape=shape, dtype="uint8", zarr_config=zarr_config - ) + ) array = omz[f"{level}"] # Write each slice @@ -119,7 +118,7 @@ def convert( top, bottom, left, right = [ k * 2 ** (nblevel - level - 1) for k in low_res_offsets[idx] - ] + ] height, width = size[0] - top - bottom, size[1] - left - right data = wkw_dataset.read(off=(left, top, idx), shape=[width, height, 1]) @@ -130,8 +129,8 @@ def convert( [ [dic[data[i][j]] for j in range(data.shape[1])] for i in range(data.shape[0]) - ] - ) + ] + ) subdat_size = data.shape print( @@ -143,7 +142,7 @@ def convert( idx, "with size", subdat_size, - ) + ) if max_load is None or ( subdat_size[-2] < max_load and subdat_size[-1] < max_load ): diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index ac6eaf61..76bb1cba 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -9,7 +9,7 @@ def chunk_slice_generator( arr_shape: Sequence[int], chunk_shape: Sequence[int] - ) -> Generator: +) -> Generator: """ Generate slice indices for chunking an array based on the chunk size. @@ -44,7 +44,7 @@ def chunk_slice_generator( slices = tuple( slice(i * c, min((i + 1) * c, dim)) for i, c, dim in zip(index, chunk_shape, shape) - ) + ) # Prepend an Ellipsis to preserve any preceding (non-chunked) dimensions full_slice = (...,) + slices yield index, full_slice diff --git a/linc_convert/utils/io/_array_wrapper.py b/linc_convert/utils/io/_array_wrapper.py index 1c7a7e84..a751b8d7 100644 --- a/linc_convert/utils/io/_array_wrapper.py +++ b/linc_convert/utils/io/_array_wrapper.py @@ -20,7 +20,7 @@ def _get_key(self, f: Mapping) -> str: warn( f"More than one key in .mat file {self.file}, " f'arbitrarily loading "{key}"' - ) + ) if key not in f.keys(): raise Exception(f"Key {key} not found in file {self.file}") diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index 4c6d7456..c9719745 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -11,7 +11,7 @@ def default_levels( spatial_shape: tuple, spatial_chunk: tuple, no_pyramid_axis: Optional[int] - ) -> int: +) -> int: """ Compute the default number of downsampling levels for a spatial pyramid. @@ -40,14 +40,14 @@ def default_levels( int(math.ceil(math.log2(s / spatial_chunk[i]))) for i, s in enumerate(spatial_shape) if no_pyramid_axis is None or i != no_pyramid_axis - ) + ) levels = max(default_levels, 0) return levels def next_level_shape( prev_shape: Sequence[int], no_pyramid_axis: Optional[int] - ) -> list[int]: +) -> list[int]: """ Compute the shape of the next coarser level by halving each dimension. @@ -83,7 +83,7 @@ def compute_next_level( ndim: int, no_pyramid_axis: int | None = None, window_func: Callable = da.mean, - ) -> da.Array: +) -> da.Array: """ Compute the next level of a dask array pyramid. @@ -117,7 +117,7 @@ def compute_next_level( else 2 ) for axis in pyramid_axes - } + } dtype = arr.dtype return da.coarsen(window_func, arr, factors, trim_excess=True).astype(dtype) diff --git a/linc_convert/utils/io/spool.py b/linc_convert/utils/io/spool.py index 0974199e..eccc3387 100644 --- a/linc_convert/utils/io/spool.py +++ b/linc_convert/utils/io/spool.py @@ -36,7 +36,7 @@ class SpoolSetInterpreter: def __init__( self, spool_set_path: str | PathLike[str], info_file: str | PathLike[str] = None - ) -> None: + ) -> None: if ( os.path.isfile(spool_set_path) and os.path.splitext(spool_set_path)[-1] == ".zip" @@ -66,7 +66,7 @@ def __init__( self.numDepths, self.spool_shape[2], self.spool_shape[0] * len(self.spool_files), - ) + ) def _load_info_file(self, info_file: str | PathLike[str]) -> None: loaded_info = loadmat(info_file) @@ -81,7 +81,7 @@ def _load_info_file(self, info_file: str | PathLike[str]) -> None: except (KeyError, IndexError, ValueError) as e: warnings.warn( f"ERROR: Unable to extract frame information from info file. {e}" - ) + ) return None num_frames_per_spool = int(self.config["multiimage"]["ImagesPerFile"]) num_frames_to_load = num_total_frames - num_bg_frames @@ -90,7 +90,7 @@ def _load_info_file(self, info_file: str | PathLike[str]) -> None: def _make_filename_from_spool_set( self, spool_entry: str | PathLike[str] - ) -> PathLike[str]: + ) -> PathLike[str]: return os.path.join(self.parent, spool_entry) @property @@ -126,7 +126,7 @@ def _extract_config_values(self) -> None: "height": self.config.getint("data", "AOIHeight"), "width": self.config.getint("data", "AOIWidth"), "stride": self.config.getint("data", "AOIStride"), - } + } # ini info dtype = self.config.get("data", "PixelEncoding") @@ -143,7 +143,7 @@ def _extract_config_values(self) -> None: self.acquisition_metadata["images"] = self.config.getint( "multiimage", "ImagesPerFile" - ) + ) numDepths = self.acquisition_metadata["height"] numColumns = self.acquisition_metadata["stride"] // 2 @@ -254,7 +254,7 @@ def assemble(self) -> np.ndarray: axis_0_shape = self.spool_shape[0] canvas = np.zeros( (axis_0_shape * len(self), *self.spool_shape[1:]), dtype=self.dtype - ) + ) for idx, spool_file in enumerate(self): start = idx * axis_0_shape stop = start + axis_0_shape diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index a3adba29..9b91865a 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -24,4 +24,4 @@ open_group, "ZarrTSArray", "ZarrTSGroup", - ] +] diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index bb4d8c73..37f52854 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -15,7 +15,7 @@ TypedDict, Union, Unpack, - ) +) import niizarr import numpy as np @@ -168,7 +168,7 @@ def create_array( *, zarr_config: ZarrConfig = None, **kwargs: Unpack[ZarrArrayConfig], - ) -> ZarrArray: + ) -> ZarrArray: """Create a new array within this group.""" ... @@ -179,7 +179,7 @@ def create_array_from_base( shape: Sequence[int], data: ArrayLike = None, **kwargs: Unpack[ZarrArrayConfig], - ) -> ZarrArray: + ) -> ZarrArray: """Create a new array using metadata of an existing base-level array.""" ... @@ -189,7 +189,7 @@ def generate_pyramid( ndim: int = 3, mode: Literal["mean", "median"] = "median", no_pyramid_axis: Optional[int] = None, - ) -> list[list[int]]: + ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -246,7 +246,7 @@ def write_ome_metadata( no_pool: Optional[int] = None, multiscales_type: str = "", ome_version: Literal["0.4", "0.5"] = "0.4", - ) -> None: + ) -> None: """ Write OME-compatible metadata into this group. @@ -297,7 +297,7 @@ def write_ome_metadata( no_pool=no_pool, multiscales_type=multiscales_type, ome_version=ome_version, - ) + ) def write_nifti_header(self, header: NiftiHeaderLike) -> None: """Write a NIfTI header to the Zarr group.""" diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index d5631a14..f4c93170 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -15,7 +15,7 @@ Tuple, Union, Unpack, - ) +) from urllib.parse import urlparse import numcodecs @@ -99,7 +99,7 @@ def open( *, zarr_version: Literal[2, 3] = 3, mode: Literal["r", "r+", "a", "w", "w-"] = "a", - ) -> "ZarrTSArray": + ) -> "ZarrTSArray": """ Open an existing TensorStore-based Zarr array. @@ -122,7 +122,7 @@ def open( "open": True, "create": False, "delete_existing": False, - } + } ts_array = ts.open(spec).result() return cls(ts_array) @@ -163,7 +163,7 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": """ return cls.open( zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version - ) + ) @classmethod def open( @@ -172,7 +172,7 @@ def open( mode: Literal["r", "r+", "a", "w", "w-"] = "a", *, zarr_version: Literal[2, 3] = 3, - ) -> "ZarrTSGroup": + ) -> "ZarrTSGroup": """ Open or create a Zarr group backed by TensorStore. @@ -238,7 +238,7 @@ def keys(self) -> Iterator[str]: """Get the names of all subgroups and arrays in this group.""" return ( p.name for p in self._path.iterdir() if p.is_dir() and _detect_metadata(p) - ) + ) def __contains__(self, name: str) -> bool: """Check whether a subgroup or array exists in this group.""" @@ -275,7 +275,7 @@ def create_array( zarr_config: Optional[ZarrConfig] = None, data: Optional[ArrayLike] = None, **kwargs: Unpack[ZarrArrayConfig], - ) -> ZarrTSArray: + ) -> ZarrTSArray: """ Create a new array within this group. @@ -294,7 +294,7 @@ def create_array( if zarr_config is None: conf = default_write_config( self._path / name, shape=shape, dtype=dtype, **kwargs - ) + ) else: conf = default_write_config( self._path / name, @@ -306,7 +306,7 @@ def create_array( # TODO: implement this # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), version=zarr_config.zarr_version, - ) + ) conf.update(delete_existing=True, create=True) arr = ts.open(conf).result() if data is not None: @@ -319,7 +319,7 @@ def create_array_from_base( shape: Sequence[int], data: Optional[ArrayLike] = None, **kwargs: Unpack[ZarrArrayConfig], - ) -> ZarrTSArray: + ) -> ZarrTSArray: """ Create a new array using metadata of an existing base-level array. @@ -406,7 +406,7 @@ def auto_shard_size( itemsize: int | np.dtype | str, max_file_size: int = 2 * 1024 ** 4, compression_ratio: float = 2, - ) -> list[int]: +) -> list[int]: """ Find maximal shard size that ensures file size below cap. @@ -459,7 +459,7 @@ def fix_shard_chunk( shard: list[int], chunk: list[int], shape: list[int], - ) -> tuple[list[int], list[int]]: +) -> tuple[list[int], list[int]]: """ Fix incompatibilities between chunk and shard size. @@ -510,7 +510,7 @@ def default_read_config(path: os.PathLike | str) -> dict: "open": True, "create": False, "delete_existing": False, - } + } def _is_array(path: PathLike) -> bool: @@ -587,7 +587,7 @@ def default_write_config( compressor: str = "blosc", compressor_opt: dict | None = None, version: int = 3, - ) -> dict: +) -> dict: """ Generate a default TensorStore configuration. @@ -655,7 +655,7 @@ def default_write_config( chunk_grid = { "name": "regular", "configuration": {"chunk_shape": shard}, - } + } sharding_codec = { "name": "sharding_indexed", @@ -664,14 +664,14 @@ def default_write_config( "codecs": [ codec_little_endian, *compressor, - ], + ], "index_codecs": [ codec_little_endian, {"name": "crc32c"}, - ], + ], "index_location": "end", - }, - } + }, + } codecs = [sharding_codec] else: @@ -679,7 +679,7 @@ def default_write_config( codecs = [ codec_little_endian, *compressor, - ] + ] metadata = { "chunk_grid": chunk_grid, @@ -689,12 +689,12 @@ def default_write_config( "chunk_key_encoding": { "name": "default", "configuration": {"separator": r"/"}, - }, - } + }, + } config = { "driver": "zarr3", "metadata": metadata, - } + } # ------------------------------------------------------------------ # Zarr 2 @@ -713,12 +713,12 @@ def default_write_config( "dtype": np.dtype(dtype).str, "fill_value": 0, "compressor": compressor, - } + } config = { "driver": "zarr", "metadata": metadata, "key_encoding": r"/", - } + } # Prepare store config["metadata"]["shape"] = shape @@ -732,6 +732,6 @@ def _init_group(group_path: PathLike, version: int) -> None: if version == 3: (group_path / "zarr.json").write_text( json.dumps({"zarr_format": 3, "node_type": "group"}) - ) + ) else: (group_path / ".zgroup").write_text(json.dumps({"zarr_format": 2})) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 66e9b6b7..b90e06ad 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -12,7 +12,7 @@ Tuple, Union, Unpack, - ) +) import numpy as np import zarr @@ -91,7 +91,7 @@ def __getattr__(self, name: str) -> Any: # noqa: ANN401 return getattr(self._array, name) raise AttributeError( f"'{self.__class__.__name__}' object has no attribute '{name}'" - ) + ) class ZarrPythonGroup(ZarrGroup): @@ -120,8 +120,8 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": # TODO: figure out overwrite # overwrite=overwrite, zarr_format=zarr_config.zarr_version, - ) ) + ) @property def attrs(self) -> Mapping[str, Any]: @@ -179,7 +179,7 @@ def create_array( zarr_config: ZarrConfig = None, data: Optional[ArrayLike] = None, **kwargs: Unpack[ZarrArrayConfig], - ) -> ZarrPythonArray: + ) -> ZarrPythonArray: """Create a new array within this group.""" if zarr_config is None: arr = self._zgroup.create_array(name, shape, dtype, **kwargs) @@ -202,12 +202,12 @@ def create_array( "fill_value": None, "compressors": _make_compressor( compressor, zarr_config.zarr_version, **compressor_opt - ), - } + ), + } chunk_key_encoding = _dimension_separator_to_chunk_key_encoding( zarr_config.dimension_separator, zarr_config.zarr_version - ) + ) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding arr = self._zgroup.create_array(name=name, shape=shape, **opt) @@ -221,7 +221,7 @@ def create_array_from_base( shape: Sequence[int], data: ArrayLike = None, **kwargs: Unpack[ZarrConfig], - ) -> ZarrPythonArray: + ) -> ZarrPythonArray: """Create a new array using the properties from a base_level object.""" base_level = self["0"] opts = dict( @@ -234,16 +234,16 @@ def create_array_from_base( order=getattr(base_level._array, "order", None), attributes=getattr( getattr(base_level._array, "metadata", None), "attributes", None - ), + ), overwrite=True, - ) + ) # Handle extra options based on metadata type meta = getattr(base_level, "metadata", None) if meta is not None: if hasattr(meta, "dimension_separator"): opts["chunk_key_encoding"] = _dimension_separator_to_chunk_key_encoding( meta.dimension_separator, 2 - ) + ) if hasattr(meta, "chunk_key_encoding"): opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) if hasattr(base_level, "serializer"): @@ -261,7 +261,7 @@ def create_array_from_base( def _make_compressor( name: str | None, zarr_version: Literal[2, 3], **prm: dict - ) -> CompressorsLike: +) -> CompressorsLike: """Build compressor object from name and options.""" if not isinstance(name, str): return name @@ -272,14 +272,14 @@ def _make_compressor( compressor_map = { "blosc": numcodecs.Blosc, "zlib": numcodecs.Zstd, - } + } elif zarr_version == 3: import zarr.codecs compressor_map = { "blosc": zarr.codecs.BloscCodec, "zlib": zarr.codecs.ZstdCodec, - } + } else: raise ValueError() name = name.lower() @@ -293,7 +293,7 @@ def _make_compressor( def _dimension_separator_to_chunk_key_encoding( dimension_separator: Literal[".", "/"], zarr_version: Literal[2, 3] - ) -> ChunkKeyEncodingLike: +) -> ChunkKeyEncodingLike: dimension_separator = dimension_separator if dimension_separator == "." and zarr_version == 2: pass @@ -303,7 +303,7 @@ def _dimension_separator_to_chunk_key_encoding( dimension_separator = ChunkKeyEncodingParams( name="default" if zarr_version == 3 else "v2", separator=dimension_separator - ) + ) return dimension_separator @@ -316,7 +316,7 @@ def _dimension_separator_to_chunk_key_encoding( def _compute_zarr_layout( shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig - ) -> tuple[tuple, tuple | None]: +) -> tuple[tuple, tuple | None]: ndim = len(shape) if ndim == 5: if zarr_config.no_time: @@ -324,11 +324,11 @@ def _compute_zarr_layout( chunk_tc = ( 1 if zarr_config.chunk_time else shape[0], 1 if zarr_config.chunk_channels else shape[1], - ) + ) shard_tc = ( chunk_tc[0] if zarr_config.shard_time else shape[0], chunk_tc[1] if zarr_config.shard_channels else shape[1], - ) + ) elif ndim == 4: if zarr_config.no_time: @@ -399,14 +399,14 @@ def _compute_zarr_layout( candidate = L[i] new_product = np.prod( [candidate if j == i else M[j] for j in range(dims)] - ) + ) if new_product <= B_multiplier and candidate > M[i]: M[i] = candidate improved = True # Remove dimensions that have reached or exceeded the data size. free_dims = [ i for i in free_dims if M[i] * chunk_spatial[i] < shape_spatial[i] - ] + ] shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index dcb8c308..a2dea2f2 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -9,7 +9,7 @@ from linc_convert.utils.io.zarr.drivers.zarr_python import ( ZarrPythonArray, ZarrPythonGroup, - ) +) from linc_convert.utils.zarr_config import DriverLike, ZarrConfig _DRIVER_ARRAY = {"zarr-python": ZarrPythonArray} @@ -29,7 +29,7 @@ def open( mode: Literal["r", "r+", "a", "w", "w-"] = "a", zarr_version: Literal[2, 3] = 3, driver: DriverLike = "zarr-python", - ) -> ZarrNode: +) -> ZarrNode: """ Open a Zarr Node (Array or Group) based on the specified driver. @@ -57,7 +57,7 @@ def open_group( mode: Literal["r", "r+", "a", "w", "w-"] = "a", zarr_version: Literal[2, 3] = 3, driver: DriverLike = "zarr-python", - ) -> ZarrGroup: +) -> ZarrGroup: """ Open a Zarr Group based on the specified driver. diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index 7a3f2422..dad0af2c 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -11,7 +11,7 @@ def setup_logging() -> None: logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", - ) + ) logging.captureWarnings(True) @@ -21,7 +21,7 @@ def add_file_handler(log_file_path: str | PathLike[str] = None) -> None: file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" - ) + ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) diff --git a/linc_convert/utils/orientation.py b/linc_convert/utils/orientation.py index 171de120..d5840d8d 100644 --- a/linc_convert/utils/orientation.py +++ b/linc_convert/utils/orientation.py @@ -21,7 +21,7 @@ def orientation_ensure_3d(orientation: str) -> str: "coronal": "LI", "axial": "LP", "sagittal": "PI", - }.get(orientation.lower(), orientation).upper() + }.get(orientation.lower(), orientation).upper() if len(orientation) == 2: if "L" not in orientation and "R" not in orientation: orientation += "R" @@ -34,7 +34,7 @@ def orientation_ensure_3d(orientation: str) -> str: def orientation_to_affine( orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 - ) -> np.ndarray: +) -> np.ndarray: """ Build an affine matrix from an orientation string and voxel size. diff --git a/linc_convert/utils/unit.py b/linc_convert/utils/unit.py index f4057589..11972825 100644 --- a/linc_convert/utils/unit.py +++ b/linc_convert/utils/unit.py @@ -28,7 +28,7 @@ "yottameter", "zeptometer", "zettameter", - ], + ], "time": [ "attosecond", "centisecond", @@ -53,8 +53,8 @@ "yottasecond", "zeptosecond", "zettasecond", - ], - } + ], +} nifti_valid_units = [ "unknown", @@ -67,7 +67,7 @@ "hz", "ppm", "rads", - ] +] si_prefix_short2long = { "Q": "quetta", @@ -98,7 +98,7 @@ "y": "yocto", "r": "ronto", "q": "quecto", - } +} si_prefix_long2short = {long: short for short, long in si_prefix_short2long.items()} @@ -132,11 +132,11 @@ "y": -24, "r": -27, "q": -30, - } +} unit_space_short2long = { short + "m": long + "meter" for short, long in si_prefix_short2long.items() - } +} unit_space_short2long.update( { "m": "meter", @@ -148,14 +148,14 @@ '"': "inch", "Å": "angstrom", "pc": "parsec", - } - ) + } +) unit_space_long2short = {long: short for short, long in unit_space_short2long.items()} unit_space_long2short["micron"] = "u" unit_time_short2long = { short + "s": long + "second" for short, long in si_prefix_short2long.items() - } +} unit_time_short2long.update( { "y": "year", @@ -163,13 +163,13 @@ "h": "hour", "m": "minute", "s": "second", - } - ) + } +) unit_time_long2short = {long: short for short, long in unit_time_short2long.items()} unit_space_scale = { prefix + "m": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() - } +} unit_space_scale.update( { "mi": 1609.344, @@ -180,20 +180,20 @@ '"': 25.4e-3, "Å": 1e-10, "pc": 3.0857e16, - } - ) + } +) unit_time_scale = { prefix + "s": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() - } +} unit_time_scale.update( { "y": 365.25 * 24 * 60 * 60, "d": 24 * 60 * 60, "h": 60 * 60, "m": 60, - } - ) + } +) def convert_unit(value: float, src: str, dst: str) -> float: @@ -226,7 +226,7 @@ def to_nifti_unit(unit: str) -> str: "second": "sec", "millisecond": "msec", "microsecond": "usec", - }.get(unit, "unknown") + }.get(unit, "unknown") def unit_to_scale(unit: str) -> float: diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index bc009aa1..4dabcca3 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -143,17 +143,17 @@ def set_default_name(self, name: str) -> None: answer = input( f"The output path '{self.out}' already exists. Do you want to " f"overwrite it? (y/n): " - ) + ) if answer.lower() not in ("y", "yes"): raise FileExistsError( f"Output path '{self.out}' exists and overwrite was not " f"confirmed." - ) + ) def update_default_config( zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] - ) -> ZarrConfig: +) -> ZarrConfig: """ Merge user overrides into an existing ZarrConfig or create a new one. diff --git a/tests/test_df_multi_slice.py b/tests/test_df_multi_slice.py index 2c41da0b..c685aaed 100644 --- a/tests/test_df_multi_slice.py +++ b/tests/test_df_multi_slice.py @@ -21,7 +21,7 @@ def multi_slice_jp2(tmp_path): glymur.Jp2k( f"{tmp_path}/slice{i:03d}.jp2", data=image[..., i], - ) + ) files = glob.glob(str(os.path.join(tmp_path, "*.jp2"))) files.sort() return files @@ -35,11 +35,11 @@ def test_df_multi_slice(tmp_path, multi_slice_jp2, zarr_version, driver): out=str(output), zarr_version=zarr_version, driver=driver - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden @@ -50,6 +50,6 @@ def test_df_multi_slice_regen_golden(tmp_path, multi_slice_jp2, zarr_version): multi_slice_jp2, out=str(output), zarr_version=zarr_version, - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_df_single_slice.py b/tests/test_df_single_slice.py index 2b893934..a2858bde 100644 --- a/tests/test_df_single_slice.py +++ b/tests/test_df_single_slice.py @@ -17,7 +17,7 @@ def single_slice_jp2(tmp_path): glymur.Jp2k( path, data=image, - ) + ) return path @@ -29,11 +29,11 @@ def test_df_single_slice(tmp_path, single_slice_jp2, zarr_version, driver): out=str(output), zarr_version=zarr_version, driver=driver - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden @@ -44,6 +44,6 @@ def test_df_single_slice_regen_golden(tmp_path, single_slice_jp2, zarr_version): str(single_slice_jp2), out=str(output), zarr_version=zarr_version, - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_mosaic.py b/tests/test_lsm_mosaic.py index 1e60aae6..34034b19 100644 --- a/tests/test_lsm_mosaic.py +++ b/tests/test_lsm_mosaic.py @@ -40,11 +40,11 @@ def test_lsm_mosaic(tmp_path, mosaic_tiff, zarr_version, driver): out=str(output), zarr_version=zarr_version, driver=driver - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden @@ -55,6 +55,6 @@ def test_lsm_mosaic_regen_golden(tmp_path, mosaic_tiff, zarr_version): str(mosaic_tiff), out=str(output), zarr_version=zarr_version, - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py index bc53f1a3..113a4a91 100644 --- a/tests/test_lsm_multi_slice.py +++ b/tests/test_lsm_multi_slice.py @@ -32,11 +32,11 @@ def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, driver): out=str(output), zarr_version=zarr_version, driver=driver - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden @@ -48,6 +48,6 @@ def test_lsm_multi_slice_regen_golden(tmp_path, multi_slice_tiff, zarr_version): overlap=0, out=str(output), zarr_version=zarr_version, - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index e5240ea0..d78d86e4 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -31,7 +31,7 @@ def write_zyla_spool_set( *, pixel_encoding: str = 'Mono16', images_per_file: int = None, - ): +): """ Given `image` of shape (numDepths, numColumns, numFrames), create a Zyla‑compatible spool directory at `spool_set_path` @@ -126,7 +126,7 @@ def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden diff --git a/tests/test_oct_multi_slice.py b/tests/test_oct_multi_slice.py index 063e6a8f..9c458dc2 100644 --- a/tests/test_oct_multi_slice.py +++ b/tests/test_oct_multi_slice.py @@ -39,12 +39,12 @@ def test_oct_multi_slice(tmp_path, multi_slice_mats, zarr_version, driver): overwrite=True, chunk=(64,), driver=driver, - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + ) @pytest.mark.golden @@ -59,7 +59,7 @@ def test_oct_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version): overwrite=True, chunk=(64,), driver="zarr-python", - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) @@ -75,19 +75,21 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, overwrite=True, driver=driver - ) + ) assert_zarr_equal( str(output_zarr), zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) @pytest.mark.golden @pytest.mark.heavy -def test_oct_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, - zarr_version): +def test_oct_multi_slice_heavy_regen_golden( + test_data_heavy_dir, tmp_path, + zarr_version +): multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" expected_zarr = multi_slice_heavy_data_dir / f"zarr{zarr_version}.nii.zarr.zip" files = glob.glob(str(multi_slice_heavy_data_dir / "*.mat")) @@ -96,6 +98,6 @@ def test_oct_multi_slice_heavy_regen_golden(test_data_heavy_dir, tmp_path, multi_slice.convert( files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, overwrite=True - ) + ) base = expected_zarr.with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) diff --git a/tests/test_oct_single_volume.py b/tests/test_oct_single_volume.py index c196baf8..f197ff13 100644 --- a/tests/test_oct_single_volume.py +++ b/tests/test_oct_single_volume.py @@ -26,10 +26,12 @@ def single_volume_mat(tmp_path): [ (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), - ], - ) -def test_oct_single_volume(tmp_path, single_volume_mat, zarr_version, expected_zarr, - driver): + ], +) +def test_oct_single_volume( + tmp_path, single_volume_mat, zarr_version, expected_zarr, + driver +): output = tmp_path / "single_volume.nii.zarr" single_volume.convert( @@ -40,12 +42,12 @@ def test_oct_single_volume(tmp_path, single_volume_mat, zarr_version, expected_z overwrite=True, chunk=(64,), driver=driver, - ) + ) assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r"), - ) + ) @pytest.mark.golden @@ -54,10 +56,12 @@ def test_oct_single_volume(tmp_path, single_volume_mat, zarr_version, expected_z [ (2, "data/oct_single_volume_zarr2.nii.zarr.zip"), (3, "data/oct_single_volume_zarr3.nii.zarr.zip"), - ], - ) -def test_oct_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_version, - expected_zarr): + ], +) +def test_oct_single_volume_regen_golden( + tmp_path, single_volume_mat, zarr_version, + expected_zarr +): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. """ @@ -70,6 +74,6 @@ def test_oct_single_volume_regen_golden(tmp_path, single_volume_mat, zarr_versio overwrite=True, chunk=(64,), driver="zarr-python", - ) + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/test_wk.py b/tests/test_wk.py index 9b19885c..0098545c 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -1,4 +1,3 @@ -import os import shutil from pathlib import Path @@ -42,7 +41,7 @@ def test_wkw(tmp_path, wk_annotation, zarr_version, driver): assert_zarr_equal( str(output), zarr.storage.ZipStore(expected_zarr, mode="r") - ) + ) @pytest.mark.golden diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index 93b60977..90632d6c 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -99,7 +99,8 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: def assert_zarr_equal( store1: Union[str, zarr.storage.StoreLike], store2: Union[str, zarr.storage.StoreLike], - ignore_nii: bool = False) -> None: + ignore_nii: bool = False +) -> None: """ Assert that two Zarr groups—opened from either a path or a store—have identical contents. diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 1bcdbada..1037673d 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -19,7 +19,7 @@ initials = wkw_dir.split("/")[-2][:2] output_zarr = os.path.join( tmp_dir, basename + "_dsec_" + initials + ".ome.zarr" - ) + ) webknossos_annotation.convert(wkw_dir, ome_dir, tmp_dir, "{}") zarr.copy_all(zarr.open(output_zarr), zarr.open("data/wk.zarr.zip", "w")) diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py index f869d008..6107551e 100644 --- a/tests/utils/sample_data.py +++ b/tests/utils/sample_data.py @@ -8,7 +8,7 @@ def sample_data_variation( param: float, image: Optional[np.ndarray] = None, output_dtype: Optional[np.dtype] = None - ) -> np.ndarray: +) -> np.ndarray: """ Scale global intensity by (1+param), then wrap values modulo the output dtype range. @@ -54,7 +54,7 @@ def generate_sample_data_variation( param_range: Tuple[float, float] = (-0.95, 0.95), image: Optional[np.ndarray] = None, output_dtype: Optional[np.dtype] = None - ) -> List[np.ndarray]: +) -> List[np.ndarray]: """ Generate `n` deterministic, wrapped‐intensity variations. @@ -80,4 +80,4 @@ def generate_sample_data_variation( return [ sample_data_variation(p, image=image, output_dtype=output_dtype) for p in params - ] + ] From c384fa4b99bbc8cf4d97b6695816a27dafbb1625 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 11:10:57 -0400 Subject: [PATCH 125/157] style: fix indent --- linc_convert/modalities/wk/webknossos_annotation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index d8b893cf..aa5b5f9d 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -7,6 +7,7 @@ import cyclopts import numpy as np + # externals import wkw import zarr From 044b6ba1781fd7b005baa56bcc5be21a25750962 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 11:12:09 -0400 Subject: [PATCH 126/157] style: fix indent --- tests/conftest.py | 19 +++++++++--------- tests/test_df_multi_slice.py | 10 ++-------- tests/test_df_single_slice.py | 9 ++------- tests/test_lsm_mosaic.py | 10 ++-------- tests/test_lsm_multi_slice.py | 7 ++----- tests/test_lsm_spool.py | 21 ++++++++++---------- tests/test_oct_multi_slice.py | 17 +++++++++++------ tests/test_oct_single_volume.py | 6 ++---- tests/test_wk.py | 27 +++++++++++++++----------- tests/utils/compare_file.py | 34 ++++++++++++++++++--------------- tests/utils/sample_data.py | 7 +++---- 11 files changed, 79 insertions(+), 88 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0e66b025..5b6749ce 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,15 +3,16 @@ import pytest -DOWNLOAD_CMD = ["dandi", - "download", - "https://lincbrain.org/dandiset/000051/draft", - "-i", - "linc", - "-e", - "refresh", - "--preserve-tree" - ] +DOWNLOAD_CMD = [ + "dandi", + "download", + "https://lincbrain.org/dandiset/000051/draft", + "-i", + "linc", + "-e", + "refresh", + "--preserve-tree", +] @pytest.fixture(scope="session") diff --git a/tests/test_df_multi_slice.py b/tests/test_df_multi_slice.py index c685aaed..e8268774 100644 --- a/tests/test_df_multi_slice.py +++ b/tests/test_df_multi_slice.py @@ -31,15 +31,9 @@ def test_df_multi_slice(tmp_path, multi_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.zarr" multi_slice.convert( - multi_slice_jp2, - out=str(output), - zarr_version=zarr_version, - driver=driver - ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") + multi_slice_jp2, out=str(output), zarr_version=zarr_version, driver=driver ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden diff --git a/tests/test_df_single_slice.py b/tests/test_df_single_slice.py index a2858bde..f20eec0f 100644 --- a/tests/test_df_single_slice.py +++ b/tests/test_df_single_slice.py @@ -25,15 +25,10 @@ def test_df_single_slice(tmp_path, single_slice_jp2, zarr_version, driver): expected_zarr = f"data/df_single_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "single_slice.zarr" single_slice.convert( - str(single_slice_jp2), - out=str(output), - zarr_version=zarr_version, + str(single_slice_jp2), out=str(output), zarr_version=zarr_version, driver=driver ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden diff --git a/tests/test_lsm_mosaic.py b/tests/test_lsm_mosaic.py index 34034b19..f469282a 100644 --- a/tests/test_lsm_mosaic.py +++ b/tests/test_lsm_mosaic.py @@ -36,15 +36,9 @@ def test_lsm_mosaic(tmp_path, mosaic_tiff, zarr_version, driver): expected_zarr = f"data/lsm_mosaic_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "mosaic.nii.zarr" mosaic.convert( - str(mosaic_tiff), - out=str(output), - zarr_version=zarr_version, - driver=driver - ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") + str(mosaic_tiff), out=str(output), zarr_version=zarr_version, driver=driver ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden diff --git a/tests/test_lsm_multi_slice.py b/tests/test_lsm_multi_slice.py index 113a4a91..1027974d 100644 --- a/tests/test_lsm_multi_slice.py +++ b/tests/test_lsm_multi_slice.py @@ -31,12 +31,9 @@ def test_lsm_multi_slice(tmp_path, multi_slice_tiff, zarr_version, driver): overlap=0, out=str(output), zarr_version=zarr_version, - driver=driver - ) - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") + driver=driver, ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index d78d86e4..32ece99c 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -29,7 +29,7 @@ def write_zyla_spool_set( image: np.ndarray, spool_set_path: str, *, - pixel_encoding: str = 'Mono16', + pixel_encoding: str = "Mono16", images_per_file: int = None, ): """ @@ -53,9 +53,9 @@ def write_zyla_spool_set( numDepths, numColumns, numFrames = image.shape if images_per_file is None: images_per_file = numFrames - if pixel_encoding == 'Mono16': + if pixel_encoding == "Mono16": dtype = np.uint16 - elif pixel_encoding == 'Mono8': + elif pixel_encoding == "Mono8": dtype = np.uint8 else: raise ValueError("pixel_encoding must be 'Mono16' or 'Mono8'") @@ -77,7 +77,7 @@ def write_zyla_spool_set( os.makedirs(spool_set_path, exist_ok=True) # marker for format detection - open(os.path.join(spool_set_path, 'Spooled files.sifx'), 'wb').close() + open(os.path.join(spool_set_path, "Spooled files.sifx"), "wb").close() # write acquisitionmetadata.ini ini = f""" @@ -91,8 +91,10 @@ def write_zyla_spool_set( [multiimage] ImagesPerFile = {images_per_file} """ - with open(os.path.join(spool_set_path, 'acquisitionmetadata.ini'), 'w', - encoding='utf-8') as f: + with open( + os.path.join(spool_set_path, "acquisitionmetadata.ini"), "w", + encoding="utf-8" + ) as f: f.write(ini) # split into as many spool files as needed @@ -113,7 +115,7 @@ def write_zyla_spool_set( # name = reversed zero‑padded index + "spool.dat" rev = str(file_idx).zfill(10)[::-1] fn = f"{rev}spool.dat" - with open(os.path.join(spool_set_path, fn), 'wb') as f: + with open(os.path.join(spool_set_path, fn), "wb") as f: f.write(buf.tobytes()) @@ -123,10 +125,7 @@ def test_lsm_spool_convert(tmp_path, spool_dat, zarr_version): spool.convert(inp=spool_dat, out=str(output), overlap=0) # assert_zarr_equal is assumed available from your test utils - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") - ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden diff --git a/tests/test_oct_multi_slice.py b/tests/test_oct_multi_slice.py index 9c458dc2..495c7b3b 100644 --- a/tests/test_oct_multi_slice.py +++ b/tests/test_oct_multi_slice.py @@ -72,9 +72,12 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=2, + files, + out=str(output_zarr), + key="Psi_ObsLSQ", + zarr_version=2, overwrite=True, - driver=driver + driver=driver, ) assert_zarr_equal( str(output_zarr), @@ -87,8 +90,7 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv @pytest.mark.golden @pytest.mark.heavy def test_oct_multi_slice_heavy_regen_golden( - test_data_heavy_dir, tmp_path, - zarr_version + test_data_heavy_dir, tmp_path, zarr_version ): multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" expected_zarr = multi_slice_heavy_data_dir / f"zarr{zarr_version}.nii.zarr.zip" @@ -96,8 +98,11 @@ def test_oct_multi_slice_heavy_regen_golden( files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, out=str(output_zarr), key="Psi_ObsLSQ", zarr_version=zarr_version, - overwrite=True + files, + out=str(output_zarr), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, ) base = expected_zarr.with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) diff --git a/tests/test_oct_single_volume.py b/tests/test_oct_single_volume.py index f197ff13..829f185a 100644 --- a/tests/test_oct_single_volume.py +++ b/tests/test_oct_single_volume.py @@ -29,8 +29,7 @@ def single_volume_mat(tmp_path): ], ) def test_oct_single_volume( - tmp_path, single_volume_mat, zarr_version, expected_zarr, - driver + tmp_path, single_volume_mat, zarr_version, expected_zarr, driver ): output = tmp_path / "single_volume.nii.zarr" @@ -59,8 +58,7 @@ def test_oct_single_volume( ], ) def test_oct_single_volume_regen_golden( - tmp_path, single_volume_mat, zarr_version, - expected_zarr + tmp_path, single_volume_mat, zarr_version, expected_zarr ): """ Rebuild single-volume golden archives. Only run with --regenerate-golden. diff --git a/tests/test_wk.py b/tests/test_wk.py index 0098545c..18f16221 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -17,8 +17,10 @@ @pytest.fixture def wk_annotation(tmp_path): image, annotation = generate_sample_data_variation(2, output_dtype=np.uint8) - image, annotation = Nifti1Image(image, np.eye(4)), Nifti1Image(annotation, - np.eye(4)) + image, annotation = ( + Nifti1Image(image, np.eye(4)), + Nifti1Image(annotation, np.eye(4)), + ) niizarr.nii2zarr(image, tmp_path / "image.nii.zarr", chunk=64) niizarr.nii2zarr(annotation, tmp_path / "annotation.nii.zarr", chunk=64) @@ -35,21 +37,24 @@ def wk_annotation(tmp_path): def test_wkw(tmp_path, wk_annotation, zarr_version, driver): expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "wkw.nii.zarr" - webknossos_annotation.convert(str(wk_annotation / "wkw"), - str(wk_annotation / "image.nii.zarr"), out=output, - dic="{}") - assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r") + webknossos_annotation.convert( + str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), + out=output, + dic="{}", ) + assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @pytest.mark.golden def test_wkw_regen_golden(tmp_path, wk_annotation, zarr_version): expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "wkw.nii.zarr" - webknossos_annotation.convert(str(wk_annotation / "wkw"), - str(wk_annotation / "image.nii.zarr"), out=output, - dic="{}") + webknossos_annotation.convert( + str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), + out=output, + dic="{}", + ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index 90632d6c..7adc63ee 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -16,7 +16,7 @@ def load_file(path): """ ext = os.path.splitext(path)[1].lower() # Handle .nii and .nii.gz - if ext in ['.nii', '.gz'] and (path.endswith('.nii') or path.endswith('.nii.gz')): + if ext in [".nii", ".gz"] and (path.endswith(".nii") or path.endswith(".nii.gz")): try: import nibabel as nib except ImportError: @@ -27,7 +27,7 @@ def load_file(path): return data # Handle .mat - if ext == '.mat': + if ext == ".mat": try: from scipy.io import loadmat except ImportError: @@ -35,22 +35,23 @@ def load_file(path): sys.exit(1) mat = loadmat(path) # Extract variable array from mat dict (ignoring metadata keys) - keys = [k for k in mat.keys() if not k.startswith('__')] + keys = [k for k in mat.keys() if not k.startswith("__")] if len(keys) != 1: print( f"Error: Expected one variable in the MAT file, found " - f"{len(keys)}: {keys}") + f"{len(keys)}: {keys}" + ) sys.exit(1) return mat[keys[0]] # Handle .zarr - if ext == '.zarr' or '.zarr' in path: + if ext == ".zarr" or ".zarr" in path: try: import zarr except ImportError: print("Error: zarr is not installed.") sys.exit(1) - arr = zarr.open(path, mode='r') + arr = zarr.open(path, mode="r") return arr[:] # load full array into memory print(f"Unsupported file extension: {ext}") @@ -99,7 +100,7 @@ def _cmp_zarr_archives(path1: str, path2: str) -> bool: def assert_zarr_equal( store1: Union[str, zarr.storage.StoreLike], store2: Union[str, zarr.storage.StoreLike], - ignore_nii: bool = False + ignore_nii: bool = False, ) -> None: """ Assert that two Zarr groups—opened from either a path or a store—have identical @@ -123,15 +124,17 @@ def assert_zarr_equal( if dict(zarr1.attrs) != dict(zarr2.attrs): diffs.append( f"Group attrs differ:\n ‣ {json.dumps(dict(zarr1.attrs))}\n ‣ " - f"{json.dumps(dict(zarr2.attrs))}") + f"{json.dumps(dict(zarr2.attrs))}" + ) if set(zarr1.keys()) != set(zarr2.keys()): diffs.append( f"Group keys differ:\n ‣ {set(zarr1.keys())} in {zarr1.store_path}\n " - f"‣ {set(zarr2.keys())} in {zarr2.store_path}") + f"‣ {set(zarr2.keys())} in {zarr2.store_path}" + ) keys = set(zarr1.keys()).intersection(set(zarr2.keys())) for key in keys: - if ignore_nii and key == 'nifti': + if ignore_nii and key == "nifti": continue obj1 = zarr1[key] obj2 = zarr2[key] @@ -142,7 +145,8 @@ def assert_zarr_equal( diffs.append( f"Attributes for key '{key}' differ:\n" f" ‣ {dict(obj1.attrs)}\n" - f" ‣ {dict(obj2.attrs)}") + f" ‣ {dict(obj2.attrs)}" + ) try: np.testing.assert_array_equal(obj1[:], obj2[:]) except AssertionError as e: @@ -160,9 +164,9 @@ def assert_zarr_equal( def main(): - parser = argparse.ArgumentParser(description='Compare arrays in two files.') - parser.add_argument('file1', help='First file (.nii, .nii.gz, .mat, .zarr)') - parser.add_argument('file2', help='Second file (.nii, .nii.gz, .mat, .zarr)') + parser = argparse.ArgumentParser(description="Compare arrays in two files.") + parser.add_argument("file1", help="First file (.nii, .nii.gz, .mat, .zarr)") + parser.add_argument("file2", help="Second file (.nii, .nii.gz, .mat, .zarr)") args = parser.parse_args() a = load_file(args.file1) @@ -175,5 +179,5 @@ def main(): print(e) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py index 6107551e..ae56f1d6 100644 --- a/tests/utils/sample_data.py +++ b/tests/utils/sample_data.py @@ -7,7 +7,7 @@ def sample_data_variation( param: float, image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None + output_dtype: Optional[np.dtype] = None, ) -> np.ndarray: """ Scale global intensity by (1+param), then wrap values modulo the output dtype range. @@ -53,7 +53,7 @@ def generate_sample_data_variation( n: int, param_range: Tuple[float, float] = (-0.95, 0.95), image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None + output_dtype: Optional[np.dtype] = None, ) -> List[np.ndarray]: """ Generate `n` deterministic, wrapped‐intensity variations. @@ -78,6 +78,5 @@ def generate_sample_data_variation( image = skimage.data.brain() params = np.linspace(param_range[0], param_range[1], n) return [ - sample_data_variation(p, image=image, output_dtype=output_dtype) - for p in params + sample_data_variation(p, image=image, output_dtype=output_dtype) for p in params ] From 9d826da229a8d1aa3bb0d6d282a8509fc81c9731 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 13:39:58 -0400 Subject: [PATCH 127/157] fix: remove duplicated unused function --- linc_convert/utils/io/zarr/drivers/tensorstore.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index f4c93170..658f4af9 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -343,21 +343,6 @@ def create_array_from_base( return ZarrTSArray(arr) -def make_compressor(name: str, **prm: dict) -> numcodecs.abc.Codec: - """Build compressor object from name and options.""" - # TODO: we should use `numcodecs.get_codec` instead` - if not isinstance(name, str): - return name - name = name.lower() - if name == "blosc": - Compressor = numcodecs.Blosc - elif name == "zlib": - Compressor = numcodecs.Zlib - else: - raise ValueError("Unknown compressor", name) - return Compressor(**prm) - - def make_compressor_v2(name: str | None, **prm: dict) -> dict: """Build compressor dictionary for Zarr v2.""" name = name.lower() From d3c70b416322ad6ed536c43d5f6b80de60344152 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 14:04:25 -0400 Subject: [PATCH 128/157] fix: add to __all__ only when import succeeded --- linc_convert/utils/io/zarr/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index 9b91865a..16e5038a 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -6,13 +6,6 @@ from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup from .factory import from_config, open, open_group -try: - import tensorstore as TS # noqa: F401 - - from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup -except ImportError: - warnings.warn("Tensorstore is not installed, driver disabled") - __all__ = [ ZarrArray, ZarrGroup, @@ -22,6 +15,13 @@ from_config, open, open_group, - "ZarrTSArray", - "ZarrTSGroup", ] + +try: + import tensorstore as TS # noqa: F401 + + from .drivers.tensorstore import ZarrTSArray, ZarrTSGroup + + __all__ += ["ZarrTSArray", "ZarrTSGroup"] +except ImportError: + warnings.warn("Tensorstore is not installed, driver disabled") From 3ce5ff91fb36bb388e4cd05cae6866434548dea9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Fri, 1 Aug 2025 14:04:33 -0400 Subject: [PATCH 129/157] fix: remove redundant import --- linc_convert/utils/io/zarr/drivers/tensorstore.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 658f4af9..6a06218c 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -18,8 +18,6 @@ ) from urllib.parse import urlparse -import numcodecs -import numcodecs.abc import numpy as np import tensorstore as ts import zarr From bbf81a1907321aad79b1893cfd8ea35ac6453e0f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 10:17:38 -0400 Subject: [PATCH 130/157] chore: remove unused code --- tests/conftest.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5b6749ce..a116eaeb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -36,8 +36,3 @@ def driver(request): @pytest.fixture(scope="module", params=[2, 3]) def zarr_version(request): return request.param - - -@pytest.mark.heavy -def test_heavy(test_data_heavy_dir): - assert True From 204ffba3eb7a1840516d3853ec4904e467b9776a Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 10:43:00 -0400 Subject: [PATCH 131/157] style --- linc_convert/modalities/lsm/mosaic.py | 74 +++++++++++----------- linc_convert/modalities/psoct/_utils.py | 2 +- linc_convert/utils/chunk_processing.py | 6 +- linc_convert/utils/io/zarr/abc.py | 82 ++++++++++++------------- linc_convert/utils/logging.py | 6 +- linc_convert/utils/orientation.py | 2 +- tests/test_lsm_spool.py | 13 ++-- tests/test_oct_multi_slice.py | 60 +++++++++--------- tests/test_wk.py | 16 ++--- tests/utils/sample_data.py | 14 ++--- 10 files changed, 137 insertions(+), 138 deletions(-) diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index a6910574..f72c87d9 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -28,15 +28,15 @@ @mosaic.default def convert( - inp: str, - *, - zarr_config: ZarrConfig = None, - max_load: int = 512, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - voxel_size: list[float] = (1, 1, 1), - **kwargs: Unpack[ZarrConfig], + inp: str, + *, + zarr_config: ZarrConfig = None, + max_load: int = 512, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + voxel_size: list[float] = (1, 1, 1), + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into ZARR. @@ -84,29 +84,29 @@ def convert( max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" - r"_z(?P[0-9]+)" - r"_y(?P[0-9]+)" - r"(" - r"?P\w*)$" + r"^(?P\w*)" + r"_z(?P[0-9]+)" + r"_y(?P[0-9]+)" + r"(" + r"?P\w*)$" ) all_chunks_dirnames = list(sorted(glob(os.path.join(inp, "*_z*_y*")))) all_chunks_info = dict( - dirname=[], - prefix=[], - suffix=[], - z=[], - y=[], - planes=[ - dict( - fname=[], - z=[], - c=[], - yx_shape=[], - ) - for _ in range(len(all_chunks_dirnames)) - ], + dirname=[], + prefix=[], + suffix=[], + z=[], + y=[], + planes=[ + dict( + fname=[], + z=[], + c=[], + yx_shape=[], + ) + for _ in range(len(all_chunks_dirnames)) + ], ) # parse all directory names @@ -131,17 +131,17 @@ def convert( for ychunk in range(nchunky): for i in range(len(all_chunks_info["dirname"])): if ( - all_chunks_info["z"][i] == zchunk + 1 - and all_chunks_info["y"][i] == ychunk + 1 + all_chunks_info["z"][i] == zchunk + 1 + and all_chunks_info["y"][i] == ychunk + 1 ): break dirname = all_chunks_info["dirname"][i] planes_filenames = list(sorted(glob(os.path.join(dirname, "*.tiff")))) PLANE_PATTERN = re.compile( - os.path.basename(dirname) + r"_plane(?P[0-9]+)" - r"_c(?P[0-9]+)" - r".tiff$" + os.path.basename(dirname) + r"_plane(?P[0-9]+)" + r"_c(?P[0-9]+)" + r".tiff$" ) for fname in planes_filenames: @@ -181,7 +181,7 @@ def convert( omz = from_config(zarr_config) arr = omz.create_array( - "0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config + "0", shape=[nchannels, *fullshape], dtype="float64", zarr_config=zarr_config ) print("Write level 0 with shape", [nchannels, *fullshape]) @@ -197,9 +197,9 @@ def convert( zstart = sum(shape[0][0] for shape in allshapes[:chunkz]) ystart = sum(shape[1] for shape in allshapes[chunkz][:chunky]) print( - f"Write plane " - f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", - end="\r", + f"Write plane " + f"({subc}, {zstart + subz}, {ystart}:{ystart + yx_shape[0]})", + end="\r", ) slicer = ( subc, diff --git a/linc_convert/modalities/psoct/_utils.py b/linc_convert/modalities/psoct/_utils.py index c3fb6cd3..e6a7ba95 100644 --- a/linc_convert/modalities/psoct/_utils.py +++ b/linc_convert/modalities/psoct/_utils.py @@ -31,7 +31,7 @@ def make_json(oct_meta: str) -> dict: """ def _parse_value_unit( - string: str, n: int = None + string: str, n: int = None ) -> tuple[float | list[float], str | Any]: number = r"-?(\d+\.?\d*|\d*\.?\d+)(E-?\d+)?" value = "x".join([number] * (n or 1)) diff --git a/linc_convert/utils/chunk_processing.py b/linc_convert/utils/chunk_processing.py index 76bb1cba..5201c409 100644 --- a/linc_convert/utils/chunk_processing.py +++ b/linc_convert/utils/chunk_processing.py @@ -8,7 +8,7 @@ def chunk_slice_generator( - arr_shape: Sequence[int], chunk_shape: Sequence[int] + arr_shape: Sequence[int], chunk_shape: Sequence[int] ) -> Generator: """ Generate slice indices for chunking an array based on the chunk size. @@ -42,8 +42,8 @@ def chunk_slice_generator( # Create slice objects for each dimension, # ensuring we don't go beyond the array's bounds slices = tuple( - slice(i * c, min((i + 1) * c, dim)) - for i, c, dim in zip(index, chunk_shape, shape) + slice(i * c, min((i + 1) * c, dim)) + for i, c, dim in zip(index, chunk_shape, shape) ) # Prepend an Ellipsis to preserve any preceding (non-chunked) dimensions full_slice = (...,) + slices diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index 37f52854..038c99a0 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -161,34 +161,34 @@ def create_group(self, name: str, overwrite: bool = False) -> "ZarrGroup": @abstractmethod def create_array( - self, - name: str, - shape: Sequence[int], - dtype: DTypeLike, - *, - zarr_config: ZarrConfig = None, - **kwargs: Unpack[ZarrArrayConfig], + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrArray: """Create a new array within this group.""" ... @abstractmethod def create_array_from_base( - self, - name: str, - shape: Sequence[int], - data: ArrayLike = None, - **kwargs: Unpack[ZarrArrayConfig], + self, + name: str, + shape: Sequence[int], + data: ArrayLike = None, + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrArray: """Create a new array using metadata of an existing base-level array.""" ... def generate_pyramid( - self, - levels: int = -1, - ndim: int = 3, - mode: Literal["mean", "median"] = "median", - no_pyramid_axis: Optional[int] = None, + self, + levels: int = -1, + ndim: int = 3, + mode: Literal["mean", "median"] = "median", + no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ Generate the levels of a pyramid in an existing Zarr. @@ -234,18 +234,18 @@ def generate_pyramid( return all_shapes def write_ome_metadata( - self, - axes: List[str], - space_scale: Union[float, List[float]] = 1.0, - time_scale: float = 1.0, - space_unit: str = "micrometer", - time_unit: str = "second", - name: str = "", - pyramid_aligns: Union[str, int, List[str], List[int]] = 2, - levels: Optional[int] = None, - no_pool: Optional[int] = None, - multiscales_type: str = "", - ome_version: Literal["0.4", "0.5"] = "0.4", + self, + axes: List[str], + space_scale: Union[float, List[float]] = 1.0, + time_scale: float = 1.0, + space_unit: str = "micrometer", + time_unit: str = "second", + name: str = "", + pyramid_aligns: Union[str, int, List[str], List[int]] = 2, + levels: Optional[int] = None, + no_pool: Optional[int] = None, + multiscales_type: str = "", + ome_version: Literal["0.4", "0.5"] = "0.4", ) -> None: """ Write OME-compatible metadata into this group. @@ -285,18 +285,18 @@ def write_ome_metadata( None. """ niizarr.write_ome_metadata( - self._get_zarr_python_group(), - space_scale=space_scale, - time_scale=time_scale, - space_unit=space_unit, - time_unit=time_unit, - axes=axes, - name=name, - pyramid_aligns=pyramid_aligns, - levels=levels, - no_pool=no_pool, - multiscales_type=multiscales_type, - ome_version=ome_version, + self._get_zarr_python_group(), + space_scale=space_scale, + time_scale=time_scale, + space_unit=space_unit, + time_unit=time_unit, + axes=axes, + name=name, + pyramid_aligns=pyramid_aligns, + levels=levels, + no_pool=no_pool, + multiscales_type=multiscales_type, + ome_version=ome_version, ) def write_nifti_header(self, header: NiftiHeaderLike) -> None: diff --git a/linc_convert/utils/logging.py b/linc_convert/utils/logging.py index dad0af2c..b17784e7 100644 --- a/linc_convert/utils/logging.py +++ b/linc_convert/utils/logging.py @@ -9,8 +9,8 @@ def setup_logging() -> None: """Set up the logging configuration for the application.""" logging.basicConfig( - level=logging.INFO, - format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + level=logging.INFO, + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) logging.captureWarnings(True) @@ -20,7 +20,7 @@ def add_file_handler(log_file_path: str | PathLike[str] = None) -> None: file_handler = logging.FileHandler(log_file_path) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( - "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) diff --git a/linc_convert/utils/orientation.py b/linc_convert/utils/orientation.py index d5840d8d..0d26bde2 100644 --- a/linc_convert/utils/orientation.py +++ b/linc_convert/utils/orientation.py @@ -33,7 +33,7 @@ def orientation_ensure_3d(orientation: str) -> str: def orientation_to_affine( - orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 + orientation: str, vxw: float = 1, vxh: float = 1, vxd: float = 1 ) -> np.ndarray: """ Build an affine matrix from an orientation string and voxel size. diff --git a/tests/test_lsm_spool.py b/tests/test_lsm_spool.py index 32ece99c..53a606ff 100644 --- a/tests/test_lsm_spool.py +++ b/tests/test_lsm_spool.py @@ -26,11 +26,11 @@ def spool_dat(tmp_path): def write_zyla_spool_set( - image: np.ndarray, - spool_set_path: str, - *, - pixel_encoding: str = "Mono16", - images_per_file: int = None, + image: np.ndarray, + spool_set_path: str, + *, + pixel_encoding: str = "Mono16", + images_per_file: int = None, ): """ Given `image` of shape (numDepths, numColumns, numFrames), @@ -92,8 +92,7 @@ def write_zyla_spool_set( ImagesPerFile = {images_per_file} """ with open( - os.path.join(spool_set_path, "acquisitionmetadata.ini"), "w", - encoding="utf-8" + os.path.join(spool_set_path, "acquisitionmetadata.ini"), "w", encoding="utf-8" ) as f: f.write(ini) diff --git a/tests/test_oct_multi_slice.py b/tests/test_oct_multi_slice.py index 495c7b3b..cb59d1f9 100644 --- a/tests/test_oct_multi_slice.py +++ b/tests/test_oct_multi_slice.py @@ -32,18 +32,18 @@ def test_oct_multi_slice(tmp_path, multi_slice_mats, zarr_version, driver): expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver=driver, + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver=driver, ) assert_zarr_equal( - str(output), - zarr.storage.ZipStore(expected_zarr, mode="r"), + str(output), + zarr.storage.ZipStore(expected_zarr, mode="r"), ) @@ -52,13 +52,13 @@ def test_oct_multi_slice_regen_golden(tmp_path, multi_slice_mats, zarr_version): expected_zarr = f"data/oct_multi_slice_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "multi_slice.nii.zarr" multi_slice.convert( - multi_slice_mats, - out=str(output), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, - chunk=(64,), - driver="zarr-python", + multi_slice_mats, + out=str(output), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, + chunk=(64,), + driver="zarr-python", ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) @@ -72,16 +72,16 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, - out=str(output_zarr), - key="Psi_ObsLSQ", - zarr_version=2, - overwrite=True, - driver=driver, + files, + out=str(output_zarr), + key="Psi_ObsLSQ", + zarr_version=2, + overwrite=True, + driver=driver, ) assert_zarr_equal( - str(output_zarr), - zarr.storage.ZipStore(expected_zarr, mode="r"), + str(output_zarr), + zarr.storage.ZipStore(expected_zarr, mode="r"), ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) @@ -90,7 +90,7 @@ def test_oct_multi_slice_heavy(test_data_heavy_dir, tmp_path, zarr_version, driv @pytest.mark.golden @pytest.mark.heavy def test_oct_multi_slice_heavy_regen_golden( - test_data_heavy_dir, tmp_path, zarr_version + test_data_heavy_dir, tmp_path, zarr_version ): multi_slice_heavy_data_dir = test_data_heavy_dir / "sub-test_oct_multi_slice" expected_zarr = multi_slice_heavy_data_dir / f"zarr{zarr_version}.nii.zarr.zip" @@ -98,11 +98,11 @@ def test_oct_multi_slice_heavy_regen_golden( files.sort() output_zarr = tmp_path / "output.zarr" multi_slice.convert( - files, - out=str(output_zarr), - key="Psi_ObsLSQ", - zarr_version=zarr_version, - overwrite=True, + files, + out=str(output_zarr), + key="Psi_ObsLSQ", + zarr_version=zarr_version, + overwrite=True, ) base = expected_zarr.with_suffix("") shutil.make_archive(str(base), "zip", str(output_zarr)) diff --git a/tests/test_wk.py b/tests/test_wk.py index 18f16221..93c11d68 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -38,10 +38,10 @@ def test_wkw(tmp_path, wk_annotation, zarr_version, driver): expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "wkw.nii.zarr" webknossos_annotation.convert( - str(wk_annotation / "wkw"), - str(wk_annotation / "image.nii.zarr"), - out=output, - dic="{}", + str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), + out=output, + dic="{}", ) assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @@ -51,10 +51,10 @@ def test_wkw_regen_golden(tmp_path, wk_annotation, zarr_version): expected_zarr = f"data/wkw_zarr{zarr_version}.nii.zarr.zip" output = tmp_path / "wkw.nii.zarr" webknossos_annotation.convert( - str(wk_annotation / "wkw"), - str(wk_annotation / "image.nii.zarr"), - out=output, - dic="{}", + str(wk_annotation / "wkw"), + str(wk_annotation / "image.nii.zarr"), + out=output, + dic="{}", ) base = Path(expected_zarr).with_suffix("") shutil.make_archive(str(base), "zip", str(output)) diff --git a/tests/utils/sample_data.py b/tests/utils/sample_data.py index ae56f1d6..1e35a158 100644 --- a/tests/utils/sample_data.py +++ b/tests/utils/sample_data.py @@ -5,9 +5,9 @@ def sample_data_variation( - param: float, - image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None, + param: float, + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None, ) -> np.ndarray: """ Scale global intensity by (1+param), then wrap values modulo the output dtype range. @@ -50,10 +50,10 @@ def sample_data_variation( def generate_sample_data_variation( - n: int, - param_range: Tuple[float, float] = (-0.95, 0.95), - image: Optional[np.ndarray] = None, - output_dtype: Optional[np.dtype] = None, + n: int, + param_range: Tuple[float, float] = (-0.95, 0.95), + image: Optional[np.ndarray] = None, + output_dtype: Optional[np.dtype] = None, ) -> List[np.ndarray]: """ Generate `n` deterministic, wrapped‐intensity variations. From 54cb047754bf20766d95cd1c0ad0d8c211a8f73e Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 10:52:25 -0400 Subject: [PATCH 132/157] fix: wrong comment --- linc_convert/utils/io/zarr/drivers/zarr_python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index b90e06ad..f10b2c32 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -309,7 +309,7 @@ def _dimension_separator_to_chunk_key_encoding( SHARD_FILE_SIZE_LIMIT = ( 2 # compression ratio - * 2 # TB + * 2 # GB * 2 ** 30 # GB->Bytes ) From 26f3c84212710e4d3095a43f2d36cdbb00280856 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 11:20:39 -0400 Subject: [PATCH 133/157] feat: add setitem handling for zarrio --- linc_convert/utils/io/zarr/abc.py | 8 +- .../utils/io/zarr/drivers/tensorstore.py | 120 +++++++++--------- .../utils/io/zarr/drivers/zarr_python.py | 108 +++++++++------- 3 files changed, 128 insertions(+), 108 deletions(-) diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index 038c99a0..c08010ab 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -136,12 +136,16 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrGroup": ... @abstractmethod - def __getitem__(self, name: str) -> ZarrNode: + def __getitem__(self, key: str) -> ZarrNode: """Get a subgroup or array by name within this group.""" ... @abstractmethod - def __delitem__(self, name: str) -> None: + def __setitem__(self, key: str, value: ZarrNode) -> None: + """Set a subgroup or array by name within this group.""" + + @abstractmethod + def __delitem__(self, key: str) -> None: """Delete a subgroup or array by name within this group.""" ... diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 6a06218c..14a99191 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -92,11 +92,11 @@ def __setitem__(self, key: str, value: ArrayLike | Number) -> None: @classmethod def open( - cls, - path: Union[str, PathLike], - *, - zarr_version: Literal[2, 3] = 3, - mode: Literal["r", "r+", "a", "w", "w-"] = "a", + cls, + path: Union[str, PathLike], + *, + zarr_version: Literal[2, 3] = 3, + mode: Literal["r", "r+", "a", "w", "w-"] = "a", ) -> "ZarrTSArray": """ Open an existing TensorStore-based Zarr array. @@ -160,16 +160,16 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": ZarrTSGroup """ return cls.open( - zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version + zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version ) @classmethod def open( - cls, - path: Union[str, PathLike], - mode: Literal["r", "r+", "a", "w", "w-"] = "a", - *, - zarr_version: Literal[2, 3] = 3, + cls, + path: Union[str, PathLike], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + *, + zarr_version: Literal[2, 3] = 3, ) -> "ZarrTSGroup": """ Open or create a Zarr group backed by TensorStore. @@ -217,18 +217,24 @@ def zarr_version(self) -> Literal[2, 3]: """Get the Zarr format version.""" return self._zarr_version - def __getitem__(self, name: str) -> Union[ZarrTSArray, "ZarrTSGroup"]: + def __getitem__(self, key: str) -> Union[ZarrTSArray, "ZarrTSGroup"]: """Get a subgroup or array by name within this group.""" - meta = _detect_metadata(self._path / name) + meta = _detect_metadata(self._path / key) if not meta: - raise KeyError(f"Key '{name}' not found") + raise KeyError(f"Key '{key}' not found") if meta[0] == "group": - return ZarrTSGroup(self._path / name) - return ZarrTSArray.open(self._path / name, zarr_version=meta[1]) + return ZarrTSGroup(self._path / key) + return ZarrTSArray.open(self._path / key, zarr_version=meta[1]) - def __delitem__(self, name: str) -> None: + def __setitem__(self, key: str, value: Union[ZarrTSArray, "ZarrTSGroup"]) -> None: + """Set a subgroup or array by name within this group.""" + raise NotImplementedError( + "Assign to zarr group is not supported with tensorstore." + ) + + def __delitem__(self, key: str) -> None: """Delete a subgroup or array by name within this group.""" - target = self._path / name + target = self._path / key if target.exists(): target.rmdir(recursive=True) @@ -265,14 +271,14 @@ def create_group(self, name: str, overwrite: bool = False) -> "ZarrTSGroup": return self.open(self._path / name, mode=mode, zarr_version=self._zarr_version) def create_array( - self, - name: str, - shape: Sequence[int], - dtype: DTypeLike = np.int32, - *, - zarr_config: Optional[ZarrConfig] = None, - data: Optional[ArrayLike] = None, - **kwargs: Unpack[ZarrArrayConfig], + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike = np.int32, + *, + zarr_config: Optional[ZarrConfig] = None, + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrTSArray: """ Create a new array within this group. @@ -291,19 +297,19 @@ def create_array( """ if zarr_config is None: conf = default_write_config( - self._path / name, shape=shape, dtype=dtype, **kwargs + self._path / name, shape=shape, dtype=dtype, **kwargs ) else: conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - # TODO: implement this - # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), - version=zarr_config.zarr_version, + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # TODO: implement this + # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), + version=zarr_config.zarr_version, ) conf.update(delete_existing=True, create=True) arr = ts.open(conf).result() @@ -312,11 +318,11 @@ def create_array( return ZarrTSArray(arr) def create_array_from_base( - self, - name: str, - shape: Sequence[int], - data: Optional[ArrayLike] = None, - **kwargs: Unpack[ZarrArrayConfig], + self, + name: str, + shape: Sequence[int], + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrTSArray: """ Create a new array using metadata of an existing base-level array. @@ -385,10 +391,10 @@ def make_kvstore(path: str | os.PathLike) -> dict: def auto_shard_size( - max_shape: list[int], - itemsize: int | np.dtype | str, - max_file_size: int = 2 * 1024 ** 4, - compression_ratio: float = 2, + max_shape: list[int], + itemsize: int | np.dtype | str, + max_file_size: int = 2 * 1024 ** 4, + compression_ratio: float = 2, ) -> list[int]: """ Find maximal shard size that ensures file size below cap. @@ -439,9 +445,9 @@ def auto_shard_size( def fix_shard_chunk( - shard: list[int], - chunk: list[int], - shape: list[int], + shard: list[int], + chunk: list[int], + shape: list[int], ) -> tuple[list[int], list[int]]: """ Fix incompatibilities between chunk and shard size. @@ -562,14 +568,14 @@ def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: def default_write_config( - path: os.PathLike | str, - shape: list[int], - dtype: np.dtype | str, - chunk: list[int] = [32], - shard: list[int] | Literal["auto"] | None = None, - compressor: str = "blosc", - compressor_opt: dict | None = None, - version: int = 3, + path: os.PathLike | str, + shape: list[int], + dtype: np.dtype | str, + chunk: list[int] = [32], + shard: list[int] | Literal["auto"] | None = None, + compressor: str = "blosc", + compressor_opt: dict | None = None, + version: int = 3, ) -> dict: """ Generate a default TensorStore configuration. @@ -714,7 +720,7 @@ def _init_group(group_path: PathLike, version: int) -> None: group_path.mkdir(parents=True, exist_ok=True) if version == 3: (group_path / "zarr.json").write_text( - json.dumps({"zarr_format": 3, "node_type": "group"}) + json.dumps({"zarr_format": 3, "node_type": "group"}) ) else: (group_path / ".zgroup").write_text(json.dumps({"zarr_format": 2})) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index f10b2c32..10e8b79f 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -90,7 +90,7 @@ def __getattr__(self, name: str) -> Any: # noqa: ANN401 if hasattr(self._array, name): return getattr(self._array, name) raise AttributeError( - f"'{self.__class__.__name__}' object has no attribute '{name}'" + f"'{self.__class__.__name__}' object has no attribute '{name}'" ) @@ -115,12 +115,12 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": """Create a Zarr group from a configuration object.""" store = zarr.storage.LocalStore(zarr_config.out) return cls( - zarr.group( - store=store, - # TODO: figure out overwrite - # overwrite=overwrite, - zarr_format=zarr_config.zarr_version, - ) + zarr.group( + store=store, + # TODO: figure out overwrite + # overwrite=overwrite, + zarr_format=zarr_config.zarr_version, + ) ) @property @@ -137,11 +137,11 @@ def keys(self) -> Iterator[str]: """Get the names of all subgroups and arrays in this group.""" yield from self._zgroup.keys() - def __getitem__(self, name: str) -> Union[ZarrPythonArray, "ZarrPythonGroup"]: + def __getitem__(self, key: str) -> Union[ZarrPythonArray, "ZarrPythonGroup"]: """Get a subgroup or array by name within this group.""" - if name not in self._zgroup: - raise KeyError(f"Key '{name}' not found in group '{self.store_path}'") - item = self._zgroup[name] + if key not in self._zgroup: + raise KeyError(f"Key '{key}' not found in group '{self.store_path}'") + item = self._zgroup[key] if isinstance(item, zarr.Group): return ZarrPythonGroup(item) elif isinstance(item, zarr.Array): @@ -149,9 +149,20 @@ def __getitem__(self, name: str) -> Union[ZarrPythonArray, "ZarrPythonGroup"]: else: raise TypeError(f"Unsupported item type: {type(item)}") - def __delitem__(self, name: str) -> None: + def __setitem__( + self, key: str, value: Union[ZarrPythonArray, "ZarrPythonGroup"] + ) -> None: + """Set a subgroup or array by name within this group.""" + if isinstance(value, ZarrPythonGroup): + self._zgroup[key] = value._zgroup + elif isinstance(value, ZarrPythonArray): + self._zgroup[key] = value._array + else: + raise TypeError(f"Unsupported item type: {type(value)}") + + def __delitem__(self, key: str) -> None: """Delete a subgroup or array by name within this group.""" - del self._zgroup[name] + del self._zgroup[key] def __iter__(self) -> Iterator[str]: """Iterate over the names of all subgroups and arrays in this group.""" @@ -171,14 +182,14 @@ def create_group(self, name: str, overwrite: bool = False) -> "ZarrPythonGroup": return ZarrPythonGroup(subgroup) def create_array( - self, - name: str, - shape: Sequence[int], - dtype: DTypeLike, - *, - zarr_config: ZarrConfig = None, - data: Optional[ArrayLike] = None, - **kwargs: Unpack[ZarrArrayConfig], + self, + name: str, + shape: Sequence[int], + dtype: DTypeLike, + *, + zarr_config: ZarrConfig = None, + data: Optional[ArrayLike] = None, + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrPythonArray: """Create a new array within this group.""" if zarr_config is None: @@ -201,12 +212,12 @@ def create_array( "dtype": np.dtype(dtype).str, "fill_value": None, "compressors": _make_compressor( - compressor, zarr_config.zarr_version, **compressor_opt + compressor, zarr_config.zarr_version, **compressor_opt ), } chunk_key_encoding = _dimension_separator_to_chunk_key_encoding( - zarr_config.dimension_separator, zarr_config.zarr_version + zarr_config.dimension_separator, zarr_config.zarr_version ) if chunk_key_encoding: opt["chunk_key_encoding"] = chunk_key_encoding @@ -216,33 +227,33 @@ def create_array( return ZarrPythonArray(arr) def create_array_from_base( - self, - name: str, - shape: Sequence[int], - data: ArrayLike = None, - **kwargs: Unpack[ZarrConfig], + self, + name: str, + shape: Sequence[int], + data: ArrayLike = None, + **kwargs: Unpack[ZarrConfig], ) -> ZarrPythonArray: """Create a new array using the properties from a base_level object.""" base_level = self["0"] opts = dict( - dtype=base_level.dtype, - chunks=base_level.chunks, - shards=getattr(base_level, "shards", None), - filters=getattr(base_level._array, "filters", None), - compressors=getattr(base_level._array, "compressors", None), - fill_value=getattr(base_level._array, "fill_value", None), - order=getattr(base_level._array, "order", None), - attributes=getattr( - getattr(base_level._array, "metadata", None), "attributes", None - ), - overwrite=True, + dtype=base_level.dtype, + chunks=base_level.chunks, + shards=getattr(base_level, "shards", None), + filters=getattr(base_level._array, "filters", None), + compressors=getattr(base_level._array, "compressors", None), + fill_value=getattr(base_level._array, "fill_value", None), + order=getattr(base_level._array, "order", None), + attributes=getattr( + getattr(base_level._array, "metadata", None), "attributes", None + ), + overwrite=True, ) # Handle extra options based on metadata type meta = getattr(base_level, "metadata", None) if meta is not None: if hasattr(meta, "dimension_separator"): opts["chunk_key_encoding"] = _dimension_separator_to_chunk_key_encoding( - meta.dimension_separator, 2 + meta.dimension_separator, 2 ) if hasattr(meta, "chunk_key_encoding"): opts["chunk_key_encoding"] = getattr(meta, "chunk_key_encoding", None) @@ -260,7 +271,7 @@ def create_array_from_base( def _make_compressor( - name: str | None, zarr_version: Literal[2, 3], **prm: dict + name: str | None, zarr_version: Literal[2, 3], **prm: dict ) -> CompressorsLike: """Build compressor object from name and options.""" if not isinstance(name, str): @@ -292,7 +303,7 @@ def _make_compressor( def _dimension_separator_to_chunk_key_encoding( - dimension_separator: Literal[".", "/"], zarr_version: Literal[2, 3] + dimension_separator: Literal[".", "/"], zarr_version: Literal[2, 3] ) -> ChunkKeyEncodingLike: dimension_separator = dimension_separator if dimension_separator == "." and zarr_version == 2: @@ -301,21 +312,20 @@ def _dimension_separator_to_chunk_key_encoding( pass else: dimension_separator = ChunkKeyEncodingParams( - name="default" if zarr_version == 3 else "v2", - separator=dimension_separator + name="default" if zarr_version == 3 else "v2", separator=dimension_separator ) return dimension_separator SHARD_FILE_SIZE_LIMIT = ( - 2 # compression ratio - * 2 # GB - * 2 ** 30 # GB->Bytes + 2 # compression ratio + * 2 # GB + * 2 ** 30 # GB->Bytes ) def _compute_zarr_layout( - shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig + shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig ) -> tuple[tuple, tuple | None]: ndim = len(shape) if ndim == 5: @@ -398,7 +408,7 @@ def _compute_zarr_layout( if candidate * chunk_spatial[i] >= shape_spatial[i]: candidate = L[i] new_product = np.prod( - [candidate if j == i else M[j] for j in range(dims)] + [candidate if j == i else M[j] for j in range(dims)] ) if new_product <= B_multiplier and candidate > M[i]: M[i] = candidate From 05757416817992881687469fb8d5c32d693f32c8 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 11:21:06 -0400 Subject: [PATCH 134/157] style --- linc_convert/modalities/df/multi_slice.py | 40 +++++------ linc_convert/modalities/df/single_slice.py | 20 +++--- linc_convert/modalities/lsm/multi_slice.py | 50 +++++++------- linc_convert/modalities/lsm/spool.py | 66 +++++++++--------- linc_convert/modalities/psoct/multi_slice.py | 28 ++++---- .../modalities/psoct/single_volume.py | 22 +++--- .../modalities/wk/webknossos_annotation.py | 42 ++++++------ linc_convert/utils/io/_array_wrapper.py | 4 +- linc_convert/utils/io/generate_pyramid.py | 18 ++--- linc_convert/utils/io/spool.py | 17 +++-- linc_convert/utils/io/zarr/factory.py | 16 ++--- linc_convert/utils/unit.py | 68 +++++++++---------- linc_convert/utils/zarr_config.py | 9 ++- tests/utils/generate_trusted_result.py | 2 +- 14 files changed, 200 insertions(+), 202 deletions(-) diff --git a/linc_convert/modalities/df/multi_slice.py b/linc_convert/modalities/df/multi_slice.py index 6289792c..e047ea3d 100644 --- a/linc_convert/modalities/df/multi_slice.py +++ b/linc_convert/modalities/df/multi_slice.py @@ -36,13 +36,13 @@ @ms.default def convert( - inp: list[str], - *, - zarr_config: ZarrConfig = None, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - **kwargs: Unpack[ZarrConfig], + inp: list[str], + *, + zarr_config: ZarrConfig = None, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert JPEG2000 files generated by MBF-Neurolucida into a Zarr pyramid. @@ -127,14 +127,14 @@ def convert( subdat = WrappedJ2K(j2k, level=level) subdat_size = subdat.shape print( - "Convert level", - level, - "with shape", - shape, - "for slice", - idx, - "with size", - subdat_size, + "Convert level", + level, + "with shape", + shape, + "for slice", + idx, + "with size", + subdat_size, ) # offset while attaching @@ -143,7 +143,7 @@ def convert( for channel in range(3): if max_load is None or ( - subdat_size[-2] < max_load and subdat_size[-1] < max_load + subdat_size[-2] < max_load and subdat_size[-1] < max_load ): array[ channel, idx, x: x + subdat_size[-2], y: y + subdat_size[-1] @@ -183,10 +183,10 @@ def convert( if has_channel: axes.insert(0, "c") omz.write_ome_metadata( - axes=axes, - space_scale=[1.0] + list(get_pixelsize(j2k)), - multiscales_type="jpeg2000", - no_pool=0, + axes=axes, + space_scale=[1.0] + list(get_pixelsize(j2k)), + multiscales_type="jpeg2000", + no_pool=0, ) # Write NIfTI-Zarr header diff --git a/linc_convert/modalities/df/single_slice.py b/linc_convert/modalities/df/single_slice.py index bd1c8e7d..bde4c8bb 100644 --- a/linc_convert/modalities/df/single_slice.py +++ b/linc_convert/modalities/df/single_slice.py @@ -28,14 +28,14 @@ @ss.default def convert( - inp: str, - *, - zarr_config: ZarrConfig = None, - max_load: int = 16384, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - **kwargs: Unpack[ZarrConfig], + inp: str, + *, + zarr_config: ZarrConfig = None, + max_load: int = 16384, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a JPEG2000 file generated by MBF-Neurolucida into a Zarr pyramid. @@ -93,7 +93,7 @@ def convert( shape = subdat.shape print("Convert level", level, "with shape", shape) array = omz.create_array( - str(level), shape=shape, zarr_config=zarr_config, dtype=j2k.dtype + str(level), shape=shape, zarr_config=zarr_config, dtype=j2k.dtype ) if max_load is None or (shape[-2] < max_load and shape[-1] < max_load): @@ -119,7 +119,7 @@ def convert( print("Write metadata") axes = ["c", "y", "x"] if has_channel else ["y", "x"] omz.write_ome_metadata( - axes=axes, space_scale=get_pixelsize(j2k), multiscales_type="jpeg2000" + axes=axes, space_scale=get_pixelsize(j2k), multiscales_type="jpeg2000" ) if not zarr_config.nii: diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index d19b06d3..bb1d5aa0 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -29,16 +29,16 @@ @multi_slice.default def convert( - inp: str, - *, - zarr_config: ZarrConfig = None, - overlap: int = 30, - max_load: int = 512, - orientation: str = "coronal", - center: bool = True, - thickness: float | None = None, - voxel_size: list[float] = (1, 1, 1), - **kwargs: Unpack[ZarrConfig], + inp: str, + *, + zarr_config: ZarrConfig = None, + overlap: int = 30, + max_load: int = 512, + orientation: str = "coronal", + center: bool = True, + thickness: float | None = None, + voxel_size: list[float] = (1, 1, 1), + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of tiff files generated by the LSM pipeline into a Zarr. @@ -94,11 +94,11 @@ def convert( max_load += 1 CHUNK_PATTERN = re.compile( - r"^(?P\w*)" - r"_y(?P[0-9]+)" - r"_z(?P[0-9]+)" - r"(" - r"?P\w*)$" + r"^(?P\w*)" + r"_y(?P[0-9]+)" + r"_z(?P[0-9]+)" + r"(" + r"?P\w*)$" ) all_chunks_filenames = list(sorted(glob(os.path.join(inp, "*_y*_z*.tiff")))) @@ -107,7 +107,7 @@ def convert( # parse all directory names for filename in all_chunks_filenames: parsed = CHUNK_PATTERN.fullmatch( - os.path.splitext(os.path.basename(filename))[0] + os.path.splitext(os.path.basename(filename))[0] ) all_chunks_info["filename"].append(filename) all_chunks_info["prefix"].append(parsed.group("prefix")) @@ -117,7 +117,7 @@ def convert( # default output name zarr_config.set_default_name( - all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] + all_chunks_info["prefix"][0] + all_chunks_info["suffix"][0] ) # parse all individual file names @@ -130,8 +130,8 @@ def convert( for ychunk in range(nchunky): for i in range(len(all_chunks_info["filename"])): if ( - all_chunks_info["z"][i] == zchunk + 1 - and all_chunks_info["y"][i] == ychunk + 1 + all_chunks_info["z"][i] == zchunk + 1 + and all_chunks_info["y"][i] == ychunk + 1 ): break filename = all_chunks_info["filename"][i] @@ -153,8 +153,8 @@ def convert( fullshape = [0, 0, 0] fullshape[0] = sum(shape[0][0] for shape in allshapes) fullshape[1] = ( - sum(shape[1] for shape in allshapes[0]) - - (len(set(all_chunks_info["y"])) - 1) * overlap + sum(shape[1] for shape in allshapes[0]) + - (len(set(all_chunks_info["y"])) - 1) * overlap ) fullshape[2] = allshapes[0][0][2] @@ -164,7 +164,7 @@ def convert( # write first level array = omz.create_array( - "0", shape=fullshape, dtype=np.dtype(dtype).str, zarr_config=zarr_config + "0", shape=fullshape, dtype=np.dtype(dtype).str, zarr_config=zarr_config ) print("Write level 0 with shape", fullshape) @@ -187,9 +187,9 @@ def convert( if chunky != 0: ystart += overlap // 2 print( - f"Write plane " - f"( {zstart} :{zstart + len(pages)}, {ystart}:{ystart + dat.shape[1]})", - end="\r", + f"Write plane " + f"( {zstart} :{zstart + len(pages)}, {ystart}:{ystart + dat.shape[1]})", + end="\r", ) slicer = ( slice(zstart, zstart + len(pages)), diff --git a/linc_convert/modalities/lsm/spool.py b/linc_convert/modalities/lsm/spool.py index 522f93f3..ee917e03 100644 --- a/linc_convert/modalities/lsm/spool.py +++ b/linc_convert/modalities/lsm/spool.py @@ -33,14 +33,14 @@ @spool.default def convert( - inp: str, - *, - overlap: int = 192, - orientation: str = "coronal", - center: bool = True, - voxel_size: list[float] = (1, 1, 1), - zarr_config: ZarrConfig | None = None, - **kwargs: Unpack[ZarrConfig], + inp: str, + *, + overlap: int = 192, + orientation: str = "coronal", + center: bool = True, + voxel_size: list[float] = (1, 1, 1), + zarr_config: ZarrConfig | None = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert a collection of spool files generated by the LSM pipeline into Zarr. @@ -90,12 +90,12 @@ def convert( zarr_config = update_default_config(zarr_config, **kwargs) CHUNK_PATTERN = re.compile( - r"^(?P\w*)" - r"_run(?P[0-9]+)" - r"_?" - r"_y(?P[0-9]+)" - r"_z(?P[0-9]+)" - r"(?P\w*)$" + r"^(?P\w*)" + r"_run(?P[0-9]+)" + r"_?" + r"_y(?P[0-9]+)" + r"_z(?P[0-9]+)" + r"(?P\w*)$" ) all_tiles_folders_names = sorted(glob(os.path.join(inp, "*_y*_z*_HR/"))) @@ -105,26 +105,26 @@ def convert( all_tiles_info = [] tiles_info_by_index = {} TileInfo = namedtuple( - "TileInfo", ["prefix", "run", "y", "z", "suffix", "filename", "reader"] + "TileInfo", ["prefix", "run", "y", "z", "suffix", "filename", "reader"] ) for tile_folder_name in all_tiles_folders_names: tile_folder_name = tile_folder_name.rstrip("/") parsed = CHUNK_PATTERN.fullmatch(os.path.basename(tile_folder_name)) tile = TileInfo( - parsed.group("prefix"), - int(parsed.group("run")), - int(parsed.group("y")), - int(parsed.group("z")), - parsed.group("suffix"), - tile_folder_name, - SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat"), + parsed.group("prefix"), + int(parsed.group("run")), + int(parsed.group("y")), + int(parsed.group("z")), + parsed.group("suffix"), + tile_folder_name, + SpoolSetInterpreter(tile_folder_name, tile_folder_name + "_info.mat"), ) all_tiles_info.append(tile) # Check for duplicate tiles if (tile.y, tile.z) in tiles_info_by_index: raise ValueError( - f"Duplicate tile, file {tile.filename} conflicts with " - f"{tiles_info_by_index[(tile.y, tile.z)].filename}" + f"Duplicate tile, file {tile.filename} conflicts with " + f"{tiles_info_by_index[(tile.y, tile.z)].filename}" ) tiles_info_by_index[(tile.y, tile.z)] = tile @@ -174,7 +174,7 @@ def convert( if diff_sx.any(): y_idxs, z_idxs = np.where(diff_sx) raise ValueError( - f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}" + f"Inconsistent x shapes at indices: {list(zip(y_idxs, z_idxs))}" ) for y_tile in range(min_y_tile, max_y_tile + 1): if y_tile not in expected_sy: @@ -183,7 +183,7 @@ def convert( if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sy) raise ValueError( - f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}" + f"Inconsistent y shapes at tiles: {list(zip(y_idxs, z_idxs))}" ) for z_tile in range(min_z_tile, max_z_tile + 1): if z_tile not in expected_sz: @@ -192,7 +192,7 @@ def convert( if diff_sy.any(): y_idxs, z_idxs = np.where(diff_sz) raise ValueError( - f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}" + f"Inconsistent z shapes at tiles: {list(zip(y_idxs, z_idxs))}" ) # Calculate full dataset dimensions @@ -222,16 +222,16 @@ def convert( if tile_info.y != max_y_tile: dat = dat[:, : -overlap // 2 - (overlap % 2), :] ystart = sum( - expected_sy[min_y_tile + y_idx] - overlap for y_idx in range(rel_y) + expected_sy[min_y_tile + y_idx] - overlap for y_idx in range(rel_y) ) zstart = sum(expected_sz[min_z_tile + z_idx] for z_idx in range(rel_z)) if rel_y != 0: ystart += overlap // 2 print( - f"Write plane " - f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:" - f"{ystart + dat.shape[1]})", - end="\r", + f"Write plane " + f"( {zstart} :{zstart + dat.shape[0]}, {ystart}:" + f"{ystart + dat.shape[1]})", + end="\r", ) slicer = ( slice(zstart, zstart + dat.shape[0]), @@ -252,7 +252,7 @@ def convert( # TODO: header has some problem with unit when deal with zarr 2, furthur # debugging needed header = default_nifti_header( - omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None) + omz["0"], omz.attrs.get("ome", omz.attrs).get("multiscales", None) ) shape = list(reversed(omz["0"].shape)) shape = shape[:3] + [1] + shape[3:] # insert time dimension diff --git a/linc_convert/modalities/psoct/multi_slice.py b/linc_convert/modalities/psoct/multi_slice.py index 0c22ccf0..49556bcc 100644 --- a/linc_convert/modalities/psoct/multi_slice.py +++ b/linc_convert/modalities/psoct/multi_slice.py @@ -64,15 +64,15 @@ def make_wrapper(fname: str) -> _ArrayWrapper: @multi_slice.default @_automap def convert( - inp: list[str], - *, - key: Optional[str] = None, - meta: str = None, - orientation: str = "RAS", - center: bool = True, - dtype: Optional[str] = None, - zarr_config: ZarrConfig = None, - **kwargs: Unpack[ZarrConfig], + inp: list[str], + *, + key: Optional[str] = None, + meta: str = None, + orientation: str = "RAS", + center: bool = True, + dtype: Optional[str] = None, + zarr_config: ZarrConfig = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Matlab to OME-Zarr. @@ -135,7 +135,7 @@ def convert( nslices = len(inp) dataset = zgroup.create_array( - "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype) + "0", shape=volume_shape, zarr_config=zarr_config, dtype=np.dtype(dtype) ) # Process and store data in chunks @@ -147,9 +147,9 @@ def convert( j * chunk_size[1]: (j + 1) * chunk_size[1], ] logger.info( - f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: " - f"{k + 1:03d}] " - f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" + f"Processing slice {i + 1:03d} chunk [y: {j + 1:03d}, z: " + f"{k + 1:03d}] " + f"of [{nslices:03d}, {ny:03d}, {nz:03d}]" ) z_start = k * chunk_size[0] z_end = z_start + loaded_chunk.shape[-2] @@ -174,7 +174,7 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] header = default_nifti_header( - arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") + arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) diff --git a/linc_convert/modalities/psoct/single_volume.py b/linc_convert/modalities/psoct/single_volume.py index 9195462b..0cf51a10 100644 --- a/linc_convert/modalities/psoct/single_volume.py +++ b/linc_convert/modalities/psoct/single_volume.py @@ -65,14 +65,14 @@ def make_wrapper(fname: str) -> _ArrayWrapper: @single_volume.default @_automap def convert( - inp: str, - *, - key: Optional[str] = None, - meta: str = None, - orientation: str = "RAS", - center: bool = True, - zarr_config: ZarrConfig = None, - **kwargs: Unpack[ZarrConfig], + inp: str, + *, + key: Optional[str] = None, + meta: str = None, + orientation: str = "RAS", + center: bool = True, + zarr_config: ZarrConfig = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Matlab to OME-Zarr. @@ -136,12 +136,12 @@ def convert( inp_chunk = [min(x, zarr_config.max_load) for x in inp.shape] dataset = zgroup.create_array( - "0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype) + "0", shape=inp.shape, zarr_config=zarr_config, dtype=np.dtype(inp.dtype) ) for idx, slc in chunk_slice_generator(inp.shape, inp_chunk): logger.info( - f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] + f"Processing chunk {idx} of " # [{nx:03d}, {ny:03d}, {nz:03d}] ) loaded_chunk = inp[slc] dataset[slc] = loaded_chunk @@ -157,7 +157,7 @@ def convert( # Write NIfTI-Zarr header arr = zgroup["0"] header = default_nifti_header( - arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") + arr, zgroup.attrs.get("ome", zgroup.attrs).get("multiscales") ) reversed_shape = list(reversed(arr.shape)) affine = orientation_to_affine(orientation, *vx[::-1]) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index aa5b5f9d..b78b012a 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -24,12 +24,12 @@ @webknossos.default def convert( - wkw_dir: str = None, - ome_dir: str = None, - dic: str = None, - *, - zarr_config: ZarrConfig = None, - **kwargs: Unpack[ZarrConfig], + wkw_dir: str = None, + ome_dir: str = None, + dic: str = None, + *, + zarr_config: ZarrConfig = None, + **kwargs: Unpack[ZarrConfig], ) -> None: """ Convert annotations (in .wkw format) from webknossos to ome.zarr format. @@ -82,7 +82,7 @@ def convert( for idx in range(n): offset_x, offset_y = 0, 0 data = wkw_dataset.read( - off=(offset_y, offset_x, idx), shape=[size[1], size[0], 1] + off=(offset_y, offset_x, idx), shape=[size[1], size[0], 1] ) data = data[0, :, :, 0] data = np.transpose(data, (1, 0)) @@ -107,7 +107,7 @@ def convert( wkw_dataset = wkw.Dataset.open(wkw_dataset_path) omz.create_array( - f"{level}", shape=shape, dtype="uint8", zarr_config=zarr_config + f"{level}", shape=shape, dtype="uint8", zarr_config=zarr_config ) array = omz[f"{level}"] @@ -127,25 +127,25 @@ def convert( data = np.transpose(data, (1, 0)) if dic: data = np.array( - [ - [dic[data[i][j]] for j in range(data.shape[1])] - for i in range(data.shape[0]) - ] + [ + [dic[data[i][j]] for j in range(data.shape[1])] + for i in range(data.shape[0]) + ] ) subdat_size = data.shape print( - "Convert level", - level, - "with shape", - shape, - "and slice", - idx, - "with size", - subdat_size, + "Convert level", + level, + "with shape", + shape, + "and slice", + idx, + "with size", + subdat_size, ) if max_load is None or ( - subdat_size[-2] < max_load and subdat_size[-1] < max_load + subdat_size[-2] < max_load and subdat_size[-1] < max_load ): array[ 0, idx, top: top + subdat_size[-2], left: left + subdat_size[-1] diff --git a/linc_convert/utils/io/_array_wrapper.py b/linc_convert/utils/io/_array_wrapper.py index a751b8d7..45602393 100644 --- a/linc_convert/utils/io/_array_wrapper.py +++ b/linc_convert/utils/io/_array_wrapper.py @@ -18,8 +18,8 @@ def _get_key(self, f: Mapping) -> str: break if len(f.keys()) > 1: warn( - f"More than one key in .mat file {self.file}, " - f'arbitrarily loading "{key}"' + f"More than one key in .mat file {self.file}, " + f'arbitrarily loading "{key}"' ) if key not in f.keys(): diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/generate_pyramid.py index c9719745..fa57b853 100644 --- a/linc_convert/utils/io/generate_pyramid.py +++ b/linc_convert/utils/io/generate_pyramid.py @@ -10,7 +10,7 @@ def default_levels( - spatial_shape: tuple, spatial_chunk: tuple, no_pyramid_axis: Optional[int] + spatial_shape: tuple, spatial_chunk: tuple, no_pyramid_axis: Optional[int] ) -> int: """ Compute the default number of downsampling levels for a spatial pyramid. @@ -37,16 +37,16 @@ def default_levels( axes by repeated factors of two. """ default_levels = max( - int(math.ceil(math.log2(s / spatial_chunk[i]))) - for i, s in enumerate(spatial_shape) - if no_pyramid_axis is None or i != no_pyramid_axis + int(math.ceil(math.log2(s / spatial_chunk[i]))) + for i, s in enumerate(spatial_shape) + if no_pyramid_axis is None or i != no_pyramid_axis ) levels = max(default_levels, 0) return levels def next_level_shape( - prev_shape: Sequence[int], no_pyramid_axis: Optional[int] + prev_shape: Sequence[int], no_pyramid_axis: Optional[int] ) -> list[int]: """ Compute the shape of the next coarser level by halving each dimension. @@ -79,10 +79,10 @@ def next_level_shape( def compute_next_level( - arr: da.Array, - ndim: int, - no_pyramid_axis: int | None = None, - window_func: Callable = da.mean, + arr: da.Array, + ndim: int, + no_pyramid_axis: int | None = None, + window_func: Callable = da.mean, ) -> da.Array: """ Compute the next level of a dask array pyramid. diff --git a/linc_convert/utils/io/spool.py b/linc_convert/utils/io/spool.py index eccc3387..2cd1cb74 100644 --- a/linc_convert/utils/io/spool.py +++ b/linc_convert/utils/io/spool.py @@ -34,12 +34,11 @@ class SpoolSetInterpreter: """ def __init__( - self, spool_set_path: str | PathLike[str], - info_file: str | PathLike[str] = None + self, spool_set_path: str | PathLike[str], info_file: str | PathLike[str] = None ) -> None: if ( - os.path.isfile(spool_set_path) - and os.path.splitext(spool_set_path)[-1] == ".zip" + os.path.isfile(spool_set_path) + and os.path.splitext(spool_set_path)[-1] == ".zip" ): raise NotImplementedError("Zip storage is not supported.") pass @@ -80,7 +79,7 @@ def _load_info_file(self, info_file: str | PathLike[str]) -> None: except (KeyError, IndexError, ValueError) as e: warnings.warn( - f"ERROR: Unable to extract frame information from info file. {e}" + f"ERROR: Unable to extract frame information from info file. {e}" ) return None num_frames_per_spool = int(self.config["multiimage"]["ImagesPerFile"]) @@ -89,7 +88,7 @@ def _load_info_file(self, info_file: str | PathLike[str]) -> None: self.spool_files = self.spool_files[:num_spool_files_to_load] def _make_filename_from_spool_set( - self, spool_entry: str | PathLike[str] + self, spool_entry: str | PathLike[str] ) -> PathLike[str]: return os.path.join(self.parent, spool_entry) @@ -142,7 +141,7 @@ def _extract_config_values(self) -> None: self.acquisition_metadata["nbytes"] = self.spool_nbytes self.acquisition_metadata["images"] = self.config.getint( - "multiimage", "ImagesPerFile" + "multiimage", "ImagesPerFile" ) numDepths = self.acquisition_metadata["height"] @@ -151,7 +150,7 @@ def _extract_config_values(self) -> None: numFramesPerSpool = self.acquisition_metadata["images"] if ( - numDepths % 2 + numDepths % 2 ): # if there is an odd number of rows -> KPEDIT - odd rows means 1 less # column for some reason numRows = numDepths + 1 @@ -253,7 +252,7 @@ def assemble(self) -> np.ndarray: """ axis_0_shape = self.spool_shape[0] canvas = np.zeros( - (axis_0_shape * len(self), *self.spool_shape[1:]), dtype=self.dtype + (axis_0_shape * len(self), *self.spool_shape[1:]), dtype=self.dtype ) for idx, spool_file in enumerate(self): start = idx * axis_0_shape diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index a2dea2f2..3be36bf9 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -25,10 +25,10 @@ def open( - path: str | PathLike[str], - mode: Literal["r", "r+", "a", "w", "w-"] = "a", - zarr_version: Literal[2, 3] = 3, - driver: DriverLike = "zarr-python", + path: str | PathLike[str], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + zarr_version: Literal[2, 3] = 3, + driver: DriverLike = "zarr-python", ) -> ZarrNode: """ Open a Zarr Node (Array or Group) based on the specified driver. @@ -53,10 +53,10 @@ def open( def open_group( - path: str | PathLike[str], - mode: Literal["r", "r+", "a", "w", "w-"] = "a", - zarr_version: Literal[2, 3] = 3, - driver: DriverLike = "zarr-python", + path: str | PathLike[str], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + zarr_version: Literal[2, 3] = 3, + driver: DriverLike = "zarr-python", ) -> ZarrGroup: """ Open a Zarr Group based on the specified driver. diff --git a/linc_convert/utils/unit.py b/linc_convert/utils/unit.py index 11972825..806201a4 100644 --- a/linc_convert/utils/unit.py +++ b/linc_convert/utils/unit.py @@ -138,17 +138,17 @@ short + "m": long + "meter" for short, long in si_prefix_short2long.items() } unit_space_short2long.update( - { - "m": "meter", - "mi": "mile", - "yd": "yard", - "ft": "foot", - "in": "inch", - "'": "foot", - '"': "inch", - "Å": "angstrom", - "pc": "parsec", - } + { + "m": "meter", + "mi": "mile", + "yd": "yard", + "ft": "foot", + "in": "inch", + "'": "foot", + '"': "inch", + "Å": "angstrom", + "pc": "parsec", + } ) unit_space_long2short = {long: short for short, long in unit_space_short2long.items()} unit_space_long2short["micron"] = "u" @@ -157,13 +157,13 @@ short + "s": long + "second" for short, long in si_prefix_short2long.items() } unit_time_short2long.update( - { - "y": "year", - "d": "day", - "h": "hour", - "m": "minute", - "s": "second", - } + { + "y": "year", + "d": "day", + "h": "hour", + "m": "minute", + "s": "second", + } ) unit_time_long2short = {long: short for short, long in unit_time_short2long.items()} @@ -171,28 +171,28 @@ prefix + "m": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() } unit_space_scale.update( - { - "mi": 1609.344, - "yd": 0.9144, - "ft": 0.3048, - "'": 0.3048, - "in": 25.4e-3, - '"': 25.4e-3, - "Å": 1e-10, - "pc": 3.0857e16, - } + { + "mi": 1609.344, + "yd": 0.9144, + "ft": 0.3048, + "'": 0.3048, + "in": 25.4e-3, + '"': 25.4e-3, + "Å": 1e-10, + "pc": 3.0857e16, + } ) unit_time_scale = { prefix + "s": 10 ** exponent for prefix, exponent in si_prefix_exponent.items() } unit_time_scale.update( - { - "y": 365.25 * 24 * 60 * 60, - "d": 24 * 60 * 60, - "h": 60 * 60, - "m": 60, - } + { + "y": 365.25 * 24 * 60 * 60, + "d": 24 * 60 * 60, + "h": 60 * 60, + "m": 60, + } ) diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 4dabcca3..67558647 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -141,18 +141,17 @@ def set_default_name(self, name: str) -> None: self.out += ".nii.zarr" if self.nii else ".ome.zarr" if os.path.exists(self.out) and not self.overwrite: answer = input( - f"The output path '{self.out}' already exists. Do you want to " - f"overwrite it? (y/n): " + f"The output path '{self.out}' already exists. Do you want to " + f"overwrite it? (y/n): " ) if answer.lower() not in ("y", "yes"): raise FileExistsError( - f"Output path '{self.out}' exists and overwrite was not " - f"confirmed." + f"Output path '{self.out}' exists and overwrite was not confirmed." ) def update_default_config( - zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] + zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] ) -> ZarrConfig: """ Merge user overrides into an existing ZarrConfig or create a new one. diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py index 1037673d..440b6efd 100644 --- a/tests/utils/generate_trusted_result.py +++ b/tests/utils/generate_trusted_result.py @@ -2,9 +2,9 @@ import tempfile from pathlib import Path +import test_wk import zarr -import test_wk from linc_convert.modalities.wk import webknossos_annotation if __name__ == "__main__": From 768b26ac0a5d44f4f843bbb5dfb0a51a84016a38 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:37:40 -0400 Subject: [PATCH 135/157] fix: ensure string --- tests/test_wk.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wk.py b/tests/test_wk.py index 93c11d68..762ec7da 100644 --- a/tests/test_wk.py +++ b/tests/test_wk.py @@ -40,7 +40,7 @@ def test_wkw(tmp_path, wk_annotation, zarr_version, driver): webknossos_annotation.convert( str(wk_annotation / "wkw"), str(wk_annotation / "image.nii.zarr"), - out=output, + out=str(output), dic="{}", ) assert_zarr_equal(str(output), zarr.storage.ZipStore(expected_zarr, mode="r")) @@ -53,7 +53,7 @@ def test_wkw_regen_golden(tmp_path, wk_annotation, zarr_version): webknossos_annotation.convert( str(wk_annotation / "wkw"), str(wk_annotation / "image.nii.zarr"), - out=output, + out=str(output), dic="{}", ) base = Path(expected_zarr).with_suffix("") From 89636328aa35bb6c8fce510274fd4f1975fd4911 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:39:26 -0400 Subject: [PATCH 136/157] fix: make sure out is string --- linc_convert/utils/io/zarr/drivers/zarr_python.py | 3 +-- linc_convert/utils/zarr_config.py | 10 ---------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 10e8b79f..7990b363 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -117,8 +117,7 @@ def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": return cls( zarr.group( store=store, - # TODO: figure out overwrite - # overwrite=overwrite, + overwrite=zarr_config.overwrite, zarr_format=zarr_config.zarr_version, ) ) diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 67558647..033a7b6c 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -139,16 +139,6 @@ def set_default_name(self, name: str) -> None: return self.out = name self.out += ".nii.zarr" if self.nii else ".ome.zarr" - if os.path.exists(self.out) and not self.overwrite: - answer = input( - f"The output path '{self.out}' already exists. Do you want to " - f"overwrite it? (y/n): " - ) - if answer.lower() not in ("y", "yes"): - raise FileExistsError( - f"Output path '{self.out}' exists and overwrite was not confirmed." - ) - def update_default_config( zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] From 44b8ceecbb3f3fedc82110e1b20f07b70959b9ce Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:39:43 -0400 Subject: [PATCH 137/157] feat: fsspec support --- linc_convert/utils/io/zarr/drivers/zarr_python.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 7990b363..9811be4a 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -113,7 +113,11 @@ def __init__(self, zarr_group: zarr.Group) -> None: @classmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": """Create a Zarr group from a configuration object.""" - store = zarr.storage.LocalStore(zarr_config.out) + + if zarr_config.out.startswith("/") or zarr_config.out.startswith("\\"): + store = zarr.storage.LocalStore(zarr_config.out) + else: + store = zarr.storage.FsspecStore(zarr_config.out) return cls( zarr.group( store=store, From 4d5748dda1467c1b77ad3300c47b2a8d6851ccfd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:45:08 -0400 Subject: [PATCH 138/157] docs --- tests/utils/compare_file.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/utils/compare_file.py b/tests/utils/compare_file.py index 7adc63ee..89e1e334 100644 --- a/tests/utils/compare_file.py +++ b/tests/utils/compare_file.py @@ -112,7 +112,8 @@ def assert_zarr_equal( A filesystem path (str) or a Zarr store/mapping pointing to the first group. store2 : StoreLike A filesystem path (str) or a Zarr store/mapping pointing to the second group. - + ignore_nii: Bool + Ignore Nifti header in the zarr group Returns ------- None From 3a53075517a733b582dc8fb3f87a861bbe98547b Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:52:10 -0400 Subject: [PATCH 139/157] feat: use mean for default pyramid generation. support passing function --- linc_convert/utils/io/zarr/abc.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index c08010ab..cac16680 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -6,6 +6,7 @@ from os import PathLike from typing import ( Any, + Callable, List, Literal, Mapping, @@ -191,7 +192,7 @@ def generate_pyramid( self, levels: int = -1, ndim: int = 3, - mode: Literal["mean", "median"] = "median", + mode: Literal["mean", "median"] | Callable = "mean", no_pyramid_axis: Optional[int] = None, ) -> list[list[int]]: """ @@ -205,7 +206,7 @@ def generate_pyramid( ndim : int Number of spatial dimensions. mode : {"mean", "median"} - Use mean or median downsampling. + Function to be used for down-sampling, either a callable or mean or median. no_pyramid_axis : int | None Axis to leave unsampled. @@ -219,7 +220,13 @@ def generate_pyramid( batch_shape, spatial_shape = base.shape[:-ndim], base.shape[-ndim:] all_shapes = [spatial_shape] chunk_size = base.chunks[-ndim:] - window = {"median": da.median, "mean": da.mean}[mode] + if isinstance(mode, Callable): + window = mode + else: + window_func = {"median": da.median, "mean": da.mean} + if mode not in window_func: + raise ValueError(f"Unsupported mode: {mode}") + window = [mode] if levels == -1: levels = default_levels(spatial_shape, chunk_size, no_pyramid_axis) From 07184261b871906fc03c4d57d3bd53aa7024abb9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 4 Aug 2025 14:54:47 -0400 Subject: [PATCH 140/157] fix: use mean for pyramid generation --- linc_convert/modalities/lsm/mosaic.py | 2 +- linc_convert/modalities/lsm/multi_slice.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/linc_convert/modalities/lsm/mosaic.py b/linc_convert/modalities/lsm/mosaic.py index f72c87d9..7dd62ee9 100644 --- a/linc_convert/modalities/lsm/mosaic.py +++ b/linc_convert/modalities/lsm/mosaic.py @@ -211,7 +211,7 @@ def convert( f = TiffFile(fname) arr[slicer] = f.asarray() print("") - omz.generate_pyramid(mode="median") + omz.generate_pyramid(mode="mean") # Write OME-Zarr multiscale metadata print("Write metadata") diff --git a/linc_convert/modalities/lsm/multi_slice.py b/linc_convert/modalities/lsm/multi_slice.py index bb1d5aa0..f81bb8c1 100644 --- a/linc_convert/modalities/lsm/multi_slice.py +++ b/linc_convert/modalities/lsm/multi_slice.py @@ -198,7 +198,7 @@ def convert( ) array[slicer] = dat print("") - omz.generate_pyramid(mode="median") + omz.generate_pyramid(mode="mean") print("") # Write OME-Zarr multiscale metadata From 2b0ac6b07cef87bb570a7d11803712ba3c94a448 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 5 Aug 2025 13:00:43 -0400 Subject: [PATCH 141/157] fix: wrong element used --- linc_convert/utils/io/zarr/abc.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index cac16680..f7ae3bee 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -226,7 +226,8 @@ def generate_pyramid( window_func = {"median": da.median, "mean": da.mean} if mode not in window_func: raise ValueError(f"Unsupported mode: {mode}") - window = [mode] + window = window_func[mode] + if levels == -1: levels = default_levels(spatial_shape, chunk_size, no_pyramid_axis) @@ -263,8 +264,6 @@ def write_ome_metadata( Parameters ---------- - omz : zarr.Group - Zarr group to write metadata axes : list[str] Name of each dimension, in Zarr order (t, c, z, y, x) space_scale : float | list[float] @@ -274,7 +273,7 @@ def write_ome_metadata( space_unit : str Unit of spatial scale (assumed identical across dimensions) time_unit : str - Unit of time scale + Unit of timescale name : str Name attribute pyramid_aligns : float | list[float] | {"center", "edge"} @@ -284,7 +283,7 @@ def write_ome_metadata( levels : int Number of existing levels. Default: find out automatically. no_pool: int - Index of the spatial dimension that was not downsampled + Index of the spatial dimension that was not down-sampled when generating pyramid levels. multiscales_type: str Override the type field in multiscale attribute. From c58116cbc628dc977cc0a1e0243819cfd682e620 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 12:16:00 -0400 Subject: [PATCH 142/157] BREAKING CHANGE: use zarr-python to manage zarr group in ZarrTSGroup --- .../utils/io/zarr/drivers/tensorstore.py | 197 ++++-------------- 1 file changed, 44 insertions(+), 153 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 14a99191..68831c15 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -7,7 +7,6 @@ from os import PathLike from typing import ( Any, - Iterator, Literal, Mapping, Optional, @@ -24,7 +23,8 @@ from numpy.typing import ArrayLike, DTypeLike from upath import UPath -from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup +from linc_convert.utils.io.zarr import ZarrPythonArray, ZarrPythonGroup +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig from linc_convert.utils.zarr_config import ZarrConfig @@ -43,6 +43,11 @@ def __init__(self, ts_array: ts.TensorStore) -> None: super().__init__(str(ts_array.kvstore.path)) self._ts = ts_array + @classmethod + def from_zarr_python_array(cls, zarray: ZarrPythonArray) -> "ZarrTSArray": + """Convert a ZarrPythonArray into a ZarrTSArray.""" + return cls.open(zarray.store_path, zarr_version=zarray.zarr_version) + @property def ndim(self) -> int: """Number of dimensions of the array.""" @@ -95,11 +100,11 @@ def open( cls, path: Union[str, PathLike], *, - zarr_version: Literal[2, 3] = 3, + zarr_version: Literal[2, 3] | int = 3, mode: Literal["r", "r+", "a", "w", "w-"] = "a", ) -> "ZarrTSArray": """ - Open an existing TensorStore-based Zarr array. + Open an existing Zarr array. Parameters ---------- @@ -125,151 +130,49 @@ def open( return cls(ts_array) -class ZarrTSGroup(ZarrGroup): +class ZarrTSGroup(ZarrPythonGroup): """Zarr Group implementation using TensorStore as backend.""" - def __init__(self, store_path: Union[str, PathLike]) -> None: + def __init__(self, zarr_group: zarr.Group) -> None: """ Initialize the ZarrTSGroup. Parameters ---------- - store_path : Union[str, PathLike] - Path to the group’s directory. + zarr_group : zarr.Group + Underlying Zarr Python group. """ - super().__init__(store_path) - from upath import UPath - - self._path = UPath(store_path) - meta = _detect_metadata(self._path) - assert meta and meta[0] == "group" - self._zarr_version = meta[1] + super().__init__(zarr_group) @classmethod - def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": - """ - Create a ZarrTSGroup from a configuration object. - - Parameters - ---------- - zarr_config : ZarrConfig - Configuration with .out and .zarr_version. - - Returns - ------- - ZarrTSGroup - """ - return cls.open( - zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version - ) + def from_zarr_python_group(cls, zarr_group: ZarrPythonGroup) -> "ZarrTSGroup": + """Convert a ZarrPythonGroup into a ZarrTSGroup.""" + assert isinstance(zarr_group, ZarrPythonGroup) + return cls(zarr_group._get_zarr_python_group()) @classmethod - def open( - cls, - path: Union[str, PathLike], - mode: Literal["r", "r+", "a", "w", "w-"] = "a", - *, - zarr_version: Literal[2, 3] = 3, - ) -> "ZarrTSGroup": - """ - Open or create a Zarr group backed by TensorStore. - - Parameters - ---------- - path : Union[str, PathLike] - Path to the Zarr group. - mode : {'r','r+','a','w','w-'} - Persistence mode; see TensorStore docs. - zarr_version : {2,3} - Zarr format version. - - Returns - ------- - ZarrTSGroup - """ - from upath import UPath - - p = UPath(path) - if mode in ("r", "r+"): - if not p.exists() or not p.is_dir(): - raise FileNotFoundError(f"Group path '{p}' does not exist") - elif mode == "w-": - if p.exists(): - raise FileExistsError(f"Group path '{p}' already exists") - elif mode == "a": - if not p.exists(): - _init_group(p, zarr_version) - elif mode == "w": - if p.exists(): - p.rmdir(recursive=True) - _init_group(p, zarr_version) - else: - raise ValueError(f"Invalid mode '{mode}'") - return cls(p) - - @property - def attrs(self) -> Mapping[str, Any]: - """Access metadata/attributes for this node.""" - return {} - - @property - def zarr_version(self) -> Literal[2, 3]: - """Get the Zarr format version.""" - return self._zarr_version + def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": + """Create a Zarr group from a configuration object.""" + return cls.from_zarr_python_group(ZarrPythonGroup.from_config(zarr_config)) def __getitem__(self, key: str) -> Union[ZarrTSArray, "ZarrTSGroup"]: """Get a subgroup or array by name within this group.""" - meta = _detect_metadata(self._path / key) - if not meta: - raise KeyError(f"Key '{key}' not found") - if meta[0] == "group": - return ZarrTSGroup(self._path / key) - return ZarrTSArray.open(self._path / key, zarr_version=meta[1]) + node = super().__getitem__(key) + if isinstance(node, ZarrPythonGroup): + return self.from_zarr_python_group(node) + elif isinstance(node, ZarrPythonArray): + return ZarrTSArray.from_zarr_python_array(node) + else: + raise ValueError( + "Unsupported node type in Zarr group: {}".format(type(node)) + ) def __setitem__(self, key: str, value: Union[ZarrTSArray, "ZarrTSGroup"]) -> None: """Set a subgroup or array by name within this group.""" raise NotImplementedError( - "Assign to zarr group is not supported with tensorstore." + "Assigning to zarr group is not supported with tensorstore." ) - def __delitem__(self, key: str) -> None: - """Delete a subgroup or array by name within this group.""" - target = self._path / key - if target.exists(): - target.rmdir(recursive=True) - - def keys(self) -> Iterator[str]: - """Get the names of all subgroups and arrays in this group.""" - return ( - p.name for p in self._path.iterdir() if p.is_dir() and _detect_metadata(p) - ) - - def __contains__(self, name: str) -> bool: - """Check whether a subgroup or array exists in this group.""" - p = self._path / name - return p.exists() and bool(_detect_metadata(p)) - - def _get_zarr_python_group(self) -> "zarr.Group": - """Get the underlying Zarr Python group object.""" - return zarr.open_group(self._path, mode="a") - - def create_group(self, name: str, overwrite: bool = False) -> "ZarrTSGroup": - """ - Create or open a subgroup within this group. - - Parameters - ---------- - name : str - overwrite : bool - If True, delete existing before creating. - - Returns - ------- - ZarrTSGroup - """ - mode = "w" if overwrite else "w-" - return self.open(self._path / name, mode=mode, zarr_version=self._zarr_version) - def create_array( self, name: str, @@ -295,27 +198,18 @@ def create_array( ------- ZarrTSArray """ - if zarr_config is None: - conf = default_write_config( - self._path / name, shape=shape, dtype=dtype, **kwargs - ) - else: - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - # TODO: implement this - # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), - version=zarr_config.zarr_version, - ) - conf.update(delete_existing=True, create=True) - arr = ts.open(conf).result() + arr = super().create_array( + name=name, + shape=shape, + dtype=dtype, + zarr_config=zarr_config, + data=data, + **kwargs, + ) + arr = ZarrTSArray.from_zarr_python_array(arr) if data is not None: arr[:] = data - return ZarrTSArray(arr) + return arr def create_array_from_base( self, @@ -337,14 +231,11 @@ def create_array_from_base( ------- ZarrTSArray """ - base = self["0"]._ts.spec().to_json() - base["metadata"]["shape"] = shape - base["kvstore"] = make_kvstore(self._path / name) - base.update(delete_existing=True, create=True) - arr = ts.open(base).result() + arr = super().create_array_from_base(name=name, shape=shape, **kwargs) + arr = ZarrTSArray.from_zarr_python_array(arr) if data is not None: arr[:] = data - return ZarrTSArray(arr) + return arr def make_compressor_v2(name: str | None, **prm: dict) -> dict: From cbf560156f8562a5aded2cd970b85d206385d756 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 12:21:19 -0400 Subject: [PATCH 143/157] chore: remove unused func --- .../utils/io/zarr/drivers/tensorstore.py | 82 +------------------ 1 file changed, 4 insertions(+), 78 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 68831c15..43b394f3 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -101,7 +101,8 @@ def open( path: Union[str, PathLike], *, zarr_version: Literal[2, 3] | int = 3, - mode: Literal["r", "r+", "a", "w", "w-"] = "a", + create: bool = False, + delete_exsisting: bool = False, ) -> "ZarrTSArray": """ Open an existing Zarr array. @@ -123,8 +124,8 @@ def open( "kvstore": make_kvstore(path), "driver": "zarr3" if zarr_version == 3 else "zarr", "open": True, - "create": False, - "delete_existing": False, + "create": create, + "delete_existing": delete_exsisting, } ts_array = ts.open(spec).result() return cls(ts_array) @@ -393,71 +394,6 @@ def default_read_config(path: os.PathLike | str) -> dict: } -def _is_array(path: PathLike) -> bool: - zarr2_array_file = path / ".zarray" - if zarr2_array_file.is_file(): - content = zarr2_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_array_file = path / "zarr.json" - if zarr3_array_file.is_file(): - content = zarr3_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "array": - return True - return False - - -def _is_group(path: PathLike) -> bool: - zarr2_group_file = path / ".zgroup" - if zarr2_group_file.is_file(): - content = zarr2_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_group_file = path / "zarr.json" - if zarr3_group_file.is_file(): - content = zarr3_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "group": - return True - return False - - -def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: - """ - Look for Zarr metadata files in `path` and return (node_type, version). - - Checks zarr.json (v3), then .zarray/.zgroup (v2). - """ - # Zarr v3 - z3 = path / "zarr.json" - if z3.is_file(): - try: - meta = json.loads(z3.read_text()) - fmt = meta.get("zarr_format") - if fmt == 3: - node = meta.get("node_type", "array") - if node in ("array", "group"): - return node, 3 - except json.JSONDecodeError: - pass - # Zarr v2 - for fname, ntype in ((".zarray", "array"), (".zgroup", "group")): - f = path / fname - if f.is_file(): - try: - meta = json.loads(f.read_text()) - if meta.get("zarr_format") == 2: - return ntype, 2 - except json.JSONDecodeError: - pass - return None - - def default_write_config( path: os.PathLike | str, shape: list[int], @@ -605,13 +541,3 @@ def default_write_config( config["kvstore"] = make_kvstore(path) return config - - -def _init_group(group_path: PathLike, version: int) -> None: - group_path.mkdir(parents=True, exist_ok=True) - if version == 3: - (group_path / "zarr.json").write_text( - json.dumps({"zarr_format": 3, "node_type": "group"}) - ) - else: - (group_path / ".zgroup").write_text(json.dumps({"zarr_format": 2})) From 46a759a72d9e0776075f413bc81d3c3fe0c08f04 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 12:29:34 -0400 Subject: [PATCH 144/157] refactor --- linc_convert/utils/io/zarr/abc.py | 5 +- .../utils/io/zarr/drivers/tensorstore.py | 88 +------- .../utils/io/zarr/drivers/zarr_python.py | 113 +--------- .../utils/io/{ => zarr}/generate_pyramid.py | 0 linc_convert/utils/io/zarr/helpers.py | 196 ++++++++++++++++++ 5 files changed, 203 insertions(+), 199 deletions(-) rename linc_convert/utils/io/{ => zarr}/generate_pyramid.py (100%) create mode 100644 linc_convert/utils/io/zarr/helpers.py diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index f7ae3bee..be718963 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -27,7 +27,7 @@ from nibabel import Nifti1Header, Nifti2Header from numpy.typing import ArrayLike, DTypeLike -from linc_convert.utils.io.generate_pyramid import ( +from linc_convert.utils.io.zarr.generate_pyramid import ( compute_next_level, default_levels, next_level_shape, @@ -151,7 +151,7 @@ def __delitem__(self, key: str) -> None: ... @abstractmethod - def _get_zarr_python_group(self) -> "zarr.ZarrGroup": + def _get_zarr_python_group(self) -> zarr.Group: """Get the underlying Zarr Python group object.""" ... @@ -228,7 +228,6 @@ def generate_pyramid( raise ValueError(f"Unsupported mode: {mode}") window = window_func[mode] - if levels == -1: levels = default_levels(spatial_shape, chunk_size, no_pyramid_axis) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 43b394f3..685a9aa6 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -1,7 +1,5 @@ """TensorStore driver for Zarr arrays and groups.""" -import json -import math import os from numbers import Number from os import PathLike @@ -25,6 +23,7 @@ from linc_convert.utils.io.zarr import ZarrPythonArray, ZarrPythonGroup from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig +from linc_convert.utils.io.zarr.helpers import auto_shard_size, fix_shard_chunk from linc_convert.utils.zarr_config import ZarrConfig @@ -282,91 +281,6 @@ def make_kvstore(path: str | os.PathLike) -> dict: raise ValueError("Unsupported protocol:", path.protocol) -def auto_shard_size( - max_shape: list[int], - itemsize: int | np.dtype | str, - max_file_size: int = 2 * 1024 ** 4, - compression_ratio: float = 2, -) -> list[int]: - """ - Find maximal shard size that ensures file size below cap. - - Parameters - ---------- - max_shape : list[int] - Maximum shape along each dimension. - itemsize : np.dtype or int - Data type, or data type size - max_file_size : int - Maximum file size (default: 2TB). - S3 has a 5TB/file limit, but given that we use an estimated - compression factor, we aim for 2TB to leave some leeway. - compression_ratio : float - Estimated compression factor. - I roughly found 2 for bosc-compressed LSM data, when compressing - only across space and channels (5 channels). - - Returns - ------- - shard : list[int] - Estimated shard size along each dimension. - Returned shards are either max_shape or powers of two. - """ - if not isinstance(itemsize, int): - itemsize = np.dtype(itemsize).itemsize - - # Maximum number of elements in the shard - max_numel = max_file_size * compression_ratio / itemsize - - shard = [1] * len(max_shape) - while True: - # If shard larger than volume, we can stop - if all(x >= s for x, s in zip(shard, max_shape)): - break - # Make shard one level larger - new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] - # If shard is too large, stop and keep previous shard - if np.prod(new_shard) > max_numel: - break - # Otherwise, use larger shard and recurse - shard = new_shard - - # replace max size with larger power of two - shard = [2 ** math.ceil(math.log2(x)) for x in shard] - return shard - - -def fix_shard_chunk( - shard: list[int], - chunk: list[int], - shape: list[int], -) -> tuple[list[int], list[int]]: - """ - Fix incompatibilities between chunk and shard size. - - Parameters - ---------- - shard : list[int] - chunk : list[int] - shape : list[int] - - Returns - ------- - shard : list[int] - chunk : list[int] - """ - shard = list(shard) - chunk = list(chunk) - for i in range(len(chunk)): - # if chunk spans the entire volume, match chunk and shard - if chunk[i] == shape[i] and chunk[i] != shard[i]: - chunk[i] = shard[i] - # ensure that shard is a multiple of chunk - if shard[i] % chunk[i]: - shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) - return shard, chunk - - def default_read_config(path: os.PathLike | str) -> dict: """ Generate a TensorStore configuration to read an existing Zarr. diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 9811be4a..3defa61c 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -22,6 +22,7 @@ from zarr.core.chunk_key_encodings import ChunkKeyEncodingLike, ChunkKeyEncodingParams from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup +from linc_convert.utils.io.zarr.helpers import _compute_zarr_layout from linc_convert.utils.zarr_config import ZarrConfig @@ -113,7 +114,6 @@ def __init__(self, zarr_group: zarr.Group) -> None: @classmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrPythonGroup": """Create a Zarr group from a configuration object.""" - if zarr_config.out.startswith("/") or zarr_config.out.startswith("\\"): store = zarr.storage.LocalStore(zarr_config.out) else: @@ -234,10 +234,11 @@ def create_array_from_base( name: str, shape: Sequence[int], data: ArrayLike = None, - **kwargs: Unpack[ZarrConfig], + **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrPythonArray: """Create a new array using the properties from a base_level object.""" - base_level = self["0"] + # this is very hacky, otherwise the inherited class will use their override + base_level = ZarrPythonGroup.__getitem__(self, "0") opts = dict( dtype=base_level.dtype, chunks=base_level.chunks, @@ -318,109 +319,3 @@ def _dimension_separator_to_chunk_key_encoding( name="default" if zarr_version == 3 else "v2", separator=dimension_separator ) return dimension_separator - - -SHARD_FILE_SIZE_LIMIT = ( - 2 # compression ratio - * 2 # GB - * 2 ** 30 # GB->Bytes -) - - -def _compute_zarr_layout( - shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig -) -> tuple[tuple, tuple | None]: - ndim = len(shape) - if ndim == 5: - if zarr_config.no_time: - raise ValueError("no_time is not supported for 5D data") - chunk_tc = ( - 1 if zarr_config.chunk_time else shape[0], - 1 if zarr_config.chunk_channels else shape[1], - ) - shard_tc = ( - chunk_tc[0] if zarr_config.shard_time else shape[0], - chunk_tc[1] if zarr_config.shard_channels else shape[1], - ) - - elif ndim == 4: - if zarr_config.no_time: - chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_channels else shape[0],) - else: - chunk_tc = (1 if zarr_config.chunk_time else shape[0],) - shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) - elif ndim == 3: - chunk_tc = tuple() - shard_tc = tuple() - else: - raise ValueError("Zarr layout only supports 3+ dimensions.") - - chunk = zarr_config.chunk - if len(chunk) > ndim: - raise ValueError("Provided chunk size has more dimension than data") - if len(zarr_config.chunk) != ndim: - chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) - - shard = zarr_config.shard - - if isinstance(shard, tuple) and len(shard) > ndim: - raise ValueError("Provided shard size has more dimension than data") - # If shard is not used or is fully specified, return early. - if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): - return chunk, shard - - chunk_spatial = chunk[-3:] - if shard == "auto": - # Compute auto shard sizes based on the file size limit. - itemsize = dtype.itemsize - chunk_size = np.prod(chunk_spatial) * itemsize - shard_size = np.prod(shard_tc) * chunk_size - B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size - multiplier = int(B_multiplier ** (1 / 3)) - if multiplier < 1: - multiplier = 1 - - shape_spatial = shape[-3:] - # For each spatial dimension, the minimal multiplier needed to cover the data: - L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] - dims = len(chunk_spatial) - - shard = tuple(int(c * multiplier) for c in chunk_spatial) - m_uniform = int(B_multiplier ** (1 / dims)) - M = [] - free_dims = [] - for i in range(dims): - # If the uniform guess already overshoots the data, clamp to the minimal - # covering multiplier. - if m_uniform * chunk_spatial[i] >= shape_spatial[i]: - M.append(L[i]) - else: - M.append(m_uniform) - free_dims.append(i) - - # Iteratively try to increase free dimensions while keeping the overall - # product ≤ B_multiplier. - improved = True - while improved and free_dims: - improved = False - for i in free_dims: - candidate = M[i] + 1 - # If increasing would exceed the data size in this dimension, - # clamp to the minimal covering multiplier. - if candidate * chunk_spatial[i] >= shape_spatial[i]: - candidate = L[i] - new_product = np.prod( - [candidate if j == i else M[j] for j in range(dims)] - ) - if new_product <= B_multiplier and candidate > M[i]: - M[i] = candidate - improved = True - # Remove dimensions that have reached or exceeded the data size. - free_dims = [ - i for i in free_dims if M[i] * chunk_spatial[i] < shape_spatial[i] - ] - shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) - - shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) - return chunk, shard diff --git a/linc_convert/utils/io/generate_pyramid.py b/linc_convert/utils/io/zarr/generate_pyramid.py similarity index 100% rename from linc_convert/utils/io/generate_pyramid.py rename to linc_convert/utils/io/zarr/generate_pyramid.py diff --git a/linc_convert/utils/io/zarr/helpers.py b/linc_convert/utils/io/zarr/helpers.py new file mode 100644 index 00000000..60e0dbe4 --- /dev/null +++ b/linc_convert/utils/io/zarr/helpers.py @@ -0,0 +1,196 @@ +import math + +import numpy as np +from numpy.typing import DTypeLike + +from linc_convert.utils.zarr_config import ZarrConfig + +SHARD_FILE_SIZE_LIMIT = ( + 2 # compression ratio + * 2 # GB + * 2 ** 30 # GB->Bytes +) + + +def _compute_zarr_layout( + shape: tuple, dtype: DTypeLike, zarr_config: ZarrConfig +) -> tuple[tuple, tuple | None]: + ndim = len(shape) + if ndim == 5: + if zarr_config.no_time: + raise ValueError("no_time is not supported for 5D data") + chunk_tc = ( + 1 if zarr_config.chunk_time else shape[0], + 1 if zarr_config.chunk_channels else shape[1], + ) + shard_tc = ( + chunk_tc[0] if zarr_config.shard_time else shape[0], + chunk_tc[1] if zarr_config.shard_channels else shape[1], + ) + + elif ndim == 4: + if zarr_config.no_time: + chunk_tc = (1 if zarr_config.chunk_channels else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_channels else shape[0],) + else: + chunk_tc = (1 if zarr_config.chunk_time else shape[0],) + shard_tc = (chunk_tc[0] if zarr_config.shard_time else shape[0],) + elif ndim == 3: + chunk_tc = tuple() + shard_tc = tuple() + else: + raise ValueError("Zarr layout only supports 3+ dimensions.") + + chunk = zarr_config.chunk + if len(chunk) > ndim: + raise ValueError("Provided chunk size has more dimension than data") + if len(zarr_config.chunk) != ndim: + chunk = chunk_tc + chunk + chunk[-1:] * max(0, 3 - len(chunk)) + + shard = zarr_config.shard + + if isinstance(shard, tuple) and len(shard) > ndim: + raise ValueError("Provided shard size has more dimension than data") + # If shard is not used or is fully specified, return early. + if shard is None or (isinstance(shard, tuple) and len(shard) == ndim): + return chunk, shard + + chunk_spatial = chunk[-3:] + if shard == "auto": + # Compute auto shard sizes based on the file size limit. + itemsize = dtype.itemsize + chunk_size = np.prod(chunk_spatial) * itemsize + shard_size = np.prod(shard_tc) * chunk_size + B_multiplier = SHARD_FILE_SIZE_LIMIT / shard_size + multiplier = int(B_multiplier ** (1 / 3)) + if multiplier < 1: + multiplier = 1 + + shape_spatial = shape[-3:] + # For each spatial dimension, the minimal multiplier needed to cover the data: + L = [int(np.ceil(s / c)) for s, c in zip(shape_spatial, chunk_spatial)] + dims = len(chunk_spatial) + + shard = tuple(int(c * multiplier) for c in chunk_spatial) + m_uniform = int(B_multiplier ** (1 / dims)) + M = [] + free_dims = [] + for i in range(dims): + # If the uniform guess already overshoots the data, clamp to the minimal + # covering multiplier. + if m_uniform * chunk_spatial[i] >= shape_spatial[i]: + M.append(L[i]) + else: + M.append(m_uniform) + free_dims.append(i) + + # Iteratively try to increase free dimensions while keeping the overall + # product ≤ B_multiplier. + improved = True + while improved and free_dims: + improved = False + for i in free_dims: + candidate = M[i] + 1 + # If increasing would exceed the data size in this dimension, + # clamp to the minimal covering multiplier. + if candidate * chunk_spatial[i] >= shape_spatial[i]: + candidate = L[i] + new_product = np.prod( + [candidate if j == i else M[j] for j in range(dims)] + ) + if new_product <= B_multiplier and candidate > M[i]: + M[i] = candidate + improved = True + # Remove dimensions that have reached or exceeded the data size. + free_dims = [ + i for i in free_dims if M[i] * chunk_spatial[i] < shape_spatial[i] + ] + shard = tuple(M[i] * chunk_spatial[i] for i in range(dims)) + + shard = shard_tc + shard + shard[-1:] * max(0, 3 - len(shard)) + return chunk, shard + + +def auto_shard_size( + max_shape: list[int], + itemsize: int | np.dtype | str, + max_file_size: int = 2 * 1024 ** 4, + compression_ratio: float = 2, +) -> list[int]: + """ + Find maximal shard size that ensures file size below cap. + + Parameters + ---------- + max_shape : list[int] + Maximum shape along each dimension. + itemsize : np.dtype or int + Data type, or data type size + max_file_size : int + Maximum file size (default: 2TB). + S3 has a 5TB/file limit, but given that we use an estimated + compression factor, we aim for 2TB to leave some leeway. + compression_ratio : float + Estimated compression factor. + I roughly found 2 for bosc-compressed LSM data, when compressing + only across space and channels (5 channels). + + Returns + ------- + shard : list[int] + Estimated shard size along each dimension. + Returned shards are either max_shape or powers of two. + """ + if not isinstance(itemsize, int): + itemsize = np.dtype(itemsize).itemsize + + # Maximum number of elements in the shard + max_numel = max_file_size * compression_ratio / itemsize + + shard = [1] * len(max_shape) + while True: + # If shard larger than volume, we can stop + if all(x >= s for x, s in zip(shard, max_shape)): + break + # Make shard one level larger + new_shard = [min(2 * x, s) for x, s in zip(shard, max_shape)] + # If shard is too large, stop and keep previous shard + if np.prod(new_shard) > max_numel: + break + # Otherwise, use larger shard and recurse + shard = new_shard + + # replace max size with larger power of two + shard = [2 ** math.ceil(math.log2(x)) for x in shard] + return shard + + +def fix_shard_chunk( + shard: list[int], + chunk: list[int], + shape: list[int], +) -> tuple[list[int], list[int]]: + """ + Fix incompatibilities between chunk and shard size. + + Parameters + ---------- + shard : list[int] + chunk : list[int] + shape : list[int] + + Returns + ------- + shard : list[int] + chunk : list[int] + """ + shard = list(shard) + chunk = list(chunk) + for i in range(len(chunk)): + # if chunk spans the entire volume, match chunk and shard + if chunk[i] == shape[i] and chunk[i] != shard[i]: + chunk[i] = shard[i] + # ensure that shard is a multiple of chunk + if shard[i] % chunk[i]: + shard[i] = chunk[i] * int(math.ceil(shard[i] / chunk[i])) + return shard, chunk From 34fbff748c759401d1df34064876686fbe6dc94f Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 12:31:32 -0400 Subject: [PATCH 145/157] docs --- linc_convert/utils/io/zarr/helpers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/linc_convert/utils/io/zarr/helpers.py b/linc_convert/utils/io/zarr/helpers.py index 60e0dbe4..42b8c831 100644 --- a/linc_convert/utils/io/zarr/helpers.py +++ b/linc_convert/utils/io/zarr/helpers.py @@ -1,3 +1,5 @@ +"""Helper functions for Zarr I/O.""" + import math import numpy as np From 83649abc18422639079f7b874d31eacc8d080aec Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 12:31:40 -0400 Subject: [PATCH 146/157] cleanup --- linc_convert/modalities/wk/webknossos_annotation.py | 2 -- linc_convert/utils/zarr_config.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index b78b012a..7c392bfa 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -7,8 +7,6 @@ import cyclopts import numpy as np - -# externals import wkw import zarr diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 033a7b6c..a9b86dc5 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -1,7 +1,6 @@ """Configuration related to output Zarr Archive.""" import logging -import os from dataclasses import dataclass, replace from typing import Annotated, Literal @@ -140,6 +139,7 @@ def set_default_name(self, name: str) -> None: self.out = name self.out += ".nii.zarr" if self.nii else ".ome.zarr" + def update_default_config( zarr_config: ZarrConfig | None, **kwargs: Unpack[ZarrConfig] ) -> ZarrConfig: From b3502d2a6b8a75c09653fb291355be762f9e76d7 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 14:27:18 -0400 Subject: [PATCH 147/157] feat: factory implemented --- linc_convert/utils/io/zarr/factory.py | 104 ++++++++++++-------------- 1 file changed, 46 insertions(+), 58 deletions(-) diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index 3be36bf9..69bdae1c 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -4,8 +4,9 @@ from os import PathLike from typing import Literal -from linc_convert.utils.io.zarr import ZarrNode -from linc_convert.utils.io.zarr.abc import ZarrGroup +import zarr + +from linc_convert.utils.io.zarr.abc import ZarrGroup, ZarrNode from linc_convert.utils.io.zarr.drivers.zarr_python import ( ZarrPythonArray, ZarrPythonGroup, @@ -24,32 +25,47 @@ warnings.warn(f"Tensorstore driver not available: {e}.") +class UnsupportedDriverError(ValueError): + """Exception raised when an unsupported driver is specified.""" + + def __init__(self, driver: DriverLike) -> None: + super().__init__(f"Unsupported driver: {driver}") + self.driver = driver + + +def _wrap_array(zarr_array: zarr.Array, driver: DriverLike) -> ZarrNode: + base = ZarrPythonArray(zarr_array) + if driver == "zarr-python": + return base + if driver in _DRIVER_ARRAY and hasattr(_DRIVER_ARRAY[driver], + "from_zarr_python_array"): + return _DRIVER_ARRAY[driver].from_zarr_python_array(base) + raise UnsupportedDriverError(driver) + + +def _wrap_group(zarr_group: zarr.Group, driver: DriverLike) -> ZarrGroup: + base = ZarrPythonGroup(zarr_group) + if driver == "zarr-python": + return base + if driver in _DRIVER_GROUP and hasattr(_DRIVER_GROUP[driver], + "from_zarr_python_group"): + return _DRIVER_GROUP[driver].from_zarr_python_group(base) + raise UnsupportedDriverError(driver) + + def open( path: str | PathLike[str], mode: Literal["r", "r+", "a", "w", "w-"] = "a", zarr_version: Literal[2, 3] = 3, driver: DriverLike = "zarr-python", ) -> ZarrNode: - """ - Open a Zarr Node (Array or Group) based on the specified driver. - - Parameters - ---------- - path : str | PathLike[str] - Path to the Zarr Node. - mode : Literal["r", "r+", "a", "w", "w-] - Mode in which to open the Zarr Node. - zarr_version : Literal[2, 3] - Zarr version to use (default is 3). - driver : DriverLike - Driver to use for opening the Zarr Node (default is "zarr-python"). - - Returns - ------- - ZarrNode - An instance of ZarrNode, which can be either a ZarrArray or Zarr - """ - raise NotImplementedError + """Open a Zarr Node (Array or Group) based on the specified driver.""" + node = zarr.open(path, mode=mode, zarr_format=zarr_version) + if isinstance(node, zarr.Array): + return _wrap_array(node, driver) + elif isinstance(node, zarr.Group): + return _wrap_group(node, driver) + raise TypeError(f"Unsupported Zarr node type: {type(node)}") def open_group( @@ -58,42 +74,14 @@ def open_group( zarr_version: Literal[2, 3] = 3, driver: DriverLike = "zarr-python", ) -> ZarrGroup: - """ - Open a Zarr Group based on the specified driver. - - Parameters - ---------- - path : str | PathLike[str] - Path to the Zarr Group. - mode : Literal["r", "r+", "a", "w", "w-"] - Mode in which to open the Zarr Group. - zarr_version : Literal[2, 3] - Zarr version to use (default is 3). - driver : DriverLike - Driver to use for opening the Zarr Group (default is "zarr-python"). - - Returns - ------- - ZarrGroup - An instance of ZarrGroup based on the specified driver. - """ - raise NotImplementedError + """Open a Zarr Group based on the specified driver.""" + return _wrap_group(zarr.open_group(path, mode=mode, zarr_format=zarr_version), + driver) def from_config(zarr_config: ZarrConfig) -> ZarrGroup: - """ - Create a ZarrGroup from a ZarrConfig. - - Parameters - ---------- - zarr_config : ZarrConfig - Configuration for the Zarr group. - - Returns - ------- - ZarrGroup - An instance of ZarrGroup based on the configuration. - """ - if zarr_config.driver not in _DRIVER_GROUP: - raise ValueError(f"{zarr_config.driver} is not supported.") - return _DRIVER_GROUP[zarr_config.driver].from_config(zarr_config) + """Create a ZarrGroup from a ZarrConfig.""" + group_cls = _DRIVER_GROUP.get(zarr_config.driver) + if group_cls is None: + raise UnsupportedDriverError(zarr_config.driver) + return group_cls.from_config(zarr_config) From 44276423ab597f1b65787ebe6480cd56042e4f8d Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 14:43:53 -0400 Subject: [PATCH 148/157] feat: read array attributes with tsarray --- linc_convert/utils/io/zarr/abc.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index be718963..beb3691e 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -155,10 +155,6 @@ def _get_zarr_python_group(self) -> zarr.Group: """Get the underlying Zarr Python group object.""" ... - # @abstractmethod - # def _create_array(self, **kwargs: Unpack[ZarrArrayConfig]) -> ArrayLike: - # ... - @abstractmethod def create_group(self, name: str, overwrite: bool = False) -> "ZarrGroup": """Create or open a subgroup within this group.""" From a0de94d6fbcd5f04b29b61cf7ed8a7142677e8d9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 14:47:54 -0400 Subject: [PATCH 149/157] cleanup --- scripts/debug.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 scripts/debug.py diff --git a/scripts/debug.py b/scripts/debug.py deleted file mode 100644 index f5705bcb..00000000 --- a/scripts/debug.py +++ /dev/null @@ -1,16 +0,0 @@ -import numpy as np -import psutil -import sparse - - -def print_mem(): - print(psutil.Process().memory_info().rss/1024/1024) - -print_mem() -a = np.broadcast_to(np.zeros(()),(1000,)*3) - -print_mem() -b = sparse.random(a.shape,0.0001) -print_mem() -c = a+b -print_mem() \ No newline at end of file From 79e0eee932b4585903517284b68826a64ab315d3 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Thu, 7 Aug 2025 14:57:49 -0400 Subject: [PATCH 150/157] feat: read array attributes with tsarray --- linc_convert/utils/io/zarr/drivers/tensorstore.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 685a9aa6..103967dd 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -1,5 +1,5 @@ """TensorStore driver for Zarr arrays and groups.""" - +import json import os from numbers import Number from os import PathLike @@ -77,7 +77,17 @@ def shards(self) -> Optional[Tuple[int, ...]]: @property def attrs(self) -> Mapping[str, Any]: """Access metadata/attributes for this node.""" - # TODO: TensorStore currently doesn’t expose arbitrary attrs, so return empty. + store = UPath(self.store_path) + if self.zarr_version == 2: + if not (store / ".zattrs").exists(): + return {} + with open(store / ".zattrs") as f: + zarr_json = json.load(f) + return zarr_json + elif self.zarr_version == 3: + with open(store / "zarr.json") as f: + zarr_json = json.load(f) + return zarr_json.get("attributes", {}) return {} @property From fd88fe10743c83b7e91db9135151137d62fc6ce8 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Mon, 11 Aug 2025 12:03:07 -0400 Subject: [PATCH 151/157] revert: stop using zarr-python for managing groups. we still want to use from-scratch approach for group management. hence we can write zarr3 without zarr-python-v3+ --- .../utils/io/zarr/drivers/tensorstore.py | 264 +++++++++++++++--- 1 file changed, 227 insertions(+), 37 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 103967dd..a230b6c4 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -5,6 +5,7 @@ from os import PathLike from typing import ( Any, + Iterator, Literal, Mapping, Optional, @@ -21,8 +22,8 @@ from numpy.typing import ArrayLike, DTypeLike from upath import UPath -from linc_convert.utils.io.zarr import ZarrPythonArray, ZarrPythonGroup -from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig +from linc_convert.utils.io.zarr import ZarrPythonArray +from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.io.zarr.helpers import auto_shard_size, fix_shard_chunk from linc_convert.utils.zarr_config import ZarrConfig @@ -140,49 +141,151 @@ def open( return cls(ts_array) -class ZarrTSGroup(ZarrPythonGroup): +class ZarrTSGroup(ZarrGroup): """Zarr Group implementation using TensorStore as backend.""" - def __init__(self, zarr_group: zarr.Group) -> None: + def __init__(self, store_path: Union[str, PathLike]) -> None: """ Initialize the ZarrTSGroup. Parameters ---------- - zarr_group : zarr.Group - Underlying Zarr Python group. + store_path : Union[str, PathLike] + Path to the group’s directory. """ - super().__init__(zarr_group) + super().__init__(store_path) + from upath import UPath - @classmethod - def from_zarr_python_group(cls, zarr_group: ZarrPythonGroup) -> "ZarrTSGroup": - """Convert a ZarrPythonGroup into a ZarrTSGroup.""" - assert isinstance(zarr_group, ZarrPythonGroup) - return cls(zarr_group._get_zarr_python_group()) + self._path = UPath(store_path) + meta = _detect_metadata(self._path) + assert meta and meta[0] == "group" + self._zarr_version = meta[1] @classmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": - """Create a Zarr group from a configuration object.""" - return cls.from_zarr_python_group(ZarrPythonGroup.from_config(zarr_config)) + """ + Create a ZarrTSGroup from a configuration object. + + Parameters + ---------- + zarr_config : ZarrConfig + Configuration with .out and .zarr_version. + + Returns + ------- + ZarrTSGroup + """ + return cls.open( + zarr_config.out, mode="a", zarr_version=zarr_config.zarr_version + ) + + @classmethod + def open( + cls, + path: Union[str, PathLike], + mode: Literal["r", "r+", "a", "w", "w-"] = "a", + *, + zarr_version: Literal[2, 3] = 3, + ) -> "ZarrTSGroup": + """ + Open or create a Zarr group backed by TensorStore. + + Parameters + ---------- + path : Union[str, PathLike] + Path to the Zarr group. + mode : {'r','r+','a','w','w-'} + Persistence mode; see TensorStore docs. + zarr_version : {2,3} + Zarr format version. + + Returns + ------- + ZarrTSGroup + """ + from upath import UPath + + p = UPath(path) + if mode in ("r", "r+"): + if not p.exists() or not p.is_dir(): + raise FileNotFoundError(f"Group path '{p}' does not exist") + elif mode == "w-": + if p.exists(): + raise FileExistsError(f"Group path '{p}' already exists") + elif mode == "a": + if not p.exists(): + _init_group(p, zarr_version) + elif mode == "w": + if p.exists(): + p.rmdir(recursive=True) + _init_group(p, zarr_version) + else: + raise ValueError(f"Invalid mode '{mode}'") + return cls(p) + + @property + def attrs(self) -> Mapping[str, Any]: + """Access metadata/attributes for this node.""" + return {} + + @property + def zarr_version(self) -> Literal[2, 3]: + """Get the Zarr format version.""" + return self._zarr_version def __getitem__(self, key: str) -> Union[ZarrTSArray, "ZarrTSGroup"]: """Get a subgroup or array by name within this group.""" - node = super().__getitem__(key) - if isinstance(node, ZarrPythonGroup): - return self.from_zarr_python_group(node) - elif isinstance(node, ZarrPythonArray): - return ZarrTSArray.from_zarr_python_array(node) - else: - raise ValueError( - "Unsupported node type in Zarr group: {}".format(type(node)) - ) + meta = _detect_metadata(self._path / key) + if not meta: + raise KeyError(f"Key '{key}' not found") + if meta[0] == "group": + return ZarrTSGroup(self._path / key) + return ZarrTSArray.open(self._path / key, zarr_version=meta[1]) def __setitem__(self, key: str, value: Union[ZarrTSArray, "ZarrTSGroup"]) -> None: """Set a subgroup or array by name within this group.""" raise NotImplementedError( - "Assigning to zarr group is not supported with tensorstore." + "Assign to zarr group is not supported with tensorstore." ) + def __delitem__(self, key: str) -> None: + """Delete a subgroup or array by name within this group.""" + target = self._path / key + if target.exists(): + target.rmdir(recursive=True) + + def keys(self) -> Iterator[str]: + """Get the names of all subgroups and arrays in this group.""" + return ( + p.name for p in self._path.iterdir() if p.is_dir() and _detect_metadata(p) + ) + + def __contains__(self, name: str) -> bool: + """Check whether a subgroup or array exists in this group.""" + p = self._path / name + return p.exists() and bool(_detect_metadata(p)) + + def _get_zarr_python_group(self) -> "zarr.Group": + """Get the underlying Zarr Python group object.""" + return zarr.open_group(self._path, mode="a") + + def create_group(self, name: str, overwrite: bool = False) -> "ZarrTSGroup": + """ + Create or open a subgroup within this group. + + Parameters + ---------- + name : str + overwrite : bool + If True, delete existing before creating. + + Returns + ------- + ZarrTSGroup + """ + mode = "w" if overwrite else "w-" + return self.open(self._path / name, mode=mode, zarr_version=self._zarr_version) + def create_array( self, name: str, @@ -208,18 +311,27 @@ def create_array( ------- ZarrTSArray """ - arr = super().create_array( - name=name, - shape=shape, - dtype=dtype, - zarr_config=zarr_config, - data=data, - **kwargs, - ) - arr = ZarrTSArray.from_zarr_python_array(arr) + if zarr_config is None: + conf = default_write_config( + self._path / name, shape=shape, dtype=dtype, **kwargs + ) + else: + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + chunk=zarr_config.chunk, + shard=zarr_config.shard, + compressor=zarr_config.compressor, + # TODO: implement this + # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), + version=zarr_config.zarr_version, + ) + conf.update(delete_existing=True, create=True) + arr = ts.open(conf).result() if data is not None: arr[:] = data - return arr + return ZarrTSArray(arr) def create_array_from_base( self, @@ -241,11 +353,14 @@ def create_array_from_base( ------- ZarrTSArray """ - arr = super().create_array_from_base(name=name, shape=shape, **kwargs) - arr = ZarrTSArray.from_zarr_python_array(arr) + base = self["0"]._ts.spec().to_json() + base["metadata"]["shape"] = shape + base["kvstore"] = make_kvstore(self._path / name) + base.update(delete_existing=True, create=True) + arr = ts.open(base).result() if data is not None: arr[:] = data - return arr + return ZarrTSArray(arr) def make_compressor_v2(name: str | None, **prm: dict) -> dict: @@ -318,6 +433,71 @@ def default_read_config(path: os.PathLike | str) -> dict: } +def _is_array(path: PathLike) -> bool: + zarr2_array_file = path / ".zarray" + if zarr2_array_file.is_file(): + content = zarr2_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_array_file = path / "zarr.json" + if zarr3_array_file.is_file(): + content = zarr3_array_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "array": + return True + return False + + +def _is_group(path: PathLike) -> bool: + zarr2_group_file = path / ".zgroup" + if zarr2_group_file.is_file(): + content = zarr2_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 2 + return True + zarr3_group_file = path / "zarr.json" + if zarr3_group_file.is_file(): + content = zarr3_group_file.read_text() + content = json.loads(content) + assert content["zarr_format"] == 3 + if content.get("node_type", None) == "group": + return True + return False + + +def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: + """ + Look for Zarr metadata files in `path` and return (node_type, version). + + Checks zarr.json (v3), then .zarray/.zgroup (v2). + """ + # Zarr v3 + z3 = path / "zarr.json" + if z3.is_file(): + try: + meta = json.loads(z3.read_text()) + fmt = meta.get("zarr_format") + if fmt == 3: + node = meta.get("node_type", "array") + if node in ("array", "group"): + return node, 3 + except json.JSONDecodeError: + pass + # Zarr v2 + for fname, ntype in ((".zarray", "array"), (".zgroup", "group")): + f = path / fname + if f.is_file(): + try: + meta = json.loads(f.read_text()) + if meta.get("zarr_format") == 2: + return ntype, 2 + except json.JSONDecodeError: + pass + return None + + def default_write_config( path: os.PathLike | str, shape: list[int], @@ -465,3 +645,13 @@ def default_write_config( config["kvstore"] = make_kvstore(path) return config + + +def _init_group(group_path: PathLike, version: int) -> None: + group_path.mkdir(parents=True, exist_ok=True) + if version == 3: + (group_path / "zarr.json").write_text( + json.dumps({"zarr_format": 3, "node_type": "group"}) + ) + else: + (group_path / ".zgroup").write_text(json.dumps({"zarr_format": 2})) From 6338e9faf5f2ac9b9b4a8abe7e55be80a4bba4f5 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 10:19:57 -0400 Subject: [PATCH 152/157] feat: support attributes natively --- linc_convert/utils/io/zarr/abc.py | 2 +- linc_convert/utils/io/zarr/attributes.py | 163 ++++++++++++++++++ .../utils/io/zarr/drivers/tensorstore.py | 75 +++----- 3 files changed, 185 insertions(+), 55 deletions(-) create mode 100644 linc_convert/utils/io/zarr/attributes.py diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index beb3691e..c8964199 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -290,7 +290,7 @@ def write_ome_metadata( None. """ niizarr.write_ome_metadata( - self._get_zarr_python_group(), + self, space_scale=space_scale, time_scale=time_scale, space_unit=space_unit, diff --git a/linc_convert/utils/io/zarr/attributes.py b/linc_convert/utils/io/zarr/attributes.py new file mode 100644 index 00000000..48816b3d --- /dev/null +++ b/linc_convert/utils/io/zarr/attributes.py @@ -0,0 +1,163 @@ +""" + +""" + +from collections.abc import MutableMapping, Iterator +from typing import Any, Optional +import json +import os +import tempfile +import threading + +from upath import UPath + + +class Attributes(MutableMapping[str, Any]): + """ + In-memory, write-through (configurable) attributes mapping for Zarr v2/v3. + + Reads are served from an in-memory cache. On mutation, the cache is updated + and, if write_through is True, the file is flushed atomically. Otherwise, + call .flush() explicitly to persist. + + Works for both arrays and groups, as long as the parent exposes: + - .store_path (path-like, directory) + - .zarr_version (2 or 3) + """ + + def __init__(self, obj: Any, *, write_through: bool = True) -> None: + self._obj = obj + self._write_through = write_through + self._lock = threading.RLock() + self._loaded = False + self._attrs: dict[str, Any] = {} + # Only for v3 we need to preserve other top-level keys in zarr.json + self._v3_other_keys: dict[str, Any] = {} + # cache the path computation + store = UPath(self._obj.store_path) + if self._obj.zarr_version == 2: + self._path = store / ".zattrs" + self._is_v3 = False + elif self._obj.zarr_version == 3: + self._path = store / "zarr.json" + self._is_v3 = True + else: + raise ValueError(f"Unsupported zarr_version: {self._obj.zarr_version}") + + # ---------- public helpers ---------- + def asdict(self) -> dict[str, Any]: + with self._lock: + self._ensure_loaded() + return dict(self._attrs) + + def put(self, d: dict[str, Any]) -> None: + """Overwrite all attributes with d (in-memory), then flush (respecting + write_through).""" + with self._lock: + self._ensure_loaded() + self._attrs = dict(d) + if self._write_through: + self._flush_locked() + + def flush(self) -> None: + """Persist current in-memory attributes to disk atomically.""" + with self._lock: + self._ensure_loaded() + self._flush_locked() + + def refresh(self) -> None: + """Discard in-memory cache and re-read from disk.""" + with self._lock: + self._loaded = False + self._attrs.clear() + self._v3_other_keys.clear() + self._ensure_loaded() + + # ---------- MutableMapping interface ---------- + def __getitem__(self, key: str) -> Any: + with self._lock: + self._ensure_loaded() + return self._attrs[key] + + def __setitem__(self, key: str, value: Any) -> None: + with self._lock: + self._ensure_loaded() + self._attrs[key] = value + if self._write_through: + self._flush_locked() + + def __delitem__(self, key: str) -> None: + with self._lock: + self._ensure_loaded() + del self._attrs[key] + if self._write_through: + self._flush_locked() + + def __iter__(self) -> Iterator[str]: + with self._lock: + self._ensure_loaded() + return iter(dict(self._attrs)) # iterate over a snapshot + + def __len__(self) -> int: + with self._lock: + self._ensure_loaded() + return len(self._attrs) + + # ---------- internals ---------- + def _ensure_loaded(self) -> None: + if self._loaded: + return + if not self._path.exists(): + # not present on disk yet + self._attrs = {} + self._v3_other_keys = {} + self._loaded = True + return + + with open(self._path, "r", encoding="utf-8") as f: + data = json.load(f) + + if self._is_v3: + self._attrs = dict(data.get("attributes", {})) + # keep all other top-level keys to preserve on write + self._v3_other_keys = {k: v for k, v in data.items() if k != "attributes"} + else: + self._attrs = dict(data) + self._v3_other_keys = {} + + self._loaded = True + + def _flush_locked(self) -> None: + if self._is_v3: + data = dict(self._v3_other_keys) + data["attributes"] = self._attrs + else: + data = self._attrs + + _atomic_json_write(self._path, data) + + +def _atomic_json_write(path: UPath, data: dict[str, Any]) -> None: + """ + Atomically write JSON to 'path' via a temp file + rename. + Works with local and fsspec-backed paths that expose .open / .parent. + """ + parent = path.parent + parent.mkdir(parents=True, exist_ok=True) + # Use a temp file in the same directory to keep rename atomic on POSIX FS. + tmp_fd, tmp_name = tempfile.mkstemp(prefix=".attrs_tmp_", dir=str(parent)) + try: + with os.fdopen(tmp_fd, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, separators=(",", ":")) + f.flush() + os.fsync(f.fileno()) + # UPath may wrap non-local FS; try best-effort replace + # pathlib.Path has replace(); UPath typically forwards. + UPath(tmp_name).replace(path) + finally: + # If replace failed, clean up temp file best-effort + try: + if UPath(tmp_name).exists(): + UPath(tmp_name).unlink() + except Exception: + pass diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index a230b6c4..1afc7558 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -24,6 +24,7 @@ from linc_convert.utils.io.zarr import ZarrPythonArray from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup +from linc_convert.utils.io.zarr.attributes import Attributes from linc_convert.utils.io.zarr.helpers import auto_shard_size, fix_shard_chunk from linc_convert.utils.zarr_config import ZarrConfig @@ -42,6 +43,7 @@ def __init__(self, ts_array: ts.TensorStore) -> None: """ super().__init__(str(ts_array.kvstore.path)) self._ts = ts_array + self._attrs: Optional[Attributes] = None @classmethod def from_zarr_python_array(cls, zarray: ZarrPythonArray) -> "ZarrTSArray": @@ -76,20 +78,11 @@ def shards(self) -> Optional[Tuple[int, ...]]: return None if read_shape == write_shape else write_shape @property - def attrs(self) -> Mapping[str, Any]: + def attrs(self) -> Attributes: """Access metadata/attributes for this node.""" - store = UPath(self.store_path) - if self.zarr_version == 2: - if not (store / ".zattrs").exists(): - return {} - with open(store / ".zattrs") as f: - zarr_json = json.load(f) - return zarr_json - elif self.zarr_version == 3: - with open(store / "zarr.json") as f: - zarr_json = json.load(f) - return zarr_json.get("attributes", {}) - return {} + if self._attrs is None: + self._attrs = Attributes(self, write_through=True) + return self._attrs @property def zarr_version(self) -> Literal[2, 3]: @@ -154,12 +147,11 @@ def __init__(self, store_path: Union[str, PathLike]) -> None: Path to the group’s directory. """ super().__init__(store_path) - from upath import UPath - self._path = UPath(store_path) meta = _detect_metadata(self._path) assert meta and meta[0] == "group" self._zarr_version = meta[1] + self._attrs: Optional[Attributes] = None @classmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": @@ -195,7 +187,10 @@ def open( path : Union[str, PathLike] Path to the Zarr group. mode : {'r','r+','a','w','w-'} - Persistence mode; see TensorStore docs. + Persistence mode: 'r' means read only (must exist); 'r+' means + read/write (must exist); 'a' means read/write (create if doesn't + exist); 'w' means create (overwrite if exists); 'w-' means create + (fail if exists). zarr_version : {2,3} Zarr format version. @@ -203,8 +198,6 @@ def open( ------- ZarrTSGroup """ - from upath import UPath - p = UPath(path) if mode in ("r", "r+"): if not p.exists() or not p.is_dir(): @@ -224,9 +217,11 @@ def open( return cls(p) @property - def attrs(self) -> Mapping[str, Any]: + def attrs(self) -> Attributes: """Access metadata/attributes for this node.""" - return {} + if self._attrs is None: + self._attrs = Attributes(self, write_through=True) + return self._attrs @property def zarr_version(self) -> Literal[2, 3]: @@ -362,6 +357,12 @@ def create_array_from_base( arr[:] = data return ZarrTSArray(arr) + def load_metadata(self): + pass + + def save_metadata(self): + pass + def make_compressor_v2(name: str | None, **prm: dict) -> dict: """Build compressor dictionary for Zarr v2.""" @@ -433,40 +434,6 @@ def default_read_config(path: os.PathLike | str) -> dict: } -def _is_array(path: PathLike) -> bool: - zarr2_array_file = path / ".zarray" - if zarr2_array_file.is_file(): - content = zarr2_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_array_file = path / "zarr.json" - if zarr3_array_file.is_file(): - content = zarr3_array_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "array": - return True - return False - - -def _is_group(path: PathLike) -> bool: - zarr2_group_file = path / ".zgroup" - if zarr2_group_file.is_file(): - content = zarr2_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 2 - return True - zarr3_group_file = path / "zarr.json" - if zarr3_group_file.is_file(): - content = zarr3_group_file.read_text() - content = json.loads(content) - assert content["zarr_format"] == 3 - if content.get("node_type", None) == "group": - return True - return False - - def _detect_metadata(path: PathLike) -> Optional[Tuple[str, int]]: """ Look for Zarr metadata files in `path` and return (node_type, version). From 2c9c02c6eb1429cb5ca726a35f9d1e14c1a6aa5d Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 12:27:38 -0400 Subject: [PATCH 153/157] feat: support metadata natively --- linc_convert/utils/io/zarr/abc.py | 11 +- .../utils/io/zarr/drivers/tensorstore.py | 55 +++++++--- .../utils/io/zarr/drivers/zarr_python.py | 5 +- linc_convert/utils/io/zarr/metadata.py | 100 ++++++++++++++++++ linc_convert/utils/zarr_config.py | 4 +- 5 files changed, 148 insertions(+), 27 deletions(-) create mode 100644 linc_convert/utils/io/zarr/metadata.py diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index c8964199..c801b694 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -13,6 +13,7 @@ Optional, Sequence, Tuple, + TypeAlias, TypedDict, Union, Unpack, @@ -34,15 +35,15 @@ ) from linc_convert.utils.zarr_config import ZarrConfig -NiftiHeaderLike = Union[Nifti1Header, Nifti2Header] +NiftiHeaderLike: TypeAlias = Nifti1Header | Nifti2Header class ZarrArrayConfig(TypedDict): """Configuration for creating a Zarr Array.""" - chunks: tuple[int, ...] - shards: Optional[tuple[int, ...]] - compressors: Literal["blosc", "zlib", None] + chunk: tuple[int, ...] + shard: Optional[tuple[int, ...]] + compressor: Literal["blosc", "zlib", None] compressor_options: dict[str, Any] dimension_separator: Literal[".", "/"] order: Literal["C", "F"] @@ -306,4 +307,4 @@ def write_ome_metadata( def write_nifti_header(self, header: NiftiHeaderLike) -> None: """Write a NIfTI header to the Zarr group.""" - niizarr.write_nifti_header(self._get_zarr_python_group(), header) + niizarr.write_nifti_header(self, header) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 1afc7558..b3719c00 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -26,6 +26,7 @@ from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.io.zarr.attributes import Attributes from linc_convert.utils.io.zarr.helpers import auto_shard_size, fix_shard_chunk +from linc_convert.utils.io.zarr.metadata import GroupMetadata from linc_convert.utils.zarr_config import ZarrConfig @@ -152,6 +153,7 @@ def __init__(self, store_path: Union[str, PathLike]) -> None: assert meta and meta[0] == "group" self._zarr_version = meta[1] self._attrs: Optional[Attributes] = None + self._metadata: Optional[GroupMetadata] = None @classmethod def from_config(cls, zarr_config: ZarrConfig) -> "ZarrTSGroup": @@ -223,6 +225,12 @@ def attrs(self) -> Attributes: self._attrs = Attributes(self, write_through=True) return self._attrs + @property + def metadata(self) -> GroupMetadata: + if self._metadata is None: + self._metadata = GroupMetadata.from_files(self._path) + return self._metadata + @property def zarr_version(self) -> Literal[2, 3]: """Get the Zarr format version.""" @@ -287,8 +295,9 @@ def create_array( shape: Sequence[int], dtype: DTypeLike = np.int32, *, - zarr_config: Optional[ZarrConfig] = None, + overwrite: bool = True, data: Optional[ArrayLike] = None, + zarr_config: Optional[ZarrConfig] = None, **kwargs: Unpack[ZarrArrayConfig], ) -> ZarrTSArray: """ @@ -299,6 +308,7 @@ def create_array( name : str shape : Sequence[int] dtype : DTypeLike + overwrite: bool zarr_config : ZarrConfig | None data : ArrayLike | None @@ -306,9 +316,26 @@ def create_array( ------- ZarrTSArray """ + # TODO: implement kwargs replacement + + if "chunks" in kwargs: + kwargs["chunk"] = kwargs["chunks"] + del kwargs["chunks"] + if "shards" in kwargs: + kwargs["shard"] = kwargs["shards"] + del kwargs["shards"] + if "compressors" in kwargs: + kwargs["compressor"] = kwargs["compressors"] + del kwargs["compressors"] + if "chunk_key_encoding" in kwargs: + del kwargs["chunk_key_encoding"] + if "fill_value" in kwargs: + del kwargs["fill_value"] if zarr_config is None: conf = default_write_config( - self._path / name, shape=shape, dtype=dtype, **kwargs + self._path / name, shape=shape, dtype=dtype, + version=self.zarr_version, + **kwargs ) else: conf = default_write_config( @@ -318,11 +345,12 @@ def create_array( chunk=zarr_config.chunk, shard=zarr_config.shard, compressor=zarr_config.compressor, - # TODO: implement this - # compressor_opt=ast.literal_eval(zarr_config.compressor_opt), - version=zarr_config.zarr_version, + compressor_opt=zarr_config.compressor_opt, + version=self.zarr_version, ) - conf.update(delete_existing=True, create=True) + if overwrite: + conf.update(delete_existing=True) + conf.update(create=True) arr = ts.open(conf).result() if data is not None: arr[:] = data @@ -357,11 +385,6 @@ def create_array_from_base( arr[:] = data return ZarrTSArray(arr) - def load_metadata(self): - pass - - def save_metadata(self): - pass def make_compressor_v2(name: str | None, **prm: dict) -> dict: @@ -473,6 +496,7 @@ def default_write_config( shard: list[int] | Literal["auto"] | None = None, compressor: str = "blosc", compressor_opt: dict | None = None, + fill_value: Number | None = 0, version: int = 3, ) -> dict: """ @@ -486,6 +510,7 @@ def default_write_config( Shard size. No sharding if `None`. compressor : str Compressor name + fill_value: version : int Zarr version @@ -494,8 +519,6 @@ def default_write_config( config : dict Configuration """ - from upath import UPath - path = UPath(path) if not path.protocol: path = "file://" / path @@ -572,7 +595,7 @@ def default_write_config( "chunk_grid": chunk_grid, "codecs": codecs, "data_type": np.dtype(dtype).name, - "fill_value": 0, + "fill_value": fill_value, "chunk_key_encoding": { "name": "default", "configuration": {"separator": r"/"}, @@ -596,9 +619,9 @@ def default_write_config( chunk[i] = shape[i] metadata = { "chunks": chunk, - "order": "F", + "order": "F" if len(shape) >= 2 else "C", "dtype": np.dtype(dtype).str, - "fill_value": 0, + "fill_value": fill_value, "compressor": compressor, } config = { diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 3defa61c..740df163 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -204,10 +204,7 @@ def create_array( compressor = zarr_config.compressor compressor_opt = zarr_config.compressor_opt chunk, shard = _compute_zarr_layout(shape, dtype, zarr_config) - - if isinstance(compressor_opt, str): - compressor_opt = ast.literal_eval(compressor_opt) - + # TODO: implement fill_value opt = { "chunks": chunk, "shards": shard, diff --git a/linc_convert/utils/io/zarr/metadata.py b/linc_convert/utils/io/zarr/metadata.py new file mode 100644 index 00000000..9835fbc5 --- /dev/null +++ b/linc_convert/utils/io/zarr/metadata.py @@ -0,0 +1,100 @@ +from dataclasses import dataclass, field, fields, replace, asdict +from typing import (Any, Iterable, Iterator, Sequence, Literal, Self, Tuple, Optional, + Mapping) +import json +import os +import tempfile + +JSON = Any + + +@dataclass(frozen=True) +class Metadata: + """Frozen, recursive, JSON-serializable base (like your Metadata).""" + + def to_dict(self) -> dict[str, JSON]: + out: dict[str, JSON] = {} + for f in fields(self): + k = f.name + v = getattr(self, k) + if isinstance(v, Metadata): + out[k] = v.to_dict() + elif isinstance(v, Sequence) and not isinstance(v, (str, bytes, bytearray)): + out[k] = tuple(x.to_dict() if isinstance(x, Metadata) else x for x in v) + else: + out[k] = v + return out + + @classmethod + def from_dict(cls, data: dict[str, JSON]) -> Self: + return cls(**data) # type: ignore[arg-type] + + +@dataclass(frozen=True) +class GroupMetadata(Metadata): + attributes: dict[str, Any] = field(default_factory=dict) + zarr_format: Literal[2, 3] = 3 + node_type: Literal["group"] = field(default="group", init=False) + + # Convenience updaters (immutably return new metadata) + def update_attributes(self, attributes: dict[str, JSON]) -> Self: + return replace(self, attributes=dict(attributes)) + + # ---- I/O helpers for disk persistence ---- + @staticmethod + def _atomic_write(path, data: dict[str, Any]) -> None: + parent = path.parent + parent.mkdir(parents=True, exist_ok=True) + fd, tmp = tempfile.mkstemp(prefix=".meta_tmp_", dir=str(parent)) + try: + with os.fdopen(fd, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, separators=(",", ":")) + f.flush() + os.fsync(f.fileno()) + path.__class__(tmp).replace(path) + finally: + try: + if path.__class__(tmp).exists(): + path.__class__(tmp).unlink() + except Exception: + pass + + @classmethod + def from_files(cls, root: "UPath") -> "GroupMetadata": + # Prefer zarr.json if present; otherwise v2 split files + zarr_json = root / "zarr.json" + if zarr_json.exists(): + with open(zarr_json, "r", encoding="utf-8") as f: + d = json.load(f) + attrs = d.get("attributes", {}) or {} + return cls(attributes=attrs, zarr_format=3) + # v2: .zgroup + .zattrs (attributes may be missing) + zgroup = root / ".zgroup" + zattrs = root / ".zattrs" + zf = 2 + if zgroup.exists(): + with open(zgroup, "r", encoding="utf-8") as f: + g = json.load(f) + zf = g.get("zarr_format", 2) + attrs = {} + if zattrs.exists(): + with open(zattrs, "r", encoding="utf-8") as f: + attrs = json.load(f) + return cls(attributes=attrs, zarr_format=zf) + + def to_files(self, root: "UPath") -> None: + if self.zarr_format == 3: + path = root / "zarr.json" + data = {} + if path.exists(): + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + data["zarr_format"] = 3 + data["node_type"] = "group" + data["attributes"] = self.attributes + self._atomic_write(path, data) + else: + # v2 writes two files + gpath, apath = root / ".zgroup", root / ".zattrs" + self._atomic_write(gpath, {"zarr_format": 2}) + self._atomic_write(apath, dict(self.attributes)) diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index a9b86dc5..1aed0190 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -1,7 +1,7 @@ """Configuration related to output Zarr Archive.""" import logging -from dataclasses import dataclass, replace +from dataclasses import dataclass, field, replace from typing import Annotated, Literal from cyclopts import Parameter @@ -91,7 +91,7 @@ class ZarrConfig: dimension_separator: Literal[".", "/"] = "/" order: Literal["C", "F"] = "C" compressor: Literal["blosc", "zlib", None] = "blosc" - compressor_opt: str = "{}" + compressor_opt: dict[str, float | str] = field(default_factory=dict) no_time: bool = False no_pyramid_axis: Literal["x", "y", "z", None] = None levels: int = -1 From 517a6a6da927a96b84d84c13e8248bf26d99edbd Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 12:33:04 -0400 Subject: [PATCH 154/157] cleanup: remove unused file --- tests/utils/generate_trusted_result.py | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 tests/utils/generate_trusted_result.py diff --git a/tests/utils/generate_trusted_result.py b/tests/utils/generate_trusted_result.py deleted file mode 100644 index 440b6efd..00000000 --- a/tests/utils/generate_trusted_result.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import tempfile -from pathlib import Path - -import test_wk -import zarr - -from linc_convert.modalities.wk import webknossos_annotation - -if __name__ == "__main__": - with tempfile.TemporaryDirectory() as tmp_dir: - test_wk._write_test_data(tmp_dir) - - tmp_dir = Path(tmp_dir) - wkw_dir = str(tmp_dir / "wkw") - ome_dir = str(tmp_dir / "ome") - - basename = os.path.basename(ome_dir)[:-9] - initials = wkw_dir.split("/")[-2][:2] - output_zarr = os.path.join( - tmp_dir, basename + "_dsec_" + initials + ".ome.zarr" - ) - - webknossos_annotation.convert(wkw_dir, ome_dir, tmp_dir, "{}") - zarr.copy_all(zarr.open(output_zarr), zarr.open("data/wk.zarr.zip", "w")) From de8440dc60d5c88ca35d660c914e2e3127f62525 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 12:45:56 -0400 Subject: [PATCH 155/157] docs, style: fix ruff errors --- linc_convert/utils/io/zarr/attributes.py | 23 ++++-- .../utils/io/zarr/drivers/tensorstore.py | 78 ++++++++++--------- .../utils/io/zarr/drivers/zarr_python.py | 1 - linc_convert/utils/io/zarr/metadata.py | 26 +++++-- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/linc_convert/utils/io/zarr/attributes.py b/linc_convert/utils/io/zarr/attributes.py index 48816b3d..5b35bb9e 100644 --- a/linc_convert/utils/io/zarr/attributes.py +++ b/linc_convert/utils/io/zarr/attributes.py @@ -1,13 +1,16 @@ """ +Attributes Handling for Zarr. +This file contains code from the Zarr project +https://github.com/zarr-developers/zarr-python """ -from collections.abc import MutableMapping, Iterator -from typing import Any, Optional import json import os import tempfile import threading +from collections.abc import Iterator, MutableMapping +from typing import Any from upath import UPath @@ -25,7 +28,7 @@ class Attributes(MutableMapping[str, Any]): - .zarr_version (2 or 3) """ - def __init__(self, obj: Any, *, write_through: bool = True) -> None: + def __init__(self, obj: Any, *, write_through: bool = True) -> None: # noqa: ANN401 self._obj = obj self._write_through = write_through self._lock = threading.RLock() @@ -46,13 +49,13 @@ def __init__(self, obj: Any, *, write_through: bool = True) -> None: # ---------- public helpers ---------- def asdict(self) -> dict[str, Any]: + """Return a snapshot of attributes as a dict.""" with self._lock: self._ensure_loaded() return dict(self._attrs) def put(self, d: dict[str, Any]) -> None: - """Overwrite all attributes with d (in-memory), then flush (respecting - write_through).""" + """Overwrite all attributes with d (in-memory), then flush.""" with self._lock: self._ensure_loaded() self._attrs = dict(d) @@ -74,12 +77,14 @@ def refresh(self) -> None: self._ensure_loaded() # ---------- MutableMapping interface ---------- - def __getitem__(self, key: str) -> Any: + def __getitem__(self, key: str) -> Any: # noqa: ANN401 + """Get an attribute by key.""" with self._lock: self._ensure_loaded() return self._attrs[key] - def __setitem__(self, key: str, value: Any) -> None: + def __setitem__(self, key: str, value: Any) -> None: # noqa: ANN401 + """Set or update an attribute.""" with self._lock: self._ensure_loaded() self._attrs[key] = value @@ -87,6 +92,7 @@ def __setitem__(self, key: str, value: Any) -> None: self._flush_locked() def __delitem__(self, key: str) -> None: + """Delete an attribute.""" with self._lock: self._ensure_loaded() del self._attrs[key] @@ -94,11 +100,13 @@ def __delitem__(self, key: str) -> None: self._flush_locked() def __iter__(self) -> Iterator[str]: + """Iterate over a snapshot of keys.""" with self._lock: self._ensure_loaded() return iter(dict(self._attrs)) # iterate over a snapshot def __len__(self) -> int: + """Return number of attributes.""" with self._lock: self._ensure_loaded() return len(self._attrs) @@ -140,6 +148,7 @@ def _flush_locked(self) -> None: def _atomic_json_write(path: UPath, data: dict[str, Any]) -> None: """ Atomically write JSON to 'path' via a temp file + rename. + Works with local and fsspec-backed paths that expose .open / .parent. """ parent = path.parent diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index b3719c00..2608d3f9 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -4,10 +4,8 @@ from numbers import Number from os import PathLike from typing import ( - Any, Iterator, Literal, - Mapping, Optional, Sequence, Tuple, @@ -220,13 +218,14 @@ def open( @property def attrs(self) -> Attributes: - """Access metadata/attributes for this node.""" + """Access attributes for this node.""" if self._attrs is None: self._attrs = Attributes(self, write_through=True) return self._attrs @property def metadata(self) -> GroupMetadata: + """Access metadata for this node.""" if self._metadata is None: self._metadata = GroupMetadata.from_files(self._path) return self._metadata @@ -316,38 +315,47 @@ def create_array( ------- ZarrTSArray """ - # TODO: implement kwargs replacement - - if "chunks" in kwargs: - kwargs["chunk"] = kwargs["chunks"] - del kwargs["chunks"] - if "shards" in kwargs: - kwargs["shard"] = kwargs["shards"] - del kwargs["shards"] - if "compressors" in kwargs: - kwargs["compressor"] = kwargs["compressors"] - del kwargs["compressors"] - if "chunk_key_encoding" in kwargs: - del kwargs["chunk_key_encoding"] - if "fill_value" in kwargs: - del kwargs["fill_value"] - if zarr_config is None: - conf = default_write_config( - self._path / name, shape=shape, dtype=dtype, - version=self.zarr_version, - **kwargs - ) - else: - conf = default_write_config( - self._path / name, - shape=shape, - dtype=dtype, - chunk=zarr_config.chunk, - shard=zarr_config.shard, - compressor=zarr_config.compressor, - compressor_opt=zarr_config.compressor_opt, - version=self.zarr_version, - ) + + def _normalize_keys(d: dict) -> dict: + # map plural/common variants -> canonical keys + mapping = { + "chunks": "chunk", + "shards": "shard", + "compressors": "compressor", + "compressor_opts": "compressor_opt", + } + out = {} + for k, v in d.items(): + if k in ("chunk_key_encoding", "fill_value"): + # explicitly unsupported/ignored + continue + out[mapping.get(k, k)] = v + # drop Nones so we don't pass them through + return {k: v for k, v in out.items() if v is not None} + + # Start with defaults from zarr_config (if provided) + base: dict = {} + if zarr_config is not None: + base = _normalize_keys({ + "chunk": getattr(zarr_config, "chunk", None), + "shard": getattr(zarr_config, "shard", None), + "compressor": getattr(zarr_config, "compressor", None), + "compressor_opt": getattr(zarr_config, "compressor_opt", None), + }) + + # Normalize kwargs and make them override zarr_config-provided defaults + kw = _normalize_keys(kwargs) + merged = {**base, **kw} # kwargs win + + # Build the write config + conf = default_write_config( + self._path / name, + shape=shape, + dtype=dtype, + version=self.zarr_version, + **merged, + ) + if overwrite: conf.update(delete_existing=True) conf.update(create=True) diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 740df163..2fa658f9 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -1,6 +1,5 @@ """ZarrIO Implementation using the zarr-python library.""" -import ast from numbers import Number from typing import ( Any, diff --git a/linc_convert/utils/io/zarr/metadata.py b/linc_convert/utils/io/zarr/metadata.py index 9835fbc5..5f6de7d6 100644 --- a/linc_convert/utils/io/zarr/metadata.py +++ b/linc_convert/utils/io/zarr/metadata.py @@ -1,18 +1,27 @@ -from dataclasses import dataclass, field, fields, replace, asdict -from typing import (Any, Iterable, Iterator, Sequence, Literal, Self, Tuple, Optional, - Mapping) +""" +Metadata handling for Zarr. + +This file contains code from the Zarr project +https://github.com/zarr-developers/zarr-python +""" + import json import os import tempfile +from dataclasses import dataclass, field, fields, replace +from typing import Any, Literal, Self, Sequence + +from upath import UPath JSON = Any @dataclass(frozen=True) class Metadata: - """Frozen, recursive, JSON-serializable base (like your Metadata).""" + """Frozen, recursive, JSON-serializable metadata class.""" def to_dict(self) -> dict[str, JSON]: + """Convert this metadata to a JSON-serializable dict.""" out: dict[str, JSON] = {} for f in fields(self): k = f.name @@ -27,22 +36,27 @@ def to_dict(self) -> dict[str, JSON]: @classmethod def from_dict(cls, data: dict[str, JSON]) -> Self: + """Create an instance from a JSON-serializable dict.""" return cls(**data) # type: ignore[arg-type] @dataclass(frozen=True) class GroupMetadata(Metadata): + """Metadata for a Zarr group, including attributes and format version.""" + attributes: dict[str, Any] = field(default_factory=dict) zarr_format: Literal[2, 3] = 3 node_type: Literal["group"] = field(default="group", init=False) # Convenience updaters (immutably return new metadata) def update_attributes(self, attributes: dict[str, JSON]) -> Self: + """Return a new GroupMetadata with updated attributes.""" return replace(self, attributes=dict(attributes)) # ---- I/O helpers for disk persistence ---- @staticmethod - def _atomic_write(path, data: dict[str, Any]) -> None: + def _atomic_write(path: "UPath", data: dict[str, Any]) -> None: + """Write data to path atomically.""" parent = path.parent parent.mkdir(parents=True, exist_ok=True) fd, tmp = tempfile.mkstemp(prefix=".meta_tmp_", dir=str(parent)) @@ -61,6 +75,7 @@ def _atomic_write(path, data: dict[str, Any]) -> None: @classmethod def from_files(cls, root: "UPath") -> "GroupMetadata": + """Load metadata from the specified root directory.""" # Prefer zarr.json if present; otherwise v2 split files zarr_json = root / "zarr.json" if zarr_json.exists(): @@ -83,6 +98,7 @@ def from_files(cls, root: "UPath") -> "GroupMetadata": return cls(attributes=attrs, zarr_format=zf) def to_files(self, root: "UPath") -> None: + """Write this metadata to the specified root directory.""" if self.zarr_format == 3: path = root / "zarr.json" data = {} From 69ce85cc9682252a17e93898875643d8082a4e78 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 13:37:01 -0400 Subject: [PATCH 156/157] feat: get rid of default zarr-python usage --- .../modalities/wk/webknossos_annotation.py | 2 +- linc_convert/utils/io/zarr/__init__.py | 16 ++- linc_convert/utils/io/zarr/abc.py | 6 - .../utils/io/zarr/drivers/zarr_python.py | 4 - linc_convert/utils/io/zarr/factory.py | 109 ++++++++++-------- linc_convert/utils/zarr_config.py | 4 +- 6 files changed, 76 insertions(+), 65 deletions(-) diff --git a/linc_convert/modalities/wk/webknossos_annotation.py b/linc_convert/modalities/wk/webknossos_annotation.py index 7c392bfa..1ef3faa5 100644 --- a/linc_convert/modalities/wk/webknossos_annotation.py +++ b/linc_convert/modalities/wk/webknossos_annotation.py @@ -170,7 +170,7 @@ def convert( # Write OME-Zarr multiscale metadata print("Write metadata") - omz._get_zarr_python_group().attrs["multiscales"] = omz_data.attrs["multiscales"] + omz.attrs["multiscales"] = omz_data.attrs["multiscales"] def get_mask_name(level: int) -> str: diff --git a/linc_convert/utils/io/zarr/__init__.py b/linc_convert/utils/io/zarr/__init__.py index 16e5038a..531123ed 100644 --- a/linc_convert/utils/io/zarr/__init__.py +++ b/linc_convert/utils/io/zarr/__init__.py @@ -3,20 +3,26 @@ import warnings from .abc import ZarrArray, ZarrGroup, ZarrNode -from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup -from .factory import from_config, open, open_group +from .factory import from_config, open_array, open_group __all__ = [ ZarrArray, ZarrGroup, ZarrNode, - ZarrPythonArray, - ZarrPythonGroup, from_config, - open, + open_array, open_group, ] +try: + import zarr # noqa: F401 + + from .drivers.zarr_python import ZarrPythonArray, ZarrPythonGroup + + __all__ += ['ZarrPythonArray', 'ZarrPythonGroup'] +except ImportError: + warnings.warn("zarr-python is not installed, driver disabled") + try: import tensorstore as TS # noqa: F401 diff --git a/linc_convert/utils/io/zarr/abc.py b/linc_convert/utils/io/zarr/abc.py index c801b694..e019d6a1 100644 --- a/linc_convert/utils/io/zarr/abc.py +++ b/linc_convert/utils/io/zarr/abc.py @@ -22,7 +22,6 @@ import niizarr import numpy as np import tqdm -import zarr from dask import array as da from dask.diagnostics import ProgressBar from nibabel import Nifti1Header, Nifti2Header @@ -151,11 +150,6 @@ def __delitem__(self, key: str) -> None: """Delete a subgroup or array by name within this group.""" ... - @abstractmethod - def _get_zarr_python_group(self) -> zarr.Group: - """Get the underlying Zarr Python group object.""" - ... - @abstractmethod def create_group(self, name: str, overwrite: bool = False) -> "ZarrGroup": """Create or open a subgroup within this group.""" diff --git a/linc_convert/utils/io/zarr/drivers/zarr_python.py b/linc_convert/utils/io/zarr/drivers/zarr_python.py index 2fa658f9..30f68bf5 100644 --- a/linc_convert/utils/io/zarr/drivers/zarr_python.py +++ b/linc_convert/utils/io/zarr/drivers/zarr_python.py @@ -174,10 +174,6 @@ def __getattr__(self, name: str) -> Any: # noqa: ANN401 """Delegate attribute access to the underlying Zarr group.""" return getattr(self._zgroup, name) - def _get_zarr_python_group(self) -> zarr.Group: - """Get the underlying Zarr Python group object.""" - return self._zgroup - def create_group(self, name: str, overwrite: bool = False) -> "ZarrPythonGroup": """Create or open a subgroup within this group.""" subgroup = self._zgroup.create_group(name, overwrite=overwrite) diff --git a/linc_convert/utils/io/zarr/factory.py b/linc_convert/utils/io/zarr/factory.py index 69bdae1c..f1bbc23b 100644 --- a/linc_convert/utils/io/zarr/factory.py +++ b/linc_convert/utils/io/zarr/factory.py @@ -1,29 +1,12 @@ """Factory module for creating/opening Zarr Nodes with different drivers.""" - +import importlib import warnings from os import PathLike from typing import Literal -import zarr - from linc_convert.utils.io.zarr.abc import ZarrGroup, ZarrNode -from linc_convert.utils.io.zarr.drivers.zarr_python import ( - ZarrPythonArray, - ZarrPythonGroup, -) from linc_convert.utils.zarr_config import DriverLike, ZarrConfig -_DRIVER_ARRAY = {"zarr-python": ZarrPythonArray} -_DRIVER_GROUP = {"zarr-python": ZarrPythonGroup} - -try: - from linc_convert.utils.io.zarr.drivers.tensorstore import ZarrTSArray, ZarrTSGroup - - _DRIVER_ARRAY["tensorstore"] = ZarrTSArray - _DRIVER_GROUP["tensorstore"] = ZarrTSGroup -except ImportError as e: - warnings.warn(f"Tensorstore driver not available: {e}.") - class UnsupportedDriverError(ValueError): """Exception raised when an unsupported driver is specified.""" @@ -33,39 +16,69 @@ def __init__(self, driver: DriverLike) -> None: self.driver = driver -def _wrap_array(zarr_array: zarr.Array, driver: DriverLike) -> ZarrNode: - base = ZarrPythonArray(zarr_array) - if driver == "zarr-python": - return base - if driver in _DRIVER_ARRAY and hasattr(_DRIVER_ARRAY[driver], - "from_zarr_python_array"): - return _DRIVER_ARRAY[driver].from_zarr_python_array(base) - raise UnsupportedDriverError(driver) - - -def _wrap_group(zarr_group: zarr.Group, driver: DriverLike) -> ZarrGroup: - base = ZarrPythonGroup(zarr_group) - if driver == "zarr-python": - return base - if driver in _DRIVER_GROUP and hasattr(_DRIVER_GROUP[driver], - "from_zarr_python_group"): - return _DRIVER_GROUP[driver].from_zarr_python_group(base) - raise UnsupportedDriverError(driver) - - -def open( +_DRIVER_ARRAY: dict[str, type] = {} +_DRIVER_GROUP: dict[str, type] = {} + +# name -> (probe_module, array_path, group_path) +# where *_path is "pkg.module:ClassName" +_DRIVERS: dict[str, tuple[str, str, str]] = { + "zarr-python": ( + "zarr", + "linc_convert.utils.io.zarr.drivers.zarr_python:ZarrPythonArray", + "linc_convert.utils.io.zarr.drivers.zarr_python:ZarrPythonGroup", + ), + "tensorstore": ( + "tensorstore", + "linc_convert.utils.io.zarr.drivers.tensorstore:ZarrTSArray", + "linc_convert.utils.io.zarr.drivers.tensorstore:ZarrTSGroup", + ), +} + + +def _import_symbol(path: str) -> type: + """Import a symbol given its full path as 'module:attr'.""" + mod_path, _, attr = path.partition(":") + if not attr: + raise ValueError(f"Expected 'module:attr' path, got {path!r}") + module = importlib.import_module(mod_path) + try: + return getattr(module, attr) + except AttributeError as e: + raise ImportError(f"Cannot import '{attr}' from '{mod_path}'") from e + + +def _register_available_drivers() -> None: + """Populate _DRIVER_ARRAY and _DRIVER_GROUP with available drivers.""" + for name, (probe_mod, array_path, group_path) in _DRIVERS.items(): + if importlib.util.find_spec(probe_mod) is None: + warnings.warn( + f"{name} driver not available: missing dependency '{probe_mod}'.") + continue + try: + arr_cls = _import_symbol(array_path) + grp_cls = _import_symbol(group_path) + except Exception as e: + # If the driver module imports but its own deps fail, surface that clearly. + warnings.warn(f"{name} driver failed to load: {e}") + continue + _DRIVER_ARRAY[name] = arr_cls + _DRIVER_GROUP[name] = grp_cls + + +_register_available_drivers() + + +def open_array( path: str | PathLike[str], mode: Literal["r", "r+", "a", "w", "w-"] = "a", zarr_version: Literal[2, 3] = 3, driver: DriverLike = "zarr-python", ) -> ZarrNode: """Open a Zarr Node (Array or Group) based on the specified driver.""" - node = zarr.open(path, mode=mode, zarr_format=zarr_version) - if isinstance(node, zarr.Array): - return _wrap_array(node, driver) - elif isinstance(node, zarr.Group): - return _wrap_group(node, driver) - raise TypeError(f"Unsupported Zarr node type: {type(node)}") + array_cls = _DRIVER_ARRAY.get(driver) + if array_cls is None: + raise UnsupportedDriverError(driver) + return array_cls.open(path, mode, zarr_version=zarr_version) def open_group( @@ -75,8 +88,10 @@ def open_group( driver: DriverLike = "zarr-python", ) -> ZarrGroup: """Open a Zarr Group based on the specified driver.""" - return _wrap_group(zarr.open_group(path, mode=mode, zarr_format=zarr_version), - driver) + group_cls = _DRIVER_GROUP.get(driver) + if group_cls is None: + raise UnsupportedDriverError(driver) + return group_cls.open(path, mode, zarr_version=zarr_version) def from_config(zarr_config: ZarrConfig) -> ZarrGroup: diff --git a/linc_convert/utils/zarr_config.py b/linc_convert/utils/zarr_config.py index 1aed0190..708e0a85 100644 --- a/linc_convert/utils/zarr_config.py +++ b/linc_convert/utils/zarr_config.py @@ -2,14 +2,14 @@ import logging from dataclasses import dataclass, field, replace -from typing import Annotated, Literal +from typing import Annotated, Literal, TypeAlias from cyclopts import Parameter from typing_extensions import Unpack logger = logging.getLogger(__name__) -DriverLike = Literal["zarr-python", "tensorstore", "zarrita"] +DriverLike: TypeAlias = Literal["zarr-python", "tensorstore", "zarrita"] @Parameter(name="*") From aefbb34eb50a5ee69cc74945babe35b660f50fb9 Mon Sep 17 00:00:00 2001 From: Kaidong Chai Date: Tue, 12 Aug 2025 13:37:13 -0400 Subject: [PATCH 157/157] feat: get rid of default zarr-python usage --- linc_convert/utils/io/zarr/drivers/tensorstore.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/linc_convert/utils/io/zarr/drivers/tensorstore.py b/linc_convert/utils/io/zarr/drivers/tensorstore.py index 2608d3f9..6d8c00b4 100644 --- a/linc_convert/utils/io/zarr/drivers/tensorstore.py +++ b/linc_convert/utils/io/zarr/drivers/tensorstore.py @@ -16,11 +16,9 @@ import numpy as np import tensorstore as ts -import zarr from numpy.typing import ArrayLike, DTypeLike from upath import UPath -from linc_convert.utils.io.zarr import ZarrPythonArray from linc_convert.utils.io.zarr.abc import ZarrArray, ZarrArrayConfig, ZarrGroup from linc_convert.utils.io.zarr.attributes import Attributes from linc_convert.utils.io.zarr.helpers import auto_shard_size, fix_shard_chunk @@ -44,11 +42,6 @@ def __init__(self, ts_array: ts.TensorStore) -> None: self._ts = ts_array self._attrs: Optional[Attributes] = None - @classmethod - def from_zarr_python_array(cls, zarray: ZarrPythonArray) -> "ZarrTSArray": - """Convert a ZarrPythonArray into a ZarrTSArray.""" - return cls.open(zarray.store_path, zarr_version=zarray.zarr_version) - @property def ndim(self) -> int: """Number of dimensions of the array.""" @@ -267,10 +260,6 @@ def __contains__(self, name: str) -> bool: p = self._path / name return p.exists() and bool(_detect_metadata(p)) - def _get_zarr_python_group(self) -> "zarr.Group": - """Get the underlying Zarr Python group object.""" - return zarr.open_group(self._path, mode="a") - def create_group(self, name: str, overwrite: bool = False) -> "ZarrTSGroup": """ Create or open a subgroup within this group.

    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 z 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