Print

Print


Repository : ssh://g18-sc-serv-04.diamond.ac.uk/dials
On branch  : master

>---------------------------------------------------------------

commit 821cc450e40f4518e728537e643e957e2d0e2cd6
Author: dgwaterman <[log in to unmask]>
Date:   Wed Jul 25 15:30:35 2018 +0100

    Merge relevant squashed commits from trim-scan-edge-centroids branch.
    This adds a new option to refinement, default trim_scan_edges=0.0,
    which removes centroids within this angular width in degrees from
    the edges of the scan before refinement. Tests in #457 show that
    this might not improve results for processing small wedge datasets,
    so the default behaviour is left unchanged.


>---------------------------------------------------------------

821cc450e40f4518e728537e643e957e2d0e2cd6
 algorithms/refinement/refiner.py            | 11 +++++++++
 algorithms/refinement/reflection_manager.py | 35 ++++++++++++++++++++++++-----
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/algorithms/refinement/refiner.py b/algorithms/refinement/refiner.py
index 06819de2..5449786a 100644
--- a/algorithms/refinement/refiner.py
+++ b/algorithms/refinement/refiner.py
@@ -390,6 +390,16 @@
       .type = float(value_min = 0)
       .expert_level = 1
 
+    trim_scan_edges = 0.0
+      .help = "Reflections within this value in degrees from the centre of the"
+              "first or last image of the scan will be removed before"
+              "refinement, unless doing so would result in too few remaining"
+              "reflections. Reflections that are truncated at the scan edges"
+              "have poorly-determined centroids and can bias the refined model"
+              "if they are included."
+      .type = float(value_min=0,value_max=1)
+      .expert_level = 1
+
     block_width = 1.0
       .help = "Width of a reflection 'block' (in degrees) determining how fine-"
               "grained the model used for scan-varying prediction during"
@@ -1735,6 +1745,7 @@ def config_refman(params, reflections, experiments, do_stills, verbosity):
             max_sample_size = options.maximum_sample_size,
             min_sample_size = options.minimum_sample_size,
             close_to_spindle_cutoff=options.close_to_spindle_cutoff,
+            trim_scan_edges=options.trim_scan_edges,
             outlier_detector=outlier_detector,
             weighting_strategy_override=weighting_strategy,
             verbosity=verbosity)
diff --git a/algorithms/refinement/reflection_manager.py b/algorithms/refinement/reflection_manager.py
index e7675258..1a928979 100644
--- a/algorithms/refinement/reflection_manager.py
+++ b/algorithms/refinement/reflection_manager.py
@@ -159,6 +159,7 @@ def __init__(self, reflections,
                      max_sample_size=None,
                      min_sample_size=0,
                      close_to_spindle_cutoff=0.02,
+                     trim_scan_edges=0.0,
                      outlier_detector=None,
                      weighting_strategy_override=None,
                      verbosity=0):
@@ -200,11 +201,12 @@ def __init__(self, reflections,
         break
 
     # set up the reflection inclusion criteria
-    self._close_to_spindle_cutoff = close_to_spindle_cutoff #too close to spindle
-    self._outlier_detector = outlier_detector #for outlier rejection
-    self._nref_per_degree = nref_per_degree #random subsets
-    self._max_sample_size = max_sample_size #sample size ceiling
-    self._min_sample_size = min_sample_size #sample size floor
+    self._close_to_spindle_cutoff = close_to_spindle_cutoff # close to spindle
+    self._trim_scan_edges = DEG2RAD * trim_scan_edges # close to the scan edge
+    self._outlier_detector = outlier_detector # for outlier rejection
+    self._nref_per_degree = nref_per_degree # random subsets
+    self._max_sample_size = max_sample_size # sample size ceiling
+    self._min_sample_size = min_sample_size # sample size floor
 
     # exclude reflections that fail some inclusion criteria
     refs_to_keep = self._id_refs_to_keep(reflections)
@@ -350,8 +352,29 @@ def _id_refs_to_keep(self, obs_data):
         raise Sorry("Experiment id {0} contains no reflections with valid "
                     "scan angles".format(iexp))
 
-      # combine tests
+      # combine tests so far
       to_update = passed1 & passed2
+
+      # third test: reject reflections close to the centres of the first and
+      # last images in the scan
+      if self._trim_scan_edges > 0.0:
+        edge1, edge2 = [e + 0.5 for e in exp.scan.get_image_range()]
+        edge1 = exp.scan.get_angle_from_image_index(edge1, deg=False)
+        edge1 += (self._trim_scan_edges)
+        edge2 = exp.scan.get_angle_from_image_index(edge2, deg=False)
+        edge2 -= (self._trim_scan_edges)
+        passed3 = ((edge1 <= phi) & (phi <= edge2))
+
+        # combine the last test only if there would be a reasonable number of
+        # reflections left for refinement
+        tmp = to_update
+        to_update = to_update & passed3
+        if to_update.count(True) < 40:
+          logger.warning("Too few reflections to trim centroids from the scan "
+            "edges. Resetting trim_scan_edges=0.0")
+          to_update = tmp
+
+      # make selection
       to_keep.set_selected(sel, to_update)
 
     inc = inc.select(to_keep)


########################################################################

To unsubscribe from the DIALS-COMMIT list, click the following link:
https://www.jiscmail.ac.uk/cgi-bin/webadmin?SUBED1=DIALS-COMMIT&A=1