コード例 #1
0
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)
コード例 #2
0
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])
コード例 #3
0
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))
コード例 #4
0
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))
コード例 #5
0
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))
コード例 #6
0
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])
コード例 #7
0
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))
コード例 #8
0
ファイル: update.py プロジェクト: justin13601/DVH-Analytics
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)
コード例 #9
0
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)