Hi Tim,
Deleting residues can be tricky. I've found the following to work well.
from openbabel import openbabel
obconversion = openbabel.OBConversion()
obconversion.SetInAndOutFormats("pdb", "pdb")
mol = openbabel.OBMol()
path = obconversion.ReadFile(mol, 'demo.pdb')
non_lig_atoms=[]
for i in range(mol.NumAtoms()):
atom=mol.GetAtom(i+1)
resname=atom.GetResidue().GetName()
if resname != 'LIG':
print(resname)
non_lig_atoms.append(atom)
for atom in non_lig_atoms:
mol.DeleteAtom(atom)
obconversion.WriteFile(mol,'nolig_demo.pdb')
$ cat demo.pdb
ATOM 1 N ALA A 1 -0.525 1.362 0.000 1.00
0.00 N
ATOM 2 CA ALA A 1 0.000 0.000 0.000 1.00
0.00 C
ATOM 3 C ALA A 1 1.520 0.000 0.000 1.00
0.00 C
ATOM 4 O ALA A 1 2.152 0.808 -0.678 1.00
0.00 O
ATOM 5 CB ALA A 1 -0.507 -0.774 -1.206 1.00
0.00 C
ATOM 6 O LIG A 2 4.957 -2.553 -0.341 1.00
0.00 O
ATOM 7 N LIG A 2 2.116 -0.911 0.764 1.00
0.00 N
ATOM 8 CB LIG A 2 4.075 -0.753 2.287 1.00
0.00 C
ATOM 9 CA LIG A 2 3.571 -1.003 0.842 1.00
0.00 C
ATOM 10 C6 LIG A 2 5.566 -0.553 2.346 1.00
0.00 C
ATOM 11 C7 LIG A 2 6.420 -1.538 2.843 1.00
0.00 C
ATOM 12 C8 LIG A 2 6.121 0.622 1.833 1.00
0.00 C
ATOM 13 C LIG A 2 3.965 -2.393 0.368 1.00
0.00 C
ATOM 14 C10 LIG A 2 7.800 -1.358 2.825 1.00
0.00 C
ATOM 15 C11 LIG A 2 7.500 0.804 1.811 1.00
0.00 C
ATOM 16 C12 LIG A 2 8.342 -0.187 2.305 1.00
0.00 C
ATOM 17 N ALA A 3 3.188 -3.399 0.759 1.00
0.00 N
ATOM 18 CA ALA A 3 3.470 -4.776 0.365 1.00
0.00 C
ATOM 19 C ALA A 3 3.451 -4.925 -1.148 1.00
0.00 C
ATOM 20 O ALA A 3 3.668 -6.018 -1.670 1.00
0.00 O
ATOM 21 CB ALA A 3 2.461 -5.731 0.981 1.00
0.00 C
ATOM 22 OXT ALA A 3 3.219 -3.956 -1.868 1.00
0.00 O
TER 23 ALA A 3
END
The trick is to store a list of atoms to delete. This way is the more
stable.
On 3/3/23 03:34, Tim Dudgeon wrote:
I'm trying to work out how to use openbabel from Python to perform
operations such as extracting out ligands from macromolecules in PDB
or CIF format. For instance, if I have a ligand that has the residue
name of LIG, how do I create a new molecule with just that ligand so
that I can write it out in, for instance, molfile format.
If found that I can iterate through the residues and filter them with
something like this:
for obres in openbabel.OBResidueIter(obmol_from_cif_file):
if obres.GetName() == 'LIG':
print('ligand res')
else:
print('other res')
But it's not clear to me how to create a new mol or to delete the
residues I don't want. If I just use
obmol_from_cif_file.DeleteResidue(obres) I end up getting
a Segmentation fault.
Thanks
Tim
_______________________________________________
OpenBabel-discuss mailing list
OpenBabel-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss
_______________________________________________
OpenBabel-discuss mailing list
OpenBabel-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss