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