update gui and triggering: speed sync works!

This commit is contained in:
2018-11-22 12:32:43 +01:00
parent 2e534f306e
commit e832b40124
7 changed files with 183 additions and 113 deletions

View File

@@ -91,12 +91,12 @@ class MPLCanvasErr(FigureCanvas):
def OnBtnPress(self, event):
"""on button press we will see if the mouse is over us and store some data"""
print(dir(event.guiEvent))
#print(dir(event.guiEvent))
return
def OnBtnRelease(self, event):
"""on release we reset the press data"""
print(dir(event.guiEvent))
#print(dir(event.guiEvent))
#self.OnMouse(event)
return

View File

@@ -100,12 +100,12 @@ class MPLCanvasVelo(FigureCanvas):
def OnBtnPress(self, event):
"""on button press we will see if the mouse is over us and store some data"""
print(dir(event.guiEvent))
#print(dir(event.guiEvent))
return
def OnBtnRelease(self, event):
"""on release we reset the press data"""
print(dir(event.guiEvent))
#print(dir(event.guiEvent))
#self.OnMouse(event)
return

View File

@@ -46,34 +46,20 @@ class MPLCanvasImg(FigureCanvas):
self.fig=fig
self.ax=ax
def InitChild(self,pts,rec):
def InitChild(self,doc):
fig=self.fig
ax=self.ax
pts=doc.fh['pts']
rec=doc.fh['rec']
idxTrigger=doc.idxTrigger
#res=rot.ActPos,x.ActPos,y.ActPos,rot.DesPos,x.DesPos,y.DesPos
#idx 0 1 2 3 4 5
#idx=np.ndarray(shape=len(pts),dtype=np.int32)
#for i in range(len(pts)):
# l=rec[:,(3,2)]-pts[i,:]
# l2=l[:,0]**2+l[:,1]**2
# idx[i]=np.argmin(l2)
idx=[]
for i in range(len(pts)):
l=rec[:,(3,2)]-pts[i,:]
l2=l[:,0]**2+l[:,1]**2
idx.extend(np.where(l2<1)[0].tolist())
#print idx
recPts=rec[idx,:]
#f2 = plt.figure()
#a2 = f2.add_axes([0.075,0.075,0.85,0.85])
#a2.plot(rec[:,1],'r-',label='ptsDot') #,picker=5 default value
#a2.plot(rec[:,0],'g-',label='ptsDot') #,picker=5 default value
#a2.plot(rec[:,3],'r--',label='ptsDot') #,picker=5 default value
#a2.plot(rec[:,2],'g--',label='ptsDot') #,picker=5 default value
#plt.show()
# idx=[]
# for i in range(len(pts)):
# l=rec[:,(3,2)]-pts[i,:]
# l2=l[:,0]**2+l[:,1]**2
# idx.extend(np.where(l2<1)[0].tolist())
# recPts=rec[idx,:]
hl=[]
hl+=ax.plot(pts[:,0],pts[:,1],'r.',label='ptsDot') #,picker=5 default value
@@ -86,7 +72,13 @@ class MPLCanvasImg(FigureCanvas):
hl+=ax.plot(rec[:, 3], rec[:, 2], 'b-',label='recDesPos')
hl+=ax.plot(rec[:,1],rec[:,0],'g-',label='recActPos')
hl+=ax.plot(recPts[:,1],recPts[:,0],'g.',label='recDot')
#hl+=ax.plot(recPts[:,1],recPts[:,0],'g.',label='recDot')
hl+=ax.plot(rec[-1:,1],rec[-1:,0],'r.--',label='recNxt')
#hh=ax.plot(rec[idxTrigger,1],rec[idxTrigger,0],'rx',label='trig')
#hh[0].get_markeredgewidth();hh[0].get_markersize()
hl+=ax.plot(rec[idxTrigger,1],rec[idxTrigger,0],'rx',label='trig',markeredgewidth=1.,markersize=6.)
#hl+=ax.plot(recPts[:,1],recPts[:,0],'g.',label='recDot')
ax.xaxis.set_label_text('x-pos um')
ax.yaxis.set_label_text('y-pos um')
ax.axis('equal')
@@ -149,7 +141,7 @@ class MPLCanvasImg(FigureCanvas):
def OnBtnPress(self, event):
"""on button press we will see if the mouse is over us and store some data"""
print(dir(event.guiEvent))
#print(dir(event.guiEvent))
return
if event.inaxes == self.colBar.ax:
#if event.guiEvent.LeftDClick()==True:
@@ -247,7 +239,7 @@ class MAxyPlotFrame(wx.Frame):
#wxAxCtrl.SetCallback(MAxyPlotFrame.OnSetView,wxAxCtrl)
#sizer.Add(wxAxCtrl.sizer, 0, wx.EXPAND | wx.ALIGN_CENTER | wx.ALL, border=5)
canvas.InitChild(doc.fh['pts'],doc.fh['rec'])
canvas.InitChild(doc)
#self.Fit()
self.Centre()
@@ -295,6 +287,7 @@ class MAxyPlotFrame(wx.Frame):
hl=canvas.hl
hl[2].set_data(rec[:idx+1, 3], rec[:idx+1, 2])
hl[3].set_data(rec[:idx+1, 1], rec[:idx+1, 0])
hl[4].set_data(rec[idx:idx+10, 1], rec[idx:idx+10, 0])
#ax.draw_artist(hl[2])
x=ax.get_xlim();x=(x[1]-x[0])/2;
y=ax.get_ylim();y=(y[1]-y[0])/2;

View File

@@ -148,21 +148,22 @@ class MAMainFrame(wx.Frame):
l=rec[idx:idx+rng,(3,2)]-pts[i,:]
l2=l[:,0]**2+l[:,1]**2
ofs=l2.argmin()
print(l2[ofs])
#print(l2[ofs])
idx+=ofs
idxInPos.append(idx)
idx+=rng/2
doc.idxInPos=idxInPos=np.array(idxInPos)
#jitter=idxInPos-idxTrigger[:idxInPos.shape[0]]
self.SetStatusText('scaling of DesTimeBase: %f'%(float(idxInPos[-1])/idxTrigger[idxInPos.shape[0]-1]))
#self.PlotJitter()
self.wxTimeCtrl.slider.SetRange(0,lenRec-1)
ts=fh['meta'].item()['timebase']
page=idxInPos[1]-idxInPos[0]
self.wxTimeCtrl.slider.SetPageSize(page)
self.wxTimeCtrl.slider.SetPageSize(idxInPos[1]-idxInPos[0])
self.wxPosCtrl.slider.SetRange(0,lenPts-1)
self.wxPosCtrl.slider.SetPageSize(10)
self.wxTrigCtrl.slider.SetRange(0,idxTrigger.shape[0]-1)
self.wxTrigCtrl.slider.SetPageSize(10)
def CloseFile(self):
#http://docs.wxwidgets.org/2.8/wx_windowdeletionoverview.html#windowdeletionoverview
@@ -173,6 +174,26 @@ class MAMainFrame(wx.Frame):
except AttributeError as e:
pass
def PlotJitter(self):
doc=self.doc
fh=doc.fh
idxInPos=doc.idxInPos
idxTrigger=doc.idxTrigger
#display the jitter of inPos->trigger
ts=fh['meta'].item()['timebase']
jitter=idxTrigger[:idxInPos.shape[0]]-idxInPos
import matplotlib.pyplot as plt # used for the colormaps
plt.figure('jitter inPos -> trigger: scaling of DesTimeBase: %f'%(float(idxInPos[-1])/idxTrigger[idxInPos.shape[0]-1]))
plt.plot(jitter*ts)
plt.ylabel('jitter in ms')
plt.ylabel('point idx')
plt.show()
def DispJitter(self,idxInPos,idxTrigger):
doc=self.doc
ts=doc.fh['meta'].item()['timebase']
self.SetStatusText("Jitter: %.2gms scaling: %.6g"%((idxTrigger-idxInPos)*ts,float(idxInPos)/idxTrigger))
def OnOpen(self, event):
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), '','numpy files (*.npz;*.npy)|*.npz;*.npy|all (*.*)|*.*', wx.OPEN|wx.FD_CHANGE_DIR)
if dlg.ShowModal() == wx.ID_OK:
@@ -287,40 +308,43 @@ rec
pass
@staticmethod
def OnSetTime(usrData, value, msg):
def OnSetTime(usrData, idxRec, msg):
'called when the time slider has been changed'
#print('OnSetTime', usrData, value, msg)
view=usrData.slider.Parent
doc=view.doc
idx=np.argmin(abs(doc.idxInPos-value))
view.wxPosCtrl.SetValue(idx)
idx=np.argmin(abs(doc.idxTrigger-value))
view.wxTrigCtrl.SetValue(idx)
doc.Update(view,0,value)
idxInPos=np.argmin(abs(doc.idxInPos-idxRec))
view.wxPosCtrl.SetValue(idxInPos)
idxTrigger=np.argmin(abs(doc.idxTrigger-idxRec))
view.wxTrigCtrl.SetValue(idxTrigger)
view.DispJitter(doc.idxInPos[idxInPos],doc.idxTrigger[idxTrigger])
doc.Update(view,0,idxRec)
@staticmethod
def OnSetIdxInPos(usrData, value, msg):
def OnSetIdxInPos(usrData, idxInPos, msg):
'called when the idxInPos slider has been changed'
#print('OnSetPosIdx', usrData, value, msg)
view = usrData.slider.Parent
doc = view.doc
value=doc.idxInPos[value]
view.wxTimeCtrl.SetValue(value)
idx=np.argmin(abs(doc.idxTrigger-value))
view.wxTrigCtrl.SetValue(idx)
doc.Update(view, 0, value)
idxRec=doc.idxInPos[idxInPos]
view.wxTimeCtrl.SetValue(idxRec)
idxTrigger=np.argmin(abs(doc.idxTrigger-idxRec))
view.wxTrigCtrl.SetValue(idxTrigger)
view.DispJitter(doc.idxInPos[idxInPos],doc.idxTrigger[idxTrigger])
doc.Update(view, 0, idxRec)
@staticmethod
def OnSetIdxTrigger(usrData, value, msg):
def OnSetIdxTrigger(usrData, idxTrigger, msg):
'called when the idxTrigger slider has been changed'
#print('OnSetIdxTrigger', usrData, value, msg)
view = usrData.slider.Parent
doc = view.doc
value=doc.idxTrigger[value]
view.wxTimeCtrl.SetValue(value)
idx=np.argmin(abs(doc.idxInPos-value))
view.wxPosCtrl.SetValue(idx)
doc.Update(view, 0, value)
idxRec=doc.idxTrigger[idxTrigger]
view.wxTimeCtrl.SetValue(idxRec)
idxInPos=np.argmin(abs(doc.idxInPos-idxRec))
view.wxPosCtrl.SetValue(idxInPos)
view.DispJitter(doc.idxInPos[idxInPos],doc.idxTrigger[idxTrigger])
doc.Update(view, 0, idxRec)
if __name__ == '__main__':