diff --git a/Readme.md b/Readme.md index 5c34cf9..a064108 100644 --- a/Readme.md +++ b/Readme.md @@ -124,7 +124,8 @@ pw: ValToira_2021 ``` zamofing_t@ganymede:~$ ssh gac-cristall@saresc-cons-03 cd /sf/cristallina/applications/mx/zamofing_t/ESB_MX/python/SwissMX/ -conda activate /sf/cristallina/applications/conda/envs/crmx38 +# conda env list +conda activate crmx38 python swissmx.py diff --git a/pyqtUsrObj.py b/pyqtUsrObj.py index 2011e41..47b5ed2 100644 --- a/pyqtUsrObj.py +++ b/pyqtUsrObj.py @@ -301,19 +301,32 @@ class Path(UsrROI): a circle is plot at the path positions a cross is plot at the fiducial positions ''' - def __init__( self, pos=(0,0), path=np.array(((6,4),(16,24),(-5,7),(3,12))), fiducial=None, ficucialScale=5, **kargs): + def __init__( self, pos=(0,0), path=np.array(((6,4),(16,24),(-5,7),(3,12))), fiducial=None, ficucialScale=5, **kwargs): + trf=kwargs.pop('trf',None) + if type(path)==list: + path=np.array(path) if fiducial is None: all=path else: + if type(fiducial)==list: + fiducial=np.array(fiducial) all=np.vstack((fiducial,path)) mn=all.min(0) mx=all.max(0) - sz=mx-mn - pg.ROI.__init__(self, pos, sz, **kargs) + size=self.szOrig=mx-mn + + pg.ROI.__init__(self, pos, size, **kwargs) + if trf is not None: + t=self.transform() + t.setMatrix(trf[0][0], trf[0][1], 0, + trf[1][0], trf[1][1], 0, + 0, 0, 1) + self.setTransform(t) + self._fiducial=fiducial self._path=path self._fidScl=ficucialScale - self._rect=r=QtCore.QRectF(mn[0], mn[1], sz[0], sz[1]) + self._rect=r=QtCore.QRectF(mn[0]-5*ficucialScale, mn[1]-5*ficucialScale, size[0]+10*ficucialScale, size[1]+10*ficucialScale) self._qpath=qPth=QPolygonF() for pt in path: qPth.append(QPointF(*pt)) @@ -331,8 +344,8 @@ class Path(UsrROI): p.setRenderHint(QtGui.QPainter.Antialiasing) p.setPen(self.currentPen) #p.drawEllipse(0, 0, int(sz[0]), int(sz[1])) - p.drawRect(0, 0, int(sz[0]), int(sz[1])) - + #p.drawRect(0, 0, int(sz[0]), int(sz[1])) + p.drawRect(QtCore.QRectF(0, 0, sz[0], sz[1]).normalized()) #obj_info(p) p.scale(sz[0]/r.width(), sz[1]/r.height()) p.translate(-r.left(), -r.top()) @@ -362,10 +375,18 @@ class Path(UsrROI): jsn= { '__class__':self.__class__.__name__, 'pos':tuple(self.pos()), - 'fiducial': repr(self._fiducial), - 'path': repr(self._path), + 'fiducial': self._fiducial.tolist(), + 'path': self._path.tolist(), 'ficucialScale':self._fidScl } + so=pg.Point(self.szOrig) + sn=self.size() + trf=self.transform() + if not trf.isIdentity() or so!=sn: + scl=sn/so + #obj_info(trf) + trf=((trf.m11()*scl[0],trf.m12()*scl[0]),(trf.m21()*scl[1],trf.m22()*scl[1])) + jsn['trf']=trf return jsn class FixTargetFrame(UsrROI): @@ -532,7 +553,7 @@ class FixTargetFrame(UsrROI): pts=np.array([xx.reshape(-1), yy.reshape(-1)], dtype=np.float).transpose() #*pitch - param={'grid':grid, 'points':pts} + param={'grid':grid, 'points':pts, 'mode':mode} t=self.transform() p=np.array(self.pos()) s=self.size()/self._dscr['size'] diff --git a/swissmx.py b/swissmx.py index 616bcd0..ed7e7db 100755 --- a/swissmx.py +++ b/swissmx.py @@ -1443,7 +1443,9 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): p=(np.asmatrix(m)*trf).A p[:,0]*=-1 #X axis has inverted sign ! - param['points']=p + param['ptsTrf']=p # transformed points + param['numPts']=p.shape[0] + #param['points']=p # add up to 100 test fiducial vb=self.vb @@ -1473,6 +1475,9 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): #_log.debug(f'step to 2nd point:{p[1,:]-p[0,:]}') #print('DEBUG: difference from point to point:') #print(np.diff(p, axis=0)) + #param['codeGen']=0 + param['codeGen']=1 + param['codeGen']=2 self.daq_collect(**param) elif task == TASK_GRID: @@ -1891,7 +1896,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) mft.setAccessibleName(TASK_FIX_TARGET) self._tabs_daq_methods.setCurrentWidget(mft) #set this as the active tabs - mft._cbType.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()"]) + mft._cbType.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()", "SwissMX()", "SwissFEL()"]) mft._btnAdd.clicked.connect(self.module_fix_target_add_obj) mft._btnDelAll.clicked.connect(self.module_fix_target_del_all_obj) mft._btnFit.clicked.connect(self.module_fix_target_fit_fiducial) @@ -2005,8 +2010,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) idx=mft._cbType.currentIndex() param=mft._txtParam.text() - #cb.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()"]) - + #mft._cbType.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()", "SwissMX-path"]) #bm_pos_eu=self._goBeamMarker._pos_eu #bm_size_eu=self._goBeamMarker._size_eu @@ -2032,6 +2036,27 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) elif idx==4: w,h=(30, 22) go=UsrGO.Grid((fx-w/2,fy-h/2), (w, h), (30, 22), .1) + elif idx==5: + ofs=(0, 0); + width=10; + fidScl=.02 + fiducial=((-.2, -.2), (-.2, 2.4), (10.2, -.2), (10.2, 2.4)) + if param: + p=json.loads('{'+param+'}') # "ofs":[10, 5],"width":200,"fidScl":0.5,"fiducial":[[18,7],[25,16],[70, 20]] + locals().update(p) + fiducial=np.array(fiducial) + gp=psi_device.shapepath.GenPath(); + gp.swissmx_points(ofs=ofs, width=width, flipy=True) + go=UsrGO.Path((fx-width/2, fy-1.2), gp.points, fiducial, fidScl) + elif idx==6: + ofs=(0, 0); width=10; fidScl=.02 + fiducial=((-.2, -.2), (-.2, 2.0), (10.2, -.2), (10.2, 2.0)) + if param: + p=json.loads('{'+param+'}') # "ofs":[10, 5],"width":200,"fidScl":0.5,"fiducial":[[18,7],[25,16],[70, 20]] + locals().update(p) + fiducial=np.array(fiducial) + gp=psi_device.shapepath.GenPath();gp.swissfel_points(ofs=ofs, width=width,flipy=True) + go=UsrGO.Path((fx-width/2,fy-1.2), gp.points, fiducial, fidScl) else: _log.error('index not handeled') @@ -2084,7 +2109,23 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) #go.setSize((1,1)) sz=(trf[0,0],trf[1,1]) go.setSize(sz) - + j=0 + elif type(go)==UsrGO.Path: + if j==4: + fid=go._fiducial + sz=go.szOrig + fid=fid/sz + trf=geometry.geometry.least_square_trf(ptFitTrf, fid) + print(trf) + tr=go.transform() + tr.setMatrix(1, trf[1, 0]/trf[0, 0], 0, + trf[0, 1]/trf[1, 1], 1, 0, + 0, 0, 1) + go.setTransform(tr) + go.setPos(trf[:, 2]) + # go.setSize((1,1)) + sz=(trf[0, 0], trf[1, 1]) + go.setSize(sz) j=0 elif type(go)==UsrGO.Fiducial and go.size()[0]==0.12: if j therefore the offset must be multiplied with 1000! - #Z motor has opposite sign !!! - #sp.setup_coord_trf(cz=f'{-p[0]:+.18g}X{p[1]:+.18g}Y{p[2]*1000:+.18g}') # reset to shape path system - sp.setup_coord_trf(cz=f'{+p[0]:+.18g}X{-p[1]:+.18g}Y{-p[2]*1000:+.18g}') # reset to shape path system + if codeGen==0: + # X has inverted sign ! + # Z is in um -> therefore the offset must be multiplied with 1000 ! Z motor has opposite sign ! + cz=f'{+p[0]:+.18g}X{-p[1]:+.18g}Y{-p[2]*1000:+.18g}' + else: + trf=kwargs['trf'] + cz=f'{+p[0]:+.18g}X{-p[1]:+.18g}Y{-p[2]*1000:+.18g}' except AttributeError: + cz='0' + if codeGen==0: + fx='X';fy='Y' + else: + trf=kwargs['trf']*1000#fix shear/rotation mm->um + fx=f'{trf[0,0]:+.18g}X{trf[1,0]:+.18g}Y{trf[2,0]:+.18g}' + fy=f'{trf[0,1]:+.18g}X{trf[1,1]:+.18g}Y{trf[2,1]:+.18g}' _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 - dlg.setLabelText("Download motion program");dlg+=5 + sp.setup_coord_trf(fx, fy, cz) # reset to shape path system try: sp.comm.gpascii._cb_func=lambda i, sz:self.cb_progress(i, sz, dlg) except AttributeError: pass - sp.setup_motion(fnPrg=fn+'.prg', mode=3, scale=1., dwell=10) if dlg.wasCanceled(): return dlg.setLabelText("Homing and get ready");dlg+=5