Loading...
Searching...
No Matches
Seed.h
Go to the documentation of this file.
//
// Copyright (C) 2014 Novartis Institutes for BioMedical Research
//
// @@ 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>
#pragma once
#include <map>
#include <boost/dynamic_bitset.hpp>
#include "../RDKitBase.h"
// algorithm optimisation definitions
#include "DebugTrace.h"
#include "Graph.h"
#include "DuplicatedSeedCache.h"
#include "SubstructMatchCustom.h"
#include "TargetMatch.h"
namespace RDKit {
namespace FMCS {
class MaximumCommonSubgraph;
struct TargetMatch;
// Reference to a fragment of source molecule
struct RDKIT_FMCS_EXPORT MolFragment {
std::vector<const Atom *> Atoms;
std::vector<const Bond *> Bonds;
// Full Query Molecule to Seed indices backward conversionmap
std::map<unsigned int, unsigned int> SeedAtomIdxMap;
};
struct RDKIT_FMCS_EXPORT NewBond {
// index in qmol of new bond scheduled to be added into
// seed. This is outgoing bond from SourceAtomIdx
unsigned int BondIdx{0};
// index in qmol of new atom scheduled to be
// added into seed. Another end of new bond
unsigned int NewAtomIdx{0};
// index in the seed. RING. "New" Atom on the another
// end of new bond if it already exists in the seed.
unsigned int EndAtomIdx{0};
// pointer to qmol's new atom scheduled to be
// added into seed. Another end of new bond
const Atom *NewAtom{nullptr};
NewBond()
{}
NewBond(unsigned int bond_idx, unsigned int new_atom, unsigned int to_atom,
const Atom *a)
: BondIdx(bond_idx),
NewAtomIdx(new_atom),
EndAtomIdx(to_atom),
NewAtom(a) {}
};
class RDKIT_FMCS_EXPORT Seed {
private:
boost::dynamic_bitset<> addNewBondsToSeed(const ROMol &qmol,
Seed &seed) const;
bool canAddAllNonFusedRingBondsConnectedToBond(
const Atom &srcAtom, const Bond &bond, MaximumCommonSubgraph &mcs) const;
void addNewBondFromAtom(const Atom &srcAtom, const Bond &bond) const;
// for multistage growing. all directly connected outgoing bonds
mutable std::vector<NewBond> NewBonds;
bool StoreAllDegenerateMCS = false;
public:
// this seed has been completely copied into list.
// postponed non-locked copy for MULTI_THREAD
bool CopyComplete{false};
// 0 new seed; -1 finished; n>0 in
// progress, exact stage of growing for SDF
mutable unsigned int GrowingStage{0};
// Reference to a fragment of source molecule
MolFragment MoleculeFragment;
// seed topology with references to source molecule
Graph Topology;
boost::dynamic_bitset<> ExcludedBonds;
// in this subgraph for improving performance of future growing
unsigned int LastAddedAtomsBeginIdx{0};
// in this subgraph for DEBUG ONLY
unsigned int LastAddedBondsBeginIdx{0};
unsigned int RemainingBonds{0};
unsigned int RemainingAtoms{0};
#ifdef DUP_SUBSTRUCT_CACHE
DuplicatedSeedCache::TKey DupCacheKey;
#endif
// for each target
std::vector<TargetMatch> MatchResult;
public:
Seed() {}
// Defined explicitly (rather than defaulted) so that copying goes through
// operator=, which sets CopyComplete last as a publication barrier for the
// multi-threaded growing path. Without a user-declared copy constructor the
// implicit one would be used and is deprecated (-Wdeprecated-copy), since
// operator= is user-provided.
Seed(const Seed &src) { *this = src; }
Seed &operator=(const Seed &src) {
NewBonds = src.NewBonds;
GrowingStage = src.GrowingStage;
MoleculeFragment = src.MoleculeFragment;
Topology = src.Topology;
ExcludedBonds = src.ExcludedBonds;
LastAddedAtomsBeginIdx = src.LastAddedAtomsBeginIdx;
LastAddedBondsBeginIdx = src.LastAddedBondsBeginIdx;
RemainingBonds = src.RemainingBonds;
RemainingAtoms = src.RemainingAtoms;
StoreAllDegenerateMCS = src.StoreAllDegenerateMCS;
#ifdef DUP_SUBSTRUCT_CACHE
DupCacheKey = src.DupCacheKey;
#endif
MatchResult = src.MatchResult;
CopyComplete = true; // LAST
return *this;
}
void setMoleculeFragment(const Seed &src) {
MoleculeFragment = src.MoleculeFragment;
}
void createFromParent(const Seed *parent) {
MoleculeFragment = parent->MoleculeFragment;
Topology = parent->Topology;
ExcludedBonds = parent->ExcludedBonds;
RemainingBonds = parent->RemainingBonds;
RemainingAtoms = parent->RemainingAtoms;
StoreAllDegenerateMCS = parent->StoreAllDegenerateMCS;
#ifdef DUP_SUBSTRUCT_CACHE
DupCacheKey = parent->DupCacheKey;
#endif
LastAddedAtomsBeginIdx = getNumAtoms(); // previous size
LastAddedBondsBeginIdx = getNumBonds(); // previous size
GrowingStage = 0;
}
unsigned int getNumAtoms() const { return MoleculeFragment.Atoms.size(); }
unsigned int getNumBonds() const { return MoleculeFragment.Bonds.size(); }
void grow(MaximumCommonSubgraph &mcs) const;
bool canGrowBiggerThan(unsigned int maxBonds, unsigned int maxAtoms) const {
return RemainingBonds + getNumBonds() > maxBonds ||
(RemainingBonds + getNumBonds() == maxBonds &&
(RemainingAtoms + getNumAtoms() > maxAtoms ||
(StoreAllDegenerateMCS &&
RemainingAtoms + getNumAtoms() == maxAtoms)));
}
void computeRemainingSize(const ROMol &qmol);
unsigned int addAtom(const Atom *atom);
unsigned int addBond(const Bond *bond);
void fillNewBonds(const ROMol &qmol,
MaximumCommonSubgraph *mcs = nullptr) const;
void setStoreAllDegenerateMCS(bool value) { StoreAllDegenerateMCS = value; }
};
} // namespace FMCS
} // namespace RDKit
DebugTrace.h
DuplicatedSeedCache.h
Graph.h
RDKitBase.h
pulls in the core RDKit functionality
SubstructMatchCustom.h
TargetMatch.h
RDKit::Atom
The class for representing atoms.
Definition Atom.h:74
RDKit::Bond
class for representing a bond
Definition Bond.h:46
RDKit::FMCS::DuplicatedSeedCache::TKey
Definition DuplicatedSeedCache.h:22
RDKit::FMCS::Graph
Definition Graph.h:26
RDKit::FMCS::MaximumCommonSubgraph
Definition MaximumCommonSubgraph.h:38
RDKit::FMCS::Seed::LastAddedBondsBeginIdx
unsigned int LastAddedBondsBeginIdx
Definition Seed.h:88
RDKit::FMCS::Seed::addBond
unsigned int addBond(const Bond *bond)
RDKit::FMCS::Seed::getNumAtoms
unsigned int getNumAtoms() const
Definition Seed.h:142
RDKit::FMCS::Seed::createFromParent
void createFromParent(const Seed *parent)
Definition Seed.h:127
RDKit::FMCS::Seed::GrowingStage
unsigned int GrowingStage
Definition Seed.h:78
RDKit::FMCS::Seed::LastAddedAtomsBeginIdx
unsigned int LastAddedAtomsBeginIdx
Definition Seed.h:86
RDKit::FMCS::Seed::getNumBonds
unsigned int getNumBonds() const
Definition Seed.h:143
RDKit::FMCS::Seed::Seed
Seed(const Seed &src)
Definition Seed.h:104
RDKit::FMCS::Seed::grow
void grow(MaximumCommonSubgraph &mcs) const
RDKit::FMCS::Seed::setStoreAllDegenerateMCS
void setStoreAllDegenerateMCS(bool value)
Definition Seed.h:159
RDKit::FMCS::Seed::Seed
Seed()
Definition Seed.h:98
RDKit::FMCS::Seed::fillNewBonds
void fillNewBonds(const ROMol &qmol, MaximumCommonSubgraph *mcs=nullptr) const
RDKit::FMCS::Seed::RemainingAtoms
unsigned int RemainingAtoms
Definition Seed.h:90
RDKit::FMCS::Seed::MoleculeFragment
MolFragment MoleculeFragment
Definition Seed.h:80
RDKit::FMCS::Seed::DupCacheKey
DuplicatedSeedCache::TKey DupCacheKey
Definition Seed.h:92
RDKit::FMCS::Seed::MatchResult
std::vector< TargetMatch > MatchResult
Definition Seed.h:95
RDKit::FMCS::Seed::setMoleculeFragment
void setMoleculeFragment(const Seed &src)
Definition Seed.h:124
RDKit::FMCS::Seed::RemainingBonds
unsigned int RemainingBonds
Definition Seed.h:89
RDKit::FMCS::Seed::canGrowBiggerThan
bool canGrowBiggerThan(unsigned int maxBonds, unsigned int maxAtoms) const
Definition Seed.h:146
RDKit::FMCS::Seed::addAtom
unsigned int addAtom(const Atom *atom)
RDKit::FMCS::Seed::ExcludedBonds
boost::dynamic_bitset ExcludedBonds
Definition Seed.h:84
RDKit::FMCS::Seed::operator=
Seed & operator=(const Seed &src)
Definition Seed.h:106
RDKit::FMCS::Seed::CopyComplete
bool CopyComplete
Definition Seed.h:75
RDKit::FMCS::Seed::computeRemainingSize
void computeRemainingSize(const ROMol &qmol)
RDKit::FMCS::Seed::Topology
Graph Topology
Definition Seed.h:82
RDKit::ROMol
Definition ROMol.h:319
export.h
RDKIT_FMCS_EXPORT
#define RDKIT_FMCS_EXPORT
Definition export.h:169
RDKit::FMCS
Definition Composition2N.h:13
RDKit
Std stuff.
Definition Abbreviations.h:19
RDKit::FMCS::MolFragment
Definition Seed.h:28
RDKit::FMCS::MolFragment::SeedAtomIdxMap
std::map< unsigned int, unsigned int > SeedAtomIdxMap
Definition Seed.h:32
RDKit::FMCS::MolFragment::Bonds
std::vector< const Bond * > Bonds
Definition Seed.h:30
RDKit::FMCS::MolFragment::Atoms
std::vector< const Atom * > Atoms
Definition Seed.h:29
RDKit::FMCS::NewBond::NewBond
NewBond()
Definition Seed.h:49
RDKit::FMCS::NewBond::NewAtomIdx
unsigned int NewAtomIdx
Definition Seed.h:41
RDKit::FMCS::NewBond::BondIdx
unsigned int BondIdx
Definition Seed.h:38
RDKit::FMCS::NewBond::NewBond
NewBond(unsigned int bond_idx, unsigned int new_atom, unsigned int to_atom, const Atom *a)
Definition Seed.h:53
RDKit::FMCS::NewBond::NewAtom
const Atom * NewAtom
Definition Seed.h:47
RDKit::FMCS::NewBond::EndAtomIdx
unsigned int EndAtomIdx
Definition Seed.h:44
RDKit::FMCS::TargetMatch
Definition TargetMatch.h:23