Categorias
Artigos Bioinformática Python

Como ler um arquivo mmCIF

usando Python

Macromolecular Crystallographic Information File (mmCIF), também conhecido como PDBx, é o novo formato usado para armazenamento de estruturas de proteínas e outras macromoléculas, que surgiu para substituir o formato PDB.

Similar aos arquivos PDB, os átomos são armazenados em linhas iniciadas com a palavra ATOM.

Observe um exemplo a seguir no formato mmCIF (ID: 1BGA):

ATOM   1     N N   . THR A 1 1   ? 61.990  84.851  70.908 1.00 32.14 ? 2   THR A N   1 
ATOM   2     C CA  . THR A 1 1   ? 62.828  85.531  69.934 1.00 20.14 ? 2   THR A CA  1 
ATOM   3     C C   . THR A 1 1   ? 62.799  85.087  68.476 1.00 17.99 ? 2   THR A C   1 
ATOM   4     O O   . THR A 1 1   ? 62.825  83.895  68.164 1.00 18.99 ? 2   THR A O   1 
ATOM   5     C CB  . THR A 1 1   ? 64.279  85.578  70.437 1.00 17.25 ? 2   THR A CB  1 
ATOM   6     O OG1 . THR A 1 1   ? 64.266  85.699  71.855 1.00 15.05 ? 2   THR A OG1 1 
ATOM   7     C CG2 . THR A 1 1   ? 65.017  86.785  69.894 1.00 15.54 ? 2   THR A CG2 1 
ATOM   8     N N   . ILE A 1 2   ? 62.751  86.085  67.597 1.00 13.43 ? 3   ILE A N   1 
ATOM   9     C CA  . ILE A 1 2   ? 62.752  85.907  66.153 1.00 15.97 ? 3   ILE A CA  1 
ATOM   10    C C   . ILE A 1 2   ? 64.130  86.302  65.611 1.00 15.81 ? 3   ILE A C   1 

Veja o mesmo conteúdo no formato PDB (ID: 1BGA):

ATOM      1  N   THR A   2      61.990  84.851  70.908  1.00 32.14           N  
ATOM      2  CA  THR A   2      62.828  85.531  69.934  1.00 20.14           C  
ATOM      3  C   THR A   2      62.799  85.087  68.476  1.00 17.99           C  
ATOM      4  O   THR A   2      62.825  83.895  68.164  1.00 18.99           O  
ATOM      5  CB  THR A   2      64.279  85.578  70.437  1.00 17.25           C  
ATOM      6  OG1 THR A   2      64.266  85.699  71.855  1.00 15.05           O  
ATOM      7  CG2 THR A   2      65.017  86.785  69.894  1.00 15.54           C  
ATOM      8  N   ILE A   3      62.751  86.085  67.597  1.00 13.43           N  
ATOM      9  CA  ILE A   3      62.752  85.907  66.153  1.00 15.97           C  
ATOM     10  C   ILE A   3      64.130  86.302  65.611  1.00 15.81           C  

No formato PDB, as informações estão em posições específicas, conforme pode ser visto na figura a seguir:

Formato PDB.

No formato PDBx (mmCIF), as posições das informações nas colunas podem variar de acordo com o arquivo de entrada. Para descobrir quais posições correspondem, você deve analisar as linhas iniciadas em _atom.site. que precedem as linhas iniciadas em ATOM.

No arquivo 2LZM.cif, as linhas de átomos armazenam 21 diferentes informações. A ordem de cada atributo indicará em que posição da linha ATOM ele estará. Observe o exemplo a seguir:

# loop_
# _atom_site.group_PDB            ATOM
# _atom_site.id                   2
# _atom_site.type_symbol          C
# _atom_site.label_atom_id        CA
# _atom_site.label_alt_id         .
# _atom_site.label_comp_id        MET
# _atom_site.label_asym_id        A
# _atom_site.label_entity_id      1
# _atom_site.label_seq_id         1
# _atom_site.pdbx_PDB_ins_code    ?
# _atom_site.Cartn_x              43.783 
# _atom_site.Cartn_y              -1.951 
# _atom_site.Cartn_z              8.984
# _atom_site.occupancy            1.00
# _atom_site.B_iso_or_equiv       29.12
# _atom_site.pdbx_formal_charge   ? 
# _atom_site.auth_seq_id          1
# _atom_site.auth_comp_id         MET
# _atom_site.auth_asym_id         A
# _atom_site.auth_atom_id         CA
# _atom_site.pdbx_PDB_model_num   1
# ATOM [...]

Ao final de cada linha foi adicionado um exemplo de dado que o campo em questão corresponde (o formato original não possui esse exemplo).

Note que o atributo _atom_site.id é o segundo item da lista, logo em cada linha de átomo, o id será o segundo valor exibido (os valores podem ser separados por um número variado de espaços).

Observe como podemos ler um arquivo PDBx usando Python:

# Lendo arquivo mmCIF

entrada = "2lzm.cif"

# obter as linhas
with open(entrada) as f:
    linhas = f.readlines()

col = []    # colunas dos átomos no formato mmcif
atoms = []  # lista de átomos

# Obtendo as informações de colunas
for linha in linhas:
    if linha.startswith("_atom_site."):
        col.append(linha[11:].strip())

# Colunas indicam a ordem das informações nas linhas ATOM
x_index = col.index('Cartn_x')
y_index = col.index('Cartn_y')
z_index = col.index('Cartn_z')
cadeia_index = col.index('label_asym_id')
resn_index = col.index('label_comp_id')
resid_index = col.index('label_seq_id')
atom_name_index = col.index('label_atom_id')
atom_id_index = col.index('id')

# Coletando os átomos
for linha in linhas:
    if linha.startswith("ATOM"):
        linha = linha.split()

        x = linha[x_index]
        y = linha[y_index]
        z = linha[z_index]
        cadeia = linha[cadeia_index]
        resn = linha[resn_index]
        resid = linha[resid_index]
        atom_name = linha[atom_name_index]
        atom_id = linha[atom_id_index]

        atoms.append({
            "x":x, 
            "y":y, 
            "z":z,
            "cadeia":cadeia,
            "resn":resn,
            "resid":resid,
            "atom_name":atom_name,
            "atom_id":atom_id
        })

aa = {'ALA':'A','ARG':'R','ASN':'N','ASP':'D','CYS':'C','GLU':'E','GLN':'Q','GLY':'G','HIS':'H',
'ILE':'I','LEU':'L','LYS':'K','MET':'M','PHE':'F','PRO':'P','SER':'S','THR':'T','TRP':'W',
'TYR':'Y','VAL':'V','SEC':'U','PYL':'O','HYP':'O','MSE':'M','PCA':'Q','HID':'H','HIP':'H'}

# print(atoms)
for i in atoms:
    if i['atom_name'] == 'CA':
        # AMINOÁCIDO_ID : CADEIA
        print(aa[i['resn']]+i['resid']+":"+i["cadeia"])

Ao executar este código, você cada aminoácido, seu número e a cadeia:

M1:A
N2:A
I3:A
F4:A
E5:A
[...]

Por Diego Mariano

Doutor em Bioinformática pela Universidade Federal de Minas Gerais com atuação na área de ciência de dados e aprendizado de máquina aplicados ao aperfeiçoamento de enzimas usadas na produção de biocombustíveis. Mestre em Bioinformática, também pela UFMG, atuando na área de desenvolvimento de sistemas Web para montagem de genomas. Atualmente realiza estágio pós-doutoral no Departamento de Ciência da Computação da UFMG com foco em desenvolvimento de sistemas Web para Bioinformática, análise exploratória e visualização de dados. Tem conhecimentos nas linguagens: PHP, JavaScript, Python, R, Perl, HTML, CSS e SQL.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

error

Compartilhe este post!

Facebook
YouTube
LinkedIn
Instagram