diff --git a/modules/mol/mm/pymod/export_topology.cc b/modules/mol/mm/pymod/export_topology.cc index 1e90e1b969fab9d27d0c709c9ddf5fa9f17e74e4..fa5320904e0c4ae4fdcad34902ceea4bce7b955f 100644 --- a/modules/mol/mm/pymod/export_topology.cc +++ b/modules/mol/mm/pymod/export_topology.cc @@ -388,7 +388,6 @@ void export_Topology() .def("AddExclusion",&ost::mol::mm::Topology::AddExclusion,(arg("idx_one"),arg("idx_two"))) .def("AddPositionConstraint",&ost::mol::mm::Topology::AddPositionConstraint,(arg("idx"))) .def("ResetPositionConstraints",&ost::mol::mm::Topology::ResetPositionConstraints) - .def("SetDensity",&ost::mol::mm::Topology::SetDensity,(arg("density"),arg("resolution"),arg("scaling")=1.0)) .def("ResetExclusions",&ost::mol::mm::Topology::ResetExclusions) .def("AddHarmonicPositionRestraint",&ost::mol::mm::Topology::AddHarmonicPositionRestraint,(arg("idx"),arg("ref_position"),arg("k"),arg("x_scale")=1.0,arg("y_scale")=1.0,arg("z_scale")=1.0)) .def("AddHarmonicDistanceRestraint",&ost::mol::mm::Topology::AddHarmonicDistanceRestraint,(arg("idx_one"),arg("idx_two"),arg("length"),arg("force_constant"))) @@ -439,9 +438,6 @@ void export_Topology() .def("GetHarmonicDistanceRestraintParameters",&WrapGetHarmonicDistanceRestraintParam,(arg("interaction_idx"))) .def("GetFGMDHBondDonorParameters",&WrapGetFGMDHBondDonorParam,(arg("interaction_idx"))) .def("GetFGMDHBondAcceptorParameters",&WrapGetFGMDHBondAcceptorParam,(arg("interaction_idx"))) - .def("GetDensity",&ost::mol::mm::Topology::GetDensity) - .def("GetDensityResolution",&ost::mol::mm::Topology::GetDensityResolution) - .def("GetDensityScaling",&ost::mol::mm::Topology::GetDensityResolution) //setter functions for interaction parameters .def("SetHarmonicBondParameters",&ost::mol::mm::Topology::SetHarmonicBondParameters,(arg("interaction_idx"),arg("bond_length"),arg("force_constant"))) diff --git a/modules/mol/mm/src/CMakeLists.txt b/modules/mol/mm/src/CMakeLists.txt index 3ebe98ba087cfc8cd22e891ccb0ee078c769f545..46f4d4cd576f47533c6661397f7428ae414a4820 100644 --- a/modules/mol/mm/src/CMakeLists.txt +++ b/modules/mol/mm/src/CMakeLists.txt @@ -16,11 +16,6 @@ set(OST_MOL_MM_HEADERS index.hh topology.hh steep.hh - openmm_plugins/density_plugin/openmmapi/density_force.hh - openmm_plugins/density_plugin/openmmapi/density_kernels.hh - openmm_plugins/density_plugin/openmmapi/density_force_impl.hh - openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.hh - openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.hh ) set(OST_MOL_MM_SOURCES @@ -38,8 +33,6 @@ set(OST_MOL_MM_SOURCES topology_creator.cc topology.cc steep.cc - openmm_plugins/density_plugin/openmmapi/density_force.cc - openmm_plugins/density_plugin/openmmapi/density_force_impl.cc ) # create settings.hh as configurational header, needed to set the plugins path @@ -69,37 +62,3 @@ copy_if_different("${CMAKE_CURRENT_SOURCE_DIR}" "${STAGE_DIR}/share/openstructur "ost_mol_mm") install(FILES "CHARMM27.dat" DESTINATION "share/openstructure/forcefields/") -#The plugins that get loaded by OpenMM have to be built seperately - -########################## -#build the density plugin# -########################## - -#define the sources (headers are already handled above) -SET(DENSITY_PLUGIN_REFERENCE_SOURCES - openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.cc - openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.cc -) - -# Set the library name -SET(OPENMM_DENSITY_REFERENCE_LIBRARY_NAME density_plugin_reference) -SET(SHARED_TARGET_DENSITY_PLUGIN ${OPENMM_DENSITY_REFERENCE_LIBRARY_NAME}) - -ADD_LIBRARY(${SHARED_TARGET_DENSITY_PLUGIN} SHARED ${DENSITY_PLUGIN_REFERENCE_SOURCES}) -ADD_DEPENDENCIES(${SHARED_TARGET_DENSITY_PLUGIN} ost_mol_mm ost_img ost_mol_mm) - -SET_TARGET_PROPERTIES(${SHARED_TARGET_DENSITY_PLUGIN} PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${STAGE_DIR}/share/openstructure/openmm_plugins/ - ARCHIVE_OUTPUT_DIRECTORY ${STAGE_DIR}/share/openstructure/openmm_plugins/ - RUNTIME_OUTPUT_DIRECTORY ${STAGE_DIR}/share/openstructure/openmm_plugins/) - -foreach(_DEPENDENCY ${_MOL_MM_DEPS}) - TARGET_LINK_LIBRARIES(${SHARED_TARGET_DENSITY_PLUGIN} ${_DEPENDENCY}) -endforeach() -#also link against OpenMM and the mm module -TARGET_LINK_LIBRARIES(${SHARED_TARGET_DENSITY_PLUGIN} ${OPEN_MM_LIBRARIES}) -TARGET_LINK_LIBRARIES(${SHARED_TARGET_DENSITY_PLUGIN} ost_mol_mm) - -file(MAKE_DIRECTORY ${STAGE_DIR}/share/openstructure/openmm_plugins/) -INSTALL(TARGETS ${SHARED_TARGET_DENSITY_PLUGIN} LIBRARY - DESTINATION "share/openstructure/openmm_plugins/") diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.cc b/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.cc deleted file mode 100644 index 8ff809d9a768edb8efd64acbde96fe2e51bcae31..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.cc +++ /dev/null @@ -1,97 +0,0 @@ -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/density_force.hh> -#include <ost/mol/mm/density_force_impl.hh> -#include <openmm/OpenMMException.h> -#include <openmm/internal/AssertionUtilities.h> -#include <string.h> - -namespace ost{ namespace mol{ namespace mm{ - -OpenMM::ForceImpl* DensityForce::createImpl() const { - return new DensityForceImpl(*this); -} - -void DensityForce::updateParametersInContext(OpenMM::Context& context) { - dynamic_cast<DensityForceImpl&>(getImplInContext(context)).updateParametersInContext(getContextImpl(context)); -} - -void DensityForce::addParticle(Real mass){ - masses_.push_back(mass); - in_body_.push_back(false); -} - -Real DensityForce::getParticleMass(int idx) const{ - if(idx >= this->getNumParticles() || idx < 0){ - throw OpenMM::OpenMMException("Invalid index provided!"); - } - return masses_[idx]; -} - -bool DensityForce::isInBody(int idx) const{ - if(idx >= this->getNumParticles() || idx < 0){ - throw OpenMM::OpenMMException("Invalid index provided!"); - } - return in_body_[idx]; -} - -void DensityForce::defineBody(const std::vector<int>& indices){ - //first check, whether any of the indices is invalid or already part of a body - int num_particles = this->getNumParticles(); - for(std::vector<int>::const_iterator i = indices.begin(); - i != indices.end(); ++i){ - if(*i >= num_particles || *i < 0){ - throw OpenMM::OpenMMException("Invalid index provided!"); - } - if(in_body_[*i]){ - throw OpenMM::OpenMMException("Particle can be part of only one body!"); - } - } - - //let's change the state of the according particles - for(std::vector<int>::const_iterator i = indices.begin(); - i != indices.end(); ++i){ - in_body_[*i] = true; - } - - //and finally define the body - bodies_.push_back(indices); -} - -const std::vector<int>& DensityForce::getBody(int idx) const{ - if(idx >= this->getNumBodies() || idx < 0){ - throw OpenMM::OpenMMException("Invalid index provided!"); - } - return bodies_[idx]; -} - -}}} //ns diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.hh b/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.hh deleted file mode 100644 index f932ff797b978cd54ebe8be72c03935f587f73af..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force.hh +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef OPENMM_DENSITYFORCE_H_ -#define OPENMM_DENSITYFORCE_H_ - -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <openmm/Context.h> -#include <openmm/Force.h> -#include <ost/img/image.hh> - -namespace ost { namespace mol{ namespace mm{ - - -class DensityForce : public OpenMM::Force { -public: - /** - * Create an DensityForce. The density force only makes sense for simulation boxes - * with orthogonal base vectors. - */ - - //since the density is scaled in Angstrom, the resolution is also in Angstrom - DensityForce(const ost::img::ImageHandle& d, Real r, Real s): density_(d), - resolution_(r), - scaling_(s) { } - - void addParticle(Real mass); - - int getNumParticles() const { return masses_.size(); } - - int getNumBodies() const { return bodies_.size(); } - - Real getParticleMass(int idx) const; - - bool isInBody(int idx) const; - - void defineBody(const std::vector<int>& indices); - - const std::vector<int>& getBody(int idx) const; - - void setScaling(Real scaling) { scaling_ = scaling; } - - Real getScaling() const { return scaling_; } - - ost::img::ImageHandle getDensity() const { return density_; } - - Real getResolution() const { return resolution_; } - - void updateParametersInContext(OpenMM::Context& context); - - bool usesPeriodicBoundaryConditions() const { return false; } - -protected: - OpenMM::ForceImpl* createImpl() const; -private: - - ost::img::ImageHandle density_; - std::vector<Real> masses_; - std::vector<bool> in_body_; - std::vector<std::vector<int> > bodies_; - Real resolution_; - Real scaling_; -}; - -}}} // ns - -#endif /*OPENMM_DENSITYFORCE_H_*/ diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.cc b/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.cc deleted file mode 100644 index 1d2b859a0eb006fe13c389a9818d2958bc69a801..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.cc +++ /dev/null @@ -1,71 +0,0 @@ -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/density_force_impl.hh> -#include <ost/mol/mm/density_kernels.hh> -#include <openmm/OpenMMException.h> -#include <openmm/internal/ContextImpl.h> -#include <cmath> -#include <map> -#include <set> -#include <sstream> - -namespace ost{ namespace mol{ namespace mm{ - -DensityForceImpl::DensityForceImpl(const DensityForce& owner) : owner(owner) { -} - -DensityForceImpl::~DensityForceImpl() { -} - -void DensityForceImpl::initialize(OpenMM::ContextImpl& context) { - kernel = context.getPlatform().createKernel(CalcDensityForceKernel::Name(), context); - kernel.getAs<CalcDensityForceKernel>().initialize(context.getSystem(), owner); -} - -double DensityForceImpl::calcForcesAndEnergy(OpenMM::ContextImpl& context, bool includeForces, bool includeEnergy, int groups) { - if ((groups&(1<<owner.getForceGroup())) != 0) - return kernel.getAs<CalcDensityForceKernel>().execute(context, includeForces, includeEnergy); - return 0.0; -} - -std::vector<std::string> DensityForceImpl::getKernelNames() { - std::vector<std::string> names; - names.push_back(CalcDensityForceKernel::Name()); - return names; -} - -void DensityForceImpl::updateParametersInContext(OpenMM::ContextImpl& context) { - kernel.getAs<CalcDensityForceKernel>().copyParametersToContext(context, owner); -} - -}}} //ns - diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.hh b/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.hh deleted file mode 100644 index 850b2c5c23a33b48773bcc29b5001f1ad904353b..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_force_impl.hh +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef OPENMM_DENSITYFORCEIMPL_H_ -#define OPENMM_DENSITYFORCEIMPL_H_ - -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/density_force.hh> -#include <openmm/internal/ForceImpl.h> -#include <openmm/Kernel.h> -#include <utility> -#include <set> -#include <string> - -namespace ost{ namespace mol{ namespace mm{ - -/** - * This is the internal implementation of DensityForce. - */ - -class DensityForceImpl : public OpenMM::ForceImpl { -public: - DensityForceImpl(const DensityForce& owner); - ~DensityForceImpl(); - void initialize(OpenMM::ContextImpl& context); - const DensityForce& getOwner() const { - return owner; - } - void updateContextState(OpenMM::ContextImpl& context) { - // This force field doesn't update the state directly. - } - double calcForcesAndEnergy(OpenMM::ContextImpl& context, bool includeForces, bool includeEnergy, int groups); - std::map<std::string, double> getDefaultParameters() { - return std::map<std::string, double>(); // This force field doesn't define any parameters. - } - std::vector<std::string> getKernelNames(); - - void updateParametersInContext(OpenMM::ContextImpl& context); -private: - const DensityForce& owner; - OpenMM::Kernel kernel; -}; - -}}} //ns - -#endif /*OPENMM_DENSITYFORCEIMPL_H_*/ - diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_kernels.hh b/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_kernels.hh deleted file mode 100644 index 78e16cfa795519c82252b7edce168329ea404e97..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/openmmapi/density_kernels.hh +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef DENSITY_KERNELS_H_ -#define DENSITY_KERNELS_H_ - -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/density_force.hh> -#include <openmm/KernelImpl.h> -#include <openmm/Platform.h> -#include <openmm/System.h> -#include <string> - -namespace ost{ namespace mol{ namespace mm{ - -/** - * This kernel is invoked by DensityForce to calculate the forces acting on the system and the energy of the system. - */ -class CalcDensityForceKernel : public OpenMM::KernelImpl { -public: - static std::string Name() { - return "CalcDensityForce"; - } - CalcDensityForceKernel(std::string name, const OpenMM::Platform& platform) : OpenMM::KernelImpl(name, platform) { - } - /** - * Initialize the kernel. - * - * @param system the System this kernel will be applied to - * @param force the DensityForce this kernel will be used for - */ - virtual void initialize(const OpenMM::System& system, const DensityForce& force) = 0; - /** - * Execute the kernel to calculate the forces and/or energy. - * - * @param context the context in which to execute this kernel - * @param includeForces true if forces should be calculated - * @param includeEnergy true if the energy should be calculated - * @return the potential energy due to the force - */ - virtual double execute(OpenMM::ContextImpl& context, bool includeForces, bool includeEnergy) = 0; - /** - * Copy changed parameters over to a context. - * - * @param context the context to copy parameters to - * @param force the DensityForce to copy the parameters from - */ - virtual void copyParametersToContext(OpenMM::ContextImpl& context, const DensityForce& force) = 0; -}; - -}}} //ns - -#endif /*DENSITY_KERNELS_H_*/ diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.cc b/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.cc deleted file mode 100644 index 8df88868d90895b7b48b89e436799fd3bde97956..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* -------------------------------------------------------------------------- * - * OpenMMExample * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/reference_density_kernel_factory.hh> -#include <ost/mol/mm/reference_density_kernels.hh> -#include <openmm/reference/ReferencePlatform.h> -#include <openmm/internal/ContextImpl.h> -#include <openmm/OpenMMException.h> - -using namespace ost::mol::mm; - -extern "C" void registerPlatforms() { -} - -extern "C" void registerKernelFactories() { - for (int i = 0; i < OpenMM::Platform::getNumPlatforms(); i++) { - OpenMM::Platform& platform = OpenMM::Platform::getPlatform(i); - if (dynamic_cast<OpenMM::ReferencePlatform*>(&platform) != NULL) { - ReferenceDensityKernelFactory* factory = new ReferenceDensityKernelFactory(); - platform.registerKernelFactory(CalcDensityForceKernel::Name(), factory); - } - } -} - -extern "C" void registerDensityReferenceKernelFactories() { - registerKernelFactories(); -} - -OpenMM::KernelImpl* ReferenceDensityKernelFactory::createKernelImpl(std::string name, const OpenMM::Platform& platform, OpenMM::ContextImpl& context) const { - OpenMM::ReferencePlatform::PlatformData& data = *static_cast<OpenMM::ReferencePlatform::PlatformData*>(context.getPlatformData()); - if (name == CalcDensityForceKernel::Name()) - return new ReferenceCalcDensityForceKernel(name, platform); - throw OpenMM::OpenMMException((std::string("Tried to create kernel with illegal kernel name '")+name+"'").c_str()); -} diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.hh b/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.hh deleted file mode 100644 index 14dfdf44c23060f65f12c3939815b8bd27664608..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernel_factory.hh +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef OPENMM_REFERENCEDensityKERNELFACTORY_H_ -#define OPENMM_REFERENCEDensityKERNELFACTORY_H_ - -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <openmm/KernelFactory.h> - -/** - * This KernelFactory creates kernels for the reference implementation of the Density plugin. - */ - -namespace ost{ namespace mol{ namespace mm{ - -class ReferenceDensityKernelFactory : public OpenMM::KernelFactory { -public: - OpenMM::KernelImpl* createKernelImpl(std::string name, - const OpenMM::Platform& platform, - OpenMM::ContextImpl& context) const; -}; - - -}}} //ns - -#endif /*OPENMM_REFERENCEDENSITYKERNELFACTORY_H_*/ diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.cc b/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.cc deleted file mode 100644 index 77edcd5524b5a5eb3df997727f36a25104a0876a..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.cc +++ /dev/null @@ -1,342 +0,0 @@ -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/reference_density_kernels.hh> -#include <ost/mol/mm/density_force.hh> -#include <openmm/OpenMMException.h> -#include <openmm/internal/ContextImpl.h> -#include <openmm/reference/RealVec.h> -#include <openmm/reference/ReferencePlatform.h> - -using namespace OpenMM; -using namespace std; - -namespace{ - -static vector<RealVec>& extractPositions(ContextImpl& context) { - ReferencePlatform::PlatformData* data = - reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData()); - return *((vector<RealVec>*) data->positions); -} - -static vector<RealVec>& extractForces(ContextImpl& context) { - ReferencePlatform::PlatformData* data = - reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData()); - return *((vector<RealVec>*) data->forces); -} - -} //anon ns - - -namespace ost{ namespace mol { namespace mm{ - -ReferenceCalcDensityForceKernel::~ReferenceCalcDensityForceKernel(){ - if(data_ != NULL) delete [] data_; -} - -void ReferenceCalcDensityForceKernel::initialize(const System& system, const DensityForce& force) { - - if(system.getNumParticles() != force.getNumParticles()){ - std::string err = "DensityForce must contain same number of"; - err += " particles as system!"; - throw OpenMM::OpenMMException(err); - } - - if(data_ != NULL) delete [] data_; - - ost::img::ImageHandle density = force.getDensity(); - - x_sampling_ = density.GetSpatialSampling()[0] * 0.1; - y_sampling_ = density.GetSpatialSampling()[1] * 0.1; - z_sampling_ = density.GetSpatialSampling()[2] * 0.1; - one_over_x_sampling_ = Real(1.0) / x_sampling_; - one_over_y_sampling_ = Real(1.0) / y_sampling_; - one_over_z_sampling_ = Real(1.0) / z_sampling_; - half_x_sampling_ = Real(0.5) * x_sampling_; - half_y_sampling_ = Real(0.5) * y_sampling_; - half_z_sampling_ = Real(0.5) * z_sampling_; - x_origin_ = density.GetAbsoluteOrigin()[0] * 0.1; - y_origin_ = density.GetAbsoluteOrigin()[1] * 0.1; - z_origin_ = density.GetAbsoluteOrigin()[2] * 0.1; - x_extent_ = density.GetSize()[0]; - y_extent_ = density.GetSize()[1]; - z_extent_ = density.GetSize()[2]; - - data_ = new Real[x_extent_ * y_extent_ * z_extent_]; - int current_idx = 0; - for(int i = 0; i < x_extent_; ++i){ - for(int j = 0; j < y_extent_; ++j){ - for(int k = 0; k < z_extent_; ++k){ - data_[current_idx] = density.GetReal(ost::img::Point(i,j,k)); - ++current_idx; - } - } - } - - idx_helper_one_ = y_extent_ * z_extent_; - idx_helper_two_ = z_extent_; - - //sigma for gaussian like representations of the atoms - resolution_ = force.getResolution() * 0.1; - s_ = resolution_ * 0.425; - one_s_ = Real(1.0) / s_; - square_one_s_ = Real(1.0) / (s_ * s_); - one_sqrt_2_pi_s_ = Real(1.0) / std::sqrt(Real(2.0) * Real(M_PI) * s_); - padding_dist_ = s_ * Real(3.0); - scaling_ = 10000 * force.getScaling(); - - //let's get body and particle info... - - num_particles_ = system.getNumParticles(); - num_bodies_ = force.getNumBodies(); - - particle_masses_.resize(num_particles_); - - for(int i = 0; i < num_particles_; ++i){ - particle_masses_[i] = force.getParticleMass(i); - } - - bodies_.clear(); - //let's set every particle not belonging to a body to its own body - for(int i = 0; i < num_particles_; ++i){ - if(force.isInBody(i)) continue; - std::vector<int> body(1,i); - bodies_.push_back(body); - } - - //let's fill the defined bodies! - for(int i = 0; i < num_bodies_; ++i){ - const std::vector<int>& current_body = force.getBody(i); - bodies_.push_back(current_body); - } - - //let's update the num_bodies_ !!! - num_bodies_ = bodies_.size(); -} - -double ReferenceCalcDensityForceKernel::execute(ContextImpl& context, - bool includeForces, - bool includeEnergy) { - - - - vector<RealVec>& pos = extractPositions(context); - vector<RealVec>& force = extractForces(context); - - //distance of a density position towards a particle - Real x_d; - Real y_d; - Real z_d; - - //derivative of a full body - Real body_dx; - Real body_dy; - Real body_dz; - - //return value for the full energy, will be updated when iterating over - //all bodies - Real overall_energy = 0.0; - - //some helper variables - Real dd; - Real e_term; - Real density; - Real p_density; - std::vector<Real> p_dx; - std::vector<Real> p_dy; - std::vector<Real> p_dz; - std::vector<Real> p_m; - Real denominator; - Real nominator; - Real a, b; - Real temp_one, temp_two; - Real prefac; - Real min_x_pos, max_x_pos; - Real min_y_pos, max_y_pos; - Real min_z_pos, max_z_pos; - Real body_x_origin, body_y_origin, body_z_origin; - int body_x_extent, body_y_extent, body_z_extent; - int num_voxels; - - for(int body_idx = 0; body_idx < num_bodies_; ++body_idx){ - - int body_size = bodies_[body_idx].size(); - - //set derivatives for every particle in each direction to zero - //and extract the required masses - p_dx.assign(body_size,0.0); - p_dy.assign(body_size,0.0); - p_dz.assign(body_size,0.0); - p_m.resize(body_size); - - for(int p_idx = 0; p_idx < body_size; ++p_idx){ - p_m[p_idx] = particle_masses_[bodies_[body_idx][p_idx]]; - } - - min_x_pos = std::numeric_limits<Real>::max(); - max_x_pos = -std::numeric_limits<Real>::max(); - min_y_pos = std::numeric_limits<Real>::max(); - max_y_pos = -std::numeric_limits<Real>::max(); - min_z_pos = std::numeric_limits<Real>::max(); - max_z_pos = -std::numeric_limits<Real>::max(); - - //let's find out how big this thing is... - for(int p_idx = 0; p_idx < body_size; ++p_idx){ - RealVec& p = pos[bodies_[body_idx][p_idx]]; - min_x_pos = (p[0] < min_x_pos) ? p[0]: min_x_pos; - max_x_pos = (p[0] > max_x_pos) ? p[0]: max_x_pos; - min_y_pos = (p[1] < min_y_pos) ? p[1]: min_y_pos; - max_y_pos = (p[1] > max_y_pos) ? p[1]: max_y_pos; - min_z_pos = (p[2] < min_z_pos) ? p[2]: min_z_pos; - max_z_pos = (p[2] > max_z_pos) ? p[2]: max_z_pos; - } - - //we add some padding - min_x_pos -= padding_dist_; - max_x_pos += padding_dist_; - min_y_pos -= padding_dist_; - max_y_pos += padding_dist_; - min_z_pos -= padding_dist_; - max_z_pos += padding_dist_; - - body_x_extent = std::max(3, - static_cast<int>(std::ceil((max_x_pos - min_x_pos)*one_over_x_sampling_))); - body_y_extent = std::max(3, - static_cast<int>(std::ceil((max_y_pos - min_y_pos)*one_over_y_sampling_))); - body_z_extent = std::max(3, - static_cast<int>(std::ceil((max_z_pos - min_z_pos)*one_over_z_sampling_))); - num_voxels = body_x_extent * body_y_extent * body_z_extent; - - Real overlap = min_x_pos + body_x_extent * x_sampling_ - max_x_pos; - body_x_origin = min_x_pos - 0.5 * overlap; - overlap = min_y_pos + body_y_extent * y_sampling_ - max_y_pos; - body_y_origin = min_y_pos - 0.5 * overlap; - overlap = min_z_pos + body_z_extent * z_sampling_ - max_z_pos; - body_z_origin = min_z_pos - 0.5 * overlap; - - - density_values_.resize(num_voxels); - body_values_.assign(num_voxels,0.0); - - //let's fill the density values - int current_idx = 0; - for(int i = 0; i < body_x_extent; ++i){ - for(int j = 0; j < body_y_extent; ++j){ - for(int k = 0; k < body_z_extent; ++k){ - density_values_[current_idx] = - this->GetIntpolValue(body_x_origin + i * x_sampling_ + half_x_sampling_, - body_y_origin + j * y_sampling_ + half_y_sampling_, - body_z_origin + k * z_sampling_ + half_z_sampling_); - ++current_idx; - } - } - } - - for(int p_idx = 0; p_idx < body_size; ++p_idx){ - - //the actual position of the particle - RealVec& p = pos[bodies_[body_idx][p_idx]]; - current_idx = 0; - - for(int i = 0; i < body_x_extent; ++i){ - - x_d = p[0] - (body_x_origin + i * x_sampling_ + half_x_sampling_); - - for(int j = 0; j < body_y_extent; ++j){ - - y_d = p[1] - (body_y_origin + j * y_sampling_ + half_y_sampling_); - - for(int k = 0; k < body_z_extent; ++k){ - - z_d = p[2] - (body_z_origin + k * z_sampling_ + half_z_sampling_); - - dd = x_d * x_d + y_d * y_d + z_d * z_d; - - e_term = std::exp(Real(-0.5) * dd * square_one_s_); - density = density_values_[current_idx]; - p_dx[p_idx] += (density * (x_d * one_s_) * e_term); - p_dy[p_idx] += (density * (y_d * one_s_) * e_term); - p_dz[p_idx] += (density * (z_d * one_s_) * e_term); - p_density = p_m[p_idx] * one_sqrt_2_pi_s_ * e_term; - body_values_[current_idx] += p_density; - ++current_idx; - - } - } - } - } - - nominator = 0.0; - denominator = 0.0; - temp_one = 0.0; - temp_two = 0.0; - - for(int i = 0; i < num_voxels; ++i){ - a = density_values_[i]; - b = body_values_[i]; - nominator += (a * b); - temp_one += (a * a); - temp_two += (b * b); - } - - if(temp_one == 0.0 || temp_two == 0.0) continue; - - denominator = std::sqrt(temp_one * temp_two); - prefac = scaling_ / denominator * one_sqrt_2_pi_s_; - - body_dx = 0.0; - body_dy = 0.0; - body_dz = 0.0; - - for(int p_idx = 0; p_idx < body_size; ++p_idx){ - body_dx -= prefac * p_m[p_idx] * p_dx[p_idx]; - body_dy -= prefac * p_m[p_idx] * p_dy[p_idx]; - body_dz -= prefac * p_m[p_idx] * p_dz[p_idx]; - } - - //finally update the forces accordingly - for(int p_idx = 0; p_idx < body_size; ++p_idx){ - force[bodies_[body_idx][p_idx]][0] += body_dx; - force[bodies_[body_idx][p_idx]][1] += body_dy; - force[bodies_[body_idx][p_idx]][2] += body_dz; - } - - overall_energy -= (scaling_ * nominator/denominator); - } - - return overall_energy; -} - -void ReferenceCalcDensityForceKernel::copyParametersToContext(ContextImpl& context, const DensityForce& force) { - //ToDo -} - -}}} //ns diff --git a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.hh b/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.hh deleted file mode 100644 index 7a06088ee572d7d91e606601d2fe9eb0b41725a2..0000000000000000000000000000000000000000 --- a/modules/mol/mm/src/openmm_plugins/density_plugin/platforms/reference/reference_density_kernels.hh +++ /dev/null @@ -1,164 +0,0 @@ -#ifndef REFERENCE_DENSITY_KERNELS_H_ -#define REFERENCE_DENSITY_KERNELS_H_ - -/* -------------------------------------------------------------------------- * - * OpenMM * - * -------------------------------------------------------------------------- * - * This is part of the OpenMM molecular simulation toolkit originating from * - * Simbios, the NIH National Center for Physics-Based Simulation of * - * Biological Structures at Stanford, funded under the NIH Roadmap for * - * Medical Research, grant U54 GM072970. See https://simtk.org. * - * * - * Portions copyright (c) 2014 Stanford University and the Authors. * - * Authors: Peter Eastman * - * Contributors: * - * * - * Permission is hereby granted, free of charge, to any person obtaining a * - * copy of this software and associated documentation files (the "Software"), * - * to deal in the Software without restriction, including without limitation * - * the rights to use, copy, modify, merge, publish, distribute, sublicense, * - * and/or sell copies of the Software, and to permit persons to whom the * - * Software is furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * - * USE OR OTHER DEALINGS IN THE SOFTWARE. * - * -------------------------------------------------------------------------- */ - -#include <ost/mol/mm/density_kernels.hh> -#include <openmm/Platform.h> -#include <vector> -#include <set> -#include <limits> - -namespace ost{ namespace mol{ namespace mm{ - -/** - * This kernel is invoked by DensityForce to calculate the forces acting on the system and the energy of the system. - */ -class ReferenceCalcDensityForceKernel : public CalcDensityForceKernel { -public: - ReferenceCalcDensityForceKernel(std::string name, const OpenMM::Platform& platform) : CalcDensityForceKernel(name, platform), data_(NULL) { - } - - ~ReferenceCalcDensityForceKernel(); - - /** - * Initialize the kernel. - * - * @param system the System this kernel will be applied to - * @param force the DensityForce this kernel will be used for - */ - void initialize(const OpenMM::System& system, const DensityForce& force); - /** - * Execute the kernel to calculate the forces and/or energy. - * - * @param context the context in which to execute this kernel - * @param includeForces true if forces should be calculated - * @param includeEnergy true if the energy should be calculated - * @return the potential energy due to the force - */ - double execute(OpenMM::ContextImpl& context, bool includeForces, bool includeEnergy); - /** - * Copy changed parameters over to a context. - * - * @param context the context to copy parameters to - * @param force the DensityForce to copy the parameters from - */ - void copyParametersToContext(OpenMM::ContextImpl& context, const DensityForce& force); -private: - - inline Real GetValue(int a, int b, int c){ - return data_[a * idx_helper_one_ + b * idx_helper_two_ + c]; - } - - inline Real GetIntpolValue(Real x, Real y, Real z){ - - //distances to origin - Real dx = x - x_origin_; - Real dy = y - y_origin_; - Real dz = z - z_origin_; - - int x_bin = std::floor(dx * one_over_x_sampling_); - int y_bin = std::floor(dy * one_over_y_sampling_); - int z_bin = std::floor(dz * one_over_z_sampling_); - - if(x_bin < 0 || x_bin >= (x_extent_-1) || - y_bin < 0 || y_bin >= (y_extent_-1) || - z_bin < 0 || z_bin >= (z_extent_-1)) return 0.0; - - //distances in fraction of bin towards base bin - dx = (dx - x_bin * x_sampling_) * one_over_x_sampling_; - dy = (dy - y_bin * y_sampling_) * one_over_y_sampling_; - dz = (dz - z_bin * z_sampling_) * one_over_z_sampling_; - - intpol_values_[0] = this->GetValue(x_bin,y_bin,z_bin); - intpol_values_[1] = this->GetValue(x_bin+1,y_bin,z_bin); - intpol_values_[2] = this->GetValue(x_bin,y_bin+1,z_bin); - intpol_values_[3] = this->GetValue(x_bin+1,y_bin+1,z_bin); - intpol_values_[4] = this->GetValue(x_bin,y_bin,z_bin+1); - intpol_values_[5] = this->GetValue(x_bin+1,y_bin,z_bin+1); - intpol_values_[6] = this->GetValue(x_bin,y_bin+1,z_bin+1); - intpol_values_[7] = this->GetValue(x_bin+1,y_bin+1,z_bin+1); - - //do first bilinear interpolation - Real f11 = (1.0 - dx) * intpol_values_[0] + dx * intpol_values_[1]; - Real f12 = (1.0 - dx) * intpol_values_[2] + dx * intpol_values_[3]; - Real f21 = (1.0 - dx) * intpol_values_[4] + dx * intpol_values_[5]; - Real f22 = (1.0 - dx) * intpol_values_[6] + dx * intpol_values_[7]; - - Real f1 = (1.0 - dy) * f11 + dy * f12; - Real f2 = (1.0 - dy) * f21 + dy * f22; - - return (1.0 - dz) * f1 + dz * f2; - } - - //this stuff is required to store and extract the internal density values - Real* data_; - Real intpol_values_[8]; - int idx_helper_one_; - int idx_helper_two_; - Real x_sampling_; - Real y_sampling_; - Real z_sampling_; - Real one_over_x_sampling_; - Real one_over_y_sampling_; - Real one_over_z_sampling_; - Real half_x_sampling_; - Real half_y_sampling_; - Real half_z_sampling_; - Real x_origin_; - Real y_origin_; - Real z_origin_; - int x_extent_; - int y_extent_; - int z_extent_; - - //this is stuff used in the actual force calculation - Real resolution_; - Real s_; - Real one_s_; - Real square_one_s_; - Real one_sqrt_2_pi_s_; - Real padding_dist_; - Real scaling_; - std::vector<Real> density_values_; - std::vector<Real> body_values_; - - //this is stuff containing information of the simulated system - int num_bodies_; - int num_particles_; - std::vector<float> particle_masses_; - std::vector<std::vector<int> > bodies_; -}; - -}}} // ns - -#endif /*REFERENCE_DENSITY_KERNELS_H_*/ diff --git a/modules/mol/mm/src/system_creator.cc b/modules/mol/mm/src/system_creator.cc index aa365ee2926740ee5d99c853da708ebcfe254722..7d51c905eb8d2d7f019c121b35c435dc217ead11 100644 --- a/modules/mol/mm/src/system_creator.cc +++ b/modules/mol/mm/src/system_creator.cc @@ -18,7 +18,6 @@ //------------------------------------------------------------------------------ #include <ost/mol/mm/system_creator.hh> -#include <ost/mol/mm/density_force.hh> #include <OpenMM.h> namespace ost{ namespace mol{ namespace mm{ @@ -443,26 +442,6 @@ SystemPtr SystemCreator::Create(const TopologyPtr top, sys->addForce(&barostat); } - //add density if valid - ost::img::ImageHandle density = top->GetDensity(); - if(density.IsValid()){ - Real r = top->GetDensityResolution(); - Real s = top->GetDensityScaling(); - DensityForce* density_force_ptr = new DensityForce(density,r,s); - for(std::vector<Real>::iterator i = masses.begin(); - i != masses.end(); ++i){ - density_force_ptr->addParticle(*i); - } - const std::vector<std::vector<int> >& density_bodies = top->GetDensityBodies(); - for(std::vector<std::vector<int> >::const_iterator i = density_bodies.begin(); - i != density_bodies.end(); ++i){ - density_force_ptr->defineBody(*i); - } - sys->addForce(density_force_ptr); - } - - - return sys; } }}} //ns diff --git a/modules/mol/mm/src/topology.cc b/modules/mol/mm/src/topology.cc index 58a72827d7d5f81dd3b8013a88223fafc352eb9c..d9810ce34ff1eef869b206658a54be8e9abf530f 100644 --- a/modules/mol/mm/src/topology.cc +++ b/modules/mol/mm/src/topology.cc @@ -255,41 +255,6 @@ void Topology::AddPositionConstraint(uint index){ position_constraints_.push_back(index); } -void Topology::SetDensity(const ost::img::ImageHandle& d, Real r, Real s){ - density_ = d; - density_resolution_ = r; - density_scaling_ = s; - in_density_body_.assign(num_particles_,false); - density_bodies_.clear(); -} - -void Topology::DefineDensityBody(const std::vector<int>& indices){ - - if(!density_.IsValid()){ - throw ost::Error("Must set valid density before you can define density bodies"); - } - - //first check, whether any of the indices is invalid or already part of a body - for(std::vector<int>::const_iterator i = indices.begin(); - i != indices.end(); ++i){ - if(*i >= static_cast<int>(num_particles_) || *i < 0){ - throw ost::Error("Invalid index provided!"); - } - if(in_density_body_[*i]){ - throw ost::Error("Particle can be part of only one body!"); - } - } - - //let's change the state of the according particles - for(std::vector<int>::const_iterator i = indices.begin(); - i != indices.end(); ++i){ - in_density_body_[*i] = true; - } - - //and finally define the body - density_bodies_.push_back(indices); -} - uint Topology::AddHarmonicPositionRestraint(uint ind, const geom::Vec3& ref_position, Real k, Real x_scale, Real y_scale, Real z_scale){ if(ind >= num_particles_){ diff --git a/modules/mol/mm/src/topology.hh b/modules/mol/mm/src/topology.hh index 486accf1eb55c6ba1fe0db5fea040a445d6bb182..501d4e90102622cde79e8ef07828bd2a297cc8ac 100644 --- a/modules/mol/mm/src/topology.hh +++ b/modules/mol/mm/src/topology.hh @@ -128,12 +128,6 @@ public: void AddPositionConstraint(uint index); - void SetDensity(const ost::img::ImageHandle& d, Real r, Real s = 1.0); - - void DefineDensityBody(const std::vector<int>& indices); - - int GetNumDensityBodies() const { return density_bodies_.size(); } - void ResetPositionConstraints() { position_constraints_.clear(); } void ResetExclusions() { exclusions_.clear(); } @@ -219,12 +213,6 @@ public: void GetFGMDHBondAcceptorParameters(uint index, uint& index_one, uint& index_two) const; - ost::img::ImageHandle GetDensity() { return density_; } - - Real GetDensityResolution() { return density_resolution_; } - - Real GetDensityScaling() { return density_scaling_; } - void SetHarmonicBondParameters(uint index, const Real bond_length, const Real force_constant); void SetHarmonicAngleParameters(uint index, const Real angle, const Real force_constant); @@ -285,8 +273,6 @@ public: const std::vector<Index<2> >& GetFGMDHBondAcceptors() const { return fgmd_hbond_acceptors_; } - const std::vector<std::vector<int> >& GetDensityBodies() const { return density_bodies_; } - std::vector<Real> GetSigmas() const { return sigmas_; } @@ -811,13 +797,6 @@ private: std::set<Index<2> > added_lj_pairs_; std::set<Index<2> > added_distance_constraints_; std::set<Index<2> > added_exclusions_; - - //density map - ost::img::ImageHandle density_; - Real density_resolution_; - Real density_scaling_; - std::vector<std::vector<int> > density_bodies_; - std::vector<bool> in_density_body_; };