class WaveformCapturer(DetectorBase): ''' read-only detector to capture a data array from specified PV ''' def __init__(self, name, pvname): ''' Constructor ''' self.setName(name) self.pv=pvname self.caclient=CAClient(pvname) self.pointNumber=0 def collectData(self): #read-only waveform does not need to be triggered pass def getStatus(self): #read-only waveform always available return 0 def readout(self): try: if not self.caclient.isConfigured(): self.caclient.configure() output=self.caclient.cagetArrayDouble() self.caclient.clearup() else: output=self.caclient.cagetArrayDouble() return self.writeDataToFile(output) except Exception, err: print "Error returning current position", err raise Exception
class ADCChannel(ScannableMotionBase, MonitorListener): def __init__(self, name, pv): self.setName(name) self.setInputNames([]) self.pvcli=CAClient(pv) self.nordcli=CAClient(pv+".NORD") self.monitoradded=False self.counter=0 self.numberofgates=0 self.numberofframes=0 self.filename=None self.filenames=[] self.collectionNumber=0 #0 means no collectionNumber self.voltagesmonitor=None self.firstMonitor = True self.voltages = {} def resetCounter(self): self.counter=0 def resetRepetition(self): self.collectionNumber=0 def setCollectionNumber(self, num): self.collectionNumber=num def setNumberOfGates(self, num): self.numberofgates=num def setNumberOfFrames(self, num): self.numberofframes=num def getNumberOfGates(self): return self.numberofgates def getNumberOfFrames(self): return self.numberofframes def setFilename(self, filename): self.filename=filename def getFilename(self): return self.filename def getFilenames(self): return self.filenames def getValues(self): try: if not self.pvcli.isConfigured(): self.pvcli.configure() return self.pvcli.cagetArrayDouble() except FactoryException, e: print "create channel error (%s): %s" % (self.pvcli.getChannel().getName(),e) except CAException, e: print "caput Error (%s): %s" % (self.pvcli.getChannel().getName(),e)
class DataCapturer(ScannableMotionBase, MonitorListener): def __init__(self, name, adc, hv=adcppv, el=adcepv, gate=adcgatepv): self.setName(name) self.setInputNames(["HV","Electrometer","gate"]) self.hv=hv self.el=el self.gate=gate self.voltagecli=CAClient(hv) self.electrometercli=CAClient(el) self.gatecli=CAClient(gate) self.monitoradded=False self.filename=None self.voltagemonitor=None self.electrometermonitor=None self.gatemonitor=None self.firstMonitor = True self.data={hv:[],el:[],gate:[]} self.voltages = [] # for holding voltage data array self.electrometers=[] # for holding electrometer data array self.gates=[] self.firstData = True self.updatecounter=0 self.capturecounter=0 self.adc=adc def reset(self): self.electrometers = [] self.voltages = [] self.gates=[] self.updatecounter=0 self.capturecounter=0 self.firstData = True self.adc.disable() self.data={self.hv:[],self.el:[],self.gate:[]} def setFilename(self, filename): self.filename=filename def getFilename(self): return self.filename def getElectrometer(self, num): ''' retrieve electrometer data from Keithley amplifier. ''' try: if not self.electrometercli.isConfigured(): self.electrometercli.configure() return self.electrometercli.cagetArrayDouble(num) except FactoryException, e: print "create channel error (%s): %s" % (self.electrometercli.getChannel().getName(),e) except CAException, e: print "caget Error (%s): %s" % (self.electrometercli.getChannel().getName(),e)
class EpicsDataArrayClass: def __init__(self): self.ccWaveFormHead = CAClient(pvWaveFormHead) self.ccSubArraySize = CAClient(pvSubArraySize) self.ccSubArrayIndex = CAClient(pvSubArrayIndex) self.ccUpdate = CAClient(pvUpdate) self.ccCh01 = CAClient(pvCh01) self.ccCh02 = CAClient(pvCh02) self.ccCh03 = CAClient(pvCh03) self.ccCh04 = CAClient(pvCh04) self.ccCh05 = CAClient(pvCh05) self.ccCh06 = CAClient(pvCh06) self.ccWaveFormHead.configure() self.ccSubArraySize.configure() self.ccSubArrayIndex.configure() self.ccUpdate.configure() self.ccCh01.configure() self.ccCh02.configure() self.ccCh03.configure() self.ccCh04.configure() self.ccCh05.configure() self.ccCh06.configure() self.length = 0 self.head = 0 self.dataSetCh01 = dnp.zeros([maxLength]) self.dataSetCh01.setName("Channel 1") self.js = Finder.find("command_server") def setBlockSize(self, size): self.ccSubArraySize.caput(size) def setBlockIndex(self, index): self.ccSubArrayIndex.caput(index) #To get the number of valid data from the waveform def getDataNumbers(self): strLength = self.ccWaveFormHead.caget() return int(float(strLength)) def getLength(self): return self.getDataNumbers() def hasNewData(self): self.length = self.getLength() if self.head < self.length: self.length = min(self.length, self.head + maxBlockSize) return True else: return False def display(self): self.js.notifyServer(0, self.dataSetCh01) return def getNewData(self): if not self.hasNewData(): print "No new Data." return self.setBlockIndex(self.head) self.setBlockSize(self.length - self.head) print "Head", self.head print "Length", self.length self.update() sleep(1) arrayCh01 = [] arrayCh01 = self.ccCh01.cagetArrayDouble(self.length - self.head) print "New Array" print arrayCh01 for i in range(self.head, self.length): self.dataSetCh01[i] = arrayCh01[i - self.head] self.head = self.length print "New data: " self.dataSetCh01.disp() return #trigger the fast scan def update(self): self.ccUpdate.caput(1)
class FastEnergyScanClass: def __init__(self): self.startEnergy = CAClient(pvStartEnergy) self.endEnergy = CAClient(pvEndEnergy) self.scanTime = CAClient(pvScanTime) self.numberOfPoints = CAClient(pvNumberOfPoints) self.startButton = CAClient(pvStartButton) self.status = CAClient(pvReadyState) self.buildButton = CAClient(pvBuildButton) self.elementCounter = CAClient(pvElementCounter) self.channel01 = CAClient(pvDataChannel01) self.channel02 = CAClient(pvDataChannel02) self.channel03 = CAClient(pvDataChannel03) self.channel04 = CAClient(pvDataChannel04) self.energyPGM = CAClient(pvEnergyPGM) self.energyIDGAP = CAClient(pvEnergyIDGAP) self.scanReady01 = CAClient(pvScanReady01) self.scanReady02 = CAClient(pvScanReady02) self.scanReady03 = CAClient(pvScanReady03) self.scanReady04 = CAClient(pvScanReady04) self.scanStatus = 'Idle' self.arrayHead = 0 self.se = 400 self.ee = 700 def atScanStart(self): self.scanStatus = 'Idle' self.arrayHead = 0 if not self.startEnergy.isConfigured(): self.startEnergy.configure() if not self.endEnergy.isConfigured(): self.endEnergy.configure() if not self.scanTime.isConfigured(): self.scanTime.configure() if not self.numberOfPoints.isConfigured(): self.numberOfPoints.configure() if not self.startButton.isConfigured(): self.startButton.configure() if not self.buildButton.isConfigured(): self.buildButton.configure() if not self.status.isConfigured(): self.status.configure() if not self.elementCounter.isConfigured(): self.elementCounter.configure() if not self.channel01.isConfigured(): self.channel01.configure() if not self.channel02.isConfigured(): self.channel02.configure() if not self.channel03.isConfigured(): self.channel03.configure() if not self.channel04.isConfigured(): self.channel04.configure() if not self.energyPGM.isConfigured(): self.energyPGM.configure() if not self.energyIDGAP.isConfigured(): self.energyIDGAP.configure() if not self.scanReady01.isConfigured(): self.scanReady01.configure() if not self.scanReady02.isConfigured(): self.scanReady02.configure() if not self.scanReady03.isConfigured(): self.scanReady03.configure() if not self.scanReady04.isConfigured(): self.scanReady04.configure() def atScanEnd(self): self.scanStatus = 'Idle' self.arrayHead = 0 if self.startEnergy.isConfigured(): self.startEnergy.clearup() if self.endEnergy.isConfigured(): self.endEnergy.clearup() if self.scanTime.isConfigured(): self.scanTime.clearup() if self.numberOfPoints.isConfigured(): self.numberOfPoints.clearup() if self.startButton.isConfigured(): self.startButton.clearup() if self.buildButton.isConfigured(): self.buildButton.clearup() if self.status.isConfigured(): self.status.clearup() if self.elementCounter.isConfigured(): self.elementCounter.clearup() if self.channel01.isConfigured(): self.channel01.clearup() if self.channel02.isConfigured(): self.channel02.clearup() if self.channel03.isConfigured(): self.channel03.clearup() if self.channel04.isConfigured(): self.channel04.clearup() if self.energyPGM.isConfigured(): self.energyPGM.clearup() if self.energyIDGAP.isConfigured(): self.energyIDGAP.clearup() if self.scanReady01.isConfigured(): self.scanReady01.clearup() if self.scanReady02.isConfigured(): self.scanReady02.clearup() if self.scanReady03.isConfigured(): self.scanReady03.clearup() if self.scanReady04.isConfigured(): self.scanReady04.clearup() #To check the PGM and ID motors are ready for the fast scan def checkMotorReady(self): c1 = int(float(self.scanReady01.caget())) c2 = int(float(self.scanReady02.caget())) c3 = int(float(self.scanReady03.caget())) c4 = int(float(self.scanReady04.caget())) return (c1 == 0 and c2 == 0 and c3 == 0 and c4 == 0) def setEnergyRange(self, startEnergy, endEnergy): self.se = startEnergy self.ee = endEnergy self.startEnergy.caput(startEnergy - 3) self.endEnergy.caput(endEnergy + 3) def setTime(self, scanTime, pointTime): numberOfPoints = scanTime / pointTime self.scanTime.caput(scanTime) self.numberOfPoints.caput(numberOfPoints) #trigger the fast scan def start(self): self.startButton.caput(1) #trigger the fast scan def build(self): self.buildButton.caput('Busy') # click the build button def isBuilt(self): strStatus = self.getStatus() if strStatus == 'Scan ready': #Finished building return True else: return False #Total 6 status from Epics, plus internal Idle status ## "Scan complete" ## "Scan aborted" # "Moving PGM to midpoint" # "Calculating parameters" ## "Moving IDD and PGM to start position" ## "Scan ready" ## "Starting scan move" # "Scanning" ## "Scan complete" # "Idle" def getStatus(self): newScanStatus = self.status.caget() if newScanStatus != self.scanStatus: # scan status changed self.scanStatus = newScanStatus print self.scanStatus return self.scanStatus def isBusy(self): strStatus = self.getStatus() if strStatus == 'Scan complete': print 'fast energy scan finished.' return False else: return True def isScanning(self): strStatus = self.getStatus() if strStatus == 'Scanning' or strStatus == 'Starting scan move': return True else: return False #To get the number of valid data from the waveform def getDataNumbers(self): strLength = self.elementCounter.caget() return int(float(strLength)) def saveData(self): numberOfPoints = self.getDataNumbers() #self.printData(numberOfPoints); self.saveSRSData(numberOfPoints) def saveSRSData(self, numberOfPoints): srsHeader = [ " &SRS\n", " SRSRUN=null,SRSDAT=null,SRSTIM=null,\n", " SRSSTN='null',SRSPRJ='null ',SRSEXP='null ',\n", " SRSTLE=' ',\n", " SRSCN1=' ',SRSCN2=' ',SRSCN3=' ',\n", " &END\n" ] try: runs = NumTracker("tmp") nextNum = runs.getCurrentFileNumber() #nextNum = runs.incrementNumber() path = InterfaceProvider.getPathConstructor().createFromProperty( "gda.data.scan.datawriter.datadir") fileName = path + "/" + str(nextNum + 1) + ".dat" print fileName fh = open(fileName, 'w') #SRS Header for i in range(len(srsHeader)): fh.write(srsHeader[i]) titleLine = '%(v1)s \t %(v2)s \t %(v3)s \t %(v4)s \t %(v5)s \t %(v6)s \n' % { 'v1': 'PGM Energy', 'v2': 'ID GAP Energy', 'v3': 'Channel 1', 'v4': 'Channel 2', 'v5': 'Channel 3', 'v6': 'Channel 4' } fh.write(titleLine) arrayEnergyPGM = self.energyPGM.cagetArrayDouble() arrayEnergyIDGAP = self.energyIDGAP.cagetArrayDouble() arrayChannel01 = self.channel01.cagetArrayDouble() arrayChannel02 = self.channel02.cagetArrayDouble() arrayChannel03 = self.channel03.cagetArrayDouble() arrayChannel04 = self.channel04.cagetArrayDouble() for i in range(numberOfPoints): if arrayEnergyPGM[i] < self.se: continue if arrayEnergyPGM[i] > self.ee: continue #print i, arrayEnergyPGM[i], arrayEnergyIDGAP[i], arrayChannel01[i], arrayChannel02[i], arrayChannel03[i], arrayChannel04[i]; newLine = '%(v1).8f \t %(v2).8f \t %(v3).8f \t %(v4).8f \t %(v5).8f \t %(v6).8f \n' % { 'v1': arrayEnergyPGM[i], 'v2': arrayEnergyIDGAP[i], 'v3': arrayChannel01[i], 'v4': arrayChannel02[i], 'v5': arrayChannel03[i], 'v6': arrayChannel04[i] } fh.write(newLine) fh.close() runs.incrementNumber() except: print "ERROR: Could not save data into file." def printData(self, numberOfPoints): arrayEnergyPGM = self.energyPGM.cagetArrayDouble() arrayEnergyIDGAP = self.energyIDGAP.cagetArrayDouble() arrayChannel01 = self.channel01.cagetArrayDouble() arrayChannel02 = self.channel02.cagetArrayDouble() arrayChannel03 = self.channel03.cagetArrayDouble() arrayChannel04 = self.channel04.cagetArrayDouble() for i in range(numberOfPoints): print i, arrayEnergyPGM[i], arrayEnergyIDGAP[i], arrayChannel01[ i], arrayChannel02[i], arrayChannel03[i], arrayChannel04[i] def plotWholeData(self, numberOfPoints): arrayEnergyPGM = self.energyPGM.cagetArrayDouble() arrayEnergyIDGAP = self.energyIDGAP.cagetArrayDouble() arrayChannel01 = self.channel01.cagetArrayDouble() arrayChannel02 = self.channel02.cagetArrayDouble() arrayChannel03 = self.channel03.cagetArrayDouble() arrayChannel04 = self.channel04.cagetArrayDouble() dataSetPGM = dnp.array([numberOfPoints]) for i in range(numberOfPoints): dataSetPGM.set(arrayEnergyPGM[i], i) # Removed as won't work with RCP client. Talk to Mark Basham if need be. # dvp=Plotter(); # dvp.plotOver("Fast Scan Panel", dataSetPGM.getIndexDataSet(), dataSetPGM); def plotData(self): newHead = self.getDataNumbers() if self.arrayHead >= newHead: print "No new data added for plotting" return self.arrayHead = newHead #to get new data arrayEnergyPGM = self.energyPGM.cagetArrayDouble() arrayEnergyIDGAP = self.energyIDGAP.cagetArrayDouble() arrayChannel01 = self.channel01.cagetArrayDouble() arrayChannel02 = self.channel02.cagetArrayDouble() arrayChannel03 = self.channel03.cagetArrayDouble() arrayChannel04 = self.channel04.cagetArrayDouble() dataSetEnergyPGM = dnp.zeros([newHead]) dataSetEnergyPGM.setName("PGM Energy") dataSetEnergyIDGAP = dnp.zeros([newHead]) dataSetEnergyIDGAP.setName("ID Gap Energy") dataSetChannel01 = dnp.zeros([newHead]) dataSetChannel01.setName("Channel 1") dataSetChannel02 = dnp.zeros([newHead]) dataSetChannel02.setName("Channel 2") dataSetChannel03 = dnp.zeros([newHead]) dataSetChannel03.setName("Channel 3") dataSetChannel04 = dnp.zeros([newHead]) dataSetChannel04.setName("Channel 4") for i in range(0, newHead): #print i, arrayEnergyPGM[i], arrayEnergyIDGAP[i], arrayChannel01[i], arrayChannel02[i], arrayChannel03[i], arrayChannel04[i]; dataSetEnergyPGM[i] = arrayEnergyPGM[i] dataSetEnergyIDGAP[i] = arrayEnergyIDGAP[i] dataSetChannel01[i] = arrayChannel01[i] dataSetChannel02[i] = arrayChannel02[i] dataSetChannel03[i] = arrayChannel03[i] dataSetChannel04[i] = arrayChannel04[i] #print i, arrayEnergyPGM[i], arrayEnergyIDGAP[i], arrayChannel01[i], arrayChannel02[i], arrayChannel03[i], arrayChannel04[i]; dvp = Plotter() indexDataSet = dataSetEnergyPGM.getIndexDataSet() #dvp.plot("Data Vector", indexDataSet, [dataSetChannel01, dataSetChannel02, dataSetChannel03, dataSetChannel04]); dvp.plot("Fast Scan Panel", dataSetEnergyPGM, [ dataSetChannel01, dataSetChannel02, dataSetChannel03, dataSetChannel04 ])
class ADC(ScannableMotionBase, MonitorListener): def __init__(self, name, hv=adcppv, el=adcepv, gate=adcgatepv): self.setName(name) self.setInputNames([]) self.hv=hv self.el=el self.gate=gate self.voltagecli=CAClient(hv) self.electrometercli=CAClient(el) self.gatecli=CAClient(gate) self.voltagenordcli=CAClient(hv+".NORD") self.electrometernordcli=CAClient(el+".NORD") self.monitoradded=False self.filename=None self.voltagemonitor=None self.electrometermonitor=None self.gatemonitor=None self.firstMonitor = True self.data={hv:[],el:[],gate:[]} self.voltages = [] # for holding voltage data array self.electrometers=[] # for holding electrometer data array self.gates=[] self.firstData = True self.fastmode = False self.numberofgate=0 self.fastMode=True self.updatecounter=0 self.collectionNumber=1 def setNumberOfGates(self, ng): self.numberofgate=ng def getNumberOfGates(self): return self.numberofgate def getCollectionNumber(self): return self.collectionNumber def setCollectionNumber(self, num): self.collectionNumber=num def isFastMode(self): return self.fastMode def setFastMode(self, mode): self.fastMode=mode def reset(self): self.electrometers = [] self.voltages = [] self.updatecounter=0 self.collectionNumber=1 def setFilename(self, filename): self.filename=filename def getFilename(self): return self.filename def getElectrometer(self, num): try: if not self.electrometercli.isConfigured(): self.electrometercli.configure() return self.electrometercli.cagetArrayDouble(num) except FactoryException, e: print "create channel error (%s): %s" % (self.electrometercli.getChannel().getName(),e) except CAException, e: print "caget Error (%s): %s" % (self.electrometercli.getChannel().getName(),e)
def cagetArray(pvstring): cli=CAClient(pvstring) cli.configure() out=cli.cagetArrayDouble() cli.clearup() return out
def cagetArray(pvstring): cli = CAClient(pvstring) cli.configure() out = cli.cagetArrayDouble() cli.clearup() return out