Source code for spec2nexus.plugins.apstools_specwriter
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# :author: Pete R. Jemian
# :email: prjemian@gmail.com
# :copyright: (c) 2014-2020, Pete R. Jemian
#
# Distributed under the terms of the Creative Commons Attribution 4.0 International Public License.
#
# The full license is in the file LICENSE.txt, distributed with this software.
# -----------------------------------------------------------------------------
"""
**#MD** : Bluesky metadata from apstools SpecWriterCallback.
EXAMPLE::
#MD APSTOOLS_VERSION = 1.1.0
#MD BLUESKY_VERSION = 1.5.2
#MD EPICS_CA_MAX_ARRAY_BYTES = 1280000
#MD EPICS_HOST_ARCH = linux-x86_64
#MD OPHYD_VERSION = 1.3.2
#MD beamline_id = APS USAXS 9-ID-C
#MD datetime = 2019-04-19 10:04:44.400750
#MD login_id = usaxs@usaxscontrol.xray.aps.anl.gov
#MD pid = 27062
#MD proposal_id = testing Bluesky installation
#MD purpose = tuner
#MD tune_md = {'width': -0.004, 'initial_position': 8.824885, 'time_iso8601': '2019-04-19 10:04:44.402643'}
#MD tune_parameters = {'num': 31, 'width': -0.004, 'initial_position': 8.824885, 'peak_choice': 'com', 'x_axis': 'm_stage_r', 'y_axis': 'I0_USAXS'}
"""
from collections import OrderedDict
import six
from .. import eznx
from ..plugin import AutoRegister, ControlLineHandler
[docs]@six.add_metaclass(AutoRegister)
class MD_apstools(ControlLineHandler):
"""**#MD** -- Bluesky metadata from apstools SpecWriterCallback"""
key = r"#MD\w*"
scan_attributes_defined = ["MD"]
[docs] def process(self, text, scan, *args, **kws):
"""read #MD lines from SPEC data file"""
if not hasattr(scan, "MD"):
scan.MD = OrderedDict()
p = text.find("=")
if p > len("# MD "):
# f"#MD {key} = {value}"
key = text.split()[1]
value = text[p + 1 :].strip()
else:
# badly-formed #MD control line
key = "MD_line_%d" % (len(scan.MD) + 1)
value = text.strip()
scan.MD[key] = value
scan.addH5writer(self.key, self.writer)
[docs] def writer(self, h5parent, writer, scan, nxclass=None, *args, **kws):
"""Describe how to store this data in an HDF5 NeXus file"""
nxclass = "NXcollection"
if hasattr(scan, "MD") and len(scan.MD) > 0:
desc = "Bluesky metadata (as written by apstools.SpecWriterCallback)"
group = eznx.makeGroup(
h5parent, "bluesky_metadata", nxclass, description=desc
)
writer.save_dict(group, scan.MD)