def sphere_model_pattern(Nx, Ny, diameter, intensity, wavelength, pixel_size, detector_distance, x0=0, y0=0, detector_adu_photon=1., detector_quantum_efficiency=1., material='water', downsampling=1): s = (Ny, Nx) img = np.zeros(shape=s) msk = np.ones(shape=s, dtype='bool') Y,X = spimage.grid(s, (0,0)) # Non-centered grid vectors in [px] # Center grid Xc = X - x0 # Centered grid x vectors in [px] Yc = Y - y0 # Centered grid y vectors in [px] # Grid to q-space (but we keep units in px) Xc = spimage.x_to_qx(Xc,pixel_size,detector_distance) Yc = spimage.y_to_qy(Yc,pixel_size,detector_distance) Rc = np.sqrt(Xc**2+Yc**2) size = sphere_model_convert_diameter_to_size(diameter, wavelength, pixel_size, detector_distance) scaling = sphere_model_convert_intensity_to_scaling(intensity, diameter, wavelength, pixel_size, detector_distance, detector_quantum_efficiency, 1, material) I_fit = I_sphere_diffraction(scaling, Rc, size) return I_fit
def fit_sphere_intensity_radial(r, img_r, diameter, intensity, wavelength, pixel_size, detector_distance, full_output=False, detector_adu_photon=1, detector_quantum_efficiency=1, material='water', maxfev=1000): """ ... usage: ====== ... Parameters: =========== ... """ R = numpy.array(r, dtype="float") R = spimage.x_to_qx(R, pixel_size, detector_distance) size = sphere_model_convert_diameter_to_size(diameter, wavelength, pixel_size, detector_distance) I_fit_m = lambda i: I_sphere_diffraction(sphere_model_convert_intensity_to_scaling(i, diameter, wavelength, pixel_size, detector_distance, detector_quantum_efficiency, detector_adu_photon, material),R,size) E_fit_m = lambda i: I_fit_m(i) - img_r if len(img_r): [intensity], cov, infodict, mesg, ier = leastsq(E_fit_m, intensity, maxfev=maxfev, xtol=1e-3, full_output=True) # Reduced Chi-squared and normalised mean difference and standard error chisquared = (E_fit_m(intensity)**2).sum()/(img_r.size - 1) nmerr = abs( E_fit_m(intensity) ).sum() / (img_r.size - 1) / abs(img_r).sum() #### EXPERIMENTAL #flin = lambda m, c: m*r + c #ferr = lambda v: E_fit_m(intensity) - flin(v[0], v[1]) #sphericity = scipy.optimize.leastsq(ferr,(0,img_r[0]))[0][0] #### --- if cov is not None: pcov = cov[0,0]*chisquared else: pcov = numpy.nan else: infodict={} pcov = None chisquared = 0 error if full_output: infodict['chisquared'] = chisquared infodict['error'] = nmerr infodict['pcov'] = pcov #infodict['sphericity'] = sphericity return intensity, infodict else: return intensity
def fit_sphere_intensity_radial(r, img_r, diameter, intensity, wavelength, pixel_size, detector_distance, full_output=False, detector_adu_photon=1, detector_quantum_efficiency=1, material='water', maxfev=1000): """ ... usage: ====== ... Parameters: =========== ... """ R = np.array(r, dtype="float") R = spimage.x_to_qx(R, pixel_size, detector_distance) size = sphere_model_convert_diameter_to_size(diameter, wavelength, pixel_size, detector_distance) I_fit_m = lambda i: I_sphere_diffraction(sphere_model_convert_intensity_to_scaling(i, diameter, wavelength, pixel_size, detector_distance, detector_quantum_efficiency, detector_adu_photon, material),R,size) E_fit_m = lambda i: I_fit_m(i) - img_r if len(img_r): [intensity], cov, infodict, mesg, ier = leastsq(E_fit_m, intensity, maxfev=maxfev, xtol=1e-3, full_output=True) # Reduced Chi-squared and normalised mean difference and standard error chisquared = (E_fit_m(intensity)**2).sum()/(img_r.size - 1) nmerr = abs( E_fit_m(intensity) ).sum() / (img_r.size - 1) / abs(img_r).sum() #### EXPERIMENTAL #flin = lambda m, c: m*r + c #ferr = lambda v: E_fit_m(intensity) - flin(v[0], v[1]) #sphericity = scipy.optimize.leastsq(ferr,(0,img_r[0]))[0][0] #### --- if cov is not None: pcov = cov[0,0]*chisquared else: pcov = np.nan else: infodict={} pcov = None chisquared = 0 error if full_output: infodict['chisquared'] = chisquared infodict['error'] = nmerr infodict['pcov'] = pcov #infodict['sphericity'] = sphericity return intensity, infodict else: return intensity
def fit_sphere_diameter_radial(r, img_r, diameter, intensity, wavelength, pixel_size, detector_distance, full_output=False, detector_adu_photon=1, detector_quantum_efficiency=1, material='water', maxfev=1000, do_brute_evals=0,dlim=None): if len(img_r.shape) > 1 or len(r.shape) > 1: print "Error: Inputs have to be one-dimensional." return S = sphere_model_convert_intensity_to_scaling(intensity, diameter, wavelength, pixel_size, detector_distance, detector_quantum_efficiency, 1, material) R = numpy.array(r, dtype="float") R = spimage.x_to_qx(R, pixel_size, detector_distance) I_fit_m = lambda d: I_sphere_diffraction(S,R,sphere_model_convert_diameter_to_size(d, wavelength, pixel_size, detector_distance)) def E_fit_m(d): if not (img_r.std() and I_fit_m(d).std()): return 1. else: return 1-scipy.stats.pearsonr(I_fit_m(d), img_r)[0] # Start with brute force with a sensible range # We'll assume at least 20x oversampling if do_brute_evals: if dlim is None: dmin = sphere_model_convert_size_to_diameter(1./(img_r.size*2), wavelength, pixel_size, detector_distance) dmax = dmin*img_r.size*2/20 else: (dmin,dmax) = dlim diameter = scipy.optimize.brute(E_fit_m, [(dmin, dmax)], Ns=do_brute_evals) # End with least square [diameter], cov, infodict, mesg, ier = leastsq(E_fit_m, diameter, maxfev=maxfev, xtol=1e-5, full_output=True) diameter = abs(diameter) # Reduced Chi-squared and standard error chisquared = ((I_fit_m(diameter) - img_r)**2).sum()/(img_r.size - 1) nmerr = abs( I_fit_m(diameter) - img_r ).sum() / (img_r.size - 1) / abs(img_r).sum() if cov is not None: pcov = cov[0,0]*chisquared else: pcov = numpy.nan if full_output: infodict['chisquared'] = chisquared infodict['error'] = nmerr infodict['pcov'] = pcov infodict['img_r'] = img_r infodict['I_fit_m'] = I_fit_m(diameter) return diameter, infodict else: return diameter
def _prepare_for_fitting(img, msk, x0, y0, rmax, downsampling, adup, do_photon_counting, pixel_size, detector_distance): if rmax is None: rmax = max(img.shape)/2 # Handle default of rmax s = img.shape # Shape of image Mr = spimage.rmask(s, rmax, (x0,y0)) # Radial mask msk = msk * Mr # Merge mask and radial mask img = img[::downsampling, ::downsampling] msk = msk[::downsampling, ::downsampling] Y,X = spimage.grid(s, (0,0)) # Non-centered grid vectors in [px] # Center grid Xc = X - x0 # Centered grid x vectors in [px] Yc = Y - y0 # Centered grid y vectors in [px] # Grid to q-space (but we keep units in px) Xc = spimage.x_to_qx(Xc,pixel_size,detector_distance) Yc = spimage.y_to_qy(Yc,pixel_size,detector_distance) Xmc = Xc[msk] # Centered and masked grid x vectors in [px] Ymc = Yc[msk] # Centered and masked grid y vectors in [px] img = img / adup if do_photon_counting: img = numpy.round(img) * (img > 0) return Xmc, Ymc, img, msk
def fit_sphere_diameter_radial(r, img_r, diameter, intensity, wavelength, pixel_size, detector_distance, full_output=False, detector_adu_photon=1, detector_quantum_efficiency=1, material='water', maxfev=1000, do_brute_evals=0,dlim=None): if len(img_r.shape) > 1 or len(r.shape) > 1: print("Error: Inputs have to be one-dimensional.") return S = sphere_model_convert_intensity_to_scaling(intensity, diameter, wavelength, pixel_size, detector_distance, detector_quantum_efficiency, 1, material) R = np.array(r, dtype="float") R = spimage.x_to_qx(R, pixel_size, detector_distance) I_fit_m = lambda d: I_sphere_diffraction(S,R,sphere_model_convert_diameter_to_size(d, wavelength, pixel_size, detector_distance)) def E_fit_m(d): if not (img_r.std() and I_fit_m(d).std()): return 1. else: return 1-scipy.stats.pearsonr(I_fit_m(d), img_r)[0] # Start with brute force with a sensible range # We'll assume at least 20x oversampling if do_brute_evals: if dlim is None: dmin = sphere_model_convert_size_to_diameter(1./(img_r.size*2), wavelength, pixel_size, detector_distance) dmax = dmin*img_r.size*2/20 else: (dmin,dmax) = dlim diameter = scipy.optimize.brute(E_fit_m, [(dmin, dmax)], Ns=do_brute_evals) # End with least square [diameter], cov, infodict, mesg, ier = leastsq(E_fit_m, diameter, maxfev=maxfev, xtol=1e-5, full_output=True) diameter = abs(diameter) # Reduced Chi-squared and standard error chisquared = ((I_fit_m(diameter) - img_r)**2).sum()/(img_r.size - 1) nmerr = abs( I_fit_m(diameter) - img_r ).sum() / (img_r.size - 1) / abs(img_r).sum() if cov is not None: pcov = cov[0,0]*chisquared else: pcov = np.nan if full_output: infodict['chisquared'] = chisquared infodict['error'] = nmerr infodict['pcov'] = pcov infodict['img_r'] = img_r infodict['I_fit_m'] = I_fit_m(diameter) return diameter, infodict else: return diameter
def _prepare_for_fitting(img, msk, x0, y0, rmax, downsampling, adup, do_photon_counting, pixel_size, detector_distance): if rmax is None: rmax = max(img.shape)/2 # Handle default of rmax s = img.shape # Shape of image Mr = spimage.rmask(s, rmax, (x0,y0)) # Radial mask msk = msk * Mr # Merge mask and radial mask img = img[::downsampling, ::downsampling] msk = msk[::downsampling, ::downsampling] Y,X = spimage.grid(s, (0,0)) # Non-centered grid vectors in [px] # Center grid Xc = X - x0 # Centered grid x vectors in [px] Yc = Y - y0 # Centered grid y vectors in [px] # Grid to q-space (but we keep units in px) Xc = spimage.x_to_qx(Xc,pixel_size,detector_distance) Yc = spimage.y_to_qy(Yc,pixel_size,detector_distance) Xmc = Xc[msk] # Centered and masked grid x vectors in [px] Ymc = Yc[msk] # Centered and masked grid y vectors in [px] img = img / adup if do_photon_counting: img = np.round(img) * (img > 0) return Xmc, Ymc, img, msk
return confmap, dlim, ilim # Radial mask def rmask(r, sh, cx, cy): ny, nx = sh xx, yy = np.meshgrid(np.arange(nx), np.arange(ny)) return (xx - cx)**2 + (yy - cy)**2 > (r**2) infile = "../data/r%04d_lowq.h5" % args.run with sparse.SmallFrame(infile, geometry="../geometry/b3_lowq.geom", mode="r+") as f: mask = f.activepixels[:300, :300] sh = mask.shape qr = spimage.x_to_qx(np.arange(0, sh[0] / 2.), pixelsize / downsampling, distance) def model(p, q): diameter, intensity = p A = spimage.sphere_model_convert_intensity_to_scaling( intensity, diameter, wavelength, pixelsize, distance, material=material) s = spimage.sphere_model_convert_diameter_to_size( diameter, wavelength, pixelsize, distance) I = spimage.I_sphere_diffraction(A, q, s) return I