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;
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;
17 import org.testng.annotations.Test;
19 public class HMMFileTest {
21 HMMFile fn3 = new HMMFile("H:/fn3.hmm");
23 HMMFile emptyFile = new HMMFile("H:/EmptyFile.hmm");
25 HMMFile pKinase = new HMMFile("H:/Pkinase.hmm");
27 HMMFile made1 = new HMMFile("H:/MADE1.hmm");
30 public void testParse() throws IOException
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(),
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");
56 List<Character> symbols = new ArrayList<>();
78 assertEquals(pKinase.hmm.getSymbols(), symbols);
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);
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);
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);
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');
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');
135 public void testParseFileProperties() throws IOException
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();
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");
237 public void testGetTransitionType()
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"));
252 public void testFillList()
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<>();
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);
267 assertEquals(HMMFile.fillList(scanner1, 9), filledArray);
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);
279 assertEquals(HMMFile.fillList(scanner2, 5), filledArray);
285 public void testParseModel() throws IOException
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++)
294 made1.parseModel(br);
295 testHMM = made1.getHmm();
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);
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);
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);
333 public void testParseAnnotations()
335 HMMFile testFile = new HMMFile("H:/EmptyFile.hmm");
336 testFile.hmm.getNodes().add(new HMMNode());
337 testFile.hmm.getNodes().add(new HMMNode());
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');
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), '-');
371 public void testExportFile() throws IOException
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++)
381 fn3.exportFile("H:/WriteFileTest.hmm");
385 public void testAppendFileProperties()
387 StringBuilder testBuilder = new StringBuilder();
388 fn3.appendFileProperties(testBuilder);
389 Scanner testScanner = new Scanner(testBuilder.toString());
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" };
401 for (String value : expected)
403 assertEquals(testScanner.nextLine(), value);
409 public moveAheadBy(Scanner scanner, int nodeChange, int indexChange)
411 for (int y = 0; y < nodeChange; y++)