00001 #ifndef OPENMM_CUSTOMHBONDFORCEIMPL_H_
00002 #define OPENMM_CUSTOMHBONDFORCEIMPL_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "ForceImpl.h"
00036 #include "openmm/CustomHbondForce.h"
00037 #include "openmm/Kernel.h"
00038 #include "lepton/CustomFunction.h"
00039 #include "lepton/ExpressionTreeNode.h"
00040 #include "lepton/ParsedExpression.h"
00041 #include <utility>
00042 #include <map>
00043 #include <string>
00044
00045 namespace OpenMM {
00046
00051 class OPENMM_EXPORT CustomHbondForceImpl : public ForceImpl {
00052 public:
00053 CustomHbondForceImpl(CustomHbondForce& owner);
00054 ~CustomHbondForceImpl();
00055 void initialize(ContextImpl& context);
00056 CustomHbondForce& getOwner() {
00057 return owner;
00058 }
00059 void updateContextState(ContextImpl& context) {
00060
00061 }
00062 double calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups);
00063 std::map<std::string, double> getDefaultParameters();
00064 std::vector<std::string> getKernelNames();
00080 static Lepton::ParsedExpression prepareExpression(const CustomHbondForce& force, const std::map<std::string, Lepton::CustomFunction*>& functions, std::map<std::string, std::vector<int> >& distances,
00081 std::map<std::string, std::vector<int> >& angles, std::map<std::string, std::vector<int> >& dihedrals);
00082 private:
00083 class FunctionPlaceholder;
00084 static Lepton::ExpressionTreeNode replaceFunctions(const Lepton::ExpressionTreeNode& node, std::map<std::string, int> atoms,
00085 std::map<std::string, std::vector<int> >& distances, std::map<std::string, std::vector<int> >& angles,
00086 std::map<std::string, std::vector<int> >& dihedrals);
00087 CustomHbondForce& owner;
00088 Kernel kernel;
00089 };
00090
00091 }
00092
00093 #endif