Skip to content

Commit 7b7d868

Browse files
authored
Merge pull request #340 from dmgav/srx-metadata
Additional metadata for SRX
2 parents c49d435 + 3518b47 commit 7b7d868

File tree

4 files changed

+94
-4
lines changed

4 files changed

+94
-4
lines changed

pyxrf/core/tests/test_map_processing.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ def test_dask_client_create(tmpdir):
4747

4848
# Set the number of workers to some strange number (11 is unusual)
4949
# (pass another kwarg in addition to default)
50-
client = dask_client_create(n_workers=11)
50+
n_workers_requested = 3
51+
client = dask_client_create(n_workers=n_workers_requested)
5152
n_workers = len(client.scheduler_info()["workers"])
52-
assert n_workers == 11, "The number of workers was set incorrectly"
53+
assert n_workers == n_workers_requested, "The number of workers was set incorrectly"
5354
client.close()
5455

5556
assert not os.path.exists(dask_worker_space_path), "Temporary directory was created in the current directory"

pyxrf/model/fileio.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ def _get_pyxrf_version_str(self):
165165
"""
166166

167167
# Determine the current version of PyXRF
168-
global pyxrf_version
169168
pyxrf_version_str = pyxrf_version
170169
if pyxrf_version_str[0].lower() != "v":
171170
pyxrf_version_str = f"v{pyxrf_version_str}"
@@ -1511,7 +1510,12 @@ def read_hdf_APS(
15111510
# Convert ndarrays to lists (they were lists before they were saved)
15121511
if isinstance(value, np.ndarray):
15131512
value = list(value)
1514-
mdata[key] = value
1513+
if "|" in key:
1514+
k1, k2 = key.split("|", 1)
1515+
mdata.setdefault(k1, {})
1516+
mdata[k1][k2] = value
1517+
else:
1518+
mdata[key] = value
15151519

15161520
data = f["xrfmap"]
15171521
fname = file_name.split(".")[0]

pyxrf/model/load_data_from_db.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,27 @@ def _get_metadata_value_from_descriptor_document(hdr, *, data_key, stream_name="
669669
return value
670670

671671

672+
def _get_metadata_value_from_descriptor_document_by_pattern(hdr, *, pattern, stream_name="baseline"):
673+
"""
674+
Returns all variables in the the first occurrence of each variable with the name containing
675+
the patter in specified document stream. Returns empty dictionary if the variable is not found.
676+
"""
677+
value_dict = {}
678+
docs = hdr.documents(stream_name=stream_name)
679+
for name, doc in docs:
680+
if (name != "event") or ("descriptor" not in doc):
681+
continue
682+
try:
683+
values = {k: v for k, v in doc["data"].items if re.search(pattern, k)}
684+
for k, v in values.items():
685+
if k not in value_dict:
686+
value_dict[k] = v
687+
except Exception:
688+
pass
689+
690+
return value_dict
691+
692+
672693
def _get_metadata_all_from_descriptor_document(hdr, *, data_key, stream_name="baseline"):
673694
"""
674695
Returns the list of the recorded values of variables with the name ``data_key`` in
@@ -703,6 +724,21 @@ def _get_metadata_value_from_descriptor_document_tiled(hdr, *, data_key, stream_
703724
return value
704725

705726

727+
def _get_metadata_value_from_descriptor_document_by_pattern_tiled(hdr, *, pattern, stream_name="baseline"):
728+
"""
729+
Returns all variables in the the first occurrence of each variable with the name containing
730+
the patter in specified document stream. Returns empty dictionary if the variable is not found.
731+
"""
732+
value_dict = {}
733+
docs = hdr[stream_name]["data"]
734+
735+
for k, v in docs.items():
736+
if re.search(pattern, k):
737+
value_dict[k] = v.compute()[0]
738+
739+
return value_dict
740+
741+
706742
def _get_metadata_all_from_descriptor_document_tiled(hdr, *, data_key, stream_name="baseline"):
707743
"""
708744
Returns the list of the recorded values of variables with the name ``data_key`` in
@@ -2280,6 +2316,24 @@ def map_data2D_srx_new_tiled(
22802316
if v is not None:
22812317
mdata["instrument_beam_current"] = v
22822318

2319+
v = _get_metadata_all_from_descriptor_document_tiled(
2320+
hdr, data_key="nano_det_sample2detector", stream_name="baseline"
2321+
)
2322+
if v is not None:
2323+
mdata["instrument_sample_to_detector"] = v
2324+
2325+
v = _get_metadata_value_from_descriptor_document_by_pattern_tiled(
2326+
hdr, pattern="attenuators", stream_name="baseline"
2327+
)
2328+
if v:
2329+
mdata["instrument_attenuators_config"] = v
2330+
2331+
v = _get_metadata_value_from_descriptor_document_by_pattern_tiled(
2332+
hdr, pattern="preamp", stream_name="baseline"
2333+
)
2334+
if v:
2335+
mdata["instrument_preamps_config"] = v
2336+
22832337
for ax in ["X", "Y", "Z"]:
22842338
v = _get_metadata_all_from_descriptor_document_tiled(
22852339
hdr, data_key=f"nanoKB_interferometer_pos{ax}", stream_name="baseline"
@@ -3982,6 +4036,27 @@ def incorrect_type_msg(channel, data_type):
39824036
if "file_software" not in metadata_prepared:
39834037
metadata_prepared.update(metadata_software_version)
39844038

4039+
metadata_prepared2 = metadata_prepared
4040+
metadata_prepared = {}
4041+
for k, v in metadata_prepared2.items():
4042+
if isinstance(v, dict):
4043+
for k2, v2 in v.items():
4044+
metadata_prepared[k + "|" + k2] = v2
4045+
else:
4046+
metadata_prepared[k] = v
4047+
4048+
metadata_prepared2 = metadata_prepared
4049+
metadata_prepared = {}
4050+
for k, v in metadata_prepared2.items():
4051+
if isinstance(v, np.int64):
4052+
metadata_prepared[k] = int(v)
4053+
elif isinstance(v, np.float64):
4054+
metadata_prepared[k] = float(v)
4055+
elif isinstance(v, np.str_):
4056+
metadata_prepared[k] = str(v)
4057+
else:
4058+
metadata_prepared[k] = v
4059+
39854060
if metadata_prepared:
39864061
# We assume, that metadata does not contain repeated keys. Otherwise the
39874062
# entry with the last occurrence of the key will override the previous ones.

pyxrf/model/scan_metadata.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pprint
12
import re
23
import textwrap
34

@@ -64,6 +65,9 @@ def values(self):
6465
def items(self):
6566
return self._values.items()
6667

68+
def setdefault(self, key, default=None):
69+
return self._values.setdefault(key, default)
70+
6771
def update(self, source_dict):
6872
self._values.update(source_dict)
6973

@@ -131,6 +135,9 @@ def cap(s):
131135
# Now remove spaces at the beginning of the line, since the key will be
132136
# printed instead of the spaces
133137
val = val.lstrip()
138+
elif isinstance(v, dict):
139+
val = "\n" + pprint.pformat(v)
140+
val = val.replace("\n", "\n ")
134141
else:
135142
val = v
136143

@@ -221,6 +228,9 @@ def _gen_default_descriptions(self):
221228
"instrument_mono_incident_energy": "incident energy",
222229
"instrument_beam_current": "ring current, mA",
223230
"instrument_detectors": "detectors",
231+
"instrument_sample_to_detector": "sample-to-detector distance, mm",
232+
"instrument_attenuators_config": "attenuators configuration",
233+
"instrument_preamps_config": "preamp configuration",
224234
"sample_name": "sample name",
225235
"experiment_plan_name": "plan name",
226236
"experiment_plan_type": "plan type",

0 commit comments

Comments
 (0)