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

Source code for dxtbx.serialize.imageset

from __future__ import absolute_import, division, print_function

import collections
import os
from builtins import range

import six.moves.cPickle as pickle

from dxtbx.format.image import ImageBool, ImageDouble
from dxtbx.imageset import ImageSequence, ImageSet, ImageSetFactory
from dxtbx.model import BeamFactory, DetectorFactory, GoniometerFactory, ScanFactory
from dxtbx.serialize.filename import resolve_path


[docs]def filename_to_absolute(filename): """Convert filenames to absolute form.""" if isinstance(filename, list): return [os.path.abspath(f) for f in filename] return os.path.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 """ # Return the dictionary representation return collections.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 imagesequence_to_dict(sequence): """Convert a sequence to a dictionary Params: sequence The sequence Returns: A dictionary of the parameters """ # Return the dictionary representation return collections.OrderedDict( [ ("__id__", "imageset"), ("template", filename_to_absolute(sequence.get_template())), ("mask", filename_or_none(sequence.external_lookup.mask.filename)), ("gain", filename_or_none(sequence.external_lookup.gain.filename)), ("pedestal", filename_or_none(sequence.external_lookup.pedestal.filename)), ("beam", sequence.get_beam().to_dict()), ("detector", sequence.get_detector().to_dict()), ("goniometer", sequence.get_goniometer().to_dict()), ("scan", sequence.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 """ # If this is an imageset then return a list of filenames if isinstance(imageset, ImageSequence): return imagesequence_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.""" # Get the filename list and create the imageset filenames = [resolve_path(str(p), directory=directory) for p in d["filenames"]] imageset = ImageSetFactory.new(filenames)[0] # Set some external lookups if "mask" in d and d["mask"] is not None and d["mask"] != "": path = resolve_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"] != "": path = resolve_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"] != "": path = resolve_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 imagesequence_from_dict(d, check_format=True, directory=None): """Construct and image sequence from the dictionary.""" # Get the template (required) template = resolve_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 sequence try: sequence = ImageSetFactory.from_template( template, image_range, beam=beam, detector=detector, goniometer=goniometer, scan=scan, check_format=check_format, )[0] except Exception: indices = list(range(image_range[0], image_range[1] + 1)) sequence = ImageSetFactory.make_sequence( 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"] != "": path = resolve_path(d["mask"], directory=directory) with open(path) as infile: sequence.external_lookup.mask.filename = path sequence.external_lookup.mask.data = ImageBool(pickle.load(infile)) if "gain" in d and d["gain"] is not None and d["gain"] != "": path = resolve_path(d["gain"], directory=directory) with open(path) as infile: sequence.external_lookup.gain.filename = path sequence.external_lookup.gain.data = ImageDouble(pickle.load(infile)) if "pedestal" in d and d["pedestal"] is not None and d["pedestal"] != "": path = resolve_path(d["pedestal"], directory=directory) with open(path) as infile: sequence.external_lookup.pedestal.filename = path sequence.external_lookup.pedestal.data = ImageDouble(pickle.load(infile)) # Return the sequence return sequence
[docs]def imageset_from_dict(d, check_format=True, directory=None): """Convert the dictionary to a sequence Params: d The dictionary of parameters Returns: The sequence """ # Check the input if d is 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 imagesequence_from_dict( d, check_format=check_format, directory=directory ) else: raise TypeError("Unable to deserialize given imageset")