def transform_axis(x, y, transform): transformed_x = transform @ np.vstack( [x, np.zeros(len(x)), np.ones(len(x))]) transformed_y = transform @ np.vstack( [np.zeros(len(y)), y, np.ones(len(y))]) return transformed_x[0:2], transformed_y[0:2]
def get_dose_grid_structure_mask(structure_name, dcm_struct, dcm_dose): x_dose, y_dose, z_dose = xyz_axes_from_dataset(dcm_dose) xx_dose, yy_dose = np.meshgrid(x_dose, y_dose) points = np.swapaxes(np.vstack([xx_dose.ravel(), yy_dose.ravel()]), 0, 1) x_structure, y_structure, z_structure = pull_structure( structure_name, dcm_struct) structure_z_values = np.array([item[0] for item in z_structure]) mask = np.zeros((len(y_dose), len(x_dose), len(z_dose)), dtype=bool) for z_val in structure_z_values: structure_indices = _get_indices(z_structure, z_val) for structure_index in structure_indices: dose_index = int(np.where(z_dose == z_val)[0]) assert z_structure[structure_index][0] == z_dose[dose_index] structure_polygon = matplotlib.path.Path([ (x_structure[structure_index][i], y_structure[structure_index][i]) for i in range(len(x_structure[structure_index])) ]) mask[:, :, dose_index] = mask[:, :, dose_index] | ( structure_polygon.contains_points(points).reshape( len(y_dose), len(x_dose))) return mask
def delivery_from_tel_plan_contents(tel_contents): pattern = get_control_point_pattern() all_controlpoint_results = re.findall(pattern, tel_contents) mu = np.cumsum([float(result[3]) for result in all_controlpoint_results]) iec_gantry_angle = [float(result[1]) for result in all_controlpoint_results] bipolar_gantry_angle = pymedphys._utilities.transforms.convert_IEC_angle_to_bipolar( # pylint: disable = protected-access iec_gantry_angle ) iec_coll_angle = [float(result[2]) for result in all_controlpoint_results] bipolar_coll_angle = pymedphys._utilities.transforms.convert_IEC_angle_to_bipolar( # pylint: disable = protected-access iec_coll_angle ) mlcs = [convert_mlc_string(result[0]) for result in all_controlpoint_results] jaw_gap = np.array([float(result[4]) for result in all_controlpoint_results]) jaw_field_centre = np.array( [float(result[5]) for result in all_controlpoint_results] ) jaw_a = jaw_field_centre + jaw_gap / 2 jaw_b = -(jaw_field_centre - jaw_gap / 2) jaws = np.vstack([jaw_a, jaw_b]).T return mu, bipolar_gantry_angle, bipolar_coll_angle, mlcs, jaws
def delivery_from_tel_plan_contents(tel_contents): pattern = get_control_point_pattern() all_controlpoint_results = re.findall(pattern, tel_contents) mu = np.cumsum([float(result[4]) for result in all_controlpoint_results]).tolist() iec_gantry_angle = [ float(result[2]) for result in all_controlpoint_results ] bipolar_gantry_angle = pymedphys._utilities.transforms.convert_IEC_angle_to_bipolar( # pylint: disable = protected-access iec_gantry_angle).tolist() iec_coll_angle = [float(result[3]) for result in all_controlpoint_results] bipolar_coll_angle = pymedphys._utilities.transforms.convert_IEC_angle_to_bipolar( # pylint: disable = protected-access iec_coll_angle).tolist() mlcs = [ convert_mlc_string(result[0]) for result in all_controlpoint_results ] jaw_gap = np.array( [float(result[5]) for result in all_controlpoint_results]) jaw_field_centre = np.array( [float(result[6]) for result in all_controlpoint_results]) jaw_a = jaw_field_centre + jaw_gap / 2 jaw_b = -(jaw_field_centre - jaw_gap / 2) jaws = np.vstack([jaw_a, jaw_b]).T.tolist() for i in range(len(mu) - 1, -1, -1): result = all_controlpoint_results[i] if result[ 1] == "2,2": # A nasty hack to attempt to find static fields if i == 0: mu = [0] + mu else: mu = mu[0:i] + [mu[i - 1]] + mu[i::] bipolar_gantry_angle = (bipolar_gantry_angle[0:i] + [bipolar_gantry_angle[i]] + bipolar_gantry_angle[i::]) bipolar_coll_angle = (bipolar_coll_angle[0:i] + [bipolar_coll_angle[i]] + bipolar_coll_angle[i::]) mlcs = mlcs[0:i] + [mlcs[i]] + mlcs[i::] jaws = jaws[0:i] + [jaws[i]] + jaws[i::] elif result[1] != "1,1": raise ValueError( "Detection for static or dynamic control points has fallen down" ) return mu, bipolar_gantry_angle, bipolar_coll_angle, mlcs, jaws
def apply_transform(xx, yy, transform): xx = np.array(xx, copy=False) yy = np.array(yy, copy=False) xx_flat = np.ravel(xx) transformed = transform @ np.vstack( [xx_flat, np.ravel(yy), np.ones_like(xx_flat)]) xx_transformed = transformed[0] yy_transformed = transformed[1] xx_transformed.shape = xx.shape yy_transformed.shape = yy.shape return xx_transformed, yy_transformed
def file_output(output_directory, distance, relative_dose, scan_curvetype, scan_depth): """Store the loaded mephysto data into csv files for easy user confirmation and use. """ # Determines the filepaths for the output filepaths = determine_output_filepaths(output_directory, scan_curvetype, scan_depth) columns = ["distance (mm)", "relative dose"] # Loop over each curvetype and save the data to csv for i, _ in enumerate(scan_curvetype): # Stacks the data into one array and transposes into column orientation data = np.vstack([distance[i], relative_dose[i]]).T # Use pandas to save data to csv df = pd.DataFrame(data, columns=columns) df.to_csv(filepaths[i])