<jupyter_start><jupyter_text>Exemplo: Extração de informação de ficheiros de resultados de metabolómica. [MassTRIX](http://www.masstrix.org), (_Mass TRanslator into Pathways_) [1] é um serviço online de tratamento de dados de metabolómica.A funcionalidade primária é a identificação de compostos a partir de listas de massas e intensidades obtidas por análise de amostras biológicas por Espectrometria de Massa.O resultado da identificação é disponibilizado em vários ficheiros de texto. Num dos formatos, cada linha do ficheiro diz respeito a um pico de massa e apresenta, de entre outros, os compostos identificados com aquela massa, bem como as anotações das vias celulares em que esses compostos podem estar envolvidos.Pretende-se ilustrar o uso programático da leitura de ficheiros e as operações com _strings_ com um exemplo da **extração da informação contida num desses ficheiros**.[1] <NAME> and <NAME> (2008) MassTRIX: Mass TRanslator Into Pathways, _Nucleic Acids Research_, **36**, Web Server issue, W481-W484.  Nota Este notebook usa como exemplo um ficheiro chamado `masses.annotated.reformat.tsv`, mas este nome deve ser alterado, **se necessário**, para nome do ficheiro de resultados que é obtido de uma busca no MassTRIX.<jupyter_code>nome_fich_dados = 'masses.annotated.reformat.tsv' # alterar para o nome correto<jupyter_output><empty_output><jupyter_text>Extração da informação Como resultado da análise são criados 2 dicionários:<jupyter_code>compostos = {}
# Este dicionário associa a cada KEGG_cid um dicionário com

# 'nome'     : a string com o primeiro nome atribuído ao composto
# 'ids_vias' : uma lista de Ids das vias associadas ao composto
# 'vias'     : uma lista das vias associadas ao composto

vias = {}

# Este dicionário associa a cada KEGG Pathways Id (o Id da via) um dicionário com

# 'nome'          : a string com o nome da via
# 'ids_compostos' : uma lista de Ids dos compostos associados à via
# 'compostos'     : uma lista dos nomes dos compostos associados à via
with open(nome_fich_dados) as f:
    linhas = f.read().splitlines()

headers = linhas[-1].split('\t')

for linha in linhas[:-1]:
    info = {}
    partes_linha = linha.split('\t')
    
    for h, c in zip(headers, partes_linha):
        info[h] = c.split('#')

    for comp, nomes, v_ids, v in zip(info['KEGG_cid'],
                                     info['KEGG_name'],
                                     info['KEGG Pathways'],
                                     info['KEGG Pathways descriptions']):

        if comp not in compostos: # se já existe, não voltar a adicionar ao dicionário
            
            # usar só o primeiro nome (e esperar que seja o melhor)
            nome = nomes.split(';')[0]
            
            compostos[comp] = {'nome': nome, 'ids_vias' : [], 'vias' : []}

            if v != 'null':
                compostos[comp]['ids_vias'] = v_ids.strip(';').split(';')
                compostos[comp]['vias'] = v.strip(';').split(';')


print(len(compostos), 'compostos')

for c in compostos: # c é o Id de cada composto
    for nome_via, via_id in zip(compostos[c]['vias'], compostos[c]['ids_vias']):
        nome_composto = compostos[c]['nome']
        if via_id not in vias:
            # é a primeira vez que é encontrada
            vias[via_id] = {'nome': nome_via, 
                            'ids_compostos': [c], 
                            'compostos': [nome_composto]}
        else:
            # já existe, acrescentar este composto
            vias[via_id]['ids_compostos'].append(c)
            vias[via_id]['compostos'].append(nome_composto)

print(len(vias), 'vias')<jupyter_output><empty_output><jupyter_text>RETIRAR (ou adaptar) A CÉLULA SEGUINTE! (verifica a existência de compostos e de vias, mas aplica-se aos dados do ficheiro de exemplo)<jupyter_code>print('\n---- composto C00988: -----')
c = compostos['C00988']
print(c['nome'], '\n')
for id_v, v in zip(c['ids_vias'], c['vias']):
    print(id_v, ':', v)

print('\n---- composto C00079: -----')
c = compostos['C00079']
print(c['nome'], '\n')
for id_v, v in zip(c['ids_vias'], c['vias']):
    print(id_v, ':', v)
    
print('\n---- via ko00630: -----')
print(vias['ko00630']['nome'])
print('\nCompostos:')
for c in vias['ko00630']['compostos']:
    print(c)<jupyter_output><empty_output><jupyter_text>Criação de ficheiros com a informação extraídaVamos criar ficheiros de texto com a informação extraída para mais tarde poder ser usada.Vamos criar um ficheiro chamado `compostos.txt` e outro chamado `vias.txt`As vias estão listadas por ordem decrescente do número de compostos encontrados.<jupyter_code>with open('compostos.txt', 'w') as f:
    print('Id', 'nome', 'Ids vias', 'vias', file=f, sep='\t')
    
    for c, info in compostos.items():
        Ids_vias = '|'.join(info['ids_vias'])
        nomes_vias = '|'.join(info['vias'])
        print(c, info['nome'], Ids_vias, nomes_vias, file=f, sep='\t')

# ordenar as vias por número de compostos
contagens_compostos_em_vias = [(len(vias[k]['compostos']), k) for k in vias]
contagens_compostos_em_vias.sort(reverse=True)
# reverse=True indica que a ordenação é por ordem decrescente

with open('vias.txt', 'w') as f:
    print('Id via', 'nome via', 'n compostos', 'Ids compostos', 'compostos', file=f, sep='\t')
    
    for c, via in contagens_compostos_em_vias:
        infovia = vias[via]
        print(via, infovia['nome'], c, 
              '|'.join(infovia['ids_compostos']),
              '|'.join(infovia['compostos']), sep='\t', file=f)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12558558558558558, 'fraction_numerical': 0.00954954954954955, 'mean_word_length': 3.3708661417322836, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '188267', 'license': 'MIT', 'n_tokens_mistral': 2004, 'n_tokens_neox': 1960, 'n_words': 575, 'path': 'MassTRIX/masstrix_analysis.ipynb', 'repo_name': 'aeferreira/da_notebooks', 'size': '5564'}