scout/parse/panel.py
def parse_genes(gene_lines):
    """Parse a file with genes and return the hgnc ids

    Args:
        gene_lines(iterable(str)): Stream with genes

    Returns:
        genes(list(dict)): Dictionaries with relevant gene info
    """
    genes = []
    header = []
    hgnc_identifiers = set()
    delimiter = '\t'
    # This can be '\t' or ';'
    delimiters = ['\t', ' ', ';']

    # There are files that have '#' to indicate headers
    # There are some files that start with a header line without
    # any special symbol
    for i,line in enumerate(gene_lines):
        line = line.rstrip()
        if not len(line) > 0:
            continue
        if line.startswith('#'):
            if not line.startswith('##'):
                # We need to try delimiters
                # We prefer ';' or '\t' byt should accept ' '
                line_length = 0
                delimiter = None
                for alt in delimiters:
                    head_line = line.split(alt)
                    if len(head_line) > line_length:
                        line_length = len(head_line)
                        delimiter = alt

                header = [word.lower() for word in line[1:].split(delimiter)]
        else:
            # If no header symbol(#) assume first line is header
            if i == 0:
                line_length = 0
                for alt in delimiters:
                    head_line = line.split(alt)
                    if len(head_line) > line_length:
                        line_length = len(head_line)
                        delimiter = alt
                
                if ('hgnc' in line or 'HGNC' in line):
                    header = [word.lower() for word in line.split(delimiter)]
                    continue
                # If first line is not a header try to sniff what the first
                # columns holds
                if line.split(delimiter)[0].isdigit():
                    header = ['hgnc_id']
                else:
                    header = ['hgnc_symbol']

            splitted_line = line.split(delimiter)
            gene_info = dict(zip(header, splitted_line))

            # There are cases when excel exports empty lines that looks like
            # ;;;;;;;. This is a exception to handle these
            info_found = False
            for key in gene_info:
                if gene_info[key]:
                    info_found = True
                    break
            # If no info was found we skip that line
            if not info_found:
                continue

            try:
                gene = parse_gene(gene_info)
            except Exception as e:
                LOG.warning(e)
                raise SyntaxError("Line {0} is malformed".format(i + 1))

            identifier = gene.pop('identifier')

            if not identifier in hgnc_identifiers:
                hgnc_identifiers.add(identifier)
                genes.append(gene)

    return genes
def parse_genes(gene_lines):
    genes = []
    header = []
    hgnc_identifiers = set()
    delimiter = '\t'
    # This can be '\t' or ';'
    delimiters = ['\t', ' ', ';']

    # There are files that have '#' to indicate headers
    # There are some files that start with a header line without
    # any special symbol
    for i,line in enumerate(gene_lines):
        line = line.rstrip()
        if not len(line) > 0:
            continue
        if line.startswith('#'):
            if not line.startswith('##'):
                # We need to try delimiters
                # We prefer ';' or '\t' byt should accept ' '
                line_length = 0
                delimiter = None
                for alt in delimiters:
                    head_line = line.split(alt)
                    if len(head_line) > line_length:
                        line_length = len(head_line)
                        delimiter = alt

                header = [word.lower() for word in line[1:].split(delimiter)]
        else:
            # If no header symbol(#) assume first line is header
            if i == 0:
                line_length = 0
                for alt in delimiters:
                    head_line = line.split(alt)
                    if len(head_line) > line_length:
                        line_length = len(head_line)
                        delimiter = alt
                
                if ('hgnc' in line or 'HGNC' in line):
                    header = [word.lower() for word in line.split(delimiter)]
                    continue
                # If first line is not a header try to sniff what the first
                # columns holds
                if line.split(delimiter)[0].isdigit():
                    header = ['hgnc_id']
                else:
                    header = ['hgnc_symbol']

            splitted_line = line.split(delimiter)
            gene_info = dict(zip(header, splitted_line))

            # There are cases when excel exports empty lines that looks like
            # ;;;;;;;. This is a exception to handle these
            info_found = False
            for key in gene_info:
                if gene_info[key]:
                    info_found = True
                    break
            # If no info was found we skip that line
            if not info_found:
                continue

            try:
                gene = parse_gene(gene_info)
            except Exception as e:
                LOG.warning(e)
                raise SyntaxError("Line {0} is malformed".format(i + 1))

            identifier = gene.pop('identifier')

            if not identifier in hgnc_identifiers:
                hgnc_identifiers.add(identifier)
                genes.append(gene)

    return genes
def parse_genes ( gene_lines ) : genes = [ ] header = [ ] hgnc_identifiers = set ( ) delimiter = '\t' # This can be '\t' or ';' delimiters = [ '\t' , ' ' , ';' ] # There are files that have '#' to indicate headers # There are some files that start with a header line without # any special symbol for i , line in enumerate ( gene_lines ) : line = line . rstrip ( ) if not len ( line ) > 0 : continue if line . startswith ( '#' ) : if not line . startswith ( '##' ) : # We need to try delimiters # We prefer ';' or '\t' byt should accept ' ' line_length = 0 delimiter = None for alt in delimiters : head_line = line . split ( alt ) if len ( head_line ) > line_length : line_length = len ( head_line ) delimiter = alt header = [ word . lower ( ) for word in line [ 1 : ] . split ( delimiter ) ] else : # If no header symbol(#) assume first line is header if i == 0 : line_length = 0 for alt in delimiters : head_line = line . split ( alt ) if len ( head_line ) > line_length : line_length = len ( head_line ) delimiter = alt if ( 'hgnc' in line or 'HGNC' in line ) : header = [ word . lower ( ) for word in line . split ( delimiter ) ] continue # If first line is not a header try to sniff what the first # columns holds if line . split ( delimiter ) [ 0 ] . isdigit ( ) : header = [ 'hgnc_id' ] else : header = [ 'hgnc_symbol' ] splitted_line = line . split ( delimiter ) gene_info = dict ( zip ( header , splitted_line ) ) # There are cases when excel exports empty lines that looks like # ;;;;;;;. This is a exception to handle these info_found = False for key in gene_info : if gene_info [ key ] : info_found = True break # If no info was found we skip that line if not info_found : continue try : gene = parse_gene ( gene_info ) except Exception as e : LOG . warning ( e ) raise SyntaxError ( "Line {0} is malformed" . format ( i + 1 ) ) identifier = gene . pop ( 'identifier' ) if not identifier in hgnc_identifiers : hgnc_identifiers . add ( identifier ) genes . append ( gene ) return genes
Parse a file with genes and return the hgnc ids

    Args:
        gene_lines(iterable(str)): Stream with genes

    Returns:
        genes(list(dict)): Dictionaries with relevant gene info
Parse a file with genes and return the hgnc ids