feat: use PV external in postmortemlog
Deploy / deploy (push) Successful in 18s

This commit is contained in:
Benjamin Labrecque
2026-07-17 11:27:08 +02:00
parent 67740791cd
commit 8ed97a263a
@@ -14,7 +14,7 @@ import numpy as np
from epics import poll
from agebd.h5 import h5save
from agebd.pv import get_pv_class
from agebd.pv import get_pv_class, get_pv_external_class
from agebd.service.base import BaseService
from agebd.service.pvs import BasePVs
from agebd.utils import printgetversion
@@ -22,6 +22,7 @@ from agebd.utils import printgetversion
__version__ = printgetversion(__file__)
PV = get_pv_class()
PV_EXTERNAL = get_pv_external_class()
plt.switch_backend("agg")
plt.rcParams.update({"font.size": 18})
@@ -41,86 +42,88 @@ class PVs(BasePVs):
postdelay = PV("AGEBD-POSTMORTEMLOG:BEAM-ABORT-EVT.ODLY")
# Potential Service Callback PVs
bdcinputsum = PV("AGESA-SBDC-0000:SUM_INPUT_NOT_OK.VAL", auto_monitor=True)
bdcinputsum_latched = PV("AGESA-SBDC-0000:SUM_INPUT_NOT_OK_LATCHED.VAL", auto_monitor=True)
bdcinputsum = PV_EXTERNAL("AGESA-SBDC-0000:SUM_INPUT_NOT_OK.VAL", auto_monitor=True)
bdcinputsum_latched = PV_EXTERNAL(
"AGESA-SBDC-0000:SUM_INPUT_NOT_OK_LATCHED.VAL", auto_monitor=True
)
# Minimum current condition
pctmaster = PV("ARS07-DPCT-0000:CURR.VAL")
pctmaster = PV_EXTERNAL("ARS07-DPCT-0000:CURR.VAL")
# Service Input PVs (Post Mortem Information)
bdc_interlocks = [
PV("AGESA-SBDC-0000:CH{:02.0f}-INPUT_OK_LATCHED.VAL".format(i)) for i in range(21)
PV_EXTERNAL("AGESA-SBDC-0000:CH{:02.0f}-INPUT_OK_LATCHED.VAL".format(i)) for i in range(21)
]
bdc_delays = [PV("AGESA-SBDC-0000:CH{:02.0f}-DELAY.VAL".format(i)) for i in range(21)]
bdc_delays = [PV_EXTERNAL("AGESA-SBDC-0000:CH{:02.0f}-DELAY.VAL".format(i)) for i in range(21)]
pmioc_time = PV("ARS01-MKIK-0050-1:TRIG-CNT.VAL")
pmioc_time = PV_EXTERNAL("ARS01-MKIK-0050-1:TRIG-CNT.VAL")
vcs_alarmlist = PV("ARS00-VCS:PLC_AlarmList.VAL")
mis_alarmlist = PV("ARS00-MIS-PLC-01:AlarmList.VAL")
misfe_alarmlist = PV("ARS00-MIS-PLC-01:AlarmList_Frontends.VAL")
vcs_alarmlist = PV_EXTERNAL("ARS00-VCS:PLC_AlarmList.VAL")
mis_alarmlist = PV_EXTERNAL("ARS00-MIS-PLC-01:AlarmList.VAL")
misfe_alarmlist = PV_EXTERNAL("ARS00-MIS-PLC-01:AlarmList_Frontends.VAL")
# Counters
counter_bdc = PV("AGESA-SBDC-0000:INT-COUNTER.VAL", auto_monitor=True)
counter_dumpkicker = PV("ARS01-MKIK-0050-1:TRIG-CNT.VAL")
counter_tmaster_beamdump = PV("AGETI-CVME-MASTER-TMA:Evt-Beam-Dump-EVRCount-I.VAL")
counter_tmaster_postmortem = PV("AGETI-CVME-MASTER-TMA:Evt-PM-Rec-EVRCount-I.VAL")
counter_bdc = PV_EXTERNAL("AGESA-SBDC-0000:INT-COUNTER.VAL", auto_monitor=True)
counter_dumpkicker = PV_EXTERNAL("ARS01-MKIK-0050-1:TRIG-CNT.VAL")
counter_tmaster_beamdump = PV_EXTERNAL("AGETI-CVME-MASTER-TMA:Evt-Beam-Dump-EVRCount-I.VAL")
counter_tmaster_postmortem = PV_EXTERNAL("AGETI-CVME-MASTER-TMA:Evt-PM-Rec-EVRCount-I.VAL")
# Post Mortem Data as dict for easier access
PostMortemLinks = [
## BLMs
# IOC: ABODI-DFBL
PV("ABODI-DFBL:SigPm.A"),
PV("ABODI-DFBL:SigPm.B"),
PV("ABODI-DFBL:SigPm.C"),
PV("ABODI-DFBL:SigPm.D"),
PV_EXTERNAL("ABODI-DFBL:SigPm.A"),
PV_EXTERNAL("ABODI-DFBL:SigPm.B"),
PV_EXTERNAL("ABODI-DFBL:SigPm.C"),
PV_EXTERNAL("ABODI-DFBL:SigPm.D"),
# IOC: ARS01-DFBL
PV("ARS01-DFBL:SigPm.A"),
PV("ARS01-DFBL:SigPm.B"),
PV("ARS01-DFBL:SigPm.C"),
PV("ARS01-DFBL:SigPm.D"),
PV_EXTERNAL("ARS01-DFBL:SigPm.A"),
PV_EXTERNAL("ARS01-DFBL:SigPm.B"),
PV_EXTERNAL("ARS01-DFBL:SigPm.C"),
PV_EXTERNAL("ARS01-DFBL:SigPm.D"),
# IOC: ARS02-DFBL
PV("ARS02-DFBL:SigPm.A"),
PV("ARS02-DFBL:SigPm.B"),
PV("ARS02-DFBL:SigPm.C"),
PV("ARS02-DFBL:SigPm.D"),
PV_EXTERNAL("ARS02-DFBL:SigPm.A"),
PV_EXTERNAL("ARS02-DFBL:SigPm.B"),
PV_EXTERNAL("ARS02-DFBL:SigPm.C"),
PV_EXTERNAL("ARS02-DFBL:SigPm.D"),
# IOC: ARS06-DFBL
PV("ARS06-DFBL:SigPm.A"),
PV("ARS06-DFBL:SigPm.B"),
PV("ARS06-DFBL:SigPm.C"),
PV("ARS06-DFBL:SigPm.D"),
PV_EXTERNAL("ARS06-DFBL:SigPm.A"),
PV_EXTERNAL("ARS06-DFBL:SigPm.B"),
PV_EXTERNAL("ARS06-DFBL:SigPm.C"),
PV_EXTERNAL("ARS06-DFBL:SigPm.D"),
# IOC: ARS09-DFBL
PV("ARS09-DFBL:SigPm.A"),
PV("ARS09-DFBL:SigPm.B"),
PV("ARS09-DFBL:SigPm.C"),
PV("ARS09-DFBL:SigPm.D"),
PV_EXTERNAL("ARS09-DFBL:SigPm.A"),
PV_EXTERNAL("ARS09-DFBL:SigPm.B"),
PV_EXTERNAL("ARS09-DFBL:SigPm.C"),
PV_EXTERNAL("ARS09-DFBL:SigPm.D"),
## 4 Kicker Bump
PV("ARS01-MKIK-0140:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0140:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0220:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0220:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0850:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0850:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0940:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0940:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0140:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0140:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0220:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0220:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0850:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0850:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0940:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0940:CURRENT-WF.VAL"),
## Beam Dump Kicker
PV("ARS01-MKIK-0050-1:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0050-1:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0050-2:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0050-2:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0050-3:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0050-3:CURRENT-WF.VAL"),
PV("ARS01-MKIK-0050-4:TIME-AXIS.VAL"),
PV("ARS01-MKIK-0050-4:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-1:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-1:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-2:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-2:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-3:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-3:CURRENT-WF.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-4:TIME-AXIS.VAL"),
PV_EXTERNAL("ARS01-MKIK-0050-4:CURRENT-WF.VAL"),
## Beam Dump Post Mortem Digitizer
PV("ARF-LPD64:X-AXIS-CH1.VAL"),
PV("ARF-LPD64:CH1-DATA.VAL"),
PV("ARF-LPD64:X-AXIS-CH2.VAL"),
PV("ARF-LPD64:CH2-DATA.VAL"),
PV("ARF-LPD64:X-AXIS-CH3.VAL"),
PV("ARF-LPD64:CH3-DATA.VAL"),
PV("ARF-LPD64:X-AXIS-CH4.VAL"),
PV("ARF-LPD64:CH4-DATA.VAL"),
PV("AGESA-SBDC-0000:BUNCH0_MAGNET_RAMP_DELAY.VAL"),
PV_EXTERNAL("ARF-LPD64:X-AXIS-CH1.VAL"),
PV_EXTERNAL("ARF-LPD64:CH1-DATA.VAL"),
PV_EXTERNAL("ARF-LPD64:X-AXIS-CH2.VAL"),
PV_EXTERNAL("ARF-LPD64:CH2-DATA.VAL"),
PV_EXTERNAL("ARF-LPD64:X-AXIS-CH3.VAL"),
PV_EXTERNAL("ARF-LPD64:CH3-DATA.VAL"),
PV_EXTERNAL("ARF-LPD64:X-AXIS-CH4.VAL"),
PV_EXTERNAL("ARF-LPD64:CH4-DATA.VAL"),
PV_EXTERNAL("AGESA-SBDC-0000:BUNCH0_MAGNET_RAMP_DELAY.VAL"),
# ---------- FILLING PATTERN --------------
PV("AGEBD-POSTMORTEMLOG:BUFFER-FILLPATTERN-APD.VAL"),
]
@@ -260,7 +263,7 @@ class PVs(BasePVs):
for bpm in bpmnames:
for q in ["X", "Y", "Q"]:
bpmpvname = bpm + "PM-DATA-BEAM-" + q
PostMortemLinks.append(PV(bpmpvname))
PostMortemLinks.append(PV_EXTERNAL(bpmpvname))
# MBFB modes
# state of injection, state of pulsed magnets
@@ -396,18 +399,18 @@ class PVs(BasePVs):
for pvname in names_circ_buffer_ioc:
pvname = "AGEBD-POSTMORTEMLOG:BUFFER-" + pvname + "-LAST.VAL"
PostMortemLinks.append(PV(pvname))
PostMortemLinks.append(PV_EXTERNAL(pvname))
# Prepare machine for accumulation
master_trig = PV("AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel.VAL")
reset_bucket = PV("AGEBD-TIMING:ZERO-TARGET-BUCKET.VAL")
ID_gap_ena = PV("AGEOP-STATUS:LIGHT-DELIVERY.VAL")
master_trig = PV_EXTERNAL("AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel.VAL")
reset_bucket = PV_EXTERNAL("AGEBD-TIMING:ZERO-TARGET-BUCKET.VAL")
ID_gap_ena = PV_EXTERNAL("AGEOP-STATUS:LIGHT-DELIVERY.VAL")
def __init__(self, service_name: str, pv_factory=PV):
super().__init__(service_name, pv_factory)
PV = pv_factory
self.CallbackPV = PV("AGESA-SBDC-0000:INT-COUNTER.VAL", auto_monitor=True)
self.CallbackPV = PV_EXTERNAL("AGESA-SBDC-0000:INT-COUNTER.VAL", auto_monitor=True)
class vals: