def test_gaussian(): pts = np.linspace(0, 10, 100) profile = generate_gaussian_profile(pts) params, errors, _, _, fail = \ gauss_model(pts, profile, np.ones_like(pts), 1.0) # Check the amplitude npt.assert_allclose(params[0], 2.5, atol=0.01) # Width npt.assert_allclose(params[1], 3.0, atol=0.01) # Background npt.assert_allclose(params[2], 0.5, atol=0.02)
def test_radial_profile_output(theta): model, skeleton = generate_filament_model(width=10.0, amplitude=1.0, background=0.0) dist_transform = nd.distance_transform_edt((~skeleton).astype(np.int)) dist, radprof, weights, unbin_dist, unbin_radprof = \ radial_profile(model, dist_transform, dist_transform, ((1, 1), (model.shape[0] // 2, model.shape[1] // 2)), img_scale=1.0, auto_cut=False, max_distance=20) params, errors, _, _, fail = \ gauss_model(dist, radprof, np.ones_like(dist), 1.0) npt.assert_allclose(params[:-1], [1.0, 10.0, 0.0], atol=1e-1)
def fit_skeleton_width(skel_array, intensity_array, pixscale, beam_width, max_dist=50): ''' Reproduce the width fitting of FilFinder, but simplified for a single super-structure. Parameters ---------- pixscale : float Conversion of pixels to pc. beam_width : float Beam size in pc. max_dist : float or int Maximum radial distance in PIXELS. ''' dist_arr = nd.distance_transform_edt(~skel_array) # bins = np.linspace(dist_arr.min(), max_dist, # int(np.sqrt(np.isfinite(dist_arr).sum()))) del_bin = 0.25 * (beam_width / pixscale) bins = np.arange(dist_arr.min(), max_dist + del_bin, del_bin) vals, bin_edges, bin_num = \ binned_statistic(dist_arr.ravel(), intensity_array.ravel(), bins=bins, statistic=np.nanmean) variances = \ binned_statistic(dist_arr.ravel(), intensity_array.ravel(), bins=bins, statistic=np.nanvar)[0] bin_width = (bin_edges[1] - bin_edges[0]) bin_centers = bin_edges[1:] - bin_width / 2 # weights = np.array([(bin_num == i).sum() for i in range(len(bins))]) # weights = weights[weights > 0] # Convert the bin_centers to pc bin_centers *= pixscale # Nans are returned when nothing usable in a bin. Remove these before # fitting bin_centers = bin_centers[np.isfinite(vals)] variances = variances[np.isfinite(vals)] vals = vals[np.isfinite(vals)] weights = 1 / variances profile = np.array([bin_centers, vals, np.sqrt(variances)]) # Now fit to a gaussian fit, err, model, names, fail = \ gauss_model(bin_centers, vals, weights, beam_width) if fail: warn("Fail flag was raised. Check the output") # raise ValueError("Fit failed.") return fit, err, model, profile