JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / io / MSFfile.js
1 Clazz.declarePackage ("jalview.io");\r
2 Clazz.load (["jalview.io.AlignFile"], "jalview.io.MSFfile", ["jalview.datamodel.Sequence", "jalview.util.Comparison", "$.Format", "java.lang.StringBuffer", "java.util.Hashtable", "$.StringTokenizer", "$.Vector"], function () {\r
3 c$ = Clazz.declareType (jalview.io, "MSFfile", jalview.io.AlignFile);\r
4 Clazz.makeConstructor (c$, \r
5 function () {\r
6 Clazz.superConstructor (this, jalview.io.MSFfile, []);\r
7 });\r
8 Clazz.overrideMethod (c$, "parse", \r
9 function () {\r
10 var i = 0;\r
11 var seqFlag = false;\r
12 var key =  String.instantialize ();\r
13 var headers =  new java.util.Vector ();\r
14 var seqhash =  new java.util.Hashtable ();\r
15 var line;\r
16 try {\r
17 while ((line = this.nextLine ()) != null) {\r
18 var str =  new java.util.StringTokenizer (line);\r
19 while (str.hasMoreTokens ()) {\r
20 var inStr = str.nextToken ();\r
21 if (inStr.indexOf ("Name:") != -1) {\r
22 key = str.nextToken ();\r
23 headers.addElement (key);\r
24 }if (inStr.indexOf ("//") != -1) {\r
25 seqFlag = true;\r
26 }if ((inStr.indexOf ("//") == -1) && (seqFlag == true)) {\r
27 key = inStr;\r
28 var tempseq;\r
29 if (seqhash.containsKey (key)) {\r
30 tempseq = seqhash.get (key);\r
31 } else {\r
32 tempseq =  new StringBuffer ();\r
33 seqhash.put (key, tempseq);\r
34 }while (str.hasMoreTokens ()) {\r
35 tempseq.append (str.nextToken ());\r
36 }\r
37 }}\r
38 }\r
39 } catch (e) {\r
40 if (Clazz.exceptionOf (e, java.io.IOException)) {\r
41 System.err.println ("Exception parsing MSFFile " + e);\r
42 e.printStackTrace ();\r
43 } else {\r
44 throw e;\r
45 }\r
46 }\r
47 this.noSeqs = headers.size ();\r
48 for (i = 0; i < headers.size (); i++) {\r
49 if (seqhash.get (headers.elementAt (i)) != null) {\r
50 var head = headers.elementAt (i).toString ();\r
51 var seq = seqhash.get (head).toString ();\r
52 if (this.maxLength < head.length) {\r
53 this.maxLength = head.length;\r
54 }seq = seq.$replace ('~', '-');\r
55 var newSeq = this.parseId (head);\r
56 newSeq.setSequence (seq);\r
57 this.seqs.addElement (newSeq);\r
58 } else {\r
59 System.err.println ("MSFFile Parser: Can't find sequence for " + headers.elementAt (i));\r
60 }}\r
61 });\r
62 Clazz.defineMethod (c$, "checkSum", \r
63 function (seq) {\r
64 var check = 0;\r
65 var sequence = seq.toUpperCase ();\r
66 for (var i = 0; i < sequence.length; i++) {\r
67 try {\r
68 var value = sequence.charCodeAt (i);\r
69 if (value != -1) {\r
70 check += (i % 57 + 1) * value;\r
71 }} catch (e) {\r
72 if (Clazz.exceptionOf (e, Exception)) {\r
73 System.err.println ("Exception during MSF Checksum calculation");\r
74 e.printStackTrace ();\r
75 } else {\r
76 throw e;\r
77 }\r
78 }\r
79 }\r
80 return check % 10000;\r
81 }, "~S");\r
82 Clazz.defineMethod (c$, "print", \r
83 function (seqs) {\r
84 var is_NA = jalview.util.Comparison.isNucleotide (seqs);\r
85 var s =  new Array (seqs.length);\r
86 var out =  new StringBuffer ("!!" + (is_NA ? "NA" : "AA") + "_MULTIPLE_ALIGNMENT 1.0");\r
87 out.append (this.newline);\r
88 out.append (this.newline);\r
89 var max = 0;\r
90 var maxid = 0;\r
91 var i = 0;\r
92 while ((i < seqs.length) && (seqs[i] != null)) {\r
93 s[i] =  new jalview.datamodel.Sequence (seqs[i].getName (), seqs[i].getSequenceAsString ().$replace ('-', '.'), seqs[i].getStart (), seqs[i].getEnd ());\r
94 var sb =  new StringBuffer ();\r
95 sb.append (s[i].getSequence ());\r
96 for (var ii = 0; ii < sb.length (); ii++) {\r
97 if (sb.charAt (ii) == '.') {\r
98 sb.setCharAt (ii, '~');\r
99 } else {\r
100 break;\r
101 }}\r
102 for (var ii = sb.length () - 1; ii > 0; ii--) {\r
103 if (sb.charAt (ii) == '.') {\r
104 sb.setCharAt (ii, '~');\r
105 } else {\r
106 break;\r
107 }}\r
108 s[i].setSequence (sb.toString ());\r
109 if (s[i].getSequence ().length > max) {\r
110 max = s[i].getSequence ().length;\r
111 }i++;\r
112 }\r
113 var maxLenpad =  new jalview.util.Format ("%" + ( String.instantialize ("" + max)).length + "d");\r
114 var maxChkpad =  new jalview.util.Format ("%" + ( String.instantialize ("1" + max)).length + "d");\r
115 i = 0;\r
116 var bigChecksum = 0;\r
117 var checksums =  Clazz.newIntArray (s.length, 0);\r
118 while (i < s.length) {\r
119 checksums[i] = this.checkSum (s[i].getSequenceAsString ());\r
120 bigChecksum += checksums[i];\r
121 i++;\r
122 }\r
123 var maxNB = 0;\r
124 out.append ("   MSF: " + s[0].getSequence ().length + "   Type: " + (is_NA ? "N" : "P") + "    Check:  " + (bigChecksum % 10000) + "   ..");\r
125 out.append (this.newline);\r
126 out.append (this.newline);\r
127 out.append (this.newline);\r
128 var nameBlock =  new Array (s.length);\r
129 var idBlock =  new Array (s.length);\r
130 i = 0;\r
131 while ((i < s.length) && (s[i] != null)) {\r
132 nameBlock[i] =  String.instantialize ("  Name: " + this.printId (s[i]) + " ");\r
133 idBlock[i] =  String.instantialize ("Len: " + maxLenpad.formLong (s[i].getSequence ().length) + "  Check: " + maxChkpad.formLong (checksums[i]) + "  Weight: 1.00" + this.newline);\r
134 if (s[i].getName ().length > maxid) {\r
135 maxid = s[i].getName ().length;\r
136 }if (nameBlock[i].length > maxNB) {\r
137 maxNB = nameBlock[i].length;\r
138 }i++;\r
139 }\r
140 if (maxid < 10) {\r
141 maxid = 10;\r
142 }if (maxNB < 15) {\r
143 maxNB = 15;\r
144 }var nbFormat =  new jalview.util.Format ("%-" + maxNB + "s");\r
145 for (i = 0; (i < s.length) && (s[i] != null); i++) {\r
146 out.append (nbFormat.form (nameBlock[i]) + idBlock[i]);\r
147 }\r
148 maxid++;\r
149 out.append (this.newline);\r
150 out.append (this.newline);\r
151 out.append ("//");\r
152 out.append (this.newline);\r
153 out.append (this.newline);\r
154 var len = 50;\r
155 var nochunks = (Clazz.doubleToInt (max / len)) + 1;\r
156 if ((max % len) == 0) {\r
157 nochunks--;\r
158 }for (i = 0; i < nochunks; i++) {\r
159 var j = 0;\r
160 while ((j < s.length) && (s[j] != null)) {\r
161 var name = this.printId (s[j]);\r
162 out.append ( new jalview.util.Format ("%-" + maxid + "s").form (name + " "));\r
163 for (var k = 0; k < 5; k++) {\r
164 var start = (i * 50) + (k * 10);\r
165 var end = start + 10;\r
166 if ((end < s[j].getSequence ().length) && (start < s[j].getSequence ().length)) {\r
167 out.append (s[j].getSequence (start, end));\r
168 if (k < 4) {\r
169 out.append (" ");\r
170 } else {\r
171 out.append (this.newline);\r
172 }} else {\r
173 if (start < s[j].getSequence ().length) {\r
174 out.append (s[j].getSequenceAsString ().substring (start));\r
175 out.append (this.newline);\r
176 } else {\r
177 if (k == 0) {\r
178 out.append (this.newline);\r
179 }}}}\r
180 j++;\r
181 }\r
182 out.append (this.newline);\r
183 }\r
184 return out.toString ();\r
185 }, "~A");\r
186 Clazz.defineMethod (c$, "print", \r
187 function () {\r
188 return this.print (this.getSeqsAsArray ());\r
189 });\r
190 });\r