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]
даст вам тот же атомкак в вопросе.