3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertNull;
6 import jalview.datamodel.HMMNode;
7 import jalview.datamodel.HiddenMarkovModel;
9 import java.io.BufferedReader;
10 import java.io.FileReader;
11 import java.io.IOException;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Scanner;
16 import org.testng.annotations.Test;
18 public class HMMFileTest {
20 HMMFile fn3 = new HMMFile("H:/fn3.hmm");
22 HMMFile emptyFile = new HMMFile("H:/EmptyFile.hmm");
24 HMMFile pKinase = new HMMFile("H:/Pkinase.hmm");
26 HMMFile made1 = new HMMFile("H:/MADE1.hmm");
29 public void testParse() throws IOException
34 assertEquals(pKinase.hmm.getName(), "Pkinase");
35 assertEquals(pKinase.hmm.getAccessionNumber(), "PF00069.17");
36 assertEquals(pKinase.hmm.getDescription(), "Protein kinase domain");
37 assertEquals(pKinase.hmm.getLength().intValue(), 260);
38 assertNull(pKinase.hmm.getMaxInstanceLength());
39 assertEquals(pKinase.hmm.getAlphabetType(), "amino");
40 assertEquals(pKinase.hmm.referenceAnnotationIsActive(), false);
41 assertEquals(pKinase.hmm.maskValueIsActive(), false);
42 assertEquals(pKinase.hmm.consensusResidueIsActive(), true);
43 assertEquals(pKinase.hmm.consensusStructureIsActive(),
45 assertEquals(pKinase.hmm.mapIsActive(), true);
46 assertEquals(pKinase.hmm.getDate(), "Thu Jun 16 11:44:06 2011");
47 assertNull(pKinase.hmm.getCommandLineLog());
48 assertEquals(pKinase.hmm.getNumberOfSequences().intValue(), 54);
49 assertEquals(pKinase.hmm.getEffectiveNumberOfSequences(), 3.358521, 4d);
50 assertEquals(pKinase.hmm.getCheckSum().longValue(), 3106786190l);
51 assertEquals(pKinase.hmm.getGatheringThreshold(), "70.30 70.30");
52 assertEquals(pKinase.hmm.getTrustedCutoff(), "70.30 70.30");
53 assertEquals(pKinase.hmm.getNoiseCutoff(), "70.20 70.20");
55 List<Character> symbols = new ArrayList<>();
77 assertEquals(pKinase.hmm.getSymbols(), symbols);
79 assertEquals(pKinase.hmm.getMatchEmission(0, 19), 3.43274);
80 assertEquals(pKinase.hmm.getMatchEmission(12, 12), 4.33979);
81 assertEquals(pKinase.hmm.getMatchEmission(23, 7), 3.65600);
82 assertEquals(pKinase.hmm.getMatchEmission(54, 1), 4.76187);
83 assertEquals(pKinase.hmm.getMatchEmission(79, 0), 2.81579);
84 assertEquals(pKinase.hmm.getMatchEmission(100, 0), 1.86496);
85 assertEquals(pKinase.hmm.getMatchEmission(112, 14), 2.77179);
86 assertEquals(pKinase.hmm.getMatchEmission(143, 17), 5.10478);
87 assertEquals(pKinase.hmm.getMatchEmission(156, 4), 4.69372);
88 assertEquals(pKinase.hmm.getMatchEmission(178, 3), 2.52594);
89 assertEquals(pKinase.hmm.getMatchEmission(210, 2), 4.23598);
90 assertEquals(pKinase.hmm.getMatchEmission(260, 19), 3.81122);
92 assertEquals(pKinase.hmm.getInsertEmission(2, 1), 4.42225);
93 assertEquals(pKinase.hmm.getInsertEmission(15, 6), 3.72501);
94 assertEquals(pKinase.hmm.getInsertEmission(22, 9), 2.69355);
95 assertEquals(pKinase.hmm.getInsertEmission(57, 2), 2.77519);
96 assertEquals(pKinase.hmm.getInsertEmission(62, 14), 2.89801);
97 assertEquals(pKinase.hmm.getInsertEmission(95, 17), 2.98532);
98 assertEquals(pKinase.hmm.getInsertEmission(105, 4), 3.46354);
99 assertEquals(pKinase.hmm.getInsertEmission(134, 1), 4.42225);
100 assertEquals(pKinase.hmm.getInsertEmission(143, 0), 2.68618);
101 assertEquals(pKinase.hmm.getInsertEmission(152, 16), 2.77519);
102 assertEquals(pKinase.hmm.getInsertEmission(203, 16), 2.77519);
103 assertEquals(pKinase.hmm.getInsertEmission(255, 12), 2.73739);
105 assertEquals(pKinase.hmm.getStateTransition(0, 6),
106 Double.NEGATIVE_INFINITY);
107 assertEquals(pKinase.hmm.getStateTransition(3, 6), 0.95510);
108 assertEquals(pKinase.hmm.getStateTransition(29, 3), 0.61958);
109 assertEquals(pKinase.hmm.getStateTransition(46, 4), 0.77255);
110 assertEquals(pKinase.hmm.getStateTransition(53, 1), 5.01631);
111 assertEquals(pKinase.hmm.getStateTransition(79, 2), 5.73865);
112 assertEquals(pKinase.hmm.getStateTransition(101, 2), 5.73865);
113 assertEquals(pKinase.hmm.getStateTransition(120, 5), 0.48576);
114 assertEquals(pKinase.hmm.getStateTransition(146, 5), 0.70219);
115 assertEquals(pKinase.hmm.getStateTransition(169, 3), 1.23224);
116 assertEquals(pKinase.hmm.getStateTransition(209, 0), 0.01003);
117 assertEquals(pKinase.hmm.getStateTransition(243, 1), 5.01631);
119 assertEquals(pKinase.hmm.getNodeAlignmentColumn(3).intValue(), 3);
120 assertEquals(pKinase.hmm.getReferenceAnnotation(7), '-');
121 assertEquals(pKinase.hmm.getConsensusResidue(23), 't');
122 assertEquals(pKinase.hmm.getMaskedValue(30), '-');
123 assertEquals(pKinase.hmm.getConsensusStructure(56), 'S');
125 assertEquals(pKinase.hmm.getNodeAlignmentColumn(78).intValue(), 136);
126 assertEquals(pKinase.hmm.getReferenceAnnotation(93), '-');
127 assertEquals(pKinase.hmm.getConsensusResidue(145), 'a');
128 assertEquals(pKinase.hmm.getMaskedValue(183), '-');
129 assertEquals(pKinase.hmm.getConsensusStructure(240), 'H');
134 public void testParseFileProperties() throws IOException
136 FileReader fr = new FileReader(fn3.getDataObject());
137 BufferedReader br = new BufferedReader(fr);
138 fn3.parseFileProperties(br);
139 fn3.parseModel(br); // this is for a later test
140 HiddenMarkovModel testHMM = new HiddenMarkovModel();
141 testHMM = fn3.getHmm();
145 assertEquals(testHMM.getName(), "fn3");
146 assertEquals(testHMM.getAccessionNumber(), "PF00041.13");
147 assertEquals(testHMM.getDescription(),
148 "Fibronectin type III domain");
149 assertEquals(testHMM.getLength().intValue(), 86);
150 assertNull(testHMM.getMaxInstanceLength());
151 assertEquals(testHMM.getAlphabetType(), "amino");
152 assertEquals(testHMM.referenceAnnotationIsActive(), false);
153 assertEquals(testHMM.maskValueIsActive(), false);
154 assertEquals(testHMM.consensusResidueIsActive(), true);
155 assertEquals(testHMM.consensusStructureIsActive(), true);
156 assertEquals(testHMM.mapIsActive(), true);
157 assertEquals(testHMM.getDate(), "Fri Jun 20 08:22:31 2014");
158 assertNull(testHMM.getCommandLineLog());
159 assertEquals(testHMM.getNumberOfSequences().intValue(), 106);
160 assertEquals(testHMM.getEffectiveNumberOfSequences(), 11.415833, 4d);
161 assertEquals(testHMM.getCheckSum().longValue(), 3564431818l);
162 assertEquals(testHMM.getGatheringThreshold(), "8.00 7.20");
163 assertEquals(testHMM.getTrustedCutoff(), "8.00 7.20");
164 assertEquals(testHMM.getNoiseCutoff(), "7.90 7.90");
165 assertEquals(testHMM.getViterbi(), "-9.7737 0.71847");
166 assertEquals(testHMM.getMSV(), "-9.4043 0.71847");
167 assertEquals(testHMM.getForward(), "-3.8341 0.71847");
169 FileReader fr2 = new FileReader(emptyFile.getDataObject());
170 BufferedReader br2 = new BufferedReader(fr2);
171 emptyFile.parseFileProperties(br2);
172 testHMM = emptyFile.getHmm();
176 assertNull(testHMM.getName());
177 assertNull(testHMM.getAccessionNumber());
178 assertNull(testHMM.getDescription());
179 assertNull(testHMM.getLength());
180 assertNull(testHMM.getMaxInstanceLength());
181 assertNull(testHMM.getAlphabetType());
182 assertEquals(testHMM.referenceAnnotationIsActive(), false);
183 assertEquals(testHMM.maskValueIsActive(), false);
184 assertEquals(testHMM.consensusResidueIsActive(), false);
185 assertEquals(testHMM.consensusStructureIsActive(),
187 assertEquals(testHMM.mapIsActive(), false);
188 assertNull(testHMM.getDate());
189 assertNull(testHMM.getCommandLineLog());
190 assertNull(testHMM.getNumberOfSequences());
191 assertNull(testHMM.getEffectiveNumberOfSequences());
192 assertNull(testHMM.getCheckSum());
193 assertNull(testHMM.getGatheringThreshold());
194 assertNull(testHMM.getGatheringThreshold());
195 assertNull(testHMM.getTrustedCutoff());
196 assertNull(testHMM.getTrustedCutoff());
197 assertNull(testHMM.getNoiseCutoff());
198 assertNull(testHMM.getNoiseCutoff());
199 assertNull(testHMM.getViterbi());
200 assertNull(testHMM.getMSV());
201 assertNull(testHMM.getForward());
203 FileReader fr3 = new FileReader(made1.getDataObject());
204 BufferedReader br3 = new BufferedReader(fr3);
205 made1.parseFileProperties(br3);
206 testHMM = made1.getHmm();
210 assertEquals(testHMM.getName(), "MADE1");
211 assertEquals(testHMM.getAccessionNumber(), "DF0000629.2");
212 assertEquals(testHMM.getDescription(),
213 "MADE1 (MAriner Derived Element 1), a TcMar-Mariner DNA transposon");
214 assertEquals(testHMM.getLength().intValue(), 80);
215 assertEquals(testHMM.getMaxInstanceLength().intValue(), 426);
216 assertEquals(testHMM.getAlphabetType(), "DNA");
217 assertEquals(testHMM.referenceAnnotationIsActive(), true);
218 assertEquals(testHMM.maskValueIsActive(), false);
219 assertEquals(testHMM.consensusResidueIsActive(), true);
220 assertEquals(testHMM.consensusStructureIsActive(), false);
221 assertEquals(testHMM.mapIsActive(), true);
222 assertEquals(testHMM.getDate(), "Tue Feb 19 20:33:41 2013");
223 assertNull(testHMM.getCommandLineLog());
224 assertEquals(testHMM.getNumberOfSequences().intValue(), 1997);
225 assertEquals(testHMM.getEffectiveNumberOfSequences(), 3.911818, 4d);
226 assertEquals(testHMM.getCheckSum().longValue(), 3015610723l);
227 assertEquals(testHMM.getGatheringThreshold(), "2.324 4.234");
228 assertEquals(testHMM.getTrustedCutoff(), "2.343 1.212");
229 assertEquals(testHMM.getNoiseCutoff(), "2.354 5.456");
230 assertEquals(testHMM.getViterbi(), "-9.3632 0.71858");
231 assertEquals(testHMM.getMSV(), "-8.5786 0.71858");
232 assertEquals(testHMM.getForward(), "-3.4823 0.71858");
238 public void testGetTransitionType()
241 assertEquals(fn3.getTransitionType("mm").intValue(), 0);
242 assertEquals(fn3.getTransitionType("mi").intValue(), 1);
243 assertEquals(fn3.getTransitionType("md").intValue(), 2);
244 assertEquals(fn3.getTransitionType("im").intValue(), 3);
245 assertEquals(fn3.getTransitionType("ii").intValue(), 4);
246 assertEquals(fn3.getTransitionType("dm").intValue(), 5);
247 assertEquals(fn3.getTransitionType("dd").intValue(), 6);
248 assertNull(fn3.getTransitionType("df"));
253 public void testFillList()
255 Scanner scanner1 = new Scanner("1.3 2.4 5.3 3.9 9.8 4.7 4.3 2.3 6.9");
256 ArrayList<Double> filledArray = new ArrayList<>();
258 filledArray.add(1.3);
259 filledArray.add(2.4);
260 filledArray.add(5.3);
261 filledArray.add(3.9);
262 filledArray.add(9.8);
263 filledArray.add(4.7);
264 filledArray.add(4.3);
265 filledArray.add(2.3);
266 filledArray.add(6.9);
268 assertEquals(HMMFile.fillList(scanner1, 9), filledArray);
272 Scanner scanner2 = new Scanner(
273 "1.346554 5.58756754 35.3523645 12345.3564 1.4");
274 filledArray.add(1.346554);
275 filledArray.add(5.58756754);
276 filledArray.add(35.3523645);
277 filledArray.add(12345.3564);
278 filledArray.add(1.4);
280 assertEquals(HMMFile.fillList(scanner2, 5), filledArray);
286 public void testParseModel() throws IOException
288 FileReader fr = new FileReader(made1.getDataObject());
289 BufferedReader br = new BufferedReader(fr);
290 HiddenMarkovModel testHMM = new HiddenMarkovModel();
291 for (int i = 0; i < 24; i++)
295 made1.parseModel(br);
296 testHMM = made1.getHmm();
300 assertEquals(testHMM.getMatchEmission(0, 2), 1.62906);
301 assertEquals(testHMM.getMatchEmission(2, 1), 2.37873);
302 assertEquals(testHMM.getMatchEmission(12, 2), 2.61355);
303 assertEquals(testHMM.getMatchEmission(26, 0), 1.86925);
304 assertEquals(testHMM.getMatchEmission(32, 3), 2.58263);
305 assertEquals(testHMM.getMatchEmission(59, 3), 2.20507);
306 assertEquals(testHMM.getMatchEmission(63, 0), 0.41244);
307 assertEquals(testHMM.getMatchEmission(69, 1), 3.17398);
308 assertEquals(testHMM.getMatchEmission(76, 2), 2.65861);
310 assertEquals(testHMM.getInsertEmission(0, 1), 1.38629);
311 assertEquals(testHMM.getInsertEmission(1, 2), 1.38629);
312 assertEquals(testHMM.getInsertEmission(31, 3), 1.28150);
313 assertEquals(testHMM.getInsertEmission(43, 0), 1.32290);
314 assertEquals(testHMM.getInsertEmission(48, 2), 1.52606);
315 assertEquals(testHMM.getInsertEmission(52, 1), 1.62259);
316 assertEquals(testHMM.getInsertEmission(67, 0), 1.38141);
317 assertEquals(testHMM.getInsertEmission(70, 3), 1.38629);
318 assertEquals(testHMM.getInsertEmission(80, 3), 1.38629);
320 assertEquals(testHMM.getStateTransition(2, 0), 0.03725);
321 assertEquals(testHMM.getStateTransition(6, 1), 3.89715);
322 assertEquals(testHMM.getStateTransition(9, 3), 1.38021);
323 assertEquals(testHMM.getStateTransition(20, 4), 0.23815);
324 assertEquals(testHMM.getStateTransition(34, 6), 0.33363);
325 assertEquals(testHMM.getStateTransition(46, 5), 1.05474);
326 assertEquals(testHMM.getStateTransition(57, 6), 0.31164);
327 assertEquals(testHMM.getStateTransition(68, 2), 3.99242);
328 assertEquals(testHMM.getStateTransition(80, 6),
329 Double.NEGATIVE_INFINITY);
334 public void testParseAnnotations()
336 HMMFile testFile = new HMMFile("H:/EmptyFile.hmm");
337 testFile.hmm.getNodes().add(new HMMNode());
338 testFile.hmm.getNodes().add(new HMMNode());
340 testFile.hmm.setConsensusResidueStatus(true);
341 testFile.hmm.setMAPStatus(true);
342 testFile.hmm.setReferenceAnnotationStatus(true);
343 testFile.hmm.setConsensusStructureStatus(true);
344 testFile.hmm.setMaskedValueStatus(true);
345 Scanner scanner = new Scanner("1345 t t t t");
346 testFile.parseAnnotations(scanner, 0);
347 assertEquals(testFile.hmm.getNodeAlignmentColumn(0).intValue(), 1345);
348 assertEquals(testFile.hmm.getConsensusResidue(0), 't');
349 assertEquals(testFile.hmm.getReferenceAnnotation(0), 't');
350 assertEquals(testFile.hmm.getMaskedValue(0), 't');
351 assertEquals(testFile.hmm.getConsensusStructure(0), 't');
355 testFile.hmm.setConsensusResidueStatus(true);
356 testFile.hmm.setMAPStatus(false);
357 testFile.hmm.setReferenceAnnotationStatus(true);
358 testFile.hmm.setConsensusStructureStatus(false);
359 testFile.hmm.setMaskedValueStatus(false);
360 Scanner scanner2 = new Scanner("- y x - -");
361 testFile.parseAnnotations(scanner2, 1);
362 assertNull(testFile.hmm.getNodeAlignmentColumn(1));
363 assertEquals(testFile.hmm.getConsensusResidue(1), 'y');
364 assertEquals(testFile.hmm.getReferenceAnnotation(1), 'x');
365 assertEquals(testFile.hmm.getMaskedValue(1), '-');
366 assertEquals(testFile.hmm.getConsensusStructure(1), '-');
372 public void testExportFile() throws IOException
375 fn3.exportFile("H:/WriteFileTest.hmm");
379 public void testAppendFileProperties()
381 StringBuilder testBuilder = new StringBuilder();
382 fn3.appendFileProperties(testBuilder);
383 Scanner testScanner = new Scanner(testBuilder.toString());
385 String[] expected = new String[] { "HMMER3/f [3.1b1 | May 2013]",
386 "NAME fn3", "ACC PF00041.13",
387 "DESC Fibronectin type III domain", "LENG 86", "ALPH amino",
388 "RF no", "MM no", "CONS yes", "CS yes", "MAP yes",
389 "DATE Fri Jun 20 08:22:31 2014", "NSEQ 106", "EFFN 11.415833",
390 "CKSUM 3564431818", "GA 8.00 7.20", "TC 8.00 7.20",
391 "NC 7.90 7.90", "STATS LOCAL MSV -9.4043 0.71847",
392 "STATS LOCAL VITERBI -9.7737 0.71847",
393 "STATS LOCAL FORWARD -3.8341 0.71847" };
395 for (String value : expected)
397 assertEquals(testScanner.nextLine(), value);
404 public void testAppendModel()
406 StringBuilder testBuilder = new StringBuilder();
407 fn3.appendModel(testBuilder);
408 String string = testBuilder.toString();
409 assertEquals(findValue(2, 2, 2, string), "4.42225");
410 assertEquals(findValue(12, 14, 1, string), "2.79307");
413 public String findValue(int symbolIndex, int nodeIndex, int line,
418 Scanner scanner = new Scanner(model);
422 for (int lineIndex = 0; lineIndex < line - 1; lineIndex++)
426 for (int node = 0; node < nodeIndex; node++)
433 for (int symbol = 0; symbol < symbolIndex; symbol++)
435 value = scanner.next();
436 if ("COMPO".equals(value))
440 else if (value.length() < 7)