Script execution
This commit is contained in:
166
script/otf_main.py
Normal file
166
script/otf_main.py
Normal file
@@ -0,0 +1,166 @@
|
||||
#!/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')
|
||||
|
||||
Reference in New Issue
Block a user