/usr/include/rdkit/GraphMol/FMCS/Seed.h is in librdkit-dev 201603.5-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | //
// 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.
//
#pragma once
#include <map>
#include "../RDKitBase.h"
#include "DebugTrace.h" // algorithm optimisation definitions
#include "Graph.h"
#include "DuplicatedSeedCache.h"
#include "SubstructMatchCustom.h"
namespace RDKit {
namespace FMCS {
class MaximumCommonSubgraph;
struct TargetMatch;
struct MolFragment { // Reference to a fragment of source molecule
std::vector<const Atom*> Atoms;
std::vector<const Bond*> Bonds;
std::vector<unsigned> AtomsIdx;
std::vector<unsigned> BondsIdx; // need for results and size() only !
std::map<unsigned, unsigned> SeedAtomIdxMap; // Full Query Molecule to Seed
// indeces backward conversion
// map
};
struct NewBond {
unsigned SourceAtomIdx; // index in the seed. Atom is already in the seed
unsigned BondIdx; // index in qmol of new bond scheduled to be added into
// seed. This is outgoing bond from SourceAtomIdx
unsigned NewAtomIdx; // index in qmol of new atom scheduled to be added into
// seed. Another end of new bond
const Atom* NewAtom; // pointer to qmol's new atom scheduled to be added into
// seed. Another end of new bond
unsigned EndAtomIdx; // index in the seed. RING. "New" Atom on the another
// end of new bond is already exists in the seed.
NewBond()
: SourceAtomIdx(-1),
BondIdx(-1),
NewAtomIdx(-1),
NewAtom(0),
EndAtomIdx(-1) {}
NewBond(unsigned from_atom, unsigned bond_idx, unsigned new_atom,
unsigned to_atom, const Atom* a)
: SourceAtomIdx(from_atom),
BondIdx(bond_idx),
NewAtomIdx(new_atom),
NewAtom(a),
EndAtomIdx(to_atom) {}
};
class Seed {
private:
mutable std::vector<NewBond> NewBonds; // for multistage growing. all
// directly connected outgoing bonds
public:
bool CopyComplete; // this seed has been completely copied into list.
// postponed non0locked copy for MULTI_THREAD
mutable unsigned GrowingStage; // 0 new seed; -1 finished; n>0 in progress,
// exact stage of growing for SDF
MolFragment MoleculeFragment; // Reference to a fragment of source molecule
Graph Topology; // seed topology with references to source molecule
std::vector<bool> ExcludedBonds;
unsigned LastAddedAtomsBeginIdx; // in this subgraph for improving
// performance of future growing
unsigned LastAddedBondsBeginIdx; // in this subgraph for DEBUG ONLY
unsigned RemainingBonds;
unsigned RemainingAtoms;
#ifdef DUP_SUBSTRUCT_CACHE
DuplicatedSeedCache::TKey DupCacheKey;
#endif
std::vector<TargetMatch> MatchResult; // for each target
public:
Seed()
: CopyComplete(false),
GrowingStage(0),
LastAddedAtomsBeginIdx(0),
LastAddedBondsBeginIdx(0),
RemainingBonds(-1),
RemainingAtoms(-1) {}
void setMoleculeFragment(const Seed& src) {
MoleculeFragment = src.MoleculeFragment;
}
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;
#ifdef DUP_SUBSTRUCT_CACHE
DupCacheKey = src.DupCacheKey;
#endif
MatchResult = src.MatchResult;
CopyComplete = true; // LAST
return *this;
}
void createFromParent(const Seed* parent) {
MoleculeFragment = parent->MoleculeFragment;
Topology = parent->Topology;
ExcludedBonds = parent->ExcludedBonds;
RemainingBonds = parent->RemainingBonds;
RemainingAtoms = parent->RemainingAtoms;
#ifdef DUP_SUBSTRUCT_CACHE
DupCacheKey = parent->DupCacheKey;
#endif
LastAddedAtomsBeginIdx = getNumAtoms(); // previous size
LastAddedBondsBeginIdx = getNumBonds(); // previous size
GrowingStage = 0;
}
unsigned getNumAtoms() const { return MoleculeFragment.AtomsIdx.size(); }
unsigned getNumBonds() const { return MoleculeFragment.BondsIdx.size(); }
void grow(MaximumCommonSubgraph& mcs) const;
bool canGrowBiggerThan(unsigned maxBonds,
unsigned maxAtoms) const { // prune()
return RemainingBonds + getNumBonds() > maxBonds ||
(RemainingBonds + getNumBonds() == maxBonds &&
RemainingAtoms + getNumAtoms() > maxAtoms);
}
void computeRemainingSize(const ROMol& qmol);
unsigned addAtom(const Atom* atom);
unsigned addBond(const Bond* bond);
void fillNewBonds(const ROMol& qmol);
};
}
}
|