ObcParameters.cpp 12.7 KB
Newer Older
1

2
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 * Contributors: Pande Group
 *
 * 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 <math.h>
#include <sstream>
27
#include <string.h>
28

Mark Friedrichs's avatar
Mark Friedrichs committed
29
#include "openmm/OpenMMException.h"
30
#include "ObcParameters.h"
peastman's avatar
peastman committed
31
#include "SimTKOpenMMRealType.h"
32

33
using std::vector;
34
using namespace OpenMM;
35
36
37

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
38
    ObcParameters constructor 
39

Mark Friedrichs's avatar
Mark Friedrichs committed
40
41
    @param numberOfAtoms       number of atoms
    @param obcType             OBC type (Eq. 7 or 8 in paper)
42

Mark Friedrichs's avatar
Mark Friedrichs committed
43
    --------------------------------------------------------------------------------------- */
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
ObcParameters::ObcParameters(int numberOfAtoms, ObcParameters::ObcType obcType) :
                              _numberOfAtoms(numberOfAtoms),
                              _solventDielectric(78.3),
                              _soluteDielectric(1.0),
                              _electricConstant(-0.5*ONE_4PI_EPS0),
                              _probeRadius(0.14),
                              _pi4Asolv(28.3919551),
                              _dielectricOffset(0.009),
                              _obcType(obcType),
                              _cutoff(false),
                              _periodic(false) {

    _atomicRadii.resize(numberOfAtoms);
    _scaledRadiusFactors.resize(numberOfAtoms);
    setObcTypeParameters(obcType);
60
61
62
63
64

}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
65
    ObcParameters destructor 
66

Mark Friedrichs's avatar
Mark Friedrichs committed
67
    --------------------------------------------------------------------------------------- */
68

69
ObcParameters::~ObcParameters() {
Mark Friedrichs's avatar
Mark Friedrichs committed
70
}
71

Mark Friedrichs's avatar
Mark Friedrichs committed
72
/**---------------------------------------------------------------------------------------
73

Mark Friedrichs's avatar
Mark Friedrichs committed
74
   Get number of atoms
75

Mark Friedrichs's avatar
Mark Friedrichs committed
76
   @return number of atoms
77

Mark Friedrichs's avatar
Mark Friedrichs committed
78
   --------------------------------------------------------------------------------------- */
79

80
int ObcParameters::getNumberOfAtoms() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
81
    return _numberOfAtoms;
82
83
84
85
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
86
    Get OBC type
87

Mark Friedrichs's avatar
Mark Friedrichs committed
88
    @return OBC type
89

Mark Friedrichs's avatar
Mark Friedrichs committed
90
    --------------------------------------------------------------------------------------- */
91

92
ObcParameters::ObcType ObcParameters::getObcType() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
93
    return _obcType;
94
95
96
97
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
98
    Set OBC type specific parameters
99

Mark Friedrichs's avatar
Mark Friedrichs committed
100
    @param obcType OBC type (ObcTypeI or ObcTypeII -- Eq. 7 or 8)
101

Mark Friedrichs's avatar
Mark Friedrichs committed
102
    --------------------------------------------------------------------------------------- */
103

104
105
void ObcParameters::setObcTypeParameters(ObcParameters::ObcType obcType) {
    if (obcType == ObcTypeI) {
106
107
108
        _alphaObc   = 0.8;
        _betaObc    = 0.0;
        _gammaObc   = 2.91;
Mark Friedrichs's avatar
Mark Friedrichs committed
109
    } else {
110
111
112
        _alphaObc   = 1.0;
        _betaObc    = 0.8;
        _gammaObc   = 4.85;
Mark Friedrichs's avatar
Mark Friedrichs committed
113
114
    }
    _obcType = obcType;
115
116
117
118
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
119
    Get dielectricOffset
120

Mark Friedrichs's avatar
Mark Friedrichs committed
121
    @return _dielectricOffset
122

Mark Friedrichs's avatar
Mark Friedrichs committed
123
    --------------------------------------------------------------------------------------- */
124

peastman's avatar
peastman committed
125
double ObcParameters::getDielectricOffset() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
126
    return _dielectricOffset;
127
128
129
130
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
131
    Get alpha OBC (Eqs. 6 & 7) in Proteins paper
132

Mark Friedrichs's avatar
Mark Friedrichs committed
133
    @return alphaObc
134

Mark Friedrichs's avatar
Mark Friedrichs committed
135
    --------------------------------------------------------------------------------------- */
136

peastman's avatar
peastman committed
137
double ObcParameters::getAlphaObc() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
138
    return _alphaObc;
139
140
141
142
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
143
    Get beta OBC (Eqs. 6 & 7) in Proteins paper
144

Mark Friedrichs's avatar
Mark Friedrichs committed
145
    @return betaObc
146

Mark Friedrichs's avatar
Mark Friedrichs committed
147
    --------------------------------------------------------------------------------------- */
148

peastman's avatar
peastman committed
149
double ObcParameters::getBetaObc() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
150
    return _betaObc;
151
152
153
154
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
155
    Get gamma OBC (Eqs. 6 & 7) in Proteins paper
156

Mark Friedrichs's avatar
Mark Friedrichs committed
157
    @return gammaObc
158

Mark Friedrichs's avatar
Mark Friedrichs committed
159
    --------------------------------------------------------------------------------------- */
160

peastman's avatar
peastman committed
161
double ObcParameters::getGammaObc() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
162
    return _gammaObc;
163
164
165
166
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
167
   Get solvent dielectric
168

Mark Friedrichs's avatar
Mark Friedrichs committed
169
   @return solvent dielectric
170
171
172

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
173
double ObcParameters::getSolventDielectric() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
174
    return _solventDielectric;
175
176
177
178
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
179
   Set solvent dielectric
180

Mark Friedrichs's avatar
Mark Friedrichs committed
181
   @param solventDielectric solvent dielectric
182
183
184

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
185
void ObcParameters::setSolventDielectric(double solventDielectric) {
Mark Friedrichs's avatar
Mark Friedrichs committed
186
    _solventDielectric = solventDielectric;
187
188
189
}
/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
190
   Get solute dielectric
191

Mark Friedrichs's avatar
Mark Friedrichs committed
192
   @return soluteDielectric
193
194
195

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
196
double ObcParameters::getSoluteDielectric() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
197
    return _soluteDielectric;
198
199
200
201
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
202
   Set solute dielectric
203

Mark Friedrichs's avatar
Mark Friedrichs committed
204
   @param soluteDielectric solute dielectric
205
206
207

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
208
void ObcParameters::setSoluteDielectric(double soluteDielectric) {
Mark Friedrichs's avatar
Mark Friedrichs committed
209
    _soluteDielectric = soluteDielectric;
210
211
212
213
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
214
   Get electric constant 
215

Mark Friedrichs's avatar
Mark Friedrichs committed
216
   @return electricConstant
217
218
219

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
220
double ObcParameters::getElectricConstant() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
221
    return _electricConstant;
222
223
224
225
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
226
   Get probe radius 
227

Mark Friedrichs's avatar
Mark Friedrichs committed
228
   @return probeRadius
229
230
231

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
232
double ObcParameters::getProbeRadius() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
233
    return _probeRadius;
234
235
236
237
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
238
   Set probe radius  
239

Mark Friedrichs's avatar
Mark Friedrichs committed
240
   @param probeRadius   probe radius
241
242
243

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
244
void ObcParameters::setProbeRadius(double probeRadius) {
Mark Friedrichs's avatar
Mark Friedrichs committed
245
    _probeRadius = probeRadius;
246
247
248
249
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
250
   Get pi*4*Asolv:  used in ACE approximation for nonpolar term  
peastman's avatar
peastman committed
251
252
         M_PI*4.0f*0.0049*1000.0; (Still) 
         M_PI*4.0f*0.0054*1000.0; (OBC) 
253

Mark Friedrichs's avatar
Mark Friedrichs committed
254
   @return pi4Asolv
255
256
257

   --------------------------------------------------------------------------------------- */

peastman's avatar
peastman committed
258
double ObcParameters::getPi4Asolv() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
259
260
    return _pi4Asolv;
}
261

peastman's avatar
peastman committed
262
void ObcParameters::setPi4Asolv(double pi4Asolv) {
263
264
    _pi4Asolv = pi4Asolv;
}
265

Mark Friedrichs's avatar
Mark Friedrichs committed
266
/**---------------------------------------------------------------------------------------
267

Mark Friedrichs's avatar
Mark Friedrichs committed
268
    Get AtomicRadii array
269

Mark Friedrichs's avatar
Mark Friedrichs committed
270
    @return array of atomic radii
271

Mark Friedrichs's avatar
Mark Friedrichs committed
272
    --------------------------------------------------------------------------------------- */
273

peastman's avatar
peastman committed
274
const vector<double>& ObcParameters::getAtomicRadii() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
275
276
    return _atomicRadii;
}
277

Mark Friedrichs's avatar
Mark Friedrichs committed
278
/**---------------------------------------------------------------------------------------
279

Mark Friedrichs's avatar
Mark Friedrichs committed
280
    Set AtomicRadii array
281

Mark Friedrichs's avatar
Mark Friedrichs committed
282
    @param atomicRadii vector of atomic radii
283

Mark Friedrichs's avatar
Mark Friedrichs committed
284
    --------------------------------------------------------------------------------------- */
285

peastman's avatar
peastman committed
286
void ObcParameters::setAtomicRadii(const vector<double>& atomicRadii) {
287

288
289
    if (atomicRadii.size() == _atomicRadii.size()) {
        for (unsigned int ii = 0; ii < atomicRadii.size(); ii++) {
Mark Friedrichs's avatar
Mark Friedrichs committed
290
291
292
293
294
295
296
297
298
            _atomicRadii[ii] = atomicRadii[ii];
        }   
    } else {
        std::stringstream msg;
        msg << "ObcParameters: input size for atomic radii does not agree w/ current size: input=";
        msg << atomicRadii.size();
        msg << " current size=" << _atomicRadii.size();
        throw OpenMM::OpenMMException(msg.str());
    }   
299

Mark Friedrichs's avatar
Mark Friedrichs committed
300
}
301

Mark Friedrichs's avatar
Mark Friedrichs committed
302
/**---------------------------------------------------------------------------------------
303

Mark Friedrichs's avatar
Mark Friedrichs committed
304
    Return OBC scale factors
305

Mark Friedrichs's avatar
Mark Friedrichs committed
306
    @return array 
307

Mark Friedrichs's avatar
Mark Friedrichs committed
308
    --------------------------------------------------------------------------------------- */
309

peastman's avatar
peastman committed
310
const vector<double>& ObcParameters::getScaledRadiusFactors() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
311
    return _scaledRadiusFactors;
312
313
314
315
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
316
    Set OBC scale factors
317

Mark Friedrichs's avatar
Mark Friedrichs committed
318
    @param scaledRadiusFactors  scaledRadiusFactors
319

Mark Friedrichs's avatar
Mark Friedrichs committed
320
    --------------------------------------------------------------------------------------- */
321

peastman's avatar
peastman committed
322
void ObcParameters::setScaledRadiusFactors(const vector<double>& scaledRadiusFactors) {
323

324
325
    if (scaledRadiusFactors.size() == _scaledRadiusFactors.size()) {
        for (unsigned int ii = 0; ii < scaledRadiusFactors.size(); ii++) {
Mark Friedrichs's avatar
Mark Friedrichs committed
326
327
328
329
330
331
332
333
334
            _scaledRadiusFactors[ii] = scaledRadiusFactors[ii];
        }   
    } else {
        std::stringstream msg;
        msg << "ObcParameters: input size for scaled radius factors does not agree w/ current size: input=";
        msg << scaledRadiusFactors.size();
        msg << " current size=" << _scaledRadiusFactors.size();
        throw OpenMM::OpenMMException(msg.str());
    }   
335
336
337

}

338
339
/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
340
      Set the force to use a cutoff.
341

Mark Friedrichs's avatar
Mark Friedrichs committed
342
      @param distance            the cutoff distance
343

Mark Friedrichs's avatar
Mark Friedrichs committed
344
      --------------------------------------------------------------------------------------- */
345

peastman's avatar
peastman committed
346
void ObcParameters::setUseCutoff(double distance) {
347

Mark Friedrichs's avatar
Mark Friedrichs committed
348
349
     _cutoff         = true;
     _cutoffDistance = distance;
350
351
352
353
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
354
      Get whether to use a cutoff.
355

Mark Friedrichs's avatar
Mark Friedrichs committed
356
      --------------------------------------------------------------------------------------- */
357

358
bool ObcParameters::getUseCutoff() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
359
     return _cutoff;
360
361
362
363
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
364
      Get the cutoff distance.
365

Mark Friedrichs's avatar
Mark Friedrichs committed
366
      --------------------------------------------------------------------------------------- */
367

peastman's avatar
peastman committed
368
double ObcParameters::getCutoffDistance() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
369
     return _cutoffDistance;
370
371
372
373
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
374
375
376
377
      Set the force to use periodic boundary conditions.  This requires that a cutoff has
      also been set, and the smallest side of the periodic box is at least twice the cutoff
      distance.

378
      @param vectors    the vectors defining the periodic box
Mark Friedrichs's avatar
Mark Friedrichs committed
379
380

      --------------------------------------------------------------------------------------- */
381

peastman's avatar
peastman committed
382
void ObcParameters::setPeriodic(OpenMM::Vec3* vectors) {
383

384
    assert(_cutoff);
385

peastman's avatar
peastman committed
386
387
388
    assert(vectors[0][0] >= 2.0*_cutoffDistance);
    assert(vectors[1][1] >= 2.0*_cutoffDistance);
    assert(vectors[2][2] >= 2.0*_cutoffDistance);
389

390
391
392
393
    _periodic           = true;
    _periodicBoxVectors[0] = vectors[0];
    _periodicBoxVectors[1] = vectors[1];
    _periodicBoxVectors[2] = vectors[2];
394
395
396
397
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
398
      Get whether to use periodic boundary conditions.
399

Mark Friedrichs's avatar
Mark Friedrichs committed
400
      --------------------------------------------------------------------------------------- */
401
402

bool ObcParameters::getPeriodic() {
Mark Friedrichs's avatar
Mark Friedrichs committed
403
     return _periodic;
404
405
406
407
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
408
      Get the periodic box dimension
409

Mark Friedrichs's avatar
Mark Friedrichs committed
410
      --------------------------------------------------------------------------------------- */
411

peastman's avatar
peastman committed
412
const OpenMM::Vec3* ObcParameters::getPeriodicBox() {
413
     return _periodicBoxVectors;
414
}