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));
63 unsigned int d_prbIdx;
64 unsigned int d_refIdx;
78 void append(
unsigned int prbIdx,
unsigned int refIdx,
double weight) {
80 o3aConstraint->d_idx = d_count;
81 o3aConstraint->d_prbIdx = prbIdx;
82 o3aConstraint->d_refIdx = refIdx;
83 o3aConstraint->d_weight =
weight;
84 d_o3aConstraintVect.push_back(boost::shared_ptr<O3AConstraint>(o3aConstraint));
85 std::sort(d_o3aConstraintVect.begin(),
86 d_o3aConstraintVect.end(), d_compareO3AConstraint);
89 std::vector<boost::shared_ptr<O3AConstraint> >::size_type
size() {
90 return d_o3aConstraintVect.size();
93 return d_o3aConstraintVect[i].get();
97 std::vector<boost::shared_ptr<O3AConstraint> > d_o3aConstraintVect;
98 static bool d_compareO3AConstraint(boost::shared_ptr<O3AConstraint> a, boost::shared_ptr<O3AConstraint> b)
100 return ((a->d_prbIdx != b->d_prbIdx) ? (a->d_prbIdx < b->d_prbIdx)
101 : ((a->d_refIdx != b->d_refIdx) ? (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");
142 boost::multi_array<int, 2> d_h;
156 d_cost(
boost::extents[dim][dim]) {};
158 int getCost(
const unsigned int i,
const unsigned int j) {
159 PRECONDITION(i < d_cost.shape()[0],
"Invalid index on LAP.cost");
160 PRECONDITION(j < d_cost.shape()[1],
"Invalid index on LAP.cost");
164 PRECONDITION(i < d_rowSol.size(),
"Invalid index on LAP.rowSol");
167 void computeMinCostPath(
const int dim);
171 (
const unsigned int,
const unsigned int,
double,
void *),
172 void *data,
const unsigned int n_bins = O3_MAX_H_BINS);
174 std::vector<int> d_rowSol;
175 std::vector<int> d_colSol;
176 std::vector<int> d_free;
177 std::vector<int> d_colList;
178 std::vector<int> d_matches;
179 std::vector<int> d_d;
180 std::vector<int> d_v;
181 std::vector<int> d_pred;
182 boost::multi_array<int, 2> d_cost;
192 d_o3aConstraintVect(o3aConstraintVect) {};
195 d_prbConf(other.d_prbConf),
196 d_refConf(other.d_refConf),
197 d_o3aConstraintVect(other.d_o3aConstraintVect),
198 d_SDMPtrVect(other.d_SDMPtrVect.size()) {
199 for (
unsigned int i = 0; i < d_SDMPtrVect.size(); ++i) {
200 d_SDMPtrVect[i] = boost::shared_ptr<SDMElement>(
new SDMElement());
201 memcpy(d_SDMPtrVect[i].
get(), other.d_SDMPtrVect[i].get(),
sizeof(SDMElement));
206 d_prbConf = other.d_prbConf;
207 d_refConf = other.d_refConf;
208 d_o3aConstraintVect = other.d_o3aConstraintVect;
209 d_SDMPtrVect.resize(other.d_SDMPtrVect.size());
210 for (
unsigned int i = 0; i < d_SDMPtrVect.size(); ++i) {
211 d_SDMPtrVect[i] = boost::shared_ptr<SDMElement>(
new SDMElement());
212 memcpy(d_SDMPtrVect[i].
get(), other.d_SDMPtrVect[i].get(),
sizeof(SDMElement));
219 void fillFromDist(
double threshold,
220 const boost::dynamic_bitset<> &refHvyAtoms,
221 const boost::dynamic_bitset<> &prbHvyAtoms);
222 void fillFromLAP(
LAP &lap);
223 double scoreAlignment(
double (*scoringFunc)
224 (
const unsigned int,
const unsigned int,
void *),
void *data);
227 (
const unsigned int,
const unsigned int,
void *),
void *data);
229 return d_SDMPtrVect.size();
232 typedef struct SDMElement {
242 std::vector<boost::shared_ptr<SDMElement> > d_SDMPtrVect;
243 static bool compareSDMScore(boost::shared_ptr<SDMElement> a, boost::shared_ptr<SDMElement> b)
245 return ((a->score != b->score) ? (a->score < b->score)
246 : ((a->cost != b->cost) ? (a->cost < b->cost)
247 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
248 : (a->idx[1] < b->idx[1]))));
250 static bool compareSDMDist(boost::shared_ptr<SDMElement> a, boost::shared_ptr<SDMElement> b)
252 double aWeight = (a->o3aConstraint ? a->o3aConstraint->getWeight() : 0.0);
253 double bWeight = (b->o3aConstraint ? b->o3aConstraint->getWeight() : 0.0);
254 return ((aWeight != bWeight) ? (aWeight > bWeight)
255 : ((a->sqDist != b->sqDist) ? (a->sqDist < b->sqDist)
256 : ((a->idx[0] != b->idx[0]) ? (a->idx[0] < b->idx[0])
257 : (a->idx[1] < b->idx[1]))));
270 const int prbCid = -1,
const int refCid = -1,
271 const bool reflect =
false,
const unsigned int maxIters = 50,
272 unsigned int options = 0,
const MatchVectType *constraintMap = NULL,
275 O3A(
int (*costFunc)(
const unsigned int,
const unsigned int,
double,
void *),
276 double (*weightFunc)(
const unsigned int,
const unsigned int,
void *),
277 double (*scoringFunc)(
const unsigned int,
const unsigned int,
void *),
278 void *data,
ROMol &prbMol,
const ROMol &refMol,
279 const int prbCid,
const int refCid,
280 boost::dynamic_bitset<> *prbHvyAtoms = NULL,
281 boost::dynamic_bitset<> *refHvyAtoms = NULL,
282 const bool reflect =
false,
const unsigned int maxIters = 50,
284 ROMol *extWorkPrbMol = NULL,
LAP *extLAP = NULL,
287 if (d_o3aMatchVect) {
288 delete d_o3aMatchVect;
300 return d_o3aMatchVect;
307 const ROMol *d_refMol;
311 unsigned int d_maxIters;
319 int o3aMMFFCostFunc(
const unsigned int prbIdx,
const unsigned int refIdx,
double hSum,
void *data);
320 double o3aMMFFWeightFunc(
const unsigned int prbIdx,
const unsigned int refIdx,
void *data);
321 double o3aMMFFScoringFunc(
const unsigned int prbIdx,
const unsigned int refIdx,
void *data);
322 int o3aCrippenCostFunc(
const unsigned int prbIdx,
const unsigned int refIdx,
double hSum,
void *data);
328 std::vector<boost::shared_ptr<O3A> > &res,
329 unsigned int numThreads=1,
331 const int refCid = -1,
332 const bool reflect =
false,
const unsigned int maxIters = 50,
333 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.
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
void getO3AForProbeConfs(ROMol &prbMol, const ROMol &refMol, void *prbProp, void *refProp, std::vector< boost::shared_ptr< O3A > > &res, unsigned 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)
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)