Skip to content

Commit 9143b19

Browse files
author
Bing Li
committed
implemeting nxdict group
1 parent 526882e commit 9143b19

File tree

4 files changed

+104
-35
lines changed

4 files changed

+104
-35
lines changed

src/tavi/data/nxdict.py

+78-29
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,30 @@
22
from typing import Optional
33

44

5+
def _add_dataset_entry(
6+
entry_dict: dict,
7+
key: str,
8+
daslogs: dict,
9+
daslogs_key: Optional[str] = None,
10+
**kwargs,
11+
):
12+
key = key if daslogs_key is None else daslogs_key
13+
try:
14+
val = daslogs[key]
15+
entry_dict.update({key: {"dataset": val}})
16+
if not kwargs:
17+
return entry_dict
18+
attr_dict = {}
19+
for k, v in kwargs.items():
20+
attr_dict.update({k: v})
21+
entry_dict[key].update({"attrs": attr_dict})
22+
return entry_dict
23+
24+
except KeyError:
25+
print(f"Variable {key} cannot be found in DAS logs.")
26+
return entry_dict
27+
28+
529
def nxsource(spicelogs, instrument_config_params):
630
source = {
731
"attrs": {"NX_class": "NXsource", "EX_required": "true"},
@@ -21,49 +45,74 @@ def nxsource(spicelogs, instrument_config_params):
2145

2246

2347
def nxmono(spicelogs, instrument_config_params):
24-
metadata = spicelogs["attrs"]
2548

26-
try:
27-
mono = {
28-
"attrs": {"NX_class": "NXcrystal", "EX_required": "true"},
29-
"ei": {
30-
"dataset": spicelogs["ei"],
31-
"attrs": {"type": "NX_FLOAT", "EX_required": "true", "units": "meV"},
32-
},
33-
"type": {"dataset": metadata["monochromator"], "attrs": {"type": "NX_CHAR"}},
34-
"sense": {"dataset": metadata["sense"][0], "attrs": {"type": "NX_CHAR"}},
35-
"m1": {
36-
"dataset": spicelogs["m1"],
37-
"attrs": {"type": "NX_FLOAT", "units": "degrees"},
38-
},
39-
"m2": {
40-
"dataset": spicelogs["m2"],
41-
"attrs": {"type": "NX_FLOAT", "units": "degrees"},
42-
},
43-
"mfocus": {"dataset": spicelogs["mfocus"], "attrs": {"type": "NX_FLOAT"}},
44-
"marc": {"dataset": spicelogs["marc"], "attrs": {"type": "NX_FLOAT"}},
45-
"mtrans": {"dataset": spicelogs["mtrans"], "attrs": {"type": "NX_FLOAT"}},
46-
"focal_length": {"dataset": spicelogs["focal_length"], "attrs": {"type": "NX_FLOAT"}},
47-
}
48-
except KeyError:
49-
pass
49+
mono = {"attrs": {"NX_class": "NXcrystal", "EX_required": "true"}}
50+
mono = _add_dataset_entry(mono, key="ei", daslogs=spicelogs, type="NX_FLOAT", EX_required="true", unit="meV")
51+
mono.update({"type": {"dataset": spicelogs["attrs"]["monochromator"], "attrs": {"type": "NX_CHAR"}}})
52+
mono.update({"sense": {"dataset": spicelogs["attrs"]["sense"][0], "attrs": {"type": "NX_CHAR"}}})
53+
mono = _add_dataset_entry(mono, key="m1", daslogs=spicelogs, type="NX_FLOAT", unit="degrees")
54+
mono = _add_dataset_entry(mono, key="m2", daslogs=spicelogs, type="NX_FLOAT", unit="degrees")
55+
mono = _add_dataset_entry(mono, key="mfocus", daslogs=spicelogs, type="NX_FLOAT")
56+
mono = _add_dataset_entry(mono, key="marc", daslogs=spicelogs, type="NX_FLOAT")
57+
mono = _add_dataset_entry(mono, key="mtrans", daslogs=spicelogs, type="NX_FLOAT")
58+
mono = _add_dataset_entry(mono, key="focal_length", daslogs=spicelogs, type="NX_FLOAT")
59+
5060
return mono
5161

5262

5363
def nxcoll(spicelogs, instrument_config_params):
54-
return {}
64+
pass
5565

5666

5767
def nxana(spicelogs, instrument_config_params):
58-
return {}
68+
ana = {"attrs": {"NX_class": "NXcrystal", "EX_required": "true"}}
69+
ana = _add_dataset_entry(ana, key="ef", daslogs=spicelogs, type="NX_FLOAT", EX_required="true", unit="meV")
70+
ana.update({"type": {"dataset": spicelogs["attrs"]["analyzer"], "attrs": {"type": "NX_CHAR"}}})
71+
ana.update({"sense": {"dataset": spicelogs["attrs"]["sense"][2], "attrs": {"type": "NX_CHAR"}}})
72+
ana = _add_dataset_entry(ana, key="a1", daslogs=spicelogs, type="NX_FLOAT", unit="degrees")
73+
ana = _add_dataset_entry(ana, key="a2", daslogs=spicelogs, type="NX_FLOAT", unit="degrees")
74+
ana = _add_dataset_entry(ana, key="afocus", daslogs=spicelogs, type="NX_FLOAT")
75+
for i in range(8):
76+
ana = _add_dataset_entry(ana, key=f"qm{i+1}", daslogs=spicelogs, type="NX_FLOAT")
77+
ana = _add_dataset_entry(ana, key=f"xm{i+1}", daslogs=spicelogs, type="NX_FLOAT")
78+
return ana
5979

6080

6181
def nxdet(spicelogs, instrument_config_params):
62-
return {}
82+
det = {"attrs": {"NX_class": "NXdetector", "EX_required": "true"}}
83+
det = _add_dataset_entry(det, key="detector", daslogs=spicelogs, type="NX_INT", EX_required="true", unit="counts")
84+
# polar_angle
85+
return det
6386

6487

6588
def nxmonitor(spicelogs, instrument_config_params):
66-
return {}
89+
monitor = {"attrs": {"NX_class": "NXmonitor", "EX_required": "true"}}
90+
preset_type = spicelogs["attrs"]["preset_type"]
91+
match preset_type:
92+
case "countfile": # polarization data
93+
print("Countfile preset type is not supported.")
94+
95+
case "normal":
96+
preset_channel = spicelogs["attrs"]["preset_channel"]
97+
monitor.update({"mode": {"dataset": preset_channel, "attrs": {"type": "NX_CHAR", "EX_required": "true"}}})
98+
monitor.update(
99+
{
100+
"preset": {
101+
"dataset": spicelogs["attrs"]["preset_value"],
102+
"attrs": {"type": "NX_FLOAT", "EX_required": "true"},
103+
}
104+
}
105+
)
106+
monitor = _add_dataset_entry(monitor, key="time", daslogs=spicelogs, type="NX_FLOAT", units="seconds")
107+
monitor = _add_dataset_entry(monitor, key="monitor", daslogs=spicelogs, type="NX_INT", units="counts")
108+
monitor = _add_dataset_entry(monitor, key="mcu", daslogs=spicelogs, type="NX_FLOAT")
109+
monitor_data_dict = monitor[preset_channel]
110+
monitor.update({"data": monitor_data_dict})
111+
112+
case _:
113+
print(f"Unrecogonized preset type {preset_type}.")
114+
115+
return monitor
67116

68117

69118
def nxsample(spicelogs, sample_config_params):

src/tavi/data/nxentry.py

+25-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

33
import h5py
4+
import numpy as np
45

56
from tavi.data.spice_reader import spice_data_reader
67

@@ -50,6 +51,27 @@ def _write_recursively(items, nexus_entry):
5051
string encoded with utf-8
5152
"""
5253

54+
def format_dataset(value):
55+
"""format if type is given in attributes"""
56+
dv = value["dataset"]
57+
58+
if attr := value.get("attrs"):
59+
attr_type = attr.get("type")
60+
match attr_type:
61+
case "NX_CHAR":
62+
dv = dv.encode("utf-8")
63+
case "NX_FLOAT":
64+
dv = np.array(dv).astype("float")
65+
case "NX_INT":
66+
dv = np.array(dv).astype("int")
67+
case "NX_DATE_TIME":
68+
pass
69+
case _:
70+
if isinstance(dv, str):
71+
dv = dv.encode("utf-8")
72+
print(dv)
73+
return dv
74+
5375
for key, value in items.items():
5476
if key == "attrs":
5577
for attr_key, attr_value in value.items():
@@ -59,13 +81,11 @@ def _write_recursively(items, nexus_entry):
5981
else:
6082
if isinstance(value, dict):
6183
if "dataset" in value.keys():
62-
dv = value["dataset"]
63-
if isinstance(dv, str):
64-
dv = dv.encode("utf-8")
65-
if key in nexus_entry:
84+
dv = format_dataset(value)
85+
if key in nexus_entry: # dataset exists
6686
ds = nexus_entry[key]
6787
ds[...] = dv
68-
else:
88+
else: # create dataset
6989
ds = nexus_entry.create_dataset(name=key, data=dv, maxshape=None)
7090
NexusEntry._write_recursively(value, ds)
7191
else:

src/tavi/data/scan_old/spice_to_nexus.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ def _nexus_coll(nxcoll, das_logs, instrument_config_params=None):
514514
div_x = [float(v) for v in list(das_logs.attrs["collimation"].split("-"))]
515515
nxcoll.create_dataset(name="divergence_x", data=div_x, maxshape=None)
516516
nxcoll["divergence_x"].attrs["type"] = "NX_ANGLE"
517-
nxcoll["divergence_x"].attrs["units"] = "minutes of aarc"
517+
nxcoll["divergence_x"].attrs["units"] = "minutes of arc"
518518

519519
except KeyError:
520520
pass
17.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)