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)
Exemple #5
0
    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)