first simulated datapoint collection... but something wrong in coord trf
This commit is contained in:
@@ -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)
|
||||
@@ -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):
|
||||
|
||||
86
swissmx.py
86
swissmx.py
@@ -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 ****************
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user