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.log(Level.INFO, format(" Pi-Orbital Torsions \t%6d\t\t%1d", piOrbitalTorsions.length, forceGroup));
103 }
104
105
106
107
108
109
110
111 public static Force constructForce(OpenMMEnergy openMMEnergy) {
112 PiOrbitalTorsion[] piOrbitalTorsions = openMMEnergy.getPiOrbitalTorsions();
113 if (piOrbitalTorsions == null || piOrbitalTorsions.length < 1) {
114 return null;
115 }
116 return new PiOrbitalTorsionForce(openMMEnergy);
117 }
118
119
120
121
122
123
124 public void updateForce(OpenMMEnergy openMMEnergy) {
125 PiOrbitalTorsion[] piOrbitalTorsions = openMMEnergy.getPiOrbitalTorsions();
126 if (piOrbitalTorsions == null || piOrbitalTorsions.length < 1) {
127 return;
128 }
129
130 IntArray particles = new IntArray(0);
131 DoubleArray parameters = new DoubleArray(0);
132 int index = 0;
133 for (PiOrbitalTorsion piOrbitalTorsion : piOrbitalTorsions) {
134 int a1 = piOrbitalTorsion.getAtom(0).getXyzIndex() - 1;
135 int a2 = piOrbitalTorsion.getAtom(1).getXyzIndex() - 1;
136 int a3 = piOrbitalTorsion.getAtom(2).getXyzIndex() - 1;
137 int a4 = piOrbitalTorsion.getAtom(3).getXyzIndex() - 1;
138 int a5 = piOrbitalTorsion.getAtom(4).getXyzIndex() - 1;
139 int a6 = piOrbitalTorsion.getAtom(5).getXyzIndex() - 1;
140 PiOrbitalTorsionType type = piOrbitalTorsion.piOrbitalTorsionType;
141 double k = OpenMM_KJPerKcal * type.forceConstant * piOrbitalTorsion.piOrbitalTorsionType.piTorsUnit;
142 particles.append(a1);
143 particles.append(a2);
144 particles.append(a3);
145 particles.append(a4);
146 particles.append(a5);
147 particles.append(a6);
148 parameters.append(k);
149 setBondParameters(index++, particles, parameters);
150 particles.resize(0);
151 parameters.resize(0);
152 }
153 particles.destroy();
154 parameters.destroy();
155 updateParametersInContext(openMMEnergy.getContext());
156 }
157 }