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.xray.commands;
39
40 import ffx.algorithms.cli.AlgorithmsCommand;
41 import ffx.algorithms.cli.DynamicsOptions;
42 import ffx.algorithms.dynamics.MolecularDynamics;
43 import ffx.numerics.Potential;
44 import ffx.potential.MolecularAssembly;
45 import ffx.potential.cli.WriteoutOptions;
46 import ffx.utilities.FFXBinding;
47 import ffx.xray.DiffractionData;
48 import ffx.xray.RefinementEnergy;
49 import ffx.xray.cli.XrayOptions;
50 import org.apache.commons.configuration2.CompositeConfiguration;
51 import org.apache.commons.io.FilenameUtils;
52 import picocli.CommandLine.Command;
53 import picocli.CommandLine.Mixin;
54 import picocli.CommandLine.Parameters;
55
56 import java.io.File;
57 import java.util.Collections;
58 import java.util.List;
59
60
61
62
63
64
65
66
67 @Command(description = " Run Dynamics on an X-ray target.", name = "xray.Dynamics")
68 public class Dynamics extends AlgorithmsCommand {
69
70 @Mixin
71 private XrayOptions xrayOptions;
72
73 @Mixin
74 private DynamicsOptions dynamicsOptions;
75
76 @Mixin
77 private WriteoutOptions writeoutOptions;
78
79
80
81
82 @Parameters(arity = "1..*", paramLabel = "files", description = "PDB and Diffraction input files.")
83 private List<String> filenames;
84 private RefinementEnergy refinementEnergy;
85
86
87
88
89 public Dynamics() {
90 super();
91 }
92
93
94
95
96
97 public Dynamics(String[] args) {
98 super(args);
99 }
100
101
102
103
104
105 public Dynamics(FFXBinding binding) {
106 super(binding);
107 }
108
109 @Override
110 public Dynamics run() {
111
112 if (!init()) {
113 return this;
114 }
115
116 dynamicsOptions.init();
117 xrayOptions.init();
118
119 String filename;
120 MolecularAssembly[] molecularAssemblies;
121 if (filenames != null && !filenames.isEmpty()) {
122 molecularAssemblies = algorithmFunctions.openAll(filenames.get(0));
123 activeAssembly = molecularAssemblies[0];
124 filename = filenames.get(0);
125 } else if (activeAssembly == null) {
126 logger.info(helpString());
127 return this;
128 } else {
129 molecularAssemblies = new MolecularAssembly[]{activeAssembly};
130 filename = activeAssembly.getFile().getAbsolutePath();
131 }
132
133 logger.info("\n Running xray.Dynamics on " + filename);
134
135
136 CompositeConfiguration properties = molecularAssemblies[0].getProperties();
137 xrayOptions.setProperties(parseResult, properties);
138
139
140 DiffractionData diffractionData = xrayOptions.getDiffractionData(filenames, molecularAssemblies, properties);
141 refinementEnergy = xrayOptions.toXrayEnergy(diffractionData);
142 algorithmFunctions.energy(molecularAssemblies);
143
144
145 File dyn = new File(FilenameUtils.removeExtension(filename) + ".dyn");
146 if (!dyn.exists()) {
147 dyn = null;
148 }
149
150 MolecularDynamics molecularDynamics =
151 dynamicsOptions.getDynamics(writeoutOptions, refinementEnergy, activeAssembly, algorithmListener);
152 refinementEnergy.setThermostat(molecularDynamics.getThermostat());
153 boolean initVelocities = true;
154 molecularDynamics.dynamic(dynamicsOptions.getSteps(), dynamicsOptions.getDt(), dynamicsOptions.getReport(),
155 dynamicsOptions.getWrite(), dynamicsOptions.getTemperature(), initVelocities, dyn);
156
157
158 diffractionData.scaleBulkFit();
159 diffractionData.printStats();
160
161
162 algorithmFunctions.energy(molecularAssemblies);
163
164 logger.info(" ");
165 diffractionData.writeModel(FilenameUtils.removeExtension(filename) + ".pdb");
166 diffractionData.writeData(FilenameUtils.removeExtension(filename) + ".mtz");
167
168 return this;
169 }
170
171 @Override
172 public List<Potential> getPotentials() {
173 return refinementEnergy == null ? Collections.emptyList() :
174 Collections.singletonList((Potential) refinementEnergy);
175 }
176 }