Files
x03da/script/otf_main.py
2015-11-02 08:53:42 +01:00

167 lines
5.2 KiB
Python

#!/usr/bin/env python
"""
On-the-fly scan server for the Pearl PGM
Authors:
Juraj Krempasky
Matthias Muntwiler
Created:
5.2.2013
$Id: otf_main.py 35 2015-03-02 16:18:00Z muntwiler_m $
"""
import time
import random
import thread
import threading
import sys
import os
import numpy as np
MAXARRAY = 6000
lib_path = os.path.abspath('..')
sys.path.append(lib_path)
from pcaspy import Driver, SimpleServer
import otf_thread as pgm
prefix = "X03DA-OTF:"
#prefix = ""
pvdb = {
'COUNT' :{ 'prec' : 0, 'unit' : 'pts' },
'E1' :{ 'prec' : 7, 'unit' : 'eV' },
'E2' :{ 'prec' : 7, 'unit' : 'eV' },
'BETA1' :{ 'prec' : 7, 'unit' : 'deg' },
'BETA2' :{ 'prec' : 7, 'unit' : 'deg' },
'THETA1' :{ 'prec' : 7, 'unit' : 'deg' },
'THETA2' :{ 'prec' : 7, 'unit' : 'deg' },
'TIME' :{ 'prec' : 1, 'hopr':3, 'lopr':0.5, 'unit': 'min' },
'RUN' :{ 'type' : 'enum', 'enums': ['STOP', 'START']},
'MODE' :{ 'type' : 'enum', 'enums': ['ENERGY', 'ANGLE']},
'EDATA' :{ 'prec' : 5, 'count':MAXARRAY, },
'BDATA' :{ 'prec' : 5, 'count':MAXARRAY, },
'TDATA' :{ 'prec' : 5, 'count':MAXARRAY, },
'IDATA1' :{ 'prec' : 5, 'count':MAXARRAY, },
'IDATA2' :{ 'prec' : 5, 'count':MAXARRAY, },
'IDATA3' :{ 'prec' : 5, 'count':MAXARRAY, },
'IDATA4' :{ 'prec' : 5, 'count':MAXARRAY, },
'MSG' :{ 'type' : 'string'},
'FILE' :{ 'type' : 'string'},
'FOLDER' :{ 'type' : 'string'},
'STATUS' :{ 'type' : 'enum', 'enums': ['DONE', 'BUSY']},
}
pvs={}
class myDriver(Driver):
def __init__(self, data_source):
Driver.__init__(self)
self.otf = data_source
thread.start_new_thread(self.poll, ())
# initial values
self.setParam('E1', 400)
self.setParam('E2', 500)
self.setParam('TIME', 1.0)
self.otf.uparam['otf'][0] = 400
self.otf.uparam['otf'][1] = 500
self.otf.uparam['otf'][2] = 1.0
self.setParam('BETA1', -87.0)
self.setParam('BETA2', -87.0)
self.setParam('THETA1', 86.0)
self.setParam('THETA2', 86.0)
self.otf.uparam['angles'][0] = -87.0
self.otf.uparam['angles'][1] = -87.0
self.otf.uparam['angles'][2] = 86.0
self.otf.uparam['angles'][3] = 86.0
self.otf.uparam['angles'][4] = 1.0
self.setParam('MODE', 0)
self.setParam('FOLDER','TEST')
self.otf.folder = 'TEST'
self.setParam('FILE','TEST')
self.otf.file = 'TEST'
def start_otf(self):
# do nothing if already running
if self.otf.running:
return
else:
mode = self.getParam('MODE')
self.otf.folder = self.getParam('FOLDER')
self.otf.file = self.getParam('FILE')
if mode == 0:
print "start_otf: energy scan"
self.otf.uparam['otf'][0] = self.getParam('E1')
self.otf.uparam['otf'][1] = self.getParam('E2')
self.otf.uparam['otf'][2] = self.getParam('TIME')
thread.start_new_thread(self.otf.otfgo,())
elif mode == 1:
print "start_otf: angle scan"
self.otf.uparam['angles'][0] = self.getParam('BETA1')
self.otf.uparam['angles'][1] = self.getParam('BETA2')
self.otf.uparam['angles'][2] = self.getParam('THETA1')
self.otf.uparam['angles'][3] = self.getParam('THETA2')
self.otf.uparam['angles'][4] = self.getParam('TIME')
thread.start_new_thread(self.otf.go_angle,())
else:
print "start_otf: mode not implemented"
def stop_otf(self):
if not self.otf.running:
return
else:
print "stop_otf"
self.otf.stop()
def write(self, reason, value):
print "write: ", reason, value
self.setParam(reason, value)
self.updatePVs()
if reason == 'RUN':
if value == 1:
self.start_otf()
else:
self.stop_otf()
def poll(self):
while True:
self.setParam('EDATA',np.asarray(self.otf.pvsdata['E_crbk']))
self.setParam('BDATA',np.asarray(self.otf.pvsdata['beta_rbk']))
self.setParam('TDATA',np.asarray(self.otf.pvsdata['theta_rbk']))
self.setParam('IDATA1',np.asarray(self.otf.pvsdata['K1']))
self.setParam('IDATA2',np.asarray(self.otf.pvsdata['K2']))
self.setParam('COUNT',self.otf.pntcnt)
self.setParam('RUN',self.otf.running)
self.setParam('MSG',self.otf.msg)
self.updatePVs()
if self.otf.running:
time.sleep(0.1)
else:
time.sleep(1)
def run_direct(data_source_name):
otf = pgm.epicsPGM(data_source_name)
otf.otfgo()
def run_server(data_source_name):
data_source = pgm.epicsPGM(data_source_name)
server = SimpleServer()
server.createPV(prefix, pvdb)
driver = myDriver(data_source)
# process CA transactions
while True:
server.process(0.01)
if __name__ == '__main__':
#run_server('kei6517')
#run_server('ah401')
run_server('cadc')
#run_server('cadc3')