From 131d7f7f3ef3251959cd89e2f427ede1b41e88e8 Mon Sep 17 00:00:00 2001 From: x01da Date: Tue, 5 May 2026 13:38:56 +0200 Subject: [PATCH] Updated nexus structure --- .../file_writer/debye_nexus_structure.py | 144 +++++++++++++----- 1 file changed, 110 insertions(+), 34 deletions(-) diff --git a/debye_bec/file_writer/debye_nexus_structure.py b/debye_bec/file_writer/debye_nexus_structure.py index 33cf7b2..f2ff5c0 100644 --- a/debye_bec/file_writer/debye_nexus_structure.py +++ b/debye_bec/file_writer/debye_nexus_structure.py @@ -1,5 +1,6 @@ from bec_server.file_writer.default_writer import DefaultFormat +import debye_bec.bec_widgets.widgets.x01da_parameters as bl class DebyeNexusStructure(DefaultFormat): """Nexus Structure for Debye""" @@ -118,25 +119,35 @@ class DebyeNexusStructure(DefaultFormat): if "cm_rotx" in self.device_manager.devices: cm_incidence_angle = collimating_mirror.create_soft_link( - name="incidence angle", target="/entry/collection/devices/cm_rotx/cm_rotx/value" + name="incidence_angle", target="/entry/collection/devices/cm_rotx/cm_rotx/value" ) cm_incidence_angle.attrs["NX_class"] = "NX_FLOAT" cm_incidence_angle.attrs["units"] = "mrad" if "cm_roty" in self.device_manager.devices: cm_yaw_angle = collimating_mirror.create_soft_link( - name="yaw angle", target="/entry/collection/devices/cm_roty/cm_roty/value" + name="yaw_angle", target="/entry/collection/devices/cm_roty/cm_roty/value" ) cm_yaw_angle.attrs["NX_class"] = "NX_FLOAT" cm_yaw_angle.attrs["units"] = "mrad" if "cm_rotz" in self.device_manager.devices: cm_roll_angle = collimating_mirror.create_soft_link( - name="roll angle", target="/entry/collection/devices/cm_rotz/cm_rotz/value" + name="roll_angle", target="/entry/collection/devices/cm_rotz/cm_rotz/value" ) cm_roll_angle.attrs["NX_class"] = "NX_FLOAT" cm_roll_angle.attrs["units"] = "mrad" + if 'cm_trx' in self.device_manager.devices: + cm_trx = - self.device_manager.devices.cm_trx.read(cached=True).get('cm_trx').get('value') + stripe = 'Unknown' + for name, low, high in zip(bl.cm.surface, bl.cm.limOptX[0], bl.cm.limOptX[1]): + if low <= cm_trx <= high: + stripe = name + cm_stripe = collimating_mirror.create_dataset( + name="stripe", data=stripe + ) + cm_stripe.attrs["NX_class"] = "NX_CHAR" ################### ### fm mirror specific information @@ -160,26 +171,39 @@ class DebyeNexusStructure(DefaultFormat): if "fm_rotx" in self.device_manager.devices: fm_incidence_angle = focusing_mirror.create_soft_link( - name="incidence angle", target="/entry/collection/devices/fm_rotx/fm_rotx/value" + name="incidence_angle", target="/entry/collection/devices/fm_rotx/fm_rotx/value" ) fm_incidence_angle.attrs["NX_class"] = "NX_FLOAT" fm_incidence_angle.attrs["units"] = "mrad" if "fm_roty" in self.device_manager.devices: fm_yaw_angle = focusing_mirror.create_soft_link( - name="yaw angle", target="/entry/collection/devices/fm_roty/fm_roty/value" + name="yaw_angle", target="/entry/collection/devices/fm_roty/fm_roty/value" ) fm_yaw_angle.attrs["NX_class"] = "NX_FLOAT" fm_yaw_angle.attrs["units"] = "mrad" if "fm_rotz" in self.device_manager.devices: fm_roll_angle = focusing_mirror.create_soft_link( - name="roll angle", target="/entry/collection/devices/fm_rotz/fm_rotz/value" + name="roll_angle", target="/entry/collection/devices/fm_rotz/fm_rotz/value" ) fm_roll_angle.attrs["NX_class"] = "NX_FLOAT" fm_roll_angle.attrs["units"] = "mrad" - + if 'fm_trx' in self.device_manager.devices: + fm_trx = - self.device_manager.devices.fm_trx.read(cached=True).get('fm_trx').get('value') + stripe = 'Unknown' + for name, low, high in zip(bl.fm.surfaceFlat, bl.fm.limOptXFlat[1], bl.fm.limOptXFlat[0]): + if low <= fm_trx <= high: + stripe = name + ' (flat)' + for name, low, high in zip(bl.fm.surfaceToroid, bl.fm.limOptXToroid[1], bl.fm.limOptXToroid[0]): + if low <= fm_trx <= high: + stripe = name + ' (toroid)' + fm_stripe = focusing_mirror.create_dataset( + name="stripe", data=stripe + ) + fm_stripe.attrs["NX_class"] = "NX_CHAR" + ################### ## nidaq specific information ################### @@ -187,7 +211,44 @@ class DebyeNexusStructure(DefaultFormat): ## Logic if device exist if "nidaq" in self.device_manager.devices: - #ai_chans_bit = self.device_manager.devices.nidaq.ai_chans.read().get("nidaq_ai_chans").get("value") + #ai_chans_bits = self.device_manager.devices.nidaq.ai_chans.read(cached=True).get("nidaq_ai_chans").get("value") + ai_chans_bits = self.configuration.get("nidaq", {}).get("nidaq_ai_chans", {}).get("value") + ci_chans_bits = self.configuration.get("nidaq", {}).get("nidaq_ci_chans", {}).get("value") + #add_chans_bits = self.device_manager.devices.nidaq.add_chans.read(cached=True).get("nidaq_add_chans").get("value") + add_chans_bits = self.configuration.get("nidaq", {}).get("nidaq_add_chans", {}).get("value") + + measurement_mode = entry.create_group(name="mode") + measurement_mode.attrs["NX_class"] = "NX_CHAR" + + if (int(ci_chans_bits) & 0x7F) != 0: + # Create a dataset + rayspec_sdd_active = measurement_mode.create_group(name="Multi_Element_Partial_Fluorescence_Yield") + me_sdd = rayspec_sdd_active.create_dataset(name="Detector", data="Rayspec 7 element Silicon Drift Detector") + me_sdd.attrs["NX_class"] = "NX_CHAR" + + if (int(ci_chans_bits) & (1<<8)) != 0: + # Create a dataset + ketek_sdd_active = measurement_mode.create_group(name="Single_Element_Partial_Fluorescence_Yield") + se_sdd = ketek_sdd_active.create_dataset(name="Detector", data="Ketex mini single element Silicon Drift Detector") + se_sdd.attrs["NX_class"] = "NX_CHAR" + + if ((int(ai_chans_bits) & (1<<6)) != 0): + # Create a dataset + pips_active = measurement_mode.create_group(name="Total_Flourescence_Yield") + tfy = pips_active.create_dataset(name="Detector", data="Mirion Technologies Partially Depeleted PIPS Detector") + tfy.attrs["NX_class"] = "NX_CHAR" + + if ((int(ai_chans_bits) & (1<<0)) != 0) & ((int(ai_chans_bits) & (1<<2)) != 0): + # Create a dataset + ai0ai2_active = measurement_mode.create_group(name="Sample_Transmission") + sam_trans = ai0ai2_active.create_dataset(name="Detector", data="Ionitec 15 cm gas filled Ionisation Chambers") + sam_trans.attrs["NX_class"] = "NX_CHAR" + + if ((int(ai_chans_bits) & (1<<2)) != 0) & ((int(ai_chans_bits) & (1<<4)) != 0): + # Create a dataset + ai2ai4_active = measurement_mode.create_group(name="Reference_Transmission") + ref_trans = ai2ai4_active.create_dataset(name="Detector", data="Ionitec 15 cm gas filled Ionisation Chambers") + ref_trans.attrs["NX_class"] = "NX_CHAR" main_data = entry.create_group(name="data") main_data.attrs["NX_class"] = "NXdata" @@ -203,53 +264,68 @@ class DebyeNexusStructure(DefaultFormat): main_data.create_soft_link(name="energy", target="/entry/collection/readout_groups/async/nidaq/nidaq_energy/value") ################## - ## i0, test whether the signal exists. how to check from config? + ## i0 ################### - #if (int(ai_chans_bit) & (1<<0)) !=0: - i0 = main_data.create_group(name="i0") - i0.attrs["NX_class"] = "NXdata" - i0.attrs["units"] = "V" + if (int(ai_chans_bits) & (1<<0)) !=0: + i0 = main_data.create_group(name="i0") + i0.attrs["NX_class"] = "NXdata" + i0.attrs["units"] = "V" - main_data.create_soft_link(name="i0", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai0_mean/value") + main_data.create_soft_link(name="i0", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai0_mean/value") ################## - ## i1, test whether the signal exists. how to check from config? + ## i1 ################### - i1 = main_data.create_group(name="i1") - i1.attrs["NX_class"] = "NXdata" - i1.attrs["units"] = "V" - - main_data.create_soft_link(name="i1", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai2_mean/value") + if (int(ai_chans_bits) & (1<<2)) !=0: + i1 = main_data.create_group(name="i1") + i1.attrs["NX_class"] = "NXdata" + i1.attrs["units"] = "V" + + main_data.create_soft_link(name="i1", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai2_mean/value") ################## - ## i2, test whether the signal exists. how to check from config? + ## i2 ################### - - i2 = main_data.create_group(name="i2") - i2.attrs["NX_class"] = "NXdata" - i2.attrs["units"] = "V" - - main_data.create_soft_link(name="i2", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai4_mean/value") + + if (int(ai_chans_bits) & (1<<4)) !=0: + i2 = main_data.create_group(name="i2") + i2.attrs["NX_class"] = "NXdata" + i2.attrs["units"] = "V" + + main_data.create_soft_link(name="i2", target="/entry/collection/readout_groups/async/nidaq/nidaq_ai4_mean/value") + + ################## + ## ci sum + ################### + + if int(ci_chans_bits) > 0: + ci_sum = main_data.create_group(name="Fluorescence_Sum") + ci_sum.attrs["NX_class"] = "NXdata" + ci_sum.attrs["units"] = "counts" + + main_data.create_soft_link(name="Fluorescence_Sum", target="/entry/collection/readout_groups/async/nidaq/nidaq_cisum/value") ################## ## mu sample, test whether the signal exists. how to check from config? ################### + + if (int(add_chans_bits) & (1<<0)) !=0: + mu_sample = main_data.create_group(name="mu_sample") + mu_sample.attrs["NX_class"] = "NXdata" - mu_sample = main_data.create_group(name="mu_sample") - mu_sample.attrs["NX_class"] = "NXdata" - - main_data.create_soft_link(name="mu_sample", target="/entry/collection/readout_groups/async/nidaq/nidaq_smpl_abs/value") + main_data.create_soft_link(name="mu_sample", target="/entry/collection/readout_groups/async/nidaq/nidaq_smpl_abs/value") ################## ## mu reference, test whether the signal exists. how to check from config? ################### - mu_reference = main_data.create_group(name="mu_reference") - mu_reference.attrs["NX_class"] = "NXdata" + if (int(add_chans_bits) & (1<<1)) !=0: + mu_reference = main_data.create_group(name="mu_reference") + mu_reference.attrs["NX_class"] = "NXdata" - main_data.create_soft_link(name="mu_reference", target="/entry/collection/readout_groups/async/nidaq/nidaq_ref_abs/value") + main_data.create_soft_link(name="mu_reference", target="/entry/collection/readout_groups/async/nidaq/nidaq_ref_abs/value")