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.Force;
41 import ffx.openmm.PeriodicTorsionForce;
42 import ffx.potential.bonded.Torsion;
43 import ffx.potential.parameters.TorsionType;
44
45 import java.util.List;
46 import java.util.logging.Level;
47 import java.util.logging.Logger;
48
49 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_KJPerKcal;
50 import static edu.uiowa.jopenmm.OpenMMAmoebaLibrary.OpenMM_RadiansPerDegree;
51 import static java.lang.String.format;
52
53
54
55
56 public class RestrainTorsionsForce extends PeriodicTorsionForce {
57
58 private static final Logger logger = Logger.getLogger(RestrainTorsionsForce.class.getName());
59
60
61
62
63
64
65 public RestrainTorsionsForce(OpenMMEnergy openMMEnergy) {
66 Torsion[] restrainTorsions = openMMEnergy.getRestrainTorsions();
67 if (restrainTorsions == null || restrainTorsions.length == 0) {
68 return;
69 }
70
71 for (Torsion restrainTorsion : restrainTorsions) {
72 int a1 = restrainTorsion.getAtom(0).getXyzIndex() - 1;
73 int a2 = restrainTorsion.getAtom(1).getXyzIndex() - 1;
74 int a3 = restrainTorsion.getAtom(2).getXyzIndex() - 1;
75 int a4 = restrainTorsion.getAtom(3).getXyzIndex() - 1;
76 TorsionType torsionType = restrainTorsion.torsionType;
77 int nTerms = torsionType.phase.length;
78 for (int j = 0; j < nTerms; j++) {
79 addTorsion(a1, a2, a3, a4, j + 1,
80 torsionType.phase[j] * OpenMM_RadiansPerDegree,
81 OpenMM_KJPerKcal * torsionType.torsionUnit * torsionType.amplitude[j]);
82 }
83 }
84
85 int forceGroup = openMMEnergy.getMolecularAssembly().getForceField().getInteger("RESTRAIN_TORSION_FORCE_GROUP", 0);
86 setForceGroup(forceGroup);
87 logger.log(Level.INFO, format(" Restrain-Torsions \t%6d\t\t%1d", restrainTorsions.length, forceGroup));
88 }
89
90
91
92
93
94
95
96 public static Force constructForce(OpenMMEnergy openMMEnergy) {
97 Torsion[] torsions = openMMEnergy.getRestrainTorsions();
98 if (torsions == null || torsions.length < 1) {
99 return null;
100 }
101 return new RestrainTorsionsForce(openMMEnergy);
102 }
103
104
105
106
107
108
109 public void updateForce(OpenMMEnergy openMMEnergy) {
110
111 Torsion[] restrainTorsions = openMMEnergy.getRestrainTorsions();
112 if (restrainTorsions == null || restrainTorsions.length == 0) {
113 return;
114 }
115
116 int index = 0;
117 for (Torsion restrainTorsion : restrainTorsions) {
118 TorsionType torsionType = restrainTorsion.torsionType;
119 int nTerms = torsionType.phase.length;
120 int a1 = restrainTorsion.getAtom(0).getXyzIndex() - 1;
121 int a2 = restrainTorsion.getAtom(1).getXyzIndex() - 1;
122 int a3 = restrainTorsion.getAtom(2).getXyzIndex() - 1;
123 int a4 = restrainTorsion.getAtom(3).getXyzIndex() - 1;
124 for (int j = 0; j < nTerms; j++) {
125 double forceConstant = OpenMM_KJPerKcal * torsionType.torsionUnit * torsionType.amplitude[j];
126 setTorsionParameters(index++, a1, a2, a3, a4, j + 1,
127 torsionType.phase[j] * OpenMM_RadiansPerDegree, forceConstant);
128 }
129 }
130 updateParametersInContext(openMMEnergy.getContext());
131 }
132
133 }