From ef3363b7251e5658878aad67118fa491672d48e3 Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Fri, 2 Feb 2024 15:19:52 +0100
Subject: [PATCH] Some test coverage, those that are failing are because of
 issues propagating nested parameters to pydantic models

---
 model_server/extensions/chaeo/params.py            |  2 +-
 model_server/extensions/chaeo/tests/test_zstack.py |  9 ++++-----
 model_server/extensions/chaeo/zmask.py             | 13 +++++++------
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/model_server/extensions/chaeo/params.py b/model_server/extensions/chaeo/params.py
index e9fc2461..9146d435 100644
--- a/model_server/extensions/chaeo/params.py
+++ b/model_server/extensions/chaeo/params.py
@@ -28,7 +28,7 @@ class RoiFilter(BaseModel):
 
 class RoiSetMetaParams(BaseModel):
     mask_type: str = 'boxes'
-    filters: RoiFilter = {}
+    filters: Union[RoiFilter, None] = None
     expand_box_by: List[int] = [128, 0]
 
 
diff --git a/model_server/extensions/chaeo/tests/test_zstack.py b/model_server/extensions/chaeo/tests/test_zstack.py
index cc4c0eb0..0287c68b 100644
--- a/model_server/extensions/chaeo/tests/test_zstack.py
+++ b/model_server/extensions/chaeo/tests/test_zstack.py
@@ -5,7 +5,7 @@ import numpy as np
 from model_server.conf.testing import output_path
 
 from model_server.extensions.chaeo.conf.testing import multichannel_zstack, pixel_classifier, pipeline_params
-from extensions.chaeo import RoiSetExportParams, RoiSetMetaParams
+from extensions.chaeo.params import RoiSetExportParams, RoiSetMetaParams
 from model_server.extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack
 from model_server.extensions.chaeo.workflows import infer_object_map_from_zstack
 from model_server.extensions.chaeo.zmask import build_zmask_from_object_mask
@@ -42,8 +42,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase):
         zmask, meta, df, interm = build_zmask_from_object_mask(
             self.seg_mask,
             self.stack_ch_pa,
-            mask_type=mask_type,
-            **kwargs,
+            params=RoiSetMetaParams(mask_type=mask_type, **kwargs),
         )
         zmask_acc = InMemoryDataAccessor(zmask)
         self.assertTrue(zmask_acc.is_mask())
@@ -75,7 +74,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase):
         zmask, meta, df, interm = build_zmask_from_object_mask(
             self.seg_mask,
             acc_zstack_slice,
-            mask_type='boxes',
+            params=RoiSetMetaParams(mask_type='boxes'),
             **kwargs,
         )
         zmask_acc = InMemoryDataAccessor(zmask)
@@ -119,7 +118,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase):
         zmask, meta, df, interm = build_zmask_from_object_mask(
             self.seg_mask,
             self.stack_ch_pa,
-            mask_type='boxes',
+            params=RoiSetMetaParams(mask_type='boxes')
         )
 
         from model_server.extensions.chaeo.zmask import project_stack_from_focal_points
diff --git a/model_server/extensions/chaeo/zmask.py b/model_server/extensions/chaeo/zmask.py
index 30ecabe8..380f7b7d 100644
--- a/model_server/extensions/chaeo/zmask.py
+++ b/model_server/extensions/chaeo/zmask.py
@@ -9,7 +9,7 @@ from sklearn.linear_model import LinearRegression
 
 from model_server.extensions.chaeo.annotators import draw_boxes_on_3d_image
 from model_server.extensions.chaeo.products import export_patches_from_zstack, export_multichannel_patches_from_zstack, export_patch_masks_from_zstack, get_patches_from_zmask_meta, get_patch_masks_from_zmask_meta
-from extensions.chaeo import RoiSetMetaParams, RoiSetExportParams
+from extensions.chaeo.params import RoiSetMetaParams, RoiSetExportParams
 from model_server.extensions.chaeo.process import mask_largest_object
 from model_server.base.accessors import GenericImageDataAccessor, InMemoryDataAccessor, write_accessor_data_to_file
 from model_server.base.models import InstanceSegmentationModel
@@ -130,16 +130,17 @@ class RoiSet(object):
 def build_zmask_from_object_mask(
         obmask: GenericImageDataAccessor,
         zstack: GenericImageDataAccessor,
-        params: RoiSetMetaParams,
+        params: RoiSetMetaParams = RoiSetMetaParams(),
 ):
     """
     Given a 2D mask of objects, build a 3D mask, where each object's z-position is determined by the index of
     maximum intensity in z.  Return this zmask and a list of each object's meta information.
-    :param obmask: GenericImageDataAccessor monochrome 2D inary mask of objects
+    :param obmask: GenericImageDataAccessor monochrome 2D binary mask of objects
     :param zstack: GenericImageDataAccessor monochrome zstack of same Y, X dimension as obmask
-    :param filters: dictionary of form {attribute: (min, max)}; valid attributes are 'area' and 'solidity'
-    :param mask_type: if 'boxes', zmask is True in each object's complete bounding box; otherwise 'contours'
-    :param expand_box_by: (xy, z) expands bounding box by (xy, z) pixels except where this hits a boundary
+    :param params: RoiSetMetaParams
+        filters: dictionary of form {attribute: (min, max)}; valid attributes are 'area' and 'solidity'
+        mask_type: if 'boxes', zmask is True in each object's complete bounding box; otherwise 'contours'
+        expand_box_by: (xy, z) expands bounding box by (xy, z) pixels except where this hits a boundary
     :return: tuple (zmask, meta)
         np.ndarray:
             boolean mask of same size as stack
-- 
GitLab