This documentation page refers to a previous release of DIALS (1.14).
Click here to go to the corresponding page for the latest version of DIALS

Source code for dxtbx.serialize.imageset

#!/usr/bin/env python
#
# dxtbx.serialize.imageset.py
#
#  Copyright (C) 2013 Diamond Light Source
#
#  Author: James Parkhurst
#
#  This code is distributed under the BSD license, a copy of which is
#  included in the root directory of this package.
from __future__ import absolute_import, division


[docs]def filename_to_absolute(filename): """ Convert filenames to absolute form. """ from os.path import abspath if isinstance(filename, list): return [abspath(f) for f in filename] return abspath(filename)
[docs]def filename_or_none(filename): if filename is None or filename == "": return None return filename_to_absolute(filename)
[docs]def basic_imageset_to_dict(imageset): """Convert an imageset to a dictionary Params: imageset The imageset Returns: A dictionary of the parameters """ from libtbx.containers import OrderedDict # Return the dictionary representation return OrderedDict( [ ("__id__", "imageset"), ("filenames", filename_to_absolute(imageset.paths())), ("mask", filename_or_none(imageset.external_lookup.mask.filename)), ("gain", filename_or_none(imageset.external_lookup.gain.filename)), ("pedestal", filename_or_none(imageset.external_lookup.pedestal.filename)), ("beam", imageset.get_beam(0).to_dict()), ("detector", imageset.get_detector(0).to_dict()), ] )
[docs]def imagesweep_to_dict(sweep): """Convert a sweep to a dictionary Params: sweep The sweep Returns: A dictionary of the parameters """ from libtbx.containers import OrderedDict # Return the dictionary representation return OrderedDict( [ ("__id__", "imageset"), ("template", filename_to_absolute(sweep.get_template())), ("mask", filename_or_none(sweep.external_lookup.mask.filename)), ("gain", filename_or_none(sweep.external_lookup.gain.filename)), ("pedestal", filename_or_none(sweep.external_lookup.pedestal.filename)), ("beam", sweep.get_beam().to_dict()), ("detector", sweep.get_detector().to_dict()), ("goniometer", sweep.get_goniometer().to_dict()), ("scan", sweep.get_scan().to_dict()), ] )
[docs]def imageset_to_dict(imageset): """Convert the imageset to a dictionary Params: imageset The imageset Returns: A dictionary of the parameters """ from dxtbx.imageset import ImageSet, ImageSweep from dxtbx.format.image import ImageBool, ImageDouble # If this is an imageset then return a list of filenames if isinstance(imageset, ImageSweep): return imagesweep_to_dict(imageset) elif isinstance(imageset, ImageSet): return basic_imageset_to_dict(imageset) else: raise TypeError("Unknown ImageSet Type")
[docs]def basic_imageset_from_dict(d, directory=None): """ Construct an ImageSet class from the dictionary.""" from dxtbx.model import BeamFactory, DetectorFactory from dxtbx.imageset import ImageSetFactory from dxtbx.serialize.filename import load_path # Get the filename list and create the imageset filenames = map( lambda p: load_path(p, directory=directory), map(str, d["filenames"]) ) imageset = ImageSetFactory.new(filenames)[0] # Set some external lookups if "mask" in d and d["mask"] is not None and d["mask"] is not "": path = load_path(d["mask"], directory=directory) with open(path) as infile: imageset.external_lookup.mask.filename = path imageset.external_lookup.mask.data = ImageBool(pickle.load(infile)) if "gain" in d and d["gain"] is not None and d["gain"] is not "": path = load_path(d["gain"], directory=directory) with open(path) as infile: imageset.external_lookup.gain.filename = path imageset.external_lookup.gain.data = ImageDouble(pickle.load(infile)) if "pedestal" in d and d["pedestal"] is not None and d["pedestal"] is not "": path = load_path(d["pedestal"], directory=directory) with open(path) as infile: imageset.external_lookup.pedestal.filename = path imageset.external_lookup.pedestal.data = ImageDouble(pickle.load(infile)) # Get the existing models as dictionaries beam_dict = imageset.get_beam(0).to_dict() detector_dict = imageset.get_detector(0).to_dict() # Set models imageset.set_beam(BeamFactory.from_dict(d.get("beam"), beam_dict)) imageset.set_detector(DetectorFactory.from_dict(d.get("detector"), detector_dict)) # Return the imageset return imageset
[docs]def imagesweep_from_dict(d, check_format=True, directory=None): """Construct and image sweep from the dictionary.""" from dxtbx.imageset import ImageSetFactory from dxtbx.model import BeamFactory, DetectorFactory, GoniometerFactory, ScanFactory from dxtbx.serialize.filename import load_path # Get the template (required) template = load_path(str(d["template"]), directory=directory) # If the scan isn't set, find all available files scan_dict = d.get("scan") if scan_dict is None: image_range = None else: image_range = scan_dict.get("image_range") # Set the models with the exisiting models as templates beam = BeamFactory.from_dict(d.get("beam")) goniometer = GoniometerFactory.from_dict(d.get("goniometer")) detector = DetectorFactory.from_dict(d.get("detector")) scan = ScanFactory.from_dict(d.get("scan")) # Construct the sweep try: sweep = ImageSetFactory.from_template( template, image_range, beam=beam, detector=detector, goniometer=goniometer, scan=scan, check_format=check_format, )[0] except Exception: indices = range(image_range[0], image_range[1] + 1) sweep = ImageSetFactory.make_sweep( template, indices, beam=beam, detector=detector, goniometer=goniometer, scan=scan, check_format=check_format, ) # Set some external lookups if "mask" in d and d["mask"] is not None and d["mask"] is not "": path = load_path(d["mask"], directory=directory) with open(path) as infile: sweep.external_lookup.mask.filename = path sweep.external_lookup.mask.data = ImageBool(pickle.load(infile)) if "gain" in d and d["gain"] is not None and d["gain"] is not "": path = load_path(d["gain"], directory=directory) with open(path) as infile: sweep.external_lookup.gain.filename = path sweep.external_lookup.gain.data = ImageDouble(pickle.load(infile)) if "pedestal" in d and d["pedestal"] is not None and d["pedestal"] is not "": path = load_path(d["pedestal"], directory=directory) with open(path) as infile: sweep.external_lookup.pedestal.filename = path sweep.external_lookup.pedestal.data = ImageDouble(pickle.load(infile)) # Return the sweep return sweep
[docs]def imageset_from_dict(d, check_format=True, directory=None): """Convert the dictionary to a sweep Params: d The dictionary of parameters Returns: The sweep """ # Check the input if d == None: return None # Check the version and id if str(d["__id__"]) != "imageset": raise ValueError('"__id__" does not equal "imageset"') if "filenames" in d: return basic_imageset_from_dict(d, directory=directory) elif "template" in d: return imagesweep_from_dict(d, check_format=check_format, directory=directory) else: raise TypeError("Unable to deserialize given imageset")