class HxnScanStatus: '''Broadcast if a scan is in progress via PV Processed on every start/end document ''' def __init__(self, running_pv): self._last_start = None self.running_signal = EpicsSignal(running_pv) self._running = False @property def running(self): return self._running @running.setter def running(self, running): self._running = running if running is None: running = 0 try: self.running_signal.put(running) except DisconnectedError: logger.error('ScanRunning PV disconnected. Is the hxntools IOC running?') def __call__(self, name, doc): '''Bluesky callback with document info''' if name == 'start': self._last_start = doc if self._last_start and name in ('start', 'stop'): self.running = (name == 'start')
def test(): loggers = ('ophyd.controls.cas', ) config.setup_loggers(loggers) session = config.session server = session.cas def updated(value=None, **kwargs): print('Updated to: %s' % value) python_pv = CasPV(config.server_pvnames[0], 123.0, server=server) # full_pvname includes the server prefix pvname = python_pv.full_pvname signal = EpicsSignal(pvname) signal.subscribe(updated) time.sleep(0.1) for i in range(10): python_pv.value = i time.sleep(0.05)
def _setEpicsShutterCommands(self, basepvname): open_suffix = 'Cmd:Opn-Cmd' close_suffix = 'Cmd:Cls-Cmd' open_pv = getEpicsPV(basepvname, open_suffix) close_pv = getEpicsPV(basepvname, close_suffix) self._opencmd = EpicsSignal(open_pv, rw = True, name = '_opencmd') self._closecmd = EpicsSignal(close_pv, rw = True, name = '_closecmd') return
def _setEpicsShutterCommands(self, basepvname): open_suffix = "Cmd:Opn-Cmd" close_suffix = "Cmd:Cls-Cmd" open_pv = getEpicsPV(basepvname, open_suffix) close_pv = getEpicsPV(basepvname, close_suffix) self._opencmd = EpicsSignal(open_pv, rw=True, name="_opencmd") self._closecmd = EpicsSignal(close_pv, rw=True, name="_closecmd") return
def _setEpicsShutterStatus(self, basepvname): open_suffix = 'Sw:Opn1-Sts' close_suffix = 'Sw:Cls1-Sts' open_pv = ''.join([basepvname, open_suffix]) close_pv = ''.join([basepvname, close_suffix]) self._openstatus = EpicsSignal(open_pv, name = '_openstatus') self._closestatus = EpicsSignal(close_pv, name = '_closestatus') return
def __init__(self, requested_pos=None, current_pos=None, gasdict = {}): GasSwitcher.__init__(self) signals = [EpicsSignal(current_pos, rw=False, alias='_current_pos', name='current_gas'), EpicsSignal(requested_pos, alias='_requested_pos', name='requested_gas'), ] self._gasdict = gasdict for sig in signals: self.add_signal(sig) return
class Shutter(object): """Open and close fast shutter. """ def __init__(self, basepvname): self._setEpicsShutterCommands(basepvname) self._setEpicsShutterStatus(basepvname) return def _setEpicsShutterCommands(self, basepvname): open_suffix = 'Cmd:Opn-Cmd' close_suffix = 'Cmd:Cls-Cmd' open_pv = getEpicsPV(basepvname, open_suffix) close_pv = getEpicsPV(basepvname, close_suffix) self._opencmd = EpicsSignal(open_pv, rw = True, name = '_opencmd') self._closecmd = EpicsSignal(close_pv, rw = True, name = '_closecmd') return def _setEpicsShutterStatus(self, basepvname): open_suffix = 'Sw:Opn1-Sts' close_suffix = 'Sw:Cls1-Sts' open_pv = ''.join([basepvname, open_suffix]) close_pv = ''.join([basepvname, close_suffix]) self._openstatus = EpicsSignal(open_pv, name = '_openstatus') self._closestatus = EpicsSignal(close_pv, name = '_closestatus') return def openShutter(self): if self._openstatus.value == 0: return self._opencmd.put(1) while self._openstatus.value == 1: time.sleep(0.01) return def closeShutter(self): if self._closestatus.value == 0: return self._closecmd.put(1) while self._closestatus.value == 1: time.sleep(0.01) return @property def shutterStatus(self): rv = bool(not self._openstatus.value) and bool(self._closestatus.value) return rv
def __init__(self, open=None, open_status=None, close=None, close_status=None): Shutter.__init__(self) signals = [ EpicsSignal(open_status, write_pv=open, alias='_open'), EpicsSignal(close_status, write_pv=close, alias='_close'), ] for sig in signals: self.add_signal(sig)
class Shutter(object): """Open and close fast shutter. """ def __init__(self, basepvname): self._setEpicsShutterCommands(basepvname) self._setEpicsShutterStatus(basepvname) return def _setEpicsShutterCommands(self, basepvname): open_suffix = "Cmd:Opn-Cmd" close_suffix = "Cmd:Cls-Cmd" open_pv = getEpicsPV(basepvname, open_suffix) close_pv = getEpicsPV(basepvname, close_suffix) self._opencmd = EpicsSignal(open_pv, rw=True, name="_opencmd") self._closecmd = EpicsSignal(close_pv, rw=True, name="_closecmd") return def _setEpicsShutterStatus(self, basepvname): open_suffix = "Sw:Opn1-Sts" close_suffix = "Sw:Cls1-Sts" open_pv = "".join([basepvname, open_suffix]) close_pv = "".join([basepvname, close_suffix]) self._openstatus = EpicsSignal(open_pv, name="_openstatus") self._closestatus = EpicsSignal(close_pv, name="_closestatus") return def openShutter(self): if self._openstatus.value == 0: return self._opencmd.put(1) while self._openstatus.value == 1: time.sleep(0.01) return def closeShutter(self): if self._closestatus.value == 0: return self._closecmd.put(1) while self._closestatus.value == 1: time.sleep(0.01) return @property def shutterStatus(self): rv = bool(not self._openstatus.value) and bool(self._closestatus.value) return rv
class HxnUidBroadcast: '''Broadcast uid via PV Processed on every start/end document ''' def __init__(self, uid_pv): self._uid = None self._last_start = None self.uid_signal = EpicsSignal(uid_pv) @property def uid(self): '''The uid of the last scan run''' return self._uid @uid.setter def uid(self, uid): self._uid = uid if uid is None: uid = '' try: self.uid_signal.put(uid) except DisconnectedError: logger.error('UID PV disconnected. Is the hxntools IOC running?') def clear(self): '''Clear the scan uid''' self.uid = None def update(self): '''Set the uid from the last start document''' if self._last_start is None: return self.uid = self._last_start['uid'] def __call__(self, name, doc): '''Bluesky callback with document info''' if name == 'start': self._last_start = doc if self._last_start and name in ('start', 'stop'): self.update()
def test(): def callback(sub_type=None, timestamp=None, value=None, **kwargs): logger.info('[callback] [%s] (type=%s) value=%s' % (timestamp, sub_type, value)) # Test that the monitor dispatcher works (you cannot use channel access in # callbacks without it) logger.info('[callback] caget=%s' % rw_signal.get()) loggers = ('ophyd.controls.signal', 'ophyd.session', ) config.setup_loggers(loggers) logger = config.logger motor_record = config.motor_recs[0] val = record_field(motor_record, 'VAL') rbv = record_field(motor_record, 'RBV') rw_signal = EpicsSignal(rbv, write_pv=val) # put_complete=True) rw_signal.subscribe(callback, event_type=rw_signal.SUB_VALUE) rw_signal.subscribe(callback, event_type=rw_signal.SUB_SETPOINT) rw_signal.value = 2 time.sleep(1.) rw_signal.value = 1 time.sleep(1.) # You can also create a Python Signal: sig = Signal(name='testing', value=10) logger.info('Python signal: %s' % sig) # Even one with a separate setpoint/readback value: sig = Signal(name='testing', value=10, setpoint=2, separate_readback=True) logger.info('Python signal: %s' % sig)
def __init__(self, running_pv): self._last_start = None self.running_signal = EpicsSignal(running_pv) self._running = False
# For now, access as simple 'signals' # diag3_cam = EpicsSignal('XF:23ID1-BI{Diag:3-Cam:1}cam1:Acquire_RBV', # write_pv='XF:23ID1-BI{Diag:3-Cam:1}cam1:Acquire', # rw=True, name='diag3_cam_trigger') # # These talk to the same devices, but they do not save images. # They provide sum, stats, etc. hfm_cam = AreaDetector('XF:05IDA-BI:1{FS:1-Cam:1}', name='hfm_cam') # # BPM camera #hfm_cam = EpicsSignal('XF:05IDA-BI:1{FS:1-Cam:1}Acquire_RBV', # write_pv='XF:05IDA-BI:1{FS:1-Cam:1}Acquire', # rw=True, name='hfm_cam_trigger') hfm_tot1 = EpicsSignal('XF:05IDA-BI:1{FS:1-Cam:1}Stats1:Total_RBV', rw=False, name='hfm_tot1') bpm1_cam = EpicsSignal('XF:05IDA-BI:1{BPM:1-Cam:1}Acquire_RBV', write_pv='XF:05IDA-BI:1{Mir:1-Cam:1}Acquire', rw=True, name='hfm_cam_trigger') bpm1_tot1 = EpicsSignal('XF:05IDA-BI:1{BPM:1-Cam:1}Stats1:Total_RBV', rw=False, name='bpm1_tot1') bpm1_diode0 = EpicsSignal('xf05bpm03:DataRead_Ch1', rw=False, name='bpm1_diode0') bpm1_diode1 = EpicsSignal('xf05bpm03:DataRead_Ch2', rw=False, name='bpm1_diode1') bpm1_diode2 = EpicsSignal('xf05bpm03:DataRead_Ch3',
def __init__(self, uid_pv): self._uid = None self._last_start = None self.uid_signal = EpicsSignal(uid_pv)
# VLS-PGM pgm_energy = PVPositioner('XF:23ID1-OP{Mono}Enrgy-SP', readback='XF:23ID1-OP{Mono}Enrgy-I', stop='XF:23ID1-OP{Mono}Cmd:Stop-Cmd', stop_val=1, put_complete=True, name='pgm_energy', limits=(200, 2200)) pgm_mir_pit = EpicsMotor('XF:23ID1-OP{Mono-Ax:MirP}Mtr', name='pgm_mir_pit') pgm_grt_pit = EpicsMotor('XF:23ID1-OP{Mono-Ax:GrtP}Mtr', name='pgm_grt_pit') pgm_mir_x = EpicsMotor('XF:23ID1-OP{Mono-Ax:MirX}Mtr', name='pgm_mir_x') pgm_grt_x = EpicsMotor('XF:23ID1-OP{Mono-Ax:GrtX}Mtr', name='pgm_grt_x') pgm_energy_sp = EpicsSignal('XF:23ID1-OP{Mono}Enrgy-SP', name='pgm_energy_sp') pgm_energy_i = EpicsSignal('XF:23ID1-OP{Mono}Enrgy-I', name='pgm_energy_i') # M3A Mirror m3a_x = EpicsMotor('XF:23ID1-OP{Mir:3-Ax:XAvg}Mtr', name='m3a_x') m3a_pit = EpicsMotor('XF:23ID1-OP{Mir:3-Ax:P}Mtr', name='m3a_pit') m3a_bdr = EpicsMotor('XF:23ID1-OP{Mir:3-Ax:Bdr}Mtr', name='m3a_bdr') # Fast CCD Shutter sh_y = EpicsMotor('XF:23ID1-OP{Sh:Fast-Ax:Y}Mtr', name='sh_y') sh_x = EpicsMotor('XF:23ID1-OP{Sh:Fast-Ax:X}Mtr', name='sh_x') # Slits
def getEpicsSignal(basename, suffix, name = None, rw = False): pvname = getEpicsPV(basename, suffix) rv = EpicsSignal(pvname, rw = rw, name = name) return rv
diag3_cam = AreaDetector('XF:23ID1-BI{Diag:3-Cam:1}', name='diag3_cam') diag5_cam = AreaDetector('XF:23ID1-BI{Diag:5-Cam:1}', name='diag5_cam') diag6_cam = AreaDetector('XF:23ID1-BI{Diag:6-Cam:1}', name='diag5_cam') diag6_cam = AreaDetector('XF:23ID1-BI{Diag:6-Cam:1}', name='diag6_cam') dif_beam_cam = AreaDetector('XF:23ID1-ES{Dif-Cam:Beam}', name='dif_beam_cam') # Princeton CCD camera pimte = AreaDetectorFileStorePrinceton( 'XF:23ID1-ES{Dif-Cam:PIMTE}', file_path='/GPFS/xf23id/xf23id1/pimte_data/', ioc_file_path='x:/xf23id1/pimte_data/', name='pimte') fshutter = EpicsSignal('XF:23ID1-TS{EVR:1-Out:FP0}Src:Scale-RB', write_pv='XF:23ID1-TS{EVR:1-Out:FP0}Src:Scale-SP', rw=True, name='fshutter') fccd = AreaDetectorFileStoreHDF5( 'XF:23ID1-ES{FCCD}', file_path='/GPFS/xf23id/xf23id1/fccd_data/', #shutter=fshutter, shutter_val=(4,3), stats=None, name='fccd') # Test CCD ccdtest = AreaDetectorFileStoreHDF5( 'XF:23ID1-ES{Tst-Cam:1}', file_path='/GPFS/xf23id/xf23id1/test_data/', name='ccdtest')