File: RingInfo.cpp

package info (click to toggle)
rdkit 202503.1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 220,160 kB
  • sloc: cpp: 399,240; python: 77,453; ansic: 25,517; java: 8,173; javascript: 4,005; sql: 2,389; yacc: 1,565; lex: 1,263; cs: 1,081; makefile: 580; xml: 229; fortran: 183; sh: 105
file content (142 lines) | stat: -rw-r--r-- 5,335 bytes parent folder | download | duplicates (2)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//
//  Copyright (C) Greg Landrum 2007-2017
//
//   @@ 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.
//

#define NO_IMPORT_ARRAY
#include <RDBoost/python.h>
#include <RDBoost/Wrap.h>

#include <GraphMol/RDKitBase.h>
#include <RDGeneral/types.h>

namespace python = boost::python;

namespace {
using namespace RDKit;
python::object atomRings(const RingInfo *self) {
  python::list res;
  for (const auto &ring : self->atomRings()) {
    res.append(python::tuple(ring));
  }
  return python::tuple(res);
}
python::object bondRings(const RingInfo *self) {
  python::list res;
  for (const auto &ring : self->bondRings()) {
    res.append(python::tuple(ring));
  }
  return python::tuple(res);
}
python::object atomMembers(const RingInfo *self, unsigned int idx) {
  return python::tuple(self->atomMembers(idx));
}
python::object bondMembers(const RingInfo *self, unsigned int idx) {
  return python::tuple(self->bondMembers(idx));
}
python::object atomRingSizes(const RingInfo *self, unsigned int idx) {
  return python::tuple(self->atomRingSizes(idx));
}
python::object bondRingSizes(const RingInfo *self, unsigned int idx) {
  return python::tuple(self->bondRingSizes(idx));
}

#ifdef RDK_USE_URF
python::object atomRingFamilies(const RingInfo *self) {
  python::list res;
  for (const auto &ring : self->atomRingFamilies()) {
    res.append(python::tuple(ring));
  }
  return python::tuple(res);
}
python::object bondRingFamilies(const RingInfo *self) {
  python::list res;
  for (const auto &ring : self->bondRingFamilies()) {
    res.append(python::tuple(ring));
  }
  return python::tuple(res);
}
#endif

void addRing(RingInfo *self, python::object atomRing, python::object bondRing) {
  unsigned int nAts = python::extract<unsigned int>(atomRing.attr("__len__")());
  unsigned int nBnds =
      python::extract<unsigned int>(bondRing.attr("__len__")());
  if (nAts != nBnds) {
    throw_value_error("list sizes must match");
  }
  if (!self->isInitialized()) {
    self->initialize();
  }
  INT_VECT aring(nAts);
  INT_VECT bring(nAts);
  for (unsigned int i = 0; i < nAts; ++i) {
    aring[i] = python::extract<int>(atomRing[i])();
    bring[i] = python::extract<int>(bondRing[i])();
  }
  self->addRing(aring, bring);
}
}  // namespace

namespace RDKit {
std::string classDoc = "contains information about a molecule's rings\n";

struct ringinfo_wrapper {
  static void wrap() {
    python::class_<RingInfo>("RingInfo", classDoc.c_str(), python::no_init)
        .def("IsAtomInRingOfSize", &RingInfo::isAtomInRingOfSize,
             python::args("self", "idx", "size"))
        .def("MinAtomRingSize", &RingInfo::minAtomRingSize,
             python::args("self", "idx"))
        .def("AreAtomsInSameRing", &RingInfo::areAtomsInSameRing,
             python::args("self", "idx1", "idx2"))
        .def("AreAtomsInSameRingOfSize", &RingInfo::areAtomsInSameRingOfSize,
             python::args("self", "idx1", "idx2", "size"))
        .def("IsBondInRingOfSize", &RingInfo::isBondInRingOfSize,
             python::args("self", "idx", "size"))
        .def("MinBondRingSize", &RingInfo::minBondRingSize,
             python::args("self", "idx"))
        .def("AreBondsInSameRing", &RingInfo::areBondsInSameRing,
             python::args("self", "idx1", "idx2"))
        .def("AreBondsInSameRingOfSize", &RingInfo::areBondsInSameRingOfSize,
             python::args("self", "idx1", "idx2", "size"))
        .def("NumAtomRings", &RingInfo::numAtomRings,
             python::args("self", "idx"))
        .def("NumBondRings", &RingInfo::numBondRings,
             python::args("self", "idx"))
        .def("NumRings", &RingInfo::numRings, python::args("self"))
        .def("IsRingFused", &RingInfo::isRingFused,
             python::args("self", "ringIdx"))
        .def("AreRingsFused", &RingInfo::areRingsFused,
             python::args("self", "ring1Idx", "ring2Idx"))
        .def("NumFusedBonds", &RingInfo::numFusedBonds,
             python::args("self", "ringIdx"))
        .def("AtomRings", atomRings, python::args("self"))
        .def("BondRings", bondRings, python::args("self"))
        .def("AtomMembers", atomMembers, python::args("self", "idx"))
        .def("BondMembers", bondMembers, python::args("self", "idx"))
        .def("AtomRingSizes", atomRingSizes, python::args("self", "idx"))
        .def("BondRingSizes", bondRingSizes, python::args("self", "idx"))
#ifdef RDK_USE_URF
        .def("NumRingFamilies", &RingInfo::numRingFamilies,
             python::args("self"))
        .def("NumRelevantCycles", &RingInfo::numRelevantCycles,
             python::args("self"))
        .def("AtomRingFamilies", atomRingFamilies, python::args("self"))
        .def("BondRingFamilies", bondRingFamilies, python::args("self"))
        .def("AreRingFamiliesInitialized",
             &RingInfo::areRingFamiliesInitialized, python::args("self"))
#endif
        .def("AddRing", addRing,
             (python::arg("self"), python::arg("atomIds"),
              python::arg("bondIds")),
             "Adds a ring to the set. Be very careful with this operation.");
  };
};
}  // namespace RDKit
void wrap_ringinfo() { RDKit::ringinfo_wrapper::wrap(); }