diff --git a/app_config.py b/app_config.py index 77bfbab..1d1e0a7 100644 --- a/app_config.py +++ b/app_config.py @@ -106,19 +106,26 @@ class AppCfg(QSettings): if AppCfg.GEO_PIX2POS not in keys: _log.warning(f'{AppCfg.GEO_PIX2POS} not defined. use default') - lut_pix2pos=(np.array([1., 200., 400., 600., 800., 1000.]), - np.array([[[ 2.42827273e-03, -9.22117396e-05], - [-1.10489804e-04, -2.42592492e-03]], - [[ 1.64346103e-03, -7.52341417e-05], - [-6.60711165e-05, -1.64190224e-03]], - [[ 9.91307639e-04, -4.02008751e-05], - [-4.23878232e-05, -9.91563507e-04]], - [[ 5.98443038e-04, -2.54046255e-05], - [-2.76831563e-05, -6.02738142e-04]], - [[ 3.64418977e-04, -1.41389267e-05], - [-1.55708176e-05, -3.66233567e-04]], - [[ 2.16526433e-04, -8.23070130e-06], - [-9.29894004e-06, -2.16842976e-04]]])) + #lut_pix2pos=(np.array([1., 200., 400., 600., 800., 1000.]), + # np.array([[[ 2.42827273e-03, -9.22117396e-05], + # [-1.10489804e-04, -2.42592492e-03]], + # [[ 1.64346103e-03, -7.52341417e-05], + # [-6.60711165e-05, -1.64190224e-03]], + # [[ 9.91307639e-04, -4.02008751e-05], + # [-4.23878232e-05, -9.91563507e-04]], + # [[ 5.98443038e-04, -2.54046255e-05], + # [-2.76831563e-05, -6.02738142e-04]], + # [[ 3.64418977e-04, -1.41389267e-05], + # [-1.55708176e-05, -3.66233567e-04]], + # [[ 2.16526433e-04, -8.23070130e-06], + # [-9.29894004e-06, -2.16842976e-04]]])) + # rough data for binning=1,1 + z=np.array((1.0, 200.0, 400.0, 600.0, 800.0, 1000.0)) + t1=np.array(([1, 0.0000], [0.0000, -1])).reshape(1, -1) + t2=np.array((0.001214,0.000821,0.000495,0.000299,0.000182,0.000108)).reshape(-1, 1) + trf=(t1*t2).reshape((-1, 2, 2)) + lut_pix2pos=(z, trf) + self.setValue(AppCfg.GEO_PIX2POS, lut_pix2pos) if AppCfg.GEO_OPT_CTR not in keys: diff --git a/camera.py b/camera.py index b64325e..874395f 100755 --- a/camera.py +++ b/camera.py @@ -190,7 +190,7 @@ class epics_cam(object): def set_param(self,**kwargs): param=[] - for k,v in kwargs: + for k,v in kwargs.items(): if k=='gain': pv_gain=self.getPv('AMPGAIN') param.append((pv_gain,v)) @@ -214,8 +214,8 @@ class epics_cam(object): param.append((pv_rye,v[1]+v[3])) elif k=='mono8': pv_mono8=self.getPv('FORCEMONO8') - param.append((pv_mono8,vv)) - self.update_params(param) + param.append((pv_mono8,v)) + self.update_params(*param) def set_exposure(self,exp): try: @@ -246,16 +246,16 @@ class epics_cam(object): #def update_params(self, **kargs): def update_params(self, *args): """update parameters on camera""" + pv_cam=self.getPv('CAMERA') + pv_cam.put(CameraStatus.IDLE, wait=True) for pv, val in args: if not pv.connected: _log.info('force connect {}'.format(pv)) pv.force_connect() #force to connect pv _log.debug("updating {} = {}".format(pv.pvname, val)) pv.put(val, wait=True) - pv_cam=self.getPv('CAMERA') pv_cs = self.getPv('CAMERASTATUS') #pv_set_param=self.getPv("SET_PARAM") - pv_cam.put(CameraStatus.IDLE, wait=True) #pv_set_param.put(1, wait=True) pv_cam.put(CameraStatus.RUNNING, wait=True) self.update_size() @@ -308,11 +308,13 @@ class epics_cam(object): img=PIL.Image.open(fn) #assert(img.mode=='L') # 8 bit grayscale assert(sz==img.size) - if img.mode in ('L'): + if img.mode=='L': #imgSeq[i, :, :]=np.asarray(img) imgSeq[i,:,:]=np.array(img.getdata()).reshape(sz[::-1]) elif img.mode=='LA': - imgSeq[i, :, :]=np.asarray(img)[:,:,0] + imgSeq[i, :, :]=np.asarray(img)[:, :, 0] + elif img.mode=='I': + imgSeq[i, :, :]=np.asarray(img) else: raise TypeError(f'unsupported image mode format {img.mode}') pic=imgSeq[i] diff --git a/epics_widgets/MotorTweak.py b/epics_widgets/MotorTweak.py index e2ae839..b930e42 100644 --- a/epics_widgets/MotorTweak.py +++ b/epics_widgets/MotorTweak.py @@ -60,7 +60,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.set_motor_validator() self._drive_val.setText(m.get('VAL', as_string=True)) - self._drive_val.returnPressed.connect(self.move_motor_to_position) + self._drive_val.returnPressed.connect(self.move_abs) tweak_min = kwargs.get("tweak_min", 0.0001) tweak_max = kwargs.get("tweak_max", 10.0) @@ -112,7 +112,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): lineedit.setValidator(QDoubleValidator(min, max, m.PV('PREC').get(), lineedit)) - def move_relative(self, dist): + def move_rel(self, dist): try: self._val+=dist except AttributeError: @@ -144,7 +144,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): status = DeltatauMotorStatus(m.motor_status) return bool(DeltatauMotorStatus.MOTOR_HAS_BEEN_HOMED & status) - def move_motor_to_position(self, drive=None, wait=False, assert_position=False): + def move_abs(self, drive=None, wait=False, assert_position=False): if drive is None: drive = float(self._drive_val.text()) if assert_position: diff --git a/epics_widgets/SimMotorTweak.py b/epics_widgets/SimMotorTweak.py index 82625e0..6980fbe 100644 --- a/epics_widgets/SimMotorTweak.py +++ b/epics_widgets/SimMotorTweak.py @@ -61,7 +61,7 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): self._motor=m=SimMotor(rec_name, short_name) self.set_motor_validator() self._drive_val.setText(str(m._pos)) - self._drive_val.returnPressed.connect(self.move_motor_to_position) + self._drive_val.returnPressed.connect(self.move_abs) self.jog_forward.hide() self.jog_reverse.hide() @@ -71,8 +71,8 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): self._tweak_val.setText(str(m._twv)) self._tweak_val.setValidator(QDoubleValidator(tweak_min, tweak_max, 4, self._tweak_val)) #self._tweak_val.editingFinished.connect(lambda m=self._pv_tweak_val: m.put(self._tweak_val.text())) - self.tweak_forward.clicked.connect(lambda m: self.move_relative(float(self._tweak_val.text()))) - self.tweak_reverse.clicked.connect(lambda m: self.move_relative(-float(self._tweak_val.text()))) + self.tweak_forward.clicked.connect(lambda m: self.move_rel(float(self._tweak_val.text()))) + self.tweak_reverse.clicked.connect(lambda m: self.move_rel(-float(self._tweak_val.text()))) #self.tweak_forward.clicked.connect(lambda m: self._pv_tweak_f.put(1)) #self.tweak_reverse.clicked.connect(lambda m: self._pv_tweak_r.put(1)) @@ -102,7 +102,7 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): lineedit.setValidator(QDoubleValidator(min, max, 5, lineedit)) - def move_relative(self, dist, delay=None): + def move_rel(self, dist, delay=None): m=self._motor m._pos += dist if delay: @@ -144,7 +144,7 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): def is_done(self): return True # in (0, 3) - def move_motor_to_position(self, drive=None, wait=False, assert_position=False): + def move_abs(self, drive=None, wait=False, assert_position=False): m=self._motor if assert_position: wait=True diff --git a/epics_widgets/SmaractMotorTweak.py b/epics_widgets/SmaractMotorTweak.py index 6908228..7dd25bf 100644 --- a/epics_widgets/SmaractMotorTweak.py +++ b/epics_widgets/SmaractMotorTweak.py @@ -80,7 +80,7 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): self.set_motor_validator() self._drive_val.setText(self._pv_drive.get(as_string=True)) - self._drive_val.returnPressed.connect(self.move_motor_to_position) + self._drive_val.returnPressed.connect(self.move_abs) self.jog_forward.hide() self.jog_reverse.hide() @@ -120,7 +120,7 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): lineedit.setValidator(QDoubleValidator(min, max, 5, lineedit)) - def move_relative(self, dist, delay=None): + def move_rel(self, dist, delay=None): cur = self._pv_readback.get() target = cur + dist if delay: @@ -158,7 +158,7 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): def is_done(self): return self._pv_status.get() in (0, 3) - def move_motor_to_position(self, drive=None, wait=False, assert_position=False): + def move_abs(self, drive=None, wait=False, assert_position=False): if assert_position: wait=True if drive is None: diff --git a/geometry.py b/geometry.py index b3563b3..9273328 100755 --- a/geometry.py +++ b/geometry.py @@ -531,3 +531,21 @@ if __name__=="__main__": [2.80894834, 2.71536886, 3.1415], [2.84446241, 3.54734879, 3.1415]]) plane=geometry.least_square_plane(pts) + + +# pix2pos="[[1.0, 200.0, 400.0, 600.0, 800.0], [[[0.001182928623952055, -2.6941995127711305e-05], [-4.043716694634124e-05, -0.0011894314084263825]], [[0.0007955995220142541, -3.175003727901119e-05], [-2.0896601103372113e-05, -0.0008100805094631365]], [[0.00048302539335378367, -1.1661121407652543e-05], [-2.0673746995751222e-05, -0.0004950857899461772]], [[0.00028775903460576395, -1.3762555219494508e-05], [-9.319936861519268e-06, -0.0002889214488565999]], [[0.0001788819256630411, -6.470841493681516e-06], [-2.0336605088889967e-06, -0.0001831131753499113]]]]" + +#lut_pix2pos=(np.array([1., 200., 400., 600., 800., 1000.]), +# np.array([[[ 2.42827273e-03, -9.22117396e-05],[-1.10489804e-04, -2.42592492e-03]], +# [[ 1.64346103e-03, -7.52341417e-05],[-6.60711165e-05, -1.64190224e-03]], +# [[ 9.91307639e-04, -4.02008751e-05],[-4.23878232e-05, -9.91563507e-04]], +# [[ 5.98443038e-04, -2.54046255e-05],[-2.76831563e-05, -6.02738142e-04]], +# [[ 3.64418977e-04, -1.41389267e-05],[-1.55708176e-05, -3.66233567e-04]], +# [[ 2.16526433e-04, -8.23070130e-06],[-9.29894004e-06, -2.16842976e-04]]])) + +#np.array([[[ 0.0010, 0.0001],[-0.0001, -0.0010]], +# [[ 0.00163, 0.00000],[-0.00000, -0.00163]], +# [[ 0.00099, 0.00000],[-0.00000, -0.00099]], +# [[ 0.00060, 0.00000],[-0.00000, -0.00060]], +# [[ 0.00036, 0.00000],[-0.00000, -0.00036]], +# [[ 0.00022, 0.00000],[-0.00000, -0.00022]]])) diff --git a/pyqtUsrObj.py b/pyqtUsrObj.py index 316fb1c..76ef355 100644 --- a/pyqtUsrObj.py +++ b/pyqtUsrObj.py @@ -145,9 +145,9 @@ class Marker(pg.ROI): # # p.drawText(-w, -h, '{:.0f}x{:.0f}'.format(*self._size)) class Fiducial(pg.ROI): - def __init__(self, pos, size, xyz, **kargs): + def __init__(self, pos, size, z:float, **kargs): pg.ROI.__init__(self, pos, size, **kargs) - self._xyz=xyz + self._z=z def paint(self, p, *args): #pg.ROI.paint(self, p, *args) @@ -157,16 +157,30 @@ class Fiducial(pg.ROI): p.translate(r.left(), r.top()) p.scale(.01*r.width(), .01*r.height()) # -> values x,y 0 to 100 p.drawRect(0, 0, 100, 100) + p.drawEllipse(45, 45, 10, 10) p.setPen(pg.mkPen(width=1, color=[255, 0, 0])) p.drawLine(pg.Point(50,10), pg.Point(50, 90)) p.drawLine(pg.Point(10,50), pg.Point(90, 50)) - tr=p.transform() - tr.setMatrix(tr.m11(), tr.m12(), tr.m13(), tr.m21(), -tr.m22(), tr.m23(), tr.m31(), tr.m32(), tr.m33()) - p.setTransform(tr) + #tr=p.transform() + #tr.setMatrix(tr.m11(), tr.m12(), tr.m13(), tr.m21(), -tr.m22(), tr.m23(), tr.m31(), tr.m32(), tr.m33()) + #p.setTransform(tr) + f=p.font() + f.setPixelSize(10) + p.setFont(f) + #p.drawText(24, 20, 'beam marker') + ctr=tuple(self.pos()+self.size()/2) + sz=tuple(self.size()) + print((*ctr,self._z)) + #p.drawText(5, 25, 'x{:.4g}\ny{:.4g}\nz{:.4g}'.format(*ctr,self._z)) + p.drawText(52, 10,40,40,Qt.TextWordWrap, 'x{:.5g}\ny{:.5g}\nz{:.5g}'.format(*ctr,self._z)) + + def ctr(self): + ctr=tuple(self.pos()+self.size()/2)+(self._z,) + return ctr def __repr__(self): - pos='('+', '.join(tuple(map(lambda x: f'{x:.6g}',self.pos())))+')' - s=f'{self.__class__.__name__}:(pos:{itr2str(self.pos())}, size:{itr2str(self.size())}, xyz:{itr2str(self._xyz)}}}' + ctr=self.ctr() + s=f'{self.__class__.__name__}:(ctr:{itr2str(ctr)}, size:{itr2str(self.size())}}}' return s def obj2json(self,encoder): @@ -174,7 +188,7 @@ class Fiducial(pg.ROI): '__class__':self.__class__.__name__, 'pos':tuple(self.pos()), 'size':tuple(self.size()), - 'xyz':tuple(self._xyz), + 'z':self._z, } return jsn @@ -469,6 +483,7 @@ class FixTargetFrame(pg.ROI): 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'] + self._dscr['size'] #pos=np.array(self.pos()) cnt =np.array(grid['count'],np.int32) #pos =np.array(grid['pos'],np.float) @@ -486,11 +501,14 @@ class FixTargetFrame(pg.ROI): 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 + t=self.transform() + p=np.array(self.pos()) + s=self.size()/self._dscr['size'] + trf=np.array(((t.m11(),t.m12(),0),(t.m21(),t.m22(),0))) + trf[:,2]=p + trf[:,:2]*=s + # trf*'gridpos in um' -> motor pos in mm + param['trf']=trf return param class TxtROI(pg.ROI): @@ -661,7 +679,7 @@ if __name__=='__main__': vi=FixTargetFrame((400,-200),(400,400),tpl='12.5x12.5') vb.addItem(vi) - vi=Fiducial((0,200),(40,40),(1,2,3)) + vi=Fiducial((0,200),(40,40),3) vb.addItem(vi) viRoi=pg.ROI([-200, -200], [100, 80],movable=True, rotatable=True, resizable=True) diff --git a/swissmx.py b/swissmx.py index 082820a..7f864e7 100755 --- a/swissmx.py +++ b/swissmx.py @@ -659,7 +659,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): if type(v)==tuple: if v==tuple(paramSv[k]): continue - #cam.set_param(paramSv) + cam.set_param(**paramSv) #cfg.setValue(AppCfg.GEO_CAM_PARAM, param) #break _log.debug(f'diff:{k},{v} != {paramSv[k]}') @@ -773,6 +773,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): obj._pos_eu=bm_pos=-geo.pix2pos(bm_pos+opt_ctr+bm_sz/2) _log.debug(f'{obj}->{bm_pos} !!! NOT SAVED IN CONFIG !!!') #cfg.setValue(AppCfg.GEO_BEAM_POS,bm_pos) + self.track_objects() def cb_zoom_changed(self, value): #self.zoomChanged.emit(value) @@ -962,15 +963,22 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): pTrk=pg.Point(self._goTracked.mapFromScene(pos)) fx=self.tweakers["fast_x"].get_val() fy=self.tweakers["fast_y"].get_val() - pTrk=pTrk-(fx,fy) + pRel=pTrk-(fx,fy) #s=f'pImg{pImg} pTrk{pTrk} bm._pos_eu{bm._pos_eu}' - + try: + pln=geo._fitPlane + except AttributeError: + cz=np.nan + else: + cz=pln[0]*pTrk[0]+pln[1]*pTrk[1]+pln[2] # z=ax+by+c s=\ - f'img pix ({pImg[0]:>0.1f} {pImg[1]:>0.1f})px \u23A2 ' \ - f'dist to beam ({pTrk[0]:>0.6g} {pTrk[1]:>0.6g}mm) ' + f'img pix ({pImg[0]:0.1f} {pImg[1]:0.1f})px \u23A2 ' \ + f'stage ({pTrk[0]:0.4f} {pTrk[1]:>0.4f} {cz:>0.4f})mm \u23A2 ' \ + f'dist to beam ({pRel[0]:>0.4f} {pRel[1]:>0.4f})mm ' + #f'dist to beam ({pRel[0]:>0.6g} {pRel[1]:>0.6g}mm) ' - _log.debug(s) + #_log.debug(s) self._lb_coords.setText(s) #self._lb_coords.setText( # "\u23FA{:>}:{:>6.0f} {:<.0f}" @@ -986,6 +994,33 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): # ) #) + def cb_mouse_click_geometry_calib(self, event): + app=QApplication.instance() + zoom = app._zoom.get_val() + fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"] + if self._btn_pix2pos.isChecked(): + try: + raw=app._raw_pix2pos[zoom] + except KeyError as e: + raw=app._raw_pix2pos[zoom]=list() + imgPos=self._goImg.mapFromScene(event.scenePos()) + fx=fast_x.get_rbv(); + fy=fast_y.get_rbv() + x=imgPos.x();y=imgPos.y() + _log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom, fx, fy, x, y)) + raw.append((fx, fy, x, y)) + elif self._btn_opt_ctr.isChecked(): + try: + raw=app._raw_opt_ctr[zoom] + except KeyError as e: + raw=app._raw_opt_ctr[zoom]=list() + imgPos=self._goImg.mapFromScene(event.scenePos()) + x=imgPos.x();y=imgPos.y() + _log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y)) + raw.append(( x, y)) + else: + QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first") + def cb_mouse_click(self, event): #_log.debug("{}".format(event)) #_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen @@ -997,19 +1032,20 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): # _log.debug(f"{type(o)} pos {o.mapFromScene(p)}") #pixel position on the scene (including black frame) #_log.debug(f"currentItem:{event.currentItem}") + app=QApplication.instance() + mod=event.modifiers() + btn=event.button() task = self.active_task() if task==TASK_SETUP_GEOMETRY_CALIB: - self.mouse_click_event_geometry_calib(event) - return + if btn==Qt.LeftButton and not mod&Qt.ControlModifier: + self.cb_mouse_click_geometry_calib(event) + return ################################ # Ctrl-left : move to position # Ctrl-right : object tree ################################ #dblclick = event.double() - app=QApplication.instance() - mod=event.modifiers() - btn=event.button() if btn==Qt.LeftButton: if mod&Qt.ShiftModifier: pass @@ -1017,28 +1053,28 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): pos=event.scenePos() _log.debug(f'move to position :scene pos {pos}') geo=app._geometry - #geo.interp_zoom(1) - bm=self._goBeamMarker - p1=self._goImg.mapFromScene(pos) - p2=bm.pos()+bm.size()/2 - px=p2+p1 - mm=geo.pix2pos(px) - _log.debug(f'{px} -> {mm}') + pImg=pg.Point(self._goImg.mapFromScene(pos)) + pTrk=pg.Point(self._goTracked.mapFromScene(pos)) + fx=self.tweakers["fast_x"].get_val() + fy=self.tweakers["fast_y"].get_val() + pRel=pTrk-(fx, fy) + _log.debug(f'dist to beam ({pTrk[0]:>0.6g} {pTrk[1]:>0.6g}mm)') fx_motor=self.tweakers["fast_x"] fy_motor=self.tweakers["fast_y"] - #bz=self.tweakers["base_z"].get_rbv() - #fx_motor, fy_motor, bx_motor, bz_motor, omega_motor=self.get_gonio_tweakers() - #fx=fx_motor.get_position() - #fy=fy_motor.get_position() - #dx=(x-bx)/ppm - #dy=-(y-by)/ppm - #fx+=dx - #fy+=dy - fx_motor.move_relative(-mm[0]) - fy_motor.move_relative(-mm[1]) - #self.fast_dx_position.emit(dx) - #self.fast_dy_position.emit(dy) + + #fx_motor.move_rel(pRel[0]) + #fy_motor.move_rel(pRel[1]) + fx_motor.move_abs(pTrk[0]) + fy_motor.move_abs(pTrk[1]) + try: + pln=geo._fitPlane + except AttributeError: pass + else: + cz_motor=self.tweakers["base_z"] + cz=pln[0]*pTrk[0]+pln[1]*pTrk[1]+pln[2] #z=ax+by+c + cz_motor.move_abs(cz) + _log.debug(f'cz={pln[0]:.4g}*{pTrk[0]:.4g}+{pln[1]:.4g}*{pTrk[1]:.4g}+{pln[2]:.4g}={cz}') pass elif mod&Qt.AltModifier: pass @@ -1118,14 +1154,14 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): dx = (x - bx) / ppm dy = -(y - by) / ppm _log.info("moving base_X, fast_Y {:.3f}, {:.3f}".format(dx, dy)) - bx_motor.move_relative(dx) - fy_motor.move_relative(dy) + bx_motor.move_rel(dx) + fy_motor.move_rel(dy) else: dx = np.cos(omega * np.pi / 180) * (x - bx) / ppm dy = -(y - by) / ppm _log.info("moving fast x/y to {:.3f}, {:.3f}".format(dx, dy)) - fx_motor.move_relative(dx) - fy_motor.move_relative(dy) + fx_motor.move_rel(dx) + fy_motor.move_rel(dy) self.fast_dx_position.emit(dx) self.fast_dy_position.emit(dy) return @@ -1134,7 +1170,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): if ctrl and not (shft or alt): mm = np.sign(y - by) * pixel_dist / 10000. _log.debug("moving Z stage by {:.3f} mm".format(mm)) - bz_motor.move_relative(mm) + bz_motor.move_rel(mm) return if task in (TASK_SETUP_PPM_CALIBRATION, TASK_SETUP_BEAM_CENTER): @@ -1335,30 +1371,36 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): except AttributeError as e: _log.warning(f'no scan parameters for object->skipped:{go}') continue - # names consists of abrevations - # part 0: po=position dt=delta - # part 1: px=pixel eu=engineering units (e.g. mm) - po_px=go.pos() - dt_px=-opt_ctr-po_px - po_eu=geo.pix2pos(dt_px)+(fx,fy) # position of the 0/0 poit of the ROI in engineering units - p=param['points'] + trf=np.asmatrix(param['trf']*1000) #fix shear/rotation um->um 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() + + #t=np.matrix((0,0,1)).T + #for i in range(p.shape[0]): + # t.A[:2,0]=pos+p[i,:]*pitch + # p[i,:]=(trf*t).A.ravel() + # Same but much faster ! + m=np.hstack((p*pitch+pos,np.ones((p.shape[0],1)))) + p=(trf*np.asmatrix(m).T).T.A + + # add up to 100 test fiducial + grp=self._goTracked + mft=self._moduleFixTarget + n=int(p.shape[0]/100)+1 + for i in range(0,p.shape[0],n): + fx,fy=p[i, :]/1000 + l=.06 + go=UsrGO.Fiducial((fx-l/2, fy-l/2), (l, l), i) + grp.addItem(go) + mft._tree.setData(grp.childItems()) print('DEBUG: first point:') print(p[0,:]) print('DEBUG: difference from point to point:') print(np.diff(p, axis=0)) - self.daq_collect(**param) + #self.daq_collect(**param) elif task == TASK_GRID: self.re_connect_collect_button( @@ -1623,7 +1665,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):