21.4 Composition Functors in OEChem

Occasionally, one may want to use a logical operator to join two or more functors. While it is certainly possible to write a quick functor which wraps two or more functors, but this is not necessary. The functors OEAndAtom, OEOrAtom and OENotAtom are already defined. The each have constructors which take the appropriate number of predicates as arguments and generate a single unary predicate. Similar logical predicates are defined for bonds, residues, etc.

The following example demonstrates use of the OEAndAtom and OENotAtom composition predicates with two of the predefined atom predicates

#!/usr/bin/env python
# ch21-3.py

from openeye.oechem import *

def Count(fcn, mol):
    count=0
    for atom in mol.GetAtoms():
        if fcn(atom)==1:
            count += 1
    return count

mol = OEGraphMol()
OEParseSmiles(mol, "c1c(O)c(O)c(Cl)cc1CCCBr")

print "Number of Aromatic Oxygens = ",
print Count(OEAndAtom(IsOxygen(),IsAromaticAtom()),mol)

print "Number of Non-Carbons = ",
print Count(OENotAtom(HasAtomicNum(6)),mol)