The preferred way to read molecules in OEChem is to use the generator
methods provided by oemolistreams. These methods provide syntax
similar to using a for x in y
loop to iterate over the elements of a
list.
#!/usr/bin/env python # ch4-2.py from openeye.oechem import * ifs = oemolistream() ofs = oemolostream() for mol in ifs.GetOEGraphMols(): OEWriteMolecule(ofs, mol)
Note that using this syntax there is no need to create a molecule
object. A single molecule object is created by the generator method
(GetOEGraphMols
) and is re-used on each loop iteration. As such,
this syntax should not be used to put molecules into a list or other
persistent container. If you need to create a molecule object that is
persistent and can be used after the loop completes, there are a couple
of alternatives.
Probably the most efficient is to change the looping criteria slightly and create a new molecule object each time through the loop. This first example tests the state of the input stream to determine when the loop is finished.
#!/usr/bin/env python # ch4-3.py from openeye.oechem import * ifs = oemolistream() ofs = oemolostream() # create an empty list mollist = [] # loop over input while ifs.IsValid(): mol = OEGraphMol() OEReadMolecule(ifs, mol) mollist.append(mol) for mol in mollist: OEWriteMolecule(ofs, mol)
Alternatively, you can use iterator-like syntax and then construct a new molecule object from the current one. The OEGraphMol constructor can be used, except this time we use the ``mol'' as an argument to the function, creating a new molecule from our temporary one. In the next example, each time through the loop, a new molecule is created and stored in a Python list. Then iteration over the list is used to write the molecules back out.
from openeye.oechem import * ifs = oemolistream() ofs = oemolostream() # create an empty list mollist=[] # loop over input for mol in ifs.GetOEGraphMols(): newmol = OEGraphMol(mol) # create a new molecule mollist.append(newmol) # append to list for mol in mollist: OEWriteMolecule(ofs, mol)
Note for C++ Users: In the C++ theory manual, this same syntax is in the section describing reading molecules with iterators. The Python generator methods are a new functionality introduced in Python 2.2. In OEChem they are used to provide the C++ iterator functionality without requiring the Python user to explicitly create an iterator object.