From 2e9c25af9cd4898789a57f05380bf466d12c5311 Mon Sep 17 00:00:00 2001 From: Egor Sobolev <egor.sobolev@xfel.eu> Date: Fri, 28 Jul 2023 18:03:27 +0200 Subject: [PATCH] Add script to refine geometry using SFX data --- pyproject.toml | 1 + src/geomtools/detector/crystfel_frm.py | 2 +- src/geomtools/sfx/optimiser.py | 45 ++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/geomtools/sfx/optimiser.py diff --git a/pyproject.toml b/pyproject.toml index 2da8bbf..7d1bfe7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,3 +29,4 @@ dependencies = [ ] [project.scripts] geomtools-push = "geomtools.sfx.report:push_geometry" +geomtools-refine-sfx = "geomtools.sfx.optimiser:refine" diff --git a/src/geomtools/detector/crystfel_frm.py b/src/geomtools/detector/crystfel_frm.py index 6418112..77d94d6 100644 --- a/src/geomtools/detector/crystfel_frm.py +++ b/src/geomtools/detector/crystfel_frm.py @@ -6,7 +6,7 @@ from natsort import natsorted HEADER_TEMPLATE = """\ -; {detector} geometry file written by geomtools-optimiser-sfx +; {detector} geometry file written by geomtools ; You may need to edit this file to add: ; - data and mask locations in the file ; - mask_good & mask_bad values to interpret the mask diff --git a/src/geomtools/sfx/optimiser.py b/src/geomtools/sfx/optimiser.py new file mode 100644 index 0000000..c0d55c0 --- /dev/null +++ b/src/geomtools/sfx/optimiser.py @@ -0,0 +1,45 @@ +import argparse +import pathlib +import tempfile + +from .refine import refine_geometry +from .crystfelio import extract_geometry, read_crystfel_streamfile +from ..detector import read_crystfel_geom, write_crystfel_geom + + +def refine(): + parser = argparse.ArgumentParser( + description='Makes the detector geometry report') + parser.add_argument('-i', '--stream', type=pathlib.Path, required=True, + help="Crystfel stream file") + parser.add_argument('-c', '--connected', default="modules", + help="Collection of rigid groups to pose") + parser.add_argument('-o', '--output', type=pathlib.Path, + default=pathlib.Path("refined.geom"), + help="File to store refined geometry") + + args = parser.parse_args() + + stream_filename = args.stream.absolute() + geom_file = extract_geometry(stream_filename) + + temp_geom_file = tempfile.NamedTemporaryFile("w+t", prefix='geomtools') + temp_geom_file.write(geom_file.read()) + geom_file.seek(0) + + panels, beam = read_crystfel_geom( + temp_geom_file.name, indexes={'modno': 1}) + + temp_geom_file.close() + + fr, pe, la, re, ma = read_crystfel_streamfile( + stream_filename, panels, args.connected, disp=True) + + panels_new, transform, clen = refine_geometry(ma, panels, 1.0) + + with open(args.output.absolute(), "w") as f: + write_crystfel_geom(f, panels_new, beam, ["modules", "quads"]) + + +if __name__ == "__main__": + refine() -- GitLab