From 0a7b628ac1eb00f83f3a6c9314048ffb685e21b1 Mon Sep 17 00:00:00 2001 From: Marco Cammarata Date: Wed, 4 Jan 2017 17:14:35 +0100 Subject: [PATCH] few more pyFAI related functions includind a neat way to quickly find the center and some utility (pyFAI_dict) --- mcutils.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/mcutils.py b/mcutils.py index 89d21f7..7bec07b 100644 --- a/mcutils.py +++ b/mcutils.py @@ -1220,6 +1220,24 @@ def insertInSortedArray(a,v): a[idx]=v return a +##### X-ray images ############# + +def pyFAIread(fname): + import fabio + f = fabio.open(fname) + data = f.data + del f + return data + +def pyFAI_dict(ai): + """ ai is a pyFAI azimuthal intagrator""" + methods = dir(ai) + methods = [m for m in methods if m.find("get_") == 0] + names = [m[4:] for m in methods] + values = [getattr(ai,m)() for m in methods] + ret = dict( zip(names,values) ) + return ret + def pyFAI1d(ai, imgs, mask = None, npt_radial = 600, method = 'csr',safe=True,dark=10., polCorr = 1): """ ai is a pyFAI azimuthal intagrator it can be defined with pyFAI.load(ponifile) @@ -1252,6 +1270,59 @@ def pyFAI2d(ai, imgs, mask = None, npt_radial = 600, npt_azim=360,method = 'csr' out[_i] = i2d return q,azTheta,np.squeeze(out) +def _calc_R(x,y, xc, yc): + """ calculate the distance of each 2D points from the center (xc, yc) """ + return np.sqrt((x-xc)**2 + (y-yc)**2) + +def _chi2(c, x, y): + """ calculate the algebraic distance between the data points and the mean + circle centered at c=(xc, yc) """ + Ri = _calc_R(x, y, *c) + return Ri - Ri.mean() + +def leastsq_circle(x,y): + from scipy import optimize + # coordinates of the barycenter + center_estimate = np.nanmean(x), np.nanmean(y) + center, ier = optimize.leastsq(_chi2, center_estimate, args=(x,y)) + xc, yc = center + Ri = _calc_R(x, y, *center) + R = Ri.mean() + residu = np.sum((Ri - R)**2) + return xc, yc, R + +def pyFAI_find_center(img,psize=100e-6,dist=0.1,wavelength=0.8e-10,**kwargs): + import pyFAI + plt.ion() + kw = dict( pixel1 = psize, pixel2 = psize, dist = dist,wavelength=wavelength ) + kw.update(kwargs) + ai = pyFAI.azimuthalIntegrator.AzimuthalIntegrator(**kw) + fig_img,ax_img = plt.subplots(1,1) + fig_pyfai,ax_pyfai = plt.subplots(1,1) + fig_pyfai = plt.figure(2) + ax_img.imshow(img) + plt.sca(ax_img); # set figure to use for mouse interaction + ans = "" + print("Enter 'end' when done") + while ans != "end": + if ans == "": + print("Click on beam center:") + plt.sca(ax_img); # set figure to use for mouse interaction + xc,yc = plt.ginput()[0] + else: + xc,yc = map(float,ans.split(",")) + print("Selected center:",xc,yc) + ai.set_poni1(xc*psize) + ai.set_poni2(yc*psize) + q,az,i = pyFAI2d(ai,img) + ax_pyfai.pcolormesh(q,az,i) + ax_pyfai.set_title(str( (xc,yc) )) + plt.pause(0.01) + plt.draw() + ans=input("Enter to continue with clinking or enter xc,yc values") + print("Final values: (in pixels) %.3f %.3f"%(xc,yc)) + return ai + ### Objects ###