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.PiOrbitalTorsion;
45 import ffx.potential.parameters.PiOrbitalTorsionType;
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 PiOrbitalTorsionForce extends CustomCompoundBondForce {
57
58 private static final Logger logger = Logger.getLogger(PiOrbitalTorsionForce.class.getName());
59
60
61
62
63
64
65 public PiOrbitalTorsionForce(OpenMMEnergy openMMEnergy) {
66 super(6, openMMEnergy.getPiOrbitalTorsionEnergyString());
67 PiOrbitalTorsion[] piOrbitalTorsions = openMMEnergy.getPiOrbitalTorsions();
68 if (piOrbitalTorsions == null || piOrbitalTorsions.length < 1) {
69 return;
70 }
71
72 addPerBondParameter("k");
73 setName("PiOrbitalTorsion");
74
75 IntArray particles = new IntArray(0);
76 DoubleArray parameters = new DoubleArray(0);
77 for (PiOrbitalTorsion piOrbitalTorsion : piOrbitalTorsions) {
78 int a1 = piOrbitalTorsion.getAtom(0).getXyzIndex() - 1;
79 int a2 = piOrbitalTorsion.getAtom(1).getXyzIndex() - 1;
80 int a3 = piOrbitalTorsion.getAtom(2).getXyzIndex() - 1;
81 int a4 = piOrbitalTorsion.getAtom(3).getXyzIndex() - 1;
82 int a5 = piOrbitalTorsion.getAtom(4).getXyzIndex() - 1;
83 int a6 = piOrbitalTorsion.getAtom(5).getXyzIndex() - 1;
84 PiOrbitalTorsionType type = piOrbitalTorsion.piOrbitalTorsionType;
85 double k = OpenMM_KJPerKcal * type.forceConstant * piOrbitalTorsion.piOrbitalTorsionType.piTorsUnit;
86 particles.append(a1);
87 particles.append(a2);
88 particles.append(a3);
89 particles.append(a4);
90 particles.append(a5);
91 particles.append(a6);
92 parameters.append(k);
93 addBond(particles, parameters);
94 particles.resize(0);
95 parameters.resize(0);
96 }
97 particles.destroy();
98 parameters.destroy();
99
100 int forceGroup = openMMEnergy.getMolecularAssembly().getForceField().getInteger("PI_ORBITAL_TORSION_FORCE_GROUP", 0);
101 setForceGroup(forceGroup);
102 logger.info(format(" Pi-Orbital Torsions: %10d", piOrbitalTorsions.length));
103 logger.fine(format(" Force Group: %10d", forceGroup));
104 }
105
106
107
108
109
110
111
112 public static Force constructForce(OpenMMEnergy openMMEnergy) {
113 PiOrbitalTorsion[] piOrbitalTorsions = openMMEnergy.getPiOrbitalTorsions();
114 if (piOrbitalTorsions == null || piOrbitalTorsions.length < 1) {
115 return null;
116 }
117 return new PiOrbitalTorsionForce(openMMEnergy);
118 }
119
120
121
122
123
124
125 public void updateForce(OpenMMEnergy openMMEnergy) {
126 PiOrbitalTorsion[] piOrbitalTorsions = openMMEnergy.getPiOrbitalTorsions();
127 if (piOrbitalTorsions == null || piOrbitalTorsions.length < 1) {
128 return;
129 }
130
131 IntArray particles = new IntArray(0);
132 DoubleArray parameters = new DoubleArray(0);
133 int index = 0;
134 for (PiOrbitalTorsion piOrbitalTorsion : piOrbitalTorsions) {
135 int a1 = piOrbitalTorsion.getAtom(0).getXyzIndex() - 1;
136 int a2 = piOrbitalTorsion.getAtom(1).getXyzIndex() - 1;
137 int a3 = piOrbitalTorsion.getAtom(2).getXyzIndex() - 1;
138 int a4 = piOrbitalTorsion.getAtom(3).getXyzIndex() - 1;
139 int a5 = piOrbitalTorsion.getAtom(4).getXyzIndex() - 1;
140 int a6 = piOrbitalTorsion.getAtom(5).getXyzIndex() - 1;
141 PiOrbitalTorsionType type = piOrbitalTorsion.piOrbitalTorsionType;
142 double k = OpenMM_KJPerKcal * type.forceConstant * piOrbitalTorsion.piOrbitalTorsionType.piTorsUnit;
143 particles.append(a1);
144 particles.append(a2);
145 particles.append(a3);
146 particles.append(a4);
147 particles.append(a5);
148 particles.append(a6);
149 parameters.append(k);
150 setBondParameters(index++, particles, parameters);
151 particles.resize(0);
152 parameters.resize(0);
153 }
154 particles.destroy();
155 parameters.destroy();
156 updateParametersInContext(openMMEnergy.getContext());
157 }
158 }