diff --git a/debye_bec/device_configs/x01da_standard_config.yaml b/debye_bec/device_configs/x01da_standard_config.yaml index 3490ae0..2015fef 100644 --- a/debye_bec/device_configs/x01da_standard_config.yaml +++ b/debye_bec/device_configs/x01da_standard_config.yaml @@ -25,7 +25,7 @@ frontend_config: ## Bragg Monochromator mo1_bragg: - readoutPriority: monitored + readoutPriority: baseline description: Positioner for the Monochromator deviceClass: debye_bec.devices.mo1_bragg.mo1_bragg.Mo1Bragg deviceConfig: @@ -33,15 +33,15 @@ mo1_bragg: onFailure: retry enabled: true softwareTrigger: false -mo1_bragg_angle: - readoutPriority: baseline - description: Positioner for the Monochromator - deviceClass: debye_bec.devices.mo1_bragg.mo1_bragg_angle.Mo1BraggAngle - deviceConfig: - prefix: "X01DA-OP-MO1:BRAGG:" - onFailure: retry - enabled: true - softwareTrigger: false +#mo1_bragg_angle: +# readoutPriority: baseline +# description: Positioner for the Monochromator +# deviceClass: debye_bec.devices.mo1_bragg.mo1_bragg_angle.Mo1BraggAngle +# deviceConfig: +# prefix: "X01DA-OP-MO1:BRAGG:" +# onFailure: retry +# enabled: true +# softwareTrigger: false ## Remaining optics hutch optics_config: diff --git a/debye_bec/file_writer/debye_nexus_structure.py b/debye_bec/file_writer/debye_nexus_structure.py index ebabcd7..33cf7b2 100644 --- a/debye_bec/file_writer/debye_nexus_structure.py +++ b/debye_bec/file_writer/debye_nexus_structure.py @@ -12,102 +12,6 @@ class DebyeNexusStructure(DefaultFormat): instrument = entry.create_group(name="instrument") instrument.attrs["NX_class"] = "NXinstrument" - ################### - ## mo1_bragg specific information - ################### - - # Logic if device exist - if "mo1_bragg" in self.device_manager.devices: - - monochromator = instrument.create_group(name="monochromator") - monochromator.attrs["NX_class"] = "NXmonochromator" - crystal = monochromator.create_group(name="crystal") - crystal.attrs["NX_class"] = "NXcrystal" - - # Create a dataset - chemical_formular = crystal.create_dataset(name="chemical_formular", data="Si") - chemical_formular.attrs["NX_class"] = "NX_CHAR" - - # Create a softlink - d_spacing = crystal.create_soft_link( - name="d_spacing", - target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_d_spacing/value", - ) - d_spacing.attrs["NX_class"] = "NX_FLOAT" - - offset = crystal.create_soft_link( - name="offset", - target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_offset/value", - ) - offset.attrs["NX_class"] = "NX_FLOAT" - - reflection = crystal.create_soft_link( - name="reflection", - target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_xtal_string/value", - ) - reflection.attrs["NX_class"] = "NX_CHAR" - - ################## - ## cm mirror specific information - ################### - - collimating_mirror = instrument.create_group(name="collimating_mirror") - collimating_mirror.attrs["NX_class"] = "NXmirror" - - cm_substrate_material = collimating_mirror.create_dataset( - name="substrate_material", data="Si" - ) - cm_substrate_material.attrs["NX_class"] = "NX_CHAR" - - cm_bending_radius = collimating_mirror.create_soft_link( - name="sagittal radius", - target="/entry/collection/devices/cm_bnd_radius/cm_bnd_radius/value", - ) - cm_bending_radius.attrs["NX_class"] = "NX_FLOAT" - cm_bending_radius.attrs["units"] = "km" - - cm_incidence_angle = collimating_mirror.create_soft_link( - name="incidence angle", target="/entry/collection/devices/cm_rotx/cm_rotx/value" - ) - cm_incidence_angle.attrs["NX_class"] = "NX_FLOAT" - - cm_yaw_angle = collimating_mirror.create_soft_link( - name="incident angle", target="/entry/collection/devices/cm_roty/cm_roty/value" - ) - cm_yaw_angle.attrs["NX_class"] = "NX_FLOAT" - - ################## - ## fm mirror specific information - ################### - - focusing_mirror = instrument.create_group(name="focusing_mirror") - focusing_mirror.attrs["NX_class"] = "NXmirror" - - fm_substrate_material = focusing_mirror.create_dataset(name="substrate_material", data="Si") - fm_substrate_material.attrs["NX_class"] = "NX_CHAR" - - fm_bending_radius = focusing_mirror.create_soft_link( - name="sagittal radius", - target="/entry/collection/devices/fm_bnd_radius/fm_bnd_radius/value", - ) - fm_bending_radius.attrs["NX_class"] = "NX_FLOAT" - - fm_incidence_angle = focusing_mirror.create_soft_link( - name="incidence angle", - target="/entry/collection/devices/fm_incidence_angle/fm_incidence_angle/value", - ) - fm_incidence_angle.attrs["NX_class"] = "NX_FLOAT" - - fm_yaw_angle = focusing_mirror.create_soft_link( - name="yaw angle", target="/entry/collection/devices/fm_roty/fm_roty/value" - ) - fm_yaw_angle.attrs["NX_class"] = "NX_FLOAT" - - fm_roll_angle = focusing_mirror.create_soft_link( - name="roll angle", target="/entry/collection/devices/fm_rotz/fm_rotz/value" - ) - fm_roll_angle.attrs["NX_class"] = "NX_FLOAT" - ################## ## source specific information ################### @@ -123,3 +27,230 @@ class DebyeNexusStructure(DefaultFormat): probe = source.create_dataset(name="probe", data="X-ray") probe.attrs["NX_class"] = "NX_CHAR" + + if "curr" in self.device_manager.devices: + ring_current = source.create_soft_link( + name="ring_current", + target="/entry/collection/devices/curr/curr/value", + ) + ring_current.attrs["NX_class"] = "NX_FLOAT" + ring_current.attrs["units"] = "mA" + + ################### + ## mo1_bragg specific information + ################### + + ## Logic if device exist + if "mo1_bragg" in self.device_manager.devices: + + monochromator = instrument.create_group(name="monochromator") + monochromator.attrs["NX_class"] = "NXmonochromator" + crystal = monochromator.create_group(name="crystal") + crystal.attrs["NX_class"] = "NXcrystal" + + # Create a dataset + chemical_formular = crystal.create_dataset(name="chemical_formular", data="Si") + chemical_formular.attrs["NX_class"] = "NX_CHAR" + + reflection = crystal.create_soft_link( + name="reflection", + target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_xtal_string/value", + ) + reflection.attrs["NX_class"] = "NX_CHAR" + + # Create a softlink + d_spacing = crystal.create_soft_link( + name="d_spacing", + target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_d_spacing/value", + ) + d_spacing.attrs["NX_class"] = "NX_FLOAT" + d_spacing.attrs["units"] = "angstrom" + + bragg_offset = crystal.create_soft_link( + name="bragg_offset", + target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_bragg_off/value", + ) + bragg_offset.attrs["NX_class"] = "NX_FLOAT" + bragg_offset.attrs["units"] = "degree" + + phi_offset = crystal.create_soft_link( + name="phi_offset", + target="/entry/collection/devices/mo1_bragg/mo1_bragg_crystal_current_phi_off/value", + ) + phi_offset.attrs["NX_class"] = "NX_FLOAT" + phi_offset.attrs["units"] = "degree" + + ## Logic if device exist + if "mo1_roty" in self.device_manager.devices: + + # Create a softlink + azimuthal_angle = crystal.create_soft_link( + name="azimuthal_angle", + target="/entry/collection/devices/mo1_roty/mo1_roty/value", + ) + azimuthal_angle.attrs["NX_class"] = "NX_FLOAT" + azimuthal_angle.attrs["units"] = "degree" + + + #TODO add phi offset, currently missing from mo1 device, unify device naming (mo vs mo1) + + ################### + ### cm mirror specific information + #################### + + collimating_mirror = instrument.create_group(name="collimating_mirror") + collimating_mirror.attrs["NX_class"] = "NXmirror" + + cm_substrate_material = collimating_mirror.create_dataset( + name="substrate_material", data="Si" + ) + cm_substrate_material.attrs["NX_class"] = "NX_CHAR" + + #previous error due to space in name field + + if "cm_bnd_radius" in self.device_manager.devices: + cm_bending_radius = collimating_mirror.create_soft_link( + name="sagittal_radius", + target="/entry/collection/devices/cm_bnd_radius/cm_bnd_radius/value", + ) + cm_bending_radius.attrs["NX_class"] = "NX_FLOAT" + cm_bending_radius.attrs["units"] = "km" + + 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" + ) + 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" + ) + 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" + ) + cm_roll_angle.attrs["NX_class"] = "NX_FLOAT" + cm_roll_angle.attrs["units"] = "mrad" + + + ################### + ### fm mirror specific information + #################### + + focusing_mirror = instrument.create_group(name="focusing_mirror") + focusing_mirror.attrs["NX_class"] = "NXmirror" + + fm_substrate_material = focusing_mirror.create_dataset( + name="substrate_material", data="Si" + ) + fm_substrate_material.attrs["NX_class"] = "NX_CHAR" + + if "fm_bnd_radius" in self.device_manager.devices: + fm_bending_radius = focusing_mirror.create_soft_link( + name="sagittal_radius", + target="/entry/collection/devices/fm_bnd_radius/fm_bnd_radius/value", + ) + fm_bending_radius.attrs["NX_class"] = "NX_FLOAT" + fm_bending_radius.attrs["units"] = "km" + + 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" + ) + 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" + ) + 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" + ) + fm_roll_angle.attrs["NX_class"] = "NX_FLOAT" + fm_roll_angle.attrs["units"] = "mrad" + + + ################### + ## nidaq specific information + ################### + + ## 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") + + main_data = entry.create_group(name="data") + main_data.attrs["NX_class"] = "NXdata" + + ################## + ## energy, test whether the signal exists. how to check from config? + ################### + + energy = main_data.create_group(name="energy") + energy.attrs["NX_class"] = "NXdata" + energy.attrs["units"] = "eV" + + 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? + ################### + + #if (int(ai_chans_bit) & (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") + + ################## + ## i1, test whether the signal exists. how to check from config? + ################### + + 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 = 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") + + ################## + ## mu sample, test whether the signal exists. how to check from config? + ################### + + 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") + + ################## + ## 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" + + main_data.create_soft_link(name="mu_reference", target="/entry/collection/readout_groups/async/nidaq/nidaq_ref_abs/value") + + + +