first step in heliscan transformation
This commit is contained in:
@@ -89,6 +89,242 @@ class HelicalScan:
|
|||||||
if not dryrun:
|
if not dryrun:
|
||||||
eval('self.' + cmd)
|
eval('self.' + cmd)
|
||||||
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def test_find_rot_ctr(n=3.,per=1.,bias=4.1,ampl=2.4,phi=37):
|
||||||
|
# find the rotation center, amplitude out of n (niminum 3) measurements
|
||||||
|
# n number of equidistant measurements
|
||||||
|
# per number of periods (full rotation of all measurements nut be a interger value for precise measurements)
|
||||||
|
# phi phase
|
||||||
|
# bias bias value
|
||||||
|
# ampl amplitude
|
||||||
|
|
||||||
|
t = np.arange(n)
|
||||||
|
w=2*np.pi*per/n*t
|
||||||
|
y=ampl*np.cos(w+phi*d2r)+bias
|
||||||
|
plt.figure(1)
|
||||||
|
plt.subplot(311)
|
||||||
|
plt.plot(t,y,'b.-')
|
||||||
|
|
||||||
|
plt.subplot(312)
|
||||||
|
f = np.fft.fft(y)
|
||||||
|
plt.step(t, f.real,'b.-', t, f.imag,'r.-', where='mid')
|
||||||
|
|
||||||
|
(bias,ampl,phase)=HelicalScan.meas_rot_ctr(y, per)
|
||||||
|
print('bias: '+str(bias))
|
||||||
|
print('amplitude: '+str(ampl))
|
||||||
|
print('phase: '+str(phase*360./2/np.pi))
|
||||||
|
|
||||||
|
plt.subplot(313)
|
||||||
|
t2 = np.linspace(0,2*np.pi,64)
|
||||||
|
y2=ampl*np.cos(t2+phase)+bias
|
||||||
|
plt.plot(t2,y2,'g-')
|
||||||
|
plt.stem(w,y,'b-')
|
||||||
|
|
||||||
|
|
||||||
|
plt.show()
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_coord_trf(self):
|
||||||
|
self.calcParam()
|
||||||
|
param = self.param
|
||||||
|
y, w, dx, dz = (4.3, .1, 0.2, 0.3)
|
||||||
|
print 'input : fy:%.3g dx:%.3g dz:%.3g w:%.3g' % (y, dx, dz, w / d2r)
|
||||||
|
(fy, w, cx, cz) = self.inv_transform(y, w, dx, dz)
|
||||||
|
print 'inv_trf: fy:%.3g cx:%.3g cz:%.3g w:%.3g' % (fy, cx, cz, w / d2r)
|
||||||
|
(y, w, dx, dz) = self.fwd_transform(fy, w, cx, cz)
|
||||||
|
print 'fwd_trf: fy:%.3g dx:%.3g dz:%.3g w:%.3g' % (y, dx, dz, w / d2r)
|
||||||
|
|
||||||
|
# plt.ion()
|
||||||
|
# fig = plt.figure()
|
||||||
|
|
||||||
|
# a=anim.FuncAnimation(fig,self.my_anim_func3,100,fargs=(horig,pt),interval=20,blit=False)
|
||||||
|
# plt.show()
|
||||||
|
|
||||||
|
# def my_anim_func3(self,idx):
|
||||||
|
# self.hCrist,pt=self.pltCrist(cx=0,ty=0,cz=0,w=10*idx*d2r,h=self.hCrist)
|
||||||
|
|
||||||
|
|
||||||
|
def interactive_fy_cx_cz_w(self):
|
||||||
|
fig = plt.figure()
|
||||||
|
self.manip=False#True#False
|
||||||
|
self.ax=ax=plt3d.Axes3D(fig,[0.02, 0.15, 0.96, 0.83])
|
||||||
|
ax.set_xlabel('Z');ax.set_ylabel('X');ax.set_zlabel('Y')
|
||||||
|
ax.view_init(elev=14., azim=10)
|
||||||
|
self.calcParam()
|
||||||
|
param=self.param
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
ctr=param[:,0:3].mean(0)[::-1]
|
||||||
|
self.axSetCenter(ctr,10)
|
||||||
|
|
||||||
|
axFy = plt.axes([0.1, 0.01, 0.8, 0.02])
|
||||||
|
axCx = plt.axes([0.1, 0.04, 0.8, 0.02])
|
||||||
|
axCz = plt.axes([0.1, 0.07, 0.8, 0.02])
|
||||||
|
axW = plt.axes([0.1, 0.10, 0.8, 0.02])
|
||||||
|
if self.manip:
|
||||||
|
lz=ax.get_xlim()
|
||||||
|
lx=ax.get_ylim()
|
||||||
|
ly=ax.get_zlim()
|
||||||
|
else:
|
||||||
|
lx = ly=lz=[-5,5]
|
||||||
|
self.sldFy = sFy = Slider(axFy, 'fy', ly[0], ly[1], valinit=(ly[0]+ly[1])/2.)
|
||||||
|
self.sldCx = sCx = Slider(axCx, 'cx', lx[0], lx[1], valinit=(lx[0]+lx[1])/2.)
|
||||||
|
self.sldCz = sCz = Slider(axCz, 'cz', lz[0], lz[1], valinit=(lz[0]+lz[1])/2.)
|
||||||
|
self.sldW =sW = Slider(axW, 'ang', -180., 180.0, valinit=0)
|
||||||
|
sFy.on_changed(self.update_fy_cx_cz_w)
|
||||||
|
sCx.on_changed(self.update_fy_cx_cz_w)
|
||||||
|
sCz.on_changed(self.update_fy_cx_cz_w)
|
||||||
|
sW.on_changed(self.update_fy_cx_cz_w)
|
||||||
|
|
||||||
|
hCrist,pt=self.pltCrist()
|
||||||
|
|
||||||
|
self.hCrist=hCrist;self.fig=fig
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
p=np.ndarray((param.shape[0], 3))
|
||||||
|
for i in range(2):
|
||||||
|
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
||||||
|
p[i,0]=x_i+r_i*np.sin(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
||||||
|
p[i,1]=y_i # y= y_i
|
||||||
|
p[i,2] =z_i+r_i*np.cos(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
||||||
|
print p
|
||||||
|
ofs=(p[1]+p[0])/2. # = center of the cristal
|
||||||
|
|
||||||
|
m=Trf.trans(*ofs); self.hOrig=self.pltOrig(m)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
def update_fy_cx_cz_w(self,val):
|
||||||
|
fy = self.sldFy.val
|
||||||
|
cx = self.sldCx.val
|
||||||
|
cz = self.sldCz.val
|
||||||
|
w = self.sldW.val
|
||||||
|
if self.manip:
|
||||||
|
param = self.param
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
p = np.ndarray((param.shape[0], 3))
|
||||||
|
for i in range(2):
|
||||||
|
(z_i, y_i, x_i, r_i, phi_i) = param[i]
|
||||||
|
p[i, 0] = x_i + r_i * np.cos(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
||||||
|
p[i, 1] = y_i # y= y_i
|
||||||
|
p[i, 2] = z_i + r_i * np.sin(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
||||||
|
print p
|
||||||
|
ofs = (p[1] + p[0]) / 2. # = center of the cristal
|
||||||
|
|
||||||
|
m = Trf.trans(cx,fy,cz)
|
||||||
|
m= m.dot(Trf.rotY(w*d2r))
|
||||||
|
self.hOrig = self.pltOrig(m,self.hOrig)
|
||||||
|
else:
|
||||||
|
self.hCrist,pt=self.pltCrist(fy,cx,cz,w*d2r,self.hCrist)
|
||||||
|
#l.set_ydata(amp * np.sin(2 * np.pi * freq * t))
|
||||||
|
self.fig.canvas.draw_idle()
|
||||||
|
|
||||||
|
def interactive_y_dx_dz_w(self):
|
||||||
|
fig = plt.figure()
|
||||||
|
self.ax=ax=plt3d.Axes3D(fig,[0.02, 0.15, 0.96, 0.83])
|
||||||
|
ax.set_xlabel('Z');ax.set_ylabel('X');ax.set_zlabel('Y')
|
||||||
|
ax.view_init(elev=14., azim=10)
|
||||||
|
self.calcParam()
|
||||||
|
param=self.param
|
||||||
|
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
ctr=(0,0,0)
|
||||||
|
self.axSetCenter(ctr,10)
|
||||||
|
|
||||||
|
axY = plt.axes([0.1, 0.01, 0.8, 0.02])
|
||||||
|
axDx = plt.axes([0.1, 0.04, 0.8, 0.02])
|
||||||
|
axDz = plt.axes([0.1, 0.07, 0.8, 0.02])
|
||||||
|
axW = plt.axes([0.1, 0.10, 0.8, 0.02])
|
||||||
|
|
||||||
|
lx=[-1,1];ly=[0,1];lz=[-1,1]
|
||||||
|
ly = param[:,1]
|
||||||
|
self.sldY = sY = Slider(axY, 'y', ly[0], ly[1], valinit=(ly[0]+ly[1])/2.)
|
||||||
|
self.sldDx = sDx = Slider(axDx, 'dx', lx[0], lx[1], valinit=(lx[0]+lx[1])/2.)
|
||||||
|
self.sldDz = sDz = Slider(axDz, 'dz', lz[0], lz[1], valinit=(lz[0]+lz[1])/2.)
|
||||||
|
self.sldW =sW = Slider(axW, 'ang', -180., 180.0, valinit=0)
|
||||||
|
sY.on_changed(self.update_y_dx_dz_w)
|
||||||
|
sDx.on_changed(self.update_y_dx_dz_w)
|
||||||
|
sDz.on_changed(self.update_y_dx_dz_w)
|
||||||
|
sW.on_changed(self.update_y_dx_dz_w)
|
||||||
|
|
||||||
|
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
p=np.ndarray((param.shape[0], 3))
|
||||||
|
for i in range(2):
|
||||||
|
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
||||||
|
p[i,0]=x_i+r_i*np.sin(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
||||||
|
p[i,1]=y_i # y= y_i
|
||||||
|
p[i,2]=z_i+r_i*np.cos(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
||||||
|
ofs=(p[1]+p[0])/2. # = center of the cristal
|
||||||
|
print 'p, ofs',p,ofs
|
||||||
|
|
||||||
|
m=Trf.trans(0,0,0); self.hOrig=self.pltOrig(m)
|
||||||
|
hCrist,pt=self.pltCrist(cx=-ofs[0],fy=-ofs[1],cz=-ofs[2])
|
||||||
|
|
||||||
|
self.hCrist=hCrist;self.fig=fig
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
def update_y_dx_dz_w(self,val):
|
||||||
|
y = self.sldY.val
|
||||||
|
dx = self.sldDx.val
|
||||||
|
dz = self.sldDz.val
|
||||||
|
w = self.sldW.val
|
||||||
|
w=w*d2r
|
||||||
|
(fy, w, cx, cz)=self.inv_transform(y,w,dx,dz)
|
||||||
|
|
||||||
|
self.hCrist,pt=self.pltCrist(-fy,-cx,-cz,w,self.hCrist)
|
||||||
|
self.fig.canvas.draw_idle()
|
||||||
|
|
||||||
|
def fwd_transform(self,fy,w,cx,cz):
|
||||||
|
#cx,cy: coarse stage
|
||||||
|
#input: fy,w,cx,cz
|
||||||
|
#output: y,w,dx,dz
|
||||||
|
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
||||||
|
|
||||||
|
param=self.param
|
||||||
|
p=np.ndarray((param.shape[0], 3))
|
||||||
|
for i in range(2):
|
||||||
|
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
||||||
|
p[i,0]=x_i+r_i*np.sin(phi_i+w) # x= x_i+r_i*cos(phi_i+w)+cx
|
||||||
|
p[i,1]=y_i # y= y_i
|
||||||
|
p[i,2]=z_i+r_i*np.cos(phi_i+w) # z= z_i+r_i*sin(phi_i*w)
|
||||||
|
v=p[1]-p[0]
|
||||||
|
#for y = 0..1:
|
||||||
|
#v=v*y
|
||||||
|
#for y = y_0..y_1:
|
||||||
|
y_0=param[0,1];y_1=param[1,1];v=v*(fy-y_0)/(y_1-y_0)
|
||||||
|
|
||||||
|
v=v+p[0]
|
||||||
|
dx=cx-v[0]
|
||||||
|
dz=cz-v[2]
|
||||||
|
y=v[1]
|
||||||
|
res=(y,w,dx,dz)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def inv_transform(self,y,w,dx=0,dz=0):
|
||||||
|
#input: y,w,dx,dz
|
||||||
|
#output: y,w,cx,cz
|
||||||
|
#dx,dy: deviation from cristal center line
|
||||||
|
param=self.param
|
||||||
|
p=np.ndarray((param.shape[0], 3))
|
||||||
|
for i in range(2):
|
||||||
|
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
||||||
|
p[i,0]=x_i+r_i*np.sin(phi_i+w) # x= x_i+r_i*cos(phi_i+w)+cx
|
||||||
|
p[i,1]=y_i # y= y_i
|
||||||
|
p[i,2]=z_i+r_i*np.cos(phi_i+w) # z= z_i+r_i*sin(phi_i*w)
|
||||||
|
v=p[1]-p[0]
|
||||||
|
#for y = 0..1:
|
||||||
|
#v=v*y
|
||||||
|
#for y = y_0..y_1:
|
||||||
|
y_0=param[0,1];y_1=param[1,1];v=v*(y-y_0)/(y_1-y_0)
|
||||||
|
|
||||||
|
v=v+p[0]
|
||||||
|
cx=dx+v[0]
|
||||||
|
cz=dz+v[2]
|
||||||
|
fy=v[1]
|
||||||
|
res=(fy,w,cx,cz)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
def calcParam(self):
|
def calcParam(self):
|
||||||
n = 3.;
|
n = 3.;
|
||||||
per = 1.;
|
per = 1.;
|
||||||
@@ -178,271 +414,6 @@ class HelicalScan:
|
|||||||
#h+=(hs,hp[0])
|
#h+=(hs,hp[0])
|
||||||
return (h,pt)
|
return (h,pt)
|
||||||
|
|
||||||
|
|
||||||
def interactive_fy_cx_cz_w(self):
|
|
||||||
fig = plt.figure()
|
|
||||||
self.manip=False#True#False
|
|
||||||
self.ax=ax=plt3d.Axes3D(fig,[0.02, 0.15, 0.96, 0.83])
|
|
||||||
ax.set_xlabel('Z');ax.set_ylabel('X');ax.set_zlabel('Y')
|
|
||||||
ax.view_init(elev=14., azim=10)
|
|
||||||
self.calcParam()
|
|
||||||
param=self.param
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
ctr=param[:,0:3].mean(0)[::-1]
|
|
||||||
self.axSetCenter(ctr,10)
|
|
||||||
|
|
||||||
axFy = plt.axes([0.1, 0.01, 0.8, 0.02])
|
|
||||||
axCx = plt.axes([0.1, 0.04, 0.8, 0.02])
|
|
||||||
axCz = plt.axes([0.1, 0.07, 0.8, 0.02])
|
|
||||||
axW = plt.axes([0.1, 0.10, 0.8, 0.02])
|
|
||||||
if self.manip:
|
|
||||||
lz=ax.get_xlim()
|
|
||||||
lx=ax.get_ylim()
|
|
||||||
ly=ax.get_zlim()
|
|
||||||
else:
|
|
||||||
lx = ly=lz=[-5,5]
|
|
||||||
self.sldFy = sFy = Slider(axFy, 'fy', ly[0], ly[1], valinit=(ly[0]+ly[1])/2.)
|
|
||||||
self.sldCx = sCx = Slider(axCx, 'cx', lx[0], lx[1], valinit=(lx[0]+lx[1])/2.)
|
|
||||||
self.sldCz = sCz = Slider(axCz, 'cz', lz[0], lz[1], valinit=(lz[0]+lz[1])/2.)
|
|
||||||
self.sldW =sW = Slider(axW, 'ang', -180., 180.0, valinit=0)
|
|
||||||
sFy.on_changed(self.update_fy_cx_cz_w)
|
|
||||||
sCx.on_changed(self.update_fy_cx_cz_w)
|
|
||||||
sCz.on_changed(self.update_fy_cx_cz_w)
|
|
||||||
sW.on_changed(self.update_fy_cx_cz_w)
|
|
||||||
|
|
||||||
hCrist,pt=self.pltCrist()
|
|
||||||
|
|
||||||
self.hCrist=hCrist;self.fig=fig
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
p=np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
|
||||||
p[i,0]=x_i+r_i*np.cos(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i,1]=y_i # y= y_i
|
|
||||||
p[i,2] =z_i+r_i*np.sin(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
ofs=(p[1]+p[0])/2. # = center of the cristal
|
|
||||||
|
|
||||||
m=Trf.trans(*ofs); self.hOrig=self.pltOrig(m)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
def update_fy_cx_cz_w(self,val):
|
|
||||||
fy = self.sldFy.val
|
|
||||||
cx = self.sldCx.val
|
|
||||||
cz = self.sldCz.val
|
|
||||||
w = self.sldW.val
|
|
||||||
if self.manip:
|
|
||||||
param = self.param
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
p = np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i) = param[i]
|
|
||||||
p[i, 0] = x_i + r_i * np.cos(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i, 1] = y_i # y= y_i
|
|
||||||
p[i, 2] = z_i + r_i * np.sin(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
ofs = (p[1] + p[0]) / 2. # = center of the cristal
|
|
||||||
|
|
||||||
m = Trf.trans(cx,fy,cz)
|
|
||||||
m= m.dot(Trf.rotY(w*d2r))
|
|
||||||
self.hOrig = self.pltOrig(m,self.hOrig)
|
|
||||||
else:
|
|
||||||
self.hCrist,pt=self.pltCrist(fy,cx,cz,w*d2r,self.hCrist)
|
|
||||||
#l.set_ydata(amp * np.sin(2 * np.pi * freq * t))
|
|
||||||
self.fig.canvas.draw_idle()
|
|
||||||
|
|
||||||
def interactive_y_dx_dz_w(self):
|
|
||||||
fig = plt.figure()
|
|
||||||
self.manip=False#True#False
|
|
||||||
self.ax=ax=plt3d.Axes3D(fig,[0.02, 0.15, 0.96, 0.83])
|
|
||||||
ax.set_xlabel('Z');ax.set_ylabel('X');ax.set_zlabel('Y')
|
|
||||||
ax.view_init(elev=14., azim=10)
|
|
||||||
self.calcParam()
|
|
||||||
param=self.param
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
ctr=param[:,0:3].mean(0)[::-1]
|
|
||||||
self.axSetCenter(ctr,10)
|
|
||||||
|
|
||||||
axFy = plt.axes([0.1, 0.01, 0.8, 0.02])
|
|
||||||
axCx = plt.axes([0.1, 0.04, 0.8, 0.02])
|
|
||||||
axCz = plt.axes([0.1, 0.07, 0.8, 0.02])
|
|
||||||
axW = plt.axes([0.1, 0.10, 0.8, 0.02])
|
|
||||||
if self.manip:
|
|
||||||
lz=ax.get_xlim()
|
|
||||||
lx=ax.get_ylim()
|
|
||||||
ly=ax.get_zlim()
|
|
||||||
else:
|
|
||||||
lx=[-1,1];ly=[0,1];lz=[-1,1]
|
|
||||||
self.sldFy = sFy = Slider(axFy, 'y', ly[0], ly[1], valinit=(ly[0]+ly[1])/2.)
|
|
||||||
self.sldCx = sCx = Slider(axCx, 'dx', lx[0], lx[1], valinit=(lx[0]+lx[1])/2.)
|
|
||||||
self.sldCz = sCz = Slider(axCz, 'dz', lz[0], lz[1], valinit=(lz[0]+lz[1])/2.)
|
|
||||||
self.sldW =sW = Slider(axW, 'ang', -180., 180.0, valinit=0)
|
|
||||||
sFy.on_changed(self.update_y_dx_dz_w)
|
|
||||||
sCx.on_changed(self.update_y_dx_dz_w)
|
|
||||||
sCz.on_changed(self.update_y_dx_dz_w)
|
|
||||||
sW.on_changed(self.update_y_dx_dz_w)
|
|
||||||
|
|
||||||
hCrist,pt=self.pltCrist()
|
|
||||||
|
|
||||||
self.hCrist=hCrist;self.fig=fig
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
p=np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
|
||||||
p[i,0]=x_i+r_i*np.cos(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i,1]=y_i # y= y_i
|
|
||||||
p[i,2] =z_i+r_i*np.sin(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
ofs=(p[1]+p[0])/2. # = center of the cristal
|
|
||||||
|
|
||||||
m=Trf.trans(*ofs); self.hOrig=self.pltOrig(m)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
def update_y_dx_dz_w(self,val):
|
|
||||||
fy = self.sldFy.val
|
|
||||||
cx = self.sldCx.val
|
|
||||||
cz = self.sldCz.val
|
|
||||||
w = self.sldW.val
|
|
||||||
if self.manip:
|
|
||||||
param = self.param
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
p = np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i) = param[i]
|
|
||||||
p[i, 0] = x_i + r_i * np.cos(phi_i) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i, 1] = y_i # y= y_i
|
|
||||||
p[i, 2] = z_i + r_i * np.sin(phi_i) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
ofs = (p[1] + p[0]) / 2. # = center of the cristal
|
|
||||||
|
|
||||||
m = Trf.trans(cx,fy,cz)
|
|
||||||
m= m.dot(Trf.rotY(w*d2r))
|
|
||||||
self.hOrig = self.pltOrig(m,self.hOrig)
|
|
||||||
else:
|
|
||||||
self.hCrist,pt=self.pltCrist(fy,cx,cz,w*d2r,self.hCrist)
|
|
||||||
#l.set_ydata(amp * np.sin(2 * np.pi * freq * t))
|
|
||||||
self.fig.canvas.draw_idle()
|
|
||||||
|
|
||||||
|
|
||||||
def test_coord_trf(self):
|
|
||||||
plt.ion()
|
|
||||||
fig = plt.figure()
|
|
||||||
#self.ax=ax=fig.add_subplot(1,1,1,projection='3d')
|
|
||||||
self.ax=ax=plt3d.Axes3D(fig,[0.02, 0.02, 0.96, 0.96])
|
|
||||||
#fig.Axes3DSubplot()
|
|
||||||
ax.set_xlabel('Z');ax.set_ylabel('X');ax.set_zlabel('Y')
|
|
||||||
ax.view_init(elev=14., azim=10)
|
|
||||||
self.axSetCenter((0,5,15),10)
|
|
||||||
self.calcParam()
|
|
||||||
param=self.param
|
|
||||||
|
|
||||||
hCrist,pt=self.pltCrist()
|
|
||||||
z = 14.5 # fix z position
|
|
||||||
#self.hCrist=hCrist
|
|
||||||
#a=anim.FuncAnimation(fig,self.my_anim_func3,100,fargs=(),interval=20,blit=False)
|
|
||||||
#plt.show()
|
|
||||||
|
|
||||||
#plt.show()
|
|
||||||
#m=np.identity(4); horig=extAx.pltOrig(m)
|
|
||||||
m=Trf.trans(0,0,z); self.hOrig=self.pltOrig(m)
|
|
||||||
|
|
||||||
#self.fwd_transform(y ,w ,cx ,cz)
|
|
||||||
# y_0 ,0deg ,x_0 ,z_0)
|
|
||||||
m=self.fwd_transform(param[0][1],0,pt[2,0],pt[2,2])
|
|
||||||
m=self.fwd_transform(param[0][1],20*d2r,pt[2,0],pt[2,2])
|
|
||||||
#m=self.fwd_transform(param[0][1],0,pt[2][0],pt[2][2])
|
|
||||||
pass
|
|
||||||
#m=self.fwd_transform(param[0][1],20*d2r,pt[2][0],pt[2][2])
|
|
||||||
#self.pltOrig(m)
|
|
||||||
|
|
||||||
#a=anim.FuncAnimation(fig,self.my_anim_func3,100,fargs=(horig,pt),interval=20,blit=False)
|
|
||||||
#plt.show()
|
|
||||||
# y_0 ,120deg ,x_0 ,z_0)
|
|
||||||
self.fwd_transform(param[0][1],2*np.pi/3.,param[0][2],param[0][0])
|
|
||||||
#self.fwd_transform(param[1][1],0.,param[1][2],param[1][3])
|
|
||||||
|
|
||||||
def my_anim_func3(self,idx):
|
|
||||||
self.hCrist,pt=self.pltCrist(cx=0,ty=0,cz=0,w=10*idx*d2r,h=self.hCrist)
|
|
||||||
|
|
||||||
def my_anim_func2(self,idx, horig,pt):
|
|
||||||
#print('my_anim_func2%d'%idx)
|
|
||||||
pIdx, aIdx= divmod(idx, 25)
|
|
||||||
a = aIdx/25. * 2. * np.pi
|
|
||||||
#print(aIdx,a)
|
|
||||||
m = Trf.trans(*pt[pIdx])
|
|
||||||
m = m=m.dot(Trf.rotY(a))
|
|
||||||
self.pltOrig(m, horig)
|
|
||||||
|
|
||||||
def my_anim_func(self,idx, horig):
|
|
||||||
print('my_anim_func%d'%idx)
|
|
||||||
a = idx * .01 * 2 * np.pi
|
|
||||||
m = Trf.rotY(a)
|
|
||||||
self.pltOrig(m, horig)
|
|
||||||
|
|
||||||
def fwd_transform(self,y,w,cx,cz):
|
|
||||||
#cx,cy: coarse stage
|
|
||||||
#input: y,w,cx,cz
|
|
||||||
#output: y,w,dx,dz
|
|
||||||
# param[i]=(z_i, y_i, x_i, r_i,phi_i)
|
|
||||||
|
|
||||||
param=self.param
|
|
||||||
p=np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
|
||||||
p[i,0]=x_i+r_i*np.cos(phi_i+w) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i,1]=y_i # y= y_i
|
|
||||||
p[i,2] =z_i+r_i*np.sin(phi_i+w) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
v=p[1]-p[0]
|
|
||||||
v=v/np.sqrt(v.dot(v)) # v/|v|
|
|
||||||
y_0=param[0][1]
|
|
||||||
y_1=param[1][1]
|
|
||||||
v=v*(y-y_0)/(y_1-y_0) # v(y)=v*(v-y_0)/(y_1-y_0)
|
|
||||||
v=p[0]+v
|
|
||||||
dx=cx-v[0]
|
|
||||||
dz=cz-v[2]
|
|
||||||
res=(y,w,dx,dz)
|
|
||||||
print res
|
|
||||||
|
|
||||||
m=Trf.trans(cx,y,cz)
|
|
||||||
m=m.dot(Trf.rotY(w))
|
|
||||||
self.pltOrig(m,self.hOrig)
|
|
||||||
self.axSetCenter(m[0:3,3],10)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def inv_transform(self,y,w,dx=0,dz=0):
|
|
||||||
#input: y,w,dx,dz
|
|
||||||
#output: y,w,cx,cz
|
|
||||||
#dx,dy: deviation from cristal center line
|
|
||||||
param=self.param
|
|
||||||
p=np.ndarray((param.shape[0], 3))
|
|
||||||
for i in range(2):
|
|
||||||
(z_i, y_i, x_i, r_i, phi_i)=param[i]
|
|
||||||
p[i,0]=x_i+r_i*np.cos(phi_i+w) # x= x_i+r_i*cos(phi_i+w)+cx
|
|
||||||
p[i,1]=y_i # y= y_i
|
|
||||||
p[i,2] =z_i+r_i*np.sin(phi_i+w) # z= z_i+r_i*sin(phi_i*w)
|
|
||||||
print p
|
|
||||||
v=p[1]-p[0]
|
|
||||||
v=v/np.sqrt(v.dot(v)) # v/|v|
|
|
||||||
y_0=param[0][1]
|
|
||||||
y_1=param[1][1]
|
|
||||||
v=v*(y-y_0)/(y_1-y_0) # v(y)=v*(v-y_0)/(y_1-y_0)
|
|
||||||
v=p[0]+v
|
|
||||||
dx=cx-v[0]
|
|
||||||
dz=cz-v[2]
|
|
||||||
res=(y,w,dx,dz)
|
|
||||||
print res
|
|
||||||
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def meas_rot_ctr(y,per=1):
|
def meas_rot_ctr(y,per=1):
|
||||||
# find the amplitude bias and phase of an equidistant sampled sinus
|
# find the amplitude bias and phase of an equidistant sampled sinus
|
||||||
@@ -456,40 +427,6 @@ class HelicalScan:
|
|||||||
ampl=np.absolute(f[idx])*2/n
|
ampl=np.absolute(f[idx])*2/n
|
||||||
return (bias,ampl,phase)
|
return (bias,ampl,phase)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def test_find_rot_ctr(n=3.,per=1.,bias=4.1,ampl=2.4,phi=37):
|
|
||||||
# find the rotation center, amplitude out of n (niminum 3) measurements
|
|
||||||
# n number of equidistant measurements
|
|
||||||
# per number of periods (full rotation of all measurements nut be a interger value for precise measurements)
|
|
||||||
# phi phase
|
|
||||||
# bias bias value
|
|
||||||
# ampl amplitude
|
|
||||||
|
|
||||||
t = np.arange(n)
|
|
||||||
w=2*np.pi*per/n*t
|
|
||||||
y=ampl*np.cos(w+phi*d2r)+bias
|
|
||||||
plt.figure(1)
|
|
||||||
plt.subplot(311)
|
|
||||||
plt.plot(t,y,'b.-')
|
|
||||||
|
|
||||||
plt.subplot(312)
|
|
||||||
f = np.fft.fft(y)
|
|
||||||
plt.step(t, f.real,'b.-', t, f.imag,'r.-', where='mid')
|
|
||||||
|
|
||||||
(bias,ampl,phase)=HelicalScan.meas_rot_ctr(y, per)
|
|
||||||
print('bias: '+str(bias))
|
|
||||||
print('amplitude: '+str(ampl))
|
|
||||||
print('phase: '+str(phase*360./2/np.pi))
|
|
||||||
|
|
||||||
plt.subplot(313)
|
|
||||||
t2 = np.linspace(0,2*np.pi,64)
|
|
||||||
y2=ampl*np.cos(t2+phase)+bias
|
|
||||||
plt.plot(t2,y2,'g-')
|
|
||||||
plt.stem(w,y,'b-')
|
|
||||||
|
|
||||||
|
|
||||||
plt.show()
|
|
||||||
pass
|
|
||||||
|
|
||||||
def axSetCenter(self,v,l):
|
def axSetCenter(self,v,l):
|
||||||
ax=self.ax
|
ax=self.ax
|
||||||
@@ -542,9 +479,13 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n '
|
|||||||
|
|
||||||
hs=HelicalScan(args)
|
hs=HelicalScan(args)
|
||||||
#hs.sequencer()
|
#hs.sequencer()
|
||||||
|
hs.test_find_rot_ctr()
|
||||||
|
hs.test_find_rot_ctr(n=5. ,per=1.,bias=2.31,ampl=4.12,phi=24.6)
|
||||||
|
hs.test_coord_trf()
|
||||||
hs.interactive_fy_cx_cz_w()
|
hs.interactive_fy_cx_cz_w()
|
||||||
hs.interactive_y_dx_dz_w()
|
hs.interactive_y_dx_dz_w()
|
||||||
#hs.test_coord_trf()
|
|
||||||
|
|
||||||
#------------------ Main Code ----------------------------------
|
#------------------ Main Code ----------------------------------
|
||||||
#ssh_test()
|
#ssh_test()
|
||||||
ret=parse_args()
|
ret=parse_args()
|
||||||
|
|||||||
Reference in New Issue
Block a user