From 7c573b699cb2a28467b3eccadbcf5d7bd0f25926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Al=C3=A1n=20Mu=C3=B1oz?= <amuoz@ed.ac.uk> Date: Tue, 17 May 2022 17:49:41 +0100 Subject: [PATCH] update image calls --- aliby/pipeline.py | 5 ++-- aliby/tile/tiler.py | 60 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/aliby/pipeline.py b/aliby/pipeline.py index a3bdec83..65d36944 100644 --- a/aliby/pipeline.py +++ b/aliby/pipeline.py @@ -30,7 +30,8 @@ from aliby.experiment import MetaData from aliby.haystack import initialise_tf from aliby.baby_client import BabyRunner, BabyParameters from aliby.tile.tiler import Tiler, TilerParameters -from aliby.io.omero import Dataset, Image +from aliby.io.omero import Dataset +from aliby.io.image import Image from agora.abc import ParametersABC, ProcessABC from agora.io.writer import TilerWriter, BabyWriter, StateWriter, LinearBabyWriter from agora.io.reader import StateReader @@ -587,7 +588,7 @@ class Pipeline(ProcessABC): > es_parameters["thresh_trap_ncells"] ) traps_above_athresh = ( - cells_used.groupby("trap").sum().apply(np.mean, axis=1) / tile_size ** 2 + cells_used.groupby("trap").sum().apply(np.mean, axis=1) / tile_size**2 > es_parameters["thresh_trap_area"] ) diff --git a/aliby/tile/tiler.py b/aliby/tile/tiler.py index c77d79e8..87ccf247 100644 --- a/aliby/tile/tiler.py +++ b/aliby/tile/tiler.py @@ -139,10 +139,54 @@ class TilerParameters(ParametersABC): _defaults = {"tile_size": 117, "ref_channel": "Brightfield", "ref_z": 0} +class TilerABC(ProcessABC): + """ + Base class for different types of Tilers. + """ + + def __init__(parameters): + super().__init__(parameters) + + @staticmethod + def ifoob_pad(full, slices): # TODO Remove when inheriting TilerABC + """ + Returns the slices padded if it is out of bounds + + Parameters: + ---------- + full: (zstacks, max_size, max_size) ndarray + Entire position with zstacks as first axis + slices: tuple of two slices + Each slice indicates an axis to index + + + Returns + Trap for given slices, padded with median if needed, or np.nan if the padding is too much + """ + max_size = full.shape[-1] + + y, x = [slice(max(0, s.start), min(max_size, s.stop)) for s in slices] + trap = full[:, y, x] + + padding = np.array( + [(-min(0, s.start), -min(0, max_size - s.stop)) for s in slices] + ) + if padding.any(): + tile_size = slices[0].stop - slices[0].start + if (padding > tile_size / 4).any(): + trap = np.full((full.shape[0], tile_size, tile_size), np.nan) + else: + + trap = np.pad(trap, [[0, 0]] + padding.tolist(), "median") + + return trap + + class Tiler(ProcessABC): - """A dummy TimelapseTiler object fora Dask Demo. + """Remote Timelapse Tiler. - Does trap finding and image registration.""" + Does trap finding and image registration. Fetches images from as erver + """ def __init__( self, @@ -157,6 +201,14 @@ class Tiler(ProcessABC): self.ref_channel = self.get_channel_index(parameters.ref_channel) self.trap_locs = trap_locs + try: + self.z_perchannel = { + ch: metadata["zsectioning/nsections"] if zsect else 1 + for zsect, ch in zip(metadata["channels"], metadata["channels/zsect"]) + } + except Exception as e: + print(f"Warning:Tiler: No z_perchannel data: {e}") + @classmethod def from_image(cls, image, parameters: TilerParameters): return cls(image.data, image.metadata, parameters) @@ -166,6 +218,8 @@ class Tiler(ProcessABC): trap_locs = TrapLocations.read_hdf5(filepath) metadata = load_attributes(filepath) metadata["channels"] = image.metadata["channels"] + # metadata["zsectioning/nsections"] = image.metadata["zsectioning/nsections"] + # metadata["channels/zsect"] = image.metadata["channels/zsect"] if parameters is None: parameters = TilerParameters.default() @@ -259,7 +313,7 @@ class Tiler(ProcessABC): return ndtrap @staticmethod - def ifoob_pad(full, slices): + def ifoob_pad(full, slices): # TODO Remove when inheriting TilerABC """ Returns the slices padded if it is out of bounds -- GitLab