def main(): st.write("## Parameters") number_of_images = st.number_input("Number of Images", 10) width = st.number_input("Width (mm)", 20) length = st.number_input("Length (mm)", 24) edge_lengths = [width, length] # initial_rotation = 0 bb_diameter = st.number_input("BB Diameter (mm)", 8) penumbra = st.number_input("Penumbra (mm)", 2) # files = sorted(IMAGES_DIR.glob("*.jpg"), key=lambda t: -os.stat(t).st_mtime) # most_recent = files[0:5] # most_recent files = get_file_list() most_recent = sorted( files, key=lambda t: -os.stat(t).st_mtime)[0:number_of_images] image_path = st.radio("Image to select", options=most_recent) plt.imshow(read_image(image_path)) st.pyplot() if st.button("Calculate"): img = read_image(image_path) x, y, img = iview.iview_image_transform(img) field = imginterp.create_interpolated_field(x, y, img) initial_centre = findfield.get_centre_of_mass(x, y, img) (field_centre, field_rotation) = findfield.field_centre_and_rotation_refining( field, edge_lengths, penumbra, initial_centre, fixed_rotation=0) bb_centre = findbb.optimise_bb_centre(field, bb_diameter, edge_lengths, penumbra, field_centre, field_rotation) fig = reporting.image_analysis_figure( x, y, img, bb_centre, field_centre, field_rotation, bb_diameter, edge_lengths, penumbra, ) st.write(fig) st.pyplot()
def run_calculation( reference_results, evaluation_results, gamma_options, escan_directory, png_output_directory, ): st.write("Calculating Reference MU Density...") reference_mudensity = calculate_batch_mudensity( reference_results["deliveries"]) st.write("Calculating Evaluation MU Density...") evaluation_mudensity = calculate_batch_mudensity( evaluation_results["deliveries"]) st.write("Calculating Gamma...") gamma = calculate_gamma(reference_mudensity, evaluation_mudensity, gamma_options) patient_id = reference_results["patient_id"] st.write("Creating figure...") output_base_filename = ( f"{patient_id} {reference_results['identifier']} vs " f"{evaluation_results['identifier']}") pdf_filepath = str( escan_directory.joinpath(f"{output_base_filename}.pdf").resolve()) png_record_directory = png_output_directory.joinpath(output_base_filename) png_record_directory.mkdir(exist_ok=True) png_filepath = str(png_record_directory.joinpath("report.png").resolve()) try: patient_name_text = f"Patient Name: {reference_results['patient_name']}\n" except KeyError: patient_name_text = "" header_text = (f"Patient ID: {patient_id}\n" f"{patient_name_text}" f"Reference: {reference_results['identifier']}\n" f"Evaluation: {evaluation_results['identifier']}\n") reference_path_strings = "\n ".join( [str(path.resolve()) for path in reference_results["data_paths"]]) evaluation_path_strings = "\n ".join( [str(path.resolve()) for path in evaluation_results["data_paths"]]) footer_text = (f"reference path(s): {reference_path_strings}\n" f"evaluation path(s): {evaluation_path_strings}\n" f"png record: {png_filepath}") fig = plot_and_save_results( reference_mudensity, evaluation_mudensity, gamma, gamma_options, png_record_directory, header_text=header_text, footer_text=footer_text, ) fig.tight_layout() st.write("Saving figure...") plt.savefig(png_filepath, dpi=100) try: subprocess.check_call( f'magick convert "{png_filepath}" "{pdf_filepath}"', shell=True) except subprocess.CalledProcessError: st.write( UnableToCreatePDF( "Please install Image Magick to create PDF reports " "<https://imagemagick.org/script/download.php#windows>.")) st.write("## Results") st.pyplot()
def main(): st.write(""" # Electron Insert Factors """) patient_id = st.text_input("Patient ID") if patient_id == "": st.stop() rccc_string_search_pattern = r"\\monacoda\FocalData\RCCC\1~Clinical\*~{}\plan\*\*tel.1".format( patient_id) rccc_filepath_list = glob(rccc_string_search_pattern) nbccc_string_search_pattern = r"\\tunnel-nbcc-monaco\FOCALDATA\NBCCC\1~Clinical\*~{}\plan\*\*tel.1".format( patient_id) nbccc_filepath_list = glob(nbccc_string_search_pattern) sash_string_search_pattern = r"\\tunnel-sash-monaco\Users\Public\Documents\CMS\FocalData\SASH\1~Clinical\*~{}\plan\*\*tel.1".format( patient_id) sash_filepath_list = glob(sash_string_search_pattern) filepath_list = np.concatenate( [rccc_filepath_list, nbccc_filepath_list, sash_filepath_list]) electronmodel_regex = r"RiverinaAgility - (\d+)MeV" applicator_regex = r"(\d+)X\d+" insert_data = dict() # type: ignore for telfilepath in filepath_list: insert_data[telfilepath] = dict() with open(telfilepath, "r") as file: telfilecontents = np.array(file.read().splitlines()) insert_data[telfilepath]["reference_index"] = [] for i, item in enumerate(telfilecontents): if re.search(electronmodel_regex, item): insert_data[telfilepath]["reference_index"] += [i] insert_data[telfilepath]["applicators"] = [ re.search(applicator_regex, telfilecontents[i + 12]).group(1) # type: ignore for i in insert_data[telfilepath]["reference_index"] ] insert_data[telfilepath]["energies"] = [ re.search(electronmodel_regex, telfilecontents[i]).group(1) # type: ignore for i in insert_data[telfilepath]["reference_index"] ] for telfilepath in filepath_list: with open(telfilepath, "r") as file: telfilecontents = np.array(file.read().splitlines()) insert_data[telfilepath]["x"] = [] insert_data[telfilepath]["y"] = [] for i, index in enumerate(insert_data[telfilepath]["reference_index"]): insert_initial_range = telfilecontents[ index + 51::] # coords start 51 lines after electron model name insert_stop = np.where(insert_initial_range == "0")[0][ 0] # coords stop right before a line containing 0 insert_coords_string = insert_initial_range[:insert_stop] insert_coords = np.fromstring(",".join(insert_coords_string), sep=",") insert_data[telfilepath]["x"].append(insert_coords[0::2] / 10) insert_data[telfilepath]["y"].append(insert_coords[1::2] / 10) for telfilepath in filepath_list: insert_data[telfilepath]["width"] = [] insert_data[telfilepath]["length"] = [] insert_data[telfilepath]["circle_centre"] = [] insert_data[telfilepath]["P/A"] = [] for i in range(len(insert_data[telfilepath]["reference_index"])): width, length, circle_centre = electronfactors.parameterise_insert( insert_data[telfilepath]["x"][i], insert_data[telfilepath]["y"][i]) insert_data[telfilepath]["width"].append(width) insert_data[telfilepath]["length"].append(length) insert_data[telfilepath]["circle_centre"].append(circle_centre) insert_data[telfilepath]["P/A"].append( electronfactors.convert2_ratio_perim_area(width, length)) data_filename = r"S:\Physics\RCCC Specific Files\Dosimetry\Elekta_EFacs\electron_factor_measured_data.csv" data = pd.read_csv(data_filename) width_data = data["Width (cm @ 100SSD)"] length_data = data["Length (cm @ 100SSD)"] factor_data = data["RCCC Inverse factor (dose open / dose cutout)"] p_on_a_data = electronfactors.convert2_ratio_perim_area( width_data, length_data) for telfilepath in filepath_list: insert_data[telfilepath]["model_factor"] = [] for i in range(len(insert_data[telfilepath]["reference_index"])): applicator = float(insert_data[telfilepath]["applicators"][i]) energy = float(insert_data[telfilepath]["energies"][i]) ssd = 100 reference = ((data["Energy (MeV)"] == energy) & (data["Applicator (cm)"] == applicator) & (data["SSD (cm)"] == ssd)) number_of_measurements = np.sum(reference) if number_of_measurements < 8: insert_data[telfilepath]["model_factor"].append(np.nan) else: insert_data[telfilepath]["model_factor"].append( electronfactors.spline_model_with_deformability( insert_data[telfilepath]["width"], insert_data[telfilepath]["P/A"], width_data[reference], p_on_a_data[reference], factor_data[reference], )[0]) for telfilepath in filepath_list: st.write("---") st.write("Filepath: `{}`".format(telfilepath)) for i in range(len(insert_data[telfilepath]["reference_index"])): applicator = float(insert_data[telfilepath]["applicators"][i]) energy = float(insert_data[telfilepath]["energies"][i]) ssd = 100 st.write("Applicator: `{} cm` | Energy: `{} MeV`".format( applicator, energy)) width = insert_data[telfilepath]["width"][i] length = insert_data[telfilepath]["length"][i] plt.figure() plot_insert( insert_data[telfilepath]["x"][i], insert_data[telfilepath]["y"][i], insert_data[telfilepath]["width"][i], insert_data[telfilepath]["length"][i], insert_data[telfilepath]["circle_centre"][i], ) reference = ((data["Energy (MeV)"] == energy) & (data["Applicator (cm)"] == applicator) & (data["SSD (cm)"] == ssd)) number_of_measurements = np.sum(reference) plt.figure() if number_of_measurements < 8: plt.scatter( width_data[reference], length_data[reference], s=100, c=factor_data[reference], cmap="viridis", zorder=2, ) plt.colorbar() else: plot_model( width_data[reference], length_data[reference], factor_data[reference], ) reference_data_table = pd.concat( [ width_data[reference], length_data[reference], factor_data[reference] ], axis=1, ) reference_data_table.sort_values( ["RCCC Inverse factor (dose open / dose cutout)"], ascending=False, inplace=True, ) st.write(reference_data_table) st.pyplot() factor = insert_data[telfilepath]["model_factor"][i] st.write( "Width: `{0:0.2f} cm` | Length: `{1:0.2f} cm` | Factor: `{2:0.3f}`" .format(width, length, factor))
def run_calculation( reference_results, evaluation_results, gamma_options, escan_directory, png_output_directory, ): st.write("Calculating Reference MU Density...") reference_mudensity = calculate_batch_mudensity( reference_results["deliveries"]) st.write("Calculating Evaluation MU Density...") evaluation_mudensity = calculate_batch_mudensity( evaluation_results["deliveries"]) st.write("Calculating Gamma...") gamma = calculate_gamma(reference_mudensity, evaluation_mudensity, gamma_options) patient_id = reference_results["patient_id"] st.write("Creating figure...") output_base_filename = ( f"{patient_id} {reference_results['identifier']} vs " f"{evaluation_results['identifier']}") pdf_filepath = str( escan_directory.joinpath(f"{output_base_filename}.pdf").resolve()) png_record_directory = png_output_directory.joinpath(output_base_filename) png_record_directory.mkdir(exist_ok=True) png_filepath = str(png_record_directory.joinpath("report.png").resolve()) try: patient_name_text = f"Patient Name: {reference_results['patient_name']}\n" except KeyError: patient_name_text = "" header_text = (f"Patient ID: {patient_id}\n" f"{patient_name_text}" f"Reference: {reference_results['identifier']}\n" f"Evaluation: {evaluation_results['identifier']}\n") reference_path_strings = "\n ".join( [str(path.resolve()) for path in reference_results["data_paths"]]) evaluation_path_strings = "\n ".join( [str(path.resolve()) for path in evaluation_results["data_paths"]]) footer_text = (f"reference path(s): {reference_path_strings}\n" f"evaluation path(s): {evaluation_path_strings}\n" f"png record: {png_filepath}") fig = plot_and_save_results( reference_mudensity, evaluation_mudensity, gamma, gamma_options, png_record_directory, header_text=header_text, footer_text=footer_text, ) fig.tight_layout() st.write("## Results") st.pyplot(fig) st.write("## Saving reports") st.write("### PNG") st.write("Saving figure as PNG...") plt.savefig(png_filepath, dpi=100) st.write(f"Saved:\n\n`{png_filepath}`") convert_png_to_pdf(png_filepath, pdf_filepath)