diff --git a/Code/JavaWrappers/ForceField.i b/Code/JavaWrappers/ForceField.i index fdfadcd53..03d552120 100644 --- a/Code/JavaWrappers/ForceField.i +++ b/Code/JavaWrappers/ForceField.i @@ -31,17 +31,20 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ %{ +#include #include #include -#include +#include +#include #include +#include #include #include #include #include #include -#include #include +#include #include #include %} @@ -50,18 +53,16 @@ %ignore ForceFields::ForceField::positions(); %ignore ForceFields::ForceField::positions() const; %rename(get) ForceFields::UFF::ParamCollection::operator(); + %include %include +%include %include %include -%include %include %include -%include %include -%include -%include - +%include %template(FF_Contrib_Vect) std::vector; %extend ForceFields::ForceField { @@ -107,8 +108,50 @@ } /* From GraphMol/ForceFieldHelpers/UFF/AtomTyper.h */ - static std::pair UFFGetAtomTypes(const RDKit::ROMol &mol, const std::string ¶mData="") { + static std::pair,bool> UFFGetAtomTypes(const RDKit::ROMol &mol, const std::string ¶mData="") { return RDKit::UFF::getAtomTypes(mol, paramData); } + + static int MMFFOptimizeMolecule(RDKit::ROMol &mol, + std::string mmffVariant="MMFF94", + int maxIters=200, + double nonBondedThresh=100.0, int confId=-1, + bool ignoreInterfragInteractions=true ) { + int res=1; + RDKit::MMFF::MMFFMolProperties mmffMolProperties(mol, mmffVariant); + + if (mmffMolProperties.isValid()) { + ForceFields::ForceField *ff = RDKit::MMFF::constructForceField(mol, + &mmffMolProperties, nonBondedThresh, confId, ignoreInterfragInteractions); + ff->initialize(); + res = ff->minimize(maxIters); + delete ff; + } else { + BOOST_LOG(rdErrorLog) << "Could not construct MMFF force field"<initialize(); + } else { + BOOST_LOG(rdErrorLog) << "Could not construct MMFF force field"<100.0); diff --git a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ForceFieldsTests.java b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ForceFieldsTests.java index 6062aa9a2..8279a41a7 100644 --- a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ForceFieldsTests.java +++ b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/ForceFieldsTests.java @@ -975,93 +975,10 @@ public class ForceFieldsTests extends GraphMolTest { } - // testUFFBuilder1 (first part)from testHelpers.cpp - @Test - public void testUFFBuilderTools1a() { - - ROMol mol; - Atomic_Params_Vect types; - ForceField field; - - mol = RWMol.MolFromSmiles("CC(O)C"); - Conformer conf = new Conformer(mol.getNumAtoms()); - @SuppressWarnings("unused") - int cid = (int) mol.addConformer(conf, true); - assertNotNull(mol); - Flagged_Atomic_Params_Vect flaggedParams = ForceField.UFFGetAtomTypes(mol); - assertTrue(flaggedParams.getSecond()); - types = flaggedParams.getFirst(); - assertEquals(mol.getNumAtoms(), types.size()); - field = new ForceField(); - RDKFuncs.addBonds(mol,types,field); - - assertEquals(3, field.contribs().size()); - - // Shared_Int_Array nbrMat = RDKFuncs.buildNeighborMatrix(mol); - // assertEquals(-2, nbrMat.getElement(0)); - // assertEquals(-1, nbrMat.getElement(1)); - // assertEquals(1, nbrMat.getElement(2)); - // assertEquals(1, nbrMat.getElement(3)); - - } - // // testUFFBuilder1 (second part)from testHelpers.cpp - // @Test - // public void testUFFBuilderTools1b() { - - // ROMol mol,mol2; - // Atomic_Params_Vect types; - // ForceField field; - - // mol = RWMol.MolFromSmiles("CO"); - // Conformer conf3 = new Conformer(mol.getNumAtoms()); - // long cid = mol.addConformer(conf3); - // assertNotNull(mol); - // Flagged_Atomic_Params_Vect flaggedParams = ForceField.UFFGetAtomTypes(mol); - // assertTrue(flaggedParams.getSecond()); - // types = flaggedParams.getFirst(); - // assertEquals(mol.getNumAtoms(), types.size()); - // field = new ForceField(); - // RDKFuncs.addBonds(mol,types,field); - - // assertEquals(1, field.contribs().size()); - // Shared_Int_Array nbrMat = RDKFuncs.buildNeighborMatrix(mol); - // assertEquals(-2, nbrMat.getElement(0)); - // assertEquals(-1, nbrMat.getElement(1)); - - // RDKFuncs.addAngles(mol,types,field,nbrMat); - // assertEquals(1, field.contribs().size()); - // RDKFuncs.addNonbonded(mol,(int) cid,types,field,nbrMat); - // assertEquals(1, field.contribs().size()); - // RDKFuncs.addTorsions(mol,types,field); - // assertEquals(1, field.contribs().size()); - - - // mol2 = mol.addHs(false); - // assertEquals(6, mol2.getNumAtoms()); - - // flaggedParams = ForceField.UFFGetAtomTypes(mol2); - // assertTrue(flaggedParams.getSecond()); - // types = flaggedParams.getFirst(); - // assertEquals(mol2.getNumAtoms(), types.size()); - - // field=new ForceField(); - // RDKFuncs.addBonds(mol2,types,field); - // assertEquals(5, field.contribs().size()); - - // nbrMat = RDKFuncs.buildNeighborMatrix(mol2); - // RDKFuncs.addAngles(mol2,types,field,nbrMat); - // assertEquals(12, field.contribs().size()); - // RDKFuncs.addNonbonded(mol2,(int) cid,types,field,nbrMat); - // assertEquals(15, field.contribs().size()); - // RDKFuncs.addTorsions(mol2,types,field); - // assertEquals(18, field.contribs().size()); - - // } @Test public void testUFFBuilderSpecialCases(){ int needMore; Point3D v1,v2; - ForceField field; String basePath = new File(getRdBase(), "/Code/GraphMol/ForceFieldHelpers/UFF/test_data").getPath(); @@ -1073,7 +990,7 @@ public class ForceFieldsTests extends GraphMolTest { mol.sanitizeMol(); Conformer conf = mol.getConformer(); - field = RDKFuncs.constructForceField(mol); + ForceField field = ForceField.UFFGetMoleculeForceField((ROMol)mol); assertNotNull(field); field.initialize(); needMore = field.minimize(200,1e-8,1e-4); @@ -1120,7 +1037,7 @@ public class ForceFieldsTests extends GraphMolTest { RWMol mol = RWMol.MolFromMolFile(pathName, true); assertNotNull(mol); - field = RDKFuncs.constructForceField(mol); + field = ForceField.UFFGetMoleculeForceField((ROMol)mol); assertNotNull(field); field.initialize(); needMore = field.minimize(200,1e-6,1e-3); @@ -1143,7 +1060,7 @@ public class ForceFieldsTests extends GraphMolTest { RWMol mol = RWMol.MolFromMolFile(pathName, true); assertNotNull(mol); - field = RDKFuncs.constructForceField(mol); + field = ForceField.UFFGetMoleculeForceField((ROMol)mol); assertNotNull(field); field.initialize(); needMore = field.minimize(200,1e-6,1e-3); @@ -1181,7 +1098,7 @@ public class ForceFieldsTests extends GraphMolTest { assertNull(types.get(0)); // make sure we can optimize anyway: - ForceField field = RDKFuncs.constructForceField(mol2,types); + ForceField field = ForceField.UFFGetMoleculeForceField(mol2); assertNotNull(field); field.initialize(); double e1=field.calcEnergy(); @@ -1191,6 +1108,40 @@ public class ForceFieldsTests extends GraphMolTest { } + @Test + public void testMMMFFBasics1() { + @SuppressWarnings("unused") + int needMore; + + String pathName = new File(getRdBase(), + "/Code/GraphMol/ForceFieldHelpers/MMFF/test_data/benzene.mol").getPath(); + RWMol mol = RWMol.MolFromMolFile(pathName, false); + assertNotNull(mol); + mol.sanitizeMol(); + + ForceField field = ForceField.MMFFGetMoleculeForceField((ROMol)mol); + assertNotNull(field); + field.initialize(); + needMore = field.minimize(200); + double e1 = field.calcEnergy(); + needMore = field.minimize(200); + double e2 = field.calcEnergy(); + assertTrue(e2