Skip to content

Commit

Permalink
FullCBFWriter: Fix bug causing panel shuffling (cctbx#752)
Browse files Browse the repository at this point in the history
  • Loading branch information
ndevenish committed Aug 22, 2024
1 parent 629e4f9 commit 7ab9f8c
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
1 change: 1 addition & 0 deletions newsfragments/752.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Stop ``dxtbx.image_average`` shuffling panel positions for segmented detectors.
15 changes: 12 additions & 3 deletions src/dxtbx/format/cbf_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ def level_string(key):
detector_axes_names = [] # save these for later
panelkeys = []
panelnames = []
panelindices = []

def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
# Set up CBF axis names, including equipment components and depends_on chains
Expand All @@ -230,6 +231,8 @@ def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
panelname = "PANEL_%d" % panel_id
panelkeys.append(key)
panelnames.append(panelname)
dxtbx_panel_index = list(detector).index(node)
panelindices.append(dxtbx_panel_index)
panel_id += 1

if len(key) == 1:
Expand All @@ -253,6 +256,11 @@ def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
return panel_id

recursive_setup_basis_dict((0,))
# The order `recursive_setup_basis_dict` visits panels does not necessarily match
# the order returned by dxtbx's `get_detector` and `get_raw_data`.
# See https://github.com/cctbx/dxtbx/issues/745.
self.panelindices = panelindices # needed in add_data_to_cbf
sorted_panels = [detector[i] for i in panelindices]

if index is None:
cbf_root = self.imageset.paths()[0]
Expand Down Expand Up @@ -327,7 +335,7 @@ def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
# defined as [min-trusted-value, max-trusted-value]. The CBF definition
# of 'overload' is in fact saturation - i.e. the max-trusted-value, while
# the undefined_value is below the min-trusted-value.
trusted_ranges = [panel.get_trusted_range() for panel in detector]
trusted_ranges = [panel.get_trusted_range() for panel in sorted_panels]
try:
add_frame_specific_cbf_tables(
cbf,
Expand All @@ -336,7 +344,7 @@ def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
trusted_ranges,
diffrn_id,
False,
gain=[panel.get_gain() for panel in detector],
gain=[panel.get_gain() for panel in sorted_panels],
flux=beam.get_flux(),
)
except TypeError:
Expand All @@ -348,7 +356,7 @@ def recursive_setup_basis_dict(key, parent_name="", panel_id=0):
trusted_ranges,
diffrn_id,
False,
gain=[panel.get_gain() for panel in detector],
gain=[panel.get_gain() for panel in sorted_panels],
)

"""Data items in the AXIS category record the information required
Expand Down Expand Up @@ -596,6 +604,7 @@ def add_data_to_cbf(self, cbf, index=None, data=None, verbose=False):
data = self.imageset.get_raw_data(index)
if not isinstance(data, tuple):
data = (data,)
data = tuple([data[i] for i in self.panelindices])

array_names = []
cbf.find_category(b"diffrn_data_frame")
Expand Down

0 comments on commit 7ab9f8c

Please sign in to comment.