diff --git a/deltatau.py b/deltatau.py index 6c97ee9..1420e0f 100644 --- a/deltatau.py +++ b/deltatau.py @@ -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) \ No newline at end of file diff --git a/pyqtUsrObj.py b/pyqtUsrObj.py index a51ad9c..df492f3 100644 --- a/pyqtUsrObj.py +++ b/pyqtUsrObj.py @@ -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): diff --git a/swissmx.py b/swissmx.py index 2cd6473..04dd09c 100755 --- a/swissmx.py +++ b/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 ****************