adding MAError plot

This commit is contained in:
2016-12-23 16:40:35 +01:00
parent 36a11a5657
commit c4f9813681

View File

@@ -45,136 +45,75 @@ class MPLCanvasErr(FigureCanvas):
self.fig=fig self.fig=fig
self.ax=ax self.ax=ax
def InitChild(self,pts,rec): def InitChild(self,err):
fig=self.fig fig=self.fig
ax=self.ax ax=self.ax
errx,erry,err=err
err=np.sqrt((rec[:,1]-rec[:,4])**2+(rec[:,1]-rec[:,4])**2) hl = []
hl = ax.plot(err, 'r-') hl = ax.plot(errx, 'g-',label='x-error')
hl = ax.plot(erry, 'y-',label='y-error')
hl = ax.plot(err, 'r-',label='error')
ax.xaxis.set_label_text('time (10x servo cycle)') ax.xaxis.set_label_text('time (10x servo cycle)')
ax.yaxis.set_label_text('pos-error um') ax.yaxis.set_label_text('pos-error um')
legend = ax.legend(loc='upper right', shadow=True)
self.ax = ax self.ax = ax
self.hl = hl self.hl = hl
def OnMotion(self,event): def OnMotion(self, event):
print event,event.x,event.y,event.inaxes,event.xdata,event.ydata # print event,event.x,event.y,event.inaxes,event.xdata,event.ydata
return
if event.inaxes==self.ax:
x=int(round(event.xdata))
y=int(round(event.ydata))
try:
v=self.img.get_array()[y,x]
except IndexError as e:
pass
else:
#print x,y,v
self.SetStatusCB(self.Parent,0,(x,y,v))
elif event.inaxes==self.colBar.ax:
colBar=self.colBar
pt=colBar.ax.bbox.get_points()[:,1]
nrm=colBar.norm
vmin,vmax,p0,p1,pS = (nrm.vmin,nrm.vmax,pt[0],pt[1],event.y)
if isinstance(colBar.norm,mpl.colors.LogNorm):#type(colBar.norm)==mpl.colors.LogNorm does not work...
vS=0
else:#scale around point
vS=vmin+(vmax-vmin)/(p1-p0)*(pS-p0)
self.SetStatusCB(self.Parent,1,vS)
try:
vmin,vmax,p0,p1,pS=self.colBarPressed
except AttributeError:
return
#if event.inaxes != self.cbar.ax: return
colBar=self.colBar
#print vmin,vmax,p0,p1,pS,type(colBar.norm)
#print 'x0=%f, xpress=%f, event.xdata=%f, dx=%f, x0+dx=%f'%(x0, xpress, event.xdata, dx, x0+dx)
if isinstance(colBar.norm,mpl.colors.LogNorm):#type(colBar.norm)==mpl.colors.LogNorm does not work... if event.inaxes == self.ax:
if event.button==1:
#colBar.norm.vmin=.1 x = int(round(event.xdata))
colBar.norm.vmax=vmax*np.exp((pS-event.y)/100) #y = int(round(event.ydata))
#scale= np.exp((event.y-pS)/100) y = event.ydata
elif event.button==1:#move top,bottom,both s = []
pD = event.y - pS for h in self.ax.get_lines(): # to get also the ellipses: self.ax.get_children()
vD=(vmax-vmin)/(p1-p0)*(pS-event.y) c = h.contains(event)
colBar.norm.vmin = vmin+vD if c[0]:
colBar.norm.vmax = vmax+vD # s = str(h)+str(c[1])
elif event.button==3:#scale around point # print "over %s" % s
scale= np.exp((pS-event.y)/100) if type(h) == mpl.lines.Line2D:
vS=vmin+(vmax-vmin)/(p1-p0)*(pS-p0) lbl = h.get_label()
#print scale,vS arr = h.get_data()
colBar.norm.vmin = vS-scale*(vS-vmin) idx = c[1]['ind'][0]
colBar.norm.vmax = vS-scale*(vS-vmax) #s += '%s[%d] = [%.2f, %.2f]' % (lbl, idx, arr[0][idx], arr[1][idx])
self.img.set_norm(colBar.norm)#force image to redraw s.append('%s=%.2f' % (lbl, arr[1][idx]))
colBar.patch.figure.canvas.draw() else:
s += str(h) + str(c[1])
s=', '.join(s)
self.SetStatusCB(self.Parent, 0, (x, y, s))
def OnBtnPress(self, event): def OnBtnPress(self, event):
"""on button press we will see if the mouse is over us and store some data""" """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 return
if event.inaxes == self.colBar.ax:
#if event.guiEvent.LeftDClick()==True:
# print dlg
pt=self.colBar.ax.bbox.get_points()[:,1]
nrm=self.colBar.norm
self.colBarPressed = (nrm.vmin,nrm.vmax,pt[0],pt[1],event.y)
#self.colBarPressed = event.x, event.y
#print self.colBarPressed
#self.OnMouse(event)
pass
def OnBtnRelease(self, event): def OnBtnRelease(self, event):
"""on release we reset the press data""" """on release we reset the press data"""
print dir(event.guiEvent)
#self.OnMouse(event) #self.OnMouse(event)
return return
try: del self.colBarPressed
except AttributeError: pass
def OnBtnScroll(self, event): def OnBtnScroll(self, event):
return return
#self.OnMouse(event)
colBar=self.colBar
if event.inaxes==colBar.ax:
pt=colBar.ax.bbox.get_points()[:,1]
nrm=colBar.norm
vmin,vmax,p0,p1,pS = (nrm.vmin,nrm.vmax,pt[0],pt[1],event.y)
if isinstance(colBar.norm,mpl.colors.LogNorm):#type(colBar.norm)==mpl.colors.LogNorm does not work...
scale= np.exp((-event.step)/10)
colBar.norm.vmax=vmax*scale
else:#scale around point
scale= np.exp((-event.step)/10)
vS=vmin+(vmax-vmin)/(p1-p0)*(pS-p0)
#print scale,vS
colBar.norm.vmin = vS-scale*(vS-vmin)
colBar.norm.vmax = vS-scale*(vS-vmax)
self.img.set_norm(colBar.norm)#force image to redraw
colBar.patch.figure.canvas.draw()
def OnKeyPress(self, event): def OnKeyPress(self, event):
return return
colCycle=self.colCycle
colBar=self.colBar
if event.key=='down':
self.colIndex += 1
elif event.key=='up':
self.colIndex -= 1
self.colIndex%=len(colCycle)
cmap = colCycle[self.colIndex]
colBar.set_cmap(cmap)
colBar.draw_all()
self.img.set_cmap(cmap)
self.img.get_axes().set_title(cmap)
colBar.patch.figure.canvas.draw()
def OnMouse(self, event): def OnMouse(self, event):
return return
for k in dir(event):
if k[0]!='_':
print k,getattr(event,k)
class MAErrorFrame(wx.Frame): class MAErrorFrame(wx.Frame):
def __del__(self):
self.doc.view.remove(self)
def __init__(self, parent,doc): def __init__(self, parent,doc):
wx.Frame.__init__(self, parent, title='xy-Plot', size=wx.Size(850, 650)) wx.Frame.__init__(self, parent, title='error-Plot', size=wx.Size(850, 650))
self.doc=doc;doc.view.append(self) self.doc=doc;doc.view.append(self)
imgDir=ut.Path.GetImage() imgDir=ut.Path.GetImage()
icon = wx.Icon(os.path.join(imgDir,'PBMA.ico'), wx.BITMAP_TYPE_ICO) icon = wx.Icon(os.path.join(imgDir,'PBMA.ico'), wx.BITMAP_TYPE_ICO)
@@ -187,7 +126,16 @@ class MAErrorFrame(wx.Frame):
self.SetSizer(sizer) self.SetSizer(sizer)
toolbar=ut.AddToolbar(canvas,sizer) toolbar=ut.AddToolbar(canvas,sizer)
canvas.InitChild(doc.fh['pts'],doc.fh['rec'])
try:
err=doc.err
except AttributeError:
rec=doc.fh['rec']
errx = abs(rec[:, 1] - rec[:, 4])
erry = abs(rec[:, 2] - rec[:, 5])
errxy = np.sqrt(errx ** 2 + erry ** 2)
doc.err = err = (errx, erry, errxy)
canvas.InitChild(err)
self.Centre() self.Centre()
@@ -201,15 +149,14 @@ class MAErrorFrame(wx.Frame):
#-------- Edit Menu -------- #-------- Edit Menu --------
mn = wx.Menu() mn = wx.Menu()
mnItem=mn.Append(wx.ID_ANY, 'Setup Colormap', 'Setup the color mapping ');self.Bind(wx.EVT_MENU, self.OnColmapSetup, mnItem) #mnItem=mn.Append(wx.ID_ANY, 'Setup Colormap', 'Setup the color mapping ');self.Bind(wx.EVT_MENU, self.OnColmapSetup, mnItem)
mnItem=mn.Append(wx.ID_ANY, 'Invert X-Axis', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnInvertAxis, mnItem) #mnItem=mn.Append(wx.ID_ANY, 'Invert X-Axis', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnInvertAxis, mnItem)
self.mnIDxAxis=mnItem.GetId() #self.mnIDxAxis=mnItem.GetId()
mnItem=mn.Append(wx.ID_ANY, 'Invert Y-Axis', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnInvertAxis, mnItem) #mnItem=mn.Append(wx.ID_ANY, 'Invert Y-Axis', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnInvertAxis, mnItem)
mnItem=mn.Append(wx.ID_ANY, 'Show Moments', 'Show image moments ', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnShowMoments, mnItem) #mnItem=mn.Append(wx.ID_ANY, 'Show Moments', 'Show image moments ', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnShowMoments, mnItem)
self.mnItemShowMoment=mnItem #self.mnItemShowMoment=mnItem
mnItem=mn.Append(wx.ID_ANY, 'Tomo Normalize', 'Multiplies each pixel with a normalization factor. Assumes there exist an array exchange/data_white', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnTomoNormalize, mnItem) #mnItem=mn.Append(wx.ID_ANY, 'Tomo Normalize', 'Multiplies each pixel with a normalization factor. Assumes there exist an array exchange/data_white', kind=wx.ITEM_CHECK);self.Bind(wx.EVT_MENU, self.OnTomoNormalize, mnItem)
self.mnItemTomoNormalize=mnItem #self.mnItemTomoNormalize=mnItem
mnBar.Append(mn, '&Edit') mnBar.Append(mn, '&Edit')
mn = wx.Menu() mn = wx.Menu()
@@ -222,147 +169,33 @@ class MAErrorFrame(wx.Frame):
def OnUpdate(self, msg, usrData): def OnUpdate(self, msg, usrData):
# this is the model-view-control update function # this is the model-view-control update function
print 'OnUpdate',self, msg, usrData print 'OnUpdate',self, msg, usrData
# for message description s.a. class MADoc
def SetIdxXY(self,x,y): if msg == 0:
self.idxXY=(x,y) canvas = self.canvas
ax = canvas.ax
len = usrData
err = self.doc.err
hl = canvas.hl
#hl[0].set_data(rec[:len, 4], rec[:len, 5])
#hl[3].set_data(rec[:len, 1], rec[:len, 2])
# 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;
ax.set_xlim(len-x, len + x,emit=True)
#ax.set_ylim(rec[len, 2] - y, rec[len, 2] + y)
canvas.draw()
@staticmethod @staticmethod
def SetStatusCB(obj,mode,v): def SetStatusCB(obj,mode,v):
if mode==0: if mode==0:
obj.SetStatusText( "x= %d y=%d val=%g"%v,0) #obj.SetStatusText( "x= %d y=%d val=%s"%v,0)
elif mode==1: obj.SetStatusText("x(%d,%.2f): %s" % v, 0)
obj.SetStatusText( "Colormap Value %d (drag to scale)"%v,0)
else: else:
raise KeyError('wrong mode') raise KeyError('wrong mode')
def OnShowMoments(self,event):
if event.IsChecked():
dlg = wx.FileDialog(self, "Choose valid mask file (e.g. pilatus_valid_mask.mat)", os.getcwd(), '','MATLAB files (*.mat)|*.mat|all (*.*)|*.*', wx.OPEN|wx.FD_CHANGE_DIR)
if dlg.ShowModal() == wx.ID_OK:
fnMatMsk = dlg.GetPath()
print 'OnOpen',fnMatMsk
dlg.Destroy()
if not fnMatMsk:
return
#fnMatMsk='/scratch/detectorData/cSAXS_2013_10_e14608_georgiadis_3D_for_Marianne/analysis/data/pilatus_valid_mask.mat'
self.procMoment=pm=ProcMoment()
pm.SetMskMat(fnMatMsk,False)
#roi=[603, 826, 200, 200]
#pm.roi=(slice(roi[1],roi[1]+roi[3]),slice(roi[0],roi[0]+roi[2]))
#pm.shape=(roi[3],roi[2])
#pm.SetProcess('python')
#pm.SetProcess('pyFast')
pm.SetProcess('c')
self.PlotMoments()
#self.canvas.img.draw()
data=self.canvas.img.get_array()
self.canvas.img.set_array(data)
fig, ax = plt.subplots(2)
v=data.sum(axis=0); x=np.arange(v.size); x0=x.sum(); m0=v.sum(); m1=(v*x).sum(); m2=(v*x*x).sum()
ax[0].plot(v);
m=m1/m0
s=np.sqrt( (m2-(m1**2/m0))/m0)
xx=1/(s*np.sqrt(2*np.pi))*np.exp(-.5*((x-m)/s)**2)
ax[0].set_title('%g | %g | %g | %g | %g'%(m0,m1,m2,m,s))
ax[0].hold(True);ax[0].plot(xx*m0)
v=data.sum(axis=1);
ax[1].plot(v);
plt.show()
#print pm.resArr[0:3],pm.resArr[1]/pm.resArr[0],pm.resArr[2]/pm.resArr[0]
else:
for o in self.goMoment:
o.remove()
del self.goMoment
del self.procMoment
self.canvas.draw()
def PlotMoments(self):
data=self.canvas.img.get_array()
pm=self.procMoment
#data=ndi.median_filter(data, 3)
try:
data.ravel()[pm.mskIdx]=0
except AttributeError as e:
print e
try:
data=data[pm.roi]
except AttributeError as e:
print e
#data=np.log(data+1)
#data[100:110,500:510]=1000 #y,x
#data[650:850,700:850]=0 #y,x
#pm.Process(np.log(data+1))
pm.Process(data)
xbar, ybar, cov=pm.GetIntertialAxis()
m=pm.resArr
m00=m[0];m01=m[1];m10=m[2];m11=m[3];m02=m[4];m20=m[5]
xm = m10 / m00
ym = m01 / m00
u11 = (m11 - xm * m01) / m00
#u11[u11<0.]=0. #processing rounding error
u20 = (m20 - xm * m10) / m00
u02 = (m02 - ym * m01) / m00
a=(u20+u02)/2
b=np.sqrt(4*u11**2+(u20-u02)**2)/2
l0=a+b
l1=a-b
ang=0.5*np.arctan2(2*u11,(u20-u02))/(2*np.pi)*360. #orientation value 0..1
exc=np.sqrt(1-l1/l0) #eccentricity :circle=0: http://en.wikipedia.org/wiki/Eccentricity_%28mathematics%29
print 'xb:%g yb:%g cov:%g %g %g %g ang:%g exc:%g'%((xm, ym)+tuple(cov.ravel())+(ang,exc))
#fig, ax = plt.subplots()
#ax.imshow(data,vmax=100,interpolation='nearest')
#plt.show()
ax=self.canvas.img.get_axes()
try:
for o in self.goMoment:
o.remove()
except AttributeError: pass
self.goMoment=ProcMoment.PlotMoments(ax, xbar, ybar, cov)
ax.axis('image')
def OnTomoNormalize(self,event):
if event.IsChecked():
#try to find white image
#calculate average
#show white normalize factors
white=self.data.parent['data_white']
tomoNorm=white[1,:,:]
#tomoNorm=white[:,:,:].mean(axis=0)
#np.iinfo(tomoNorm.dtype).max
#tomoNorm=float(np.iinfo(tomoNorm.dtype).max/2)/tomoNorm
tomoNorm=tomoNorm.mean()/tomoNorm
#tomoNorm=tomoNorm/float(np.iinfo(tomoNorm.dtype).max)
data=self.canvas.img.get_array()
data*=tomoNorm
#data/=tomoNorm
self.tomoNorm=tomoNorm
self.canvas.img.set_array(data)
else:
tomoNorm=self.tomoNorm
data=self.canvas.img.get_array()
data/=tomoNorm
self.canvas.img.set_array(data)
del self.tomoNorm
self.canvas.draw()
def OnSetComplexData(self, event):
if event.IsChecked():
data=np.angle(self.canvas.dataRaw)
else:
data=np.absolute(self.canvas.dataRaw)
self.canvas.img.set_array(data)
self.canvas.draw()
def OnHelp(self,event): def OnHelp(self,event):
msg='''to change the image selection: msg='''to change the image selection:
use the toolbar at the bottom to pan and zoom the image use the toolbar at the bottom to pan and zoom the image
@@ -378,22 +211,6 @@ use cursor up and down to use a different colormap'''
dlg.ShowModal() dlg.ShowModal()
dlg.Destroy() dlg.Destroy()
def OnColmapSetup(self,event):
dlg=DlgColBarSetup(self)
if dlg.ShowModal()==wx.ID_OK:
pass
dlg.Destroy()
def OnInvertAxis(self,event):
ax=self.canvas.ax
#event.Checked()
if self.mnIDxAxis==event.GetId():
ax.invert_xaxis()
else:
ax.invert_yaxis()
self.canvas.draw()
pass
if __name__ == '__main__': if __name__ == '__main__':
import os,sys,argparse #since python 2.7 import os,sys,argparse #since python 2.7
def GetParser(required=True): def GetParser(required=True):