Class |
Line # |
Actions |
|||
---|---|---|---|---|---|
JmolCommandsTest | 49 | 110 | 15 |
1 | /* | |
2 | * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) | |
3 | * Copyright (C) $$Year-Rel$$ The Jalview Authors | |
4 | * | |
5 | * This file is part of Jalview. | |
6 | * | |
7 | * Jalview is free software: you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License | |
9 | * as published by the Free Software Foundation, either version 3 | |
10 | * of the License, or (at your option) any later version. | |
11 | * | |
12 | * Jalview is distributed in the hope that it will be useful, but | |
13 | * WITHOUT ANY WARRANTY; without even the implied warranty | |
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
15 | * PURPOSE. See the GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with Jalview. If not, see <http://www.gnu.org/licenses/>. | |
19 | * The Jalview Authors are detailed in the 'AUTHORS' file. | |
20 | */ | |
21 | package jalview.ext.jmol; | |
22 | ||
23 | import static org.testng.Assert.assertEquals; | |
24 | import static org.testng.Assert.assertTrue; | |
25 | ||
26 | import java.awt.Color; | |
27 | import java.util.HashMap; | |
28 | import java.util.LinkedHashMap; | |
29 | import java.util.List; | |
30 | import java.util.Map; | |
31 | ||
32 | import org.testng.annotations.BeforeClass; | |
33 | import org.testng.annotations.Test; | |
34 | ||
35 | import jalview.datamodel.Alignment; | |
36 | import jalview.datamodel.AlignmentI; | |
37 | import jalview.datamodel.ColumnSelection; | |
38 | import jalview.datamodel.Sequence; | |
39 | import jalview.datamodel.SequenceI; | |
40 | import jalview.gui.AlignFrame; | |
41 | import jalview.gui.SequenceRenderer; | |
42 | import jalview.schemes.JalviewColourScheme; | |
43 | import jalview.structure.AtomSpecModel; | |
44 | import jalview.structure.StructureCommandI; | |
45 | import jalview.structure.StructureCommandsI.AtomSpecType; | |
46 | import jalview.structure.StructureMapping; | |
47 | import jalview.structure.StructureSelectionManager; | |
48 | ||
49 | public class JmolCommandsTest | |
50 | { | |
51 | private JmolCommands testee; | |
52 | ||
53 | 1 | @BeforeClass(alwaysRun = true) |
54 | public void setUp() | |
55 | { | |
56 | 1 | testee = new JmolCommands(); |
57 | } | |
58 | ||
59 | 1 | @Test(groups = { "Functional" }) |
60 | public void testGetColourBySequenceCommands_hiddenColumns() | |
61 | { | |
62 | /* | |
63 | * load these sequences, coloured by Strand propensity, | |
64 | * with columns 2-4 hidden | |
65 | */ | |
66 | 1 | SequenceI seq1 = new Sequence("seq1", "MHRSQSSSGG"); |
67 | 1 | SequenceI seq2 = new Sequence("seq2", "MVRSNGGSSS"); |
68 | 1 | AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 }); |
69 | 1 | AlignFrame af = new AlignFrame(al, 800, 500); |
70 | 1 | af.changeColour_actionPerformed(JalviewColourScheme.Strand.toString()); |
71 | 1 | ColumnSelection cs = new ColumnSelection(); |
72 | 1 | cs.addElement(2); |
73 | 1 | cs.addElement(3); |
74 | 1 | cs.addElement(4); |
75 | 1 | af.getViewport().setColumnSelection(cs); |
76 | 1 | af.hideSelColumns_actionPerformed(null); |
77 | 1 | SequenceRenderer sr = new SequenceRenderer(af.getViewport()); |
78 | 1 | SequenceI[][] seqs = new SequenceI[][] { { seq1 }, { seq2 } }; |
79 | 1 | String[] files = new String[] { "seq1.pdb", "seq2.pdb" }; |
80 | 1 | StructureSelectionManager ssm = new StructureSelectionManager(); |
81 | ||
82 | /* | |
83 | * map residues 1-10 to residues 21-30 (atoms 105-150) in structures | |
84 | */ | |
85 | 1 | HashMap<Integer, int[]> map = new HashMap<>(); |
86 | 11 | for (int pos = 1; pos <= seq1.getLength(); pos++) |
87 | { | |
88 | 10 | map.put(pos, new int[] { 20 + pos, 5 * (20 + pos) }); |
89 | } | |
90 | 1 | StructureMapping sm1 = new StructureMapping(seq1, "seq1.pdb", "pdb1", |
91 | "A", map, null); | |
92 | 1 | ssm.addStructureMapping(sm1); |
93 | 1 | StructureMapping sm2 = new StructureMapping(seq2, "seq2.pdb", "pdb2", |
94 | "B", map, null); | |
95 | 1 | ssm.addStructureMapping(sm2); |
96 | ||
97 | 1 | String[] commands = testee.colourBySequence(ssm, files, seqs, sr, |
98 | af.alignPanel); | |
99 | 1 | assertEquals(commands.length, 2); |
100 | ||
101 | 1 | String chainACommand = commands[0]; |
102 | // M colour is #82827d == (130, 130, 125) (see strand.html help page) | |
103 | 1 | assertTrue( |
104 | chainACommand.contains("select 21:A/1.1;color[130,130,125]")); // first | |
105 | // one | |
106 | // H colour is #60609f == (96, 96, 159) | |
107 | 1 | assertTrue(chainACommand.contains(";select 22:A/1.1;color[96,96,159]")); |
108 | // hidden columns are Gray (128, 128, 128) | |
109 | 1 | assertTrue(chainACommand |
110 | .contains(";select 23-25:A/1.1;color[128,128,128]")); | |
111 | // S and G are both coloured #4949b6 == (73, 73, 182) | |
112 | 1 | assertTrue( |
113 | chainACommand.contains(";select 26-30:A/1.1;color[73,73,182]")); | |
114 | ||
115 | 1 | String chainBCommand = commands[1]; |
116 | // M colour is #82827d == (130, 130, 125) | |
117 | 1 | assertTrue( |
118 | chainBCommand.contains("select 21:B/2.1;color[130,130,125]")); | |
119 | // V colour is #ffff00 == (255, 255, 0) | |
120 | 1 | assertTrue(chainBCommand.contains(";select 22:B/2.1;color[255,255,0]")); |
121 | // hidden columns are Gray (128, 128, 128) | |
122 | 1 | assertTrue(chainBCommand |
123 | .contains(";select 23-25:B/2.1;color[128,128,128]")); | |
124 | // S and G are both coloured #4949b6 == (73, 73, 182) | |
125 | 1 | assertTrue( |
126 | chainBCommand.contains(";select 26-30:B/2.1;color[73,73,182]")); | |
127 | } | |
128 | ||
129 | 1 | @Test(groups = "Functional") |
130 | public void testGetAtomSpec() | |
131 | { | |
132 | 1 | AtomSpecModel model = new AtomSpecModel(); |
133 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), ""); |
134 | 1 | model.addRange("1", 2, 4, "A"); |
135 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
136 | "2-4:A/1.1"); | |
137 | 1 | model.addRange("1", 8, 8, "A"); |
138 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
139 | "2-4:A/1.1|8:A/1.1"); | |
140 | 1 | model.addRange("1", 5, 7, "B"); |
141 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
142 | "2-4:A/1.1|8:A/1.1|5-7:B/1.1"); | |
143 | 1 | model.addRange("1", 3, 5, "A"); |
144 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
145 | "2-5:A/1.1|8:A/1.1|5-7:B/1.1"); | |
146 | 1 | model.addRange("2", 1, 4, "B"); |
147 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
148 | "2-5:A/1.1|8:A/1.1|5-7:B/1.1|1-4:B/2.1"); | |
149 | 1 | model.addRange("2", 5, 9, "C"); |
150 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
151 | "2-5:A/1.1|8:A/1.1|5-7:B/1.1|1-4:B/2.1|5-9:C/2.1"); | |
152 | 1 | model.addRange("1", 8, 10, "B"); |
153 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
154 | "2-5:A/1.1|8:A/1.1|5-10:B/1.1|1-4:B/2.1|5-9:C/2.1"); | |
155 | 1 | model.addRange("1", 8, 9, "B"); |
156 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
157 | "2-5:A/1.1|8:A/1.1|5-10:B/1.1|1-4:B/2.1|5-9:C/2.1"); | |
158 | 1 | model.addRange("2", 3, 10, "C"); // subsumes 5-9 |
159 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
160 | "2-5:A/1.1|8:A/1.1|5-10:B/1.1|1-4:B/2.1|3-10:C/2.1"); | |
161 | 1 | model.addRange("5", 25, 35, " "); |
162 | 1 | assertEquals(testee.getAtomSpec(model, AtomSpecType.RESIDUE_ONLY), |
163 | "2-5:A/1.1|8:A/1.1|5-10:B/1.1|1-4:B/2.1|3-10:C/2.1|25-35:/5.1"); | |
164 | ||
165 | } | |
166 | ||
167 | 1 | @Test(groups = { "Functional" }) |
168 | public void testColourBySequence() | |
169 | { | |
170 | 1 | Map<Object, AtomSpecModel> map = new LinkedHashMap<>(); |
171 | 1 | JmolCommands.addAtomSpecRange(map, Color.blue, "1", 2, 5, "A"); |
172 | 1 | JmolCommands.addAtomSpecRange(map, Color.blue, "1", 7, 7, "B"); |
173 | 1 | JmolCommands.addAtomSpecRange(map, Color.blue, "1", 9, 23, "A"); |
174 | 1 | JmolCommands.addAtomSpecRange(map, Color.blue, "2", 1, 1, "A"); |
175 | 1 | JmolCommands.addAtomSpecRange(map, Color.blue, "2", 4, 7, "B"); |
176 | 1 | JmolCommands.addAtomSpecRange(map, Color.yellow, "2", 8, 8, "A"); |
177 | 1 | JmolCommands.addAtomSpecRange(map, Color.yellow, "2", 3, 5, "A"); |
178 | 1 | JmolCommands.addAtomSpecRange(map, Color.red, "1", 3, 5, "A"); |
179 | 1 | JmolCommands.addAtomSpecRange(map, Color.red, "1", 6, 9, "A"); |
180 | ||
181 | // Colours should appear in the Jmol command in the order in which | |
182 | // they were added; within colour, by model, by chain, ranges in start order | |
183 | 1 | List<StructureCommandI> commands = testee.colourBySequence(map); |
184 | 1 | assertEquals(commands.size(), 1); |
185 | 1 | String expected1 = "select 2-5:A/1.1|9-23:A/1.1|7:B/1.1|1:A/2.1|4-7:B/2.1;color[0,0,255]"; |
186 | 1 | String expected2 = "select 3-5:A/2.1|8:A/2.1;color[255,255,0]"; |
187 | 1 | String expected3 = "select 3-9:A/1.1;color[255,0,0]"; |
188 | 1 | assertEquals(commands.get(0).getCommand(), |
189 | expected1 + ";" + expected2 + ";" + expected3); | |
190 | } | |
191 | ||
192 | 1 | @Test(groups = { "Functional" }) |
193 | public void testSuperposeStructures() | |
194 | { | |
195 | 1 | AtomSpecModel ref = new AtomSpecModel(); |
196 | 1 | ref.addRange("1", 12, 14, "A"); |
197 | 1 | ref.addRange("1", 18, 18, "B"); |
198 | 1 | ref.addRange("1", 22, 23, "B"); |
199 | 1 | AtomSpecModel toAlign = new AtomSpecModel(); |
200 | 1 | toAlign.addRange("2", 15, 17, "B"); |
201 | 1 | toAlign.addRange("2", 20, 21, "B"); |
202 | 1 | toAlign.addRange("2", 22, 22, "C"); |
203 | 1 | List<StructureCommandI> command = testee.superposeStructures(ref, |
204 | toAlign, AtomSpecType.ALPHA); // doesn't matter for Jmol whether nuc | |
205 | // or protein | |
206 | 1 | assertEquals(command.size(), 1); |
207 | 1 | String refSpec = "12-14:A/1.1|18:B/1.1|22-23:B/1.1"; |
208 | 1 | String toAlignSpec = "15-17:B/2.1|20-21:B/2.1|22:C/2.1"; |
209 | 1 | String expected = String.format( |
210 | "compare {2.1} {1.1} SUBSET {(*.CA | *.P) and conformation=1} ATOMS {%s}{%s} ROTATE TRANSLATE ;select %s|%s;cartoons", | |
211 | toAlignSpec, refSpec, toAlignSpec, refSpec); | |
212 | 1 | assertEquals(command.get(0).getCommand(), expected); |
213 | } | |
214 | ||
215 | 1 | @Test(groups = "Functional") |
216 | public void testGetModelStartNo() | |
217 | { | |
218 | 1 | assertEquals(testee.getModelStartNo(), 1); |
219 | } | |
220 | ||
221 | 1 | @Test(groups = "Functional") |
222 | public void testColourByChain() | |
223 | { | |
224 | 1 | StructureCommandI cmd = testee.colourByChain(); |
225 | 1 | assertEquals(cmd.getCommand(), "select *;color chain"); |
226 | } | |
227 | ||
228 | 1 | @Test(groups = "Functional") |
229 | public void testColourByCharge() | |
230 | { | |
231 | 1 | List<StructureCommandI> cmds = testee.colourByCharge(); |
232 | 1 | assertEquals(cmds.size(), 1); |
233 | 1 | assertEquals(cmds.get(0).getCommand(), |
234 | "select *;color white;select ASP,GLU;color red;" | |
235 | + "select LYS,ARG;color blue;select CYS;color yellow"); | |
236 | } | |
237 | ||
238 | 1 | @Test(groups = "Functional") |
239 | public void testSetBackgroundColour() | |
240 | { | |
241 | 1 | StructureCommandI cmd = testee.setBackgroundColour(Color.PINK); |
242 | 1 | assertEquals(cmd.getCommand(), "background [255,175,175]"); |
243 | } | |
244 | ||
245 | 1 | @Test(groups = "Functional") |
246 | public void testFocusView() | |
247 | { | |
248 | 1 | StructureCommandI cmd = testee.focusView(); |
249 | 1 | assertEquals(cmd.getCommand(), "zoom 0"); |
250 | } | |
251 | ||
252 | 1 | @Test(groups = "Functional") |
253 | public void testSaveSession() | |
254 | { | |
255 | 1 | StructureCommandI cmd = testee.saveSession("/some/filepath"); |
256 | 1 | assertEquals(cmd.getCommand(), "write STATE \"/some/filepath\""); |
257 | } | |
258 | ||
259 | 1 | @Test(groups = "Functional") |
260 | public void testShowBackbone() | |
261 | { | |
262 | 1 | List<StructureCommandI> cmds = testee.showBackbone(); |
263 | 1 | assertEquals(cmds.size(), 1); |
264 | 1 | assertEquals(cmds.get(0).getCommand(), |
265 | "select *; cartoons off; backbone"); | |
266 | } | |
267 | ||
268 | 1 | @Test(groups = "Functional") |
269 | public void testLoadFile() | |
270 | { | |
271 | 1 | StructureCommandI cmd = testee.loadFile("/some/filepath"); |
272 | 1 | assertEquals(cmd.getCommand(), "load FILES \"/some/filepath\""); |
273 | ||
274 | // single backslash gets escaped to double | |
275 | 1 | cmd = testee.loadFile("\\some\\filepath"); |
276 | 1 | assertEquals(cmd.getCommand(), "load FILES \"\\\\some\\\\filepath\""); |
277 | } | |
278 | ||
279 | 1 | @Test(groups = "Functional") |
280 | public void testOpenSession() | |
281 | { | |
282 | 1 | StructureCommandI cmd = testee.openSession("/some/filepath"); |
283 | 1 | assertEquals(cmd.getCommand(), "load FILES \"/some/filepath\""); |
284 | ||
285 | // single backslash gets escaped to double | |
286 | 1 | cmd = testee.openSession("\\some\\filepath"); |
287 | 1 | assertEquals(cmd.getCommand(), "load FILES \"\\\\some\\\\filepath\""); |
288 | } | |
289 | } |