class QuerySQL: def __init__(self, table_name, condition_str, unique=False): table_name = table_name.lower() if table_name in {'beams', 'dvhs', 'plans', 'rxs'}: self.table_name = table_name self.condition_str = condition_str self.cnx = DVH_SQL() # column names, use as property names column_cursor = self.cnx.get_column_names(table_name) for row in column_cursor: column = str(row).strip() if column not in {'roi_coord_string, distances_to_ptv, dth_string'}: self.cursor = self.cnx.query(self.table_name, column, self.condition_str) if unique: rtn_list = get_unique_list(self.cursor_to_list()) else: rtn_list = self.cursor_to_list() setattr(self, column, rtn_list) else: print('Table name in valid. Please select from Beams, DVHs, Plans, or Rxs.') def cursor_to_list(self): rtn_list = [] for row in self.cursor: if isinstance(row[0], (int, long, float)): rtn_list.append(row[0]) else: rtn_list.append(str(row[0])) return rtn_list
def __init__(self, uid=None, dvh_condition=None): """ This class will retrieve DVHs and other data in the DVH SQL table meeting the given constraints, it will also parse the DVH_string into python lists and retrieve the associated Rx dose :param uid: a list of allowed study_instance_uids in data set :param dvh_condition: a string in SQL syntax applied to a DVH Table query """ if uid: constraints_str = "study_instance_uid in ('%s')" % "', '".join(uid) if dvh_condition: constraints_str = " and " + constraints_str else: constraints_str = '' if dvh_condition: constraints_str = "(%s)%s" % (dvh_condition, constraints_str) self.query = dvh_condition else: self.query = '' cnx = DVH_SQL() # Get DVH data from SQL dvh_data = QuerySQL('DVHs', constraints_str) for key, value in dvh_data.__dict__.items(): if not key.startswith("__"): setattr(self, key, value) # Add these properties to dvh_data since they aren't in the DVHs SQL table self.count = len(self.mrn) self.rx_dose = [] self.bin_count = 0 for value in self.dvh_string: current_dvh_str = np.array(str(value).split(',')) current_size = np.size(current_dvh_str) if current_size > self.bin_count: self.bin_count = current_size self.dvh = np.zeros([self.bin_count, self.count]) # Get needed values not in DVHs table for i in range(self.count): # Get Rx Doses condition = "mrn = '%s' and study_instance_uid = '%s'" % ( self.mrn[i], self.study_instance_uid[i]) rx_dose_cursor = cnx.query('Plans', 'rx_dose', condition) self.rx_dose.append(rx_dose_cursor[0][0]) # Process dvh_string to numpy array, and pad with zeros at the end # so that all dvhs are the same length current_dvh = np.array(self.dvh_string[i].split(','), dtype='|S4').astype(np.float) current_dvh_max = np.max(current_dvh) if current_dvh_max > 0: current_dvh = np.divide(current_dvh, current_dvh_max) zero_fill = np.zeros(self.bin_count - len(current_dvh)) self.dvh[:, i] = np.concatenate((current_dvh, zero_fill))
def get_physician_from_uid(uid): cnx = DVH_SQL() condition = "study_instance_uid = '" + uid + "'" results = cnx.query('Plans', 'physician', condition) if len(results) > 1: print('Warning: multiple plans with this study_instance_uid exist') return str(results[0][0])
def __init__(self, **kwargs): if 'uid' in kwargs: study_instance_uid = kwargs['uid'] db_constraints_list = [] for i in range(0, len(study_instance_uid)): db_constraints_list.append(study_instance_uid[i]) uid_constraints_str = "study_instance_uid in ('" uid_constraints_str += "', '".join(db_constraints_list) uid_constraints_str += "')" if 'dvh_condition' in kwargs and kwargs['dvh_condition']: uid_constraints_str = " and " + uid_constraints_str else: uid_constraints_str = '' if 'dvh_condition' in kwargs and kwargs['dvh_condition']: uid_constraints_str = '(' + kwargs['dvh_condition'] + ')' + uid_constraints_str self.query = kwargs['dvh_condition'] else: self.query = '' if 'uncategorized' in kwargs: if kwargs['uncategorized']: self.uncategorized = True else: self.uncategorized = False else: self.uncategorized = False cnx = DVH_SQL() # Get DVH data from SQL dvh_data = QuerySQL('DVHs', uid_constraints_str) for key, value in dvh_data.__dict__.items(): if not key.startswith("__"): setattr(self, key, value) # Add this properties to dvh_data since they aren't in the DVHs SQL table self.count = len(self.mrn) setattr(self, 'rx_dose', []) self.bin_count = 0 for value in self.dvh_string: current_dvh_str = np.array(str(value).split(',')) current_size = np.size(current_dvh_str) if current_size > self.bin_count: self.bin_count = current_size setattr(self, 'dvh', np.zeros([self.bin_count, self.count])) # Get needed values not in DVHs table for i in range(0, self.count): # Get Rx Doses condition = "mrn = '" + self.mrn[i] condition += "' and study_instance_uid = '" condition += str(self.study_instance_uid[i]) + "'" rx_dose_cursor = cnx.query('Plans', 'rx_dose', condition) self.rx_dose.append(rx_dose_cursor[0][0]) # Process dvh_string to numpy array, and pad with zeros at the end # so that all dvhs are the same length current_dvh = np.array(self.dvh_string[i].split(','), dtype='|S4').astype(np.float) if np.max(current_dvh) > 0: current_dvh = np.divide(current_dvh, np.max(current_dvh)) zero_fill = np.zeros(self.bin_count - len(current_dvh)) self.dvh[:, i] = np.concatenate((current_dvh, zero_fill))