BCDA-APS / apstools

various tools for use with Bluesky at the APS
https://bcda-aps.github.io/apstools/latest/
Other
16 stars 9 forks source link

Can listdevice() and object_explorer() be combined? #520

Closed prjemian closed 2 years ago

prjemian commented 3 years ago

These two functions are very similar. apstools.utils.listobject() makes a table of all the components of a Device subclass by databroker name (separator: _) and gives current values and timestamp of acquisition. apstools.utils.object_explorer() makes a table of all the EPICS components of a Device subclass by ophyd object name (separator: .) and gives the PV name and current value.

from apstools.devices import SwaitRecord
from apstools.utils import listdevice
from apstools.utils import object_explorer
from ophyd import Component, Device

class MyDevice(Device):
    calc5 = Component(SwaitRecord, "5")
    calc6 = Component(SwaitRecord, "6")

calcs = MyDevice("9idcLAX:userCalc", name="calcs")
listdevice(calcs) ``` ========================================= ================================ ========================== name value timestamp ========================================= ================================ ========================== calcs_calc5_description COld stage extension 2021-06-28 10:27:08.712133 calcs_calc5_processing_active 0 2021-06-28 10:27:08.712133 calcs_calc5_scanning_rate 9 2021-06-28 10:27:08.812133 calcs_calc5_disable_value 0 2021-06-28 10:27:08.812133 calcs_calc5_scan_disable_input_link_value 1 2021-06-28 10:27:08.812133 calcs_calc5_scan_disable_value_input_link 9idcLAX:userCalcEnable.VAL CA MS 2021-06-28 10:27:08.812133 calcs_calc5_process_record 0 2021-06-28 10:27:08.812133 calcs_calc5_forward_link 0 2021-06-28 10:27:08.812133 calcs_calc5_trace_processing 0 2021-06-28 10:27:08.812133 calcs_calc5_device_type 0 2021-06-28 10:27:08.812133 calcs_calc5_alarm_status 1 2021-06-28 10:27:08.812133 calcs_calc5_alarm_severity 3 2021-06-28 10:27:08.812133 calcs_calc5_new_alarm_status 0 2021-06-28 10:27:08.812133 calcs_calc5_new_alarm_severity 0 2021-06-28 10:27:08.812133 calcs_calc5_disable_alarm_severity 0 2021-06-28 10:27:08.812133 calcs_calc5_precision 6 2021-06-28 10:27:08.812133 calcs_calc5_high_operating_range 0.0 2021-06-28 10:27:08.812133 calcs_calc5_low_operating_range 0.0 2021-06-28 10:27:08.812133 calcs_calc5_calculated_value 1.9 2021-06-28 10:27:08.812133 calcs_calc5_calculation A/250 2021-06-28 10:27:08.812133 calcs_calc5_output_link_pv 2021-06-28 10:27:08.812133 calcs_calc5_output_location_name 2021-06-28 10:27:08.812133 calcs_calc5_output_location_data 0.0 2021-06-28 10:27:08.812133 calcs_calc5_output_data_option 0 2021-06-28 10:27:08.812133 calcs_calc5_output_execute_option 0 2021-06-28 10:27:08.812133 calcs_calc5_output_execution_delay 0.0 2021-06-28 10:27:08.812133 calcs_calc5_event_to_issue 0 2021-06-28 10:27:08.812133 calcs_calc5_channels_A_input_value 475.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_A_input_pv 9idcCOLD:piston_RBV 2021-06-28 10:27:08.812133 calcs_calc5_channels_A_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_B_input_value 0.0001 2021-06-28 10:27:08.812133 calcs_calc5_channels_B_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_B_input_trigger 0 2021-06-28 10:27:08.812133 calcs_calc5_channels_C_input_value 1.88 2021-06-28 10:27:08.812133 calcs_calc5_channels_C_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_C_input_trigger 0 2021-06-28 10:27:08.812133 calcs_calc5_channels_D_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_D_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_D_input_trigger 0 2021-06-28 10:27:08.812133 calcs_calc5_channels_E_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_E_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_E_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_F_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_F_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_F_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_G_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_G_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_G_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_H_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_H_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_H_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_I_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_I_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_I_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_J_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_J_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_J_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_K_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_K_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_K_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc5_channels_L_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc5_channels_L_input_pv 2021-06-28 10:27:08.812133 calcs_calc5_channels_L_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_description COld stage pressure 2021-06-28 10:27:08.812133 calcs_calc6_processing_active 0 2021-06-28 10:27:08.812133 calcs_calc6_scanning_rate 9 2021-06-28 10:27:08.812133 calcs_calc6_disable_value 0 2021-06-28 10:27:08.812133 calcs_calc6_scan_disable_input_link_value 1 2021-06-28 10:27:08.812133 calcs_calc6_scan_disable_value_input_link 9idcLAX:userCalcEnable.VAL CA MS 2021-06-28 10:27:08.812133 calcs_calc6_process_record 0 2021-06-28 10:27:08.812133 calcs_calc6_forward_link 0 2021-06-28 10:27:08.812133 calcs_calc6_trace_processing 0 2021-06-28 10:27:08.812133 calcs_calc6_device_type 0 2021-06-28 10:27:08.812133 calcs_calc6_alarm_status 1 2021-06-28 10:27:08.812133 calcs_calc6_alarm_severity 3 2021-06-28 10:27:08.812133 calcs_calc6_new_alarm_status 0 2021-06-28 10:27:08.812133 calcs_calc6_new_alarm_severity 0 2021-06-28 10:27:08.812133 calcs_calc6_disable_alarm_severity 0 2021-06-28 10:27:08.812133 calcs_calc6_precision 5 2021-06-28 10:27:08.812133 calcs_calc6_high_operating_range 0.0 2021-06-28 10:27:08.812133 calcs_calc6_low_operating_range 0.0 2021-06-28 10:27:08.812133 calcs_calc6_calculated_value 3.0 2021-06-28 10:27:08.812133 calcs_calc6_calculation 0.336*B+3 2021-06-28 10:27:08.812133 calcs_calc6_output_link_pv 2021-06-28 10:27:08.812133 calcs_calc6_output_location_name 2021-06-28 10:27:08.812133 calcs_calc6_output_location_data 0.0 2021-06-28 10:27:08.812133 calcs_calc6_output_data_option 0 2021-06-28 10:27:08.812133 calcs_calc6_output_execute_option 0 2021-06-28 10:27:08.812133 calcs_calc6_output_execution_delay 0.0 2021-06-28 10:27:08.812133 calcs_calc6_event_to_issue 0 2021-06-28 10:27:08.812133 calcs_calc6_channels_A_input_value 363.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_A_input_pv 9idcCOLD:force 2021-06-28 10:27:08.812133 calcs_calc6_channels_A_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_B_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_B_input_pv 9idcCOLD:force_RBV 2021-06-28 10:27:08.812133 calcs_calc6_channels_B_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_C_input_value 12.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_C_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_C_input_trigger 0 2021-06-28 10:27:08.812133 calcs_calc6_channels_D_input_value 1000000.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_D_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_D_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_E_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_E_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_E_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_F_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_F_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_F_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_G_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_G_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_G_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_H_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_H_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_H_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_I_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_I_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_I_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_J_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_J_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_J_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_K_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_K_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_K_input_trigger 1 2021-06-28 10:27:08.812133 calcs_calc6_channels_L_input_value 0.0 2021-06-28 10:27:08.812133 calcs_calc6_channels_L_input_pv 2021-06-28 10:27:08.812133 calcs_calc6_channels_L_input_trigger 1 2021-06-28 10:27:08.812133 ========================================= ================================ ========================== ```
object_explorer(calcs) ``` =================================== ====================== ================================ name PV reference value =================================== ====================== ================================ calc5.alarm_severity 9idcLAX:userCalc5.SEVR 3 calc5.alarm_status 9idcLAX:userCalc5.STAT 1 calc5.calculated_value 9idcLAX:userCalc5.VAL 1.9 calc5.calculation 9idcLAX:userCalc5.CALC A/250 calc5.channels.A.input_pv 9idcLAX:userCalc5.INAN 9idcCOLD:piston_RBV calc5.channels.A.input_trigger 9idcLAX:userCalc5.INAP 1 calc5.channels.A.input_value 9idcLAX:userCalc5.A 475.0 calc5.channels.B.input_pv 9idcLAX:userCalc5.INBN calc5.channels.B.input_trigger 9idcLAX:userCalc5.INBP 0 calc5.channels.B.input_value 9idcLAX:userCalc5.B 0.0001 calc5.channels.C.input_pv 9idcLAX:userCalc5.INCN calc5.channels.C.input_trigger 9idcLAX:userCalc5.INCP 0 calc5.channels.C.input_value 9idcLAX:userCalc5.C 1.88 calc5.channels.D.input_pv 9idcLAX:userCalc5.INDN calc5.channels.D.input_trigger 9idcLAX:userCalc5.INDP 0 calc5.channels.D.input_value 9idcLAX:userCalc5.D 0.0 calc5.channels.E.input_pv 9idcLAX:userCalc5.INEN calc5.channels.E.input_trigger 9idcLAX:userCalc5.INEP 1 calc5.channels.E.input_value 9idcLAX:userCalc5.E 0.0 calc5.channels.F.input_pv 9idcLAX:userCalc5.INFN calc5.channels.F.input_trigger 9idcLAX:userCalc5.INFP 1 calc5.channels.F.input_value 9idcLAX:userCalc5.F 0.0 calc5.channels.G.input_pv 9idcLAX:userCalc5.INGN calc5.channels.G.input_trigger 9idcLAX:userCalc5.INGP 1 calc5.channels.G.input_value 9idcLAX:userCalc5.G 0.0 calc5.channels.H.input_pv 9idcLAX:userCalc5.INHN calc5.channels.H.input_trigger 9idcLAX:userCalc5.INHP 1 calc5.channels.H.input_value 9idcLAX:userCalc5.H 0.0 calc5.channels.I.input_pv 9idcLAX:userCalc5.ININ calc5.channels.I.input_trigger 9idcLAX:userCalc5.INIP 1 calc5.channels.I.input_value 9idcLAX:userCalc5.I 0.0 calc5.channels.J.input_pv 9idcLAX:userCalc5.INJN calc5.channels.J.input_trigger 9idcLAX:userCalc5.INJP 1 calc5.channels.J.input_value 9idcLAX:userCalc5.J 0.0 calc5.channels.K.input_pv 9idcLAX:userCalc5.INKN calc5.channels.K.input_trigger 9idcLAX:userCalc5.INKP 1 calc5.channels.K.input_value 9idcLAX:userCalc5.K 0.0 calc5.channels.L.input_pv 9idcLAX:userCalc5.INLN calc5.channels.L.input_trigger 9idcLAX:userCalc5.INLP 1 calc5.channels.L.input_value 9idcLAX:userCalc5.L 0.0 calc5.description 9idcLAX:userCalc5.DESC COld stage extension calc5.device_type 9idcLAX:userCalc5.DTYP 0 calc5.disable_alarm_severity 9idcLAX:userCalc5.DISS 0 calc5.disable_value 9idcLAX:userCalc5.DISV 0 calc5.event_to_issue 9idcLAX:userCalc5.OEVT 0 calc5.forward_link 9idcLAX:userCalc5.FLNK 0 calc5.high_operating_range 9idcLAX:userCalc5.HOPR 0.0 calc5.low_operating_range 9idcLAX:userCalc5.LOPR 0.0 calc5.new_alarm_severity 9idcLAX:userCalc5.NSEV 0 calc5.new_alarm_status 9idcLAX:userCalc5.NSTA 0 calc5.output_data_option 9idcLAX:userCalc5.DOPT 0 calc5.output_execute_option 9idcLAX:userCalc5.OOPT 0 calc5.output_execution_delay 9idcLAX:userCalc5.ODLY 0.0 calc5.output_link_pv 9idcLAX:userCalc5.OUTN calc5.output_location_data 9idcLAX:userCalc5.DOLD 0.0 calc5.output_location_name 9idcLAX:userCalc5.DOLN calc5.precision 9idcLAX:userCalc5.PREC 6 calc5.process_record 9idcLAX:userCalc5.PROC 0 calc5.processing_active 9idcLAX:userCalc5.PACT 0 calc5.scan_disable_input_link_value 9idcLAX:userCalc5.DISA 1 calc5.scan_disable_value_input_link 9idcLAX:userCalc5.SDIS 9idcLAX:userCalcEnable.VAL CA MS calc5.scanning_rate 9idcLAX:userCalc5.SCAN 9 calc5.trace_processing 9idcLAX:userCalc5.TPRO 0 calc6.alarm_severity 9idcLAX:userCalc6.SEVR 3 calc6.alarm_status 9idcLAX:userCalc6.STAT 1 calc6.calculated_value 9idcLAX:userCalc6.VAL 3.0 calc6.calculation 9idcLAX:userCalc6.CALC 0.336*B+3 calc6.channels.A.input_pv 9idcLAX:userCalc6.INAN 9idcCOLD:force calc6.channels.A.input_trigger 9idcLAX:userCalc6.INAP 1 calc6.channels.A.input_value 9idcLAX:userCalc6.A 363.0 calc6.channels.B.input_pv 9idcLAX:userCalc6.INBN 9idcCOLD:force_RBV calc6.channels.B.input_trigger 9idcLAX:userCalc6.INBP 1 calc6.channels.B.input_value 9idcLAX:userCalc6.B 0.0 calc6.channels.C.input_pv 9idcLAX:userCalc6.INCN calc6.channels.C.input_trigger 9idcLAX:userCalc6.INCP 0 calc6.channels.C.input_value 9idcLAX:userCalc6.C 12.0 calc6.channels.D.input_pv 9idcLAX:userCalc6.INDN calc6.channels.D.input_trigger 9idcLAX:userCalc6.INDP 1 calc6.channels.D.input_value 9idcLAX:userCalc6.D 1000000.0 calc6.channels.E.input_pv 9idcLAX:userCalc6.INEN calc6.channels.E.input_trigger 9idcLAX:userCalc6.INEP 1 calc6.channels.E.input_value 9idcLAX:userCalc6.E 0.0 calc6.channels.F.input_pv 9idcLAX:userCalc6.INFN calc6.channels.F.input_trigger 9idcLAX:userCalc6.INFP 1 calc6.channels.F.input_value 9idcLAX:userCalc6.F 0.0 calc6.channels.G.input_pv 9idcLAX:userCalc6.INGN calc6.channels.G.input_trigger 9idcLAX:userCalc6.INGP 1 calc6.channels.G.input_value 9idcLAX:userCalc6.G 0.0 calc6.channels.H.input_pv 9idcLAX:userCalc6.INHN calc6.channels.H.input_trigger 9idcLAX:userCalc6.INHP 1 calc6.channels.H.input_value 9idcLAX:userCalc6.H 0.0 calc6.channels.I.input_pv 9idcLAX:userCalc6.ININ calc6.channels.I.input_trigger 9idcLAX:userCalc6.INIP 1 calc6.channels.I.input_value 9idcLAX:userCalc6.I 0.0 calc6.channels.J.input_pv 9idcLAX:userCalc6.INJN calc6.channels.J.input_trigger 9idcLAX:userCalc6.INJP 1 calc6.channels.J.input_value 9idcLAX:userCalc6.J 0.0 calc6.channels.K.input_pv 9idcLAX:userCalc6.INKN calc6.channels.K.input_trigger 9idcLAX:userCalc6.INKP 1 calc6.channels.K.input_value 9idcLAX:userCalc6.K 0.0 calc6.channels.L.input_pv 9idcLAX:userCalc6.INLN calc6.channels.L.input_trigger 9idcLAX:userCalc6.INLP 1 calc6.channels.L.input_value 9idcLAX:userCalc6.L 0.0 calc6.description 9idcLAX:userCalc6.DESC COld stage pressure calc6.device_type 9idcLAX:userCalc6.DTYP 0 calc6.disable_alarm_severity 9idcLAX:userCalc6.DISS 0 calc6.disable_value 9idcLAX:userCalc6.DISV 0 calc6.event_to_issue 9idcLAX:userCalc6.OEVT 0 calc6.forward_link 9idcLAX:userCalc6.FLNK 0 calc6.high_operating_range 9idcLAX:userCalc6.HOPR 0.0 calc6.low_operating_range 9idcLAX:userCalc6.LOPR 0.0 calc6.new_alarm_severity 9idcLAX:userCalc6.NSEV 0 calc6.new_alarm_status 9idcLAX:userCalc6.NSTA 0 calc6.output_data_option 9idcLAX:userCalc6.DOPT 0 calc6.output_execute_option 9idcLAX:userCalc6.OOPT 0 calc6.output_execution_delay 9idcLAX:userCalc6.ODLY 0.0 calc6.output_link_pv 9idcLAX:userCalc6.OUTN calc6.output_location_data 9idcLAX:userCalc6.DOLD 0.0 calc6.output_location_name 9idcLAX:userCalc6.DOLN calc6.precision 9idcLAX:userCalc6.PREC 5 calc6.process_record 9idcLAX:userCalc6.PROC 0 calc6.processing_active 9idcLAX:userCalc6.PACT 0 calc6.scan_disable_input_link_value 9idcLAX:userCalc6.DISA 1 calc6.scan_disable_value_input_link 9idcLAX:userCalc6.SDIS 9idcLAX:userCalcEnable.VAL CA MS calc6.scanning_rate 9idcLAX:userCalc6.SCAN 9 calc6.trace_processing 9idcLAX:userCalc6.TPRO 0 =================================== ====================== ================================ ```
prjemian commented 2 years ago

Looks as if all interfaces can be combined into one function. Note that listdevice() is based on content returned from .read() while object_explorer() is based on content that connects to EPICS PVs.

https://github.com/BCDA-APS/apstools/blob/afc46c54328bbeab995c4cca0c694ed242e402db/apstools/utils.py#L186-L197

https://github.com/BCDA-APS/apstools/blob/afc46c54328bbeab995c4cca0c694ed242e402db/apstools/utils.py#L1367-L1375

where

https://github.com/BCDA-APS/apstools/blob/afc46c54328bbeab995c4cca0c694ed242e402db/apstools/utils.py#L1344-L1351

prjemian commented 2 years ago

Items to report:

prjemian commented 2 years ago

Refactor to return pandas.DataFrame instead.

prjemian commented 2 years ago

Preserve the existing function with a version-specific name, such as was done for listruns: https://github.com/BCDA-APS/apstools/blob/afc46c54328bbeab995c4cca0c694ed242e402db/apstools/utils.py#L38-L39

perhaps: listdevice_1_5_2 and deprecate both listdevice_1_5_2 and object_explorer for removal in release 1.6.0. Refactor object_explorer now to warn of deprecation, then call the refactored listruns. Use same technique as: https://github.com/BCDA-APS/apstools/blob/afc46c54328bbeab995c4cca0c694ed242e402db/apstools/utils.py#L163-L183