1 // ****************************************************************************** 2 // 3 // Title: Force Field X. 4 // Description: Force Field X - Software for Molecular Biophysics. 5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2025. 6 // 7 // This file is part of Force Field X. 8 // 9 // Force Field X is free software; you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License version 3 as published by 11 // the Free Software Foundation. 12 // 13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT 14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 // details. 17 // 18 // You should have received a copy of the GNU General Public License along with 19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple 20 // Place, Suite 330, Boston, MA 02111-1307 USA 21 // 22 // Linking this library statically or dynamically with other modules is making a 23 // combined work based on this library. Thus, the terms and conditions of the 24 // GNU General Public License cover the whole combination. 25 // 26 // As a special exception, the copyright holders of this library give you 27 // permission to link this library with independent modules to produce an 28 // executable, regardless of the license terms of these independent modules, and 29 // to copy and distribute the resulting executable under terms of your choice, 30 // provided that you also meet, for each linked independent module, the terms 31 // and conditions of the license of that module. An independent module is a 32 // module which is not derived from or based on this library. If you modify this 33 // library, you may extend this exception to your version of the library, but 34 // you are not obligated to do so. If you do not wish to do so, delete this 35 // exception statement from your version. 36 // 37 // ****************************************************************************** 38 package ffx.openmm; 39 40 import com.sun.jna.Pointer; 41 import com.sun.jna.ptr.DoubleByReference; 42 import com.sun.jna.ptr.IntByReference; 43 import com.sun.jna.ptr.PointerByReference; 44 45 import java.nio.DoubleBuffer; 46 import java.nio.IntBuffer; 47 48 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_Boolean.OpenMM_True; 49 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addAcceptor; 50 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addDonor; 51 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addExclusion; 52 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addFunction; 53 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addGlobalParameter; 54 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addPerAcceptorParameter; 55 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addPerDonorParameter; 56 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_addTabulatedFunction; 57 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_create; 58 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_destroy; 59 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getAcceptorParameters; 60 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getCutoffDistance; 61 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getDonorParameters; 62 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getEnergyFunction; 63 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getExclusionParticles; 64 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getFunctionParameters; 65 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getGlobalParameterDefaultValue; 66 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getGlobalParameterName; 67 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNonbondedMethod; 68 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumAcceptors; 69 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumDonors; 70 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumExclusions; 71 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumFunctions; 72 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumGlobalParameters; 73 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumPerAcceptorParameters; 74 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumPerDonorParameters; 75 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getNumTabulatedFunctions; 76 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getPerAcceptorParameterName; 77 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getPerDonorParameterName; 78 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getTabulatedFunction; 79 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_getTabulatedFunctionName; 80 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setAcceptorParameters; 81 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setCutoffDistance; 82 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setDonorParameters; 83 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setEnergyFunction; 84 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setExclusionParticles; 85 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setFunctionParameters; 86 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setGlobalParameterDefaultValue; 87 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setGlobalParameterName; 88 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setNonbondedMethod; 89 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setPerAcceptorParameterName; 90 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_setPerDonorParameterName; 91 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_updateParametersInContext; 92 import static edu.uiowa.jopenmm.OpenMMLibrary.OpenMM_CustomHbondForce_usesPeriodicBoundaryConditions; 93 94 /** 95 * This class supports a wide variety of energy functions used to represent hydrogen bonding. It computes 96 * interactions between "donor" particle groups and "acceptor" particle groups, where each group may include 97 * up to three particles. Typically a donor group consists of a hydrogen atom and the atoms it is bonded to, 98 * and an acceptor group consists of a negatively charged atom and the atoms it is bonded to. 99 * 100 * <p>We refer to the particles in a donor group as d1, d2 and d3, and the particles in an acceptor group as 101 * a1, a2, and a3. For each donor and each acceptor, CustomHbondForce evaluates a user supplied algebraic 102 * expression to determine the interaction energy. The expression may depend on arbitrary distances, angles, 103 * and dihedral angles defined by any of the six particles involved. The function distance(p1, p2) is the distance 104 * between the particles p1 and p2 (where "p1" and "p2" should be replaced by the names of the actual particles 105 * to calculate the distance between), angle(p1, p2, p3) is the angle formed by the three specified particles, 106 * and dihedral(p1, p2, p3, p4) is the dihedral angle formed by the four specified particles. 107 * 108 * <p>The expression also may involve tabulated functions, and may depend on arbitrary 109 * global, per-donor, and per-acceptor parameters. It also optionally supports periodic boundary conditions 110 * and cutoffs for long range interactions. 111 * 112 * <p>To use this class, create a CustomHbondForce object, passing an algebraic expression to the constructor 113 * that defines the interaction energy between each donor and acceptor. Then call addPerDonorParameter() to define per-donor 114 * parameters, addPerAcceptorParameter() to define per-acceptor parameters, and addGlobalParameter() to define 115 * global parameters. The values of per-donor and per-acceptor parameters are specified as part of the system 116 * definition, while values of global parameters may be modified during a simulation by calling Context::setParameter(). 117 * 118 * <p>Next, call addDonor() and addAcceptor() to define donors and acceptors and specify their parameter values. 119 * After a donor or acceptor has been added, you can modify its parameters by calling setDonorParameters() or 120 * setAcceptorParameters(). This will have no effect on Contexts that already exist unless you call updateParametersInContext(). 121 * 122 * <p>CustomHbondForce also lets you specify "exclusions", particular combinations of donors and acceptors whose 123 * interactions should be omitted from force and energy calculations. This is most often used for particles 124 * that are bonded to each other. 125 * 126 * <p>As an example, the following code creates a CustomHbondForce that implements a simple harmonic potential 127 * to keep the distance between a1 and d1, and the angle formed by a1-d1-d2, near ideal values: 128 * 129 * <pre>{@code 130 * CustomHbondForce force = new CustomHbondForce("k*(distance(a1,d1)-r0)^2*(angle(a1,d1,d2)-theta0)^2"); 131 * }</pre> 132 * 133 * <p>This force depends on three parameters: k, r0, and theta0. The following code defines these as per-donor parameters: 134 * 135 * <pre>{@code 136 * force.addPerDonorParameter("k"); 137 * force.addPerDonorParameter("r0"); 138 * force.addPerDonorParameter("theta0"); 139 * }</pre> 140 * 141 * <p>Expressions may involve the operators + (add), - (subtract), * (multiply), / (divide), and ^ (power), and the following 142 * functions: sqrt, exp, log, sin, cos, sec, csc, tan, cot, asin, acos, atan, atan2, sinh, cosh, tanh, erf, erfc, min, max, abs, floor, ceil, step, delta, select. All trigonometric functions 143 * are defined in radians, and log is the natural logarithm. step(x) = 0 if x < 0, 1 otherwise. delta(x) = 1 if x = 0, 0 otherwise. 144 * select(x,y,z) = z if x = 0, y otherwise. 145 * 146 * <p>In addition, you can call addTabulatedFunction() to define a new function based on tabulated values. You specify the function by 147 * creating a TabulatedFunction object. That function can then appear in the expression. 148 */ 149 public class CustomHbondForce extends Force { 150 151 /** 152 * Create a new CustomHbondForce. 153 * 154 * @param energy The energy expression for the hydrogen bond interaction. 155 */ 156 public CustomHbondForce(String energy) { 157 super(OpenMM_CustomHbondForce_create(energy)); 158 } 159 160 /** 161 * Add an acceptor to the force. 162 * 163 * @param a1 The index of the first atom that defines the acceptor. 164 * @param a2 The index of the second atom that defines the acceptor. 165 * @param a3 The index of the third atom that defines the acceptor. 166 * @param parameters The parameters for the acceptor. 167 * @return The index of the acceptor that was added. 168 */ 169 public int addAcceptor(int a1, int a2, int a3, PointerByReference parameters) { 170 return OpenMM_CustomHbondForce_addAcceptor(pointer, a1, a2, a3, parameters); 171 } 172 173 /** 174 * Add a donor to the force. 175 * 176 * @param d1 The index of the first atom that defines the donor. 177 * @param d2 The index of the second atom that defines the donor. 178 * @param d3 The index of the third atom that defines the donor. 179 * @param parameters The parameters for the donor. 180 * @return The index of the donor that was added. 181 */ 182 public int addDonor(int d1, int d2, int d3, PointerByReference parameters) { 183 return OpenMM_CustomHbondForce_addDonor(pointer, d1, d2, d3, parameters); 184 } 185 186 /** 187 * Add an exclusion to the force. 188 * 189 * @param donor The index of the donor. 190 * @param acceptor The index of the acceptor. 191 * @return The index of the exclusion that was added. 192 */ 193 public int addExclusion(int donor, int acceptor) { 194 return OpenMM_CustomHbondForce_addExclusion(pointer, donor, acceptor); 195 } 196 197 /** 198 * Add a tabulated function that may appear in the energy expression. 199 * 200 * @param name The name of the function as it appears in expressions. 201 * @param function A TabulatedFunction object defining the function. 202 * @param min The minimum value of the independent variable for which the function is defined. 203 * @param max The maximum value of the independent variable for which the function is defined. 204 * @return The index of the function that was added. 205 */ 206 public int addFunction(String name, PointerByReference function, double min, double max) { 207 return OpenMM_CustomHbondForce_addFunction(pointer, name, function, min, max); 208 } 209 210 /** 211 * Add a tabulated function that may appear in the energy expression. 212 * 213 * @param name The name of the function as it appears in expressions. 214 * @param function A TabulatedFunction object defining the function. 215 * @param min The minimum value of the independent variable for which the function is defined. 216 * @param max The maximum value of the independent variable for which the function is defined. 217 * @return The index of the function that was added. 218 */ 219 public int addFunction(Pointer name, PointerByReference function, double min, double max) { 220 return OpenMM_CustomHbondForce_addFunction(pointer, name, function, min, max); 221 } 222 223 /** 224 * Add a global parameter to the force. 225 * 226 * @param name The name of the parameter. 227 * @param defaultValue The default value of the parameter. 228 * @return The index of the parameter that was added. 229 */ 230 public int addGlobalParameter(String name, double defaultValue) { 231 return OpenMM_CustomHbondForce_addGlobalParameter(pointer, name, defaultValue); 232 } 233 234 /** 235 * Add a global parameter to the force. 236 * 237 * @param name The name of the parameter. 238 * @param defaultValue The default value of the parameter. 239 * @return The index of the parameter that was added. 240 */ 241 public int addGlobalParameter(Pointer name, double defaultValue) { 242 return OpenMM_CustomHbondForce_addGlobalParameter(pointer, name, defaultValue); 243 } 244 245 /** 246 * Add a per-acceptor parameter to the force. 247 * 248 * @param name The name of the parameter. 249 * @return The index of the parameter that was added. 250 */ 251 public int addPerAcceptorParameter(String name) { 252 return OpenMM_CustomHbondForce_addPerAcceptorParameter(pointer, name); 253 } 254 255 /** 256 * Add a per-acceptor parameter to the force. 257 * 258 * @param name The name of the parameter. 259 * @return The index of the parameter that was added. 260 */ 261 public int addPerAcceptorParameter(Pointer name) { 262 return OpenMM_CustomHbondForce_addPerAcceptorParameter(pointer, name); 263 } 264 265 /** 266 * Add a per-donor parameter to the force. 267 * 268 * @param name The name of the parameter. 269 * @return The index of the parameter that was added. 270 */ 271 public int addPerDonorParameter(String name) { 272 return OpenMM_CustomHbondForce_addPerDonorParameter(pointer, name); 273 } 274 275 /** 276 * Add a per-donor parameter to the force. 277 * 278 * @param name The name of the parameter. 279 * @return The index of the parameter that was added. 280 */ 281 public int addPerDonorParameter(Pointer name) { 282 return OpenMM_CustomHbondForce_addPerDonorParameter(pointer, name); 283 } 284 285 /** 286 * Add a tabulated function that may appear in the energy expression. 287 * 288 * @param name The name of the function as it appears in expressions. 289 * @param function A TabulatedFunction object defining the function. 290 * @return The index of the function that was added. 291 */ 292 public int addTabulatedFunction(String name, PointerByReference function) { 293 return OpenMM_CustomHbondForce_addTabulatedFunction(pointer, name, function); 294 } 295 296 /** 297 * Add a tabulated function that may appear in the energy expression. 298 * 299 * @param name The name of the function as it appears in expressions. 300 * @param function A TabulatedFunction object defining the function. 301 * @return The index of the function that was added. 302 */ 303 public int addTabulatedFunction(Pointer name, PointerByReference function) { 304 return OpenMM_CustomHbondForce_addTabulatedFunction(pointer, name, function); 305 } 306 307 /** 308 * Destroy the force. 309 */ 310 @Override 311 public void destroy() { 312 if (pointer != null) { 313 OpenMM_CustomHbondForce_destroy(pointer); 314 pointer = null; 315 } 316 } 317 318 /** 319 * Get the parameters for an acceptor. 320 * 321 * @param index The index of the acceptor. 322 * @param a1 The index of the first atom that defines the acceptor (output). 323 * @param a2 The index of the second atom that defines the acceptor (output). 324 * @param a3 The index of the third atom that defines the acceptor (output). 325 * @param parameters The parameters for the acceptor (output). 326 */ 327 public void getAcceptorParameters(int index, IntByReference a1, IntByReference a2, IntByReference a3, PointerByReference parameters) { 328 OpenMM_CustomHbondForce_getAcceptorParameters(pointer, index, a1, a2, a3, parameters); 329 } 330 331 /** 332 * Get the parameters for an acceptor. 333 * 334 * @param index The index of the acceptor. 335 * @param a1 The index of the first atom that defines the acceptor (output). 336 * @param a2 The index of the second atom that defines the acceptor (output). 337 * @param a3 The index of the third atom that defines the acceptor (output). 338 * @param parameters The parameters for the acceptor (output). 339 */ 340 public void getAcceptorParameters(int index, IntBuffer a1, IntBuffer a2, IntBuffer a3, PointerByReference parameters) { 341 OpenMM_CustomHbondForce_getAcceptorParameters(pointer, index, a1, a2, a3, parameters); 342 } 343 344 /** 345 * Get the cutoff distance. 346 * 347 * @return The cutoff distance, measured in nm. 348 */ 349 public double getCutoffDistance() { 350 return OpenMM_CustomHbondForce_getCutoffDistance(pointer); 351 } 352 353 /** 354 * Get the parameters for a donor. 355 * 356 * @param index The index of the donor. 357 * @param d1 The index of the first atom that defines the donor (output). 358 * @param d2 The index of the second atom that defines the donor (output). 359 * @param d3 The index of the third atom that defines the donor (output). 360 * @param parameters The parameters for the donor (output). 361 */ 362 public void getDonorParameters(int index, IntByReference d1, IntByReference d2, IntByReference d3, PointerByReference parameters) { 363 OpenMM_CustomHbondForce_getDonorParameters(pointer, index, d1, d2, d3, parameters); 364 } 365 366 /** 367 * Get the parameters for a donor. 368 * 369 * @param index The index of the donor. 370 * @param d1 The index of the first atom that defines the donor (output). 371 * @param d2 The index of the second atom that defines the donor (output). 372 * @param d3 The index of the third atom that defines the donor (output). 373 * @param parameters The parameters for the donor (output). 374 */ 375 public void getDonorParameters(int index, IntBuffer d1, IntBuffer d2, IntBuffer d3, PointerByReference parameters) { 376 OpenMM_CustomHbondForce_getDonorParameters(pointer, index, d1, d2, d3, parameters); 377 } 378 379 /** 380 * Get the energy expression for the force. 381 * 382 * @return The energy expression for the force. 383 */ 384 public String getEnergyFunction() { 385 Pointer p = OpenMM_CustomHbondForce_getEnergyFunction(pointer); 386 if (p == null) { 387 return null; 388 } 389 return p.getString(0); 390 } 391 392 /** 393 * Get the particles in an exclusion. 394 * 395 * @param index The index of the exclusion. 396 * @param donor The index of the donor (output). 397 * @param acceptor The index of the acceptor (output). 398 */ 399 public void getExclusionParticles(int index, IntByReference donor, IntByReference acceptor) { 400 OpenMM_CustomHbondForce_getExclusionParticles(pointer, index, donor, acceptor); 401 } 402 403 /** 404 * Get the particles in an exclusion. 405 * 406 * @param index The index of the exclusion. 407 * @param donor The index of the donor (output). 408 * @param acceptor The index of the acceptor (output). 409 */ 410 public void getExclusionParticles(int index, IntBuffer donor, IntBuffer acceptor) { 411 OpenMM_CustomHbondForce_getExclusionParticles(pointer, index, donor, acceptor); 412 } 413 414 /** 415 * Get the parameters for a tabulated function. 416 * 417 * @param index The index of the function. 418 * @param name The name of the function as it appears in expressions (output). 419 * @param function A TabulatedFunction object defining the function (output). 420 * @param min The minimum value of the independent variable for which the function is defined (output). 421 * @param max The maximum value of the independent variable for which the function is defined (output). 422 */ 423 public void getFunctionParameters(int index, PointerByReference name, PointerByReference function, DoubleByReference min, DoubleByReference max) { 424 OpenMM_CustomHbondForce_getFunctionParameters(pointer, index, name, function, min, max); 425 } 426 427 /** 428 * Get the parameters for a tabulated function. 429 * 430 * @param index The index of the function. 431 * @param name The name of the function as it appears in expressions (output). 432 * @param function A TabulatedFunction object defining the function (output). 433 * @param min The minimum value of the independent variable for which the function is defined (output). 434 * @param max The maximum value of the independent variable for which the function is defined (output). 435 */ 436 public void getFunctionParameters(int index, PointerByReference name, PointerByReference function, DoubleBuffer min, DoubleBuffer max) { 437 OpenMM_CustomHbondForce_getFunctionParameters(pointer, index, name, function, min, max); 438 } 439 440 /** 441 * Get the default value of a global parameter. 442 * 443 * @param index The index of the parameter. 444 * @return The default value of the parameter. 445 */ 446 public double getGlobalParameterDefaultValue(int index) { 447 return OpenMM_CustomHbondForce_getGlobalParameterDefaultValue(pointer, index); 448 } 449 450 /** 451 * Get the name of a global parameter. 452 * 453 * @param index The index of the parameter. 454 * @return The name of the parameter. 455 */ 456 public String getGlobalParameterName(int index) { 457 Pointer p = OpenMM_CustomHbondForce_getGlobalParameterName(pointer, index); 458 if (p == null) { 459 return null; 460 } 461 return p.getString(0); 462 } 463 464 /** 465 * Get the nonbonded method. 466 * 467 * @return The nonbonded method. 468 */ 469 public int getNonbondedMethod() { 470 return OpenMM_CustomHbondForce_getNonbondedMethod(pointer); 471 } 472 473 /** 474 * Get the number of acceptors. 475 * 476 * @return The number of acceptors. 477 */ 478 public int getNumAcceptors() { 479 return OpenMM_CustomHbondForce_getNumAcceptors(pointer); 480 } 481 482 /** 483 * Get the number of donors. 484 * 485 * @return The number of donors. 486 */ 487 public int getNumDonors() { 488 return OpenMM_CustomHbondForce_getNumDonors(pointer); 489 } 490 491 /** 492 * Get the number of exclusions. 493 * 494 * @return The number of exclusions. 495 */ 496 public int getNumExclusions() { 497 return OpenMM_CustomHbondForce_getNumExclusions(pointer); 498 } 499 500 /** 501 * Get the number of tabulated functions. 502 * 503 * @return The number of tabulated functions. 504 * @deprecated This method exists only for backward compatibility. Use getNumTabulatedFunctions() instead. 505 */ 506 @Deprecated 507 public int getNumFunctions() { 508 return OpenMM_CustomHbondForce_getNumFunctions(pointer); 509 } 510 511 /** 512 * Get the number of global parameters. 513 * 514 * @return The number of global parameters. 515 */ 516 public int getNumGlobalParameters() { 517 return OpenMM_CustomHbondForce_getNumGlobalParameters(pointer); 518 } 519 520 /** 521 * Get the number of per-acceptor parameters. 522 * 523 * @return The number of per-acceptor parameters. 524 */ 525 public int getNumPerAcceptorParameters() { 526 return OpenMM_CustomHbondForce_getNumPerAcceptorParameters(pointer); 527 } 528 529 /** 530 * Get the number of per-donor parameters. 531 * 532 * @return The number of per-donor parameters. 533 */ 534 public int getNumPerDonorParameters() { 535 return OpenMM_CustomHbondForce_getNumPerDonorParameters(pointer); 536 } 537 538 /** 539 * Get the number of tabulated functions. 540 * 541 * @return The number of tabulated functions. 542 */ 543 public int getNumTabulatedFunctions() { 544 return OpenMM_CustomHbondForce_getNumTabulatedFunctions(pointer); 545 } 546 547 /** 548 * Get the name of a per-acceptor parameter. 549 * 550 * @param index The index of the parameter. 551 * @return The name of the parameter. 552 */ 553 public String getPerAcceptorParameterName(int index) { 554 Pointer p = OpenMM_CustomHbondForce_getPerAcceptorParameterName(pointer, index); 555 if (p == null) { 556 return null; 557 } 558 return p.getString(0); 559 } 560 561 /** 562 * Get the name of a per-donor parameter. 563 * 564 * @param index The index of the parameter. 565 * @return The name of the parameter. 566 */ 567 public String getPerDonorParameterName(int index) { 568 Pointer p = OpenMM_CustomHbondForce_getPerDonorParameterName(pointer, index); 569 if (p == null) { 570 return null; 571 } 572 return p.getString(0); 573 } 574 575 /** 576 * Get a reference to a tabulated function that may appear in the energy expression. 577 * 578 * @param index The index of the function. 579 * @return The TabulatedFunction object defining the function. 580 */ 581 public PointerByReference getTabulatedFunction(int index) { 582 return OpenMM_CustomHbondForce_getTabulatedFunction(pointer, index); 583 } 584 585 /** 586 * Get the name of a tabulated function that may appear in the energy expression. 587 * 588 * @param index The index of the function. 589 * @return The name of the function as it appears in expressions. 590 */ 591 public String getTabulatedFunctionName(int index) { 592 Pointer p = OpenMM_CustomHbondForce_getTabulatedFunctionName(pointer, index); 593 if (p == null) { 594 return null; 595 } 596 return p.getString(0); 597 } 598 599 /** 600 * Set the parameters for an acceptor. 601 * 602 * @param index The index of the acceptor. 603 * @param a1 The index of the first atom that defines the acceptor. 604 * @param a2 The index of the second atom that defines the acceptor. 605 * @param a3 The index of the third atom that defines the acceptor. 606 * @param parameters The parameters for the acceptor. 607 */ 608 public void setAcceptorParameters(int index, int a1, int a2, int a3, PointerByReference parameters) { 609 OpenMM_CustomHbondForce_setAcceptorParameters(pointer, index, a1, a2, a3, parameters); 610 } 611 612 /** 613 * Set the cutoff distance. 614 * 615 * @param distance The cutoff distance, measured in nm. 616 */ 617 public void setCutoffDistance(double distance) { 618 OpenMM_CustomHbondForce_setCutoffDistance(pointer, distance); 619 } 620 621 /** 622 * Set the parameters for a donor. 623 * 624 * @param index The index of the donor. 625 * @param d1 The index of the first atom that defines the donor. 626 * @param d2 The index of the second atom that defines the donor. 627 * @param d3 The index of the third atom that defines the donor. 628 * @param parameters The parameters for the donor. 629 */ 630 public void setDonorParameters(int index, int d1, int d2, int d3, PointerByReference parameters) { 631 OpenMM_CustomHbondForce_setDonorParameters(pointer, index, d1, d2, d3, parameters); 632 } 633 634 /** 635 * Set the energy expression for the force. 636 * 637 * @param energy The energy expression for the force. 638 */ 639 public void setEnergyFunction(String energy) { 640 OpenMM_CustomHbondForce_setEnergyFunction(pointer, energy); 641 } 642 643 /** 644 * Set the energy expression for the force. 645 * 646 * @param energy The energy expression for the force. 647 */ 648 public void setEnergyFunction(Pointer energy) { 649 OpenMM_CustomHbondForce_setEnergyFunction(pointer, energy); 650 } 651 652 /** 653 * Set the particles in an exclusion. 654 * 655 * @param index The index of the exclusion. 656 * @param donor The index of the donor. 657 * @param acceptor The index of the acceptor. 658 */ 659 public void setExclusionParticles(int index, int donor, int acceptor) { 660 OpenMM_CustomHbondForce_setExclusionParticles(pointer, index, donor, acceptor); 661 } 662 663 /** 664 * Set the parameters for a tabulated function. 665 * 666 * @param index The index of the function. 667 * @param name The name of the function as it appears in expressions. 668 * @param function A TabulatedFunction object defining the function. 669 * @param min The minimum value of the independent variable for which the function is defined. 670 * @param max The maximum value of the independent variable for which the function is defined. 671 */ 672 public void setFunctionParameters(int index, String name, PointerByReference function, double min, double max) { 673 OpenMM_CustomHbondForce_setFunctionParameters(pointer, index, name, function, min, max); 674 } 675 676 /** 677 * Set the parameters for a tabulated function. 678 * 679 * @param index The index of the function. 680 * @param name The name of the function as it appears in expressions. 681 * @param function A TabulatedFunction object defining the function. 682 * @param min The minimum value of the independent variable for which the function is defined. 683 * @param max The maximum value of the independent variable for which the function is defined. 684 */ 685 public void setFunctionParameters(int index, Pointer name, PointerByReference function, double min, double max) { 686 OpenMM_CustomHbondForce_setFunctionParameters(pointer, index, name, function, min, max); 687 } 688 689 /** 690 * Set the default value of a global parameter. 691 * 692 * @param index The index of the parameter. 693 * @param defaultValue The default value of the parameter. 694 */ 695 public void setGlobalParameterDefaultValue(int index, double defaultValue) { 696 OpenMM_CustomHbondForce_setGlobalParameterDefaultValue(pointer, index, defaultValue); 697 } 698 699 /** 700 * Set the name of a global parameter. 701 * 702 * @param index The index of the parameter. 703 * @param name The name of the parameter. 704 */ 705 public void setGlobalParameterName(int index, String name) { 706 OpenMM_CustomHbondForce_setGlobalParameterName(pointer, index, name); 707 } 708 709 /** 710 * Set the name of a global parameter. 711 * 712 * @param index The index of the parameter. 713 * @param name The name of the parameter. 714 */ 715 public void setGlobalParameterName(int index, Pointer name) { 716 OpenMM_CustomHbondForce_setGlobalParameterName(pointer, index, name); 717 } 718 719 /** 720 * Set the nonbonded method. 721 * 722 * @param method The nonbonded method. 723 */ 724 public void setNonbondedMethod(int method) { 725 OpenMM_CustomHbondForce_setNonbondedMethod(pointer, method); 726 } 727 728 /** 729 * Set the name of a per-acceptor parameter. 730 * 731 * @param index The index of the parameter. 732 * @param name The name of the parameter. 733 */ 734 public void setPerAcceptorParameterName(int index, String name) { 735 OpenMM_CustomHbondForce_setPerAcceptorParameterName(pointer, index, name); 736 } 737 738 /** 739 * Set the name of a per-acceptor parameter. 740 * 741 * @param index The index of the parameter. 742 * @param name The name of the parameter. 743 */ 744 public void setPerAcceptorParameterName(int index, Pointer name) { 745 OpenMM_CustomHbondForce_setPerAcceptorParameterName(pointer, index, name); 746 } 747 748 /** 749 * Set the name of a per-donor parameter. 750 * 751 * @param index The index of the parameter. 752 * @param name The name of the parameter. 753 */ 754 public void setPerDonorParameterName(int index, String name) { 755 OpenMM_CustomHbondForce_setPerDonorParameterName(pointer, index, name); 756 } 757 758 /** 759 * Set the name of a per-donor parameter. 760 * 761 * @param index The index of the parameter. 762 * @param name The name of the parameter. 763 */ 764 public void setPerDonorParameterName(int index, Pointer name) { 765 OpenMM_CustomHbondForce_setPerDonorParameterName(pointer, index, name); 766 } 767 768 /** 769 * Update the parameters in a Context to match those stored in this Force object. 770 * 771 * @param context The Context in which to update the parameters. 772 */ 773 public void updateParametersInContext(Context context) { 774 if (context.hasContextPointer()) { 775 OpenMM_CustomHbondForce_updateParametersInContext(pointer, context.getPointer()); 776 } 777 } 778 779 /** 780 * Check if the force uses periodic boundary conditions. 781 * 782 * @return True if the force uses periodic boundary conditions. 783 */ 784 @Override 785 public boolean usesPeriodicBoundaryConditions() { 786 int pbc = OpenMM_CustomHbondForce_usesPeriodicBoundaryConditions(pointer); 787 return pbc == OpenMM_True; 788 } 789 }