diff --git a/newsfragments/699.bugfix b/newsfragments/699.bugfix new file mode 100644 index 000000000..66e598963 --- /dev/null +++ b/newsfragments/699.bugfix @@ -0,0 +1 @@ +Fix bug when setting the distance for single panel detectors that have a hierarchy. diff --git a/src/dxtbx/model/detector_helpers.py b/src/dxtbx/model/detector_helpers.py index 3240caf7e..5810638d7 100644 --- a/src/dxtbx/model/detector_helpers.py +++ b/src/dxtbx/model/detector_helpers.py @@ -303,34 +303,31 @@ def set_detector_distance(detector, distance): """ Set detector origin from distance along normal """ - # If the detector has a hierarchy, just update the root note - try: - h = detector.hierarchy() - normal = matrix.col(h.get_normal()) - origin = matrix.col(h.get_origin()) + panels = list(detector) + if len(panels) > 1: + # If a multi-panel detector has a hierarchy, we will just update the + # root note. Otherwise check that all panels are at the same distance + # and share the same normal vector + try: + panels = [ + detector.hierarchy(), + ] + except AttributeError: + dists = [p.get_distance() for p in panels] + norm_vecs = [p.get_normal() for p in panels] + assert all(v == norm_vecs[0] for v in norm_vecs[1:]) and all( + d == dists[0] for d in dists + ) + + for panel in panels: + normal = matrix.col(panel.get_normal()) + origin = matrix.col(panel.get_origin()) d = origin.dot(normal) x = origin - d * normal origin = distance * normal + x - fast_axis = h.get_fast_axis() - slow_axis = h.get_slow_axis() - h.set_frame(fast_axis, slow_axis, origin) - except AttributeError: - # Check all panels are at the same distance and share the same normal - dists = [p.get_distance() for p in detector] - norm_vecs = [p.get_normal() for p in detector] - assert all(v == norm_vecs[0] for v in norm_vecs[1:]) and all( - d == dists[0] for d in dists - ) - - for panel in detector: - normal = matrix.col(panel.get_normal()) - origin = matrix.col(panel.get_origin()) - d = origin.dot(normal) - x = origin - d * normal - origin = distance * normal + x - fast_axis = panel.get_fast_axis() - slow_axis = panel.get_slow_axis() - panel.set_frame(fast_axis, slow_axis, origin) + fast_axis = panel.get_fast_axis() + slow_axis = panel.get_slow_axis() + panel.set_frame(fast_axis, slow_axis, origin) def get_detector_projection_2d_axes(