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));
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");
168 void computeMinCostPath(
const int dim);
172 int (*costFunc)(
const unsigned int,
const unsigned int,
174 void *data,
const unsigned int n_bins = O3_MAX_H_BINS);
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;
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 d_prbConf = other.d_prbConf;
211 d_refConf = other.d_refConf;
212 d_o3aConstraintVect = other.d_o3aConstraintVect;
213 d_SDMPtrVect.resize(other.d_SDMPtrVect.size());
214 for (
unsigned int i = 0; i < d_SDMPtrVect.size(); ++i) {
215 d_SDMPtrVect[i] = boost::shared_ptr<SDMElement>(
new SDMElement());
216 memcpy(d_SDMPtrVect[i].
get(), other.d_SDMPtrVect[i].get(),
224 void fillFromDist(
double threshold,
225 const boost::dynamic_bitset<> &refHvyAtoms,
226 const boost::dynamic_bitset<> &prbHvyAtoms);
227 void fillFromLAP(
LAP &lap);
228 double scoreAlignment(
double (*scoringFunc)(
const unsigned int,
229 const unsigned int,
void *),
233 double (*weightFunc)(
const unsigned int,
234 const unsigned int,
void *),
236 unsigned int size() {
return d_SDMPtrVect.size(); }
239 typedef struct SDMElement {
249 std::vector<boost::shared_ptr<SDMElement> > d_SDMPtrVect;
250 static bool compareSDMScore(boost::shared_ptr<SDMElement> a,
251 boost::shared_ptr<SDMElement> b) {
252 return ((a->score != b->score)
253 ? (a->score < b->score)
254 : ((a->cost != b->cost)
255 ? (a->cost < b->cost)
256 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
257 : (a->idx[1] < b->idx[1]))));
259 static bool compareSDMDist(boost::shared_ptr<SDMElement> a,
260 boost::shared_ptr<SDMElement> b) {
261 double aWeight = (a->o3aConstraint ? a->o3aConstraint->getWeight() : 0.0);
262 double bWeight = (b->o3aConstraint ? b->o3aConstraint->getWeight() : 0.0);
263 return ((aWeight != bWeight)
264 ? (aWeight > bWeight)
265 : ((a->sqDist != b->sqDist)
266 ? (a->sqDist < b->sqDist)
267 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
268 : (a->idx[1] < b->idx[1]))));
277 AtomTypeScheme atomTypes = MMFF94,
const int prbCid = -1,
278 const int refCid = -1,
const bool reflect =
false,
279 const unsigned int maxIters = 50,
unsigned int options = 0,
284 O3A(
int (*costFunc)(
const unsigned int,
const unsigned int,
double,
void *),
285 double (*weightFunc)(
const unsigned int,
const unsigned int,
void *),
286 double (*scoringFunc)(
const unsigned int,
const unsigned int,
void *),
287 void *data,
ROMol &prbMol,
const ROMol &refMol,
const int prbCid,
288 const int refCid, boost::dynamic_bitset<> *prbHvyAtoms = NULL,
289 boost::dynamic_bitset<> *refHvyAtoms = NULL,
const bool reflect =
false,
290 const unsigned int maxIters = 50,
unsigned int options = 0,
295 if (d_o3aMatchVect) {
296 delete d_o3aMatchVect;
304 double score() {
return d_o3aScore; };
310 const ROMol *d_refMol;
314 unsigned int d_maxIters;
322 int o3aMMFFCostFunc(
const unsigned int prbIdx,
const unsigned int refIdx,
323 double hSum,
void *data);
329 double hSum,
void *data);
331 const unsigned int refIdx,
void *data);
333 const unsigned int refIdx,
void *data);
337 std::vector<boost::shared_ptr<O3A> > &res,
int numThreads = 1,
339 const bool reflect =
false,
const unsigned int maxIters = 50,
340 unsigned int options = 0,
const MatchVectType *constraintMap = NULL,
const double O3_SDM_THRESHOLD_START
std::vector< boost::shared_ptr< O3AConstraint > >::size_type size()
const double O3_THRESHOLD_DIFF_DISTANCE
const double O3_SCORE_THRESHOLD
std::vector< std::pair< int, int > > MatchVectType
used to return matches from substructure searching, The format is (queryAtomIdx, molAtomIdx) ...
const double O3_CHARGE_WEIGHT
O3AConstraint * operator[](unsigned int i)
Defines the primary molecule class ROMol as well as associated typedefs.
const RDGeom::POINT3D_VECT * reflect(const Conformer &conf)
void append(unsigned int prbIdx, unsigned int refIdx, double weight)
double o3aCrippenScoringFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
std::vector< Point3D > POINT3D_VECT
int o3aMMFFCostFunc(const unsigned int prbIdx, const unsigned int refIdx, double hSum, void *data)
SDM & operator=(const SDM &other)
ROMol is a molecule class that is intended to have a fixed topology.
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)
int o3aCrippenCostFunc(const unsigned int prbIdx, const unsigned int refIdx, double hSum, void *data)
const double O3_RANDOM_TRANS_COEFF
void randomTransform(ROMol &mol, const int cid=-1, const int seed=-1)
const double O3_CHARGE_COEFF
const unsigned int O3_MAX_SDM_ITERATIONS
const unsigned int O3_MAX_H_BINS
const RDKit::MatchVectType * matches()
const double O3_CRIPPEN_WEIGHT
const unsigned int O3_MAX_SDM_THRESHOLD_ITER
const RDNumeric::DoubleVector * weights()
const double O3_SCORING_FUNCTION_BETA
int getRowSol(const unsigned int i)
Includes a bunch of functionality for handling Atom and Bond queries.
const double O3_SDM_THRESHOLD_STEP
const double O3_RMSD_THRESHOLD
bool isDoubleZero(const double x)
AtomTypeScheme
pre-defined atom typing schemes
const int O3_MAX_WEIGHT_COEFF
SDM(const Conformer *prbConf=NULL, const Conformer *refConf=NULL, O3AConstraintVect *o3aConstraintVect=NULL)
const Conformer * prbConf
const Conformer * refConf
const int O3_DEFAULT_CONSTRAINT_WEIGHT
#define PRECONDITION(expr, mess)
const int O3_LARGE_NEGATIVE_WEIGHT
struct RDKit::MolAlign::O3AFuncData O3AFuncData
double o3aMMFFWeightFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
const double O3_SCORING_FUNCTION_ALPHA
const double O3_CRIPPEN_COEFF
double o3aCrippenWeightFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
A class to represent vectors of numbers.
double o3aMMFFScoringFunc(const unsigned int prbIdx, const unsigned int refIdx, void *data)
int getCost(const unsigned int i, const unsigned int j)