1 package jalview.analysis;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertTrue;
6 import jalview.datamodel.Sequence;
7 import jalview.datamodel.SequenceI;
8 import jalview.gui.JvOptionPane;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.List;
15 import org.testng.annotations.BeforeClass;
16 import org.testng.annotations.Test;
18 public class ConservationTest
21 @BeforeClass(alwaysRun = true)
22 public void setUpJvOptionPane()
24 JvOptionPane.setInteractiveMode(false);
25 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
28 @Test(groups = "Functional")
29 public void testRecordConservation()
31 Map<String, Integer> resultMap = new HashMap<String, Integer>();
33 // V is hydrophobic, aliphatic, small
34 Conservation.recordConservation(resultMap, "V");
35 assertEquals(resultMap.get("hydrophobic").intValue(), 1);
36 assertEquals(resultMap.get("aliphatic").intValue(), 1);
37 assertEquals(resultMap.get("small").intValue(), 1);
38 assertEquals(resultMap.get("tiny").intValue(), 0);
39 assertEquals(resultMap.get("polar").intValue(), 0);
40 assertEquals(resultMap.get("charged").intValue(), 0);
42 // now add S: not hydrophobic, small, tiny, polar, not aliphatic
43 Conservation.recordConservation(resultMap, "s");
44 assertEquals(resultMap.get("hydrophobic").intValue(), -1);
45 assertEquals(resultMap.get("aliphatic").intValue(), -1);
46 assertEquals(resultMap.get("small").intValue(), 1);
47 assertEquals(resultMap.get("tiny").intValue(), -1);
48 assertEquals(resultMap.get("polar").intValue(), -1);
49 assertEquals(resultMap.get("charged").intValue(), 0);
52 @Test(groups = "Functional")
53 public void testCountConservationAndGaps()
55 List<SequenceI> seqs = new ArrayList<SequenceI>();
56 seqs.add(new Sequence("seq1", "VGnY")); // not case sensitive
57 seqs.add(new Sequence("seq2", "-G-y"));
58 seqs.add(new Sequence("seq3", "VG-Y"));
59 seqs.add(new Sequence("seq4", "VGNW"));
61 Conservation cons = new Conservation("", seqs, 0, 50);
62 int[] counts = cons.countConservationAndGaps(0);
63 assertEquals(counts[0], 1); // conserved
64 assertEquals(counts[1], 1); // gap count
65 counts = cons.countConservationAndGaps(1);
66 assertEquals(counts[0], 1);
67 assertEquals(counts[1], 0);
68 counts = cons.countConservationAndGaps(2);
69 assertEquals(counts[0], 1);
70 assertEquals(counts[1], 2);
71 counts = cons.countConservationAndGaps(3);
72 assertEquals(counts[0], 0); // not conserved
73 assertEquals(counts[1], 0);
76 @Test(groups = "Functional")
77 public void testCalculate_noThreshold()
79 List<SequenceI> seqs = new ArrayList<SequenceI>();
80 seqs.add(new Sequence("seq1", "VGIV-N"));
81 seqs.add(new Sequence("seq2", "V-iL-N")); // not case sensitive
82 seqs.add(new Sequence("seq3", "V-IW-N"));
83 seqs.add(new Sequence("seq4", "VGLH-L"));
85 Conservation cons = new Conservation("", 0, seqs, 0, 5);
89 * column 0: all V (hydrophobic/aliphatic/small)
91 Map<String, Integer> colCons = cons.total[0];
92 assertEquals(colCons.get("hydrophobic").intValue(), 1);
93 assertEquals(colCons.get("aliphatic").intValue(), 1);
94 assertEquals(colCons.get("small").intValue(), 1);
95 assertEquals(colCons.get("tiny").intValue(), 0);
96 assertEquals(colCons.get("proline").intValue(), 0);
97 assertEquals(colCons.get("charged").intValue(), 0);
98 assertEquals(colCons.get("negative").intValue(), 0);
99 assertEquals(colCons.get("polar").intValue(), 0);
100 assertEquals(colCons.get("positive").intValue(), 0);
101 assertEquals(colCons.get("aromatic").intValue(), 0);
104 * column 1: all G (hydrophobic/small/tiny)
105 * gaps take default value of property present
107 colCons = cons.total[1];
108 assertEquals(colCons.get("hydrophobic").intValue(), 1);
109 assertEquals(colCons.get("aliphatic").intValue(), -1);
110 assertEquals(colCons.get("small").intValue(), 1);
111 assertEquals(colCons.get("tiny").intValue(), 1);
112 assertEquals(colCons.get("proline").intValue(), -1);
113 assertEquals(colCons.get("charged").intValue(), -1);
114 assertEquals(colCons.get("negative").intValue(), -1);
115 assertEquals(colCons.get("polar").intValue(), -1);
116 assertEquals(colCons.get("positive").intValue(), -1);
117 assertEquals(colCons.get("aromatic").intValue(), -1);
120 * column 2: I/L (aliphatic/hydrophobic), all others negatively conserved
122 colCons = cons.total[2];
123 assertEquals(colCons.get("hydrophobic").intValue(), 1);
124 assertEquals(colCons.get("aliphatic").intValue(), 1);
125 assertEquals(colCons.get("small").intValue(), 0);
126 assertEquals(colCons.get("tiny").intValue(), 0);
127 assertEquals(colCons.get("proline").intValue(), 0);
128 assertEquals(colCons.get("charged").intValue(), 0);
129 assertEquals(colCons.get("negative").intValue(), 0);
130 assertEquals(colCons.get("polar").intValue(), 0);
131 assertEquals(colCons.get("positive").intValue(), 0);
132 assertEquals(colCons.get("aromatic").intValue(), 0);
135 * column 3: VLWH all hydrophobic, none is tiny, negative or proline
137 colCons = cons.total[3];
138 assertEquals(colCons.get("hydrophobic").intValue(), 1);
139 assertEquals(colCons.get("aliphatic").intValue(), -1);
140 assertEquals(colCons.get("small").intValue(), -1);
141 assertEquals(colCons.get("tiny").intValue(), 0);
142 assertEquals(colCons.get("proline").intValue(), 0);
143 assertEquals(colCons.get("charged").intValue(), -1);
144 assertEquals(colCons.get("negative").intValue(), 0);
145 assertEquals(colCons.get("polar").intValue(), -1);
146 assertEquals(colCons.get("positive").intValue(), -1);
147 assertEquals(colCons.get("aromatic").intValue(), -1);
150 * column 4: all gaps - counted as having all properties
152 colCons = cons.total[4];
153 assertEquals(colCons.get("hydrophobic").intValue(), 1);
154 assertEquals(colCons.get("aliphatic").intValue(), 1);
155 assertEquals(colCons.get("small").intValue(), 1);
156 assertEquals(colCons.get("tiny").intValue(), 1);
157 assertEquals(colCons.get("proline").intValue(), 1);
158 assertEquals(colCons.get("charged").intValue(), 1);
159 assertEquals(colCons.get("negative").intValue(), 1);
160 assertEquals(colCons.get("polar").intValue(), 1);
161 assertEquals(colCons.get("positive").intValue(), 1);
162 assertEquals(colCons.get("aromatic").intValue(), 1);
165 * column 5: N (small polar) and L (aliphatic hydrophobic)
166 * have nothing in common!
168 colCons = cons.total[5];
169 assertEquals(colCons.get("hydrophobic").intValue(), -1);
170 assertEquals(colCons.get("aliphatic").intValue(), -1);
171 assertEquals(colCons.get("small").intValue(), -1);
172 assertEquals(colCons.get("tiny").intValue(), 0);
173 assertEquals(colCons.get("proline").intValue(), 0);
174 assertEquals(colCons.get("charged").intValue(), 0);
175 assertEquals(colCons.get("negative").intValue(), 0);
176 assertEquals(colCons.get("polar").intValue(), -1);
177 assertEquals(colCons.get("positive").intValue(), 0);
178 assertEquals(colCons.get("aromatic").intValue(), 0);
182 * Test for the case whether the number of non-gapped sequences in a column
183 * has to be above a threshold
185 @Test(groups = "Functional")
186 public void testCalculate_threshold()
188 List<SequenceI> seqs = new ArrayList<SequenceI>();
189 seqs.add(new Sequence("seq1", "VGIV-"));
190 seqs.add(new Sequence("seq2", "V-iL-")); // not case sensitive
191 seqs.add(new Sequence("seq3", "V-IW-"));
192 seqs.add(new Sequence("seq4", "VGLH-"));
193 seqs.add(new Sequence("seq5", "VGLH-"));
196 * threshold 50% means a residue has to occur 3 or more times
197 * in a column to be counted for conservation
199 // TODO: ConservationThread uses a value of 3
200 // calculateConservation states it is the minimum number of sequences
201 // but it is treated as percentage threshold in calculate() ?
202 Conservation cons = new Conservation("", 50, seqs, 0, 4);
206 * column 0: all V (hydrophobic/aliphatic/small)
208 Map<String, Integer> colCons = cons.total[0];
209 assertEquals(colCons.get("hydrophobic").intValue(), 1);
210 assertEquals(colCons.get("aliphatic").intValue(), 1);
211 assertEquals(colCons.get("small").intValue(), 1);
212 assertEquals(colCons.get("tiny").intValue(), 0);
213 assertEquals(colCons.get("proline").intValue(), 0);
214 assertEquals(colCons.get("charged").intValue(), 0);
215 assertEquals(colCons.get("negative").intValue(), 0);
216 assertEquals(colCons.get("polar").intValue(), 0);
217 assertEquals(colCons.get("positive").intValue(), 0);
218 assertEquals(colCons.get("aromatic").intValue(), 0);
221 * column 1: all G (hydrophobic/small/tiny)
222 * gaps are ignored as not above threshold
224 colCons = cons.total[1];
225 assertEquals(colCons.get("hydrophobic").intValue(), 1);
226 assertEquals(colCons.get("aliphatic").intValue(), 0);
227 assertEquals(colCons.get("small").intValue(), 1);
228 assertEquals(colCons.get("tiny").intValue(), 1);
229 assertEquals(colCons.get("proline").intValue(), 0);
230 assertEquals(colCons.get("charged").intValue(), 0);
231 assertEquals(colCons.get("negative").intValue(), 0);
232 assertEquals(colCons.get("polar").intValue(), 0);
233 assertEquals(colCons.get("positive").intValue(), 0);
234 assertEquals(colCons.get("aromatic").intValue(), 0);
237 * column 2: I/L (aliphatic/hydrophobic), all others negatively conserved
239 colCons = cons.total[2];
240 assertEquals(colCons.get("hydrophobic").intValue(), 1);
241 assertEquals(colCons.get("aliphatic").intValue(), 1);
242 assertEquals(colCons.get("small").intValue(), 0);
243 assertEquals(colCons.get("tiny").intValue(), 0);
244 assertEquals(colCons.get("proline").intValue(), 0);
245 assertEquals(colCons.get("charged").intValue(), 0);
246 assertEquals(colCons.get("negative").intValue(), 0);
247 assertEquals(colCons.get("polar").intValue(), 0);
248 assertEquals(colCons.get("positive").intValue(), 0);
249 assertEquals(colCons.get("aromatic").intValue(), 0);
252 * column 3: nothing above threshold
254 colCons = cons.total[3];
255 assertTrue(colCons.isEmpty());
258 * column 4: all gaps - counted as having all properties
260 colCons = cons.total[4];
261 assertEquals(colCons.get("hydrophobic").intValue(), 1);
262 assertEquals(colCons.get("aliphatic").intValue(), 1);
263 assertEquals(colCons.get("small").intValue(), 1);
264 assertEquals(colCons.get("tiny").intValue(), 1);
265 assertEquals(colCons.get("proline").intValue(), 1);
266 assertEquals(colCons.get("charged").intValue(), 1);
267 assertEquals(colCons.get("negative").intValue(), 1);
268 assertEquals(colCons.get("polar").intValue(), 1);
269 assertEquals(colCons.get("positive").intValue(), 1);
270 assertEquals(colCons.get("aromatic").intValue(), 1);
274 * Test the method that derives the conservation 'sequence' and the mouseover
275 * tooltips from the computed conservation
277 @Test(groups = "Functional")
278 public void testVerdict()
280 List<SequenceI> seqs = new ArrayList<SequenceI>();
281 seqs.add(new Sequence("seq1", "VGIVV-H"));
282 seqs.add(new Sequence("seq2", "VGILL-H"));
283 seqs.add(new Sequence("seq3", "VGIW--R"));
284 seqs.add(new Sequence("seq4", "VGLHH--"));
285 seqs.add(new Sequence("seq5", "VGLHH-R"));
286 seqs.add(new Sequence("seq6", "VGLHH--"));
287 seqs.add(new Sequence("seq7", "VGLHH-R"));
288 seqs.add(new Sequence("seq8", "VGLHH-R"));
290 // calculate with no threshold
291 Conservation cons = new Conservation("", 0, seqs, 0, 6);
293 // positive and negative conservation where <25% gaps in columns
294 cons.verdict(false, 25);
297 * verify conservation 'sequence'
298 * cols 0 fully conserved and above threshold (*)
299 * col 2 properties fully conserved (+)
300 * col 3 VLWH 1 positively and 3 negatively conserved properties
301 * col 4 has 1 positively conserved property, but because gap contributes a
302 * 'positive' for all properties, no negative conservation is counted
304 * col 6 has 25% gaps so fails threshold test
306 assertEquals(cons.getConsSequence().getSequenceAsString(), "**+41--");
309 * verify tooltips; conserved properties are sorted alphabetically within
310 * positive followed by negative
314 "aliphatic hydrophobic small !aromatic !charged !negative !polar !positive !proline !tiny");
317 "hydrophobic small tiny !aliphatic !aromatic !charged !negative !polar !positive !proline");
320 "aliphatic hydrophobic !aromatic !charged !negative !polar !positive !proline !small !tiny");
321 assertEquals(cons.getTooltip(3), "hydrophobic !negative !proline !tiny");
322 assertEquals(cons.getTooltip(4), "hydrophobic");
323 assertEquals(cons.getTooltip(5), "");
324 assertEquals(cons.getTooltip(6), "");