adds most of the required metadata to function build_nexus_file

the file is generated into the "output" folder w/ .h5 extension
the most has been done already (probably)
This commit is contained in:
2026-02-16 15:43:07 +01:00
parent 74b8c9cfae
commit 207d166227

View File

@@ -263,11 +263,90 @@ def build_nexus_file(pld_fabrication, output_path):
# Sample section
nx_sample = nx_pld_entry.create_group("sample")
nx_sample.attrs["NX_class"] = "NXsample"
sample_dict = pld_fabrication["sample"]
# Substrate section
nx_substrate = nx_pld_entry.create_group("substrate")
# Substrate sub-section
nx_substrate = nx_sample.create_group("substrate")
nx_substrate.attrs["NX_class"] = "NXsubentry"
pass
substrate_dict = sample_dict["substrate"]
try:
# Substrate fields (datasets)
nx_substrate.create_dataset("name", data=substrate_dict["name"])
nx_substrate.create_dataset("chemical_formula", data=substrate_dict["chemical_formula"])
nx_substrate.create_dataset("orientation", data=substrate_dict["orientation"])
nx_substrate.create_dataset("miscut_angle", data=substrate_dict["miscut_angle"]["value"]) # float
nx_substrate["miscut_angle"].attrs["units"] = substrate_dict["miscut_angle"]["units"]
nx_substrate.create_dataset("miscut_direction", data=substrate_dict["miscut_direction"])
nx_substrate.create_dataset("thickness", data=substrate_dict["thickness"]["value"]) # float/int
nx_substrate["thickness"].attrs["units"] = substrate_dict["thickness"]["units"]
nx_substrate.create_dataset("dimensions", data=substrate_dict["dimensions"])
nx_substrate.create_dataset("surface_treatment", data=substrate_dict["surface_treatment"])
nx_substrate.create_dataset("manufacturer", data=substrate_dict["manufacturer"])
nx_substrate.create_dataset("batch_id", data=substrate_dict["batch_id"])
except TypeError as te:
# sooner or later I'll handle this too - not today tho
raise TypeError(te)
# Multilayer sub-section
nx_multilayer = nx_sample.create_group("multilayer")
nx_multilayer.attrs["NX_class"] = "NXsubentry"
multilayer_dict = sample_dict["multilayer"]
# Repeat FOR EACH LAYER:
for layer in multilayer_dict:
nx_layer = nx_multilayer.create_group(layer)
nx_layer.attrs["NX_class"] = "NXsubentry"
layer_dict = multilayer_dict[layer]
# Sub-groups of a layer
nx_target = nx_layer.create_group("target")
nx_target.attrs["NX_class"] = "NXsample"
target_dict = layer_dict["target"]
nx_laser_rastering = nx_layer.create_group("laser_rastering")
nx_pre_annealing = nx_layer.create_group("pre_annealing")
nx_post_annealing = nx_layer.create_group("post_annealing")
nx_laser_rastering.attrs["NX_class"] = "NXprocess"
nx_pre_annealing.attrs["NX_class"] = "NXprocess"
nx_post_annealing.attrs["NX_class"] = "NXprocess"
try:
nx_target.create_dataset("name", data=target_dict["name"])
nx_target.create_dataset("chemical_formula", data=target_dict["chemical_formula"])
nx_target.create_dataset("description", data=target_dict["description"])
nx_target.create_dataset("shape", data=target_dict["shape"])
nx_target.create_dataset("dimensions", data=target_dict["dimensions"])
nx_target.create_dataset("thickness", data=target_dict["thickness"]["value"]) # float/int
nx_target["thickness"].attrs["units"] = target_dict["thickness"]["units"]
nx_target.create_dataset("solid_form", data=target_dict["solid_form"])
nx_target.create_dataset("manufacturer", data=target_dict["manufacturer"])
nx_target.create_dataset("batch_id", data=target_dict["batch_id"])
except TypeError as te:
raise TypeError(te)
try:
nx_layer.create_dataset("start_time", data = layer_dict["start_time"])
nx_layer.create_dataset("operator", data = layer_dict["operator"])
nx_layer.create_dataset("number_of_pulses", data = layer_dict["number_of_pulses"])
nx_layer.create_dataset("deposition_time", data = layer_dict["deposition_time"]["value"])
nx_layer["deposition_time"].attrs["units"] = layer_dict["deposition_time"]["units"]
nx_layer.create_dataset("repetition_rate", data = layer_dict["repetition_rate"]["value"])
nx_layer["repetition_rate"].attrs["units"] = layer_dict["repetition_rate"]["units"]
nx_layer.create_dataset("temperature", data = layer_dict["temperature"]["value"])
nx_layer["temperature"].attrs["units"] = layer_dict["temperature"]["units"]
nx_layer.create_dataset("heating_method", data = layer_dict["heating_method"])
nx_layer.create_dataset("layer_thickness", data = layer_dict["layer_thickness"]["value"])
nx_layer["layer_thickness"].attrs["units"] = layer_dict["layer_thickness"]["units"]
nx_layer.create_dataset("buffer_gas", data = layer_dict["buffer_gas"])
nx_layer.create_dataset("process_pressure", data = layer_dict["process_pressure"]["value"])
nx_layer["process_pressure"].attrs["units"] = layer_dict["process_pressure"]["units"]
nx_layer.create_dataset("heater_target_distance", data = layer_dict["heater_target_distance"]["value"])
nx_layer["heater_target_distance"].attrs["units"] = layer_dict["heater_target_distance"]["units"]
nx_layer.create_dataset("laser_fluence", data = layer_dict["laser_fluence"]["value"])
nx_layer["laser_fluence"].attrs["units"] = layer_dict["laser_fluence"]["units"]
nx_layer.create_dataset("laser_spot_area", data = layer_dict["laser_spot_area"]["value"])
nx_layer["laser_spot_area"].attrs["units"] = layer_dict["laser_spot_area"]["units"]
nx_layer.create_dataset("laser_energy", data = layer_dict["laser_energy"]["value"])
nx_layer["laser_energy"].attrs["units"] = layer_dict["laser_energy"]["units"]
except TypeError as te:
raise TypeError(te)
return
if __name__=="__main__":
# TO-DO: place the API base URL somewhere else.
@@ -282,4 +361,5 @@ if __name__=="__main__":
result = make_nexus_schema_dictionary(substrate_object, layers)
# print(make_nexus_schema_dictionary(substrate_object, layers)) # debug
with open (f"output/sample-{sample_name}.json", "w") as f:
json.dump(result, f, indent=3)
json.dump(result, f, indent=3)
build_nexus_file(result, output_path=f"output/sample-{sample_name}-nexus.h5")