Test that Bluesky Works at APS#
Beamlines of the Advanced Photon Source have access to EPICS PVs that
tell the storage ring current and other real-time information from the
facility. These have been gathered into a special device from the
apstools
package. (If you are not at the APS, then you will need to
test with different ophyd.EpicsSignal
objects than shown here. You’ll
also need access to one or more EPICS PVs.)
Now we can test if we have installed enough software to be useful. Might still need more…
from apstools.devices import ApsMachineParametersDevice
aps = ApsMachineParametersDevice(name="aps")
We need to wait for those PVs to connect (could call
aps.wait_for_connections()
). Check that aps.connected
returns True
before continuing. Test by looking at the APS storage ring current:
aps.current.get()
aps.summary(): complete structure
In [1]: aps.summary() data keys (* hints) ------------------- aps_aps_cycle aps_current aps_fill_number aps_global_feedback aps_global_feedback_h aps_global_feedback_v aps_lifetime aps_machine_status aps_operating_mode aps_operator_messages_fill_pattern aps_operator_messages_floor_coordinator aps_operator_messages_last_problem_message aps_operator_messages_last_trip_message aps_operator_messages_message6 aps_operator_messages_message7 aps_operator_messages_message8 aps_operator_messages_operators aps_orbit_correction aps_shutter_permit read attrs ---------- current EpicsSignalRO ('aps_current') lifetime EpicsSignalRO ('aps_lifetime') aps_cycle ApsCycleComputedRO ('aps_aps_cycle') machine_status EpicsSignalRO ('aps_machine_status') operating_mode EpicsSignalRO ('aps_operating_mode') shutter_permit EpicsSignalRO ('aps_shutter_permit') fill_number EpicsSignalRO ('aps_fill_number') orbit_correction EpicsSignalRO ('aps_orbit_correction') global_feedback EpicsSignalRO ('aps_global_feedback') global_feedback_h EpicsSignalRO ('aps_global_feedback_h') global_feedback_v EpicsSignalRO ('aps_global_feedback_v') operator_messages ApsOperatorMessagesDevice('aps_operator_messages') operator_messages.operators EpicsSignalRO ('aps_operator_messages_operators') operator_messages.floor_coordinator EpicsSignalRO ('aps_operator_messages_floor_coordinator') operator_messages.fill_pattern EpicsSignalRO ('aps_operator_messages_fill_pattern') operator_messages.last_problem_message EpicsSignalRO ('aps_operator_messages_last_problem_message') operator_messages.last_trip_message EpicsSignalRO ('aps_operator_messages_last_trip_message') operator_messages.message6 EpicsSignalRO ('aps_operator_messages_message6') operator_messages.message7 EpicsSignalRO ('aps_operator_messages_message7') operator_messages.message8 EpicsSignalRO ('aps_operator_messages_message8') config keys ----------- configuration attrs ------------------- operator_messages ApsOperatorMessagesDevice('aps_operator_messages') unused attrs ------------
aps.read(): current timestamped values
In [2]: aps.read()
Out[2]:
OrderedDict([('aps_current',
{'value': 74.90453756160933, 'timestamp': 1595343111.512742}),
('aps_lifetime',
{'value': 13.004700442180901, 'timestamp': 1595343111.356158}),
('aps_aps_cycle',
{'value': '2020-2', 'timestamp': 1595343077.3078227}),
('aps_machine_status',
{'value': 'ASD Studies', 'timestamp': 1595250001.449054}),
('aps_operating_mode',
{'value': 'Stored Beam', 'timestamp': 631152000.0}),
('aps_shutter_permit',
{'value': 'NO PERMIT', 'timestamp': 1595250006.403736}),
('aps_fill_number', {'value': 11.0, 'timestamp': 631152000.0}),
('aps_orbit_correction',
{'value': 0.0, 'timestamp': 631152000.0}),
('aps_global_feedback',
{'value': 'On', 'timestamp': 631152000.0}),
('aps_global_feedback_h',
{'value': 'On', 'timestamp': 631152000.0}),
('aps_global_feedback_v',
{'value': 'On', 'timestamp': 631152000.0}),
('aps_operator_messages_operators',
{'value': 'LaBuda, Kimbro', 'timestamp': 1595336092.424329}),
('aps_operator_messages_floor_coordinator',
{'value': 'Clay White (2-0101)',
'timestamp': 1595336094.220797}),
('aps_operator_messages_fill_pattern',
{'value': '', 'timestamp': 1595278298.418265}),
('aps_operator_messages_last_problem_message',
{'value': '', 'timestamp': 1595247250.36637}),
('aps_operator_messages_last_trip_message',
{'value': '', 'timestamp': 1595247255.006215}),
('aps_operator_messages_message6',
{'value': 'User Operations at 08:00 Wed. 7/22',
'timestamp': 1595336103.81407}),
('aps_operator_messages_message7',
{'value': '', 'timestamp': 1591647283.478823}),
('aps_operator_messages_message8',
{'value': '', 'timestamp': 1591647284.846647})])
listdevice(aps): aps.read() in table with formatted timestamps
In [4]: from apstools.utils import listdevice
In [5]: listdevice(aps)
========================================== ================================== ==========================
name value timestamp
========================================== ================================== ==========================
aps_current 74.82578332160934 2020-07-21 09:52:40.512772
aps_lifetime 13.921180095258897 2020-07-21 09:52:36.356164
aps_aps_cycle 2020-2 2020-07-21 09:51:17.307823
aps_machine_status ASD Studies 2020-07-20 08:00:01.449054
aps_operating_mode Stored Beam 1989-12-31 18:00:00
aps_shutter_permit NO PERMIT 2020-07-20 08:00:06.403736
aps_fill_number 11.0 1989-12-31 18:00:00
aps_orbit_correction 0.0 1989-12-31 18:00:00
aps_global_feedback On 1989-12-31 18:00:00
aps_global_feedback_h On 1989-12-31 18:00:00
aps_global_feedback_v On 1989-12-31 18:00:00
aps_operator_messages_operators LaBuda, Kimbro 2020-07-21 07:54:52.424329
aps_operator_messages_floor_coordinator Clay White (2-0101) 2020-07-21 07:54:54.220797
aps_operator_messages_fill_pattern 2020-07-20 15:51:38.418265
aps_operator_messages_last_problem_message 2020-07-20 07:14:10.366370
aps_operator_messages_last_trip_message 2020-07-20 07:14:15.006215
aps_operator_messages_message6 User Operations at 08:00 Wed. 7/22 2020-07-21 07:55:03.814070
aps_operator_messages_message7 2020-06-08 15:14:43.478823
aps_operator_messages_message8 2020-06-08 15:14:44.846647
========================================== ================================== ==========================
Out[5]: <pyRestTable.rest_table.Table at 0x7f3c0654a990>
Test some of the simulators (without EPICS)
You can still test that ophyd is working without a set of EPICS PVs by using the simulators provided in ophyd.
In [8]: import ophyd.sim In [9]: sim = ophyd.sim.hw() In [10]: sim.motor.position Out[10]: 0 In [11]: sim.motor.read() Out[11]: OrderedDict([('motor', {'value': 0, 'timestamp': 1562779985.5141134}), ('motor_setpoint', {'value': 0, 'timestamp': 1562779985.5141122})]) In [12]: sim.noisy_det.read() Out[12]: {'noisy_det': {'value': 0.9765596019916091, 'timestamp': 1562779985.5194004}} In [13]: sim.noisy_det.get() Out[13]: 0.9765596019916091