Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self, gantry_angles, gantry_tol, allow_missing_angles=False
):
masks = [
self._gantry_angle_mask(gantry_angle, gantry_tol)
for gantry_angle in gantry_angles
]
for mask in masks:
if np.all(mask == 0):
continue
# TODO: Apply mask by more than just gantry angle to appropriately
# extract beam index even when multiple beams have the same gantry
# angle
is_duplicate_gantry_angles = (
np.sum(np.abs(np.diff(np.concatenate([[0], mask, [0]])))) != 2
)
if is_duplicate_gantry_angles:
raise ValueError("Duplicate gantry angles not yet supported")
try:
assert np.all(np.sum(masks, axis=0) == 1), (
"Not all beams were captured by the gantry tolerance of "
" {}".format(gantry_tol)
)
except AssertionError:
if not allow_missing_angles:
print("Allowable gantry angles = {}".format(gantry_angles))
gantry = np.array(self.gantry, copy=False)
out_of_tolerance = np.unique(
gantry[np.sum(masks, axis=0) == 0]
min_relative_dose_difference,
distance,
to_be_checked,
):
gamma_at_distance = np.sqrt(
(
min_relative_dose_difference[:, None, None]
/ (options.dose_percent_threshold[None, :, None] / 100)
)
** 2
+ (distance / options.distance_mm_threshold[None, None, :]) ** 2
)
current_gamma[to_be_checked, :, :] = np.min(
np.concatenate(
[
gamma_at_distance[None, :, :, :],
current_gamma[None, to_be_checked, :, :],
],
axis=0,
),
axis=0,
)
still_searching_for_gamma = current_gamma > (
distance / options.distance_mm_threshold[None, None, :]
)
if options.skip_once_passed:
still_searching_for_gamma = still_searching_for_gamma & (current_gamma >= 1)
def add_shells_to_ref_coords(
axes_reference_to_be_checked, coordinates_at_distance_shell
):
"""Add the distance shells to each reference coordinate to make a set of
points to be tested for this given distance"""
coordinates_at_distance = []
for shell_coord, ref_coord in zip(
coordinates_at_distance_shell, axes_reference_to_be_checked
):
coordinates_at_distance.append(
np.array(ref_coord[None, :] + shell_coord[:, None])[:, :, None]
)
all_points = np.concatenate(coordinates_at_distance, axis=2)
return all_points
def has_noise(self, window_size):
"""Helper method to determine if there is spurious signal at any of the image edges.
Determines if the min or max of an edge is within 10% of the baseline value and trims if not.
"""
near_min, near_max = np.percentile(self.array, [5, 99.5])
img_range = near_max - near_min
top = self[:window_size, :]
left = self[:, :window_size]
bottom = self[-window_size:, :]
right = self[:, -window_size:]
edge_array = np.concatenate(
(top.flatten(), left.flatten(), bottom.flatten(), right.flatten())
)
edge_too_low = edge_array.min() < (near_min - img_range / 10)
edge_too_high = edge_array.max() > (near_max + img_range / 10)
return edge_too_low or edge_too_high
def pcolormesh_grid(x, y, grid_resolution=None):
if grid_resolution is None:
diffs = np.hstack([np.diff(x), np.diff(y)])
assert np.all(np.abs(diffs - diffs[0]) < 10 ** -12)
grid_resolution = diffs[0]
new_x = np.concatenate([x - grid_resolution / 2, [x[-1] + grid_resolution / 2]])
new_y = np.concatenate([y - grid_resolution / 2, [y[-1] + grid_resolution / 2]])
return new_x, new_y
x = []
y = []
dist = []
for _, distance in enumerate(distances):
(
new_x,
new_y,
) = pymedphys._utilities.createshells.calculate_coordinates_shell_2d( # pylint: disable = protected-access
distance, min_dist
)
x.append(new_x)
y.append(new_y)
dist.append(distance * np.ones_like(new_x))
x = np.concatenate(x)
y = np.concatenate(y)
dist = np.concatenate(dist)
def points_to_check(bb_centre):
x_shifted = x + bb_centre[0]
y_shifted = y + bb_centre[1]
return x_shifted, y_shifted
return points_to_check, dist
def collimation_to_bipolar_mm(mlc_a, mlc_b, coll_y1, coll_y2):
mlc1 = 10 * mlc_b[::-1, :]
mlc2 = -10 * mlc_a[::-1, :]
mlc = np.concatenate([mlc1[None, :, :], mlc2[None, :, :]], axis=0)
jaw1 = 10 * coll_y2
jaw2 = -10 * coll_y1
jaw = np.concatenate([jaw1[None, :], jaw2[None, :]], axis=0)
return mlc, jaw