У меня есть список файлов PDB. Я хочу извлечь лиганды всех файлов (то есть гетероатомов) и сохранить каждый из них отдельно в файлы PDB, используя модуль Bio.PDB из Bio Python.
. Я пробовал некоторые решения, например один: Удалить гетероатомы из PDB , которые я пытался адаптировать, чтобы сохранить гетероатомы. Но все, что я получаю, это файлы со всем лигандом в одном и том же файле.
Я также попробовал нечто подобное:
def accept_residue(residue):
""" Recognition of heteroatoms - Remove water molecules """
res = residue.id[0]
if res != " ": # Heteroatoms have some flags, that's why we keep only residue with id != " "
if res != "W": # Don't take in consideration the water molecules
return True
def extract_ligands(path):
""" Extraction of the heteroatoms of .pdb files """
for element in os.listdir(path+'/data/pdb'):
i=1
if element.endswith('.pdb'):
if not element.startswith("lig_"):
pdb = PDBParser().get_structure(element[:-4], path+'/data/pdb/'+element)
io = PDBIO()
io.set_structure(pdb)
for model in pdb:
for chain in model:
for residue in chain:
if accept_residue(residue):
io.save("lig_"+element[:-4]+"_"+str(i)+".pdb", accept_residue(residue))
i += 1 # Counter for the result filename
# Main
path = mypath
extract_ligands(path)
Очевидно, что возникла ошибка:
AttributeError: 'bool' object has no attribute 'accept_model'
Я знаю, что это из-за "accept_residue ()" в моем "io.save". Но я не нашел никакого логического решения, чтобы делать то, что я хочу ...
Наконец, я попробовал решение, подобное этому, с chain.detach_child:
...
for chain in model:
for residue in chain:
res = residue.id[0]
if res == " " or res == "W":
chain.detach_child(residue.id)
if len(chain) == 0:
model.detach_child(chain.id)
...
In На мой взгляд, он «отделил бы» все остатки, которые не являются гетероатомами (res.id [0] == «») и всю воду (res.id [0] == «W»). Но в целом все остатки и вода все еще там и глючат.
Итак, можно ли делать то, что мне нужно? (извлеките все лиганды из всех моих файлов и сохраните их один за другим отдельно в файлах pdb)
(извините за мой плохой Engli sh и в конечном итоге за мои плохие навыки в Python: /)