refactor(eps): deactivate black for eps.py to keep signal component formatted in single line.
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
"""EPS module for cSAXS beamline: defines the EPS device with its components and methods."""
|
||||
|
||||
# fmt: off
|
||||
# Disable Black formatting for this file to preserve an easier readable structure for the component definitions.
|
||||
|
||||
# pylint: disable=line-too-long
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
@@ -30,553 +34,96 @@ class EPSSubDevices(Device):
|
||||
class EPSAlarms(EPSSubDevices):
|
||||
"""EPS alarms at the cSAXS beamline."""
|
||||
|
||||
eps_alarm_cnt = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-EPS-PLC:AlarmCnt_EPS",
|
||||
add_prefix=("",),
|
||||
name="eps_alarm_cnt",
|
||||
kind=Kind.omitted,
|
||||
doc="X12SA EPS Alarm count",
|
||||
auto_monitor=True,
|
||||
labels={"alarm"},
|
||||
)
|
||||
mis_alarm_cnt = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="ARS00-MIS-PLC-01:AlarmCnt_Frontends",
|
||||
add_prefix=("",),
|
||||
name="mis_alarm_cnt",
|
||||
kind=Kind.omitted,
|
||||
doc="FrontEnd MIS Alarm count",
|
||||
auto_monitor=True,
|
||||
labels={"alarm"},
|
||||
)
|
||||
eps_alarm_cnt = Cpt(EpicsSignalRO, read_pv="X12SA-EPS-PLC:AlarmCnt_EPS", add_prefix=("",), name="eps_alarm_cnt", kind=Kind.omitted, doc="X12SA EPS Alarm count", auto_monitor=True, labels={"alarm"})
|
||||
mis_alarm_cnt = Cpt(EpicsSignalRO, read_pv="ARS00-MIS-PLC-01:AlarmCnt_Frontends", add_prefix=("",), name="mis_alarm_cnt", kind=Kind.omitted, doc="FrontEnd MIS Alarm count", auto_monitor=True, labels={"alarm"})
|
||||
|
||||
|
||||
class ValvesFrontend(EPSSubDevices):
|
||||
"""Valves frontend at the cSAXS beamline."""
|
||||
|
||||
################
|
||||
### Frontend ###
|
||||
################
|
||||
fe_vvpg_0000 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-VVPG-0000:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="fevvpg0000",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-VVPG-0000",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
fe_vvpg_1010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-VVPG-1010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="fevvpg1010",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-VVPG-1010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
fe_vvfv_2010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-VVFV-2010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="fevvfv2010",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-VVFV-2010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
fe_vvpg_2010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-VVPG-2010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="fevvpg2010",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-VVPG-2010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
|
||||
################
|
||||
### Optics ###
|
||||
################
|
||||
|
||||
fe_vvpg_0000 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-VVPG-0000:PLC_OPEN", add_prefix=("",), name="fevvpg0000", kind=Kind.omitted, doc="FE-VVPG-0000", auto_monitor=True, labels={"valve"})
|
||||
fe_vvpg_1010 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-VVPG-1010:PLC_OPEN", add_prefix=("",), name="fevvpg1010", kind=Kind.omitted, doc="FE-VVPG-1010", auto_monitor=True, labels={"valve"})
|
||||
fe_vvfv_2010 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-VVFV-2010:PLC_OPEN", add_prefix=("",), name="fevvfv2010", kind=Kind.omitted, doc="FE-VVFV-2010", auto_monitor=True, labels={"valve"})
|
||||
fe_vvpg_2010 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-VVPG-2010:PLC_OPEN", add_prefix=("",), name="fevvpg2010", kind=Kind.omitted, doc="FE-VVPG-2010", auto_monitor=True, labels={"valve"})
|
||||
|
||||
class ValvesOptics(EPSSubDevices):
|
||||
"""Valves at the optics hutch."""
|
||||
|
||||
op_vvpg_1010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-1010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg1010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-1010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_2010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-2010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg2010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-2010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_3010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-3010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg3010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-3010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_3020 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-3020:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg3020",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-3020",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_4010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-4010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg4010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-4010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_5010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-5010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg5010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-5010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_6010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-6010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg6010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-6010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_vvpg_7010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-VVPG-7010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="opvvpg7010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-VVPG-7010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
|
||||
##################
|
||||
### Endstation ###
|
||||
##################
|
||||
|
||||
|
||||
op_vvpg_1010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-1010:PLC_OPEN", add_prefix=("",), name="opvvpg1010", kind=Kind.omitted, doc="OP-VVPG-1010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_2010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-2010:PLC_OPEN", add_prefix=("",), name="opvvpg2010", kind=Kind.omitted, doc="OP-VVPG-2010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_3010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-3010:PLC_OPEN", add_prefix=("",), name="opvvpg3010", kind=Kind.omitted, doc="OP-VVPG-3010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_3020 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-3020:PLC_OPEN", add_prefix=("",), name="opvvpg3020", kind=Kind.omitted, doc="OP-VVPG-3020", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_4010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-4010:PLC_OPEN", add_prefix=("",), name="opvvpg4010", kind=Kind.omitted, doc="OP-VVPG-4010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_5010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-5010:PLC_OPEN", add_prefix=("",), name="opvvpg5010", kind=Kind.omitted, doc="OP-VVPG-5010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_6010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-6010:PLC_OPEN", add_prefix=("",), name="opvvpg6010", kind=Kind.omitted, doc="OP-VVPG-6010", auto_monitor=True, labels={"valve"})
|
||||
op_vvpg_7010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-VVPG-7010:PLC_OPEN", add_prefix=("",), name="opvvpg7010", kind=Kind.omitted, doc="OP-VVPG-7010", auto_monitor=True, labels={"valve"})
|
||||
class ValvesEndstation(EPSSubDevices):
|
||||
"""Endstation valves at the cSAXS beamline."""
|
||||
|
||||
es_vvpg_1010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-ES-VVPG-1010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="esvvpg1010",
|
||||
kind=Kind.omitted,
|
||||
doc="ES-VVPG-1010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
|
||||
es_vvpg_1010 = Cpt(EpicsSignalRO, read_pv="X12SA-ES-VVPG-1010:PLC_OPEN", add_prefix=("",), name="esvvpg1010", kind=Kind.omitted, doc="ES-VVPG-1010", auto_monitor=True, labels={"valve"})
|
||||
|
||||
class ShuttersFrontend(EPSSubDevices):
|
||||
"""Shutters frontend."""
|
||||
|
||||
fe_psh1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-PSH1-EMLS-0010:OPEN",
|
||||
add_prefix=("",),
|
||||
name="fepsh1",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-PSH1-EMLS-0010",
|
||||
auto_monitor=True,
|
||||
labels={"shutter"},
|
||||
)
|
||||
fe_sto1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-FE-STO1-EMLS-0010:OPEN",
|
||||
add_prefix=("",),
|
||||
name="festo1",
|
||||
kind=Kind.omitted,
|
||||
doc="FE-STO1-EMLS-0010",
|
||||
auto_monitor=True,
|
||||
labels={"shutter"},
|
||||
)
|
||||
|
||||
fe_psh1 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-PSH1-EMLS-0010:OPEN", add_prefix=("",), name="fepsh1", kind=Kind.omitted, doc="FE-PSH1-EMLS-0010", auto_monitor=True, labels={"shutter"})
|
||||
fe_sto1 = Cpt(EpicsSignalRO, read_pv="X12SA-FE-STO1-EMLS-0010:OPEN", add_prefix=("",), name="festo1", kind=Kind.omitted, doc="FE-STO1-EMLS-0010", auto_monitor=True, labels={"shutter"})
|
||||
|
||||
class ShuttersEndstation(EPSSubDevices):
|
||||
"""Shutters at the endstation."""
|
||||
|
||||
es_psh17010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-PSH1-EMLS-7010:OPEN",
|
||||
add_prefix=("",),
|
||||
name="espsh17010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-PSH1-EMLS-7010",
|
||||
auto_monitor=True,
|
||||
labels={"shutter"},
|
||||
)
|
||||
|
||||
es_psh17010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-PSH1-EMLS-7010:OPEN", add_prefix=("",), name="espsh17010", kind=Kind.omitted, doc="OP-PSH1-EMLS-7010", auto_monitor=True, labels={"shutter"})
|
||||
|
||||
class DMMMonochromator(EPSSubDevices):
|
||||
"""DMM monochromator signals at the cSAXS beamline."""
|
||||
|
||||
dmm_temp_surface_1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-ETTC-3010:TEMP",
|
||||
add_prefix=("",),
|
||||
name="dmm_temp_surface_1",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Temp Surface 1",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
dmm_temp_surface_2 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-ETTC-3020:TEMP",
|
||||
add_prefix=("",),
|
||||
name="dmm_temp_surface_2",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Temp Surface 2",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
dmm_temp_shield_1_disaster = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-ETTC-3030:TEMP",
|
||||
add_prefix=("",),
|
||||
name="dmm_temp_shield_1_disaster",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Temp Shield 1 (disaster)",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
dmm_temp_shield_2_disaster = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-ETTC-3040:TEMP",
|
||||
add_prefix=("",),
|
||||
name="dmm_temp_shield_2_disaster",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Temp Shield 2 (disaster)",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
dmm_temp_surface_1 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-ETTC-3010:TEMP", add_prefix=("",), name="dmm_temp_surface_1", kind=Kind.omitted, doc="DMM Temp Surface 1", auto_monitor=True, labels={"temp"})
|
||||
dmm_temp_surface_2 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-ETTC-3020:TEMP", add_prefix=("",), name="dmm_temp_surface_2", kind=Kind.omitted, doc="DMM Temp Surface 2", auto_monitor=True, labels={"temp"})
|
||||
dmm_temp_shield_1_disaster = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-ETTC-3030:TEMP", add_prefix=("",), name="dmm_temp_shield_1_disaster", kind=Kind.omitted, doc="DMM Temp Shield 1 (disaster)", auto_monitor=True, labels={"temp"})
|
||||
dmm_temp_shield_2_disaster = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-ETTC-3040:TEMP", add_prefix=("",), name="dmm_temp_shield_2_disaster", kind=Kind.omitted, doc="DMM Temp Shield 2 (disaster)", auto_monitor=True, labels={"temp"})
|
||||
|
||||
dmm_translation_thru = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMLS-3010:THRU",
|
||||
add_prefix=("",),
|
||||
name="dmm_translation_thru",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Translation ThruPos",
|
||||
auto_monitor=True,
|
||||
labels={"switch"},
|
||||
)
|
||||
dmm_translation_in = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMLS-3020:IN",
|
||||
add_prefix=("",),
|
||||
name="dmm_translation_in",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Translation InPos",
|
||||
auto_monitor=True,
|
||||
labels={"switch"},
|
||||
)
|
||||
dmm_bragg_thru = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMLS-3030:THRU",
|
||||
add_prefix=("",),
|
||||
name="dmm_bragg_thru",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Bragg ThruPos",
|
||||
auto_monitor=True,
|
||||
labels={"switch"},
|
||||
)
|
||||
dmm_bragg_in = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMLS-3040:IN",
|
||||
add_prefix=("",),
|
||||
name="dmm_bragg_in",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Bragg InPos",
|
||||
auto_monitor=True,
|
||||
labels={"switch"},
|
||||
)
|
||||
dmm_translation_thru = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMLS-3010:THRU", add_prefix=("",), name="dmm_translation_thru", kind=Kind.omitted, doc="DMM Translation ThruPos", auto_monitor=True, labels={"switch"})
|
||||
dmm_translation_in = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMLS-3020:IN", add_prefix=("",), name="dmm_translation_in", kind=Kind.omitted, doc="DMM Translation InPos", auto_monitor=True, labels={"switch"})
|
||||
dmm_bragg_thru = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMLS-3030:THRU", add_prefix=("",), name="dmm_bragg_thru", kind=Kind.omitted, doc="DMM Bragg ThruPos", auto_monitor=True, labels={"switch"})
|
||||
dmm_bragg_in = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMLS-3040:IN", add_prefix=("",), name="dmm_bragg_in", kind=Kind.omitted, doc="DMM Bragg InPos", auto_monitor=True, labels={"switch"})
|
||||
|
||||
dmm_heater_fault_xtal_1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMSW-3050:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="dmm_heater_fault_xtal_1",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Heater Fault XTAL 1",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
dmm_heater_fault_xtal_2 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMSW-3060:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="dmm_heater_fault_xtal_2",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Heater Fault XTAL 2",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
dmm_heater_fault_support_1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM-EMSW-3070:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="dmm_heater_fault_support_1",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Heater Fault Support 1",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
dmm_heater_fault_xtal_1 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMSW-3050:SWITCH", add_prefix=("",), name="dmm_heater_fault_xtal_1", kind=Kind.omitted, doc="DMM Heater Fault XTAL 1", auto_monitor=True, labels={"fault"})
|
||||
dmm_heater_fault_xtal_2 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMSW-3060:SWITCH", add_prefix=("",), name="dmm_heater_fault_xtal_2", kind=Kind.omitted, doc="DMM Heater Fault XTAL 2", auto_monitor=True, labels={"fault"})
|
||||
dmm_heater_fault_support_1 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM-EMSW-3070:SWITCH", add_prefix=("",), name="dmm_heater_fault_support_1", kind=Kind.omitted, doc="DMM Heater Fault Support 1", auto_monitor=True, labels={"fault"})
|
||||
|
||||
dmm_energy = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM1:ENERGY-GET",
|
||||
add_prefix=("",),
|
||||
name="dmm_energy",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Energy",
|
||||
auto_monitor=True,
|
||||
labels={"energy"},
|
||||
)
|
||||
dmm_position = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM1:POSITION",
|
||||
add_prefix=("",),
|
||||
name="dmm_position",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Position",
|
||||
auto_monitor=True,
|
||||
labels={"string"},
|
||||
)
|
||||
dmm_stripe = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-DMM1:STRIPE",
|
||||
add_prefix=("",),
|
||||
name="dmm_stripe",
|
||||
kind=Kind.omitted,
|
||||
doc="DMM Stripe",
|
||||
auto_monitor=True,
|
||||
labels={"string"},
|
||||
)
|
||||
dmm_energy = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM1:ENERGY-GET", add_prefix=("",), name="dmm_energy", kind=Kind.omitted, doc="DMM Energy", auto_monitor=True, labels={"energy"})
|
||||
dmm_position = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM1:POSITION", add_prefix=("",), name="dmm_position", kind=Kind.omitted, doc="DMM Position", auto_monitor=True, labels={"string"})
|
||||
dmm_stripe = Cpt(EpicsSignalRO, read_pv="X12SA-OP-DMM1:STRIPE", add_prefix=("",), name="dmm_stripe", kind=Kind.omitted, doc="DMM Stripe", auto_monitor=True, labels={"string"})
|
||||
|
||||
|
||||
class CCMMonochromator(EPSSubDevices):
|
||||
"""CCM monochromator signals at the cSAXS beamline."""
|
||||
|
||||
ccm_temp_crystal = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM-ETTC-4010:TEMP",
|
||||
add_prefix=("",),
|
||||
name="ccm_temp_crystal",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Temp Crystal",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
ccm_temp_shield_disaster = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM-ETTC-4020:TEMP",
|
||||
add_prefix=("",),
|
||||
name="ccm_temp_shield_disaster",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Temp Shield (disaster)",
|
||||
auto_monitor=True,
|
||||
labels={"temp"},
|
||||
)
|
||||
ccm_temp_crystal = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM-ETTC-4010:TEMP", add_prefix=("",), name="ccm_temp_crystal", kind=Kind.omitted, doc="CCM Temp Crystal", auto_monitor=True, labels={"temp"})
|
||||
ccm_temp_shield_disaster = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM-ETTC-4020:TEMP", add_prefix=("",), name="ccm_temp_shield_disaster", kind=Kind.omitted, doc="CCM Temp Shield (disaster)", auto_monitor=True, labels={"temp"})
|
||||
|
||||
ccm_heater_fault_1 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM-EMSW-4010:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="ccm_heater_fault_1",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Heater Fault 1",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
ccm_heater_fault_2 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM-EMSW-4020:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="ccm_heater_fault_2",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Heater Fault 2",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
ccm_heater_fault_3 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM-EMSW-4030:SWITCH",
|
||||
add_prefix=("",),
|
||||
name="ccm_heater_fault_3",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Heater Fault 3",
|
||||
auto_monitor=True,
|
||||
labels={"fault"},
|
||||
)
|
||||
ccm_heater_fault_1 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM-EMSW-4010:SWITCH", add_prefix=("",), name="ccm_heater_fault_1", kind=Kind.omitted, doc="CCM Heater Fault 1", auto_monitor=True, labels={"fault"})
|
||||
ccm_heater_fault_2 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM-EMSW-4020:SWITCH", add_prefix=("",), name="ccm_heater_fault_2", kind=Kind.omitted, doc="CCM Heater Fault 2", auto_monitor=True, labels={"fault"})
|
||||
ccm_heater_fault_3 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM-EMSW-4030:SWITCH", add_prefix=("",), name="ccm_heater_fault_3", kind=Kind.omitted, doc="CCM Heater Fault 3", auto_monitor=True, labels={"fault"})
|
||||
|
||||
ccm_energy = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM1:ENERGY-GET",
|
||||
add_prefix=("",),
|
||||
name="ccm_energy",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Energy",
|
||||
auto_monitor=True,
|
||||
labels={"energy"},
|
||||
)
|
||||
ccm_position = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CCM1:POSITION",
|
||||
add_prefix=("",),
|
||||
name="ccm_position",
|
||||
kind=Kind.omitted,
|
||||
doc="CCM Position",
|
||||
auto_monitor=True,
|
||||
labels={"string"},
|
||||
)
|
||||
ccm_energy = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM1:ENERGY-GET", add_prefix=("",), name="ccm_energy", kind=Kind.omitted, doc="CCM Energy", auto_monitor=True, labels={"energy"})
|
||||
ccm_position = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CCM1:POSITION", add_prefix=("",), name="ccm_position", kind=Kind.omitted, doc="CCM Position", auto_monitor=True, labels={"string"})
|
||||
|
||||
|
||||
class CoolingWater(EPSSubDevices):
|
||||
"""Cooling water signals at the cSAXS beamline."""
|
||||
|
||||
op_sl1_efsw_2010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-SL1-EFSW-2010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_sl1_efsw_2010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-SL1-EFSW-2010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_sl2_efsw_2010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-SL2-EFSW-2010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_sl2_efsw_2010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-SL2-EFSW-2010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_eb1_efsw_5010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-EB1-EFSW-5010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_eb1_efsw_5010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-EB1-EFSW-5010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_eb1_efsw_5020_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-EB1-EFSW-5020:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_eb1_efsw_5020_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-EB1-EFSW-5020",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_sl3_efsw_5010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-SL3-EFSW-5010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_sl3_efsw_5010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-SL3-EFSW-5010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_kb_efsw_6010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-KB-EFSW-6010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_kb_efsw_6010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-KB-EFSW-6010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_psh1_efsw_7010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-PSH1-EFSW-7010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="op_psh1_efsw_7010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-PSH1-EFSW-7010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
es_eb2_efsw_1010_flow = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-ES-EB2-EFSW-1010:FLOW",
|
||||
add_prefix=("",),
|
||||
name="es_eb2_efsw_1010_flow",
|
||||
kind=Kind.omitted,
|
||||
doc="ES-EB2-EFSW-1010",
|
||||
auto_monitor=True,
|
||||
labels={"flow"},
|
||||
)
|
||||
op_sl1_efsw_2010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-SL1-EFSW-2010:FLOW", add_prefix=("",), name="op_sl1_efsw_2010_flow", kind=Kind.omitted, doc="OP-SL1-EFSW-2010", auto_monitor=True, labels={"flow"})
|
||||
op_sl2_efsw_2010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-SL2-EFSW-2010:FLOW", add_prefix=("",), name="op_sl2_efsw_2010_flow", kind=Kind.omitted, doc="OP-SL2-EFSW-2010", auto_monitor=True, labels={"flow"})
|
||||
op_eb1_efsw_5010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-EB1-EFSW-5010:FLOW", add_prefix=("",), name="op_eb1_efsw_5010_flow", kind=Kind.omitted, doc="OP-EB1-EFSW-5010", auto_monitor=True, labels={"flow"})
|
||||
op_eb1_efsw_5020_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-EB1-EFSW-5020:FLOW", add_prefix=("",), name="op_eb1_efsw_5020_flow", kind=Kind.omitted, doc="OP-EB1-EFSW-5020", auto_monitor=True, labels={"flow"})
|
||||
op_sl3_efsw_5010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-SL3-EFSW-5010:FLOW", add_prefix=("",), name="op_sl3_efsw_5010_flow", kind=Kind.omitted, doc="OP-SL3-EFSW-5010", auto_monitor=True, labels={"flow"})
|
||||
op_kb_efsw_6010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-KB-EFSW-6010:FLOW", add_prefix=("",), name="op_kb_efsw_6010_flow", kind=Kind.omitted, doc="OP-KB-EFSW-6010", auto_monitor=True, labels={"flow"})
|
||||
op_psh1_efsw_7010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-OP-PSH1-EFSW-7010:FLOW", add_prefix=("",), name="op_psh1_efsw_7010_flow", kind=Kind.omitted, doc="OP-PSH1-EFSW-7010", auto_monitor=True, labels={"flow"})
|
||||
es_eb2_efsw_1010_flow = Cpt(EpicsSignalRO, read_pv="X12SA-ES-EB2-EFSW-1010:FLOW", add_prefix=("",), name="es_eb2_efsw_1010_flow", kind=Kind.omitted, doc="ES-EB2-EFSW-1010", auto_monitor=True, labels={"flow"})
|
||||
|
||||
op_cs_ecvw_0010 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CS-ECVW-0010:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="op_cs_ecvw_0010",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-CS-ECVW-0010",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_cs_ecvw_0020 = Cpt(
|
||||
EpicsSignalRO,
|
||||
read_pv="X12SA-OP-CS-ECVW-0020:PLC_OPEN",
|
||||
add_prefix=("",),
|
||||
name="op_cs_ecvw_0020",
|
||||
kind=Kind.omitted,
|
||||
doc="OP-CS-ECVW-0020",
|
||||
auto_monitor=True,
|
||||
labels={"valve"},
|
||||
)
|
||||
op_cs_ecvw_0010 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CS-ECVW-0010:PLC_OPEN", add_prefix=("",), name="op_cs_ecvw_0010", kind=Kind.omitted, doc="OP-CS-ECVW-0010", auto_monitor=True, labels={"valve"})
|
||||
op_cs_ecvw_0020 = Cpt(EpicsSignalRO, read_pv="X12SA-OP-CS-ECVW-0020:PLC_OPEN", add_prefix=("",), name="op_cs_ecvw_0020", kind=Kind.omitted, doc="OP-CS-ECVW-0020", auto_monitor=True, labels={"valve"})
|
||||
|
||||
|
||||
class EPS(PSIDeviceBase):
|
||||
@@ -592,26 +139,8 @@ class EPS(PSIDeviceBase):
|
||||
cooling_water = Cpt(CoolingWater, name="cooling_water", doc="Cooling Water")
|
||||
|
||||
# Acknowledgment signals for PLC communication (if needed for future use)
|
||||
ackerr = Cpt(
|
||||
EpicsSignal,
|
||||
read_pv="X12SA-EPS-PLC:ACKERR-REQUEST",
|
||||
add_prefix=("",),
|
||||
name="ackerr",
|
||||
kind=Kind.omitted,
|
||||
doc="ACKERR request - OP-CS-ECVW-0020",
|
||||
auto_monitor=True,
|
||||
labels={"request"},
|
||||
)
|
||||
request = Cpt(
|
||||
EpicsSignal,
|
||||
read_pv="X12SA-OP-CS-ECVW:PLC_REQUEST",
|
||||
add_prefix=("",),
|
||||
name="op_cs_ecvw_request",
|
||||
kind=Kind.omitted,
|
||||
doc="PLC request - OP-CS-ECVW-PLC_REQUEST",
|
||||
auto_monitor=True,
|
||||
labels={"request"},
|
||||
)
|
||||
ackerr = Cpt(EpicsSignal, read_pv="X12SA-EPS-PLC:ACKERR-REQUEST", add_prefix=("",), name="ackerr", kind=Kind.omitted, doc="ACKERR request - OP-CS-ECVW-0020", auto_monitor=True, labels={"request"})
|
||||
request = Cpt(EpicsSignal, read_pv="X12SA-OP-CS-ECVW:PLC_REQUEST", add_prefix=("",), name="op_cs_ecvw_request", kind=Kind.omitted, doc="PLC request - OP-CS-ECVW-PLC_REQUEST", auto_monitor=True, labels={"request"})
|
||||
|
||||
def _notify(self, msg: str, show_as_client_msg: bool = True):
|
||||
"""Utility method to print a message, and optionally send it to the client UI if it should be shown also as a client message."""
|
||||
@@ -657,11 +186,7 @@ class EPS(PSIDeviceBase):
|
||||
valves = [self.cooling_water.op_cs_ecvw_0010, self.cooling_water.op_cs_ecvw_0020]
|
||||
|
||||
# Flow channels list extracted from CHANNELS
|
||||
flow_items = [
|
||||
walk.item
|
||||
for walk in self.cooling_water.walk_signals()
|
||||
if "flow" in walk.item._ophyd_labels_
|
||||
]
|
||||
flow_items = [walk.item for walk in self.cooling_water.walk_signals() if "flow" in walk.item._ophyd_labels_]
|
||||
|
||||
# --- Step 1: EPS alarm reset ---
|
||||
alarm_value = self.safe_get(eps_alarm_sig, 0)
|
||||
@@ -701,16 +226,8 @@ class EPS(PSIDeviceBase):
|
||||
def snapshot():
|
||||
# Valve snapshot
|
||||
v_states = [self.safe_get(v, None) for v in valves]
|
||||
v1 = f"{valves[0].attr_name[-4:]}=" + (
|
||||
"OPEN "
|
||||
if v_states[0] is True or v_states[0] == 1
|
||||
else "CLOSED" if v_states[0] is False or v_states[0] == 0 else "N/A "
|
||||
)
|
||||
v2 = f"{valves[1].attr_name[-4:]}=" + (
|
||||
"OPEN "
|
||||
if v_states[1] is True or v_states[1] == 1
|
||||
else "CLOSED" if v_states[1] is False or v_states[1] == 0 else "N/A "
|
||||
)
|
||||
v1 = f"{valves[0].attr_name[-4:]}=" + ("OPEN " if v_states[0] is True or v_states[0] == 1 else "CLOSED" if v_states[0] is False or v_states[0] == 0 else "N/A ")
|
||||
v2 = f"{valves[1].attr_name[-4:]}=" + ("OPEN " if v_states[1] is True or v_states[1] == 1 else "CLOSED" if v_states[1] is False or v_states[1] == 0 else "N/A ")
|
||||
# 2 valves with a single space between => width ~ 21
|
||||
valve_str = f"{v1} {v2}"
|
||||
|
||||
@@ -718,9 +235,7 @@ class EPS(PSIDeviceBase):
|
||||
flow_states = []
|
||||
for fsig in flow_items:
|
||||
fval = self.safe_get(fsig, None)
|
||||
flow_states.append(
|
||||
True if fval in (1, True) else False if fval in (0, False) else None
|
||||
)
|
||||
flow_states.append(True if fval in (1, True) else False if fval in (0, False) else None)
|
||||
|
||||
ok = sum(1 for f in flow_states if f is True)
|
||||
fail = sum(1 for f in flow_states if f is False)
|
||||
@@ -751,9 +266,7 @@ class EPS(PSIDeviceBase):
|
||||
if both_open:
|
||||
if stable_until is None:
|
||||
stable_until = now + STABILITY
|
||||
print(
|
||||
f"[WaterCooling] Both valves OPEN → starting {STABILITY}s stability window…"
|
||||
)
|
||||
print(f"[WaterCooling] Both valves OPEN → starting {STABILITY}s stability window…")
|
||||
else:
|
||||
if now >= stable_until:
|
||||
print("→ SUCCESS: Valves remained OPEN during stability window.")
|
||||
@@ -775,10 +288,7 @@ class EPS(PSIDeviceBase):
|
||||
# ---- New: enum maps for numeric -> string rendering ----
|
||||
POSITION_ENUM = {0: "out of beam", 1: "in beam"}
|
||||
STRIPE_ENUM = {0: "Stripe 1 W/B4C", 1: "Stripe 2 NiV/B4C"}
|
||||
POSITION_ATTRS = {
|
||||
self.dmm_monochromator.dmm_position.attr_name,
|
||||
self.ccm_monochromator.ccm_position.attr_name,
|
||||
}
|
||||
POSITION_ATTRS = {self.dmm_monochromator.dmm_position.attr_name, self.ccm_monochromator.ccm_position.attr_name}
|
||||
STRIPE_ATTRS = {self.dmm_monochromator.dmm_stripe.attr_name}
|
||||
|
||||
def is_bool_like(v):
|
||||
@@ -831,9 +341,7 @@ class EPS(PSIDeviceBase):
|
||||
return f"{green+'OK'+white if not value else red+'FAULT'+white}"
|
||||
|
||||
# ------------------- VALVE/SHUTTER -----------------
|
||||
if (
|
||||
"valve" in signal._ophyd_labels_ or "shutter" in signal._ophyd_labels_
|
||||
) and is_bool_like(value):
|
||||
if ("valve" in signal._ophyd_labels_ or "shutter" in signal._ophyd_labels_) and is_bool_like(value):
|
||||
return f"{green+'OPEN'+white if value else red+'CLOSED'+white}"
|
||||
|
||||
# ------------------- FLOW (OK/FAIL) ----------------
|
||||
@@ -873,48 +381,46 @@ class EPS(PSIDeviceBase):
|
||||
return is_bool_like(v) and not bool(v)
|
||||
|
||||
if closed(v1) and closed(v2):
|
||||
print(
|
||||
f"\n{cyan}Hint:{white} Both water cooling valves are CLOSED.\n"
|
||||
f"You can open them using: {bold}dev.x12saEPS.water_cooling_op(){white}"
|
||||
)
|
||||
print(f"\n{cyan}Hint:{white} Both water cooling valves are CLOSED.\n" f"You can open them using: {bold}dev.x12saEPS.water_cooling_op(){white}")
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Consistency report
|
||||
# ----------------------------------------------------------
|
||||
# def consistency_report(self, *, verbose=True):
|
||||
# missing = []
|
||||
# dupes = []
|
||||
# seen = {}
|
||||
# fmt: on
|
||||
# ----------------------------------------------------------
|
||||
# Consistency report
|
||||
# ----------------------------------------------------------
|
||||
# def consistency_report(self, *, verbose=True):
|
||||
# missing = []
|
||||
# dupes = []
|
||||
# seen = {}
|
||||
|
||||
# for sub_device in self.walk_components():
|
||||
# section = sub_device.name
|
||||
# for walk in sub_device.walk_components():
|
||||
# cpt: Cpt = walk.ancestors[-1]
|
||||
# it: EpicsSignalRO = walk.item
|
||||
# if not hasattr(self, it["attr"]):
|
||||
# missing.append((section, it["attr"], it["label"], it["pv"]))
|
||||
# for sub_device in self.walk_components():
|
||||
# section = sub_device.name
|
||||
# for walk in sub_device.walk_components():
|
||||
# cpt: Cpt = walk.ancestors[-1]
|
||||
# it: EpicsSignalRO = walk.item
|
||||
# if not hasattr(self, it["attr"]):
|
||||
# missing.append((section, it["attr"], it["label"], it["pv"]))
|
||||
|
||||
# pv = it["pv"]
|
||||
# if pv in seen:
|
||||
# dupes.append((pv, seen[pv], (section, it["attr"], it["label"])))
|
||||
# else:
|
||||
# seen[pv] = (section, it["attr"], it["label"])
|
||||
# pv = it["pv"]
|
||||
# if pv in seen:
|
||||
# dupes.append((pv, seen[pv], (section, it["attr"], it["label"])))
|
||||
# else:
|
||||
# seen[pv] = (section, it["attr"], it["label"])
|
||||
|
||||
# if verbose:
|
||||
# print("=== Consistency Report ===")
|
||||
# if verbose:
|
||||
# print("=== Consistency Report ===")
|
||||
|
||||
# if missing:
|
||||
# print("\nMissing attributes:")
|
||||
# for sec, a, lbl, pv in missing:
|
||||
# print(f" - [{sec}] {a} {lbl} pv={pv}")
|
||||
# else:
|
||||
# print("\nNo missing attributes.")
|
||||
# if missing:
|
||||
# print("\nMissing attributes:")
|
||||
# for sec, a, lbl, pv in missing:
|
||||
# print(f" - [{sec}] {a} {lbl} pv={pv}")
|
||||
# else:
|
||||
# print("\nNo missing attributes.")
|
||||
|
||||
# if dupes:
|
||||
# print("\nDuplicate PVs:")
|
||||
# for pv, f1, f2 in dupes:
|
||||
# print(f" {pv} → {f1} AND {f2}")
|
||||
# else:
|
||||
# print("\nNo duplicate PVs.")
|
||||
# if dupes:
|
||||
# print("\nDuplicate PVs:")
|
||||
# for pv, f1, f2 in dupes:
|
||||
# print(f" {pv} → {f1} AND {f2}")
|
||||
# else:
|
||||
# print("\nNo duplicate PVs.")
|
||||
|
||||
# return {"missing_attrs": missing, "duplicate_pvs": dupes}
|
||||
# return {"missing_attrs": missing, "duplicate_pvs": dupes}
|
||||
|
||||
Reference in New Issue
Block a user