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)