00001 #ifndef OPENMM_CUSTOMGBFORCE_H_
00002 #define OPENMM_CUSTOMGBFORCE_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 "Force.h"
00036 #include "Vec3.h"
00037 #include <map>
00038 #include <set>
00039 #include <utility>
00040 #include <vector>
00041 #include "internal/windowsExport.h"
00042
00043 namespace OpenMM {
00044
00140 class OPENMM_EXPORT CustomGBForce : public Force {
00141 public:
00145 enum NonbondedMethod {
00150 NoCutoff = 0,
00154 CutoffNonPeriodic = 1,
00159 CutoffPeriodic = 2,
00160 };
00164 enum ComputationType {
00168 SingleParticle = 0,
00172 ParticlePair = 1,
00177 ParticlePairNoExclusions = 2
00178 };
00182 CustomGBForce();
00186 int getNumParticles() const {
00187 return particles.size();
00188 }
00192 int getNumExclusions() const {
00193 return exclusions.size();
00194 }
00198 int getNumPerParticleParameters() const {
00199 return parameters.size();
00200 }
00204 int getNumGlobalParameters() const {
00205 return globalParameters.size();
00206 }
00210 int getNumFunctions() const {
00211 return functions.size();
00212 }
00216 int getNumComputedValues() const {
00217 return computedValues.size();
00218 }
00222 int getNumEnergyTerms() const {
00223 return energyTerms.size();
00224 }
00228 NonbondedMethod getNonbondedMethod() const;
00232 void setNonbondedMethod(NonbondedMethod method);
00239 double getCutoffDistance() const;
00246 void setCutoffDistance(double distance);
00253 int addPerParticleParameter(const std::string& name);
00260 const std::string& getPerParticleParameterName(int index) const;
00267 void setPerParticleParameterName(int index, const std::string& name);
00275 int addGlobalParameter(const std::string& name, double defaultValue);
00282 const std::string& getGlobalParameterName(int index) const;
00289 void setGlobalParameterName(int index, const std::string& name);
00296 double getGlobalParameterDefaultValue(int index) const;
00303 void setGlobalParameterDefaultValue(int index, double defaultValue);
00311 int addParticle(const std::vector<double>& parameters);
00318 void getParticleParameters(int index, std::vector<double>& parameters) const;
00325 void setParticleParameters(int index, const std::vector<double>& parameters);
00342 int addComputedValue(const std::string& name, const std::string& expression, ComputationType type);
00360 void getComputedValueParameters(int index, std::string& name, std::string& expression, ComputationType& type) const;
00378 void setComputedValueParameters(int index, const std::string& name, const std::string& expression, ComputationType type);
00394 int addEnergyTerm(const std::string& expression, ComputationType type);
00411 void getEnergyTermParameters(int index, std::string& expression, ComputationType& type) const;
00428 void setEnergyTermParameters(int index, const std::string& expression, ComputationType type);
00436 int addExclusion(int particle1, int particle2);
00444 void getExclusionParticles(int index, int& particle1, int& particle2) const;
00452 void setExclusionParticles(int index, int particle1, int particle2);
00463 int addFunction(const std::string& name, const std::vector<double>& values, double min, double max);
00474 void getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const;
00485 void setFunctionParameters(int index, const std::string& name, const std::vector<double>& values, double min, double max);
00486 protected:
00487 ForceImpl* createImpl();
00488 private:
00489 class ParticleInfo;
00490 class PerParticleParameterInfo;
00491 class GlobalParameterInfo;
00492 class ExclusionInfo;
00493 class FunctionInfo;
00494 class ComputationInfo;
00495 NonbondedMethod nonbondedMethod;
00496 double cutoffDistance;
00497 std::vector<PerParticleParameterInfo> parameters;
00498 std::vector<GlobalParameterInfo> globalParameters;
00499 std::vector<ParticleInfo> particles;
00500 std::vector<ExclusionInfo> exclusions;
00501 std::vector<FunctionInfo> functions;
00502 std::vector<ComputationInfo> computedValues;
00503 std::vector<ComputationInfo> energyTerms;
00504 };
00505
00510 class CustomGBForce::ParticleInfo {
00511 public:
00512 std::vector<double> parameters;
00513 ParticleInfo() {
00514 }
00515 ParticleInfo(const std::vector<double>& parameters) : parameters(parameters) {
00516 }
00517 };
00518
00523 class CustomGBForce::PerParticleParameterInfo {
00524 public:
00525 std::string name;
00526 PerParticleParameterInfo() {
00527 }
00528 PerParticleParameterInfo(const std::string& name) : name(name) {
00529 }
00530 };
00531
00536 class CustomGBForce::GlobalParameterInfo {
00537 public:
00538 std::string name;
00539 double defaultValue;
00540 GlobalParameterInfo() {
00541 }
00542 GlobalParameterInfo(const std::string& name, double defaultValue) : name(name), defaultValue(defaultValue) {
00543 }
00544 };
00545
00550 class CustomGBForce::ExclusionInfo {
00551 public:
00552 int particle1, particle2;
00553 ExclusionInfo() {
00554 particle1 = particle2 = -1;
00555 }
00556 ExclusionInfo(int particle1, int particle2) :
00557 particle1(particle1), particle2(particle2) {
00558 }
00559 };
00560
00565 class CustomGBForce::FunctionInfo {
00566 public:
00567 std::string name;
00568 std::vector<double> values;
00569 double min, max;
00570 FunctionInfo() {
00571 }
00572 FunctionInfo(const std::string& name, const std::vector<double>& values, double min, double max) :
00573 name(name), values(values), min(min), max(max) {
00574 }
00575 };
00576
00581 class CustomGBForce::ComputationInfo {
00582 public:
00583 std::string name;
00584 std::string expression;
00585 CustomGBForce::ComputationType type;
00586 ComputationInfo() {
00587 }
00588 ComputationInfo(const std::string& name, const std::string& expression, CustomGBForce::ComputationType type) :
00589 name(name), expression(expression), type(type) {
00590 }
00591 };
00592
00593 }
00594
00595 #endif