Thanks. I'd already tried Richard's suggestion, and it works, but just for completeness, it seems that you need to collect the residues and the atoms and then delete both (in that order) for it to work correctly. Then I tried Noel's suggestion and that also seems to work, and is quite a bit simpler. Tim
On Sat, Mar 4, 2023 at 8:16 AM Noel O'Boyle <baoille...@gmail.com> wrote: > Also OBMol::CopySubstructure as described at > https://baoilleach.blogspot.com/2018/05/when-all-you-want-is-ring.html > and > https://openbabel.github.io/api/3.0/classOpenBabel_1_1OBMol.shtml#a3271860ee44de0d38a27102c79913b1b > . Should be quite a bit faster I would think. > > On Fri, 3 Mar 2023, 14:19 Richard Overstreet, <reoverstr...@charter.net> > wrote: > >> 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 >> listOpenBabel-discuss@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/openbabel-discuss >> >> _______________________________________________ >> 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