def sphereModel(evt, type, key_centerx, key_centery, key_diameter, key_intensity, shape, wavelength=1., pixelsize=110, distance=1000, adu_per_photon=1, quantum_efficiency=1, material='virus', poisson=False): """Return sphere model. .. note:: For this function, `libspimage <https://github.com/FilipeMaia/libspimage>`_ needs to be installed. Args: :evt: The event variable :type(str): The event type, e.g. analysis :key_centerx(str): The event key of the estimated off center shift in x :key_centery(str): The event key of the estimated off center shift in y :key_diameter(str): The event key of the estimated diameter :key_intensity(str): The event key of the estimated intensity :shape(tuple): The shape of the fit Kwargs: :wavelength(float): Photon wavelength [nm] (default = 1) :pixelsize(int): Side length of a pixel [um] (default=110) :distance(int): Distance from interaction to detector [mm] (default = 1000) :adu_per_photon(int): ADUs per photon (default = 1) :quantum_efficiency(float): Quantum efficiency of the detector (default = 1) :material(str): Material of particle, e.g. virus, protein, water, ... (default = virus) :poisson(bool): If True, apply poisson sampling (default = False) :Authors: Benedikt J. Daurer ([email protected]), Max Hantke, Filipe Maia """ if not spimage_installed: print "For sizing.sphereModel, libspimage (https://github.com/FilipeMaia/libspimage) needs to be installed" return centerx = evt[type][key_centerx].data centery = evt[type][key_centery].data diameter = evt[type][key_diameter].data * 1e-9 intensity = evt[type][key_intensity].data * 1e-3 / 1e-12 wavelength *= 1e-9 distance *= 1e-3 pixelsize *= 1e-6 size = spimage.sphere_model_convert_diameter_to_size(diameter, wavelength, pixelsize, distance) scaling = spimage.sphere_model_convert_intensity_to_scaling(intensity, diameter, wavelength, pixelsize, distance, quantum_efficiency, adu_per_photon, material) fit = spimage.I_sphere_diffraction(scaling, spimage.rgrid(shape, (centerx, centery)), size) if poisson: fit = np.random.poisson(fit) add_record(evt["analysis"], "analysis", "fit", fit, unit='ADU')
def find_center_pixelwise_fast(img, msk, x0=0, y0=0, dmax=5, rmax=None): """ Find center of diffraction pattern using a pixelwise comparison of centry-symmetric pixels. This is a faster C implementation. usage: ====== x,y = find_center_pixelwise_fast(img, msk, x0, y0, dmax=5, rmax=None) """ if rmax is not None: msk &= (spimage.rgrid(msk.shape, (x0,y0)) < rmax) I = spimage.sp_image_alloc(int(np.ceil(img.shape[1])), int(np.ceil(img.shape[0])), 1) I.image[:] = img I.mask[:] = msk I.detector.image_center[:] = np.array([center_to_pos(x0,img.shape[1]), center_to_pos(y0,img.shape[0]), 0 ]) success = spimage.sp_find_center_refine(I, dmax, 0, None) x = pos_to_center(I.detector.image_center[0],img.shape[1]) y = pos_to_center(I.detector.image_center[1],img.shape[0]) spimage.sp_image_free(I) return (x,y,success)