def __check_usergroup(self): LOGGER.debug('Checking if user is in docker usergroup') process = subprocess.Popen(['groups'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, _ = process.communicate() groups = output.decode('utf-8').split() if 'docker' in groups: return True else: return False
def __check_docker_client(self): LOGGER.debug('Checking if docker client exist.') process = subprocess.Popen(['which', 'docker'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, _ = process.communicate() decoded = output.decode('utf-8') if decoded != '': return True else: return False
def __update_replacements(self, cdecode, is_raw_header=False): self.func_replace_trg_listbox.delete(0, tk.END) if is_raw_header: cdename = self.parent.cdemapper.get_cde_mipmap_header(cdecode) else: cdename = cdecode current_replacements = self.parent.cdemapper.get_corr_replacements( cdename) if current_replacements: LOGGER.debug('Replacements found for cde "{}": {}'.format( cdecode, len(current_replacements))) for rep in current_replacements: self.__add_replacement(rep.source, rep.target)
def add_replacement_expr(self): reps = self.func_replace_trg_listbox.get(0, tk.END) replacemnts = [] source_col = self.parent.csv_name.replace( ".csv", "") + '.' + self.selected_column LOGGER.debug('the repleacements are: {}'.format(reps)) if len(reps) > 0: self.expressions_text.delete("1.0", "end-1c") for rep in reps: s = rep.split('->') replacemnts.append(Replacement(s[0], s[1])) expr = ifstr(source_col, replacemnts) LOGGER.info('the expression is: {}'.format(expr)) self.expressions_text.insert('1.0', expr)
def __create_db_container(self): """Creates a postgres 9.6 container. """ self.__check_db_container(mode='running') self.__check_db_container(mode='exist') if self.__is_db_running: LOGGER.info('db container ({}) is already up and' ' running. Skipping creation step...'.format( self.__db_cont_name)) self.__remove_create_db() pass elif self.__is_db_exist and not self.__is_db_running: LOGGER.info('db container({}) already exists. ' 'Restarting db container'.format(self.__db_cont_name)) subprocess.run(['docker', 'restart', self.__db_cont_name]) time.sleep(10) self.__remove_create_db() else: # create the db container LOGGER.debug('Creating db container with name {}'.format( self.__db_cont_name)) arg_port = ['-p', '{}:5432'.format(self.__dbport)] arg_name = ['--name', self.__db_cont_name] arg_env1 = ['-e', 'POSTGRES_PASSWORD={}'.format(self.__dbpassword)] arg_env2 = ['-e', 'POSTGRES_USER={}'.format(self.__dbuser)] arg_img = ['-d', self.__db_image] command2 = ['docker', 'run' ] + arg_port + arg_name + arg_env1 + arg_env2 + arg_img try: createproc = subprocess.run(command2) time.sleep(50) self.__remove_create_db() except subprocess.CalledProcessError: LOGGER.warning( 'There was an error while attempting creating the db container.' ) raise DockerExecError( 'There was an error while attempting creating the db container.' )
def suggest_cde(self, columnreport, threshold=0.6): """Suggests the most similar CDE for the column. Arguments: :param columnreport: ColumnReport object with info of a datset column :param threshold: 0-1 similarity threshold, below that not a cde is suggested :returns: a CdeVariable object """ name = columnreport.name val_range = columnreport.value_range mip_type = columnreport.miptype LOGGER.debug('The incoming column name is: {}'.format(name)) # select cdes with tha same type and calculate similarity canditates = [ cde for cde in self.__cdes.values() if cde.miptype == mip_type ] LOGGER.debug('Number of cdes with miptype {} is: {}'.format( mip_type, len(canditates))) if canditates: canditates.sort(key=lambda x: x.similarity(name, val_range), reverse=True) canditate = canditates[0] similarity = canditate.similarity(name, val_range) LOGGER.debug( 'The simirarity between "{}" and cde "{}" is: {}'.format( name, canditate.code, similarity)) if similarity >= threshold: return canditate else: LOGGER.info( 'No cde match found for incoming column "{}"'.format(name)) return None else: LOGGER.info( 'No cde match found for incoming column "{}"'.format(name)) return None
def __is_mipmap_container_exist(self): proc_docker = subprocess.Popen(['docker', 'ps', '-a'], stdout=subprocess.PIPE) proc_grep = subprocess.Popen(['grep', self.__name], stdin=proc_docker.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, _ = proc_grep.communicate() output = str(stdout).split() LOGGER.debug(output) try: container_name = output[-1] # remove new line spacial character container_name = container_name.rstrip("\\n'") except IndexError: container_name = None if container_name == self.__name: return True else: return False
def __init__(self, rootfolder, username): """ Arguments: :param rootfolder: folder path with DICOMs subfolders :param username: str with the username """ start_time = time.time() self.reportdata = None self.rootfolder = rootfolder self.subfolders = getsubfolders(rootfolder) self.username = username self.dataset = { 'version': __version__, 'date_qc_ran': datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S'), 'username': username, 'dicomfolder': str(os.path.abspath(rootfolder)) } # files that are not DICOMS (.dcm) # list of (folder, filename) self.__notprocessed = [] # MRISequences objects self.__invalidseq = [] # MRIPatient objects self.__patients = [] # statistic info self.__totalvalidseq = 0 self.__totalstudies = 0 self.__totalinvaliddicoms = 0 self.__seriesdescriptions_valid = set() self.__seriesdescriptions_invalid = set() self.__seqperpatient_distr = { 's1': 0, 's2': 0, 's3-s5': 0, 's6more': 0, } self.__patientid_with_invalids = set() # Read all the dcm files and calc QC stats self.__readicoms_parallel(mp.cpu_count() + 1) self.__collect_stats() LOGGER.debug('Dicom analysis running time: %s seconds' % (time.time() - start_time)) LOGGER.debug('Folders read: %i' % len(self.subfolders)) LOGGER.debug('Total MRI sequences found: %i' % (self.totalvalidsequences + self.totalinvalidsequences)) LOGGER.info('Patients with good seq: %i' % self.totalpatients) LOGGER.info('Total visits: %i' % self.totalvisits) LOGGER.info('Good seq: %i' % self.totalvalidsequences) LOGGER.info('Bad seq: %i' % self.totalinvalidsequences) LOGGER.info('Files not processed: %i' % self.totalbadfiles)
def __add_replacement(self, sourcevalue, targetvalue): LOGGER.debug('Target value is: {} and the source value is: {}'.format( targetvalue, sourcevalue)) stringforbox = '->'.join([sourcevalue, targetvalue]) self.func_replace_trg_listbox.insert(tk.END, stringforbox)