diff --git a/src/cal_tools/agipdlib.py b/src/cal_tools/agipdlib.py
index 88c3413cc623efda893852293865abc2b90db701..2f4046a6c88193319545e9102b7d704a57cae8fc 100644
--- a/src/cal_tools/agipdlib.py
+++ b/src/cal_tools/agipdlib.py
@@ -53,12 +53,19 @@ class AgipdCtrl:
         self.ctrl_src = ctrl_src
         self.raise_error = raise_error
 
-    def get_num_cells(self) -> Optional[int]:
-        """Read number of memory cells from fast data.
+    def _get_num_cells_ctrl(self) -> Optional[int]:
+        """Get number of cells from CONTROL source."""
+        # Attempt to look for number of cells in slow data
+        ncell_src = (
+            self.ctrl_src, "bunchStructure.nPulses.value")
+        if (
+            ncell_src[0] in self.run_dc.all_sources and
+            ncell_src[1] in self.run_dc.keys_for_source(ncell_src[0])
+        ):
+            return int(self.run_dc[ncell_src].as_single_value(reduce_by='max'))
 
-        :return mem_cells: Number of memory cells
-        return None, if no data available.
-        """
+    def _get_num_cells_instr(self) -> Optional[int]:
+        """Get number of cells from INSTRUMENT source."""
         cells = np.squeeze(
             self.run_dc[
                 self.image_src, "image.cellId"].drop_empty_trains().ndarray()
@@ -70,6 +77,20 @@ class AgipdCtrl:
         dists = [abs(o - maxcell) for o in options]
         return options[np.argmin(dists)]
 
+    def get_num_cells(self) -> Optional[int]:
+        """Read number of memory cells from fast data.
+
+        :return mem_cells: Number of memory cells
+        return None, if no data available.
+        """
+        ncell = self._get_num_cells_ctrl()
+        if ncell is not None:
+            return ncell
+        # The method implemented in this function doesn't suit for filtered
+        # data. If DAQ filters data and the last cell is removed, the
+        # function returns wrong value
+        return self._get_num_cells_instr()
+
     def _get_acq_rate_ctrl(self) -> Optional[float]:
         """Get acquisition (repetition) rate from CONTROL source."""
         # Attempt to look for acquisition rate in slow data
@@ -83,9 +104,6 @@ class AgipdCtrl:
             # about bucketing the rate for managing meta-data.
             return round(float(self.run_dc[rep_rate_src].as_single_value()), 1)
 
-    def _get_acq_rate_instr(self) -> Optional[float]:
-        """Get acquisition (repetition rate) from INSTRUMENT source."""
-
     def _get_acq_rate_instr(self) -> Optional[float]:
         """Get acquisition (repetition rate) from INSTRUMENT source."""