Source code for radionets.evaluation.jets

import numpy as np
from astropy.modeling import fitting, models

from radionets.core.logging import setup_logger
from radionets.plotting.visualization import plot_fitgaussian

LOGGER = setup_logger(namespace=__name__)


[docs] def fitgaussian_crop(data, amp_scale=0.97, crop_size=0.1): """Fitting a gaussian around the maximum Parameters ---------- data : 2d array Image amp_scale : float Reduces the fitted amplitude, encounters (partially) the problem of overlapping gaussians: amplitude in image is too high -> fit is too high -> next gaussian is shifted to the outside crop_size : float proportionate size of the image after cropping Returns ------- result_lmf : astropy model Fitted astropy model object """ size = data.shape[-1] data[data < 0] = 0 crop_dist = int((size * crop_size) // 2) maximum = np.unravel_index(data.argmax(), data.shape) crop_xmin = crop_xmax = crop_ymin = crop_ymax = crop_dist if maximum[0] < crop_dist: crop_xmin = maximum[0] if maximum[1] < crop_dist: crop_ymin = maximum[1] if size - maximum[0] < crop_dist: crop_xmax = size - maximum[0] if size - maximum[1] < crop_dist: crop_ymax = size - maximum[1] data_crop = data[ maximum[0] - crop_xmin : maximum[0] + crop_xmax, maximum[1] - crop_ymin : maximum[1] + crop_ymax, ] M = models.Gaussian2D() lmf = fitting.LevMarLSQFitter() xx, yy = np.indices([data_crop.shape[0], data_crop.shape[1]]) result_lmf = lmf(M, xx, yy, data_crop) # the parameters can't be adjusted directly, need help-array params = result_lmf.parameters params[0] *= amp_scale params[1] += maximum[0] - crop_xmin params[2] += maximum[1] - crop_ymin result_lmf.parameters = params return result_lmf
[docs] def fitgaussian_iterativ( data, i=0, visualize=False, path=None, save=False, plot_format="pdf" ): """Fitting a gaussian iteratively around the maxima. Fit -> Substract -> Fit -> Substract ... until stopping criteria Parameters ---------- data : 2d array Image i : int Index of input image visualize : bool If the gauss should be plotted or not path : string Path to where the image is saved save : bool If the image is saved in path or not plot_format : str Format of the saved filed (png, pdf, ...) Returns ------- result_lmf : astropy model Fitted astropy model object """ if visualize and path is None: LOGGER.warning("Visualize is True, but no path is given.") if not visualize and path is not None: LOGGER.warning("Visualize is False, but a path is given.") params_list = [] fit_list = [] j = 0 max_iterations = 10 data_backup = data while data.max() > 0.05 and j < max_iterations: result_lmf = fitgaussian_crop(data) xx, yy = np.indices([data.shape[-1], data.shape[-1]]) fit = result_lmf(xx, yy) params = result_lmf.parameters params[1], params[2] = params[2], params[1] params[3], params[4] = params[4], params[3] result_lmf.parameters = params # save, if gauss is not too narrow (e.g. one large pixel isn't meaningful here) if not np.array(params[3:5] < data.shape[-1] / 40).any(): params_list.append(result_lmf) fit_list.append(fit) data -= fit j += 1 if visualize: plot_fitgaussian(data_backup, fit_list, params_list, i, path, save, plot_format) return params_list