def get_total_treatment_volume_of_study(study_instance_uid): """ Calculate combined PTV for the provided study_instance_uid """ ptv_coordinates_strings = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_type like 'PTV%%'" % study_instance_uid) ptvs = [roi_form.get_planes_from_string(ptv[0]) for ptv in ptv_coordinates_strings] return roi_geom.union(ptvs)
def cross_section(study_instance_uid, roi_name): """ Recalculate the centroid of an roi based on data in the SQL DB. """ coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) roi = roi_form.get_planes_from_string(coordinates_string[0][0]) area = roi_geom.cross_section(roi) for key in ['max', 'median']: update_dvhs_table(study_instance_uid, roi_name, 'cross_section_%s' % key, area[key])
def surface_area(study_instance_uid, roi_name): """ Recalculate the surface area of an roi based on data in the SQL DB. """ coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) roi = roi_form.get_planes_from_string(coordinates_string[0][0]) data = roi_geom.surface_area(roi, coord_type="sets_of_points") update_dvhs_table(study_instance_uid, roi_name, 'surface_area', round(float(data), 2))
def volumes(study_instance_uid, roi_name): """ Recalculate the volume of an roi based on data in the SQL DB. """ coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) roi = roi_form.get_planes_from_string(coordinates_string[0][0]) data = roi_geom.volume(roi) update_dvhs_table(study_instance_uid, roi_name, 'volume', round(float(data), 2))
def centroid(study_instance_uid, roi_name): """ Recalculate the centroid of an roi based on data in the SQL DB. """ coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) roi = roi_form.get_planes_from_string(coordinates_string[0][0]) data = roi_geom.centroid(roi) data = [str(round(v, 3)) for v in data] update_dvhs_table(study_instance_uid, roi_name, 'centroid', ','.join(data))
def spread(study_instance_uid, roi_name): """ Recalculate the spread of an roi based on data in the SQL DB. """ coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) roi = roi_form.get_planes_from_string(coordinates_string[0][0]) data = roi_geom.spread(roi) data = [str(round(v/10., 3)) for v in data] for i, column in enumerate(['spread_x', 'spread_y', 'spread_z']): update_dvhs_table(study_instance_uid, roi_name, column, data[i])
def treatment_volume_overlap(study_instance_uid, roi_name, pre_calc=None): """ Recalculate the PTV overlap of an roi based on data in the SQL DB. Optional provide union of PTVs, return from get_total_treatment_volume_of_study """ oar_coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) oar = roi_form.get_planes_from_string(oar_coordinates_string[0][0]) treatment_volume = pre_calc if treatment_volume is None: treatment_volume = get_total_treatment_volume_of_study(study_instance_uid) overlap = roi_geom.overlap_volume(oar, treatment_volume) update_dvhs_table(study_instance_uid, roi_name, 'ptv_overlap', round(float(overlap), 2))
def get_total_treatment_volume_of_study(study_instance_uid, ptvs=None): """ Calculate combined PTV for the provided study_instance_uid """ condition = "study_instance_uid = '%s' and roi_type like 'PTV%%'" % study_instance_uid if ptvs: condition += " and roi_name in ('%s')" % "','".join(ptvs) ptv_coordinates_strings = query('dvhs', 'roi_coord_string', condition) ptvs = [ roi_form.get_planes_from_string(ptv[0]) for ptv in ptv_coordinates_strings ] return roi_geom.union(ptvs)
def min_distances(study_instance_uid, roi_name, pre_calc=None): """ Recalculate the min, mean, median, and max PTV distances an roi based on data in the SQL DB. Optionally provide coordinates of combined PTV, return from get_treatment_volume_coord """ oar_coordinates_string = query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_name = '%s'" % (study_instance_uid, roi_name)) treatment_volume_coord = pre_calc if treatment_volume_coord is None: with DVH_SQL() as cnx: ptv_coordinates_strings = cnx.query('dvhs', 'roi_coord_string', "study_instance_uid = '%s' and roi_type like 'PTV%%'" % study_instance_uid) ptvs = [roi_form.get_planes_from_string(ptv[0]) for ptv in ptv_coordinates_strings] treatment_volume_coord = roi_form.get_roi_coordinates_from_planes(roi_geom.union(ptvs)) oar_coordinates = roi_form.get_roi_coordinates_from_string(oar_coordinates_string[0][0]) treatment_volume_coord = sample_roi(treatment_volume_coord) oar_coordinates = sample_roi(oar_coordinates) try: data = roi_geom.min_distances_to_target(oar_coordinates, treatment_volume_coord) except MemoryError: try: treatment_volume_coord = sample_roi(treatment_volume_coord, max_point_count=3000) oar_coordinates = sample_roi(oar_coordinates, max_point_count=3000) data = roi_geom.min_distances_to_target(oar_coordinates, treatment_volume_coord) except MemoryError as e: print("Memory Error: ", e) print('Error reported for %s with study_instance_uid %s' % (roi_name, study_instance_uid)) print('Skipping PTV distance and DTH calculations for this ROI.') data = None except Exception as e: print('Error: ', e) print('Error reported for %s with study_instance_uid %s' % (roi_name, study_instance_uid)) print('Skipping PTV distance and DTH calculations for this ROI.') data = None if data is not None: try: dth = roi_geom.dth(data) dth_string = ','.join(['%.3f' % num for num in dth]) data_map = {'dist_to_ptv_min': round(float(np.min(data)), 2), 'dist_to_ptv_mean': round(float(np.mean(data)), 2), 'dist_to_ptv_median': round(float(np.median(data)), 2), 'dist_to_ptv_max': round(float(np.max(data)), 2), 'dth_string': dth_string} except MemoryError as e: print("Memory Error: ", e) print('Error reported for %s with study_instance_uid %s' % (roi_name, study_instance_uid)) print('Skipping PTV distance and DTH calculations for this ROI.') data_map = None if data_map: for key, value in data_map.items(): update_dvhs_table(study_instance_uid, roi_name, key, value)