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.ui;
39
40 import static java.lang.String.format;
41
42 import ffx.potential.ForceFieldEnergy;
43 import ffx.potential.MolecularAssembly;
44 import ffx.potential.Utilities;
45 import ffx.potential.parsers.FileOpener;
46 import ffx.potential.parsers.PDBFilter;
47 import ffx.potential.parsers.SystemFilter;
48 import ffx.utilities.Resources;
49
50 import java.awt.Cursor;
51 import java.util.List;
52 import java.util.logging.Level;
53 import java.util.logging.Logger;
54
55 import org.apache.commons.configuration2.CompositeConfiguration;
56 import org.apache.commons.io.FilenameUtils;
57
58
59
60
61
62
63
64
65 public class UIFileOpener implements FileOpener {
66
67 private static final Logger logger = Logger.getLogger(UIFileOpener.class.getName());
68 private static final long KB = 1024;
69 SystemFilter systemFilter;
70 MainPanel mainPanel;
71 private boolean timer = true;
72 private boolean gc = true;
73 private long occupiedMemory;
74 private long time;
75 private int nThreads = -1;
76
77
78
79
80
81
82
83 UIFileOpener(SystemFilter systemFilter, MainPanel mainPanel) {
84 this.systemFilter = systemFilter;
85 this.mainPanel = mainPanel;
86 if (System.getProperty("ffx.timer", "false").equalsIgnoreCase("true")) {
87 timer = true;
88 if (System.getProperty("ffx.timer.gc", "false").equalsIgnoreCase("true")) {
89 gc = true;
90 }
91 }
92 }
93
94
95
96
97
98
99
100 @Override
101 public MolecularAssembly[] getAllAssemblies() throws NullPointerException {
102 MolecularAssembly[] assemblies = mainPanel.getHierarchy().getSystems();
103 if (assemblies == null) {
104 throw new NullPointerException(" FFX hierarchy has a null list of assemblies.");
105 } else if (assemblies.length == 0) {
106 throw new NullPointerException(" FFX hierarchy has an empty list of assemblies.");
107 } else {
108 return assemblies;
109 }
110 }
111
112
113
114
115
116
117 @Override
118 public CompositeConfiguration[] getAllProperties() {
119 FFXSystem[] allSystems = mainPanel.getHierarchy().getSystems();
120 int numSystems = allSystems.length;
121 CompositeConfiguration[] allProperties = new CompositeConfiguration[numSystems];
122 for (int i = 0; i < numSystems; i++) {
123 allProperties[i] = allSystems[i].getProperties();
124 }
125 return allProperties;
126 }
127
128
129
130
131
132
133
134 @Override
135 public MolecularAssembly getAssembly() throws NullPointerException {
136 MolecularAssembly assembly = mainPanel.getHierarchy().getActive();
137 if (assembly == null) {
138 throw new NullPointerException(" FFX hierarchy does not have an active assembly.");
139 }
140 return assembly;
141 }
142
143
144
145
146
147
148 @Override
149 public CompositeConfiguration getProperties() {
150 return mainPanel.getHierarchy().getActive().getProperties();
151 }
152
153
154
155
156 @Override
157 public void run() {
158 if (mainPanel != null && systemFilter != null) {
159 open();
160 }
161 }
162
163 void setNThreads(int nThreads) {
164 this.nThreads = nThreads;
165 }
166
167 private void open() {
168 if (timer) {
169 startTimer();
170 }
171 FFXSystem ffxSystem = null;
172
173 if (systemFilter.readFile()) {
174 ffxSystem = (FFXSystem) systemFilter.getActiveMolecularSystem();
175 if (!(systemFilter instanceof PDBFilter)) {
176 Utilities.biochemistry(ffxSystem, systemFilter.getAtomList());
177 }
178 systemFilter.applyAtomProperties();
179
180 mainPanel.getHierarchy().addSystemNode(ffxSystem);
181 ForceFieldEnergy energy;
182 if (nThreads > 0) {
183 energy = ForceFieldEnergy.energyFactory(ffxSystem, nThreads);
184 } else {
185 energy = ForceFieldEnergy.energyFactory(ffxSystem);
186 }
187 ffxSystem.setPotential(energy);
188 mainPanel.getHierarchy().setActive(ffxSystem);
189
190
191 if (systemFilter instanceof PDBFilter) {
192 PDBFilter pdbFilter = (PDBFilter) systemFilter;
193 List<Character> altLocs = pdbFilter.getAltLocs();
194 if (altLocs.size() > 1 || altLocs.get(0) != ' ') {
195 StringBuilder altLocString = new StringBuilder("\n Alternate locations found [ ");
196 for (Character c : altLocs) {
197
198 if (c == ' ') {
199 continue;
200 }
201 altLocString.append(format("(%s) ", c));
202 }
203 altLocString.append("]\n");
204 logger.info(altLocString.toString());
205 }
206
207
208
209 for (Character c : altLocs) {
210 if (c.equals(' ') || c.equals('A')) {
211 continue;
212 }
213 FFXSystem newSystem = new FFXSystem(
214 ffxSystem.getFile(), "Alternate Location " + c, ffxSystem.getProperties());
215 newSystem.setForceField(ffxSystem.getForceField());
216 pdbFilter.setAltID(newSystem, c);
217 pdbFilter.clearSegIDs();
218 if (pdbFilter.readFile()) {
219 pdbFilter.applyAtomProperties();
220 String fileName = ffxSystem.getFile().getAbsolutePath();
221 newSystem.setName(FilenameUtils.getBaseName(fileName) + " " + c);
222 mainPanel.getHierarchy().addSystemNode(newSystem);
223 if (nThreads > 0) {
224 energy = ForceFieldEnergy.energyFactory(newSystem, nThreads);
225 } else {
226 energy = ForceFieldEnergy.energyFactory(newSystem);
227 }
228 newSystem.setPotential(energy);
229 }
230 }
231 }
232 } else {
233 logger.warning(String.format(" Failed to read file %s", systemFilter.getFile().getName()));
234 }
235 mainPanel.setCursor(Cursor.getDefaultCursor());
236 if (timer) {
237 stopTimer(ffxSystem);
238 }
239 }
240
241
242
243
244
245 private void startTimer() {
246 Runtime runtime = Runtime.getRuntime();
247 if (gc) {
248 runtime.gc();
249 }
250 occupiedMemory = runtime.totalMemory() - runtime.freeMemory();
251 time -= System.nanoTime();
252 }
253
254 private void stopTimer(FFXSystem ffxSystem) {
255 time += System.nanoTime();
256 logger.log(
257 Level.INFO,
258 "\n Opened {0} in {1} sec.",
259 new Object[]{ffxSystem.toString(), time * 1.0e-9});
260 Resources.logResources();
261 }
262 }