changes to make the script marion's compatible + minor tweaks
This commit is contained in:
parent
c8e1cb1a29
commit
9df711a3de
72
alignment.py
72
alignment.py
|
@ -56,7 +56,12 @@ g_fit_default_kw = dict(
|
||||||
iblur1 = 0,
|
iblur1 = 0,
|
||||||
limit_iblur1 = (0,20),
|
limit_iblur1 = (0,20),
|
||||||
error_iblur1 = 0.02,
|
error_iblur1 = 0.02,
|
||||||
fix_iblur1 = True
|
fix_iblur1 = True,
|
||||||
|
iblur2 = 0,
|
||||||
|
limit_iblur2 = (0,20),
|
||||||
|
error_iblur2 = 0.02,
|
||||||
|
fix_iblur2 = True
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,15 +70,15 @@ def rebin1D(a,shape):
|
||||||
sh = shape,n0
|
sh = shape,n0
|
||||||
return a[:n0*shape].reshape(sh).mean(1)
|
return a[:n0*shape].reshape(sh).mean(1)
|
||||||
|
|
||||||
|
cmap = plt.cm.viridis if hasattr(plt.cm,"viridis") else plt.cm.gray
|
||||||
kw_2dplot = dict(
|
kw_2dplot = dict(
|
||||||
interpolation = "none",
|
interpolation = "none",
|
||||||
aspect = "auto",
|
aspect = "auto",
|
||||||
cmap = plt.cm.viridis
|
cmap = cmap
|
||||||
)
|
)
|
||||||
|
|
||||||
fit_ret = collections.namedtuple("fit_ret",["fit_result","init_pars","final_pars",\
|
fit_ret = collections.namedtuple("fit_ret",["fit_result","init_pars","final_pars",\
|
||||||
"final_transform1","final_transform2","im1","im2","p1","p2","fom","ratio","tneeded"] )
|
"final_transform1","final_transform2","im1","im2","E","p1","p2","fom","ratio","tneeded"] )
|
||||||
|
|
||||||
def calcFOM(p1,p2,ratio):
|
def calcFOM(p1,p2,ratio):
|
||||||
idx = ( p1>p1.max()/10 ) & (p2>p2.max()/10)
|
idx = ( p1>p1.max()/10 ) & (p2>p2.max()/10)
|
||||||
|
@ -131,9 +136,9 @@ def plotShot(im1,im2,transf1=None,transf2=None,fig=None,ax=None,res=None,E=defau
|
||||||
ax = fig.axes
|
ax = fig.axes
|
||||||
if E is None: E=np.arange(im1.shape[1])
|
if E is None: E=np.arange(im1.shape[1])
|
||||||
n = im1.shape[0]
|
n = im1.shape[0]
|
||||||
ax[0].imshow(im1,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
ax[0].imshow(im1,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||||
ax[1].imshow(im2,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
ax[1].imshow(im2,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||||
ax[2].imshow(im1-im2,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
ax[2].imshow(im1-im2,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||||
if res is None:
|
if res is None:
|
||||||
p1 = np.nansum(im1,axis=0)
|
p1 = np.nansum(im1,axis=0)
|
||||||
p2 = np.nansum(im2,axis=0)
|
p2 = np.nansum(im2,axis=0)
|
||||||
|
@ -156,7 +161,7 @@ def plotRatios(r,fig=None,E=defaultE,save=None):
|
||||||
if fig is None: fig = plt.subplots(2,1,sharex=True)[0]
|
if fig is None: fig = plt.subplots(2,1,sharex=True)[0]
|
||||||
ax = fig.axes
|
ax = fig.axes
|
||||||
n = r.shape[0]
|
n = r.shape[0]
|
||||||
i = ax[0].imshow(r,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
i = ax[0].imshow(r,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||||
i.set_clim(0,1.2)
|
i.set_clim(0,1.2)
|
||||||
idx = np.random.random_integers(0,n-1)
|
idx = np.random.random_integers(0,n-1)
|
||||||
ax[1].plot(E,r[idx],label="Shot n %d"%idx)
|
ax[1].plot(E,r[idx],label="Shot n %d"%idx)
|
||||||
|
@ -260,17 +265,33 @@ def saveAlignment(fname,transform,roi1,roi2):
|
||||||
def loadAlignment(fname):
|
def loadAlignment(fname):
|
||||||
return np.load(fname).item()
|
return np.load(fname).item()
|
||||||
|
|
||||||
def unravel_results(res,getBest=False):
|
def unravel_results(res):
|
||||||
out = dict()
|
#out = dict()
|
||||||
parnames = res[0].fit_result.parameters
|
#parnames = res[0].fit_result.parameters
|
||||||
out["parameters"] = dict()
|
#out["parameters"] = dict()
|
||||||
for n in parnames:
|
#for n in parnames:
|
||||||
out["parameters"][n] = np.asarray( [r.final_pars[n] for r in res])
|
# out["parameters"][n] = np.asarray( [r.final_pars[n] for r in res])
|
||||||
out["ratio"] = np.asarray( [r.ratio for r in res])
|
#out["ratio"] = np.asarray( [r.ratio for r in res])
|
||||||
out["p1"] = np.asarray( [r.p1 for r in res] )
|
#out["p1"] = np.asarray( [r.p1 for r in res] )
|
||||||
out["p2"] = np.asarray( [r.p2 for r in res] )
|
#out["p2"] = np.asarray( [r.p2 for r in res] )
|
||||||
out["fom"] = np.asarray( [r.fom for r in res] )
|
#out["fom"] = np.asarray( [r.fom for r in res] )
|
||||||
return out
|
#out["E"] = res[0].E
|
||||||
|
return fit_ret(
|
||||||
|
fit_result = [r.fit_result for r in res],
|
||||||
|
init_pars = [r.init_pars for r in res],
|
||||||
|
final_pars = [r.final_pars for r in res],
|
||||||
|
final_transform1 = [r.final_transform1 for r in res],
|
||||||
|
final_transform2 = [r.final_transform2 for r in res],
|
||||||
|
im1 = np.asarray( [r.im1 for r in res]),
|
||||||
|
im2 = np.asarray( [r.im2 for r in res]),
|
||||||
|
E = defaultE,
|
||||||
|
p1 = np.asarray( [r.p1 for r in res]),
|
||||||
|
p2 = np.asarray( [r.p2 for r in res]),
|
||||||
|
ratio = np.asarray( [r.ratio for r in res]),
|
||||||
|
fom = np.asarray( [r.fom for r in res] ),
|
||||||
|
tneeded = np.asarray( [r.tneeded for r in res])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def getTransform(translation=(0,0),scale=(1,1),rotation=0,shear=0):
|
def getTransform(translation=(0,0),scale=(1,1),rotation=0,shear=0):
|
||||||
t= tf.AffineTransform(scale=scale,rotation=rotation,shear=shear,\
|
t= tf.AffineTransform(scale=scale,rotation=rotation,shear=shear,\
|
||||||
|
@ -317,33 +338,33 @@ def transformIminuit(im1,im2,init_transform=dict(),show=False,verbose=True,zeroT
|
||||||
def transforms(intensity,
|
def transforms(intensity,
|
||||||
igauss1cen,igauss1sig,iblur1,
|
igauss1cen,igauss1sig,iblur1,
|
||||||
scalex,scaley,rotation,transx,transy,shear,
|
scalex,scaley,rotation,transx,transy,shear,
|
||||||
igauss2cen,igauss2sig):
|
igauss2cen,igauss2sig,iblur2):
|
||||||
t1 = SpecrometerTransformation(translation=(transx,transy),scale=(scalex,scaley),\
|
t1 = SpecrometerTransformation(translation=(transx,transy),scale=(scalex,scaley),\
|
||||||
rotation=rotation,shear=shear,intensity=intensity,igauss=(igauss1cen,igauss1sig),\
|
rotation=rotation,shear=shear,intensity=intensity,igauss=(igauss1cen,igauss1sig),\
|
||||||
iblur=iblur1)
|
iblur=iblur1)
|
||||||
t2 = SpecrometerTransformation(igauss=(igauss2cen,igauss2sig))
|
t2 = SpecrometerTransformation(igauss=(igauss2cen,igauss2sig),iblur=iblur2)
|
||||||
return t1,t2
|
return t1,t2
|
||||||
|
|
||||||
def model(intensity,
|
def model(intensity,
|
||||||
igauss1cen,igauss1sig,iblur1,
|
igauss1cen,igauss1sig,iblur1,
|
||||||
scalex,scaley,rotation,transx,transy,shear,
|
scalex,scaley,rotation,transx,transy,shear,
|
||||||
igauss2cen,igauss2sig):
|
igauss2cen,igauss2sig,iblur2):
|
||||||
|
|
||||||
t1,t2 = transforms(intensity,
|
t1,t2 = transforms(intensity,
|
||||||
igauss1cen,igauss1sig,iblur1,
|
igauss1cen,igauss1sig,iblur1,
|
||||||
scalex,scaley,rotation,transx,transy,shear,
|
scalex,scaley,rotation,transx,transy,shear,
|
||||||
igauss2cen,igauss2sig)
|
igauss2cen,igauss2sig,iblur2)
|
||||||
return t1.transformImage(im1_toFit),t2.transformImage(im2_toFit)
|
return t1.transformImage(im1_toFit),t2.transformImage(im2_toFit)
|
||||||
|
|
||||||
def chi2(intensity,
|
def chi2(intensity,
|
||||||
igauss1cen,igauss1sig,iblur1,
|
igauss1cen,igauss1sig,iblur1,
|
||||||
scalex,scaley,rotation,transx,transy,shear,
|
scalex,scaley,rotation,transx,transy,shear,
|
||||||
igauss2cen,igauss2sig):
|
igauss2cen,igauss2sig,iblur2):
|
||||||
|
|
||||||
i1,i2 = model(intensity, \
|
i1,i2 = model(intensity, \
|
||||||
igauss1cen,igauss1sig,iblur1, \
|
igauss1cen,igauss1sig,iblur1, \
|
||||||
scalex,scaley,rotation,transx,transy,shear, \
|
scalex,scaley,rotation,transx,transy,shear, \
|
||||||
igauss2cen,igauss2sig)
|
igauss2cen,igauss2sig,iblur2)
|
||||||
d = (i1-i2)/err
|
d = (i1-i2)/err
|
||||||
return np.sum(d*d)
|
return np.sum(d*d)
|
||||||
|
|
||||||
|
@ -417,6 +438,7 @@ def transformIminuit(im1,im2,init_transform=dict(),show=False,verbose=True,zeroT
|
||||||
final_transform2 = t2,
|
final_transform2 = t2,
|
||||||
im1 = i1,
|
im1 = i1,
|
||||||
im2 = i2,
|
im2 = i2,
|
||||||
|
E = defaultE,
|
||||||
p1 = p1,
|
p1 = p1,
|
||||||
p2 = p2,
|
p2 = p2,
|
||||||
ratio = r,
|
ratio = r,
|
||||||
|
|
|
@ -11,10 +11,11 @@ from x3py import x3py
|
||||||
import alignment
|
import alignment
|
||||||
import mcutils as mc
|
import mcutils as mc
|
||||||
|
|
||||||
kw_2dplot = dict(
|
cmap = plt.cm.viridis if hasattr(plt.cm,"viridis") else plt.cm.gray
|
||||||
|
kw_2dplot = dict(
|
||||||
interpolation = "none",
|
interpolation = "none",
|
||||||
aspect = "auto",
|
aspect = "auto",
|
||||||
cmap = plt.cm.viridis
|
cmap = cmap
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,10 +28,13 @@ x3py.config.updateBeamline(g_bml)
|
||||||
g_folder_init = g_exp+"_init_pars/"
|
g_folder_init = g_exp+"_init_pars/"
|
||||||
g_folder_out = g_exp+"_output/"
|
g_folder_out = g_exp+"_output/"
|
||||||
g_folder_data = "/reg/d/psdm/"+g_bml+"/"+ g_exp +"/hdf5/"
|
g_folder_data = "/reg/d/psdm/"+g_bml+"/"+ g_exp +"/hdf5/"
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
if hostname == "x1":
|
if hostname == "x1":
|
||||||
g_folder_data = "/home/marco/temp"
|
g_folder_data = "/home/marco/temp"
|
||||||
|
if hostname == "apcluster0":
|
||||||
|
g_folder_data = "/data/marcoc/singleShotXanes/"+ g_exp +"/hdf5/"
|
||||||
|
|
||||||
# set defaults based on experiment
|
# set defaults based on experiment
|
||||||
if g_bml == "xpp":
|
if g_bml == "xpp":
|
||||||
|
@ -95,12 +99,17 @@ def showShots(im1,im2):
|
||||||
for a,p1,p2 in zip(ax.T,im1,im2):
|
for a,p1,p2 in zip(ax.T,im1,im2):
|
||||||
a[0].plot(p1)
|
a[0].plot(p1)
|
||||||
a[1].plot(p2)
|
a[1].plot(p2)
|
||||||
|
|
||||||
|
|
||||||
class AnalyzeRun(object):
|
class AnalyzeRun(object):
|
||||||
def __init__(self,run,initAlign="auto",swapx=g_swapx,swapy=g_swapy):
|
def __init__(self,run,initAlign="auto",swapx=g_swapx,swapy=g_swapy):
|
||||||
""" swapx → swap x axis of first spectrometer
|
""" swapx → swap x axis of first spectrometer
|
||||||
swapy → swap y axis of first spectrometer
|
swapy → swap y axis of first spectrometer
|
||||||
initAlign: use None if you want default transformation parameters
|
initAlign: could be:
|
||||||
|
1. None if you want default transformation parameters
|
||||||
|
2. a dict if you want to overwrite certain parameters of the default ones
|
||||||
|
3. an integer (to look for xppl3716_init_pars/run????_transform.npy)
|
||||||
|
4. a file name (that has been previosly saved with r.saveTransform(fname)
|
||||||
"""
|
"""
|
||||||
self.d = readDataset(run)
|
self.d = readDataset(run)
|
||||||
if isinstance(run,str):
|
if isinstance(run,str):
|
||||||
|
@ -162,7 +171,7 @@ class AnalyzeRun(object):
|
||||||
|
|
||||||
|
|
||||||
def analyzeScan(self,initpars=None,nShotsPerCalib=20,nC=None,doFit=False,fitEveryCalib=False):
|
def analyzeScan(self,initpars=None,nShotsPerCalib=20,nC=None,doFit=False,fitEveryCalib=False):
|
||||||
""" use xhift = None; in this way the fit routine does not try to automatically find the translationx parameter """
|
""" this is a comment """
|
||||||
if initpars is None: initpars= self.initAlign
|
if initpars is None: initpars= self.initAlign
|
||||||
d = self.d
|
d = self.d
|
||||||
if nC is None: nC = d.opal1.nCalib
|
if nC is None: nC = d.opal1.nCalib
|
||||||
|
@ -179,7 +188,7 @@ class AnalyzeRun(object):
|
||||||
ret = alignment.doShots(s1,s2,initpars=initpars,doFit=doFit)
|
ret = alignment.doShots(s1,s2,initpars=initpars,doFit=doFit)
|
||||||
res = alignment.unravel_results(ret)
|
res = alignment.unravel_results(ret)
|
||||||
self.results[i] = res
|
self.results[i] = res
|
||||||
return self.results.values()
|
return list(self.results.values())
|
||||||
|
|
||||||
def doShot(self,shot=0,calib=None,initpars=None,im1=None,im2=None,doFit=True,show=False,showInit=False,save=False,savePlot="auto"):
|
def doShot(self,shot=0,calib=None,initpars=None,im1=None,im2=None,doFit=True,show=False,showInit=False,save=False,savePlot="auto"):
|
||||||
if initpars is None: initpars= self.initAlign
|
if initpars is None: initpars= self.initAlign
|
||||||
|
@ -191,6 +200,7 @@ class AnalyzeRun(object):
|
||||||
self.initAlign = r.final_pars
|
self.initAlign = r.final_pars
|
||||||
if show:
|
if show:
|
||||||
if savePlot == "auto":
|
if savePlot == "auto":
|
||||||
|
if not os.path.isdir(g_folder_out): os.makedirs(g_folder_out)
|
||||||
savePlot = g_folder_out+"/run%04d_calib%s_shot%04d_fit.png" % (self.run,calib,shot)
|
savePlot = g_folder_out+"/run%04d_calib%s_shot%04d_fit.png" % (self.run,calib,shot)
|
||||||
alignment.plotShot(im1,im2,res=r,save=savePlot)
|
alignment.plotShot(im1,im2,res=r,save=savePlot)
|
||||||
if save: self.saveTransform()
|
if save: self.saveTransform()
|
||||||
|
@ -200,16 +210,15 @@ class AnalyzeRun(object):
|
||||||
if initpars is None: initpars= self.initAlign
|
if initpars is None: initpars= self.initAlign
|
||||||
d = self.d
|
d = self.d
|
||||||
s1,s2 = self.getShot(shots,calib=calib)
|
s1,s2 = self.getShot(shots,calib=calib)
|
||||||
ret,t = alignment.doShots(s1,s2,initpars=initpars,doFit=doFit,\
|
ret,transformForBestFit = alignment.doShots(s1,s2,initpars=initpars,doFit=doFit,\
|
||||||
returnBestTransform=True)
|
returnBestTransform=True)
|
||||||
if doFit:
|
if doFit: self.initAlign = transformForBestFit
|
||||||
self.initAlign = t
|
|
||||||
ret_unravel = alignment.unravel_results(ret)
|
ret_unravel = alignment.unravel_results(ret)
|
||||||
# keep it for later !
|
# keep it for later !
|
||||||
self.results[calib] = ret_unravel
|
self.results[calib] = ret_unravel
|
||||||
if unravel: ret = ret_unravel
|
if unravel: ret = ret_unravel
|
||||||
if returnBestTransform:
|
if returnBestTransform:
|
||||||
return ret,t
|
return ret,transformForBestFit
|
||||||
else:
|
else:
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@ -219,8 +228,7 @@ class AnalyzeRun(object):
|
||||||
if os.path.exists(fname) and not overwrite:
|
if os.path.exists(fname) and not overwrite:
|
||||||
print("File %s exists, **NOT** saving, use overwrite=True is you want ..."%fname)
|
print("File %s exists, **NOT** saving, use overwrite=True is you want ..."%fname)
|
||||||
return
|
return
|
||||||
if os.path.exists(fname) and overwrite:
|
if os.path.exists(fname) and overwrite: os.unlink(fname)
|
||||||
os.unlink(fname)
|
|
||||||
print("Saving results to %s"%fname)
|
print("Saving results to %s"%fname)
|
||||||
h = h5py.File(fname)
|
h = h5py.File(fname)
|
||||||
h["roi1"] = (self.roi1.start,self.roi1.stop)
|
h["roi1"] = (self.roi1.start,self.roi1.stop)
|
||||||
|
@ -250,6 +258,7 @@ class AnalyzeRun(object):
|
||||||
fname = g_folder_init+"/run%04d_transform.npy" % self.run
|
fname = g_folder_init+"/run%04d_transform.npy" % self.run
|
||||||
elif isinstance(fname,int):
|
elif isinstance(fname,int):
|
||||||
fname = g_folder_init+"/run%04d_transform.npy" % fname
|
fname = g_folder_init+"/run%04d_transform.npy" % fname
|
||||||
|
if not os.path.exists(fname): print("Asked to read %s, but it does not exist"%fname)
|
||||||
temp = np.load(fname).item()
|
temp = np.load(fname).item()
|
||||||
self.initAlign = temp["transform"]
|
self.initAlign = temp["transform"]
|
||||||
self.roi1 = temp["roi1"]
|
self.roi1 = temp["roi1"]
|
||||||
|
|
Loading…
Reference in New Issue