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