Files
PBSwissMX/python/plot_interfero.py
2018-01-15 11:28:14 +01:00

280 lines
8.2 KiB
Python
Executable File

#!/usr/bin/env python
# *-----------------------------------------------------------------------*
# | |
# | Copyright (c) 2016 by Paul Scherrer Institute (http://www.psi.ch) |
# | |
# | Author Thierry Zamofing (thierry.zamofing@psi.ch) |
# *-----------------------------------------------------------------------*
#Testing the interferometer
'''
zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg$ gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX1()
enable plc 1
Motor[1].MaxSpeed=25
Motor[2].MaxSpeed=25
X -12000 ..12000
Y -12000 .. 12000
Gather.Enable=0
Gather.Items=6
Gather.MaxSamples=1000000
Gather.Period=10
Gather.Addr[0]=Motor[1].DesPos.a
Gather.Addr[1]=Motor[2].DesPos.a
Gather.Addr[2]=Motor[1].ActPos.a
Gather.Addr[3]=Motor[2].ActPos.a
Gather.Addr[4]=Motor[6].ActPos.a
Gather.Addr[5]=Motor[7].ActPos.a
open prog 2
linear abs
X-12000 Y-12000
dwell 10
Gather.Enable=2
X-12000 Y12000
dwell 100
X-12000 Y-12000
dwell 100
X12000 Y-12000
dwell 100
X-12000 Y-12000
dwell 1000
Gather.Enable=0
close
#1..7j/
&1
b2r
download data with
PPMAC=SAR-CPPM-EXPMX1
PBGatherPlot -m24 -v7 --host $PPMAC --dat gather.txt
cat /tmp/gather.txt
Motor[2].MaxSpeed=20;Motor[3].MaxSpeed=20
Motor[2].MaxSpeed=5;Motor[3].MaxSpeed=5
Motor[2].MaxSpeed=2
Motor[3].MaxSpeed=2
b2r
'''
import os, sys, json, time
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import subprocess as sprc
import telnetlib
class Interferometer():
def __init__(self,**kwargs):
for k,v in kwargs.iteritems():
setattr(self,k,v)
def gen_prog(self,prgId=2,mode=0,**kwargs):
'''
kwargs:
acq_per : acquire period: acquire data all acq_per servo loops (default=1)
mode=0: test motion
xrng:
yrng:
spd:
'''
prg=[]
acq_per=kwargs.get('acq_per',10)
gather={"MaxSamples":1000000, "Period":acq_per}
#Sys.ServoPeriod is dependent of !common() macro
ServoPeriod= .2 #0.2ms
#ServoPeriod = .05
self.meta = {'timebase': ServoPeriod*gather['Period']}
channels=["Motor[1].DesPos","Motor[2].DesPos","Motor[1].ActPos","Motor[2].ActPos","Motor[6].ActPos","Motor[7].ActPos"]
prg.append('Gather.Enable=0')
prg.append('Gather.Items=%d'%len(channels))
for k,v in gather.iteritems():
prg.append('Gather.%s=%d'%(k,v))
for i,c in enumerate(channels):
prg.append('Gather.Addr[%d]=%s.a'%(i,c))
prg.append('open prog %d'%(prgId))
prg.append(' P1000=0')
# this uses Coord[1].Tm and limits with MaxSpeed
#******** mode -1 ********
if mode==0: #### jog all motors 10000um (or 10000 mdeg)
xRng = kwargs.get('xRng', (-12000,12000))
yRng = kwargs.get('yRng', (-12000,12000))
spd = kwargs.get('spd', 10)
prg.append('Motor[1].MaxSpeed=%f'%spd)
prg.append('Motor[2].MaxSpeed=%f'%spd)
prg.append('''
linear abs
X%g Y%g
dwell 10
Gather.Enable=2
X%g Y%g
dwell 100
X%g Y%g
dwell 100
X%g Y%g
dwell 100
X%g Y%g
dwell 100
Gather.Enable=0
'''%(xRng[0],yRng[0],xRng[0],yRng[1],xRng[0],yRng[0],xRng[1],yRng[0],xRng[0],yRng[0]))
prg.append(' P1000=1')
prg.append('close')
prg.append('&1\nb%dr\n'%prgId)
self.download(prg,mode=3,file='/tmp/prg.cfg')
def download(self,prg=None,mode=0,file='/tmp/interfero.cfg'):
'''
mode bits:
bit 0 (1): wait execution finished (P1000==1)
bit 1 (2): gather and save data
bit 2 (4): ...
'''
host=self.host
if prg is not None and self.verbose & 4:
for ln in prg:
print(ln)
if file is not None and prg is not None:
fh=open(file,'w')
fh.write('\n'.join(prg))
fh.close()
if host is not None:
# ***download and start the program***
cmd ='gpasciiCommander --host '+host+' '+ file
print(cmd)
p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT)
#res=p.stdout.readlines(); print res
retval = p.wait()
if mode &1:
# ***wait program finished P1000=1***
com=GpasciiCommunicator().connect(host,prompt='# ')
ack=GpasciiCommunicator.gpascii_ack
sys.stdout.write('wait execution...');sys.stdout.flush()
while(True):
#Gather.MaxLines calculates maximum numbewr of gathering into memory
com.write('P1000\n')
val=com.read_until(ack)
#print val
val=int(val[val.find('=')+1:].rstrip(ack))
if val==1:break
#com.write('Gather.Index\n')
#val=com.read_until(ack)
#print val
time.sleep(.2)
sys.stdout.write('.');sys.stdout.flush()
if mode &2:
fnRmt = '/var/ftp/gather/out.txt'
fnLoc = '/tmp/gather.txt'
print('\ngather data to %s...' % fnRmt)
p = sprc.Popen(('ssh', 'root@' + host, 'gather ', '-u', fnRmt), shell=False, stdin=sprc.PIPE, stdout=sprc.PIPE,
stderr=sprc.PIPE)
res = p.wait()
if res:
print('ssh failed. ssh root@%s to open a session' % host)
return
print('transfer data to %s...' % fnLoc)
p = sprc.Popen(('scp', 'root@' + host + ':' + fnRmt, fnLoc), shell=False, stdin=sprc.PIPE, stdout=sprc.PIPE,
stderr=sprc.PIPE)
res = p.wait()
self.rec = np.genfromtxt(fnLoc, delimiter=' ')
def show_pos(self):
rec=self.rec
#"M1.DesPos","M2.DesPos","M1.ActPos","M2.ActPos","M6.ActPos","M7.ActPos"]
#idx 0 1 2 3 4 5
f1=plt.figure()
ax1 = f1.add_subplot(1,1,1)
x=range(len(rec[:,0]))
hl=ax1.plot(x,-(rec[:,0]-rec[0,0]),'k')
hl=ax1.plot(x,-(rec[:,2]-rec[0,2]),'r')
hl=ax1.plot(x,-(rec[:,4]-rec[0,4])/100,'m')
hl=ax1.plot(x,rec[:,1]-rec[0,1],'k')
hl=ax1.plot(x,rec[:,3]-rec[0,3],'b')
hl=ax1.plot(x,-(rec[:,5]-rec[0,5])/100,'c')
#hl=ax1.plot(x,-(rec[:,0]-rec[0,0]),'k')
#hl=ax1.plot(x,-(rec[:,2]-rec[0,2]),'r')
#hl=ax1.plot(x,-(rec[:,4]-rec[0,4])/100,'m')
#hl=ax1.plot(x,rec[:,1]-rec[0,1],'k')
#hl=ax1.plot(x,rec[:,3]-rec[0,3],'b')
#hl=ax1.plot(x,-(rec[:,5]-rec[0,5])/100,'c')
plt.show()
def show_poserr(self):
rec=self.rec
#"M1.DesPos","M2.DesPos","M1.ActPos","M2.ActPos","M6.ActPos","M7.ActPos"]
#idx 0 1 2 3 4 5
f1=plt.figure()
ax1 = f1.add_subplot(1,1,1)
t=range(len(rec[:,0]))
actYerr=(rec[:,2]-rec[:,0]);actYerr-=actYerr[0]
actXerr=(rec[:,3]-rec[:,1]);actXerr-=actXerr[0]
infYerr=(rec[:,4]-rec[:,0]);infYerr-=infYerr[0]
infXerr=(rec[:,5]-rec[:,1]);infXerr-=infXerr[0]
hl=ax1.plot(t,actYerr,'r',label='actYerr')
hl=ax1.plot(t,actXerr,'b',label='actXerr')
hl=ax1.plot(t,infYerr,'m',label='infYerr')
hl=ax1.plot(t,infXerr,'c',label='infXerr')
#plt.legend(handles=h)
ax1.legend()
plt.show()
class GpasciiCommunicator():
'''Communicates with the Delta Tau gpascii programm
'''
gpascii_ack="\x06\r\n"
gpascii_inp='Input\r\n'
def connect(self, host, username='root', password='deltatau',prompt='ppmac# ',verbose=0):
p=telnetlib.Telnet(host)
s=p.read_until('login: ')
if verbose: print(s)
p.write(username+'\n')
s =p.read_until('Password: ')
if verbose: print(s)
p.write(password+'\n')
s =p.read_until(prompt) # command prompt
if verbose: print(s)
p.write('gpascii -2\n') # execute gpascii command
s=p.read_until(self.gpascii_inp)
if verbose: print(s)
return p
if __name__=='__main__':
ifm=Interferometer(verbose = 255,host='SAR-CPPM-EXPMX1')
os.chdir(os.path.join(os.path.dirname(__file__), '../cfg'))
ifm.download(['$$$***','!common()','!SAR-EXPMX1()','#1..7j/','enable plc 1','Motor[1].MaxSpeed=25','Motor[2].MaxSpeed=25'])
raw_input('press return when homed')
#ifm.gen_prog(mode=0)
#ifm.show_poserr()
#ifm.gen_prog(mode=0,xRng=(-10000,10000),yRng=(-10000,10000),spd=10)
ifm.gen_prog(mode=0,xRng=(-5000,5000),yRng=(-5000,5000),spd=5)
ifm.show_poserr()
#ifm.gen_prog(mode=0,xRng=(-2000,2000),yRng=(4000,8000),spd=5)
#ifm.show_poserr()
#ifm.rec = np.genfromtxt('/scratch/gather.txt', delimiter=' ')
#ifm.show_pos()