Hi Pascal, You cannot iterate over something that you are changing. (This is a general rule in C++, and maybe in life)
Instead you need too loops: in the first you create a list of OBAtoms you want to delete; in the second, you iterate over this list and delete them. BTW, try googling "pybel murcko" - Florian Nigsch has written an implementation. - Noel On 1 October 2010 14:43, Pascal Muller <[email protected]> wrote: > Hi all, > > I would like to generate the Murcko framework for a library. > CDK should be able to do this, but the code should be updated and the > function is currently not fully usable - if I understood well. > If anybody is aware of an other solution...? > > So, I'm beginning to do a script with pybel. First, I just want to > remove atoms which have only one neighbour. > > If there less than 2 neighbours, I do this: > > for atom in ob.OBMolAtomIter(mol.OBMol): > (...) > if (neighborsCount <= 1): > mol.OBMol.DeleteAtom(atom) > > But it scans only 13 atoms, with 2 atom deleted, instead of 14 in the > test molecule (and theorically 3 deletion). > If I don't delete atoms, all is doing well (i.e., it scans all 14 atoms). > Any advice for doing it in the right manner? > > Full code below, Open Babel 2.2.3. > Smiles used: > c1(n(c2c(cccc2)o1)C[C@@H](N)C)=O ART12966845 > > Thanks, > Regards, > Pascal > > > > #!/usr/bin/env python > # encoding: utf-8 > > import sys > import os, pybel > import openbabel as ob > > def main(): > if len(sys.argv) < 2: > print "No input file provided: Murcko.py filetosprocess.ext" > sys.exit(1) > for mol in pybel.readfile(sys.argv[1].split('.')[1], sys.argv[1]): > mol.OBMol.DeleteHydrogens() > atomCount = 0 > for atom in ob.OBMolAtomIter(mol.OBMol): > atomCount = atomCount + 1 > print "Atom count:", atomCount > atomCount = 0 > for atom in ob.OBMolAtomIter(mol.OBMol): > atomCount = atomCount + 1 > if not atom.IsInRing(): > neighborsCount = 0 > for neighbor in ob.OBAtomAtomIter(atom): > neighborsCount = neighborsCount + 1 > if (neighborsCount <= 1): > print "Idx:", atom.GetIdx(), "Type:", > atom.GetType(),"Deleted" > mol.OBMol.DeleteAtom(atom) > print "Atom count:", atomCount > smilesMurcko = mol.write("smi") > print "Current smiles:", smilesMurcko > > if __name__ == '__main__': > main() > > ------------------------------------------------------------------------------ > Start uncovering the many advantages of virtual appliances > and start using them to simplify application deployment and > accelerate your shift to cloud computing. > http://p.sf.net/sfu/novell-sfdev2dev > _______________________________________________ > OpenBabel-discuss mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/openbabel-discuss > ------------------------------------------------------------------------------ Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing. http://p.sf.net/sfu/novell-sfdev2dev _______________________________________________ OpenBabel-discuss mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbabel-discuss
