Skip to content

Commit

Permalink
Allow distance override for multi-panel detectors (cctbx#698)
Browse files Browse the repository at this point in the history
Allow distance override for multi-panel detectors. If a multi-panel detector has a hierarchy, it will have its root node distance set. If there is no hierarchy then each panel will individually have distance set, but only if those panels are coplanar and already at the same distance.
  • Loading branch information
dagewa authored Feb 26, 2024
1 parent d18fde1 commit 8f53e56
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 9 deletions.
1 change: 1 addition & 0 deletions newsfragments/698.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Manual override of the detector distance is now available for multi-panel detectors.
37 changes: 28 additions & 9 deletions src/dxtbx/model/detector_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,15 +303,34 @@ def set_detector_distance(detector, distance):
"""
Set detector origin from distance along normal
"""
assert len(detector) == 1
normal = matrix.col(detector[0].get_normal())
origin = matrix.col(detector[0].get_origin())
d = origin.dot(normal)
x = origin - d * normal
origin = distance * normal + x
fast_axis = detector[0].get_fast_axis()
slow_axis = detector[0].get_slow_axis()
detector[0].set_frame(fast_axis, slow_axis, origin)
# 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())
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)


def get_detector_projection_2d_axes(
Expand Down

0 comments on commit 8f53e56

Please sign in to comment.