Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

example use of NXWriter #697

Merged
merged 13 commits into from
Aug 12, 2022
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ build_log.txt
.logs/
.vscode/
20*.dat
20*.hdf

# bird droppings from IT
.log
Expand Down
58 changes: 37 additions & 21 deletions apstools/callbacks/nexus_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class NXWriter(FileWriterCallbackBase):
~write_user
"""

warn_on_missing_content = True
file_extension = NEXUS_FILE_EXTENSION
instrument_name = None # name of this instrument
# NeXus release to which this file is written
Expand Down Expand Up @@ -113,9 +114,10 @@ def assign_signal_type(self):
try:
v["value"].attrs["signal_type"] = signal_type # dataset
except KeyError:
logger.warning(
"Could not assign %s as signal type %s", k, signal_type
)
if self.warn_on_missing_content:
logger.warning(
"Could not assign %s as signal type %s", k, signal_type
)

def create_NX_group(self, parent, specification):
"""
Expand Down Expand Up @@ -233,11 +235,13 @@ def write_data(self, parent):
if ax in nxdata:
axes.append(ax)
else:
logger.warning(fmt, ax, "axes")
if self.warn_on_missing_content:
logger.warning(fmt, ax, "axes")
if axes_attribute is not None:
nxdata.attrs["axes"] = axes_attribute
else:
logger.warning(fmt, signal_attribute, "signal")
if self.warn_on_missing_content:
logger.warning(fmt, signal_attribute, "signal")

return nxdata

Expand Down Expand Up @@ -292,7 +296,8 @@ def write_entry(self):
nxdata = self.write_data(nxentry)
nxentry.attrs["default"] = nxdata.name.split("/")[-1]
except KeyError as exc:
logger.warning(exc)
if self.warn_on_missing_content:
logger.warning(exc)

self.write_sample(nxentry)
self.write_user(nxentry)
Expand All @@ -302,7 +307,8 @@ def write_entry(self):
if h5_addr in self.root:
nxentry["run_cycle"] = self.root[h5_addr]
else:
logger.warning("No data for /entry/run_cycle")
if self.warn_on_missing_content:
logger.warning("No data for /entry/run_cycle")

nxentry["title"] = self.get_sample_title()
nxentry["plan_name"] = self.root[
Expand Down Expand Up @@ -334,19 +340,22 @@ def write_instrument(self, parent):
try:
self.assign_signal_type()
except KeyError as exc:
logger.warning(exc)
if self.warn_on_missing_content:
logger.warning(exc)

self.write_slits(nxinstrument)
try:
self.write_detector(nxinstrument)
except KeyError as exc:
logger.warning(exc)
if self.warn_on_missing_content:
logger.warning(exc)

self.write_monochromator(nxinstrument)
try:
self.write_positioner(nxinstrument)
except KeyError as exc:
logger.warning(exc)
if self.warn_on_missing_content:
logger.warning(exc)
self.write_source(nxinstrument)
return nxinstrument

Expand Down Expand Up @@ -389,17 +398,19 @@ def write_monochromator(self, parent):
key: self.get_stream_link(f"{pre}_{key}") for key in keys
}
except KeyError as exc:
logger.warning(
"%s -- not creating monochromator group", str(exc)
)
if self.warn_on_missing_content:
logger.warning(
"%s -- not creating monochromator group", str(exc)
)
return

pre = "monochromator"
key = "feedback_on"
try:
links[key] = self.get_stream_link(f"{pre}_{key}")
except KeyError as exc:
logger.warning("%s -- feedback signal not found", str(exc))
if self.warn_on_missing_content:
logger.warning("%s -- feedback signal not found", str(exc))

nxmonochromator = self.create_NX_group(
parent, "monochromator:NXmonochromator"
Expand Down Expand Up @@ -467,11 +478,13 @@ def write_sample(self, parent):
try:
links[key] = self.get_stream_link(f"{pre}_{key}")
except KeyError as exc:
logger.warning("%s", str(exc))
if self.warn_on_missing_content:
logger.warning("%s", str(exc))
if len(links) == 0:
logger.warning(
"no sample data found, not creating sample group"
)
if self.warn_on_missing_content:
logger.warning(
"no sample data found, not creating sample group"
)
return

nxsample = self.create_NX_group(parent, "sample:NXsample")
Expand Down Expand Up @@ -654,7 +667,8 @@ def write_user(self, parent):
try:
links = {k: self.get_stream_link(v) for k, v in keymap.items()}
except KeyError as exc:
logger.warning("%s -- not creating source group", str(exc))
if self.warn_on_missing_content:
logger.warning("%s -- not creating source group", str(exc))
return

nxuser = self.create_NX_group(parent, "contact:NXuser")
Expand Down Expand Up @@ -708,7 +722,8 @@ def write_source(self, parent):
}
# fmt: on
except KeyError as exc:
logger.warning("%s -- not creating source group", str(exc))
if self.warn_on_missing_content:
logger.warning("%s -- not creating source group", str(exc))
return

nxsource = self.create_NX_group(parent, "source:NXsource")
Expand Down Expand Up @@ -750,7 +765,8 @@ def write_undulator(self, parent):
key: self.get_stream_link(f"{pre}_{key}") for key in keys
}
except KeyError as exc:
logger.warning("%s -- not creating undulator group", str(exc))
if self.warn_on_missing_content:
logger.warning("%s -- not creating undulator group", str(exc))
return

undulator = self.create_NX_group(
Expand Down
Loading