У меня есть список файлов PDB. Я хочу извлечь лиганды из всех файлов (то есть гетероатомов) и сохранить каждый отдельно в файлы PDB, используя модуль Bio.PDB от BioPython.
Я попробовал несколько решений, например это: Удалить гетероатомы из 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)
...
На мой взгляд, это «отделило бы» все остатки, не являющиеся гетероатомами ( res.id[0] == " " ), и всю воду ( res.id[0] == "W"). Но в ладу все остатки и вода остались и глючат.
Итак, возможно ли сделать то, что мне нужно? (извлеките все лиганды из всех моих файлов и сохраните их по одному отдельно в файлах PDB)
(Извините за мой плохой английский и, в конечном итоге, за мои плохие навыки в Python:/)