#!/usr/bin/env python # *-----------------------------------------------------------------------* # | | # | Copyright (c) 2015 by Paul Scherrer Institute (http://www.psi.ch) | # | | # | Author Thierry Zamofing (thierry.zamofing@psi.ch) | # *-----------------------------------------------------------------------* ''' gathers data on powerpmac and plot #mode bits: 0 1 configure acquisition -> needs -c 1 2 start acquisition ->Gather.Enable=2 2 4 stop acquisition ->Gather.Enable=0 3 8 wait acquisition stopped ->while(1){if(Gather.Enable==0) break} 4 16 upload acquisition 5 32 plot acquisition -> needs -a (or -c) mode 1+2+8+16+32 | user sets a stop mode 1+2 | motion, wait some time| #mode 4+16+32 mode 1+8+16+32 | start acqu, do motion stop acqu. verbose bits: 1 basic info 2 wait progress 4 upload progress #config file example: { "channels": [ "Motor[1].ActPos", "Motor[9].ActPos", "Motor[10].ActPos", "Motor[11].ActPos", "PowerBrick[0].GpioData[0]" ], "axes": [ [0, "b", "ActPos 1"], [1, "g", "ActPos_9"], [2, "r", "ActPos_10"], [3, "m", "ActPos_11"], [4, ["bits", 15, 3], "GPIO"]], "gather": { "MaxSamples":1000, "Period":10 } } Acquired time is:MaxSamples*Period*.2 ''' #gatherPlot #channels -c '[Sys.ServoCount,Motor[1].ActPos,Motor[9].ActPos,Motor[10].ActPos,Motor[11].ActPos,PowerBrick[0].GpioData[0]]' #axis -a '(((0,1),'b','ActPos 1'), ((0,2),'g','ActPos 9'), ((0,3),'r','ActPos 10'), ((0,4),'m','ActPos 11'), ((0,5),('bits',14,18),'GPIO')) #('bits',14,18) means decode bits 14-18 # #check: Gather.Enable Gather.Index #on PPMAC do something like: #Gather.Items=6 #Gather.MaxSamples=10000 #Gather.Period=10 #Gather.Addr[0]=Sys.ServoCount.a #Gather.Addr[1]=Motor[1].ActPos.a #Gather.Addr[2]=Motor[9].ActPos.a #Gather.Addr[3]=Motor[10].ActPos.a #Gather.Addr[4]=Motor[11].ActPos.a #Gather.Addr[5]=PowerBrick[0].GpioData[0].a # #Gather.Enable=2 ## move the motor[1] #Gather.Enable=0 # #1;&1;#1->1000X #k;j=0;P1=1000 #b3r # to run that script without password, make first an ssh connection e.g. ssh root@PPMACZT84 # import os, sys, json import numpy as np import matplotlib as mpl import subprocess as sprc class GatherPlot: def __init__(self): pass def plot1(self): import matplotlib.pyplot as plt fnLoc='/tmp/gather.txt' data = np.genfromtxt(fnLoc, delimiter=' ') x=np.arange(data.shape[0])*2. #-> msec pass #-> needs -a (or -c) fig=plt.figure() ax0 = fig.add_subplot(1,1,1) ax0.set_xlabel('msec') ax=[ax0,] axArgs=[(0,'r','A'),(1,'g','B'),(2,'b','C')] for i in range(len(axArgs)-1): ax.append(ax0.twinx()) fig.subplots_adjust(right=0.75) n=(len(ax)-2);dx=.2/n for i in range(n): ax[2+i].spines['right'].set_position(('axes', 1+dx*(1+i))) ax[2+i].set_frame_on(True) ax[2+i].patch.set_visible(False) for i in range(len(axArgs)): idx,param,lbl=axArgs[i] col=param ax[i].set_ylabel(lbl, color=col) ax[i].plot(x, data[:,idx], color=col) ax[i].tick_params(axis='y', colors=col) plt.show() def plot(self): import matplotlib.pyplot as plt fnLoc='/tmp/gather.txt' data = np.genfromtxt(fnLoc, delimiter=' ') fig=plt.figure() ax0 = fig.add_subplot(1,1,1) ax0.set_xlabel('msec') ax=[ax0,] #fig.subplots_adjust(right=0.75) col='b' #idx=1 #ax[0].set_ylabel(ch[idx], color=col) x=data[:,1] y=data[:,2] hl=ax[0].plot(x, y, color=col) ax[0].tick_params(axis='y', colors=col) cid = fig.canvas.mpl_connect('scroll_event', self.onclick) fig.obj=self self.data=data #self.ch=ch self.idx=1 self.ax=ax self.col=col self.hl=hl plt.show() @staticmethod def onclick(event): #print 'button=%s, x=%d, y=%d, xdata=%f, ydata=%f'%( # event.button, event.x, event.y, event.xdata, event.ydata) obj=event.canvas.figure.obj if event.button=='up': if obj.idx0: obj.idx-=1 obj.ax[0].set_ylabel(obj.ch[obj.idx], color=obj.col) d=obj.data[:,obj.idx] if obj.args.diff: d=np.diff(d) obj.hl[0].set_ydata(d) #obj.ax[0].plot(x, obj.data[:,obj.idx]obj.data[:,obj.idx]obj.data[:,obj.idx], color=obj.col) min=bottom=d.min() max=d.max() delta=(max-min)/10. obj.ax[0].set_ylim(bottom=min-delta,top=max+delta,emit=True,auto=True) event.canvas.figure.show() if __name__=='__main__': gp=GatherPlot() gp.plot()