1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
//
//
// Copyright (C) 2020 Schrödinger, LLC
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#pragma once
#include <memory>
#include <GraphMol/RDKitBase.h>
#include "Descriptor.h"
#include "Mancude.h"
namespace RDKit {
namespace CIPLabeler {
template <typename T, typename U>
class CIPMolSpan {
public:
class CIPMolIter {
public:
CIPMolIter() = delete;
CIPMolIter(ROMol &mol, U pos) : d_mol{mol}, d_pos{std::move(pos)} {}
T &operator*() {
d_current = d_mol[*d_pos];
return d_current;
}
CIPMolIter &operator++() {
++d_pos;
return *this;
}
bool operator!=(const CIPMolIter &it) const { return d_pos != it.d_pos; }
private:
ROMol &d_mol;
U d_pos;
T d_current = nullptr;
};
public:
CIPMolSpan() = delete;
CIPMolSpan(ROMol &mol, std::pair<U, U> &&itr)
: d_mol{mol},
d_istart{std::move(itr.first)},
d_iend{std::move(itr.second)} {}
CIPMolIter begin() { return {d_mol, d_istart}; }
CIPMolIter end() { return {d_mol, d_iend}; }
private:
ROMol &d_mol;
const U d_istart;
const U d_iend;
};
class CIPMol {
public:
CIPMol() = delete;
explicit CIPMol(ROMol &mol);
// Average atomic number with other atoms that are in an
// aromatic ring with this one.
boost::rational<int> getFractionalAtomicNum(Atom *atom) const;
unsigned getNumAtoms() const;
unsigned getNumBonds() const;
Atom *getAtom(int idx) const;
CXXAtomIterator<MolGraph, Atom *> atoms() const;
Bond *getBond(int idx) const;
CIPMolSpan<Bond *, ROMol::OEDGE_ITER> getBonds(Atom *atom) const;
CIPMolSpan<Atom *, ROMol::ADJ_ITER> getNeighbors(Atom *atom) const;
bool isInRing(Bond *bond) const;
// Integer bond order of a kekulized molecule
// Dative bonds get bond order 0.
int getBondOrder(Bond *bond) const;
private:
ROMol &d_mol;
std::vector<RDKit::Bond::BondType> d_kekulized_bonds;
std::vector<boost::rational<int>> d_atomnums;
};
} // namespace CIPLabeler
} // namespace RDKit
|