Como ler um arquivo mmCIF
Resumo: 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:
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
[...]
URL Original da postagem: Read More
Deixe uma resposta