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

Reply via email to