CustomHbondForce.cpp 10.4 KB
Newer Older
1
2
3
4
5
6
7
8
/* -------------------------------------------------------------------------- *
 *                                   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.               *
 *                                                                            *
9
 * Portions copyright (c) 2008-2014 Stanford University and the Authors.      *
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 * 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/Force.h"
#include "openmm/OpenMMException.h"
#include "openmm/CustomHbondForce.h"
35
#include "openmm/internal/AssertionUtilities.h"
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "openmm/internal/CustomHbondForceImpl.h"
#include <cmath>
#include <map>
#include <sstream>
#include <utility>

using namespace OpenMM;
using std::map;
using std::pair;
using std::set;
using std::string;
using std::stringstream;
using std::vector;

CustomHbondForce::CustomHbondForce(const string& energy) : energyExpression(energy), nonbondedMethod(NoCutoff), cutoffDistance(1.0) {
}

53
54

CustomHbondForce::~CustomHbondForce() {
peastman's avatar
peastman committed
55
56
    for (auto function : functions)
        delete function.function;
57
58
}

59
60
61
62
63
64
65
66
67
68
69
70
71
const string& CustomHbondForce::getEnergyFunction() const {
    return energyExpression;
}

void CustomHbondForce::setEnergyFunction(const std::string& energy) {
    energyExpression = energy;
}

CustomHbondForce::NonbondedMethod CustomHbondForce::getNonbondedMethod() const {
    return nonbondedMethod;
}

void CustomHbondForce::setNonbondedMethod(NonbondedMethod method) {
72
73
    if (method < 0 || method > 2)
        throw OpenMMException("CustomHbondForce: Illegal value for nonbonded method");
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    nonbondedMethod = method;
}

double CustomHbondForce::getCutoffDistance() const {
    return cutoffDistance;
}

void CustomHbondForce::setCutoffDistance(double distance) {
    cutoffDistance = distance;
}

int CustomHbondForce::addPerDonorParameter(const string& name) {
    donorParameters.push_back(PerPairParameterInfo(name));
    return donorParameters.size()-1;
}

const string& CustomHbondForce::getPerDonorParameterName(int index) const {
91
    ASSERT_VALID_INDEX(index, donorParameters);
92
93
94
95
    return donorParameters[index].name;
}

void CustomHbondForce::setPerDonorParameterName(int index, const string& name) {
96
    ASSERT_VALID_INDEX(index, donorParameters);
97
98
99
100
101
102
103
104
105
    donorParameters[index].name = name;
}

int CustomHbondForce::addPerAcceptorParameter(const string& name) {
    acceptorParameters.push_back(PerPairParameterInfo(name));
    return acceptorParameters.size()-1;
}

const string& CustomHbondForce::getPerAcceptorParameterName(int index) const {
106
    ASSERT_VALID_INDEX(index, acceptorParameters);
107
108
109
110
    return acceptorParameters[index].name;
}

void CustomHbondForce::setPerAcceptorParameterName(int index, const string& name) {
111
    ASSERT_VALID_INDEX(index, acceptorParameters);
112
113
114
115
116
117
118
119
120
    acceptorParameters[index].name = name;
}

int CustomHbondForce::addGlobalParameter(const string& name, double defaultValue) {
    globalParameters.push_back(GlobalParameterInfo(name, defaultValue));
    return globalParameters.size()-1;
}

const string& CustomHbondForce::getGlobalParameterName(int index) const {
121
    ASSERT_VALID_INDEX(index, globalParameters);
122
123
124
125
    return globalParameters[index].name;
}

void CustomHbondForce::setGlobalParameterName(int index, const string& name) {
126
    ASSERT_VALID_INDEX(index, globalParameters);
127
128
129
130
    globalParameters[index].name = name;
}

double CustomHbondForce::getGlobalParameterDefaultValue(int index) const {
131
    ASSERT_VALID_INDEX(index, globalParameters);
132
133
134
135
    return globalParameters[index].defaultValue;
}

void CustomHbondForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
136
    ASSERT_VALID_INDEX(index, globalParameters);
137
138
139
    globalParameters[index].defaultValue = defaultValue;
}

140
141
int CustomHbondForce::addDonor(int d1, int d2, int d3, const vector<double>& parameters) {
    donors.push_back(GroupInfo(d1, d2, d3, parameters));
142
143
144
    return donors.size()-1;
}

145
void CustomHbondForce::getDonorParameters(int index, int& d1, int& d2, int&  d3, std::vector<double>& parameters) const {
146
    ASSERT_VALID_INDEX(index, donors);
147
148
149
    d1 = donors[index].p1;
    d2 = donors[index].p2;
    d3 = donors[index].p3;
150
151
152
    parameters = donors[index].parameters;
}

153
void CustomHbondForce::setDonorParameters(int index, int d1, int d2, int d3, const vector<double>& parameters) {
154
    ASSERT_VALID_INDEX(index, donors);
155
156
157
    donors[index].p1 = d1;
    donors[index].p2 = d2;
    donors[index].p3 = d3;
158
159
160
    donors[index].parameters = parameters;
}

161
162
int CustomHbondForce::addAcceptor(int a1, int a2, int a3, const vector<double>& parameters) {
    acceptors.push_back(GroupInfo(a1, a2, a3, parameters));
163
164
165
    return acceptors.size()-1;
}

166
void CustomHbondForce::getAcceptorParameters(int index, int& a1, int& a2, int& a3, std::vector<double>& parameters) const {
167
    ASSERT_VALID_INDEX(index, acceptors);
168
169
170
    a1 = acceptors[index].p1;
    a2 = acceptors[index].p2;
    a3 = acceptors[index].p3;
171
172
173
    parameters = acceptors[index].parameters;
}

174
void CustomHbondForce::setAcceptorParameters(int index, int a1, int a2, int a3, const vector<double>& parameters) {
175
    ASSERT_VALID_INDEX(index, acceptors);
176
177
178
    acceptors[index].p1 = a1;
    acceptors[index].p2 = a2;
    acceptors[index].p3 = a3;
179
180
181
182
183
184
185
186
    acceptors[index].parameters = parameters;
}

int CustomHbondForce::addExclusion(int donor, int acceptor) {
    exclusions.push_back(ExclusionInfo(donor, acceptor));
    return exclusions.size()-1;
}
void CustomHbondForce::getExclusionParticles(int index, int& donor, int& acceptor) const {
187
    ASSERT_VALID_INDEX(index, exclusions);
188
189
190
191
192
    donor = exclusions[index].donor;
    acceptor = exclusions[index].acceptor;
}

void CustomHbondForce::setExclusionParticles(int index, int donor, int acceptor) {
193
    ASSERT_VALID_INDEX(index, exclusions);
194
195
196
197
    exclusions[index].donor = donor;
    exclusions[index].acceptor = acceptor;
}

198
int CustomHbondForce::addTabulatedFunction(const std::string& name, TabulatedFunction* function) {
199
200
201
202
    functions.push_back(FunctionInfo(name, function));
    return functions.size()-1;
}

203
const TabulatedFunction& CustomHbondForce::getTabulatedFunction(int index) const {
204
205
206
207
    ASSERT_VALID_INDEX(index, functions);
    return *functions[index].function;
}

208
TabulatedFunction& CustomHbondForce::getTabulatedFunction(int index) {
209
210
211
212
    ASSERT_VALID_INDEX(index, functions);
    return *functions[index].function;
}

213
const string& CustomHbondForce::getTabulatedFunctionName(int index) const {
214
215
216
217
    ASSERT_VALID_INDEX(index, functions);
    return functions[index].name;
}

218
int CustomHbondForce::addFunction(const std::string& name, const std::vector<double>& values, double min, double max) {
219
    functions.push_back(FunctionInfo(name, new Continuous1DFunction(values, min, max)));
220
221
222
    return functions.size()-1;
}

223
void CustomHbondForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const {
224
    ASSERT_VALID_INDEX(index, functions);
225
226
227
    Continuous1DFunction* function = dynamic_cast<Continuous1DFunction*>(functions[index].function);
    if (function == NULL)
        throw OpenMMException("CustomHbondForce: function is not a Continuous1DFunction");
228
    name = functions[index].name;
229
    function->getFunctionParameters(values, min, max);
230
231
}

232
void CustomHbondForce::setFunctionParameters(int index, const std::string& name, const std::vector<double>& values, double min, double max) {
233
    ASSERT_VALID_INDEX(index, functions);
234
235
236
    Continuous1DFunction* function = dynamic_cast<Continuous1DFunction*>(functions[index].function);
    if (function == NULL)
        throw OpenMMException("CustomHbondForce: function is not a Continuous1DFunction");
237
    functions[index].name = name;
238
    function->setFunctionParameters(values, min, max);
239
240
}

241
ForceImpl* CustomHbondForce::createImpl() const {
242
243
244
    return new CustomHbondForceImpl(*this);
}

245
246
247
void CustomHbondForce::updateParametersInContext(Context& context) {
    dynamic_cast<CustomHbondForceImpl&>(getImplInContext(context)).updateParametersInContext(getContextImpl(context));
}
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279

int CustomHbondForce::getNumDonors() const {
    return donors.size();
}

int CustomHbondForce::getNumAcceptors() const {
    return acceptors.size();
}

int CustomHbondForce::getNumExclusions() const {
    return exclusions.size();
}

int CustomHbondForce::getNumPerDonorParameters() const {
    return donorParameters.size();
}

int CustomHbondForce::getNumPerAcceptorParameters() const {
    return acceptorParameters.size();
}

int CustomHbondForce::getNumGlobalParameters() const {
    return globalParameters.size();
}

int CustomHbondForce::getNumTabulatedFunctions() const {
    return functions.size();
}

int CustomHbondForce::getNumFunctions() const {
    return functions.size();
}