// // Created by Gareth Jones on 5/7/2020. // // Copyright 2020-2022 Schrodinger, Inc and other RDKit contributors // @@ 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. #include #ifndef RDKIT_TAUTOMERQUERY_H #define RDKIT_TAUTOMERQUERY_H #include #include #include #include #include #include #ifdef RDK_USE_BOOST_SERIALIZATION #include #include #include #include #include #endif namespace RDKit { class RWMol; RDKIT_TAUTOMERQUERY_EXPORT bool TautomerQueryCanSerialize(); class RDKIT_TAUTOMERQUERY_EXPORT TautomerQuery { private: // Tautomers of the query std::vector d_tautomers; // Template query for substructure search std::unique_ptr d_templateMolecule; // Tautomeric bonds and atoms std::vector d_modifiedAtoms; std::vector d_modifiedBonds; // tests if a match to the template matches a specific tautomer bool matchTautomer(const ROMol &mol, const ROMol &tautomer, const std::span &match, const SubstructMatchParameters ¶ms) const; public: TautomerQuery(std::vector tautomers, const ROMol *const templateMolecule, std::vector modifiedAtoms, std::vector modifiedBonds); //! Copy constructor performs a deep copy TautomerQuery(const TautomerQuery &other) : d_templateMolecule(other.d_templateMolecule ? new ROMol(*other.d_templateMolecule) : nullptr), d_modifiedAtoms(other.d_modifiedAtoms), d_modifiedBonds(other.d_modifiedBonds) { PRECONDITION(other.d_templateMolecule != nullptr, "Null template"); for (auto taut : other.d_tautomers) { PRECONDITION(taut.get() != nullptr, "Null tautomer"); d_tautomers.push_back(boost::make_shared(*taut)); } } TautomerQuery(const std::string &pickle) { initFromString(pickle); } // Factory to build TautomerQuery // Caller owns the memory static TautomerQuery *fromMol( const ROMol &molecule, const std::string &tautomerTransformFile = std::string()); // Substructure search std::vector substructOf( const ROMol &mol, const SubstructMatchParameters ¶ms = SubstructMatchParameters(), std::vector *matchingTautomers = nullptr) const; // SubstructureMatch bool isSubstructOf(const ROMol &mol, const SubstructMatchParameters ¶ms = SubstructMatchParameters()); // Query fingerprint ExplicitBitVect *patternFingerprintTemplate( unsigned int fpSize = 2048U) const; // Static method to Fingerprint a target static ExplicitBitVect *patternFingerprintTarget(const ROMol &target, unsigned int fpSize = 2048U); // accessors // pointer is owned by TautomerQuery const ROMol &getTemplateMolecule() const { return *d_templateMolecule; } const std::vector getTautomers() const { return d_tautomers; } const std::vector getModifiedAtoms() const { return d_modifiedAtoms; } const std::vector getModifiedBonds() const { return d_modifiedBonds; } //! serializes (pickles) to a stream void toStream(std::ostream &ss) const; //! returns a string with a serialized (pickled) representation std::string serialize() const; //! initializes from a stream pickle void initFromStream(std::istream &ss); //! initializes from a string pickle void initFromString(const std::string &text); friend class TautomerQueryMatcher; #ifdef RDK_USE_BOOST_SERIALIZATION template void save(Archive &ar, const unsigned int version) const { RDUNUSED_PARAM(version); std::vector pkls; for (const auto &taut : d_tautomers) { std::string pkl; MolPickler::pickleMol(*taut, pkl, PicklerOps::AllProps); pkls.push_back(pkl); } ar << pkls; std::string molpkl; MolPickler::pickleMol(*d_templateMolecule, molpkl, PicklerOps::AllProps); ar << molpkl; ar << d_modifiedAtoms; ar << d_modifiedBonds; } template void load(Archive &ar, const unsigned int version) { RDUNUSED_PARAM(version); std::vector pkls; ar >> pkls; d_tautomers.clear(); for (const auto &pkl : pkls) { d_tautomers.push_back(ROMOL_SPTR(new ROMol(pkl))); } std::string molpkl; ar >> molpkl; d_templateMolecule.reset(new ROMol(molpkl)); ar >> d_modifiedAtoms; ar >> d_modifiedBonds; } BOOST_SERIALIZATION_SPLIT_MEMBER() #endif }; // so we can use the templates in Code/GraphMol/Substruct/SubstructMatch.h RDKIT_TAUTOMERQUERY_EXPORT std::vector SubstructMatch( const ROMol &mol, const TautomerQuery &query, const SubstructMatchParameters ¶ms); } // namespace RDKit #endif // RDKIT_TAUTOMERQUERY_H