1 #include "RDMolImpl.h"
2 #include <GraphMol/RDKitBase.h>
3 #include <GraphMol/SmilesParse/SmilesParse.h>
4 #include <GraphMol/SmilesParse/SmilesWrite.h>
5 #include <GraphMol/FileParsers/Fileparsers.h>
6 #include <GraphMol/Substruct/SubstructMatch.h>
7 #include <GraphMol/Descriptors/MolDescriptors.h>
8 #include <GraphMol/DistGeomHelpers/Embedder.h>
9 #include <ForceField/ForceField.h>
10 #include <GraphMol/ForceFieldHelpers/UFF/Builder.h>
11 #include <string>
12 #include <vector>
13 #include <nsMemory.h>
14 
NS_IMPL_ISUPPORTS1(RDMolecule,IRDMolecule)15 NS_IMPL_ISUPPORTS1(RDMolecule, IRDMolecule)
16 
17 RDMolecule::~RDMolecule() {
18   if (this->dp_mol) {
19     delete dp_mol;
20     dp_mol = 0;
21   }
22 }
23 
24 /* double GetMW (); */
GetMW(double * _retval)25 NS_IMETHODIMP RDMolecule::GetMW(double *_retval) {
26   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
27   RDKit::PeriodicTable *pt = RDKit::PeriodicTable::getTable();
28   *_retval = 0.0;
29   for (RDKit::ROMol::AtomIterator atIt = dp_mol->beginAtoms();
30        atIt != dp_mol->endAtoms(); atIt++) {
31     *_retval += (*atIt)->getMass() +
32                 (*atIt)->getNumImplicitHs() * pt->getAtomicWeight(1);
33   }
34   return NS_OK;
35 }
36 
37 /* string GetSmiles (); */
GetSmiles(char ** _retval)38 NS_IMETHODIMP RDMolecule::GetSmiles(char **_retval) {
39   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
40   std::string smi = RDKit::MolToSmiles(*dp_mol);
41   *_retval =
42       (char *)nsMemory::Clone(smi.c_str(), sizeof(char) * (smi.size() + 1));
43   return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
44 }
45 
46 /* unsigned long GetSmartsMatchCount (in string smarts); */
GetSmartsMatchCount(const char * smarts,PRUint32 * _retval)47 NS_IMETHODIMP RDMolecule::GetSmartsMatchCount(const char *smarts,
48                                               PRUint32 *_retval) {
49   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
50   RDKit::ROMol *patt = RDKit::SmartsToMol(std::string(smarts));
51   if (!patt) return NS_ERROR_FAILURE;
52 
53   std::vector<RDKit::MatchVectType> matches;
54   int res = RDKit::SubstructMatch(dp_mol, patt, matches);
55   *_retval = res;
56   return NS_OK;
57 }
58 
59 /* double LogP (); */
LogP(double * _retval)60 NS_IMETHODIMP RDMolecule::LogP(double *_retval) {
61   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
62   double logp;
63   if (dp_mol->hasProp(common_properties::_CrippenLogP)) {
64     dp_mol->getProp(common_properties::_CrippenLogP, logp);
65   } else {
66     double mr;
67     RDKit::Descriptors::CalcCrippenDescriptors(dp_mol, logp, mr);
68     dp_mol->setProp(common_properties::_CrippenLogP, logp, true);
69     dp_mol->setProp(common_properties::_CrippenMR, mr, true);
70   }
71   *_retval = logp;
72   return NS_OK;
73 }
74 
75 /* double MR (); */
MR(double * _retval)76 NS_IMETHODIMP RDMolecule::MR(double *_retval) {
77   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
78   double mr;
79   if (dp_mol->hasProp(common_properties::_CrippenMR)) {
80     dp_mol->getProp(common_properties::_CrippenMR, mr);
81   } else {
82     double logp;
83     RDKit::Descriptors::CalcCrippenDescriptors(dp_mol, logp, mr);
84     dp_mol->setProp(common_properties::_CrippenLogP, logp, true);
85     dp_mol->setProp(common_properties::_CrippenMR, mr, true);
86   }
87   *_retval = mr;
88   return NS_OK;
89 }
90 
91 /* string GetMolBlock (); */
GetMolBlock(char ** _retval)92 NS_IMETHODIMP RDMolecule::GetMolBlock(char **_retval) {
93   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
94   std::string molB = RDKit::MolToMolBlock(dp_mol);
95   *_retval =
96       (char *)nsMemory::Clone(molB.c_str(), sizeof(char) * (molB.size() + 1));
97   return *_retval ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
98 }
99 
100 /* void Generate3DCoords (); */
Generate3DCoords()101 NS_IMETHODIMP RDMolecule::Generate3DCoords() {
102   if (!dp_mol) return NS_ERROR_NOT_INITIALIZED;
103   bool embedded = RDKit::DGeomHelpers::EmbedMolecule(*dp_mol);
104   if (!embedded) return NS_ERROR_FAILURE;
105 
106   ForceFields::ForceField *ff = RDKit::UFF::constructForceField(dp_mol);
107   if (!ff) return NS_ERROR_FAILURE;
108   ff->initialize();
109   int needsMore = ff->minimize();
110   delete ff;
111   if (needsMore) return NS_ERROR_FAILURE;
112   return NS_OK;
113 }
114