calibrating 5cam

This commit is contained in:
2018-05-29 10:15:34 +02:00
parent fda9750710
commit c889da80aa
6 changed files with 268 additions and 145 deletions

View File

@@ -588,7 +588,7 @@ cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host $PPMAC -i
$$$***
!common()
!SAR-EXPMX2()
!SAR-EXPMX3()
caput SAR-EXPMX3:ASYN.AOUT '&1;#1..5j/;cpx call 15'
caput SAR-EXPMX3:ASYN.AOUT '&1;cpx jog1..5=000;call 16'

View File

@@ -7,20 +7,25 @@
//#4: homeoffset: -87830.7554146
//#5: homeoffset: -47956.2759182
!encoder_ssi(enc=1,numBits=18,posSf=5625./4096.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=-20907.)
!encoder_ssi(enc=1,numBits=18,posSf=-5625./4096.)
//!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!motor(mot=1,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!encoder_ssi(enc=2,numBits=18,posSf=5625./4096.)
!motor(mot=2,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=102320.)
!encoder_ssi(enc=2,numBits=18,posSf=-5625./4096.)
//!motor(mot=2,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!motor(mot=2,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!encoder_ssi(enc=3,numBits=18,posSf=5625./4096.)
!motor(mot=3,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=168946.)
!encoder_ssi(enc=3,numBits=18,posSf=-5625./4096.)
//!motor(mot=3,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!motor(mot=3,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!encoder_ssi(enc=4,numBits=18,posSf=5625./4096.)
!motor(mot=4,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=-87830.)
!encoder_ssi(enc=4,numBits=18,posSf=-5625./4096.)
//!motor(mot=4,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!motor(mot=4,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!encoder_ssi(enc=5,numBits=18,posSf=5625./4096.)
!motor(mot=5,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=-47956.)
!encoder_ssi(enc=5,numBits=18,posSf=-5625./4096.)
//!motor(mot=5,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
!motor(mot=5,dirCur=1000,JogSpeed=40,servoSf=256./9.,InPosBand=0,FatalFeLimit=1000,HomeOffset=0.)
define(SP_RelBrk='15',SP_LockBrk='16')

View File

@@ -42,7 +42,7 @@ open plc 0
if (Motor[5].ActPos-Motor[5].HomePos>180000)
Motor[5].HomePos=Motor[5].HomePos+360000
disable plc 0
close plc 0```
close // plc 0
enable plc 0

View File

@@ -72,7 +72,8 @@ def plot():
meas_rot_ctr(d,1)
plt.plot(d)
plt.show()
gen_code()
plot()
#plot()

View File

@@ -8,82 +8,16 @@
'''
implements an image alalyser for ESB MX
'''
import os
from scipy import fftpack, ndimage
import scipy.ndimage as ndi
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#plt.ion()
import imgStack
def ffttest():
for phi in np.arange(0.,180.,10.):
ffttest2(phi=phi)
plt.show()
pass
def ffttest2(phi=45.,frq=4.2,amp=1.,n=256.):
#find the main frequency and phase in 1-D
#plt.ion()
plt.figure(1)
def findGrid(image,numPeak=2,minFrq=2,maxFrq=None,debug=0):
d2r=np.pi/180.
x=np.arange(n)
phi=phi*d2r
y=amp*np.cos(frq*x/n*2.*np.pi-phi)
plt.plot(x,y,'y')
#y[np.where(y<-.5)]=0
#y*=np.hamming(n)
w=np.hanning(n)
plt.plot(x,w,'y')
y*=w
#y*=1.-np.cos(x/(n-1.)*2.*np.pi)
#y=[1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1]
plt.stem(x,y)
fy=np.fft.fft(y)
fya=np.abs(fy)
plt.figure(2)
plt.subplot(211)
plt.stem(x,fya)
plt.subplot(212)
plt.stem(x,np.angle(fy)/d2r)
print(np.angle(fy[frq])/d2r)
fya[0]=0
i=(fya.reshape(2,-1)[0,:]).argmax()
(vn,v0,vp)=fya[i-1:i+2]
frq_=i+(vn-vp)/(2.*(vp+vn-2*v0))
print('freq: %g phase %g %g %g'%((frq_,)+tuple(np.angle(fy[i-1:i+2])/d2r)))
#PHASE CALCULATION
plt.figure(1)
y=np.zeros(x.shape)
z=np.zeros(x.shape)
for ii in (i,i-1,i+1):
y+=np.abs(fy[ii])/n*np.cos(ii*x/n*2.*np.pi+np.angle(fy[ii]))
z+=np.abs(fy[ii])/n*np.sin(ii*x/n*2.*np.pi+np.angle(fy[ii]))
y*=2 #double because of conjugate part
z*=2 #double because of conjugate part
plt.plot(x,y,'r')
amp_=fya[i-1:i+2].sum()/n*2.
t=int(n/2)-1
#->phase: find maximum or where the sin is 0
w=np.arccos(y[t]/amp_)
if(z[t]<0): w=-w
print('amplitude %g, value at middle (%d) cos->%g sin->%g -> acos %g deg'%(amp_,t,y[t],z[t],w/d2r))
#rot angle at middle x=127 =frq_*t/n*2.*np.pi-phi_=w '%(amp_,t,y[t],phi_/d2r))
phi_=frq_*t/n*2.*np.pi-w
y=amp_*np.cos(frq_*x/n*2.*np.pi-phi_)
print('y[%d] %g'%(t,y[t]))
plt.plot(x,y,'g')
pass
def findGrid(image,numPeak=2,limFrq=None,debug=255):
d2r=np.pi/180.
#image = ndimage.imread('/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/images/grid_20180409_115332.png', flatten=True) # flatten=True gives a greyscale image
s=image.shape
w1=np.hamming(s[0]).reshape((-1,1))
w2=np.hamming(s[1]).reshape((1,-1))
@@ -91,8 +25,9 @@ def findGrid(image,numPeak=2,limFrq=None,debug=255):
#plt.figure(num='hamming window')
#plt.imshow(wnd, interpolation="nearest")
image=wnd*image
#plt.figure(num='hamming window*img')
#plt.imshow(image, interpolation="nearest")
if debug&1:
plt.figure(num='hamming window*img')
plt.imshow(image, interpolation="nearest")
fft2 = np.fft.fft2(image)
fft2=np.fft.fftshift(fft2)
@@ -103,11 +38,11 @@ def findGrid(image,numPeak=2,limFrq=None,debug=255):
#plt.xlim(s[1]/2-50, s[1]/2+50);plt.ylim(s[0]/2-50, s[0]/2+50)
ctr=np.array(image.shape,dtype=np.int16)/2
fa[ctr[0] - 1:ctr[0] + 2, ctr[1] - 1:ctr[1] + 2]=0 # set dc to 0
fa[ctr[0]-minFrq+1:ctr[0]+minFrq, ctr[1]-minFrq+1:ctr[1]+minFrq]=0 # set dc to 0
# limit to maximal frequency
if limFrq is not None:
fa[:ctr[0]-limFrq,:]=0;fa[ctr[0]+limFrq:,:]=0
fa[:,:ctr[1]-limFrq]=0;fa[:,ctr[1]+limFrq:]=0
if maxFrq is not None:
fa[:ctr[0]-maxFrq,:]=0;fa[ctr[0]+maxFrq:,:]=0
fa[:,:ctr[1]-maxFrq]=0;fa[:,ctr[1]+maxFrq:]=0
x=np.arange(s[1])/float(s[1])*2.*np.pi
y=np.arange(s[0])/float(s[0])*2.*np.pi
if debug&1:
@@ -232,6 +167,28 @@ def plotGrid(grid,shape):
plt.plot(p[:,0],p[:,1],'r+',markeredgewidth=2, markersize=10)
plt.axis('image')
pass
def ShowImage(img,title=None,cmap='gray',vmin=None, vmax=None):
plt.figure(title)
plt.imshow(img, interpolation="nearest", cmap=cmap,vmin=vmin,vmax=vmax) # ,vmin=m-3*s, vmax=m+3*s)
plt.colorbar()
def imgEqualize(img,num_bins=256):
# get image histogram
hist, bins = np.histogram(image.flatten(), num_bins, normed=True)
cdf = hist.cumsum() # cumulative distribution function
cdf = 255 * cdf / cdf[-1] # normalize
# use linear interpolation of cdf to find new pixel values
imgEqu=np.interp(img.flatten(), bins[:-1], cdf)
imgEqu=np.uint8(imgEqu.reshape(img.shape))
plt.figure();plt.plot(hist)
h2,b2=np.histogram(imgEqu.flatten(), num_bins, normed=True)
plt.figure();plt.plot(h2)
return imgEqu.reshape(img.shape)#, cdf
def findObj(image,objSize=150,tol=0,debug=0):
#objSiz is the rough diameter of the searched features in pixels
@@ -239,35 +196,51 @@ def findObj(image,objSize=150,tol=0,debug=0):
#tolShape = roudness tolerance in object roundness (not yet implemented)
from scipy.signal import convolve2d
#plt.ion()
plt.ion()
image=image[500:2500,1000:2500]
s=image.shape
#box=np.ones((1,objSize*3),dtype=np.float32)/500.
f=np.array([0.9595264, 0.9600567, 0.9608751, 0.9620137, 0.9634765, 0.9652363, 0.9672352, 0.9693891, 0.9715959, 0.9737464, 0.9757344, 0.9774676, 0.9788761, 0.9799176, 0.9805792, 0.9808776, 0.9808528, 0.9805624, 0.9800734, 0.9794550])
f=f*1000
f=f-f.mean()
#img2=ndi.filters.convolve1d(image,box.reshape(-1),0)
#img2=ndi.filters.convolve1d(img2,box.reshape(-1),1)
img2=ndi.filters.uniform_filter(np.float32(image),objSize*2)
m=image.mean();s=image.std()
ShowImage(image,vmin=-.85,vmax=-.99)
ShowImage(image,vmin=m-3*s,vmax=m+3*s)
ieq=imgEqualize(image)
ShowImage(ieq)
m=image.mean();s=image.std()
i2=(image-m)*(256./(3*s))+128.
i2[i2>255.]=255.
i2[i2<0.]=0.
i2=np.uint8(i2)
ShowImage(i2)
image=ndi.filters.gaussian_filter1d(image,sigma=5./3,truncate=3.,axis=0)
image=ndi.filters.gaussian_filter1d(image,sigma=5./3,truncate=3.,axis=1)
ShowImage(image,vmin=-.85,vmax=-.99)
if debug&32:
plt.imshow(image, interpolation="nearest", cmap='gray')
plt.figure()
plt.imshow(img2, interpolation="nearest", cmap='gray')
#plt.show()
w=np.where(img2>image)
img2[w]=image[w]
img3=image-img2
if debug&16:
plt.figure()
plt.imshow(img3, interpolation="nearest", cmap='gray')
#plt.show()
l=int(objSize/30)
if l>0:
img4=ndi.binary_fill_holes(img3, structure=np.ones((l,l)))
if debug&8:
plt.figure()
plt.imshow(img4, interpolation="nearest", cmap='gray')
#plt.show()
else:
img4=img3
img2=ndi.filters.convolve1d(image,f,0)
ShowImage(img2,vmin=-3,vmax=3)
img3=ndi.filters.convolve1d(image,f,1)
ShowImage(img3,vmin=-3,vmax=3)
img4=np.maximum(abs(img2),abs(img3))
ShowImage(img4,vmin=0,vmax=3)
m=image.mean();s=image.std()
img5=np.zeros(image.shape)
w=np.where(img4>1.5)
img5[w]=1
ShowImage(img5)
#imgStack.Run([image, img2,img3,img4,img5])
#w=np.where(img2>image*1.01)
#img2[:]=0
#img2[w]=1
l=int(objSize/30);l=5
img6=ndi.binary_fill_holes(img5, structure=np.ones((l,l)))
#img6 = ndi.binary_dilation(img5, iterations=2)
#img6 = ndi.binary_erosion(img5, iterations=2)
ShowImage(img6)
l=int(objSize/5)#=int(objSize/10)
if l>=3:
@@ -310,7 +283,7 @@ def findObj(image,objSize=150,tol=0,debug=0):
m00=m['m00']
m10=m['m10']
m01=m['m01']
print m00
#print m00
if m00>1000 and m00<7000:
ctr2[i,:]=(m10/m00,m01/m00)
i+=1
@@ -342,39 +315,180 @@ def genImg(shape,*args):
image += np.cos(freq_x * xx + freq_y * yy - phase)
return image
def phase_retrieval_intensity_tranport(image, mu, delta, I_in, M, pixel_size, R2):
'''calculates the projected thickness as in eq. 12 of Paganin et al, 2002, J. Microscopy,
from an image, the absoption coefficient mu (um-1), the real part of the deviation of the refractive index
from unity delta, the uniform intensity of the incident radiation I_in (ph/s/um2), the magnification of the
image from the point source illumination M, the pixel size (um), the propagation distance R2 (um).'''
F = np.fft.rfft2(image)
k_x = 1/(pixel_size*image.shape[0]) # is there a 2pi factor?
k_y = 1/(pixel_size*image.shape[1]) # is there a 2pi factor?
#print k_x,k_y
k_array = np.zeros((F.shape[0],F.shape[1]))
A = np.zeros((F.shape[0],F.shape[1]), dtype=np.complex128)
for i_k in range(k_array.shape[0]):
for j_k in range(k_array.shape[1]):
k_array[i_k,j_k] = np.sqrt((i_k * k_x)**2 + (j_k * k_y)**2)
A[i_k,j_k] = mu * F[i_k,j_k] / (I_in * (R2 * delta * k_array[i_k,j_k]**2 / M + mu))
Fm1 = np.fft.irfft2(A)
T = np.multiply(-1/mu, np.log(Fm1))
return T
if __name__ == '__main__':
#plt.ion()
#ffttest()
def testfftLoop():
plt.ioff()
for phi in np.arange(0.,180.,10.):
testfft(phi=phi)
plt.show()
pass
image = ndimage.imread('/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/images/honeycomb.png')
image=-image
grid=findGrid(image,numPeak=2,limFrq=25,debug=2)
def testfft(phi=45.,frq=4.2,amp=1.,n=256.):
#find the main frequency and phase in 1-D
plt.figure(1)
d2r=np.pi/180.
x=np.arange(n)
phi=phi*d2r
y=amp*np.cos(frq*x/n*2.*np.pi-phi)
plt.plot(x,y,'y')
#y[np.where(y<-.5)]=0
#y*=np.hamming(n)
w=np.hanning(n)
plt.plot(x,w,'y')
y*=w
#y*=1.-np.cos(x/(n-1.)*2.*np.pi)
#y=[1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1]
plt.stem(x,y)
fy=np.fft.fft(y)
fya=np.abs(fy)
plt.figure(2)
plt.subplot(211)
plt.stem(x,fya)
plt.subplot(212)
plt.stem(x,np.angle(fy)/d2r)
print(np.angle(fy[frq])/d2r)
fya[0]=0
i=(fya.reshape(2,-1)[0,:]).argmax()
(vn,v0,vp)=fya[i-1:i+2]
frq_=i+(vn-vp)/(2.*(vp+vn-2*v0))
print('freq: %g phase %g %g %g'%((frq_,)+tuple(np.angle(fy[i-1:i+2])/d2r)))
#PHASE CALCULATION
plt.figure(1)
y=np.zeros(x.shape)
z=np.zeros(x.shape)
for ii in (i,i-1,i+1):
y+=np.abs(fy[ii])/n*np.cos(ii*x/n*2.*np.pi+np.angle(fy[ii]))
z+=np.abs(fy[ii])/n*np.sin(ii*x/n*2.*np.pi+np.angle(fy[ii]))
y*=2 #double because of conjugate part
z*=2 #double because of conjugate part
plt.plot(x,y,'r')
amp_=fya[i-1:i+2].sum()/n*2.
t=int(n/2)-1
#->phase: find maximum or where the sin is 0
w=np.arccos(y[t]/amp_)
if(z[t]<0): w=-w
print('amplitude %g, value at middle (%d) cos->%g sin->%g -> acos %g deg'%(amp_,t,y[t],z[t],w/d2r))
#rot angle at middle x=127 =frq_*t/n*2.*np.pi-phi_=w '%(amp_,t,y[t],phi_/d2r))
phi_=frq_*t/n*2.*np.pi-w
y=amp_*np.cos(frq_*x/n*2.*np.pi-phi_)
print('y[%d] %g'%(t,y[t]))
plt.plot(x,y,'g')
pass
def testFindGrid():
plt.ioff()
imggrid=(
('grid_20180409_115332_45deg.png', 2,None),
('grid_20180409_115332.png', 2,None),
('honeycomb.png', 2,25),
('MS01_20180411_110544.png', 10,None),
('MS02_20180411_120354.png', 10,None),
('MS03_20180411_135524.png', 10,None),
('MS04_20180411_143045.png', 10,None),
('MS04_20180411_144239.png', 10,None),
)
for (file,minFrq,maxFrq) in imggrid:
image = ndimage.imread(os.path.join(basePath,file))
image=-image
grid=findGrid(image,minFrq=minFrq,maxFrq=maxFrq,numPeak=2)
plt.figure('grid');plt.imshow(image, interpolation="nearest", cmap='gray')
plotGrid(grid, image.shape)
plt.show()
def testFindObj():
plt.ioff()
imggrid=(
('grid_20180409_115332_45deg.png', 2,None),
)
for (file,p0,p1) in imggrid:
image = ndimage.imread(os.path.join(basePath,file))
image=-image
objPos=findObj(image,debug=0)
plt.figure('findObj');plt.imshow(image, interpolation="nearest", cmap='gray')
plt.plot(objPos[:,1],objPos[:,0],'r+',markeredgewidth=2, markersize=10)
plt.axis('image')
plt.show()
def testPhaseEnhance():
mu=0.001 # um-1, optimal value found is 0.001
phase_shift=-0.4 # rad/um, optimal value found is -1
E=18 # keV
wavelength=12.4/E/10000 # um
delta=-wavelength/(2*np.pi)*phase_shift
delta=4.38560287631e-06
M=1
R2=19*1e4 # um
pixel_size=0.325 # um
flux=1e12 # ph/s
for fn in ('lyso1_scan_18keV_190mm_MosaicJ_noblend_crop.tif',
'PepT2_scan_18keV_190mm_MosaicJ_noblend_crop_FFT40.tif',
'SiN_lysoS1_scan_18keV_190mm_MosaicJ_noblend_crop_FFT40.tif',
'SiN_PepT2_scan_18keV_190mm_MosaicJ_noblend_crop.tif',):
img = ndimage.imread(os.path.join(basePath,fn))
FOV_pix = img.shape
FOV_um = (FOV_pix[0] * pixel_size, FOV_pix[1] * pixel_size)
I_in = flux / (FOV_um[0] * FOV_um[1]) # ph/s/um2
phase_image = phase_retrieval_intensity_tranport(img, mu, delta, I_in, M, pixel_size, R2)
phase_image_flipped = phase_retrieval_intensity_tranport(np.fliplr(img), mu, delta, I_in, M, pixel_size, R2)
added_image = np.add(phase_image,np.fliplr(phase_image_flipped))
m=img.mean();s=img.std()
ShowImage(img, title=fn+' raw', vmin=m-3*s, vmax=m+3*s)
m=added_image.mean();s=added_image.std()
ShowImage(added_image, title=fn+' phase retrival', vmin=m-3*s, vmax=m+3*s)
plt.show()
basePath='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/images/'
#testfftLoop()
testFindGrid()
#testFindObj()
#testPhaseEnhance()
exit(0)
plt.ion()
#image = ndimage.imread(os.path.join(basePath, 'lyso1_scan_18keV_190mm_MosaicJ_noblend_crop.tif'))
image = ndimage.imread(os.path.join(basePath, 'lyso1_scan_18keV_190mm_MosaicJ_noblend_crop.tif'))
#image = ndimage.imread(os.path.join(basePath, 'grid_20180409_115332.png'))
image = -image
#plt.figure('input');
#plt.imshow(image, interpolation="nearest", cmap='gray')
#sbl=ndi.sobel(image)
#plt.figure('sobel');
#plt.imshow(sbl, interpolation="nearest", cmap='gray')
objPos = findObj(image, objSize=50,debug=255)
plt.figure('findObj');
plt.imshow(image, interpolation="nearest", cmap='gray')
plotGrid(grid,image.shape)
plt.plot(objPos[:, 1], objPos[:, 0], 'r+', markeredgewidth=2, markersize=10)
plt.axis('image')
plt.show()
image = ndimage.imread('/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/images/grid_20180409_115332.png')
image=-image
grid=findGrid(image,numPeak=2,debug=2)
plt.imshow(image, interpolation="nearest", cmap='gray')
plotGrid(grid,image.shape)
plt.show()
image = ndimage.imread('/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/images/grid_20180409_115332_45deg.png')
image=-image
grid=findGrid(image,numPeak=2,debug=2)
plt.imshow(image, interpolation="nearest", cmap='gray')
plotGrid(grid,image.shape)
plt.show()
objPos=findObj(image,debug=1)
plt.show()
d2r=np.pi/180.
#for phi in np.arange(0.,180.,10.):
# image = genImg((600, 800), (4.5, .2, phi*d2r))
# plt.show()
#d2r=np.pi/180.
#image=genImg((600,800),(4.,1.0,10.*d2r))
#image=genImg((600,800),(4.5,-3.2,70.*d2r))
#image=genImg((600,800),(-4.5,3.2,290.*d2r)) #same image
@@ -383,7 +497,10 @@ if __name__ == '__main__':
#for v in np.arange(0,2,.3):
# image=genImg((600,800),(8,.2+v,40.*d2r),(.4,5.2,30.*d2r))
# grid=findGrid(image,numPeak=2,debug=2)
# #image = genImg((600, 800), (.4,5.2,30.))
# plt.figure(10);plt.cla()
# plt.imshow(image)
# grid=findGrid(image,numPeak=2,debug=255)
# plt.figure(1);plt.cla()
# plt.imshow(image, interpolation="nearest", cmap='gray')
# plotGrid(grid,image.shape)

View File

@@ -256,7 +256,7 @@ P=$(P),M=MOT_GIRDER5</string>
<string>Smaract</string>
</property>
<property name="files">
<string>ESB_MX_SMARACT_main.ui</string>
<string>ESB_MX_SmarAct_main.ui</string>
</property>
<property name="args">
<string>P=SARES30-ESBMX</string>