1
2
3
4
5
6
7
8
9
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
35
36
37
38 package ffx.potential.openmm;
39
40 import ffx.openmm.DoubleArray;
41 import ffx.openmm.Force;
42 import ffx.openmm.IntArray;
43 import ffx.openmm.CustomCompoundBondForce;
44 import ffx.potential.bonded.OutOfPlaneBend;
45 import ffx.potential.parameters.OutOfPlaneBendType;
46
47 import java.util.logging.Level;
48 import java.util.logging.Logger;
49
50 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_KJPerKcal;
51 import static java.lang.String.format;
52
53
54
55
56 public class OutOfPlaneBendForce extends CustomCompoundBondForce {
57
58 private static final Logger logger = Logger.getLogger(OutOfPlaneBendForce.class.getName());
59
60
61
62
63
64
65 public OutOfPlaneBendForce(OpenMMEnergy openMMEnergy) {
66 super(4, openMMEnergy.getOutOfPlaneEnergyString());
67 OutOfPlaneBend[] outOfPlaneBends = openMMEnergy.getOutOfPlaneBends();
68 if (outOfPlaneBends == null || outOfPlaneBends.length < 1) {
69 return;
70 }
71
72 addPerBondParameter("k");
73 setName("OutOfPlaneBend");
74
75 IntArray particles = new IntArray(0);
76 DoubleArray parameters = new DoubleArray(0);
77 for (OutOfPlaneBend outOfPlaneBend : outOfPlaneBends) {
78 OutOfPlaneBendType outOfPlaneBendType = outOfPlaneBend.outOfPlaneBendType;
79 int i1 = outOfPlaneBend.getAtom(0).getXyzIndex() - 1;
80 int i2 = outOfPlaneBend.getAtom(1).getXyzIndex() - 1;
81 int i3 = outOfPlaneBend.getAtom(2).getXyzIndex() - 1;
82 int i4 = outOfPlaneBend.getAtom(3).getXyzIndex() - 1;
83 double k = OpenMM_KJPerKcal * outOfPlaneBendType.forceConstant * outOfPlaneBendType.opBendUnit;
84 particles.append(i1);
85 particles.append(i2);
86 particles.append(i3);
87 particles.append(i4);
88 parameters.append(k);
89 addBond(particles, parameters);
90 particles.resize(0);
91 parameters.resize(0);
92 }
93 particles.destroy();
94 parameters.destroy();
95 int forceGroup = openMMEnergy.getMolecularAssembly().getForceField().getInteger("OUT_OF_PLANE_BEND_FORCE_GROUP", 0);
96 setForceGroup(forceGroup);
97 logger.log(Level.INFO, format(" Out-of-Plane Bends \t%6d\t\t%1d", outOfPlaneBends.length, forceGroup));
98 }
99
100
101
102
103
104
105
106 public static Force constructForce(OpenMMEnergy openMMEnergy) {
107 OutOfPlaneBend[] outOfPlaneBends = openMMEnergy.getOutOfPlaneBends();
108 if (outOfPlaneBends == null || outOfPlaneBends.length < 1) {
109 return null;
110 }
111 return new OutOfPlaneBendForce(openMMEnergy);
112 }
113
114
115
116
117
118
119 public void updateForce(OpenMMEnergy openMMEnergy) {
120 OutOfPlaneBend[] outOfPlaneBends = openMMEnergy.getOutOfPlaneBends();
121 if (outOfPlaneBends == null || outOfPlaneBends.length < 1) {
122 return;
123 }
124
125 IntArray particles = new IntArray(0);
126 DoubleArray parameters = new DoubleArray(0);
127 int index = 0;
128 for (OutOfPlaneBend outOfPlaneBend : outOfPlaneBends) {
129 OutOfPlaneBendType outOfPlaneBendType = outOfPlaneBend.outOfPlaneBendType;
130 int i1 = outOfPlaneBend.getAtom(0).getXyzIndex() - 1;
131 int i2 = outOfPlaneBend.getAtom(1).getXyzIndex() - 1;
132 int i3 = outOfPlaneBend.getAtom(2).getXyzIndex() - 1;
133 int i4 = outOfPlaneBend.getAtom(3).getXyzIndex() - 1;
134 double k = OpenMM_KJPerKcal * outOfPlaneBendType.forceConstant * outOfPlaneBendType.opBendUnit;
135 particles.append(i1);
136 particles.append(i2);
137 particles.append(i3);
138 particles.append(i4);
139 parameters.append(k);
140 setBondParameters(index++, particles, parameters);
141 particles.resize(0);
142 parameters.resize(0);
143 }
144 particles.destroy();
145 parameters.destroy();
146
147 updateParametersInContext(openMMEnergy.getContext());
148 }
149 }