JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / io / PhylipFile.js
1 Clazz.declarePackage ("jalview.io");\r
2 Clazz.load (["jalview.io.AlignFile"], "jalview.io.PhylipFile", ["java.io.IOException", "java.lang.StringBuffer"], function () {\r
3 c$ = Clazz.declareType (jalview.io, "PhylipFile", jalview.io.AlignFile);\r
4 Clazz.overrideMethod (c$, "parse", \r
5 function () {\r
6 try {\r
7 var line = this.nextLine ();\r
8 var lineElements = line.trim ().$plit ("\\s+");\r
9 if (lineElements.length < 2) {\r
10 throw  new java.io.IOException ("First line must contain the number of specifies and number of characters");\r
11 }var numberSpecies = Integer.parseInt (lineElements[0]);\r
12 var numberCharacters = Integer.parseInt (lineElements[1]);\r
13 if (numberSpecies <= 0) {\r
14 return;\r
15 }var sequenceElements =  new Array (numberSpecies);\r
16 var sequences =  new Array (numberSpecies);\r
17 for (var i = 0; i < numberSpecies; i++) {\r
18 line = this.nextLine ();\r
19 var potentialName = line.substring (0, 10);\r
20 var tabIndex = potentialName.indexOf ('\t');\r
21 if (tabIndex == -1) {\r
22 sequenceElements[i] = this.parseId (this.validateName (potentialName));\r
23 sequences[i] =  new StringBuffer (this.removeWhitespace (line.substring (10)));\r
24 } else {\r
25 sequenceElements[i] = this.parseId (this.validateName (potentialName.substring (0, tabIndex)));\r
26 sequences[i] =  new StringBuffer (this.removeWhitespace (line.substring (tabIndex)));\r
27 }}\r
28 if ((sequences[0]).length () != numberCharacters) {\r
29 var i = 0;\r
30 for (line = this.nextLine (); line != null; line = this.nextLine ()) {\r
31 if (line.length > 0) {\r
32 sequences[i++].append (this.removeWhitespace (line));\r
33 }if (i == sequences.length) {\r
34 i = 0;\r
35 }}\r
36 }for (var i = 0; i < numberSpecies; i++) {\r
37 if (sequences[i].length () != numberCharacters) {\r
38 throw  new java.io.IOException (sequenceElements[i].getName () + " sequence is incorrect length - should be " + numberCharacters + " but is " + sequences[i].length ());\r
39 }sequenceElements[i].setSequence (sequences[i].toString ());\r
40 this.seqs.add (sequenceElements[i]);\r
41 }\r
42 } catch (e) {\r
43 if (Clazz.exceptionOf (e, java.io.IOException)) {\r
44 System.err.println ("Exception parsing PHYLIP file " + e);\r
45 e.printStackTrace (System.err);\r
46 throw e;\r
47 } else {\r
48 throw e;\r
49 }\r
50 }\r
51 });\r
52 Clazz.defineMethod (c$, "removeWhitespace", \r
53  function (txt) {\r
54 return txt.replaceAll ("\\s*", "");\r
55 }, "~S");\r
56 Clazz.defineMethod (c$, "validateName", \r
57  function (name) {\r
58 var invalidCharacters =  Clazz.newCharArray (-1, ['(', ')', '[', ']', ':', ';', ',']);\r
59 for (var c, $c = 0, $$c = invalidCharacters; $c < $$c.length && ((c = $$c[$c]) || true); $c++) {\r
60 if (name.indexOf (c) > -1) {\r
61 throw  new java.io.IOException ("Species name contains illegal character " + c);\r
62 }}\r
63 return name;\r
64 }, "~S");\r
65 Clazz.overrideMethod (c$, "print", \r
66 function () {\r
67 var sb =  new StringBuffer (Integer.toString (this.seqs.size ()));\r
68 sb.append (" ");\r
69 sb.append ((this.seqs.size () > 0) ? Integer.toString (this.seqs.get (0).getSequence ().length) : "0").append (this.newline);\r
70 var sequential = false;\r
71 var numInterleavedColumns = 60;\r
72 var sequenceLength = 0;\r
73 for (var s, $s = this.seqs.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {\r
74 var name = s.getName ();\r
75 if (name.length > 10) {\r
76 name = name.substring (0, 10);\r
77 } else {\r
78 name = String.format ("%1$-10s", [s.getName ()]);\r
79 }sb.append (name);\r
80 if (sequential) {\r
81 sb.append (s.getSequence ());\r
82 } else {\r
83 sequenceLength = s.getSequence ().length;\r
84 sb.append (s.getSequence (0, Math.min (numInterleavedColumns, sequenceLength)));\r
85 }sb.append (this.newline);\r
86 }\r
87 if (!sequential && sequenceLength > numInterleavedColumns) {\r
88 var numMatrics = Clazz.doubleToInt (sequenceLength / numInterleavedColumns);\r
89 if ((sequenceLength % numInterleavedColumns) > 0) {\r
90 numMatrics++;\r
91 }for (var i = 1; i < numMatrics; i++) {\r
92 sb.append (this.newline);\r
93 var start = i * numInterleavedColumns;\r
94 for (var s, $s = this.seqs.iterator (); $s.hasNext () && ((s = $s.next ()) || true);) {\r
95 sb.append (s.getSequence (start, Math.min (start + numInterleavedColumns, sequenceLength))).append (this.newline);\r
96 }\r
97 }\r
98 }return sb.toString ();\r
99 });\r
100 Clazz.defineStatics (c$,\r
101 "FILE_EXT", "phy",\r
102 "FILE_DESC", "PHYLIP");\r
103 });\r