 |
RDKit
Open-source cheminformatics and machine learning.
|
Go to the documentation of this file.
11 #ifndef _RD_O3AALIGNMOLECULES_H_
12 #define _RD_O3AALIGNMOLECULES_H_
24 #include <boost/shared_ptr.hpp>
25 #include <boost/multi_array.hpp>
26 #include <boost/dynamic_bitset.hpp>
40 return ((x < 1.0e-10) && (x > -1.0e-10));
43 class O3AConstraintVect;
59 unsigned int d_prbIdx;
60 unsigned int d_refIdx;
73 void append(
unsigned int prbIdx,
unsigned int refIdx,
double weight) {
75 o3aConstraint->d_idx = d_count;
76 o3aConstraint->d_prbIdx = prbIdx;
77 o3aConstraint->d_refIdx = refIdx;
78 o3aConstraint->d_weight = weight;
79 d_o3aConstraintVect.push_back(
80 boost::shared_ptr<O3AConstraint>(o3aConstraint));
81 std::sort(d_o3aConstraintVect.begin(), d_o3aConstraintVect.end(),
82 d_compareO3AConstraint);
85 std::vector<boost::shared_ptr<O3AConstraint>>::size_type
size() {
86 return d_o3aConstraintVect.size();
89 return d_o3aConstraintVect[i].get();
94 std::vector<boost::shared_ptr<O3AConstraint>> d_o3aConstraintVect;
95 static bool d_compareO3AConstraint(boost::shared_ptr<O3AConstraint> a,
96 boost::shared_ptr<O3AConstraint> b) {
98 (a->d_prbIdx != b->d_prbIdx)
99 ? (a->d_prbIdx < b->d_prbIdx)
100 : ((a->d_refIdx != b->d_refIdx)
101 ? (a->d_refIdx < b->d_refIdx)
102 : ((a->d_weight != b->d_weight) ? (a->d_weight > b->d_weight)
103 : (a->d_idx < b->d_idx))));
136 inline int get(
const unsigned int y,
const unsigned int x)
const {
137 PRECONDITION(y < d_h.shape()[0],
"Invalid index on MolHistogram");
138 PRECONDITION(x < d_h.shape()[1],
"Invalid index on MolHistogram");
143 boost::multi_array<int, 2> d_h;
157 d_cost(
boost::extents[dim][dim]){};
159 int getCost(
const unsigned int i,
const unsigned int j) {
160 PRECONDITION(i < d_cost.shape()[0],
"Invalid index on LAP.cost");
161 PRECONDITION(j < d_cost.shape()[1],
"Invalid index on LAP.cost");
165 PRECONDITION(i < d_rowSol.size(),
"Invalid index on LAP.rowSol");
172 int (*costFunc)(
const unsigned int,
const unsigned int,
177 std::vector<int> d_rowSol;
178 std::vector<int> d_colSol;
179 std::vector<int> d_free;
180 std::vector<int> d_colList;
181 std::vector<int> d_matches;
182 std::vector<int> d_d;
183 std::vector<int> d_v;
184 std::vector<int> d_pred;
185 boost::multi_array<int, 2> d_cost;
193 : d_prbConf(prbConf),
195 d_o3aConstraintVect(o3aConstraintVect){};
198 : d_prbConf(other.d_prbConf),
199 d_refConf(other.d_refConf),
200 d_o3aConstraintVect(other.d_o3aConstraintVect),
201 d_SDMPtrVect(other.d_SDMPtrVect.size()) {
202 for (
unsigned int i = 0; i < d_SDMPtrVect.size(); ++i) {
203 d_SDMPtrVect[i] = boost::shared_ptr<SDMElement>(
new SDMElement());
204 memcpy(d_SDMPtrVect[i].get(), other.d_SDMPtrVect[i].get(),
210 if (
this == &other)
return *
this;
211 d_prbConf = other.d_prbConf;
212 d_refConf = other.d_refConf;
213 d_o3aConstraintVect = other.d_o3aConstraintVect;
214 d_SDMPtrVect.resize(other.d_SDMPtrVect.size());
215 for (
unsigned int i = 0; i < d_SDMPtrVect.size(); ++i) {
216 d_SDMPtrVect[i] = boost::shared_ptr<SDMElement>(
new SDMElement());
217 memcpy(d_SDMPtrVect[i].get(), other.d_SDMPtrVect[i].get(),
226 const boost::dynamic_bitset<> &refHvyAtoms,
227 const boost::dynamic_bitset<> &prbHvyAtoms);
230 const unsigned int,
void *),
234 double (*weightFunc)(
const unsigned int,
235 const unsigned int,
void *),
237 unsigned int size() {
return d_SDMPtrVect.size(); }
240 typedef struct SDMElement {
249 O3AConstraintVect *d_o3aConstraintVect;
250 std::vector<boost::shared_ptr<SDMElement>> d_SDMPtrVect;
251 static bool compareSDMScore(boost::shared_ptr<SDMElement> a,
252 boost::shared_ptr<SDMElement> b) {
253 return ((a->score != b->score)
254 ? (a->score < b->score)
255 : ((a->cost != b->cost)
256 ? (a->cost < b->cost)
257 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
258 : (a->idx[1] < b->idx[1]))));
260 static bool compareSDMDist(boost::shared_ptr<SDMElement> a,
261 boost::shared_ptr<SDMElement> b) {
262 double aWeight = (a->o3aConstraint ? a->o3aConstraint->getWeight() : 0.0);
263 double bWeight = (b->o3aConstraint ? b->o3aConstraint->getWeight() : 0.0);
264 return ((aWeight != bWeight)
265 ? (aWeight > bWeight)
266 : ((a->sqDist != b->sqDist)
267 ? (a->sqDist < b->sqDist)
268 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
269 : (a->idx[1] < b->idx[1]))));
276 typedef enum { MMFF94 = 0, CRIPPEN } AtomTypeScheme;
279 const int refCid = -1,
const bool reflect =
false,
280 const unsigned int maxIters = 50,
unsigned int options = 0,
285 O3A(
int (*costFunc)(
const unsigned int,
const unsigned int,
double,
void *),
286 double (*weightFunc)(
const unsigned int,
const unsigned int,
void *),
287 double (*scoringFunc)(
const unsigned int,
const unsigned int,
void *),
288 void *data,
ROMol &prbMol,
const ROMol &refMol,
const int prbCid,
289 const int refCid,
const boost::dynamic_bitset<> &prbHvyAtoms,
290 const boost::dynamic_bitset<> &refHvyAtoms,
const bool reflect =
false,
291 const unsigned int maxIters = 50,
unsigned int options = 0,
296 if (d_o3aMatchVect) {
297 delete d_o3aMatchVect;
305 double score() {
return d_o3aScore; };
311 const ROMol *d_refMol;
315 unsigned int d_maxIters;
322 const int seed = -1);
326 const unsigned int refIdx,
327 double hSum,
void *data);
329 const unsigned int refIdx,
332 const unsigned int refIdx,
335 const unsigned int refIdx,
336 double hSum,
void *data);
338 const unsigned int refIdx,
341 const unsigned int refIdx,
345 ROMol &prbMol,
const ROMol &refMol,
void *prbProp,
void *refProp,
346 std::vector<boost::shared_ptr<O3A>> &res,
int numThreads = 1,
348 const bool reflect =
false,
const unsigned int maxIters = 50,
349 unsigned int options = 0,
const MatchVectType *constraintMap = NULL,
int getRowSol(const unsigned int i)
void prepareMatchWeightsVect(RDKit::MatchVectType &matchVect, RDNumeric::DoubleVector &weights, double(*weightFunc)(const unsigned int, const unsigned int, void *), void *data)
const RDNumeric::DoubleVector * weights()
int get(const unsigned int y, const unsigned int x) const
Defines the primary molecule class ROMol as well as associated typedefs.
#define RDKIT_MOLALIGN_EXPORT
const double O3_RMSD_THRESHOLD
double trans(RDGeom::Transform3D &trans)
AtomTypeScheme
pre-defined atom typing schemes
const double O3_CHARGE_COEFF
const double O3_THRESHOLD_DIFF_DISTANCE
const RDKit::MatchVectType * matches()
const Conformer * refConf
RDKIT_MOLALIGN_EXPORT int o3aCrippenCostFunc(const unsigned int prbIdx, const unsigned int refIdx, double hSum, void *data)
const double O3_CRIPPEN_COEFF
RDKIT_MOLALIGN_EXPORT double o3aCrippenWeightFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
int getCost(const unsigned int i, const unsigned int j)
SDM(const Conformer *prbConf=NULL, const Conformer *refConf=NULL, O3AConstraintVect *o3aConstraintVect=NULL)
A class to represent vectors of numbers.
RDKIT_MOLALIGN_EXPORT double o3aCrippenScoringFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
const unsigned int O3_MAX_SDM_ITERATIONS
std::vector< boost::shared_ptr< O3AConstraint > >::size_type size()
O3AConstraint * operator[](unsigned int i)
std::vector< Point3D > POINT3D_VECT
void append(unsigned int prbIdx, unsigned int refIdx, double weight)
const double O3_CHARGE_WEIGHT
SDM & operator=(const SDM &other)
RDKIT_MOLALIGN_EXPORT const RDGeom::POINT3D_VECT * reflect(const Conformer &conf)
void fillFromLAP(LAP &lap)
void computeMinCostPath(const int dim)
const unsigned int O3_MAX_SDM_THRESHOLD_ITER
const int O3_MAX_WEIGHT_COEFF
const double O3_SDM_THRESHOLD_START
const double O3_SCORING_FUNCTION_ALPHA
const Conformer * prbConf
MolHistogram(const ROMol &mol, const double *dmat, bool cleanupDmat=false)
void computeCostMatrix(const ROMol &prbMol, const MolHistogram &prbHist, const ROMol &refMol, const MolHistogram &refHist, O3AConstraintVect *o3aConstraintVect, int(*costFunc)(const unsigned int, const unsigned int, double, void *), void *data, const unsigned int n_bins=O3_MAX_H_BINS)
const int O3_LARGE_NEGATIVE_WEIGHT
RDKIT_MOLALIGN_EXPORT double o3aMMFFWeightFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
O3A(int(*costFunc)(const unsigned int, const unsigned int, double, void *), double(*weightFunc)(const unsigned int, const unsigned int, void *), double(*scoringFunc)(const unsigned int, const unsigned int, void *), void *data, ROMol &prbMol, const ROMol &refMol, const int prbCid, const int refCid, const boost::dynamic_bitset<> &prbHvyAtoms, const boost::dynamic_bitset<> &refHvyAtoms, const bool reflect=false, const unsigned int maxIters=50, unsigned int options=0, O3AConstraintVect *o3aConstraintVect=NULL, ROMol *extWorkPrbMol=NULL, LAP *extLAP=NULL, MolHistogram *extPrbHist=NULL, MolHistogram *extRefHist=NULL)
RDKIT_MOLALIGN_EXPORT void getO3AForProbeConfs(ROMol &prbMol, const ROMol &refMol, void *prbProp, void *refProp, std::vector< boost::shared_ptr< O3A >> &res, int numThreads=1, O3A::AtomTypeScheme atomTypes=O3A::MMFF94, const int refCid=-1, const bool reflect=false, const unsigned int maxIters=50, unsigned int options=0, const MatchVectType *constraintMap=NULL, const RDNumeric::DoubleVector *constraintWeights=NULL)
RDKIT_MOLALIGN_EXPORT void randomTransform(ROMol &mol, const int cid=-1, const int seed=-1)
RDKIT_MOLALIGN_EXPORT double o3aMMFFScoringFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
const double O3_RANDOM_TRANS_COEFF
const double O3_SCORE_THRESHOLD
#define PRECONDITION(expr, mess)
O3A(ROMol &prbMol, const ROMol &refMol, void *prbProp, void *refProp, AtomTypeScheme atomTypes=MMFF94, const int prbCid=-1, const int refCid=-1, const bool reflect=false, const unsigned int maxIters=50, unsigned int options=0, const MatchVectType *constraintMap=NULL, const RDNumeric::DoubleVector *constraintWeights=NULL, LAP *extLAP=NULL, MolHistogram *extPrbHist=NULL, MolHistogram *extRefHist=NULL)
const double O3_SCORING_FUNCTION_BETA
const int O3_DEFAULT_CONSTRAINT_WEIGHT
void fillFromDist(double threshold, const boost::dynamic_bitset<> &refHvyAtoms, const boost::dynamic_bitset<> &prbHvyAtoms)
const double O3_CRIPPEN_WEIGHT
const double O3_SDM_THRESHOLD_STEP
double scoreAlignment(double(*scoringFunc)(const unsigned int, const unsigned int, void *), void *data)
const unsigned int O3_MAX_H_BINS
RDKIT_MOLALIGN_EXPORT int o3aMMFFCostFunc(const unsigned int prbIdx, const unsigned int refIdx, double hSum, void *data)
std::vector< std::pair< int, int > > MatchVectType
used to return matches from substructure searching, The format is (queryAtomIdx, molAtomIdx)
bool isDoubleZero(const double x)