Source code for py4syn.epics.ScalerClass

"""Scaler Class

Python Class for EPICS Scaler control.

:platform: Unix
:synopsis: Python Class for EPICS Scaler control.

.. moduleauthor:: Hugo Henrique Slepicka <hugo.slepicka@lnls.br>
    .. note:: 30/06/2012 [hugo.slepicka]  first version released
    .. note:: 31/03/2014 [hugo.slepicka]  support for more than one channel
    .. note:: 07/04/2014 [hugo.slepicka]  fix to read the correct values after
                                    count, based on Tim Mooney's recommendation
"""
from epics import PV, ca
from py4syn.epics.StandardDevice import StandardDevice
from py4syn.epics.ICountable import ICountable
from time import sleep

[docs]class Scaler(StandardDevice, ICountable): #CALLBACK FUNCTION FOR THE MOTOR STATUS PV #def onStatusChange(self, value, **kw): # self._counting = (value == 1) def onValChange(self, value, **kw): self._counting = (value == 0) #CONSTRUCTOR OF SHUTTER CLASS def __init__(self, pvScalerName="", numberOfChannels=1, mnemonic="", factor = 1): StandardDevice.__init__(self, mnemonic) self._counting = False self.pvScalerTP = PV(pvScalerName+".TP") # envia para o IOC do cintilador o tempo de exposicao #self.pvScalerCNT = PV(pvScalerName+".CNT", self.onStatusChange) # envia para o IOC o disparo da medida self.pvScalerCNT = PV(pvScalerName+".CNT") # envia para o IOC o disparo da medida self.pvScalerFREQ = PV(pvScalerName+".FREQ") self.pvScalerVAL = PV(pvScalerName+".VAL", self.onValChange) self.pvScalerCounters = [] self.pvScalerGates = [] self.pvScalerPresets = [] self.factor = factor # Initial State if(self.pvScalerCNT.get() == 0 and self.pvScalerVAL.get() == 0): self._counting = False for i in range(1,2+numberOfChannels): self.pvScalerCounters.append(PV(pvScalerName+".S"+str(i), auto_monitor=False)) # valor do contador i self.pvScalerGates.append(PV(pvScalerName+".G"+str(i))) self.pvScalerPresets.append(PV(pvScalerName+".PR"+str(i)))
[docs] def setPresetValue(self, channel, v): for g in self.pvScalerGates: g.put(0) for pr in self.pvScalerPresets: pr.put(0) self.pvScalerPresets[channel-1].put(v)
[docs] def setCountTime(self, time): """ Method to set the count time of a scaler device. Parameters ---------- t : value Count time to set to scaler device . Returns ------- out : None """ for g in self.pvScalerGates: g.put(0) for pr in self.pvScalerPresets: pr.put(0) self.pvScalerGates[0].put(1) self.pvScalerTP.put(time)
def getCountTime(self): return self.pvScalerTP.get() def setCountStart(self): self._counting = True self.pvScalerVAL.put(0) self.pvScalerCNT.put(1) def setCountStop(self): self.pvScalerCNT.put(0) self.pvScalerVAL.put(1) def getIntensity(self, channel=2): return self.pvScalerCounters[channel-1].get()/self.factor def getIntensityInTime(self, tempoMedida, channel=2): self.setCountTime(tempoMedida) self.setCountStart() self.wait() self.setCountStop() return self.getIntensity(channel) def isCountRunning(self): return (self.pvScalerVAL.get()== 0)
[docs] def wait(self): while(self._counting): sleep(0.1) ca.poll()
def getIntensityCheck(self): self.setCountStart() self.wait() return self.getIntensity()
[docs] def canMonitor(self): return True
[docs] def canStopCount(self): return True
[docs] def getValue(self, **kwargs): if(kwargs): return self.getIntensity(kwargs['channel']) return self.getIntensity()
[docs] def isCounting(self): return self._counting
[docs] def startCount(self): self.setCountStart()
[docs] def stopCount(self): self.setCountStop()