first simulated datapoint collection... but something wrong in coord trf

This commit is contained in:
2022-08-30 18:08:53 +02:00
parent 7deda365c1
commit e651fddd56
3 changed files with 129 additions and 33 deletions

View File

@@ -36,8 +36,10 @@ class Deltatau:
try:
self._comm=comm=PPComm(**param)
self._gather=gather=Gather(comm)
except AttributeError as e:
_log.critical('can not connect to deltatau')
return
except BaseException as e:
_log.critical(f'can not connect to deltatau:{e}')
self._comm=comm=None
self._gather=gather=None
#return
verbose=0x00
self._shapepath=sp=shapepath.ShapePath(comm, gather, verbose, sync_mode=1, sync_flag=3)

View File

@@ -190,26 +190,6 @@ class Grid(pg.ROI):
self.addScaleHandle([0, 0], [1, 1])
self.addScaleRotateHandle([1, 0], [0, 0])
def get_points(self,mode=0x2):
'generates points of the roi for scanning with deltatau'
#pos=np.array(self.pos())
cnt=np.array(self._cnt,np.int32)
sz=np.array(self.size())
pitch=sz/cnt
xx, yy=np.meshgrid(range(cnt[0]), range(cnt[1]))
if mode&0x01: #modify x scaning forward backward each line
for i in range(1,cnt[1],2):
xx[i]=xx[i][::-1]
if mode&0x02: # modify y scaning forward backward each line
xx=xx.T
yy=yy.T
for i in range(1, cnt[0], 2):
yy[i]=yy[i][::-1]
pts=np.array([xx.reshape(-1), yy.reshape(-1)], dtype=np.float).transpose()*pitch
#pts+=pos
return pts
def paint(self, p, *args):
#pg.ROI.paint(self, p, *args)
sz=self.state['size']
@@ -255,6 +235,26 @@ class Grid(pg.ROI):
}
return jsn
def get_scan_param(self,mode=0x2):
'returns scan parameters for scanning with deltatau. the format is as used for shapepath'
#pos=np.array(self.pos())
cnt=np.array(self._cnt,np.int32)
sz=np.array(self.size())
pitch=sz/cnt
xx, yy=np.meshgrid(range(cnt[0]), range(cnt[1]))
if mode&0x01: #modify x scaning forward backward each line
for i in range(1,cnt[1],2):
xx[i]=xx[i][::-1]
if mode&0x02: # modify y scaning forward backward each line
xx=xx.T
yy=yy.T
for i in range(1, cnt[0], 2):
yy[i]=yy[i][::-1]
pts=np.array([xx.reshape(-1), yy.reshape(-1)], dtype=np.float).transpose()*pitch
#pts+=pos
return pts
class Path(pg.ROI):
'''
@@ -461,11 +461,37 @@ class FixTargetFrame(pg.ROI):
}
trf=self.transform()
if not trf.isIdentity():
obj_info(trf)
#obj_info(trf)
trf=((trf.m11(),trf.m12()),(trf.m21(),trf.m22()))
jsn['trf']=trf
return jsn
def get_scan_param(self,mode=0x2):
'returns scan parameters for scanning with deltatau. the format is as used for shapepath'
grid=self._dscr['grid']
#pos=np.array(self.pos())
cnt =np.array(grid['count'],np.int32)
#pos =np.array(grid['pos'],np.float)
#pitch=np.array(grid['pitch'],np.float)
xx, yy=np.meshgrid(range(cnt[0]), range(cnt[1]))
if mode&0x01: #modify x scaning forward backward each line
for i in range(1,cnt[1],2):
xx[i]=xx[i][::-1]
if mode&0x02: # modify y scaning forward backward each line
xx=xx.T
yy=yy.T
for i in range(1, cnt[0], 2):
yy[i]=yy[i][::-1]
pts=np.array([xx.reshape(-1), yy.reshape(-1)], dtype=np.float).transpose() #*pitch
param={'grid':grid, 'points':pts}
trf=self.transform()
if not trf.isIdentity():
#obj_info(trf)
trf=np.array(((trf.m11(),trf.m12()),(trf.m21(),trf.m22())))
param['trf']=trf
return param
class TxtROI(pg.ROI):
def __init__(self, pos, size, **kargs):

View File

@@ -1255,20 +1255,38 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
fy=fast_y.get_val()
opt_ctr=geo._opt_ctr
for go in self._goTracked['objLst']:
points=go.get_points() #points in coordinate system of ROI
if type(go)!=UsrGO.FixTargetFrame:
_log.warning(f'for now: ONLY FixTargetFrame are supported ->skipped:{go}')
continue
try:
param=go.get_scan_param() #points in coordinate system of ROI
except AttributeError as e:
_log.warning(f'no scan parameters for object->skipped:{go}')
continue
# names consists of abrevations
# part 0: po=position sz=size dt=delta
# part 0: po=position dt=delta
# part 1: px=pixel eu=engineering units (e.g. mm)
po_px=go.pos()
sz_px=go.size()
tr=go.transform() # TODO: this is not yet used
UsrGO.obj_info(tr)
dt_px=-opt_ctr-po_px
dt_eu=geo.pix2pos(dt_px)+(fx,fy)
for i in range(points.shape[0]):
points[i,:]=dt_eu+geo.pix2pos(points[i,:])#*tr
po_eu=geo.pix2pos(dt_px)+(fx,fy) # position of the 0/0 poit of the ROI in engineering units
self.daq_collect_points(points, visualizer_method="grid", visualizer_params=None)
p=param['points']
pos=np.array(param['grid']['pos']) #in um
pitch=np.array(param['grid']['pitch']) #in um
trf=param['trf'] #fix shear/rotation um->um
trf=np.asmatrix(np.diag(pitch))*np.asmatrix(trf)*geo._pix2pos
po_eu*=1000 #mm to um
trf*=1000 #mm to um
#pix2pos: return np.asarray(self._pix2pos*np.mat(p).T).ravel()
for i in range(p.shape[0]):
p[i,:]=po_eu+(trf*np.asmatrix(p[i,:]).T).A.ravel()
print('DEBUG: first point:')
print(p[0,:])
print('DEBUG: difference from point to point:')
print(np.diff(p, axis=0))
self.daq_collect(**param)
elif task == TASK_GRID:
self.re_connect_collect_button(
@@ -1734,6 +1752,56 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
if n>=3:
geo.least_square_plane(ptFitPlane)
def daq_collect(self, **kwargs):# points, visualizer_method, visualizer_params):
#def _OLD_daq_collect_points(self, points, visualizer_method, visualizer_params):
app = QApplication.instance()
cfg = app._cfg
geo = app._geometry
verbose=0xff
fn='/tmp/shapepath'
try:
dt=app._deltatau
except AttributeError:
app._deltatau=dt=deltatau.Deltatau()
try:
jf=app._jungfrau
except AttributeError:
app._jungfrau=jf=detector.Jungfrau()
sp=dt._shapepath
sp.points=kwargs['points']
#sp.gen_grid_points(w=15, h=15, pitch=3, rnd=0, ofs=(0, +2000))
#sp.gen_grid_points(w=5, h=10, pitch=1, rnd=0, ofs=(0, 0));sp.sort_points(False, 10);sp.points
#sp.sort_points(False, 15);
sp.meta['pt2pt_time']=10
sp.setup_gather()
sp.setup_sync(verbose=verbose&32, timeOfs=0.05)
try:
p=geo._fitPlane
sp.setup_coord_trf(cz=f'{p[0]}X+{p[1]}Y+{p[2]}') # reset to shape path system
except AttributeError:
_log.warning('no plane fitting done. z does not move')
sp.setup_coord_trf() # reset to shape path system
# sp.meta['pt2pt_time']=10 #put between setup_sync and setup_motion to have more motion points than FEL syncs
sp.setup_motion(fnPrg=fn+'.prg', mode=3, scale=1., dwell=10)
sp.homing() # homing if needed
sp.run() # start motion program
sp.wait_armed() # wait until motors are at first position
sp.trigger(0.5) # send a start trigger (if needed) ater given time
if not dt._comm is None:
while True:
p=sp.progress()
if p<0: break
_log.info(f'progress {p}/{sp.points.shape[0]}')
time.sleep(.1)
sp.gather_upload(fnRec=fn+'.npz')
#dp=deltatau.shapepath.DebugPlot(sp)
#dp.plot_gather(mode=11)
#plt.show(block=False)
#plt.show(block=True)
return
# **************** OBSOLETE AND/OR OLD STUFF ****************