diff --git a/src/geomtools/sfx/optimiser.py b/src/geomtools/sfx/optimiser.py
index c0d55c05dc204922976932c7856dd01a8f29010c..f5ae9446ed60f5755e0f513084eb2ec6675646ab 100644
--- a/src/geomtools/sfx/optimiser.py
+++ b/src/geomtools/sfx/optimiser.py
@@ -2,9 +2,9 @@ import argparse
 import pathlib
 import tempfile
 
-from .refine import refine_geometry
-from .crystfelio import extract_geometry, read_crystfel_streamfile
 from ..detector import read_crystfel_geom, write_crystfel_geom
+from .crystfelio import extract_geometry, read_crystfel_streamfile
+from .refine import refine_geometry
 
 
 def refine():
@@ -14,6 +14,8 @@ def refine():
                         help="Crystfel stream file")
     parser.add_argument('-c', '--connected', default="modules",
                         help="Collection of rigid groups to pose")
+    parser.add_argument('-m', '--min-counts', type=int, default=50,
+                        help="Minimum counts per group")
     parser.add_argument('-o', '--output', type=pathlib.Path,
                         default=pathlib.Path("refined.geom"),
                         help="File to store refined geometry")
@@ -35,7 +37,8 @@ def refine():
     fr, pe, la, re, ma = read_crystfel_streamfile(
         stream_filename, panels, args.connected, disp=True)
 
-    panels_new, transform, clen = refine_geometry(ma, panels, 1.0)
+    panels_new, transform, clen = refine_geometry(
+        ma, panels, 1.0, args.min_counts)
 
     with open(args.output.absolute(), "w") as f:
         write_crystfel_geom(f, panels_new, beam, ["modules", "quads"])
diff --git a/src/geomtools/sfx/refine.py b/src/geomtools/sfx/refine.py
index c1d8fb72e81b6141653246bb67462b8cb59ad903..96cc9d1a7e7f6a856ddef829fed8a5088264ad72 100644
--- a/src/geomtools/sfx/refine.py
+++ b/src/geomtools/sfx/refine.py
@@ -1,11 +1,11 @@
 import time
+
 import numpy as np
 import pandas as pd
-
 from natsort import natsorted
 
 
-def refine_geometry(matches, panels, clen_scale=1.,
+def refine_geometry(matches, panels, clen_scale=1., min_counts=50,
                     rigid_group="modules", disp=True):
     transform = {}
     clen = panels.clen[0]
@@ -21,6 +21,8 @@ def refine_geometry(matches, panels, clen_scale=1.,
     groups = matches[columns].groupby(rigid_group)
     for modname, mp in natsorted(groups):
         count = len(mp)
+        if count < min_counts:
+            continue
 
         # AGIPD1M layout
         ss_p = mp.ss_p + (np.round(mp.ss_p) // 64) * 2