Skip to content

Instantly share code, notes, and snippets.

@danielballan
Last active November 20, 2019 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielballan/e4972ddc4542a07e99e5878a4bf83384 to your computer and use it in GitHub Desktop.
Save danielballan/e4972ddc4542a07e99e5878a4bf83384 to your computer and use it in GitHub Desktop.
minimal example
from ophyd import PVPositionerPC, EpicsSignal, EpicsSignalRO, PseudoPositioner, PseudoSingle
from ophyd.pseudopos import (pseudo_position_argument,
real_position_argument)
from ophyd import Component as Cpt
class QuadEMDwellTime(PVPositionerPC):
setpoint = Cpt(EpicsSignal, 'AveragingTime')
readback = Cpt(EpicsSignalRO, 'AveragingTime_RBV')
class StruckDwellTime(PVPositionerPC):
setpoint = Cpt(EpicsSignal, 'TP')
readback = Cpt(EpicsSignalRO, 'TP')
class LockedDwellTimes(PseudoPositioner):
"Sync QuadEM and Struck dwell times to one pseudo-axis dwell time."
dwell_time = Cpt(PseudoSingle, kind='hinted')
quadem_dwell_time = Cpt(QuadEMDwellTime, 'XF:06BM-BI{EM:1}EM180:', egu='seconds')
struck_dwell_time = Cpt(StruckDwellTime, 'XF:06BM-ES:1{Sclr:1}.', egu='seconds')
@property
def settle_time(self):
return self.quadem_dwell_time.settle_time
@settle_time.setter
def settle_time(self, val):
self.quadem_dwell_time.settle_time = val
self.struck_dwell_time.settle_time = val
@pseudo_position_argument
def forward(self, pseudo_pos):
pseudo_pos = self.PseudoPosition(*pseudo_pos)
# logger.debug('forward %s', pseudo_pos)
return self.RealPosition(quadem_dwell_time=pseudo_pos.dwell_time,
struck_dwell_time=pseudo_pos.dwell_time)
@real_position_argument
def inverse(self, real_pos):
real_pos = self.RealPosition(*real_pos)
return self.PseudoPosition(dwell_time=real_pos.quadem_dwell_time)
_locked_dwell_time = LockedDwellTimes('', name='dwti')
dwell_time = _locked_dwell_time.dwell_time
dwell_time.name = 'inttime'
$ ipython -i minimal_example.py
In [1]: _locked_dwell_time.wait_for_connection()                                                                                  
---------------------------------------------------------------------------
TimeoutError                              Traceback (most recent call last)
<ipython-input-1-fc5bf05eae5a> in <module>
----> 1 _locked_dwell_time.wait_for_connection()
/tmp/new-stuff/lib/python3.7/site-packages/ophyd/device.py in wait_for_connection(self, all_signals, timeout)
   1141                                 for obj, description in funcs.items())
   1142             reasons.append(f'Pending operations: {pending}')
-> 1143         raise TimeoutError('; '.join(reasons))
   1144 
   1145     def get_instantiated_signals(self, *, attr_prefix=None):
TimeoutError: Pending operations: inttime readback subscription, dwti_quadem_dwell_time readback position
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment