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