diff --git a/model_server/extensions/chaeo/tests/test_zstack.py b/model_server/extensions/chaeo/tests/test_zstack.py index aa4deb861a35c242779a18ec8dece4abc5098cb9..70daa788a41ae3d2b31667012fb0512a6cfd681b 100644 --- a/model_server/extensions/chaeo/tests/test_zstack.py +++ b/model_server/extensions/chaeo/tests/test_zstack.py @@ -123,7 +123,7 @@ class TestZStackDerivedDataProducts(unittest.TestCase): id_map = get_label_ids(self.seg_mask) roiset = RoiSet(id_map, self.stack_ch_pa, params=RoiSetMetaParams(mask_type='boxes')) - df = roiset.get_df(filters=None) + df = roiset.get_df() 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 9034e1ce0cb389818bee3240a17e2e81f809ece3..37996a0d96b425edf5acc79d407c1397bd316cd5 100644 --- a/model_server/extensions/chaeo/zmask.py +++ b/model_server/extensions/chaeo/zmask.py @@ -67,13 +67,16 @@ class RoiSet(object): self.acc_obj_ids = acc_obj_ids self.acc_raw = acc_raw - self._df = self.make_df(self.acc_raw, self.acc_obj_ids) + self._df = self.filter_df( + self.make_df(self.acc_raw, self.acc_obj_ids), + params.filters, + ) # remaining zmask_meta write ops self.zmask_meta, _, self.interm = build_zmask_from_object_mask( acc_obj_ids, acc_raw, - self.get_df(filters=params.filters), + self.get_df(), params=params, ) @@ -100,7 +103,8 @@ class RoiSet(object): df['zi'] = df['intensity_mean'].round().astype('int') return df - def get_df(self, filters: RoiFilter = None) -> pd.DataFrame: + @staticmethod + def filter_df(df: pd.DataFrame, filters: RoiFilter = None) -> pd.DataFrame: query_str = 'label > 0' # always true if filters is not None: # parse filters for k, val in filters.dict(exclude_unset=True).items(): @@ -110,7 +114,10 @@ class RoiSet(object): assert vmin >= 0 query_str = query_str + f' & {k} > {vmin} & {k} < {vmax}' # df.loc[df.query(query_str).index, 'keeper'] = True - return self._df.loc[self._df.query(query_str).index, :] + return df.loc[df.query(query_str).index, :] + + def get_df(self) -> pd.DataFrame: + return self._df def add_df_col(self, name, se: pd.Series) -> None: self._df[name] = se @@ -160,7 +167,7 @@ class RoiSet(object): def get_slices(self): return [zm.slice for zm in self.zmask_meta] - def get_zmask(self, mask_type='boxes', filters: RoiFilter = None): + def get_zmask(self, mask_type='boxes'): """ Return a mask of same dimensionality as raw data @@ -174,7 +181,7 @@ class RoiSet(object): # make an object map where label is replaced by focus position in stack and background is -1 lut = np.zeros(lamap.max() + 1) - 1 - df = self.get_df(filters=filters) + df = self.get_df() lut[df.label] = df.zi if mask_type == 'contours': @@ -197,7 +204,7 @@ class RoiSet(object): return zi_st - def classify_by(self, channel, object_classification_model: InstanceSegmentationModel, filters: RoiFilter = None): + def classify_by(self, channel, object_classification_model: InstanceSegmentationModel, ): # adds a column to self._df # do this on a patch basis, i.e. only one object per frame obmap_patches = object_classification_model.label_instance_class( @@ -209,7 +216,7 @@ class RoiSet(object): om = np.zeros(lamap.shape, dtype=lamap.dtype) # self.df['instance_class'] = np.nan - df = self.get_df(filters=filters) + df = self.get_df() idx = df.index se = pd.Series(data=np.nan, index=idx)