14 #include <boost/function.hpp>
22 #include <boost/dynamic_bitset.hpp>
28 namespace MolStandardize {
34 namespace TautomerScoringFunctions {
57 Tautomer() : d_numModifiedAtoms(0), d_numModifiedBonds(0) {}
61 d_numModifiedAtoms(a),
62 d_numModifiedBonds(b) {}
67 size_t d_numModifiedAtoms;
68 size_t d_numModifiedBonds;
92 return (d_it == other.d_it);
95 return !(*
this == other);
117 SmilesTautomerMap::const_iterator d_it;
121 : d_tautomers(other.d_tautomers),
122 d_status(other.d_status),
123 d_modifiedAtoms(other.d_modifiedAtoms),
124 d_modifiedBonds(other.d_modifiedBonds) {
125 fillTautomersItVec();
131 size_t size()
const {
return d_tautomers.size(); }
132 bool empty()
const {
return d_tautomers.empty(); }
134 PRECONDITION(pos < d_tautomers.size(),
"index out of bounds");
135 return d_tautomersItVec.at(pos)->second.tautomer;
139 return d_modifiedAtoms;
142 return d_modifiedBonds;
146 std::vector<ROMOL_SPTR> tautomerVec;
147 tautomerVec.reserve(d_tautomers.size());
149 d_tautomers.begin(), d_tautomers.end(), std::back_inserter(tautomerVec),
153 std::vector<ROMOL_SPTR>
operator()()
const {
return tautomers(); }
154 std::vector<std::string>
smiles()
const {
155 std::vector<std::string> smilesVec;
156 smilesVec.reserve(d_tautomers.size());
157 std::transform(d_tautomers.begin(), d_tautomers.end(),
158 std::back_inserter(smilesVec),
165 void fillTautomersItVec() {
166 for (
auto it = d_tautomers.begin(); it != d_tautomers.end(); ++it) {
167 d_tautomersItVec.push_back(it);
174 std::vector<SmilesTautomerMap::const_iterator> d_tautomersItVec;
179 boost::dynamic_bitset<> d_modifiedAtoms;
181 boost::dynamic_bitset<> d_modifiedBonds;
194 : dp_catalog(tautCat),
195 d_maxTautomers(1000),
196 d_maxTransforms(1000),
197 d_removeSp3Stereo(true),
198 d_removeBondStereo(true),
199 d_removeIsotopicHs(true),
200 d_reassignStereo(true) {}
203 : dp_catalog(other.dp_catalog),
204 d_callback(other.d_callback.get()),
205 d_maxTautomers(other.d_maxTautomers),
206 d_maxTransforms(other.d_maxTransforms),
207 d_removeSp3Stereo(other.d_removeSp3Stereo),
208 d_removeBondStereo(other.d_removeBondStereo),
209 d_removeIsotopicHs(other.d_removeIsotopicHs),
210 d_reassignStereo(other.d_reassignStereo) {}
212 if (
this == &other)
return *
this;
213 dp_catalog = other.dp_catalog;
214 d_callback.reset(other.d_callback.get());
215 d_maxTautomers = other.d_maxTautomers;
216 d_maxTransforms = other.d_maxTransforms;
217 d_removeSp3Stereo = other.d_removeSp3Stereo;
218 d_removeBondStereo = other.d_removeBondStereo;
219 d_removeIsotopicHs = other.d_removeIsotopicHs;
220 d_reassignStereo = other.d_reassignStereo;
225 d_maxTautomers = maxTautomers;
235 d_maxTransforms = maxTransforms;
247 d_removeSp3Stereo = removeSp3Stereo;
261 d_removeBondStereo = removeBondStereo;
271 d_removeIsotopicHs = removeIsotopicHs;
282 d_reassignStereo = reassignStereo;
294 d_callback.reset(callback);
324 [deprecated(
"please use the form returning a TautomerEnumeratorResult "
325 "instead")]] std::vector<ROMOL_SPTR>
327 boost::dynamic_bitset<> *modifiedBonds =
nullptr)
const;
331 boost::function<
int(
const ROMol &mol)> scoreFunc =
338 template <
class Iterable,
339 typename std::enable_if<
340 !std::is_same<Iterable, TautomerEnumeratorResult>::value,
343 boost::function<
int(
const ROMol &mol)> scoreFunc =
346 if (tautomers.size() == 1) {
347 bestMol = *tautomers.begin();
350 int bestScore = std::numeric_limits<int>::min();
351 std::string bestSmiles =
"";
352 for (
const auto &t : tautomers) {
353 auto score = scoreFunc(*t);
354 #ifdef VERBOSE_ENUMERATION
357 if (
score > bestScore) {
361 }
else if (
score == bestScore) {
363 if (smiles < bestSmiles) {
371 static const bool cleanIt =
true;
372 static const bool force =
true;
392 boost::function<
int(
const ROMol &mol)> scoreFunc =
396 bool setTautomerStereoAndIsoHs(
const ROMol &mol,
ROMol &taut,
398 std::shared_ptr<TautomerCatalog> dp_catalog;
399 std::unique_ptr<TautomerEnumeratorCallback> d_callback;
400 unsigned int d_maxTautomers;
401 unsigned int d_maxTransforms;
402 bool d_removeSp3Stereo;
403 bool d_removeBondStereo;
404 bool d_removeIsotopicHs;
405 bool d_reassignStereo;
#define PRECONDITION(expr, mess)
A Catalog with a hierarchical structure.
virtual bool operator()(const ROMol &, const TautomerEnumeratorResult &)=0
virtual ~TautomerEnumeratorCallback()
TautomerEnumeratorCallback()
const_iterator operator--(int)
const ROMOL_SPTR & reference
pointer operator->() const
std::ptrdiff_t difference_type
std::bidirectional_iterator_tag iterator_category
reference operator*() const
bool operator!=(const const_iterator &other) const
const_iterator operator++(int)
bool operator==(const const_iterator &other) const
const_iterator & operator--()
const_iterator(const SmilesTautomerMap::const_iterator &it)
const_iterator & operator++()
Contains results of tautomer enumeration.
std::vector< ROMOL_SPTR > tautomers() const
const ROMOL_SPTR & operator[](size_t pos) const
std::vector< std::string > smiles() const
TautomerEnumeratorResult()
const SmilesTautomerMap & smilesTautomerMap() const
const const_iterator end() const
const boost::dynamic_bitset & modifiedBonds() const
const boost::dynamic_bitset & modifiedAtoms() const
const const_iterator begin() const
std::vector< ROMOL_SPTR > operator()() const
TautomerEnumeratorResult(const TautomerEnumeratorResult &other)
const ROMOL_SPTR & at(size_t pos) const
TautomerEnumeratorStatus status() const
void setRemoveSp3Stereo(bool removeSp3Stereo)
ROMol * canonicalize(const ROMol &mol, boost::function< int(const ROMol &mol)> scoreFunc=TautomerScoringFunctions::scoreTautomer) const
returns the canonical tautomer for a molecule
TautomerEnumerator(const CleanupParameters ¶ms=CleanupParameters())
bool getRemoveBondStereo()
void setRemoveIsotopicHs(bool removeIsotopicHs)
bool getRemoveSp3Stereo()
unsigned int getMaxTransforms()
ROMol * pickCanonical(const TautomerEnumeratorResult &tautRes, boost::function< int(const ROMol &mol)> scoreFunc=TautomerScoringFunctions::scoreTautomer) const
returns the canonical tautomer from a TautomerEnumeratorResult
TautomerEnumerator & operator=(const TautomerEnumerator &other)
bool getRemoveIsotopicHs()
TautomerEnumerator(TautomerCatalog *tautCat)
void setReassignStereo(bool reassignStereo)
void setRemoveBondStereo(bool removeBondStereo)
TautomerEnumeratorResult enumerate(const ROMol &mol) const
returns a TautomerEnumeratorResult structure for the input molecule
unsigned int getMaxTautomers()
TautomerEnumeratorCallback * getCallback() const
std::vector< ROMOL_SPTR > enumerate(const ROMol &mol, boost::dynamic_bitset<> *modifiedAtoms, boost::dynamic_bitset<> *modifiedBonds=nullptr) const
void setCallback(TautomerEnumeratorCallback *callback)
TautomerEnumerator(const TautomerEnumerator &other)
ROMol * pickCanonical(const Iterable &tautomers, boost::function< int(const ROMol &mol)> scoreFunc=TautomerScoringFunctions::scoreTautomer) const
returns the canonical tautomer from an iterable of possible tautomers
void setMaxTransforms(unsigned int maxTransforms)
void setMaxTautomers(unsigned int maxTautomers)
Tautomer(const ROMOL_SPTR &t, const ROMOL_SPTR &k, size_t a=0, size_t b=0)
#define RDKIT_MOLSTANDARDIZE_EXPORT
RDKIT_GRAPHMOL_EXPORT void assignStereochemistry(ROMol &mol, bool cleanIt=false, bool force=false, bool flagPossibleStereoCenters=false)
Assign stereochemistry tags to atoms (i.e. R/S) and bonds (i.e. Z/E)
RDKIT_MOLSTANDARDIZE_EXPORT int scoreHeteroHs(const ROMol &mol)
int scoreTautomer(const ROMol &mol)
const std::string tautomerScoringVersion
RDKIT_MOLSTANDARDIZE_EXPORT int scoreSubstructs(const ROMol &mol)
RDKIT_MOLSTANDARDIZE_EXPORT int scoreRings(const ROMol &mol)
std::map< std::string, Tautomer > SmilesTautomerMap
RDCatalog::HierarchCatalog< TautomerCatalogEntry, TautomerCatalogParams, int > TautomerCatalog
std::pair< std::string, Tautomer > SmilesTautomerPair
RDKIT_SMILESPARSE_EXPORT std::string MolToSmiles(const ROMol &mol, bool doIsomericSmiles=true, bool doKekule=false, int rootedAtAtom=-1, bool canonical=true, bool allBondsExplicit=false, bool allHsExplicit=false, bool doRandom=false)
returns canonical SMILES for a molecule
double score(const std::vector< size_t > &permutation, const std::vector< std::vector< RGroupMatch >> &matches, const std::set< int > &labels)
boost::shared_ptr< ROMol > ROMOL_SPTR
The CleanupParameters structure defines the default parameters for the.