Click here to go to the corresponding page for the latest version of DIALS
Reading experiment and dataΒΆ
The following example code demonstrates how to load experiments and reflections in the DIALS framework:
# detector, one beam (obviously)
for experiment in experiments[1:]:
assert experiment.imageset == experiments[0].imageset
assert experiment.beam == experiments[0].beam
assert experiment.detector == experiments[0].detector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | #!/usr/bin/env dials.python
#
# example_experiment_data.py
#
# Copyright (C) 2017 Diamond Light Source
#
# Author: Graeme Winter
#
# This code is distributed under the BSD license, a copy of which is
# included in the root directory of this package.
#
# Example code for how to load experiments and reflections in the DIALS
# framework
from __future__ import absolute_import, division, print_function
from libtbx.phil import parse
help_message = """
pass experiment.json indexed.pickle
"""
phil_scope = parse(
"""
png = 'example.png'
.type = str
.help = 'Output name for .png'
""",
process_includes=True,
)
class Script(object):
"""A class for running the script."""
def __init__(self):
from dials.util.options import OptionParser
import libtbx.load_env
usage = (
"usage: %s [options] experiments.json indexed.pickle"
% libtbx.env.dispatcher_name
)
self.parser = OptionParser(
usage=usage,
phil=phil_scope,
epilog=help_message,
check_format=False,
read_experiments=True,
read_reflections=True,
)
def run(self):
from dials.array_family import flex # import dependency
from scitbx import matrix
from dials.util.options import flatten_experiments
from dials.util.options import flatten_reflections
params, options = self.parser.parse_args(show_diff_phil=True)
experiments = flatten_experiments(params.input.experiments)
reflections = flatten_reflections(params.input.reflections)
if len(experiments) == 0:
self.parser.print_help()
return
if len(reflections) != 1:
self.parser.print_help()
return
reflections = reflections[0]
print("Read %d reflections" % len(reflections))
indexed = reflections.select(reflections.get_flags(reflections.flags.indexed))
print("Kept %d indexed reflections" % len(indexed))
for name in sorted(indexed.keys()):
print("Found column %s" % name)
for reflection in indexed[:3]:
print(reflection)
# verify that these experiments correspond to exactly one imageset, one
# detector, one beam (obviously)
for experiment in experiments[1:]:
assert experiment.imageset == experiments[0].imageset
assert experiment.beam == experiments[0].beam
assert experiment.detector == experiments[0].detector
# now perform some calculations - the only things different from one
# experiment to the next will be crystal models
crystals = [experiment.crystal for experiment in experiments]
detector = experiments[0].detector
beam = experiments[0].beam
imageset = experiments[0].imageset
# derived quantities
wavelength = beam.get_wavelength()
s0 = matrix.col(beam.get_s0())
# in here do some jiggery-pokery to cope with this being interpreted as
# a rotation image in here i.e. if scan is not None; derive goniometer
# matrix else set this to identity
scan = experiments[0].scan
goniometer = experiments[0].goniometer
if scan and goniometer:
angle = scan.get_angle_from_array_index(
0.5 * sum(imageset.get_array_range())
)
axis = matrix.col(goniometer.get_rotation_axis_datum())
F = matrix.sqr(goniometer.get_fixed_rotation())
S = matrix.sqr(goniometer.get_setting_rotation())
R = S * axis.axis_and_angle_as_r3_rotation_matrix(angle, deg=True) * F
else:
R = matrix.sqr((1, 0, 0, 0, 1, 0, 0, 0, 1))
assert len(detector) == 1
if __name__ == "__main__":
from dials.util import halraiser
try:
script = Script()
script.run()
except Exception as e:
halraiser(e)
|