Как Bio.PDB идентифицирует гетеро-остатки? - PullRequest
0 голосов
/ 09 мая 2018

Мне интересно, как Bio.PDB идентифицирует остаток как гетеро-остаток. Я знаю, что метод Остаток.ид возвращает кортеж, в котором первый элемент является гетеро-флагом, второй - идентификатором остатка (число), а третий - кодом вставки.

Но как внутренний код решает, что поместить в поле флага гетеро? Проверяет ли атомы в остатке записи HETATM против записей ATOM?

Или он проверяет имена атомов в каждом остатке и сравнивает их с некоторым набором гетероатомов?

Причина, по которой я спрашиваю, заключается в том, что в цепи 4MDH первый остаток в разделе координат - это АСЕ (ацетил). Он содержит только атомы C и O, и в файле PDB он указан как HETATM. Но когда для этого остатка вычерчивается идентификатор ('', 0, '').

Вот мой код:

>>> from Bio.PDB.mmtf import MMTFParser
>>> structure = MMTFParser.get_structure_from_url('4mdh')
/Library/Python/2.7/site-packages/Bio/PDB/StructureBuilder.py:89: PDBConstructionWarning: WARNING: Chain A is discontinuous at line 0.
  PDBConstructionWarning)
/Library/Python/2.7/site-packages/Bio/PDB/StructureBuilder.py:89: PDBConstructionWarning: WARNING: Chain B is discontinuous at line 0.
  PDBConstructionWarning)
>>> chain = [c for c in structure.get_chains() if c.get_id() == 'B'][0]
>>> residue0 = [r for r in chain.get_residues() if r.id[1] == 0][0]
>>> residue0.id
(' ', 0, ' ')
>>> 

1 Ответ

0 голосов
/ 11 мая 2018

TL; DR: интерпретацию выполняет не BioPython, а библиотека mmtf.


Из исходного кода :

self.structure_bulder.init_residue(group_name, self.this_type,
                                   group_number, insertion_code)

Здесьостаток создан.Второй параметр (self.this_type) - это field / hetero flag в init_residue

def init_residue(self, resname, field, resseq, icode):
    """Create a new Residue object.
    Arguments:
     - resname - string, e.g. "ASN"
     - field - hetero flag, "W" for waters, "H" for hetero residues, otherwise blank.

В mmtfParser this_type устанавливается для всей цепочки в set_chain_info.

Если вы импортируете ту же последовательность с mmtf, вы можете видеть, что цепи 0 и 1 считаются полимерами, что интерпретируется BioPython как «обычный» атом.Это имеет смысл, поскольку ацетатная группа связана с пептидной цепью.

from mmtf import fetch
decoded_data = fetch("4mdh")
print(decoded_data.entity_list)

[{'chainIndexList': [0, 1],
  'description': 'CYTOPLASMIC MALATE DEHYDROGENASE',
  'sequence': 'XSE...SSA',
  'type': 'polymer'},
 {'chainIndexList': [2, 4],
  'description': 'SULFATE ION',
  'sequence': '',
  'type': 'non-polymer'},
 {'chainIndexList': [3, 5],
  'description': 'NICOTINAMIDE-ADENINE-DINUCLEOTIDE',
  'sequence': '',
  'type': 'non-polymer'},
 {'chainIndexList': [6, 7],
  'description': 'water',
  'sequence': '',
  'type': 'water'}]

Обратите внимание, что вы можете получить доступ к моделям, цепям и остаткам в BioPython по индексам, например, structure[0]['B'][0] даст вам тот же атомкак в вопросе.

...