14#include <boost/function.hpp>
25#include <boost/dynamic_bitset.hpp>
60 std::vector<int> reqElements = {}, std::string connSmarts =
"");
89 const ROMol &mol,
const std::vector<SubstructTerm> &terms =
99 const ROMol &mol,
const std::vector<SubstructTerm> &terms =
108 const ROMol &mol,
const std::vector<SubstructTerm> &terms,
109 const std::vector<size_t> &relevantIndices);
133 return [relevantIndices](
const ROMol &taut) {
150 unsigned int nSpecified = 0;
151 for (
const auto atom : mol.
atoms()) {
158 for (
const auto bond : mol.
bonds()) {
183 Tautomer() : d_numModifiedAtoms(0), d_numModifiedBonds(0), d_done(false) {}
187 d_numModifiedAtoms(a),
188 d_numModifiedBonds(b),
194 d_numModifiedAtoms(a),
195 d_numModifiedBonds(b),
210 size_t d_numModifiedAtoms;
211 size_t d_numModifiedBonds;
236 return (d_it == other.d_it);
239 return !(*
this == other);
261 SmilesTautomerMap::const_iterator d_it;
265 : d_tautomers(other.d_tautomers),
266 d_status(other.d_status),
267 d_modifiedAtoms(other.d_modifiedAtoms),
268 d_modifiedBonds(other.d_modifiedBonds) {
269 fillTautomersItVec();
275 size_t size()
const {
return d_tautomers.size(); }
276 bool empty()
const {
return d_tautomers.empty(); }
278 PRECONDITION(pos < d_tautomers.size(),
"index out of bounds");
279 return d_tautomersItVec.at(pos)->second.tautomer;
283 return d_modifiedAtoms;
286 return d_modifiedBonds;
290 std::vector<ROMOL_SPTR> tautomerVec;
291 tautomerVec.reserve(d_tautomers.size());
293 d_tautomers.begin(), d_tautomers.end(), std::back_inserter(tautomerVec),
298 std::vector<std::string>
smiles()
const {
299 std::vector<std::string> smilesVec;
300 smilesVec.reserve(d_tautomers.size());
301 std::transform(d_tautomers.begin(), d_tautomers.end(),
302 std::back_inserter(smilesVec),
309 void fillTautomersItVec() {
310 for (
auto it = d_tautomers.begin(); it != d_tautomers.end(); ++it) {
311 d_tautomersItVec.push_back(it);
315 SmilesTautomerMap d_tautomers;
318 std::vector<SmilesTautomerMap::const_iterator> d_tautomersItVec;
321 TautomerEnumeratorStatus d_status;
323 boost::dynamic_bitset<> d_modifiedAtoms;
325 boost::dynamic_bitset<> d_modifiedBonds;
338 : dp_catalog(tautCat),
339 d_maxTautomers(1000),
340 d_maxTransforms(1000),
341 d_removeSp3Stereo(true),
342 d_removeBondStereo(true),
343 d_removeIsotopicHs(true),
344 d_reassignStereo(true) {}
347 : dp_catalog(other.dp_catalog),
348 d_callback(other.d_callback),
349 d_maxTautomers(other.d_maxTautomers),
350 d_maxTransforms(other.d_maxTransforms),
351 d_removeSp3Stereo(other.d_removeSp3Stereo),
352 d_removeBondStereo(other.d_removeBondStereo),
353 d_removeIsotopicHs(other.d_removeIsotopicHs),
354 d_reassignStereo(other.d_reassignStereo) {}
356 if (
this == &other) {
359 dp_catalog = other.dp_catalog;
360 d_callback = other.d_callback;
361 d_maxTautomers = other.d_maxTautomers;
362 d_maxTransforms = other.d_maxTransforms;
363 d_removeSp3Stereo = other.d_removeSp3Stereo;
364 d_removeBondStereo = other.d_removeBondStereo;
365 d_removeIsotopicHs = other.d_removeIsotopicHs;
366 d_reassignStereo = other.d_reassignStereo;
371 d_maxTautomers = maxTautomers;
381 d_maxTransforms = maxTransforms;
393 d_removeSp3Stereo = removeSp3Stereo;
407 d_removeBondStereo = removeBondStereo;
417 d_removeIsotopicHs = removeIsotopicHs;
428 d_reassignStereo = reassignStereo;
440 d_callback.reset(callback);
442 void setCallback(std::shared_ptr<TautomerEnumeratorCallback> callback) {
443 d_callback = callback;
478 "please use the form returning a TautomerEnumeratorResult "
479 "instead")]] std::vector<ROMOL_SPTR>
481 boost::dynamic_bitset<> *modifiedBonds =
nullptr)
const;
485 boost::function<
int(
const ROMol &mol)> scoreFunc =
493 template <
class Iterable,
494 typename std::enable_if<
495 !std::is_same<Iterable, TautomerEnumeratorResult>::value,
498 boost::function<
int(
const ROMol &mol)> scoreFunc =
501 if (tautomers.size() == 1) {
502 bestMol = *tautomers.begin();
505 int bestScore = std::numeric_limits<int>::min();
506 unsigned int bestStereo = 0;
507 std::string bestSmiles =
"";
508 for (
const auto &t : tautomers) {
509 auto score = scoreFunc(*t);
510#ifdef VERBOSE_ENUMERATION
511 std::cerr <<
" " <<
MolToSmiles(*t) <<
" " << score << std::endl;
513 if (score < bestScore) {
522 bool haveSmiles =
false;
524 if (score > bestScore) {
526 }
else if (nStereo > bestStereo) {
528 }
else if (nStereo == bestStereo) {
531 better = smiles < bestSmiles;
538 bestStereo = nStereo;
539 bestSmiles = std::move(smiles);
545 static const bool cleanIt =
true;
546 static const bool force =
true;
570 boost::function<
int(
const ROMol &mol)> scoreFunc = {})
const;
572 RWMol &mol, boost::function<
int(
const ROMol &mol)> scoreFunc = {})
const;
575 bool setTautomerStereoAndIsoHs(
const ROMol &mol,
ROMol &taut,
577 std::shared_ptr<TautomerCatalog> dp_catalog;
578 std::shared_ptr<TautomerEnumeratorCallback> d_callback;
579 unsigned int d_maxTautomers;
580 unsigned int d_maxTransforms;
581 bool d_removeSp3Stereo;
582 bool d_removeBondStereo;
583 bool d_removeIsotopicHs;
584 bool d_reassignStereo;
#define PRECONDITION(expr, mess)
Defines the CleanupParameters and some convenience functions.
Defines the primary molecule class ROMol as well as associated typedefs.
@ CHI_UNSPECIFIED
chirality that hasn't been specified
virtual bool operator()(const ROMol &, const TautomerEnumeratorResult &)=0
virtual ~TautomerEnumeratorCallback()
TautomerEnumeratorCallback()
const_iterator & operator++()
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(const SmilesTautomerMap::const_iterator &it)
const_iterator & operator--()
Contains results of tautomer enumeration.
friend class TautomerEnumerator
const SmilesTautomerMap & smilesTautomerMap() const
const boost::dynamic_bitset & modifiedBonds() const
TautomerEnumeratorResult()
const boost::dynamic_bitset & modifiedAtoms() const
const const_iterator end() const
const const_iterator begin() const
const ROMOL_SPTR & operator[](size_t pos) const
std::vector< ROMOL_SPTR > tautomers() const
TautomerEnumeratorResult(const TautomerEnumeratorResult &other)
std::vector< ROMOL_SPTR > operator()() const
const ROMOL_SPTR & at(size_t pos) const
std::vector< std::string > smiles() const
TautomerEnumeratorStatus status() const
void setRemoveSp3Stereo(bool removeSp3Stereo)
TautomerEnumerator(const CleanupParameters ¶ms=CleanupParameters())
bool getRemoveBondStereo()
void setRemoveIsotopicHs(bool removeIsotopicHs)
bool getRemoveSp3Stereo()
unsigned int getMaxTransforms()
std::vector< ROMOL_SPTR > enumerate(const ROMol &mol, boost::dynamic_bitset<> *modifiedAtoms, boost::dynamic_bitset<> *modifiedBonds=nullptr) const
ROMol * pickCanonical(const TautomerEnumeratorResult &tautRes, boost::function< int(const ROMol &mol)> scoreFunc=TautomerScoringFunctions::scoreTautomer) const
returns the canonical tautomer from a TautomerEnumeratorResult
TautomerEnumeratorCallback * getCallback() const
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
TautomerEnumerator & operator=(const TautomerEnumerator &other)
unsigned int getMaxTautomers()
void canonicalizeInPlace(RWMol &mol, boost::function< int(const ROMol &mol)> scoreFunc={}) const
void setCallback(TautomerEnumeratorCallback *callback)
ROMol * canonicalize(const ROMol &mol, boost::function< int(const ROMol &mol)> scoreFunc={}) const
returns the canonical tautomer for a molecule
void setCallback(std::shared_ptr< TautomerEnumeratorCallback > callback)
TautomerEnumerator(const TautomerEnumerator &other)
void setMaxTransforms(unsigned int maxTransforms)
void setMaxTautomers(unsigned int maxTautomers)
ROMol * pickCanonical(const Iterable &tautomers, boost::function< int(const ROMol &mol)> scoreFunc=TautomerScoringFunctions::scoreTautomer) const
Tautomer(ROMOL_SPTR t, ROMOL_SPTR k, size_t a=0, size_t b=0)
friend class TautomerEnumerator
Tautomer(ROMOL_SPTR t, size_t a=0, size_t b=0)
const ROMOL_SPTR & getKekulized() const
CXXAtomIterator< MolGraph, Atom * > atoms()
C++11 Range iterator.
CXXBondIterator< MolGraph, Bond * > bonds()
RWMol is a molecule class that is intended to be edited.
#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 and bonds.
RDKIT_GRAPHMOL_EXPORT void Kekulize(RWMol &mol, bool markAtomsBonds=true, bool canonical=true, unsigned int maxBackTracks=100)
Kekulizes the molecule.
RDKIT_MOLSTANDARDIZE_EXPORT int scoreHeteroHs(const ROMol &mol)
RDKIT_MOLSTANDARDIZE_EXPORT std::vector< size_t > getRelevantSubstructTermIndices(const ROMol &mol, const std::vector< SubstructTerm > &terms=getDefaultTautomerScoreSubstructs())
RDKIT_MOLSTANDARDIZE_EXPORT int scoreSubstructsFiltered(const ROMol &mol, const std::vector< SubstructTerm > &terms, const std::vector< size_t > &relevantIndices)
int scoreTautomer(const ROMol &mol)
const std::string tautomerScoringVersion
RDKIT_MOLSTANDARDIZE_EXPORT const std::vector< SubstructTerm > & getDefaultTautomerScoreSubstructs()
RDKIT_MOLSTANDARDIZE_EXPORT int scoreRings(const ROMol &mol)
RDKIT_MOLSTANDARDIZE_EXPORT int scoreSubstructs(const ROMol &mol, const std::vector< SubstructTerm > &terms=getDefaultTautomerScoreSubstructs())
scoreSubstructs scores the molecule based on the substructure definitions
boost::function< int(const ROMol &)> makeOptimizedScorer(const ROMol &mol)
RDKIT_MOLSTANDARDIZE_EXPORT const TautomerTransformDefs defaultTautomerTransformsv1
unsigned int countSpecifiedStereo(const ROMol &mol)
Number of explicitly specified stereo descriptors on a molecule.
std::map< std::string, Tautomer > SmilesTautomerMap
TautomerEnumerator * tautomerEnumeratorFromParams(const CleanupParameters ¶ms)
TautomerEnumerator * getV1TautomerEnumerator()
RDCatalog::HierarchCatalog< TautomerCatalogEntry, TautomerCatalogParams, int > TautomerCatalog
std::pair< std::string, Tautomer > SmilesTautomerPair
RDKIT_SMILESPARSE_EXPORT std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms)
returns canonical SMILES for a molecule
boost::shared_ptr< ROMol > ROMOL_SPTR
SubstructTerm(const SubstructTerm &rhs)=default
RWMol connectivityMatcher
std::string connectivitySmarts
SubstructTerm(std::string aname, std::string asmarts, int ascore, std::vector< int > reqElements={}, std::string connSmarts="")
bool operator==(const SubstructTerm &rhs) const
SubstructTerm & operator=(const SubstructTerm &rhs)=default
std::vector< int > requiredElements