Source code for dials.util.image
from __future__ import annotations
import numpy as np
[docs]
class reader:
"""A class to read the CBF files used in DIALS"""
[docs]
def read_file(self, filename):
"""Read the CBF file"""
import pycbf
self.cbf_handle = pycbf.cbf_handle_struct()
self.cbf_handle.read_file(filename, pycbf.MSG_DIGEST)
self.cbf_handle.rewind_datablock()
[docs]
def get_data(self):
"""Get the gain array from the file"""
from scitbx.array_family import flex
# Select the first datablock and rewind all the categories
self.cbf_handle.select_datablock(0)
self.cbf_handle.select_category(0)
self.cbf_handle.select_column(2)
self.cbf_handle.select_row(0)
# Check the type of the element to ensure it's a binary
# otherwise raise an exception
if "bnry" in self.cbf_handle.get_typeofvalue():
# Read the image data into an array
image_string = self.cbf_handle.get_integerarray_as_string()
image = flex.int(np.fromstring(image_string, np.int32))
# Get the array parameters
parameters = self.cbf_handle.get_integerarrayparameters_wdims()
image_size = (parameters[10], parameters[9])
# Resize the image
image.reshape(flex.grid(*image_size))
else:
raise TypeError("Can't find image")
# Return the image
return image
if __name__ == "__main__":
import sys
handle = reader()
handle.read_file(sys.argv[1])
image = handle.get_data()