diff --git a/modules/mol/mm/examples/gb_example_traj.dcd b/modules/mol/mm/examples/gb_example_traj.dcd index f2dda449862fad41d41373d4ec76e52b72617d76..a3b16707652ff63865c1e1068966cc29d9f0dd9f 100644 Binary files a/modules/mol/mm/examples/gb_example_traj.dcd and b/modules/mol/mm/examples/gb_example_traj.dcd differ diff --git a/modules/mol/mm/pymod/export_openmm.cc b/modules/mol/mm/pymod/export_openmm.cc index 7c97b7964854d551106ff1d07f68da85915194f9..1d3d73d73af88bd203b0095e7ed6b0a81ec5df7c 100644 --- a/modules/mol/mm/pymod/export_openmm.cc +++ b/modules/mol/mm/pymod/export_openmm.cc @@ -18,10 +18,9 @@ //------------------------------------------------------------------------------ #include <OpenMM.h> #include <boost/python.hpp> -#include <ost/mol/mm/simulation.hh> using namespace boost::python; -using namespace ost::mol::mm; + void export_OpenMM() @@ -31,16 +30,11 @@ void export_OpenMM() class_<OpenMM::Integrator, boost::noncopyable>("Integrator",no_init) .def("GetConstraintTolerance",&OpenMM::Integrator::getConstraintTolerance) .def("SetConstraintTolerance",&OpenMM::Integrator::setConstraintTolerance) - ; - boost::python::register_ptr_to_python<ost::mol::mm::IntegratorPtr>(); - - class_<OpenMM::VerletIntegrator, bases<OpenMM::Integrator> >("VerletIntegrator", init<Real>()); - boost::python::register_ptr_to_python<ost::mol::mm::VerletIntegratorPtr>(); + class_<OpenMM::VerletIntegrator, bases<OpenMM::Integrator> >("VerletIntegrator", init<double>()); - - class_<OpenMM::BrownianIntegrator, bases<OpenMM::Integrator> >("BrownianIntegrator", init<Real,Real,Real>()) + class_<OpenMM::BrownianIntegrator, bases<OpenMM::Integrator> >("BrownianIntegrator", init<double,double,double>()) .def("GetTemperature",&OpenMM::BrownianIntegrator::getTemperature) .def("SetTemperature",&OpenMM::BrownianIntegrator::setTemperature) .def("GetFriction",&OpenMM::BrownianIntegrator::getFriction) @@ -48,10 +42,8 @@ void export_OpenMM() .def("GetRandomNumberSeed",&OpenMM::BrownianIntegrator::getRandomNumberSeed) .def("SetRandomNumberSeed",&OpenMM::BrownianIntegrator::setRandomNumberSeed) ; - boost::python::register_ptr_to_python<ost::mol::mm::BrownianIntegratorPtr>(); - - class_<OpenMM::LangevinIntegrator, bases<OpenMM::Integrator> >("LangevinIntegrator", init<Real,Real,Real>()) + class_<OpenMM::LangevinIntegrator, bases<OpenMM::Integrator> >("LangevinIntegrator", init<double,double,double>()) .def("GetTemperature",&OpenMM::LangevinIntegrator::getTemperature) .def("SetTemperature",&OpenMM::LangevinIntegrator::setTemperature) .def("GetFriction",&OpenMM::LangevinIntegrator::getFriction) @@ -59,17 +51,13 @@ void export_OpenMM() .def("GetRandomNumberSeed",&OpenMM::LangevinIntegrator::getRandomNumberSeed) .def("SetRandomNumberSeed",&OpenMM::LangevinIntegrator::setRandomNumberSeed) ; - boost::python::register_ptr_to_python<ost::mol::mm::LangevinIntegratorPtr>(); - - class_<OpenMM::VariableVerletIntegrator, bases<OpenMM::Integrator> >("VariableVerletIntegrator",init<Real>()) + class_<OpenMM::VariableVerletIntegrator, bases<OpenMM::Integrator> >("VariableVerletIntegrator",init<double>()) .def("GetErrorTolerance", &OpenMM::VariableVerletIntegrator::getErrorTolerance) .def("SetErrorTolerance", &OpenMM::VariableVerletIntegrator::setErrorTolerance) ; - boost::python::register_ptr_to_python<ost::mol::mm::VariableVerletIntegratorPtr>(); - - class_<OpenMM::VariableLangevinIntegrator, bases<OpenMM::Integrator> >("VaribaleLangevinIntegrator", init<Real,Real,Real>()) + class_<OpenMM::VariableLangevinIntegrator, bases<OpenMM::Integrator> >("VaribaleLangevinIntegrator", init<double,double,double>()) .def("GetTemperature",&OpenMM::VariableLangevinIntegrator::getTemperature) .def("SetTemperature",&OpenMM::VariableLangevinIntegrator::setTemperature) .def("GetFriction",&OpenMM::VariableLangevinIntegrator::getFriction) @@ -79,15 +67,4 @@ void export_OpenMM() .def("GetErrorTolerance",&OpenMM::VariableLangevinIntegrator::getErrorTolerance) .def("SetErrorTolerance",&OpenMM::VariableLangevinIntegrator::setErrorTolerance) ; - boost::python::register_ptr_to_python<ost::mol::mm::VariableLangevinIntegratorPtr>(); - - enum_<OpenMM::NonbondedForce::NonbondedMethod>("NonbondedMethod") - .value("NoCutoff", OpenMM::NonbondedForce::NoCutoff) - .value("CutoffNonPeriodic", OpenMM::NonbondedForce::CutoffNonPeriodic) - .value("CutoffPeriodic", OpenMM::NonbondedForce::CutoffPeriodic) - .value("Ewald", OpenMM::NonbondedForce::Ewald) - .value("PME", OpenMM::NonbondedForce::PME) - ; - - -} \ No newline at end of file +} diff --git a/modules/mol/mm/pymod/export_settings.cc b/modules/mol/mm/pymod/export_settings.cc index a5dfc2811936245ed4347f479af9b456c39c7749..42af757fcbf04c77909317881f22c9e99551d49c 100644 --- a/modules/mol/mm/pymod/export_settings.cc +++ b/modules/mol/mm/pymod/export_settings.cc @@ -18,6 +18,7 @@ //------------------------------------------------------------------------------ #include <boost/python.hpp> #include <ost/mol/mm/mm_settings.hh> +#include <OpenMM.h> //for definition of Integrator using namespace boost::python; @@ -32,6 +33,14 @@ void export_MMSettings() .value("CPU", ost::mol::mm::CPU) ; + enum_<ost::mol::mm::NonbondedMethod>("NonbondedMethod") + .value("NoCutoff", ost::mol::mm::NoCutoff) + .value("CutoffNonPeriodic", ost::mol::mm::CutoffNonPeriodic) + .value("CutoffPeriodic", ost::mol::mm::CutoffPeriodic) + .value("Ewald", ost::mol::mm::Ewald) + .value("PME", ost::mol::mm::PME) + ; + //export the termini exceptions object class_<ost::mol::mm::TerminiExceptions>("TerminiExceptions",init<>()) .def("SetException", &ost::mol::mm::TerminiExceptions::SetException) @@ -39,7 +48,6 @@ void export_MMSettings() .def("GetException", &ost::mol::mm::TerminiExceptions::GetException) ; - //export the settings class_<ost::mol::mm::MMSettings>("MMSettings",init<>()) diff --git a/modules/mol/mm/src/mm_observer.cc b/modules/mol/mm/src/mm_observer.cc index a8c4da9ee2448f8a7c4a2a380046bf3005c74589..c8af30c1288e91cbbbc1b7d5426777b324d955ff 100644 --- a/modules/mol/mm/src/mm_observer.cc +++ b/modules/mol/mm/src/mm_observer.cc @@ -1,4 +1,5 @@ #include <ost/mol/mm/mm_observer.hh> +#include <OpenMM.h> namespace ost { namespace mol{ namespace mm{ @@ -121,6 +122,8 @@ void TrajWriter::Notify(){ OpenMM::State openmm_state = context_->getState(0); //create minimal state //to only extract periodic //box information + OpenMM::Vec3 ucell_a,ucell_b,ucell_c; + openmm_state.getPeriodicBoxVectors(ucell_a,ucell_b,ucell_c); int32_t out_n=positions.size()*4; diff --git a/modules/mol/mm/src/mm_observer.hh b/modules/mol/mm/src/mm_observer.hh index 1e95f092ce08f16ded321c53ee182d124ad2fae0..eec055472e9500ede28edf4eb398ca2c1acd0bc4 100644 --- a/modules/mol/mm/src/mm_observer.hh +++ b/modules/mol/mm/src/mm_observer.hh @@ -2,8 +2,6 @@ #define OST_MM_OBSERVER_HH -#include <OpenMM.h> - #include <boost/shared_ptr.hpp> #include <ost/io/mol/io_profile.hh> @@ -15,6 +13,11 @@ #include <ost/mol/mm/topology.hh> #include <ost/mol/mm/mm_modeller.hh> +namespace OpenMM{ + class Context; //hacky way of telling the Context is around. + //will be included in source file to avoid + //dependencies on external libraries +} namespace ost { namespace mol{ namespace mm{ @@ -25,6 +28,7 @@ typedef boost::shared_ptr<MMObserver> MMObserverPtr; typedef boost::shared_ptr<TrajObserver> TrajObserverPtr; typedef boost::shared_ptr<TrajWriter> TrajWriterPtr; + class MMObserver{ public: @@ -101,9 +105,6 @@ private: std::vector<float> x; std::vector<float> y; std::vector<float> z; - OpenMM::Vec3 ucell_a; - OpenMM::Vec3 ucell_b; - OpenMM::Vec3 ucell_c; }; diff --git a/modules/mol/mm/src/mm_settings.hh b/modules/mol/mm/src/mm_settings.hh index a4db474c9cba97def669dab03a90257d317b9ef5..a289d22fad3020f806fb327930f70199a0460ca1 100644 --- a/modules/mol/mm/src/mm_settings.hh +++ b/modules/mol/mm/src/mm_settings.hh @@ -1,7 +1,6 @@ #ifndef OST_MM_SETTINGS_HH #define OST_MM_SETTINGS_HH -#include <OpenMM.h> #include <vector> #include <boost/shared_ptr.hpp> @@ -9,6 +8,11 @@ #include <ost/mol/residue_handle.hh> #include <ost/mol/mm/forcefield.hh> +namespace OpenMM{ + class Integrator;//hacky way of telling the Integrator us around + //will be included in source file to avoid + //dependencies on external libraries +} namespace ost { namespace mol{ namespace mm{ @@ -24,6 +28,13 @@ enum Platform{ CPU }; +enum NonbondedMethod{ + NoCutoff, + CutoffNonPeriodic, + CutoffPeriodic, + Ewald, + PME +}; class TerminiExceptions{ @@ -71,7 +82,7 @@ struct MMSettings{ fix_heavy_atoms(false), kill_electrostatics(false), generate_disulfid_bonds(true), - nonbonded_method(OpenMM::NonbondedForce::NoCutoff), + nonbonded_method(NoCutoff), nonbonded_cutoff(10.0), remove_cmm_motion(true), cmm_frequency(1), @@ -93,8 +104,8 @@ struct MMSettings{ solute_dielectric(1.0), //this is for GBSA reaction_field_dielectric(78.3), use_dispersion_correction(true), - openmm_plugin_directory(OpenMM::Platform::getDefaultPluginsDirectory()), - custom_plugin_directory(OpenMM::Platform::getDefaultPluginsDirectory()) + openmm_plugin_directory("/usr/local/openmm/lib/plugins"), + custom_plugin_directory("/usr/local/openmm/lib/plugins") { } @@ -118,7 +129,7 @@ struct MMSettings{ //automatically generate disulfid bonds bool generate_disulfid_bonds; //see export_openmm.cc for all possibilities - OpenMM::NonbondedForce::NonbondedMethod nonbonded_method; + NonbondedMethod nonbonded_method; Real nonbonded_cutoff; bool remove_cmm_motion; int cmm_frequency; diff --git a/modules/mol/mm/src/simulation.cc b/modules/mol/mm/src/simulation.cc index 26a03e933eec7cb352f213dae661813dbaf592b6..2400a5219c73fdeea89f9ba3b75f1dcc9475fdbc 100644 --- a/modules/mol/mm/src/simulation.cc +++ b/modules/mol/mm/src/simulation.cc @@ -1,4 +1,5 @@ #include <ost/mol/mm/simulation.hh> +#include <OpenMM.h> namespace ost{ namespace mol{ namespace mm{ diff --git a/modules/mol/mm/src/simulation.hh b/modules/mol/mm/src/simulation.hh index 14c835d95f8a0dd755cc7d17994e5e08a897d0fc..e1344c842dc8e0c8092b0e70cf7bad1dc25155ac 100644 --- a/modules/mol/mm/src/simulation.hh +++ b/modules/mol/mm/src/simulation.hh @@ -1,8 +1,6 @@ #ifndef OST_SIMULATION_HH #define OST_SIMULATION_HH -#include <OpenMM.h> - #include <vector> #include <map> @@ -21,20 +19,20 @@ #include <time.h> +namespace OpenMM{ + class Integrator; + class Context;//hacky way of telling the Context and Integrator + //are around. + //will be included in source file to avoid + //dependencies on external libraries +} + namespace ost { namespace mol{ namespace mm{ class Simulation; typedef boost::shared_ptr<OpenMM::Integrator> IntegratorPtr; -typedef boost::shared_ptr<OpenMM::VerletIntegrator> VerletIntegratorPtr; -typedef boost::shared_ptr<OpenMM::BrownianIntegrator> BrownianIntegratorPtr; -typedef boost::shared_ptr<OpenMM::LangevinIntegrator> LangevinIntegratorPtr; -typedef boost::shared_ptr<OpenMM::VariableVerletIntegrator> VariableVerletIntegratorPtr; -typedef boost::shared_ptr<OpenMM::VariableLangevinIntegrator> VariableLangevinIntegratorPtr; typedef boost::shared_ptr<OpenMM::Context> ContextPtr; -typedef boost::shared_ptr<OpenMM::AndersenThermostat> AndersenThermostatPtr; -typedef boost::shared_ptr<OpenMM::MonteCarloBarostat> MonteCarloBarostatPtr; - typedef boost::shared_ptr<Simulation> SimulationPtr; class Simulation { diff --git a/modules/mol/mm/src/state_extractor.cc b/modules/mol/mm/src/state_extractor.cc index 72043b2aeb190805335c1ba1927d4fe3bb94055a..968f5db34a5fd59da66a8018d2bf3296cfcf8730 100644 --- a/modules/mol/mm/src/state_extractor.cc +++ b/modules/mol/mm/src/state_extractor.cc @@ -1,5 +1,5 @@ #include <ost/mol/mm/state_extractor.hh> - +#include <OpenMM.h> namespace ost { namespace mol{ namespace mm{ diff --git a/modules/mol/mm/src/state_extractor.hh b/modules/mol/mm/src/state_extractor.hh index 6b77c554ef53d9b3228e2beb421e044e7e09b288..f8c1f188cb9562cc8cdd660de12b537eca6a9abc 100644 --- a/modules/mol/mm/src/state_extractor.hh +++ b/modules/mol/mm/src/state_extractor.hh @@ -4,10 +4,14 @@ #include <vector> #include <boost/shared_ptr.hpp> -#include <OpenMM.h> #include <ost/geom/vec3.hh> +namespace OpenMM{ + class Context; //hacky way of telling the Context is around. + //will be included in source file to avoid + //dependencies on external libraries +} namespace ost { namespace mol{ namespace mm{ diff --git a/modules/mol/mm/src/steep.cc b/modules/mol/mm/src/steep.cc index d201c010ad519dc1e1c7234461c043540d4c530e..b33d5fb09823dbbd4a8c718f21627dc78d24eb24 100644 --- a/modules/mol/mm/src/steep.cc +++ b/modules/mol/mm/src/steep.cc @@ -1,4 +1,5 @@ #include <ost/mol/mm/steep.hh> +#include <OpenMM.h> namespace ost{ namespace mol{ namespace mm{ diff --git a/modules/mol/mm/src/steep.hh b/modules/mol/mm/src/steep.hh index cc6ca3af627ed61269cdc2aa4cb552a098315e2a..567f46583b7289d492ff703f75adea2a84fafea6 100644 --- a/modules/mol/mm/src/steep.hh +++ b/modules/mol/mm/src/steep.hh @@ -1,7 +1,6 @@ #ifndef OST_STEEP_H_ #define OST_STEEP_H_ -#include <OpenMM.h> #include <ost/base.hh> #include <cmath> #include <sstream> @@ -12,6 +11,11 @@ #include <ost/message.hh> +namespace OpenMM{ + class Context; //hacky way of telling the Context is around. + //will be included in source file to avoid + //dependencies on external libraries +} namespace ost { namespace mol { namespace mm{ diff --git a/modules/mol/mm/src/system_creator.cc b/modules/mol/mm/src/system_creator.cc index 84b592a39d4b17cf1f1c3d4fe284ae840a60be5d..4c7eabd90a3435f5ffb1423b0e925e7e61b2e338 100644 --- a/modules/mol/mm/src/system_creator.cc +++ b/modules/mol/mm/src/system_creator.cc @@ -1,4 +1,5 @@ #include <ost/mol/mm/system_creator.hh> +#include <OpenMM.h> namespace ost{ namespace mol{ namespace mm{ @@ -221,7 +222,28 @@ SystemPtr SystemCreator::Create(const TopologyPtr top, std::vector<Real> charges = top->GetCharges(); if(!sigmas.empty() && !epsilons.empty() && !charges.empty()){ OpenMM::NonbondedForce& nonbonded_force = *new OpenMM::NonbondedForce(); - nonbonded_force.setNonbondedMethod(settings->nonbonded_method); + switch(settings->nonbonded_method){ + case NoCutoff:{ + nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::NoCutoff); + break; + } + case CutoffNonPeriodic:{ + nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::CutoffNonPeriodic); + break; + } + case CutoffPeriodic:{ + nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::CutoffPeriodic); + break; + } + case Ewald:{ + nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::Ewald); + break; + } + case PME:{ + nonbonded_force.setNonbondedMethod(OpenMM::NonbondedForce::PME); + break; + } + } //we can set the cutoff in any case, since it will have no effect when //nonbonded method is NoCutoff nonbonded_force.setCutoffDistance(settings->nonbonded_cutoff/10.0); @@ -263,13 +285,13 @@ SystemPtr SystemCreator::Create(const TopologyPtr top, throw ost::Error("GBSA force requires atom charges to be set!"); OpenMM::GBSAOBCForce& gbsa_force = *new OpenMM::GBSAOBCForce(); sys->addForce(&gbsa_force); - if(settings->nonbonded_method == OpenMM::NonbondedForce::NoCutoff){ + if(settings->nonbonded_method == NoCutoff){ gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::NoCutoff); } - else if(settings->nonbonded_method == OpenMM::NonbondedForce::CutoffNonPeriodic){ + else if(settings->nonbonded_method == CutoffNonPeriodic){ gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::CutoffNonPeriodic); } - else if(settings->nonbonded_method == OpenMM::NonbondedForce::CutoffPeriodic){ + else if(settings->nonbonded_method == CutoffPeriodic){ gbsa_force.setNonbondedMethod(OpenMM::GBSAOBCForce::CutoffPeriodic); } else{ @@ -302,8 +324,8 @@ SystemPtr SystemCreator::Create(const TopologyPtr top, sys->setDefaultPeriodicBoxVectors(x_vec,y_vec,z_vec); } else if(settings->add_nonbonded && - !(settings->nonbonded_method == OpenMM::NonbondedForce::NoCutoff || - settings->nonbonded_method == OpenMM::NonbondedForce::CutoffNonPeriodic)){ + !(settings->nonbonded_method == NoCutoff || + settings->nonbonded_method == CutoffNonPeriodic)){ throw ost::Error("Chosen nonbonded method requires to define the periodic box extents!"); } //set the CMMMotion removing force if required diff --git a/modules/mol/mm/src/system_creator.hh b/modules/mol/mm/src/system_creator.hh index d7fce8408530c205a11f7671fb395fd9fb5f1722..58b06b05631a936c5ec8eb9f5f8f07993d5ec9ab 100644 --- a/modules/mol/mm/src/system_creator.hh +++ b/modules/mol/mm/src/system_creator.hh @@ -1,8 +1,6 @@ #ifndef OST_SYSTEM_CREATOR_HH #define OST_SYSTEM_CREATOR_HH -#include <OpenMM.h> - #include <vector> #include <map> #include <set> @@ -24,6 +22,12 @@ #include <time.h> +namespace OpenMM{ + class System; //hacky way of telling the System is around. + //will be included in source file to avoid + //dependencies on external libraries +} + namespace ost { namespace mol{ namespace mm{ typedef boost::shared_ptr<OpenMM::System> SystemPtr; diff --git a/modules/mol/mm/src/topology_creator.hh b/modules/mol/mm/src/topology_creator.hh index 52cd37938c25537418e6561897c929f95101c20e..160590755bdb528c675cd28774e51debeb616130 100644 --- a/modules/mol/mm/src/topology_creator.hh +++ b/modules/mol/mm/src/topology_creator.hh @@ -1,8 +1,6 @@ #ifndef OST_TOPOLOGY_CREATOR_HH #define OST_TOPOLOGY_CREATOR_HH -#include <OpenMM.h> - #include <vector> #include <map> #include <set>