Source code for ewoksmx.utils.xds_utils
from ewoksmx.config.instrument_config import InstrumentConfigRegistry
[docs]
def generate_xdsinp(job_list, master_path, metadata):
"""
This method creates a list of XDS.INP commands
"""
data_collection = metadata["data_collection"]
name_template = str(master_path).replace("_master.h5", "_??????.h5")
beam_position_x = data_collection["beam_position_x"]
beam_position_y = data_collection["beam_position_y"]
detector_distance = data_collection["detector_distance"]
wavelength = data_collection["wavelength"]
oscillation_width = data_collection["oscillation_width"]
# Config values
app_config = InstrumentConfigRegistry.load()
beamline = data_collection["beamline"]
config = getattr(app_config, beamline)
pixel_size_x = config.detector.pixel_size_x
pixel_size_y = config.detector.pixel_size_y
# Creation of XDS.INP
list_xdsinp = [
f"JOB= {','.join(job_list)}",
f"NAME_TEMPLATE_OF_DATA_FRAMES= {name_template}",
f"LIB= {config.grenades_fastproc.hdf5_lib_path}",
f"DIRECTION_OF_DETECTOR_X-AXIS={config.geometry.detector_x_axis}",
f"DIRECTION_OF_DETECTOR_Y-AXIS={config.geometry.detector_y_axis}",
f"ROTATION_AXIS={config.geometry.rotation_axis}",
f"INCIDENT_BEAM_DIRECTION={config.geometry.incident_beam_direction}",
f"NX={config.detector.nx}",
f"NY={config.detector.ny}",
f"QX={pixel_size_x}",
f"QY={pixel_size_y}",
f"ORGX={beam_position_x} ORGY={beam_position_y}",
f"DETECTOR={config.detector.xds_name} "
# + f"MINIMUM_VALID_PIXEL_VALUE={config.detector.minimum_valid_pixel_value} "
+ f"OVERLOAD={config.detector.overload}",
f"SENSOR_THICKNESS={config.detector.sensor_thickness}",
f"TRUSTED_REGION={config.detector.trusted_region[0]} "
+ f"{config.detector.trusted_region[1]}",
f"DETECTOR_DISTANCE={detector_distance}",
f"X-RAY_WAVELENGTH={wavelength}",
f"OSCILLATION_RANGE={oscillation_width}",
"INDEX_QUALITY= 0.25",
"MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT= 5",
"INCLUDE_RESOLUTION_RANGE= 50 3.5",
]
for tr in config.detector.untrusted_rectangle:
list_xdsinp.append(f"UNTRUSTED_RECTANGLE={tr[0]} {tr[1]} {tr[2]} {tr[3]}")
# Background and data range from subwedge information
list_xdsinp += ["BACKGROUND_RANGE= 1 40"]
list_xdsinp += ["DATA_RANGE= 1 10"]
# if "spaceGroupNumber" in in_data:
# spaceGroupNumber = in_data["spaceGroupNumber"]
# cell = in_data["cell"]
# unitCellConstants = "{a} {b} {c} {alpha} {beta} {gamma}".format(**cell)
# listXDS_INP += [
# "SPACE_GROUP_NUMBER={0}".format(spaceGroupNumber),
# "UNIT_CELL_CONSTANTS={0}".format(unitCellConstants),
# ]
# list_image_range = []
# list_subwedge = in_data["subwedge"]
# rotation_axis_start = min(item["axis_start"] for item in list_subwedge)
# listXDS_INP += (f"STARTING_ANGLE={rotation_axis_start}",)
# for subwedge in list_subwedge:
# axis_start = subwedge["axis_start"]
# axis_end = subwedge["axis_end"]
# image_number_start = (
# int((axis_start - rotation_axis_start) / oscillation_width) + 1
# )
# image_number_end = int((axis_end - rotation_axis_start) / oscillation_width)
# list_image_range.append([image_number_start, image_number_end])
# listXDS_INP += [f"SPOT_RANGE= {image_number_start} {image_number_end}"]
# listXDS_INP += [
# f"DATA_RANGE= {list_image_range[0][0]} {list_image_range[-1][1]}"
# ]
# for index, image_range in enumerate(list_image_range[:-1]):
# exclude_start = list_image_range[index][1] + 1
# exclude_end = list_image_range[index + 1][0] - 1
# listXDS_INP += [f"EXCLUDE_DATA_RANGE= {exclude_start} {exclude_end}"]
# if config.get("XDS", "LIB"):
# modules = config.get("XDS", "modules")
# lib_filename = config.get("XDS", "LIB")
# lib_path = UtilsPath.find_ld_library_path(modules, lib_filename)
# listXDS_INP += [f"LIB= {lib_path}"]
return list_xdsinp