Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
-------
Point
The weighted-pixel value location of the BB.
"""
# get initial starting conditions
hmin, hmax = np.percentile(self.array, [5, 99.9])
spread = hmax - hmin
max_thresh = hmax
lower_thresh = hmax - spread / 1.5
# search for the BB by iteratively lowering the low-pass threshold value until the BB is found.
found = False
while not found:
try:
binary_arr = np.logical_and((max_thresh > self), (self >= lower_thresh))
labeled_arr, num_roi = ndimage.measurements.label(binary_arr)
roi_sizes, _ = np.histogram(labeled_arr, bins=num_roi + 1)
bw_bb_img = np.where(labeled_arr == np.argsort(roi_sizes)[-3], 1, 0)
if not is_round_old(bw_bb_img):
raise ValueError
if not is_modest_size(bw_bb_img, self.rad_field_bounding_box):
raise ValueError
if not is_symmetric(bw_bb_img):
raise ValueError
except (IndexError, ValueError):
max_thresh -= 0.05 * spread
if max_thresh < hmin:
raise ValueError(
"Pylinac v2.2.6: Unable to locate the BB. Make sure the field "
"edges do not obscure the BB and that there is no artifacts in "
"the images."
)
def _determine_calc_grid_and_adjustments(mlc, jaw, leaf_pair_widths, grid_resolution):
min_y = np.min(-jaw[:, 0])
max_y = np.max(jaw[:, 1])
leaf_centres, top_of_reference_leaf = _determine_leaf_centres(leaf_pair_widths)
grid_reference_position = _determine_reference_grid_position(
top_of_reference_leaf, grid_resolution
)
top_grid_pos = (
np.round((max_y - grid_reference_position) / grid_resolution)
) * grid_resolution + grid_reference_position
bot_grid_pos = (
grid_reference_position
- (np.round((-min_y + grid_reference_position) / grid_resolution))
* grid_resolution
)
grid = dict()
grid["jaw"] = np.arange(
bot_grid_pos, top_grid_pos + grid_resolution, grid_resolution
).astype("float")
grid_leaf_map = np.argmin(
np.abs(grid["jaw"][:, None] - leaf_centres[None, :]), axis=1
)
mosaiq_delivery_data = pymedphys.Delivery.from_mosaiq(cursor, field_id)
mosaiq_mu_density = [
pymedphys.mudensity.grid(grid_resolution=grid_resolution),
mosaiq_delivery_data.mudensity(gantry_angle, grid_resolution=grid_resolution),
]
normalisation = calc_normalisation(mosaiq_delivery_data)
logfile_mu_density = calc_logfile_mu_density_bygantry(
index, config, logfile_group, gantry_angle
)
grid_xx = logfile_mu_density[0]
grid_yy = logfile_mu_density[1]
assert np.all(grid_xx == mosaiq_mu_density[0])
assert np.all(grid_yy == mosaiq_mu_density[1])
comparison = calc_comparison(
logfile_mu_density[2], mosaiq_mu_density[2], normalisation
)
print(comparison)
plot_results(grid_xx, grid_yy, logfile_mu_density[2], mosaiq_mu_density[2])
return comparison
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
"""Create points along the surface of a sphere (a shell) where no gap
between points is larger than the defined distance_step_size"""
number_of_rows = np.ceil(np.pi * distance / distance_step_size).astype(int) + 1
elevation = np.linspace(0, np.pi, number_of_rows)
row_radii = distance * np.sin(elevation)
row_circumference = 2 * np.pi * row_radii
amount_in_row = np.ceil(row_circumference / distance_step_size).astype(int) + 1
x_coords = []
y_coords = []
z_coords = []
for i, phi in enumerate(elevation):
azimuth = np.linspace(0, 2 * np.pi, amount_in_row[i] + 1)[:-1:]
x_coords.append(distance * np.sin(phi) * np.cos(azimuth))
y_coords.append(distance * np.sin(phi) * np.sin(azimuth))
z_coords.append(distance * np.cos(phi) * np.ones_like(azimuth))
return (np.hstack(x_coords), np.hstack(y_coords), np.hstack(z_coords))
def mephysto_absolute_depth_dose(
absolute_dose, depth_of_absolute_dose_mm, distance, relative_dose, scan_curvetype
):
choose_mephysto = scan_curvetype == "PDD"
if np.sum(choose_mephysto) != 1:
raise ValueError("Can only handle one PDD per mephysto file")
mephysto_pdd_depth = distance[choose_mephysto][0]
mephysto_dose = relative_dose[choose_mephysto][0]
interpolation = scipy.interpolate.interp1d(mephysto_pdd_depth, mephysto_dose)
mephysto_pdd_dose = (
mephysto_dose / interpolation(depth_of_absolute_dose_mm) * absolute_dose
)
return mephysto_pdd_depth, mephysto_pdd_dose
def unknown_tags_in_dicom_dataset(ds):
"""Return all non-private tags from a DICOM dataset that do not
exist in the PyMedPhys copy of the DICOM dictionary.
"""
non_private_tags_in_dataset = np.array(non_private_tags_in_dicom_dataset(ds))
are_non_private_tags_in_dict_baseline = []
for tag in non_private_tags_in_dataset:
try:
get_baseline_dict_entry(tag)
are_non_private_tags_in_dict_baseline.append(True)
except NotInBaselineError:
are_non_private_tags_in_dict_baseline.append(False)
unknown_tags = list(
non_private_tags_in_dataset[
np.invert(np.array(are_non_private_tags_in_dict_baseline, dtype=bool))
]
)
return unknown_tags
def find_consecutive_logfiles(field_id_key_map, field_id, filehash, index):
keys = np.array(field_id_key_map[field_id])
times = np.array([index[key]["local_time"] for key in keys]).astype(np.datetime64)
sort_reference = np.argsort(times)
keys = keys[sort_reference]
times = times[sort_reference]
hours_4 = np.array(60 * 60 * 4).astype(np.timedelta64)
delivery_time = np.array(index[filehash]["local_time"]).astype(np.datetime64)
within_4_hours_reference = np.abs(delivery_time - times) < hours_4
within_4_hours = keys[within_4_hours_reference].tolist()
return within_4_hours
def check_if_at_bounds(bb_centre, bb_bounds):
x_at_bounds = np.any(np.array(bb_centre[0]) == np.array(bb_bounds[0]))
y_at_bounds = np.any(np.array(bb_centre[1]) == np.array(bb_bounds[1]))
any_at_bounds = x_at_bounds or y_at_bounds
return any_at_bounds