1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
package jalview.gui; |
22 |
|
|
23 |
|
import jalview.api.structures.JalviewStructureDisplayI; |
24 |
|
import jalview.bin.Cache; |
25 |
|
import jalview.datamodel.PDBEntry; |
26 |
|
import jalview.datamodel.SequenceI; |
27 |
|
import jalview.datamodel.StructureViewerModel; |
28 |
|
import jalview.structure.StructureSelectionManager; |
29 |
|
|
30 |
|
import java.awt.Rectangle; |
31 |
|
import java.util.ArrayList; |
32 |
|
import java.util.HashMap; |
33 |
|
import java.util.LinkedHashMap; |
34 |
|
import java.util.List; |
35 |
|
import java.util.Map; |
36 |
|
import java.util.Map.Entry; |
37 |
|
|
38 |
|
|
39 |
|
|
40 |
|
|
41 |
|
|
42 |
|
|
43 |
|
|
44 |
|
@author |
45 |
|
|
|
|
| 47.2% |
Uncovered Elements: 86 (163) |
Complexity: 44 |
Complexity Density: 0.42 |
|
46 |
|
public class StructureViewer |
47 |
|
{ |
48 |
|
private static final String UNKNOWN_VIEWER_TYPE = "Unknown structure viewer type "; |
49 |
|
|
50 |
|
StructureSelectionManager ssm; |
51 |
|
|
52 |
|
|
53 |
|
|
54 |
|
|
55 |
|
private boolean superposeAdded = true; |
56 |
|
|
|
|
| - |
Uncovered Elements: 0 (0) |
Complexity: 0 |
Complexity Density: - |
|
57 |
|
public enum ViewerType |
58 |
|
{ |
59 |
|
JMOL, CHIMERA |
60 |
|
}; |
61 |
|
|
62 |
|
|
63 |
|
|
64 |
|
|
65 |
|
@param |
66 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
67 |
12 |
public StructureViewer(StructureSelectionManager structureSelectionManager)... |
68 |
|
{ |
69 |
12 |
ssm = structureSelectionManager; |
70 |
|
} |
71 |
|
|
72 |
|
|
73 |
|
|
74 |
|
|
75 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 1 |
Complexity Density: 0.33 |
|
76 |
1 |
public static StructureViewer reconfigure(... |
77 |
|
JalviewStructureDisplayI display) |
78 |
|
{ |
79 |
1 |
StructureViewer sv = new StructureViewer(display.getBinding().getSsm()); |
80 |
1 |
sv.sview = display; |
81 |
1 |
return sv; |
82 |
|
} |
83 |
|
|
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
84 |
0 |
@Override... |
85 |
|
public String toString() |
86 |
|
{ |
87 |
0 |
if (sview != null) |
88 |
|
{ |
89 |
0 |
return sview.toString(); |
90 |
|
} |
91 |
0 |
return "New View"; |
92 |
|
} |
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
93 |
2 |
public ViewerType getViewerType()... |
94 |
|
{ |
95 |
2 |
String viewType = Cache.getDefault(Preferences.STRUCTURE_DISPLAY, |
96 |
|
ViewerType.JMOL.name()); |
97 |
2 |
return ViewerType.valueOf(viewType); |
98 |
|
} |
99 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
100 |
2 |
public void setViewerType(ViewerType type)... |
101 |
|
{ |
102 |
2 |
Cache.setProperty(Preferences.STRUCTURE_DISPLAY, type.name()); |
103 |
|
} |
104 |
|
|
105 |
|
|
106 |
|
|
107 |
|
|
108 |
|
@param |
109 |
|
@param |
110 |
|
@param |
111 |
|
@return |
112 |
|
|
|
|
| 0% |
Uncovered Elements: 25 (25) |
Complexity: 5 |
Complexity Density: 0.29 |
|
113 |
0 |
public JalviewStructureDisplayI viewStructures(PDBEntry[] pdbs,... |
114 |
|
SequenceI[] seqs, AlignmentPanel ap) |
115 |
|
{ |
116 |
0 |
JalviewStructureDisplayI viewer = onlyOnePdb(pdbs, seqs, ap); |
117 |
0 |
if (viewer != null) |
118 |
|
{ |
119 |
|
|
120 |
|
|
121 |
|
|
122 |
0 |
return viewer; |
123 |
|
} |
124 |
|
|
125 |
0 |
ViewerType viewerType = getViewerType(); |
126 |
|
|
127 |
0 |
Map<PDBEntry, SequenceI[]> seqsForPdbs = getSequencesForPdbs(pdbs, |
128 |
|
seqs); |
129 |
0 |
PDBEntry[] pdbsForFile = seqsForPdbs.keySet().toArray( |
130 |
|
new PDBEntry[seqsForPdbs.size()]); |
131 |
0 |
SequenceI[][] theSeqs = seqsForPdbs.values().toArray( |
132 |
|
new SequenceI[seqsForPdbs.size()][]); |
133 |
0 |
if (sview != null) |
134 |
|
{ |
135 |
0 |
sview.setAlignAddedStructures(superposeAdded); |
136 |
0 |
new Thread(new Runnable() |
137 |
|
{ |
|
|
| 0% |
Uncovered Elements: 9 (9) |
Complexity: 3 |
Complexity Density: 0.6 |
|
138 |
0 |
@Override... |
139 |
|
public void run() |
140 |
|
{ |
141 |
|
|
142 |
0 |
for (int pdbep = 0; pdbep < pdbsForFile.length; pdbep++) |
143 |
|
{ |
144 |
0 |
PDBEntry pdb = pdbsForFile[pdbep]; |
145 |
0 |
if (!sview.addAlreadyLoadedFile(theSeqs[pdbep], null, ap, |
146 |
|
pdb.getId())) |
147 |
|
{ |
148 |
0 |
sview.addToExistingViewer(pdb, theSeqs[pdbep], null, ap, |
149 |
|
pdb.getId()); |
150 |
|
} |
151 |
|
} |
152 |
|
|
153 |
0 |
sview.updateTitleAndMenus(); |
154 |
|
} |
155 |
|
}).start(); |
156 |
0 |
return sview; |
157 |
|
} |
158 |
|
|
159 |
0 |
if (viewerType.equals(ViewerType.JMOL)) |
160 |
|
{ |
161 |
0 |
sview = new AppJmol(ap, superposeAdded, pdbsForFile, theSeqs); |
162 |
|
} |
163 |
0 |
else if (viewerType.equals(ViewerType.CHIMERA)) |
164 |
|
{ |
165 |
0 |
sview = new ChimeraViewFrame(pdbsForFile, superposeAdded, theSeqs, |
166 |
|
ap); |
167 |
|
} |
168 |
|
else |
169 |
|
{ |
170 |
0 |
Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString()); |
171 |
|
} |
172 |
0 |
return sview; |
173 |
|
} |
174 |
|
|
175 |
|
|
176 |
|
|
177 |
|
|
178 |
|
|
179 |
|
|
180 |
|
|
181 |
|
@param |
182 |
|
@param |
183 |
|
@return |
184 |
|
|
|
|
| 96.9% |
Uncovered Elements: 1 (32) |
Complexity: 9 |
Complexity Density: 0.41 |
|
185 |
2 |
Map<PDBEntry, SequenceI[]> getSequencesForPdbs(PDBEntry[] pdbs,... |
186 |
|
SequenceI[] seqs) |
187 |
|
{ |
188 |
2 |
if (pdbs == null || seqs == null || pdbs.length != seqs.length) |
189 |
|
{ |
190 |
1 |
return null; |
191 |
|
} |
192 |
|
|
193 |
|
|
194 |
|
|
195 |
|
|
196 |
|
|
197 |
1 |
Map<String, PDBEntry> pdbsSeen = new HashMap<>(); |
198 |
|
|
199 |
|
|
200 |
|
|
201 |
|
|
202 |
|
|
203 |
1 |
Map<PDBEntry, List<SequenceI>> pdbSeqs = new LinkedHashMap<>(); |
204 |
8 |
for (int i = 0; i < pdbs.length; i++) |
205 |
|
{ |
206 |
7 |
PDBEntry pdb = pdbs[i]; |
207 |
7 |
SequenceI seq = seqs[i]; |
208 |
7 |
String pdbFile = pdb.getFile(); |
209 |
7 |
if (pdbFile == null || pdbFile.length() == 0) |
210 |
|
{ |
211 |
3 |
pdbFile = pdb.getId(); |
212 |
|
} |
213 |
7 |
if (!pdbsSeen.containsKey(pdbFile)) |
214 |
|
{ |
215 |
4 |
pdbsSeen.put(pdbFile, pdb); |
216 |
4 |
pdbSeqs.put(pdb, new ArrayList<SequenceI>()); |
217 |
|
} |
218 |
|
else |
219 |
|
{ |
220 |
3 |
pdb = pdbsSeen.get(pdbFile); |
221 |
|
} |
222 |
7 |
List<SequenceI> seqsForPdb = pdbSeqs.get(pdb); |
223 |
7 |
if (!seqsForPdb.contains(seq)) |
224 |
|
{ |
225 |
7 |
seqsForPdb.add(seq); |
226 |
|
} |
227 |
|
} |
228 |
|
|
229 |
|
|
230 |
|
|
231 |
|
|
232 |
1 |
Map<PDBEntry, SequenceI[]> result = new LinkedHashMap<>(); |
233 |
1 |
for (Entry<PDBEntry, List<SequenceI>> entry : pdbSeqs.entrySet()) |
234 |
|
{ |
235 |
4 |
List<SequenceI> theSeqs = entry.getValue(); |
236 |
4 |
result.put(entry.getKey(), |
237 |
|
theSeqs.toArray(new SequenceI[theSeqs.size()])); |
238 |
|
} |
239 |
|
|
240 |
1 |
return result; |
241 |
|
} |
242 |
|
|
243 |
|
|
244 |
|
|
245 |
|
|
246 |
|
|
247 |
|
|
248 |
|
|
249 |
|
|
250 |
|
@param |
251 |
|
@param |
252 |
|
@param |
253 |
|
@return |
254 |
|
|
|
|
| 0% |
Uncovered Elements: 19 (19) |
Complexity: 6 |
Complexity Density: 0.46 |
|
255 |
0 |
private JalviewStructureDisplayI onlyOnePdb(PDBEntry[] pdbs,... |
256 |
|
SequenceI[] seqsForPdbs, AlignmentPanel ap) |
257 |
|
{ |
258 |
0 |
List<SequenceI> seqs = new ArrayList<>(); |
259 |
0 |
if (pdbs == null || pdbs.length == 0) |
260 |
|
{ |
261 |
0 |
return null; |
262 |
|
} |
263 |
0 |
int i = 0; |
264 |
0 |
String firstFile = pdbs[0].getFile(); |
265 |
0 |
for (PDBEntry pdb : pdbs) |
266 |
|
{ |
267 |
0 |
String pdbFile = pdb.getFile(); |
268 |
0 |
if (pdbFile == null || !pdbFile.equals(firstFile)) |
269 |
|
{ |
270 |
0 |
return null; |
271 |
|
} |
272 |
0 |
SequenceI pdbseq = seqsForPdbs[i++]; |
273 |
0 |
if (pdbseq != null) |
274 |
|
{ |
275 |
0 |
seqs.add(pdbseq); |
276 |
|
} |
277 |
|
} |
278 |
0 |
return viewStructures(pdbs[0], seqs.toArray(new SequenceI[seqs.size()]), |
279 |
|
ap); |
280 |
|
} |
281 |
|
|
282 |
|
JalviewStructureDisplayI sview = null; |
283 |
|
|
|
|
| 69.6% |
Uncovered Elements: 7 (23) |
Complexity: 5 |
Complexity Density: 0.33 |
|
284 |
3 |
public JalviewStructureDisplayI viewStructures(PDBEntry pdb,... |
285 |
|
SequenceI[] seqsForPdb, AlignmentPanel ap) |
286 |
|
{ |
287 |
3 |
if (sview != null) |
288 |
|
{ |
289 |
1 |
sview.setAlignAddedStructures(superposeAdded); |
290 |
1 |
String pdbId = pdb.getId(); |
291 |
1 |
if (!sview.addAlreadyLoadedFile(seqsForPdb, null, ap, pdbId)) |
292 |
|
{ |
293 |
1 |
sview.addToExistingViewer(pdb, seqsForPdb, null, ap, pdbId); |
294 |
|
} |
295 |
1 |
sview.updateTitleAndMenus(); |
296 |
1 |
sview.raiseViewer(); |
297 |
1 |
return sview; |
298 |
|
} |
299 |
2 |
ViewerType viewerType = getViewerType(); |
300 |
2 |
if (viewerType.equals(ViewerType.JMOL)) |
301 |
|
{ |
302 |
2 |
sview = new AppJmol(pdb, seqsForPdb, null, ap); |
303 |
|
} |
304 |
0 |
else if (viewerType.equals(ViewerType.CHIMERA)) |
305 |
|
{ |
306 |
0 |
sview = new ChimeraViewFrame(pdb, seqsForPdb, null, ap); |
307 |
|
} |
308 |
|
else |
309 |
|
{ |
310 |
0 |
Cache.log.error(UNKNOWN_VIEWER_TYPE + getViewerType().toString()); |
311 |
|
} |
312 |
2 |
return sview; |
313 |
|
} |
314 |
|
|
315 |
|
|
316 |
|
|
317 |
|
|
318 |
|
@param |
319 |
|
@param |
320 |
|
@param |
321 |
|
@param |
322 |
|
@param |
323 |
|
@param |
324 |
|
@param |
325 |
|
@param |
326 |
|
@param |
327 |
|
@return |
328 |
|
|
|
|
| 61.5% |
Uncovered Elements: 5 (13) |
Complexity: 3 |
Complexity Density: 0.23 |
|
329 |
8 |
public JalviewStructureDisplayI createView(ViewerType type, String[] pdbf,... |
330 |
|
String[] id, SequenceI[][] sq, AlignmentPanel alignPanel, |
331 |
|
StructureViewerModel viewerData, String fileloc, Rectangle rect, |
332 |
|
String vid) |
333 |
|
{ |
334 |
8 |
final boolean useinViewerSuperpos = viewerData.isAlignWithPanel(); |
335 |
8 |
final boolean usetoColourbyseq = viewerData.isColourWithAlignPanel(); |
336 |
8 |
final boolean viewerColouring = viewerData.isColourByViewer(); |
337 |
|
|
338 |
8 |
switch (type) |
339 |
|
{ |
340 |
8 |
case JMOL: |
341 |
8 |
sview = new AppJmol(pdbf, id, sq, alignPanel, usetoColourbyseq, |
342 |
|
useinViewerSuperpos, viewerColouring, fileloc, rect, vid); |
343 |
8 |
break; |
344 |
0 |
case CHIMERA: |
345 |
0 |
Cache.log.error( |
346 |
|
"Unsupported structure viewer type " + type.toString()); |
347 |
0 |
break; |
348 |
0 |
default: |
349 |
0 |
Cache.log.error(UNKNOWN_VIEWER_TYPE + type.toString()); |
350 |
|
} |
351 |
8 |
return sview; |
352 |
|
} |
353 |
|
|
|
|
| 87.5% |
Uncovered Elements: 1 (8) |
Complexity: 3 |
Complexity Density: 0.75 |
|
354 |
3 |
public boolean isBusy()... |
355 |
|
{ |
356 |
3 |
if (sview != null) |
357 |
|
{ |
358 |
3 |
if (!sview.hasMapping()) |
359 |
|
{ |
360 |
2 |
return true; |
361 |
|
} |
362 |
|
} |
363 |
1 |
return false; |
364 |
|
} |
365 |
|
|
366 |
|
|
367 |
|
|
368 |
|
@param |
369 |
|
@return |
370 |
|
|
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 2 |
Complexity Density: 0.67 |
|
371 |
0 |
public boolean hasPdbId(String pDBid)... |
372 |
|
{ |
373 |
0 |
if (sview == null) |
374 |
|
{ |
375 |
0 |
return false; |
376 |
|
} |
377 |
|
|
378 |
0 |
return sview.getBinding().hasPdbId(pDBid); |
379 |
|
} |
380 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
381 |
0 |
public boolean isVisible()... |
382 |
|
{ |
383 |
0 |
return sview != null && sview.isVisible(); |
384 |
|
} |
385 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
386 |
0 |
public void setSuperpose(boolean alignAddedStructures)... |
387 |
|
{ |
388 |
0 |
superposeAdded = alignAddedStructures; |
389 |
|
} |
390 |
|
|
391 |
|
} |