class Experiment( Device):
"""
All detectors are class variables of this class. The detectors
to appear in the document are selected during the instantiation:
det = Experiment( read_attrs = ['eh_c01', 'eh_c02'])
"""
if len( allDevices) == 0:
allDevices = HasyUtils.getOnlineXML()
#
# her we execute statements of this kind:
# eh_c01 = Cpt( Signal, name='Counts', kind='normal')
# this way, calss variables are created. Later they will be
# referenced as instance variables: selg.eh_c01
#
for elm in allDevices:
if elm[ 'module'] != 'sis3820' and \
elm[ 'module'] != 'mca_8701':
continue
cmd = "%s = Cpt(Signal, name='Counts', kind='hinted')" % elm['name']
exec( cmd)
def __init__(self, *args, **kwargs):
if 'name' in kwargs:
raise ValueError( "TangoIfc.Experiment: 'name' is taken from the ActiveMntGrp")
env = blueskyDESY.getEnv()
try:
self.name = env[ 'ActiveMntGrp'] # e.g. 'MG1'
self.activeMntGrp = env[ self.name]
except Exception as e:
raise ValueError( "TangoIfc.Experiment: no ActiveMntGrp")
super().__init__( name = self.name, *args, **kwargs)
self._acquiring_lock = threading.Lock()
self.counters = []
for elm in self.activeMntGrp[ 'counters']:
hsh = {}
hsh[ 'name'] = elm
p = tango.DeviceProxy( elm)
hsh[ 'TangoDevice'] = p.TangoDevice
hsh[ 'proxy'] = tango.DeviceProxy( hsh[ 'TangoDevice'])
self.counters.append( hsh)
self.mcas = []
for elm in self.activeMntGrp[ 'mcas']:
hsh = {}
hsh[ 'name'] = elm
p = tango.DeviceProxy( elm)
hsh[ 'TangoDevice'] = p.TangoDevice
hsh[ 'proxy'] = tango.DeviceProxy( hsh[ 'TangoDevice'])
self.mcas.append( hsh)
self.timers = []
for elm in self.activeMntGrp[ 'timers']:
hsh = {}
hsh[ 'name'] = elm
p = tango.DeviceProxy( elm)
hsh[ 'TangoDevice'] = p.TangoDevice
hsh[ 'proxy'] = tango.DeviceProxy( hsh[ 'TangoDevice'])
self.timers.append( hsh)
self.sampleTime = self.activeMntGrp[ 'sampleTime']
return
def _capture(self, status):
try:
if not self._acquiring_lock.acquire(timeout=0):
raise RuntimeError("Cannot trigger, currently triggering!")
#lst = [ elm[ 'name'] for elm in self.counters]
#print( "TangoIfc.Experiment._capture: counters %s" % repr( lst))
#lst = [ elm[ 'name'] for elm in self.timers]
#print( "TangoIfc.Experiment._capture: timers %s, sample time %g" % ( repr( lst), self.sampleTime))
#
# resetting counters
#
for elm in self.counters:
elm[ 'proxy'].Reset()
#
# start MCAs
#
for elm in self.mcas:
elm[ 'proxy'].Clear()
elm[ 'proxy'].Start()
#
# prepare timers: sampleTime and start()
#
for elm in self.timers:
elm[ 'proxy'].SampleTime = self.sampleTime
for elm in self.timers:
elm[ 'proxy'].start()
#
# check, if on of the imers is MOVING
#
isMoving = False
for elm in self.timers:
if elm[ 'proxy'].state() == tango.DevState.MOVING:
isMoving = True
break
while isMoving:
isMoving = False
for elm in self.timers:
if elm[ 'proxy'].state() == tango.DevState.MOVING:
isMoving = True
break
ttime.sleep( 0.1)
#
# read the counters
#
for elm in self.counters:
cmd = "self.%s.set( %g)" % ( elm[ 'name'], elm[ 'proxy'].Counts)
exec( cmd)
#
# read the mcas
#
for elm in self.mcas:
#dataLength = elm[ 'proxy'].DataLength
#cmd = "self.%s.set( [1, 2, 3])" % ( elm[ 'name'])
#exec( cmd)
elm[ 'proxy'].Stop()
elm[ 'proxy'].Read()
self.eh_mca01.set( elm[ 'proxy'].Data)
except Exception as exc:
#
# set_exception() generates a lot of output but stops the plan
#
status.set_exception(exc)
raise Exception( "TangoIfc.MG._capture: caught exception, %s" % repr( exc))
else:
status.set_finished()
finally:
self._acquiring_lock.release()
def trigger(self):
status = DeviceStatus(self)
# Start a background thread to capture an image and write it to disk.
thread = threading.Thread(target=self._capture, args=(status,))
thread.start()
# Promptly return a status object, which will be marked "done" when the
# capture completes.
return status