55e37219bb3a9731e7c872917dc1ee0c1655a65a
[jalview.git] / test / jalview / io / HMMFileTest.java
1 package jalview.io;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertNull;
5
6 import jalview.datamodel.HMMNode;
7 import jalview.datamodel.HiddenMarkovModel;
8
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;
15
16 import org.testng.annotations.Test;
17
18 public class HMMFileTest {
19
20   HMMFile fn3 = new HMMFile("H:/fn3.hmm");
21
22   HMMFile emptyFile = new HMMFile("H:/EmptyFile.hmm");
23
24   HMMFile pKinase = new HMMFile("H:/Pkinase.hmm");
25
26   HMMFile made1 = new HMMFile("H:/MADE1.hmm");
27
28   @Test
29   public void testParse() throws IOException
30   {
31
32     pKinase.parse();
33
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(),
44             true);
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");
54
55     List<Character> symbols = new ArrayList<>();
56     symbols.add('A');
57     symbols.add('C');
58     symbols.add('D');
59     symbols.add('E');
60     symbols.add('F');
61     symbols.add('G');
62     symbols.add('H');
63     symbols.add('I');
64     symbols.add('K');
65     symbols.add('L');
66     symbols.add('M');
67     symbols.add('N');
68     symbols.add('P');
69     symbols.add('Q');
70     symbols.add('R');
71     symbols.add('S');
72     symbols.add('T');
73     symbols.add('V');
74     symbols.add('W');
75     symbols.add('Y');
76
77     assertEquals(pKinase.hmm.getSymbols(), symbols);
78
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);
91
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);
104
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);
118
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');
124
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');
130
131   }
132
133   @Test
134   public void testParseFileProperties() throws IOException
135   {
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();
142     br.close();
143     fr.close();
144
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");
168
169     FileReader fr2 = new FileReader(emptyFile.getDataObject());
170     BufferedReader br2 = new BufferedReader(fr2);
171     emptyFile.parseFileProperties(br2);
172     testHMM = emptyFile.getHmm();
173     br2.close();
174     fr2.close();
175
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(),
186             false);
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());
202
203     FileReader fr3 = new FileReader(made1.getDataObject());
204     BufferedReader br3 = new BufferedReader(fr3);
205     made1.parseFileProperties(br3);
206     testHMM = made1.getHmm();
207     br3.close();
208     fr3.close();
209
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");
233
234
235   }
236
237   @Test
238   public void testGetTransitionType()
239   {
240
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"));
249
250   }
251
252   @Test
253   public void testFillList()
254   {
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<>();
257
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);
267
268     assertEquals(HMMFile.fillList(scanner1, 9), filledArray);
269     filledArray.clear();
270     scanner1.close();
271
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);
279
280     assertEquals(HMMFile.fillList(scanner2, 5), filledArray);
281     scanner2.close();
282
283   }
284
285   @Test
286   public void testParseModel() throws IOException
287   {
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++)
292     {
293       br.readLine();
294     }
295     made1.parseModel(br);
296     testHMM = made1.getHmm();
297     br.close();
298     fr.close();
299
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);
309
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);
319
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);
330
331   }
332
333   @Test
334   public void testParseAnnotations()
335   {
336     HMMFile testFile = new HMMFile("H:/EmptyFile.hmm");
337     testFile.hmm.getNodes().add(new HMMNode());
338     testFile.hmm.getNodes().add(new HMMNode());
339
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');
352
353     scanner.close();
354
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), '-');
367
368     scanner2.close();
369   }
370
371   @Test(priority = 3)
372   public void testExportFile() throws IOException
373   {
374
375     fn3.exportFile("H:/WriteFileTest.hmm");
376   }
377
378   @Test(priority = 1)
379   public void testAppendFileProperties()
380   {
381     StringBuilder testBuilder = new StringBuilder();
382     fn3.appendFileProperties(testBuilder);
383     Scanner testScanner = new Scanner(testBuilder.toString());
384
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" };
394
395     for (String value : expected)
396     {
397       assertEquals(testScanner.nextLine(), value);
398     }
399
400     testScanner.close();
401   }
402
403   @Test(priority = 2)
404   public void testAppendModel()
405   {
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");
411   }
412
413   public String findValue(int symbolIndex, int nodeIndex, int line,
414           String model)
415   {
416
417     String value = "";
418     Scanner scanner = new Scanner(model);
419     scanner.nextLine();
420     scanner.nextLine();
421
422     for (int lineIndex = 0; lineIndex < line - 1; lineIndex++)
423     {
424       scanner.nextLine();
425     }
426     for (int node = 0; node < nodeIndex; node++)
427     {
428       scanner.nextLine();
429       scanner.nextLine();
430       scanner.nextLine();
431     }
432
433     for (int symbol = 0; symbol < symbolIndex; symbol++)
434     {
435       value = scanner.next();
436       if ("COMPO".equals(value))
437       {
438         scanner.next();
439       }
440       else if (value.length() < 7)
441       {
442         scanner.next();
443       }
444
445     }
446     return value;
447
448   }
449
450 }
451