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,
|
||||
limit_iblur1 = (0,20),
|
||||
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
|
||||
return a[:n0*shape].reshape(sh).mean(1)
|
||||
|
||||
|
||||
cmap = plt.cm.viridis if hasattr(plt.cm,"viridis") else plt.cm.gray
|
||||
kw_2dplot = dict(
|
||||
interpolation = "none",
|
||||
aspect = "auto",
|
||||
cmap = plt.cm.viridis
|
||||
cmap = cmap
|
||||
)
|
||||
|
||||
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):
|
||||
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
|
||||
if E is None: E=np.arange(im1.shape[1])
|
||||
n = im1.shape[0]
|
||||
ax[0].imshow(im1,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
||||
ax[1].imshow(im2,**kw_2dplot,extent=(E[0],E[-1],0,n))
|
||||
ax[2].imshow(im1-im2,**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,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||
ax[2].imshow(im1-im2,extent=(E[0],E[-1],0,n),**kw_2dplot)
|
||||
if res is None:
|
||||
p1 = np.nansum(im1,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]
|
||||
ax = fig.axes
|
||||
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)
|
||||
idx = np.random.random_integers(0,n-1)
|
||||
ax[1].plot(E,r[idx],label="Shot n %d"%idx)
|
||||
|
@ -260,17 +265,33 @@ def saveAlignment(fname,transform,roi1,roi2):
|
|||
def loadAlignment(fname):
|
||||
return np.load(fname).item()
|
||||
|
||||
def unravel_results(res,getBest=False):
|
||||
out = dict()
|
||||
parnames = res[0].fit_result.parameters
|
||||
out["parameters"] = dict()
|
||||
for n in parnames:
|
||||
out["parameters"][n] = np.asarray( [r.final_pars[n] 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["p2"] = np.asarray( [r.p2 for r in res] )
|
||||
out["fom"] = np.asarray( [r.fom for r in res] )
|
||||
return out
|
||||
def unravel_results(res):
|
||||
#out = dict()
|
||||
#parnames = res[0].fit_result.parameters
|
||||
#out["parameters"] = dict()
|
||||
#for n in parnames:
|
||||
# out["parameters"][n] = np.asarray( [r.final_pars[n] 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["p2"] = np.asarray( [r.p2 for r in res] )
|
||||
#out["fom"] = np.asarray( [r.fom for r in res] )
|
||||
#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):
|
||||
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,
|
||||
igauss1cen,igauss1sig,iblur1,
|
||||
scalex,scaley,rotation,transx,transy,shear,
|
||||
igauss2cen,igauss2sig):
|
||||
igauss2cen,igauss2sig,iblur2):
|
||||
t1 = SpecrometerTransformation(translation=(transx,transy),scale=(scalex,scaley),\
|
||||
rotation=rotation,shear=shear,intensity=intensity,igauss=(igauss1cen,igauss1sig),\
|
||||
iblur=iblur1)
|
||||
t2 = SpecrometerTransformation(igauss=(igauss2cen,igauss2sig))
|
||||
t2 = SpecrometerTransformation(igauss=(igauss2cen,igauss2sig),iblur=iblur2)
|
||||
return t1,t2
|
||||
|
||||
def model(intensity,
|
||||
igauss1cen,igauss1sig,iblur1,
|
||||
scalex,scaley,rotation,transx,transy,shear,
|
||||
igauss2cen,igauss2sig):
|
||||
igauss2cen,igauss2sig,iblur2):
|
||||
|
||||
t1,t2 = transforms(intensity,
|
||||
igauss1cen,igauss1sig,iblur1,
|
||||
scalex,scaley,rotation,transx,transy,shear,
|
||||
igauss2cen,igauss2sig)
|
||||
igauss2cen,igauss2sig,iblur2)
|
||||
return t1.transformImage(im1_toFit),t2.transformImage(im2_toFit)
|
||||
|
||||
def chi2(intensity,
|
||||
igauss1cen,igauss1sig,iblur1,
|
||||
scalex,scaley,rotation,transx,transy,shear,
|
||||
igauss2cen,igauss2sig):
|
||||
igauss2cen,igauss2sig,iblur2):
|
||||
|
||||
i1,i2 = model(intensity, \
|
||||
igauss1cen,igauss1sig,iblur1, \
|
||||
scalex,scaley,rotation,transx,transy,shear, \
|
||||
igauss2cen,igauss2sig)
|
||||
igauss2cen,igauss2sig,iblur2)
|
||||
d = (i1-i2)/err
|
||||
return np.sum(d*d)
|
||||
|
||||
|
@ -417,6 +438,7 @@ def transformIminuit(im1,im2,init_transform=dict(),show=False,verbose=True,zeroT
|
|||
final_transform2 = t2,
|
||||
im1 = i1,
|
||||
im2 = i2,
|
||||
E = defaultE,
|
||||
p1 = p1,
|
||||
p2 = p2,
|
||||
ratio = r,
|
||||
|
|
|
@ -11,10 +11,11 @@ from x3py import x3py
|
|||
import alignment
|
||||
import mcutils as mc
|
||||
|
||||
cmap = plt.cm.viridis if hasattr(plt.cm,"viridis") else plt.cm.gray
|
||||
kw_2dplot = dict(
|
||||
interpolation = "none",
|
||||
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_out = g_exp+"_output/"
|
||||
g_folder_data = "/reg/d/psdm/"+g_bml+"/"+ g_exp +"/hdf5/"
|
||||
|
||||
import socket
|
||||
hostname = socket.gethostname()
|
||||
if hostname == "x1":
|
||||
g_folder_data = "/home/marco/temp"
|
||||
if hostname == "apcluster0":
|
||||
g_folder_data = "/data/marcoc/singleShotXanes/"+ g_exp +"/hdf5/"
|
||||
|
||||
# set defaults based on experiment
|
||||
if g_bml == "xpp":
|
||||
|
@ -96,11 +100,16 @@ def showShots(im1,im2):
|
|||
a[0].plot(p1)
|
||||
a[1].plot(p2)
|
||||
|
||||
|
||||
class AnalyzeRun(object):
|
||||
def __init__(self,run,initAlign="auto",swapx=g_swapx,swapy=g_swapy):
|
||||
""" swapx → swap x 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)
|
||||
if isinstance(run,str):
|
||||
|
@ -162,7 +171,7 @@ class AnalyzeRun(object):
|
|||
|
||||
|
||||
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
|
||||
d = self.d
|
||||
if nC is None: nC = d.opal1.nCalib
|
||||
|
@ -179,7 +188,7 @@ class AnalyzeRun(object):
|
|||
ret = alignment.doShots(s1,s2,initpars=initpars,doFit=doFit)
|
||||
res = alignment.unravel_results(ret)
|
||||
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"):
|
||||
if initpars is None: initpars= self.initAlign
|
||||
|
@ -191,6 +200,7 @@ class AnalyzeRun(object):
|
|||
self.initAlign = r.final_pars
|
||||
if show:
|
||||
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)
|
||||
alignment.plotShot(im1,im2,res=r,save=savePlot)
|
||||
if save: self.saveTransform()
|
||||
|
@ -200,16 +210,15 @@ class AnalyzeRun(object):
|
|||
if initpars is None: initpars= self.initAlign
|
||||
d = self.d
|
||||
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)
|
||||
if doFit:
|
||||
self.initAlign = t
|
||||
if doFit: self.initAlign = transformForBestFit
|
||||
ret_unravel = alignment.unravel_results(ret)
|
||||
# keep it for later !
|
||||
self.results[calib] = ret_unravel
|
||||
if unravel: ret = ret_unravel
|
||||
if returnBestTransform:
|
||||
return ret,t
|
||||
return ret,transformForBestFit
|
||||
else:
|
||||
return ret
|
||||
|
||||
|
@ -219,8 +228,7 @@ class AnalyzeRun(object):
|
|||
if os.path.exists(fname) and not overwrite:
|
||||
print("File %s exists, **NOT** saving, use overwrite=True is you want ..."%fname)
|
||||
return
|
||||
if os.path.exists(fname) and overwrite:
|
||||
os.unlink(fname)
|
||||
if os.path.exists(fname) and overwrite: os.unlink(fname)
|
||||
print("Saving results to %s"%fname)
|
||||
h = h5py.File(fname)
|
||||
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
|
||||
elif isinstance(fname,int):
|
||||
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()
|
||||
self.initAlign = temp["transform"]
|
||||
self.roi1 = temp["roi1"]
|
||||
|
|
Loading…
Reference in New Issue