def running_mean(x, N): out = np.zeros_like(x, dtype=np.float64) dim_len = x.shape[0] for i in range(dim_len): if N % 2 == 0: a, b = i - (N - 1) // 2, i + (N - 1) // 2 + 2 else: a, b = i - (N - 1) // 2, i + (N - 1) // 2 + 1 # cap indices to min and max indices a = max(0, a) b = min(dim_len, b) out[i] = np.mean(x[a:b]) return out
def _convert_to_full_grid(grid, full_grid, mu_density): grid_xx, grid_yy = np.meshgrid(grid["mlc"], grid["jaw"]) full_grid_xx, full_grid_yy = np.meshgrid(full_grid["mlc"], full_grid["jaw"]) xx_from, xx_to = np.where( np.abs(full_grid_xx[None, 0, :] - grid_xx[0, :, None]) < 0.0001) yy_from, yy_to = np.where( np.abs(full_grid_yy[None, :, 0] - grid_yy[:, 0, None]) < 0.0001) full_grid_mu_density = np.zeros_like(full_grid_xx) full_grid_mu_density[ # pylint: disable=unsupported-assignment-operation np.ix_(yy_to, xx_to)] = mu_density[np.ix_(yy_from, xx_from)] return full_grid_mu_density
def gamma_filter_numpy(axes_reference, dose_reference, axes_evaluation, dose_evaluation, distance_mm_threshold, dose_threshold, lower_dose_cutoff=0, **_): coord_diffs = [ coord_ref[:, None] - coord_eval[None, :] for coord_ref, coord_eval in zip(axes_reference, axes_evaluation) ] all_in_vicinity = [ np.where(np.abs(diff) < distance_mm_threshold) for diff in coord_diffs ] ref_coord_points = create_point_combination( [in_vicinity[0] for in_vicinity in all_in_vicinity]) eval_coord_points = create_point_combination( [in_vicinity[1] for in_vicinity in all_in_vicinity]) distances = np.sqrt( np.sum( [ coord_diff[ref_points, eval_points]**2 for ref_points, eval_points, coord_diff in zip( ref_coord_points, eval_coord_points, coord_diffs) ], axis=0, )) within_distance_threshold = distances < distance_mm_threshold distances = distances[within_distance_threshold] ref_coord_points = ref_coord_points[:, within_distance_threshold] eval_coord_points = eval_coord_points[:, within_distance_threshold] dose_diff = ( dose_evaluation[eval_coord_points[0, :], eval_coord_points[1, :], eval_coord_points[2, :]] - dose_reference[ref_coord_points[0, :], ref_coord_points[1, :], ref_coord_points[2, :]]) gamma = np.sqrt((dose_diff / dose_threshold)**2 + (distances / distance_mm_threshold)**2) gamma_pass = gamma < 1 eval_pass = eval_coord_points[:, gamma_pass] ravel_index = convert_to_ravel_index(eval_pass) gamma_pass_array = np.zeros_like(dose_evaluation).astype(np.bool) gamma_pass_array = np.ravel(gamma_pass_array) dose_above_cut_off = np.ravel(dose_evaluation) > lower_dose_cutoff gamma_pass_array[ravel_index] = True gamma_pass_percentage = np.mean(gamma_pass_array[dose_above_cut_off]) * 100 return gamma_pass_percentage