mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-04 20:04:21 +08:00
- Make ObjectMolecule::Neighbor private - Use AtomNeighbors or ObjectMolecule::getNeighborArray - Eliminate ObjectMoleculeUpdateNeighbors
45 lines
1.1 KiB
C++
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);
|
|
}
|