Source code for contrast.detectors.Ni6602
from .Detector import Detector, LiveDetector, TriggeredDetector
try:
import PyTango
except ModuleNotFoundError:
pass
import time
PROP_MAP = {1: 'counter01', 2: 'counter02', 3: 'counter03'}
CHANNEL_MAP = {'counter1': 'CNT1', 'counter2': 'CNT2', 'counter3': 'CNT3'}
[docs]class Ni6602CounterCard(Detector, LiveDetector, TriggeredDetector):
"""
Interface to the Ni6602 Tango device exposing counters.
"""
def __init__(self, name=None, device=None):
self.dev_name = device
Detector.__init__(self, name=name)
LiveDetector.__init__(self)
TriggeredDetector.__init__(self)
def initialize(self):
self.dev = PyTango.DeviceProxy(self.dev_name)
self.dev.init()
# handle some unwanted options that otherwise can cause errors
self.dev.write_attribute("nexusFileGeneration", 0)
self.dev.write_attribute("CNT1MinPulseWidthEnable", 0)
self.dev.write_attribute("CNT2MinPulseWidthEnable", 0)
self.dev.write_attribute("CNT3MinPulseWidthEnable", 0)
def _toggle_PW_mode(self, pw):
"""
Switch between PW (pulse-width gated) and EVT (single count) mode.
This is done through Tango properties so is a bit messy.
pw = True means go to gated mode,
pw = False means go to single count.
"""
if pw:
oldstr, newstr = 'Mode:EVT', 'Mode:PW'
else:
oldstr, newstr = 'Mode:PW', 'Mode:EVT'
for prop_name in PROP_MAP.values():
channel_props = self.dev.get_property(prop_name)[prop_name]
for i, val in enumerate(channel_props):
if val == oldstr:
channel_props[i] = newstr
self.dev.put_property({prop_name: channel_props})
break
time.sleep(.1)
self.dev.init()
def prepare(self, acqtime, dataid, n_starts):
if self.busy():
raise Exception('%s is busy!' % self.name)
if self.hw_trig:
self._toggle_PW_mode(True)
self.dev.acquisitionMode = 'BUFFERED'
self.dev.totalNbPoint = self.hw_trig_n
self.dev.bufferDepth = self.hw_trig_n
else:
self._toggle_PW_mode(False)
self.dev.acquisitionMode = 'SCALAR'
self.dev.integrationTime = acqtime
def start_live(self, acqtime=1.0):
# The NI card can do on-board live mode.
self.dev.continuous = True
self.dev.integrationTime = acqtime
self.dev.Start()
def stop_live(self):
# The NI card can do on-board live mode.
self.stop()
self.dev.continuous = False
def arm(self):
if self.busy():
raise Exception('%s is busy!' % self.name)
if self.hw_trig:
self.dev.Start()
def start(self):
if self.hw_trig:
return
if self.busy():
raise Exception('%s is busy!' % self.name)
self.dev.Start()
def stop(self):
self.dev.Stop()
while not self.dev.State() == PyTango.DevState.STANDBY:
time.sleep(.01)
def busy(self):
return not (self.dev.State() == PyTango.DevState.STANDBY)
def read(self):
res = {}
for name, channel in CHANNEL_MAP.items():
res[name] = self.dev.read_attribute(channel).value
return res