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