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 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
//
// 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 <RDGeneral/export.h>
#ifndef RDKIT_TAUTOMERQUERY_H
#define RDKIT_TAUTOMERQUERY_H
#include <GraphMol/ROMol.h>
#include <GraphMol/MolPickler.h>
#include <vector>
#include <GraphMol/Substruct/SubstructMatch.h>
#include <DataStructs/ExplicitBitVect.h>
#ifdef RDK_USE_BOOST_SERIALIZATION
#include <RDGeneral/BoostStartInclude.h>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/split_member.hpp>
#include <RDGeneral/BoostEndInclude.h>
#endif
namespace RDKit {
class RWMol;
RDKIT_TAUTOMERQUERY_EXPORT bool TautomerQueryCanSerialize();
class RDKIT_TAUTOMERQUERY_EXPORT TautomerQuery {
private:
// Tautomers of the query
std::vector<ROMOL_SPTR> d_tautomers;
// Template query for substructure search
std::unique_ptr<const ROMol> d_templateMolecule;
// Tautomeric bonds and atoms
std::vector<size_t> d_modifiedAtoms;
std::vector<size_t> d_modifiedBonds;
// tests if a match to the template matches a specific tautomer
bool matchTautomer(const ROMol &mol, const ROMol &tautomer,
const std::vector<unsigned int> &match,
const SubstructMatchParameters ¶ms) const;
public:
TautomerQuery(std::vector<ROMOL_SPTR> tautomers,
const ROMol *const templateMolecule,
std::vector<size_t> modifiedAtoms,
std::vector<size_t> 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<ROMol>(*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<MatchVectType> substructOf(
const ROMol &mol,
const SubstructMatchParameters ¶ms = SubstructMatchParameters(),
std::vector<ROMOL_SPTR> *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<ROMOL_SPTR> getTautomers() const { return d_tautomers; }
const std::vector<size_t> getModifiedAtoms() const { return d_modifiedAtoms; }
const std::vector<size_t> 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 <class Archive>
void save(Archive &ar, const unsigned int version) const {
RDUNUSED_PARAM(version);
std::vector<std::string> 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 <class Archive>
void load(Archive &ar, const unsigned int version) {
RDUNUSED_PARAM(version);
std::vector<std::string> 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<MatchVectType> SubstructMatch(
const ROMol &mol, const TautomerQuery &query,
const SubstructMatchParameters ¶ms);
} // namespace RDKit
#endif // RDKIT_TAUTOMERQUERY_H
|