Often it is not the bonds around the atom that you wish to loop over but the neighboring atoms. One way to do this would be to use a OEBondBase iterator, and then use the OEBondBase method GetNbr which takes an OEAtomBase* as input, and returns the OEAtomBase* of the atom across the bond from the input atom.
#include "oechem.h" #include <iostream> using namespace OESystem; using namespace OEChem; using namespace std; void ShowNeighbors(OEAtomBase *atm) { OEIter<OEBondBase> bond; OEAtomBase *nbor; cerr << "Neighbors: "; for (bond = atm->GetBonds(); bond; ++bond) { nbor = bond->GetNbr(atm); cerr << nbor->GetIdx() << " "; } cerr << endl; } int main() { OEMol mol; OEParseSmiles(mol, "c1ccccc1"); OEIter<OEAtomBase> atom; for (atom=mol.GetAtoms();atom;++atom) { cerr << "Atom: " << atom->GetIdx() << " "; ShowNeighbors(atom); } return 0; }
However, this can be done even more conveniently using the OEAtomBase GetAtoms method, which returns the iterator of neighboring atoms to an atom.
#include "oechem.h" #include <iostream> using namespace OESystem; using namespace OEChem; using namespace std; void ShowNeighbors(OEAtomBase *atm) { OEIter<OEAtomBase> nbor; cerr << "Neighbors: "; for (nbor = atm->GetAtoms(); nbor; ++nbor) { cerr << nbor->GetIdx() << " "; } cerr << endl; } int main() { OEMol mol; OEParseSmiles(mol, "c1ccccc1"); OEIter<OEAtomBase> atom; for (atom=mol.GetAtoms();atom;++atom) { cerr << "Atom: " << atom->GetIdx() << " "; ShowNeighbors(atom); } return 0; }