Skip to content

Commit 5feabb9

Browse files
authored
Merge pull request #25 from nemocrys/dev-nomdad
Implement nomad support for remaining devices
2 parents e5d837a + 096afd5 commit 5feabb9

File tree

8 files changed

+396
-29
lines changed

8 files changed

+396
-29
lines changed

multilog/devices/basler_camera.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import logging
33
import os
4+
import shutil
45

56

67
logger = logging.getLogger(__name__)
@@ -25,6 +26,7 @@ def __init__(self, config, name="BaslerCamera"):
2526
config.yml in the devices-section).
2627
name (str, optional): Device name.
2728
"""
29+
self.config = config
2830
logger.info(f"Initializing BaslerCamera device '{name}'")
2931
self.name = name
3032
self._timeout = config["timeout"]
@@ -93,13 +95,29 @@ def init_output(self, directory="./"):
9395
Args:
9496
directory (str, optional): Output directory. Defaults to "./".
9597
"""
98+
self.base_directory = directory
9699
self.directory = f"{directory}/{self.name}"
97100
os.makedirs(self.directory)
98101
with open(f"{self.directory}/_images.csv", "w", encoding="utf-8") as f:
99102
f.write("# datetime,s,filename,\n")
100103
f.write("time_abs,time_rel,img-name,\n")
101104
with open(f"{self.directory}/device.txt", "w", encoding="utf-8") as f:
102105
f.write(self.device_name)
106+
self.write_nomad_files(directory)
107+
108+
def write_nomad_files(self, directory="./"):
109+
"""Write .archive.yaml file based on device configuration.
110+
111+
Args:
112+
directory (str, optional): Output directory. Defaults to "./".
113+
"""
114+
shutil.copy(
115+
"./multilog/nomad/archive_template_Camera.yml",
116+
f"{directory}/{self.name}.archive.yaml",
117+
)
118+
with open(f"{self.base_directory}/{self.name}.archive.yaml", "a") as f:
119+
f.write(f" exposure_time: {self.config['exposure-time']}\n")
120+
f.write(f" images_list:\n")
103121

104122
def save_measurement(self, time_abs, time_rel, sampling):
105123
"""Write measurement data to files:
@@ -125,6 +143,13 @@ def save_measurement(self, time_abs, time_rel, sampling):
125143
f.write(
126144
f"{time_abs.isoformat(timespec='milliseconds').replace('T', ' ')},{time_rel},{img_name},\n"
127145
)
146+
with open(f"{self.base_directory}/{self.name}.archive.yaml", "a") as f: # todo
147+
f.write(f" - name: {img_name}\n")
148+
f.write(f" image: {self.name}/{img_name}\n")
149+
f.write(f" timestamp_rel: {time_rel}\n")
150+
f.write(
151+
f" timestamp_abs: {time_abs.isoformat(timespec='milliseconds').replace('T', ' ')}\n"
152+
)
128153
self.image_counter += 1
129154

130155
def set_frame_rate(self, frame_rate):

multilog/devices/optris_ip640.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import multiprocessing
55
import numpy as np
66
import os
7+
import shutil
78
import traceback
89

10+
911
logger = logging.getLogger(__name__)
1012
try:
1113
from ..pyOptris import direct_binding as optris
@@ -30,6 +32,7 @@ def __init__(self, config, name="OptrisIP640", xml_dir="./"):
3032
xml_dir(str, optional): Directory for xml-file with device
3133
configuration. Defaults to "./".
3234
"""
35+
self.config = config
3336
logger.info(f"Initializing OptrisIP640 device '{name}'")
3437
self.name = name
3538
self.emissivity = config["emissivity"]
@@ -127,11 +130,31 @@ def init_output(self, directory="./"):
127130
Args:
128131
directory (str, optional): Output directory. Defaults to "./".
129132
"""
133+
self.base_directory = directory
130134
self.directory = f"{directory}/{self.name}"
131135
os.makedirs(self.directory)
132136
with open(f"{self.directory}/_images.csv", "w", encoding="utf-8") as f:
133137
f.write("# datetime,s,filename,\n")
134138
f.write("time_abs,time_rel,img-name,\n")
139+
self.write_nomad_files(directory)
140+
141+
def write_nomad_files(self, directory="./"):
142+
"""Write .archive.yaml file based on device configuration.
143+
144+
Args:
145+
directory (str, optional): Output directory. Defaults to "./".
146+
"""
147+
shutil.copy(
148+
"./multilog/nomad/archive_template_IR-Camera.yml",
149+
f"{directory}/{self.name}.archive.yaml",
150+
)
151+
with open(f"{self.base_directory}/{self.name}.archive.yaml", "a") as f:
152+
f.write(f" emissivity: {self.emissivity}\n")
153+
f.write(f" transmissivity: {self.transmissivity}\n")
154+
f.write(f" ambient_temperature: {self.t_ambient}\n")
155+
f.write(f" measurement_range: '{self.config['measurement-range']}'\n")
156+
f.write(f" extended_temperature_range: {self.config['extended-T-range']}\n")
157+
f.write(f" ir_images_list:\n")
135158

136159
def save_measurement(self, time_abs, time_rel, sampling):
137160
"""Write measurement data to files:
@@ -164,9 +187,18 @@ def save_measurement(self, time_abs, time_rel, sampling):
164187
f.write(
165188
f"{time_abs.isoformat(timespec='milliseconds').replace('T', ' ')},{time_rel},{img_name},\n"
166189
)
190+
with open(f"{self.base_directory}/{self.name}.archive.yaml", "a") as f:
191+
f.write(f" - name: {img_name}\n")
192+
f.write(f" image: {self.name}/{img_name}.png\n")
193+
f.write(f" heat_map: {self.name}/{img_name}.csv\n")
194+
f.write(f" timestamp_rel: {time_rel}\n")
195+
f.write(
196+
f" timestamp_abs: {time_abs.isoformat(timespec='milliseconds').replace('T', ' ')}\n"
197+
)
198+
167199
self.image_counter += 1
168200

169201
def __del__(self):
170-
"""Terminate IR camera communictation and remove xml."""
202+
"""Terminate IR camera communication and remove xml."""
171203
optris.terminate()
172204
os.remove(self.xml_file)

multilog/devices/process_condition_logger.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime
33
import logging
44
import subprocess
5+
import yaml
56

67

78
logger = logging.getLogger(__name__)
@@ -72,6 +73,62 @@ def init_output(self, directory="./"):
7273
f"- {condition}: {self.meas_data[condition]} {self.condition_units[condition]}\n"
7374
)
7475
f.write("\n## Process condition log\n\n")
76+
self.write_nomad_files(directory)
77+
78+
def write_nomad_files(self, directory="./"):
79+
"""Write .archive.yaml file based on device configuration.
80+
81+
Args:
82+
directory (str, optional): Output directory. Defaults to "./".
83+
"""
84+
with open("./multilog/nomad/archive_template.yml") as f:
85+
nomad_template = yaml.safe_load(f)
86+
definitions = nomad_template.pop("definitions")
87+
data = nomad_template.pop("data")
88+
sensor_schema_template = nomad_template.pop("sensor_schema_template")
89+
data.update(
90+
{
91+
"data_file": self.filename.split("/")[-1],
92+
}
93+
)
94+
for sensor_name in self.meas_data:
95+
sensor_name_nomad = sensor_name.replace(" ", "_").replace("-", "_")
96+
data.update(
97+
{
98+
sensor_name_nomad: {
99+
# "model": "your_field_here",
100+
"name": sensor_name_nomad,
101+
# "sensor_id": sensor_name.split(" ")[0],
102+
# "attached_to": sensor_name, # TODO this information is important!
103+
# "measured_property": ,
104+
# "type": sensor_type,
105+
# "notes": "TE_1_K air 155 mm over crucible",
106+
# "unit": self.unit[sensor_name], # TODO
107+
"value_timestamp_rel": "#/data/value_timestamp_rel",
108+
"value_timestamp_abs": "#/data/value_timestamp_abs",
109+
}
110+
}
111+
)
112+
sensor_schema = deepcopy(sensor_schema_template)
113+
sensor_schema["section"]["quantities"]["value_log"]["m_annotations"][
114+
"tabular"
115+
]["name"] = sensor_name
116+
definitions["sections"]["Sensors_list"]["sub_sections"].update(
117+
{sensor_name_nomad: sensor_schema}
118+
)
119+
definitions["sections"]["Sensors_list"]["m_annotations"]["plot"].append(
120+
{
121+
"label": f"{sensor_name_nomad} over time",
122+
"x": "value_timestamp_rel",
123+
"y": [f"{sensor_name_nomad}/value_log"],
124+
}
125+
)
126+
nomad_dict = {
127+
"definitions": definitions,
128+
"data": data,
129+
}
130+
with open(f"{directory}/{self.name}.archive.yaml", "w", encoding="utf-8") as f:
131+
yaml.safe_dump(nomad_dict, f, sort_keys=False)
75132

76133
def sample(self):
77134
"""This function just exists to fit into the sampling structure

multilog/devices/pyrometer_array_lumasense.py

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
from copy import deepcopy
12
import datetime
23
import logging
34
import numpy as np
45
from serial import Serial, SerialException
6+
import yaml
57

68

79
logger = logging.getLogger(__name__)
@@ -49,8 +51,11 @@ def __init__(self, config, name="PyrometerArrayLumasense"):
4951
self.meas_data.update({sensor: []})
5052
self.emissivities.update({sensor: config["sensors"][sensor]["emissivity"]})
5153
self.t90s.update({sensor: config["sensors"][sensor]["t90"]})
52-
self.set_emissivity(head_number, config["sensors"][sensor]["emissivity"])
53-
self.set_emissivity(head_number, config["sensors"][sensor]["t90"])
54+
if type(self.serial) != SerialMock:
55+
self.set_emissivity(
56+
head_number, config["sensors"][sensor]["emissivity"]
57+
)
58+
self.set_emissivity(head_number, config["sensors"][sensor]["t90"])
5459

5560
def _get_ok(self):
5661
"""Check if command was accepted."""
@@ -108,7 +113,7 @@ def sample(self):
108113
sampling.update({sensor: np.nan})
109114
return sampling
110115

111-
def init_otput(self, directory="./"):
116+
def init_output(self, directory="./"):
112117
"""Initialize the csv output file.
113118
114119
Args:
@@ -125,6 +130,64 @@ def init_otput(self, directory="./"):
125130
with open(self.filename, "w", encoding="utf-8") as f:
126131
f.write(units)
127132
f.write(header)
133+
self.write_nomad_files(directory)
134+
135+
def write_nomad_files(self, directory="./"):
136+
"""Write .archive.yaml file based on device configuration.
137+
138+
Args:
139+
directory (str, optional): Output directory. Defaults to "./".
140+
"""
141+
with open("./multilog/nomad/archive_template.yml") as f:
142+
nomad_template = yaml.safe_load(f)
143+
definitions = nomad_template.pop("definitions")
144+
data = nomad_template.pop("data")
145+
sensor_schema_template = nomad_template.pop("sensor_schema_template")
146+
data.update(
147+
{
148+
"data_file": self.filename.split("/")[-1],
149+
}
150+
)
151+
for sensor_name in self.meas_data:
152+
sensor_name_nomad = sensor_name.replace(" ", "_").replace("-", "_")
153+
data.update(
154+
{
155+
sensor_name_nomad: {
156+
# "model": "your_field_here",
157+
"name": sensor_name_nomad,
158+
# "sensor_id": sensor_name.split(" ")[0],
159+
# "attached_to": sensor_name, # TODO this information is important!
160+
# "measured_property": ,
161+
# "type": sensor_type,
162+
# "notes": "TE_1_K air 155 mm over crucible",
163+
# "unit": self.unit[sensor_name], # TODO
164+
"emissivity": self.emissivities[sensor_name],
165+
"head_id": self.head_numbering[sensor_name],
166+
"value_timestamp_rel": "#/data/value_timestamp_rel",
167+
"value_timestamp_abs": "#/data/value_timestamp_abs",
168+
}
169+
}
170+
)
171+
sensor_schema = deepcopy(sensor_schema_template)
172+
sensor_schema["section"]["quantities"]["value_log"]["m_annotations"][
173+
"tabular"
174+
]["name"] = sensor_name
175+
definitions["sections"]["Sensors_list"]["sub_sections"].update(
176+
{sensor_name_nomad: sensor_schema}
177+
)
178+
definitions["sections"]["Sensors_list"]["m_annotations"]["plot"].append(
179+
{
180+
"label": f"{sensor_name_nomad} over time",
181+
"x": "value_timestamp_rel",
182+
"y": [f"{sensor_name_nomad}/value_log"],
183+
}
184+
)
185+
nomad_dict = {
186+
"definitions": definitions,
187+
"data": data,
188+
}
189+
with open(f"{directory}/{self.name}.archive.yaml", "w", encoding="utf-8") as f:
190+
yaml.safe_dump(nomad_dict, f, sort_keys=False)
128191

129192
def save_measurement(self, time_abs, time_rel, sampling):
130193
"""Write measurement data to file.

0 commit comments

Comments
 (0)