From ce07f4c6f4bca8380fa106cabe4847e4152dcb8a Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Thu, 15 Aug 2024 10:41:40 +0200
Subject: [PATCH] Added mip convenience function

---
 model_server/base/accessors.py |  9 +++++++++
 tests/base/test_accessors.py   | 11 +++++++++++
 2 files changed, 20 insertions(+)

diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py
index 7fc28bb3..f7d076fa 100644
--- a/model_server/base/accessors.py
+++ b/model_server/base/accessors.py
@@ -51,6 +51,9 @@ class GenericImageDataAccessor(ABC):
 
 
     def get_zi(self, zi: int):
+        """
+        Return a new accessor of a specific z-coordinate
+        """
         return self._derived_accessor(
             self.data.take(
                 indices=[zi],
@@ -58,6 +61,12 @@ class GenericImageDataAccessor(ABC):
             )
         )
 
+    def get_mip(self):
+        """
+        Return a new accessor of maximum intensity projection (MIP) along z-axis
+        """
+        return self.apply(lambda x: x.max(axis=self._ga('Z'), keepdims=True))
+
 
     def get_mono(self, channel: int, mip: bool = False, squeeze=False):
         return self.get_channels([channel], mip=mip)
diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py
index b4203070..d72e5ca1 100644
--- a/tests/base/test_accessors.py
+++ b/tests/base/test_accessors.py
@@ -73,6 +73,17 @@ class TestCziImageFileAccess(unittest.TestCase):
 
         self.assertTrue(np.all(sz.data[:, :, :, 0] == cf.data[:, :, :, zi]))
 
+    def test_get_mip(self):
+        w = 256
+        h = 512
+        nc = 4
+        nz = 11
+        zi = 5
+        cf = InMemoryDataAccessor(_random_int(h, w, nc, nz))
+        sm = cf.get_mip()
+        self.assertEqual(sm.shape_dict['Z'], 1)
+        self.assertTrue(np.all(cf.data.max(axis=-1, keepdims=True) == sm.data))
+
     def test_crop_yx(self):
         w = 256
         h = 512
-- 
GitLab