Files
pymol-open-source/layer3/RingFinder.cpp
Thomas Holder 10af8bd0b9 Refactor ObjectMolecule::Neighbor access
- Make ObjectMolecule::Neighbor private
- Use AtomNeighbors or ObjectMolecule::getNeighborArray
- Eliminate ObjectMoleculeUpdateNeighbors
2021-04-28 04:34:33 -04:00

45 lines
1.1 KiB
C++

#include "RingFinder.h"
#include "ObjectMolecule.h"
void AbstractRingFinder::recursion(int atm, int depth)
{
m_indices[depth] = atm;
for (auto const& neighbor : AtomNeighbors(m_obj, atm)) {
// check bond order
if (m_obj->Bond[neighbor.bond].order < 1)
continue;
const auto atm_neighbor = neighbor.atm;
// check atom filter
if (atomIsExcluded(m_obj->AtomInfo[atm_neighbor]))
continue;
// check if closing a ring of size >= 3
if (depth > 1 && atm_neighbor == m_indices[0]) {
// found ring, add it to the selection
onRingFound(m_obj, m_indices.data(), depth + 1);
} else if (depth < m_indices.size() - 1) {
// check for undesired ring with start != 0
int i = depth;
while ((--i) >= 0)
if (atm_neighbor == m_indices[i])
break; // stop recursion
if (i == -1) {
recursion(atm_neighbor, depth + 1);
}
}
}
}
void AbstractRingFinder::apply(ObjectMolecule* obj, int atm)
{
if (m_obj != obj) {
m_obj = obj;
prepareObject(m_obj);
}
recursion(atm, 0);
}