9beaab060c684163efd9d59f2808c180cdf550fd
[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.File;
11 import java.io.FileReader;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Scanner;
16
17 import org.testng.annotations.Test;
18
19 public class HMMFileTest {
20
21   HMMFile fn3 = new HMMFile("H:/fn3.hmm");
22
23   HMMFile emptyFile = new HMMFile("H:/EmptyFile.hmm");
24
25   HMMFile pKinase = new HMMFile("H:/Pkinase.hmm");
26
27   HMMFile made1 = new HMMFile("H:/MADE1.hmm");
28
29   @Test
30   public void testParse() throws IOException
31   {
32
33     pKinase.parse();
34
35     assertEquals(pKinase.hmm.getName(), "Pkinase");
36     assertEquals(pKinase.hmm.getAccessionNumber(), "PF00069.17");
37     assertEquals(pKinase.hmm.getDescription(), "Protein kinase domain");
38     assertEquals(pKinase.hmm.getLength().intValue(), 260);
39     assertNull(pKinase.hmm.getMaxInstanceLength());
40     assertEquals(pKinase.hmm.getAlphabetType(), "amino");
41     assertEquals(pKinase.hmm.referenceAnnotationIsActive(), false);
42     assertEquals(pKinase.hmm.maskValueIsActive(), false);
43     assertEquals(pKinase.hmm.consensusResidueIsActive(), true);
44     assertEquals(pKinase.hmm.consensusStructureIsActive(),
45             true);
46     assertEquals(pKinase.hmm.mapIsActive(), true);
47     assertEquals(pKinase.hmm.getDate(), "Thu Jun 16 11:44:06 2011");
48     assertNull(pKinase.hmm.getCommandLineLog());
49     assertEquals(pKinase.hmm.getNumberOfSequences().intValue(), 54);
50     assertEquals(pKinase.hmm.getEffectiveNumberOfSequences(), 3.358521, 4d);
51     assertEquals(pKinase.hmm.getCheckSum().longValue(), 3106786190l);
52     assertEquals(pKinase.hmm.getGatheringThreshold(), "70.30 70.30");
53     assertEquals(pKinase.hmm.getTrustedCutoff(), "70.30 70.30");
54     assertEquals(pKinase.hmm.getNoiseCutoff(), "70.20 70.20");
55
56     List<Character> symbols = new ArrayList<>();
57     symbols.add('A');
58     symbols.add('C');
59     symbols.add('D');
60     symbols.add('E');
61     symbols.add('F');
62     symbols.add('G');
63     symbols.add('H');
64     symbols.add('I');
65     symbols.add('K');
66     symbols.add('L');
67     symbols.add('M');
68     symbols.add('N');
69     symbols.add('P');
70     symbols.add('Q');
71     symbols.add('R');
72     symbols.add('S');
73     symbols.add('T');
74     symbols.add('V');
75     symbols.add('W');
76     symbols.add('Y');
77
78     assertEquals(pKinase.hmm.getSymbols(), symbols);
79
80     assertEquals(pKinase.hmm.getMatchEmission(0, 19), 3.43274);
81     assertEquals(pKinase.hmm.getMatchEmission(12, 12), 4.33979);
82     assertEquals(pKinase.hmm.getMatchEmission(23, 7), 3.65600);
83     assertEquals(pKinase.hmm.getMatchEmission(54, 1), 4.76187);
84     assertEquals(pKinase.hmm.getMatchEmission(79, 0), 2.81579);
85     assertEquals(pKinase.hmm.getMatchEmission(100, 0), 1.86496);
86     assertEquals(pKinase.hmm.getMatchEmission(112, 14), 2.77179);
87     assertEquals(pKinase.hmm.getMatchEmission(143, 17), 5.10478);
88     assertEquals(pKinase.hmm.getMatchEmission(156, 4), 4.69372);
89     assertEquals(pKinase.hmm.getMatchEmission(178, 3), 2.52594);
90     assertEquals(pKinase.hmm.getMatchEmission(210, 2), 4.23598);
91     assertEquals(pKinase.hmm.getMatchEmission(260, 19), 3.81122);
92
93     assertEquals(pKinase.hmm.getInsertEmission(2, 1), 4.42225);
94     assertEquals(pKinase.hmm.getInsertEmission(15, 6), 3.72501);
95     assertEquals(pKinase.hmm.getInsertEmission(22, 9), 2.69355);
96     assertEquals(pKinase.hmm.getInsertEmission(57, 2), 2.77519);
97     assertEquals(pKinase.hmm.getInsertEmission(62, 14), 2.89801);
98     assertEquals(pKinase.hmm.getInsertEmission(95, 17), 2.98532);
99     assertEquals(pKinase.hmm.getInsertEmission(105, 4), 3.46354);
100     assertEquals(pKinase.hmm.getInsertEmission(134, 1), 4.42225);
101     assertEquals(pKinase.hmm.getInsertEmission(143, 0), 2.68618);
102     assertEquals(pKinase.hmm.getInsertEmission(152, 16), 2.77519);
103     assertEquals(pKinase.hmm.getInsertEmission(203, 16), 2.77519);
104     assertEquals(pKinase.hmm.getInsertEmission(255, 12), 2.73739);
105
106     assertEquals(pKinase.hmm.getStateTransition(0, 6),
107             Double.NEGATIVE_INFINITY);
108     assertEquals(pKinase.hmm.getStateTransition(3, 6), 0.95510);
109     assertEquals(pKinase.hmm.getStateTransition(29, 3), 0.61958);
110     assertEquals(pKinase.hmm.getStateTransition(46, 4), 0.77255);
111     assertEquals(pKinase.hmm.getStateTransition(53, 1), 5.01631);
112     assertEquals(pKinase.hmm.getStateTransition(79, 2), 5.73865);
113     assertEquals(pKinase.hmm.getStateTransition(101, 2), 5.73865);
114     assertEquals(pKinase.hmm.getStateTransition(120, 5), 0.48576);
115     assertEquals(pKinase.hmm.getStateTransition(146, 5), 0.70219);
116     assertEquals(pKinase.hmm.getStateTransition(169, 3), 1.23224);
117     assertEquals(pKinase.hmm.getStateTransition(209, 0), 0.01003);
118     assertEquals(pKinase.hmm.getStateTransition(243, 1), 5.01631);
119
120     assertEquals(pKinase.hmm.getNodeAlignmentColumn(3).intValue(), 3);
121     assertEquals(pKinase.hmm.getReferenceAnnotation(7), '-');
122     assertEquals(pKinase.hmm.getConsensusResidue(23), 't');
123     assertEquals(pKinase.hmm.getMaskedValue(30), '-');
124     assertEquals(pKinase.hmm.getConsensusStructure(56), 'S');
125
126     assertEquals(pKinase.hmm.getNodeAlignmentColumn(78).intValue(), 136);
127     assertEquals(pKinase.hmm.getReferenceAnnotation(93), '-');
128     assertEquals(pKinase.hmm.getConsensusResidue(145), 'a');
129     assertEquals(pKinase.hmm.getMaskedValue(183), '-');
130     assertEquals(pKinase.hmm.getConsensusStructure(240), 'H');
131
132   }
133
134   @Test
135   public void testParseFileProperties() throws IOException
136   {
137     FileReader fr = new FileReader(fn3.getDataObject());
138     BufferedReader br = new BufferedReader(fr);
139     fn3.parseFileProperties(br);
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   @Test
237   public void testGetTransitionType()
238   {
239
240     assertEquals(fn3.getTransitionType("mm").intValue(), 0);
241     assertEquals(fn3.getTransitionType("mi").intValue(), 1);
242     assertEquals(fn3.getTransitionType("md").intValue(), 2);
243     assertEquals(fn3.getTransitionType("im").intValue(), 3);
244     assertEquals(fn3.getTransitionType("ii").intValue(), 4);
245     assertEquals(fn3.getTransitionType("dm").intValue(), 5);
246     assertEquals(fn3.getTransitionType("dd").intValue(), 6);
247     assertNull(fn3.getTransitionType("df"));
248
249   }
250
251   @Test
252   public void testFillList()
253   {
254     Scanner scanner1 = new Scanner("1.3 2.4 5.3 3.9 9.8 4.7 4.3 2.3 6.9");
255     ArrayList<Double> filledArray = new ArrayList<>();
256
257     filledArray.add(1.3);
258     filledArray.add(2.4);
259     filledArray.add(5.3);
260     filledArray.add(3.9);
261     filledArray.add(9.8);
262     filledArray.add(4.7);
263     filledArray.add(4.3);
264     filledArray.add(2.3);
265     filledArray.add(6.9);
266
267     assertEquals(HMMFile.fillList(scanner1, 9), filledArray);
268     filledArray.clear();
269     scanner1.close();
270
271     Scanner scanner2 = new Scanner(
272             "1.346554 5.58756754 35.3523645 12345.3564 1.4");
273     filledArray.add(1.346554);
274     filledArray.add(5.58756754);
275     filledArray.add(35.3523645);
276     filledArray.add(12345.3564);
277     filledArray.add(1.4);
278
279     assertEquals(HMMFile.fillList(scanner2, 5), filledArray);
280     scanner2.close();
281
282   }
283
284   @Test
285   public void testParseModel() throws IOException
286   {
287     FileReader fr = new FileReader(made1.getDataObject());
288     BufferedReader br = new BufferedReader(fr);
289     HiddenMarkovModel testHMM = new HiddenMarkovModel();
290     for (int i = 0; i < 24; i++)
291     {
292       br.readLine();
293     }
294     made1.parseModel(br);
295     testHMM = made1.getHmm();
296     br.close();
297     fr.close();
298
299     assertEquals(testHMM.getMatchEmission(0, 2), 1.62906);
300     assertEquals(testHMM.getMatchEmission(2, 1), 2.37873);
301     assertEquals(testHMM.getMatchEmission(12, 2), 2.61355);
302     assertEquals(testHMM.getMatchEmission(26, 0), 1.86925);
303     assertEquals(testHMM.getMatchEmission(32, 3), 2.58263);
304     assertEquals(testHMM.getMatchEmission(59, 3), 2.20507);
305     assertEquals(testHMM.getMatchEmission(63, 0), 0.41244);
306     assertEquals(testHMM.getMatchEmission(69, 1), 3.17398);
307     assertEquals(testHMM.getMatchEmission(76, 2), 2.65861);
308
309     assertEquals(testHMM.getInsertEmission(0, 1), 1.38629);
310     assertEquals(testHMM.getInsertEmission(1, 2), 1.38629);
311     assertEquals(testHMM.getInsertEmission(31, 3), 1.28150);
312     assertEquals(testHMM.getInsertEmission(43, 0), 1.32290);
313     assertEquals(testHMM.getInsertEmission(48, 2), 1.52606);
314     assertEquals(testHMM.getInsertEmission(52, 1), 1.62259);
315     assertEquals(testHMM.getInsertEmission(67, 0), 1.38141);
316     assertEquals(testHMM.getInsertEmission(70, 3), 1.38629);
317     assertEquals(testHMM.getInsertEmission(80, 3), 1.38629);
318
319     assertEquals(testHMM.getStateTransition(2, 0), 0.03725);
320     assertEquals(testHMM.getStateTransition(6, 1), 3.89715);
321     assertEquals(testHMM.getStateTransition(9, 3), 1.38021);
322     assertEquals(testHMM.getStateTransition(20, 4), 0.23815);
323     assertEquals(testHMM.getStateTransition(34, 6), 0.33363);
324     assertEquals(testHMM.getStateTransition(46, 5), 1.05474);
325     assertEquals(testHMM.getStateTransition(57, 6), 0.31164);
326     assertEquals(testHMM.getStateTransition(68, 2), 3.99242);
327     assertEquals(testHMM.getStateTransition(80, 6),
328             Double.NEGATIVE_INFINITY);
329
330   }
331
332   @Test
333   public void testParseAnnotations()
334   {
335     HMMFile testFile = new HMMFile("H:/EmptyFile.hmm");
336     testFile.hmm.getNodes().add(new HMMNode());
337     testFile.hmm.getNodes().add(new HMMNode());
338
339     testFile.hmm.setConsensusResidueStatus(true);
340     testFile.hmm.setMAPStatus(true);
341     testFile.hmm.setReferenceAnnotationStatus(true);
342     testFile.hmm.setConsensusStructureStatus(true);
343     testFile.hmm.setMaskedValueStatus(true);
344     Scanner scanner = new Scanner("1345 t t t t");
345     testFile.parseAnnotations(scanner, 0);
346     assertEquals(testFile.hmm.getNodeAlignmentColumn(0).intValue(), 1345);
347     assertEquals(testFile.hmm.getConsensusResidue(0), 't');
348     assertEquals(testFile.hmm.getReferenceAnnotation(0), 't');
349     assertEquals(testFile.hmm.getMaskedValue(0), 't');
350     assertEquals(testFile.hmm.getConsensusStructure(0), 't');
351
352     scanner.close();
353
354     testFile.hmm.setConsensusResidueStatus(true);
355     testFile.hmm.setMAPStatus(false);
356     testFile.hmm.setReferenceAnnotationStatus(true);
357     testFile.hmm.setConsensusStructureStatus(false);
358     testFile.hmm.setMaskedValueStatus(false);
359     Scanner scanner2 = new Scanner("- y x - -");
360     testFile.parseAnnotations(scanner2, 1);
361     assertNull(testFile.hmm.getNodeAlignmentColumn(1));
362     assertEquals(testFile.hmm.getConsensusResidue(1), 'y');
363     assertEquals(testFile.hmm.getReferenceAnnotation(1), 'x');
364     assertEquals(testFile.hmm.getMaskedValue(1), '-');
365     assertEquals(testFile.hmm.getConsensusStructure(1), '-');
366
367     scanner2.close();
368   }
369
370   @Test(priority = 2)
371   public void testExportFile() throws IOException
372   {
373     File file = new File(fn3.getDataObject());
374     FileReader fr = new FileReader(file);
375     BufferedReader br = new BufferedReader(fr);
376     for (int i = 0; i < 23; i++)
377     {
378       br.readLine();
379     }
380     fn3.parseModel(br);
381     fn3.exportFile("H:/WriteFileTest.hmm");
382   }
383
384   @Test(priority = 1)
385   public void testAppendFileProperties()
386   {
387     StringBuilder testBuilder = new StringBuilder();
388     fn3.appendFileProperties(testBuilder);
389     Scanner testScanner = new Scanner(testBuilder.toString());
390
391     String[] expected = new String[] { "HMMER3/f [3.1b1 | May 2013]",
392         "NAME  fn3", "ACC   PF00041.13",
393         "DESC  Fibronectin type III domain", "LENG  86", "ALPH  amino",
394         "RF    no", "MM    no", "CONS  yes", "CS    yes", "MAP   yes",
395         "DATE  Fri Jun 20 08:22:31 2014", "NSEQ  106", "EFFN  11.415833",
396         "CKSUM 3564431818", "GA    8.00 7.20", "TC    8.00 7.20",
397         "NC    7.90 7.90", "STATS LOCAL MSV       -9.4043  0.71847",
398         "STATS LOCAL VITERBI   -9.7737  0.71847",
399         "STATS LOCAL FORWARD   -3.8341  0.71847" };
400
401     for (String value : expected)
402     {
403       assertEquals(testScanner.nextLine(), value);
404     }
405
406     testScanner.close();
407   }
408
409   public moveAheadBy(Scanner scanner, int nodeChange, int indexChange)
410   {
411     for (int y = 0; y < nodeChange; y++)
412     {
413       
414     }
415   }
416 }