Пример #1
0
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
Пример #3
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
    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