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.AnnealOptions;
42 import ffx.algorithms.cli.DynamicsOptions;
43 import ffx.algorithms.optimize.anneal.SimulatedAnnealing;
44 import ffx.numerics.Potential;
45 import ffx.potential.MolecularAssembly;
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 = " Simulated annealing on an X-ray target.", name = "xray.Anneal")
68 public class Anneal extends AlgorithmsCommand {
69
70 @Mixin
71 private XrayOptions xrayOptions;
72
73 @Mixin
74 private DynamicsOptions dynamicsOptions;
75
76 @Mixin
77 private AnnealOptions annealOptions;
78
79
80
81
82 @Parameters(arity = "1..*", paramLabel = "files", description = "PDB and Diffraction input files.")
83 private List<String> filenames;
84
85 private SimulatedAnnealing simulatedAnnealing = null;
86 private RefinementEnergy refinementEnergy;
87
88
89
90
91 public Anneal() {
92 super();
93 }
94
95
96
97
98
99 public Anneal(String[] args) {
100 super(args);
101 }
102
103
104
105
106
107 public Anneal(FFXBinding binding) {
108 super(binding);
109 }
110
111 @Override
112 public Anneal run() {
113
114 if (!init()) {
115 return this;
116 }
117
118 dynamicsOptions.init();
119 xrayOptions.init();
120
121 String filename;
122 MolecularAssembly[] molecularAssemblies;
123 if (filenames != null && !filenames.isEmpty()) {
124 molecularAssemblies = algorithmFunctions.openAll(filenames.get(0));
125 activeAssembly = molecularAssemblies[0];
126 } else if (activeAssembly == null) {
127 logger.info(helpString());
128 return this;
129 } else {
130 molecularAssemblies = new MolecularAssembly[]{activeAssembly};
131 }
132
133 filename = activeAssembly.getFile().getAbsolutePath();
134
135 logger.info("\n Running simulated annealing on X-ray target including " + filename + "\n");
136
137
138 File dyn = new File(FilenameUtils.removeExtension(filename) + ".dyn");
139 if (!dyn.exists()) {
140 dyn = null;
141 }
142
143 CompositeConfiguration properties = activeAssembly.getProperties();
144 xrayOptions.setProperties(parseResult, properties);
145 DiffractionData diffractionData = xrayOptions.getDiffractionData(filenames, molecularAssemblies, properties);
146 refinementEnergy = xrayOptions.toXrayEnergy(diffractionData);
147
148
149 algorithmFunctions.energy(molecularAssemblies);
150
151 simulatedAnnealing = annealOptions.createAnnealer(dynamicsOptions, activeAssembly, refinementEnergy, algorithmListener, dyn);
152 simulatedAnnealing.setPrintInterval(dynamicsOptions.getReport());
153 simulatedAnnealing.setSaveFrequency(dynamicsOptions.getWrite());
154 simulatedAnnealing.setRestartFrequency(dynamicsOptions.getCheckpoint());
155 simulatedAnnealing.setTrajectorySteps(dynamicsOptions.getTrajSteps());
156
157
158 simulatedAnnealing.anneal();
159
160
161 diffractionData.scaleBulkFit();
162 diffractionData.printStats();
163
164
165 algorithmFunctions.energy(molecularAssemblies);
166
167 logger.info(" ");
168 diffractionData.writeModel(FilenameUtils.removeExtension(filename) + ".pdb");
169 diffractionData.writeData(FilenameUtils.removeExtension(filename) + ".mtz");
170
171 return this;
172 }
173
174 @Override
175 public List<Potential> getPotentials() {
176 return refinementEnergy == null ? Collections.emptyList() :
177 Collections.singletonList((Potential) refinementEnergy);
178 }
179 }