This commit is contained in:
2022-08-24 08:53:54 +02:00
parent 1c1e93a4d2
commit df53197d01
6 changed files with 153 additions and 24 deletions

View File

@@ -76,6 +76,47 @@ pyqtgraph.examples.run()
``` ```
Deploy stuff (22.8.22) quick and dirty
----------------------
```
DST=/sf/cristallina/applications/mx/zamofing_t/
# /sf/cristallina/applications/mx
ssh saresc-cons-02 mkdir /tmp/zamofing_t/
rsync -vai ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST
rsync -vai ~/Documents/prj/SwissFEL/PBTools saresc-cons-03:$DST
cd /tmp/zamofing_t/ESB_MX/python/SwissMX/
/opt/gfa/python-3.7/latest/bin/python swissmx.py
/opt/gfa/python-3.8/latest/bin/pip install qtawesome --user
/opt/gfa/python-3.8/latest/bin/python swissmx.py
cd $DST
/opt/gfa/python-3.8/latest/bin/python -m pdb swissmx.py
```
```
cd /tmp/; git clone https://github.com/malcolmreynolds/transformations.git
cd /tmp/transformations.git
-> modify __init__.py -> .transformation (add dot)
setup.py install --user
cd /tmp/; git clone https://github.com/spyder-ide/qtawesome.git
cd /tmp/qtawesome
#To have epics channels we must be connected to the ESC network
EPICS_CA_ADDR_LIST='129.129.244.255 sf-saresc-cagw.psi.ch:5062 sf-saresc-cagw.psi.ch:5066'
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/oldRepos/app/src
python swissmx.py
```

View File

@@ -249,7 +249,8 @@ class epics_cam(object):
imgSeq[:,0:hr,0:wr]+=np.random.randint(0,100,(t,hr,wr),dtype=np.uint16) imgSeq[:,0:hr,0:wr]+=np.random.randint(0,100,(t,hr,wr),dtype=np.uint16)
elif mode==1: elif mode==1:
import glob,PIL.Image import glob,PIL.Image
path='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/SwissMX/simCamImg/*.png' #path='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/SwissMX/simCamImg/*.png'
path='simCamImg/*.png'
_log.info('generate simulation images:{}...'.format(path)) _log.info('generate simulation images:{}...'.format(path))
glb=glob.glob(path) glb=glob.glob(path)
img = PIL.Image.open(glb[0]) img = PIL.Image.open(glb[0])
@@ -382,6 +383,7 @@ if __name__ == "__main__":
(0,1,0,0,0), (0,1,0,0,0),
(0,0,0,0,0),),pic.dtype) (0,0,0,0,0),),pic.dtype)
pic[0:6,0:5]=f*pic.max() pic[0:6,0:5]=f*pic.max()
_log.debug('avg {}'.format(pic.sum()))
if args.ui==1: if args.ui==1:
img.setImage(pic) img.setImage(pic)
else: else:

View File

@@ -1,6 +1,12 @@
import sys,os import sys,os,socket
sys.path.insert(0, os.path.expanduser('~/Documents/prj/SwissFEL/PBTools/'))
sys.path.insert(0, os.path.expanduser('..')) sys.path.insert(0, os.path.expanduser('..'))
hostname=socket.gethostname()
if hostname=='ganymede':
sys.path.insert(0, os.path.expanduser('~/Documents/prj/SwissFEL/PBTools/'))
else:
#sys.path.insert(0, os.path.expanduser('/tmp/zamofing_t/PBTools/'))
sys.path.insert(0, os.path.expanduser('/sf/cristallina/applications/mx/zamofing_t/PBTools/'))
import logging import logging
_log=logging.getLogger(__name__) _log=logging.getLogger(__name__)

View File

@@ -149,8 +149,25 @@ class Grid(pg.ROI):
self.addScaleHandle([0, 0], [1, 1]) self.addScaleHandle([0, 0], [1, 1])
self.addScaleRotateHandle([1, 0], [0, 0]) self.addScaleRotateHandle([1, 0], [0, 0])
def get_points(self): def get_points(self,mode=0x2):
return np.array(((1,2),(3,4),(5,6)),dtype=np.float) '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): def paint(self, p, *args):
#pg.ROI.paint(self, p, *args) #pg.ROI.paint(self, p, *args)
@@ -210,6 +227,7 @@ class Path(pg.ROI):
for pt in path: for pt in path:
qPth.append(QPointF(*pt)) qPth.append(QPointF(*pt))
self.addFreeHandle([.1, .1])
self.addScaleHandle([1, 1], [0, 0]) self.addScaleHandle([1, 1], [0, 0])
self.addScaleHandle([0, 0], [1, 1]) self.addScaleHandle([0, 0], [1, 1])
self.addScaleRotateHandle([1, 0], [0, 0]) self.addScaleRotateHandle([1, 0], [0, 0])
@@ -259,16 +277,30 @@ class FixTargetFrame(pg.ROI):
'count':(8, 6) 'count':(8, 6)
} }
}, },
'125x125':{ '12.5x12.5':{
'size':(12500+120*4, 12500+120*4), 'size':(12500+120*4, 12500+120*4),
'fiducial':{ 'fiducial':{
'type':0, 'type':0,
'pos':((240, 240), (240+12500, 240), (240, 240+12500), (240+12500, 240+12500)) 'pos':((240, 240), (240+12500, 240), (240, 240+12500), (240+12500, 240+12500))
}, },
'grid':{ 'grid':{
'pos':(1050, 1050), # 240+(12500-78*120)/2=1810
'pos':(1810, 1810),
'pitch':(120, 120), 'pitch':(120, 120),
'count':(90, 90) 'count':(78, 78) #(84,84)... but sone covered
}
},
'23.0x23.0':{
'size':(23000+120*4, 23000+120*4),
'fiducial':{
'type':0,
'pos':((240, 240), (240+23000, 240), (240, 240+23000), (240+23000, 240+23000))
},
'grid':{
# 240+(23000-162*120)/2+60?=2020+60?
'pos':(2080, 2080),
'pitch':(120, 120),
'count':(162, 162) #(172,172)... but sone covered
} }
} }
} }
@@ -489,7 +521,7 @@ if __name__=='__main__':
vi=FixTargetFrame((100,300),(100,100),tpl='test') vi=FixTargetFrame((100,300),(100,100),tpl='test')
vb.addItem(vi) vb.addItem(vi)
vi=FixTargetFrame((400,-200),(400,400),tpl='125x125') vi=FixTargetFrame((400,-200),(400,400),tpl='12.5x12.5')
vb.addItem(vi) vb.addItem(vi)
childTree(vb) childTree(vb)

View File

@@ -342,8 +342,12 @@ class Main(QMainWindow, Ui_MainWindow):
#--- grid --- #--- grid ---
try: try:
self._goGrid=grid=pg.GridItem(pen=(0,255,0),textPen=(0,255,0)) #green grid and labels self._goGrid=grid=pg.GridItem(pen=(0,255,0),textPen=(0,255,0)) #green grid and labels
except: except NameError:
self._goGrid=grid=pg.GridItem() _log.debug('workaround for typo in pyqtgraph:0.11.0')
from PyQt5.QtGui import QPen,QColor
self._goGrid=grid=pg.GridItem() # green grid and labels
grid.opts['pen']=QPen(QColor(0, 255, 0))
grid.opts['textPen']=QPen(QColor(0, 255, 0))
tr.reset() tr.reset()
grid.setTransform(tr) # assign transform grid.setTransform(tr) # assign transform
vb.addItem(grid) vb.addItem(grid)
@@ -361,7 +365,8 @@ class Main(QMainWindow, Ui_MainWindow):
#--- testing scan grid --- #--- testing scan grid ---
self.track_objects() # first call is needed to initialize the structure self._goTracked self.track_objects() # first call is needed to initialize the structure self._goTracked
go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2) #go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2)
go=UsrGO.Grid((120, -100), (1000, 500), (10, 5), 2)
go.setTransform(tr) # assign transform go.setTransform(tr) # assign transform
vb.addItem(go) vb.addItem(go)
self._goTracked['objLst'].append(go) self._goTracked['objLst'].append(go)
@@ -2124,16 +2129,37 @@ class Main(QMainWindow, Ui_MainWindow):
ystep = self._sb_grid_y_step.value() ystep = self._sb_grid_y_step.value()
xoffset = self._sb_grid_x_offset.value() xoffset = self._sb_grid_x_offset.value()
yoffset = self._sb_grid_y_offset.value() yoffset = self._sb_grid_y_offset.value()
grid = CstROI.Grid( x_step=xstep, y_step=ystep, x_offset=xoffset, y_offset=yoffset, gonio_xy=(gx, gy), grid_index=grid_index, parent=self,)
self._grids.append(grid) app=QApplication.instance()
grid.calculate_gonio_xy() geo=app._geometry
grid.sigRemoveRequested.connect(lambda g=grid: self.remove_grid(g)) oc=geo._opt_ctr
self.vb.addItem(grid) if xstep==0:
go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2)
elif xstep==1:
go=UsrGO.FixTargetFrame((120, -100), (200, 150), tpl='test')
elif xstep==2:
v=geo.pos2pix((12.5, 0))
l=np.linalg.norm(v)
go=UsrGO.FixTargetFrame(-oc, (l,l), tpl='12.5x12.5')
elif xstep==3:
v=geo.pos2pix((23, 0))
l=np.linalg.norm(v)
go=UsrGO.FixTargetFrame(-oc, (l,l), tpl='23.0x23.0')
else:
_log.error('set xstep 0..2 for tests')
self.vb.addItem(go)
self._goTracked['objLst'].append(go)
#grid = CstROI.Grid( x_step=xstep, y_step=ystep, x_offset=xoffset, y_offset=yoffset, gonio_xy=(gx, gy), grid_index=grid_index, parent=self,)
#self.vb.addItem(grid)
#grid.calculate_gonio_xy()
#grid.sigRemoveRequested.connect(lambda g=grid: self.remove_grid(g))
def daq_grid_remove_all(self): def daq_grid_remove_all(self):
for grid in self._grids: vb=self.vb
grid.sigRemoveRequested.emit(grid) # ugly hack for go in self._goTracked['objLst']:
self._grids = [] vb.removeItem(go)
self._goTracked['objLst']=[]
def grids_pause_stage_tracking(self): def grids_pause_stage_tracking(self):
for grid in self._grids: for grid in self._grids:
@@ -2231,7 +2257,8 @@ class Main(QMainWindow, Ui_MainWindow):
app._jungfrau=jf=detector.Jungfrau() app._jungfrau=jf=detector.Jungfrau()
sp=dt._shapepath sp=dt._shapepath
sp.gen_grid_points(w=15, h=15, pitch=3, rnd=0, ofs=(0, +2000)); 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.sort_points(False, 15);
sp.meta['pt2pt_time']=10 sp.meta['pt2pt_time']=10
sp.setup_gather() sp.setup_gather()
@@ -2754,6 +2781,8 @@ class Main(QMainWindow, Ui_MainWindow):
self.re_connect_collect_button() self.re_connect_collect_button()
def execute_collection(self): def execute_collection(self):
app=QApplication.instance()
geo=app._geometry
task = self.active_task() task = self.active_task()
self._is_aborted = False self._is_aborted = False
method = self._tabs_daq_methods.currentWidget().accessibleName() method = self._tabs_daq_methods.currentWidget().accessibleName()
@@ -2766,8 +2795,28 @@ class Main(QMainWindow, Ui_MainWindow):
) )
self._inspect = self._grid_inspect_area self._inspect = self._grid_inspect_area
self._inspect.setPlainText("") self._inspect.setPlainText("")
for fixTrg in self._goTracked['objLst']:
points=fixTrg.get_points() geo=app._geometry
zoom=app._zoom.get_val()
fast_x=self.tweakers["fast_x"];
fast_y=self.tweakers["fast_y"]
fx=fast_x.get_val()
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
# names consists of abrevations
# part 0: po=position sz=size 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
method="grid" method="grid"
params=None #grid._grid_dimensions params=None #grid._grid_dimensions
# params = ([grid._grid_dimensions[0]], [grid._grid_dimensions[1]]) # FIXME something wrong here< # params = ([grid._grid_dimensions[0]], [grid._grid_dimensions[1]]) # FIXME something wrong here<

View File

@@ -12,7 +12,6 @@ import json
import logging import logging
_log=logging.getLogger(__name__) _log=logging.getLogger(__name__)
import os import os
import qtawesome
from PyQt5 import QtWidgets, uic from PyQt5 import QtWidgets, uic
import PyQt5.QtWidgets as qtw import PyQt5.QtWidgets as qtw
from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSignal