JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / datamodel / CigarBase.js
1 Clazz.declarePackage ("jalview.datamodel");\r
2 Clazz.load (null, "jalview.datamodel.CigarBase", ["jalview.util.MessageManager", "java.lang.Error", "$.Exception", "$.StringBuffer", "java.util.Vector", "JU.AU"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.length = 0;\r
5 this._inc_length = 10;\r
6 this.operation = null;\r
7 this.range = null;\r
8 Clazz.instantialize (this, arguments);\r
9 }, jalview.datamodel, "CigarBase");\r
10 Clazz.makeConstructor (c$, \r
11 function () {\r
12 });\r
13 Clazz.defineMethod (c$, "getSequenceAndDeletions", \r
14 function (reference, GapChar) {\r
15 var rlength = 0;\r
16 var deletions = JU.AU.newInt2 (this.length);\r
17 var trunc_deletions = null;\r
18 var sq =  new StringBuffer ();\r
19 var cursor = 0;\r
20 var alcursor = 0;\r
21 var start = 0;\r
22 var startpos = 0;\r
23 var end = 0;\r
24 var endpos = 0;\r
25 var delcount = -1;\r
26 var consecutive_del = false;\r
27 if (this.length == 0) {\r
28 return null;\r
29 }if (reference != null) {\r
30 rlength = reference.length;\r
31 }var modstart = true;\r
32 for (var i = 0; i < this.length; i++) {\r
33 switch (this.operation[i]) {\r
34 case 'D':\r
35 if (!consecutive_del) {\r
36 deletions[++delcount] =  Clazz.newIntArray (-1, [cursor, 0, alcursor]);\r
37 }cursor += this.range[i];\r
38 deletions[delcount][1] = cursor - 1;\r
39 consecutive_del = true;\r
40 break;\r
41 case 'I':\r
42 consecutive_del = false;\r
43 for (var r = 0; r < this.range[i]; r++) {\r
44 sq.append (GapChar);\r
45 alcursor++;\r
46 }\r
47 break;\r
48 case 'M':\r
49 consecutive_del = false;\r
50 if (modstart) {\r
51 start = cursor;\r
52 startpos = alcursor;\r
53 modstart = false;\r
54 }if (reference != null) {\r
55 var sbend = cursor + this.range[i];\r
56 if (sbend > rlength) {\r
57 sq.append (reference.substring (cursor, rlength));\r
58 while (sbend-- >= rlength) {\r
59 sq.append (GapChar);\r
60 }\r
61 } else {\r
62 sq.append (reference.substring (cursor, sbend));\r
63 }}alcursor += this.range[i];\r
64 cursor += this.range[i];\r
65 end = cursor - 1;\r
66 endpos = alcursor;\r
67 break;\r
68 default:\r
69 throw  new Error (jalview.util.MessageManager.formatMessage ("error.unknown_seq_cigar_operation",  Clazz.newArray (-1, [ new StringBuffer (this.operation[i].charCodeAt (0)).toString ()])));\r
70 }\r
71 }\r
72 if (++delcount > 0) {\r
73 trunc_deletions =  Clazz.newIntArray (delcount, 0);\r
74 System.arraycopy (deletions, 0, trunc_deletions, 0, delcount);\r
75 }deletions = null;\r
76 return  Clazz.newArray (-1, [((reference != null) ? sq.toString () : null),  Clazz.newIntArray (-1, [start, startpos, end, endpos]), trunc_deletions]);\r
77 }, "~S,~S");\r
78 Clazz.defineMethod (c$, "compact_operations", \r
79 function () {\r
80 var i = 1;\r
81 if (this.operation == null) {\r
82 return;\r
83 }var last = this.operation[0];\r
84 while (i < this.length) {\r
85 if (last == this.operation[i]) {\r
86 this.range[i - 1] += this.range[i];\r
87 var r = this.length - i;\r
88 if (r > 0) {\r
89 System.arraycopy (this.range, i + 1, this.range, i, r);\r
90 System.arraycopy (this.operation, i + 1, this.operation, i, r);\r
91 }this.length--;\r
92 } else {\r
93 last = this.operation[i++];\r
94 }}\r
95 });\r
96 c$.parseCigarString = Clazz.defineMethod (c$, "parseCigarString", \r
97 function (cigarString) {\r
98 var ops = 0;\r
99 for (var i = 0, l = cigarString.length; i < l; i++) {\r
100 var c = cigarString.charAt (i);\r
101 if (c == 'M' || c.charCodeAt (0) == (45) || c == 'I' || c.charCodeAt (0) == (41) || c == 'D' || c.charCodeAt (0) == (36)) {\r
102 ops++;\r
103 }}\r
104 var operation =  Clazz.newCharArray (ops, '\0');\r
105 var range =  Clazz.newIntArray (ops, 0);\r
106 var op = 0;\r
107 var i = 0;\r
108 var l = cigarString.length;\r
109 while (i < l) {\r
110 var c;\r
111 var j = i;\r
112 do {\r
113 c = cigarString.charAt (j++);\r
114 } while (c >= '0' && c <= '9' && j < l);\r
115 if (j >= l && c >= '0' && c <= '9') {\r
116 throw  new Exception (jalview.util.MessageManager.getString ("exception.unterminated_cigar_string"));\r
117 }try {\r
118 var rangeint = cigarString.substring (i, j - 1);\r
119 range[op] = Integer.parseInt (rangeint);\r
120 i = j;\r
121 } catch (e) {\r
122 if (Clazz.exceptionOf (e, Exception)) {\r
123 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_bug_parse_cigar_string"));\r
124 } else {\r
125 throw e;\r
126 }\r
127 }\r
128 if (c >= 'a' && c <= 'z') {\r
129 c = String.fromCharCode (c.charCodeAt (0) - 32);\r
130 }if ((c == 'M' || c == 'I' || c == 'D')) {\r
131 operation[op++] = c;\r
132 } else {\r
133 throw  new Exception (jalview.util.MessageManager.formatMessage ("exception.unexpected_operation_cigar_string_pos",  Clazz.newArray (-1, [ new StringBuffer (c.charCodeAt (0)).toString (), Integer.$valueOf (i).toString (), cigarString])));\r
134 }}\r
135 return  Clazz.newArray (-1, [operation, range]);\r
136 }, "~S");\r
137 Clazz.defineMethod (c$, "addOperation", \r
138 function (op, range) {\r
139 if (op >= 'a' && op <= 'z') {\r
140 op = String.fromCharCode (op.charCodeAt (0) - 32);\r
141 }if (op != 'M' && op != 'D' && op != 'I') {\r
142 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_invalid_operation_string"));\r
143 }if (range == 0) {\r
144 return;\r
145 }if (range < 0) {\r
146 throw  new Error (jalview.util.MessageManager.getString ("error.invalid_range_string"));\r
147 }var lngth = 0;\r
148 if (this.operation == null) {\r
149 this.operation =  Clazz.newCharArray (this._inc_length, '\0');\r
150 this.range =  Clazz.newIntArray (this._inc_length, 0);\r
151 }if (this.length + 1 == this.operation.length) {\r
152 var ops = this.operation;\r
153 this.operation =  Clazz.newCharArray (this.length + 1 + this._inc_length, '\0');\r
154 System.arraycopy (ops, 0, this.operation, 0, this.length);\r
155 ops = null;\r
156 var rng = this.range;\r
157 this.range =  Clazz.newIntArray (this.length + 1 + this._inc_length, 0);\r
158 System.arraycopy (rng, 0, this.range, 0, this.length);\r
159 rng = null;\r
160 }if ((this.length > 0) && (this.operation[this.length - 1] == op)) {\r
161 this.length--;\r
162 } else {\r
163 this.range[this.length] = 0;\r
164 }this.operation[this.length] = op;\r
165 this.range[this.length++] += range;\r
166 }, "~S,~N");\r
167 Clazz.defineMethod (c$, "deleteRange", \r
168 function (start, end) {\r
169 var deleted = 0;\r
170 if (this.length == 0) {\r
171 return deleted;\r
172 }if (start < 0 || start > end) {\r
173 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_delete_range_out_of_bounds"));\r
174 }var cursor = 0;\r
175 var rlength = 1 + end - start;\r
176 var oldlen = this.length;\r
177 var o = 0;\r
178 var editing = false;\r
179 var oldops = this.operation;\r
180 var oldrange = this.range;\r
181 this.length = 0;\r
182 this.operation = null;\r
183 this.range = null;\r
184 this.compact_operations ();\r
185 while (o < oldlen && cursor <= end && rlength > 0) {\r
186 if (oldops[o] == 'D') {\r
187 this.addDeleted (oldrange[o++]);\r
188 continue;\r
189 }var remain = oldrange[o];\r
190 if (!editing) {\r
191 if ((cursor + remain) <= start) {\r
192 this.addOperation (oldops[o], oldrange[o]);\r
193 cursor += oldrange[o++];\r
194 continue;\r
195 }editing = true;\r
196 if (start - cursor > 0) {\r
197 this.addOperation (oldops[o], start - cursor);\r
198 remain -= start - cursor;\r
199 }}if (o < oldlen && editing && rlength > 0 && remain > 0) {\r
200 switch (oldops[o]) {\r
201 case 'M':\r
202 if (rlength > remain) {\r
203 this.addDeleted (remain);\r
204 deleted += remain;\r
205 } else {\r
206 deleted += rlength;\r
207 this.addDeleted (rlength);\r
208 if (remain - rlength > 0) {\r
209 this.addOperation ('M', remain - rlength);\r
210 }rlength = 0;\r
211 remain = 0;\r
212 }break;\r
213 case 'I':\r
214 if (remain - rlength > 0) {\r
215 this.addInsertion (remain - rlength);\r
216 rlength = 0;\r
217 }break;\r
218 case 'D':\r
219 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error"));\r
220 default:\r
221 throw  new Error (jalview.util.MessageManager.formatMessage ("error.implementation_error_unknown_operation",  Clazz.newArray (-1, [ new StringBuffer (oldops[o].charCodeAt (0)).toString ()])));\r
222 }\r
223 rlength -= remain;\r
224 remain = oldrange[++o];\r
225 }}\r
226 while (o < oldlen) {\r
227 this.addOperation (oldops[o], oldrange[o++]);\r
228 }\r
229 return deleted;\r
230 }, "~N,~N");\r
231 Clazz.defineMethod (c$, "hasDeletedRegions", \r
232 function () {\r
233 for (var i = 0; i < this.length; i++) {\r
234 if (this.operation[i] == 'D') {\r
235 return true;\r
236 }}\r
237 return false;\r
238 });\r
239 Clazz.defineMethod (c$, "getDeletedRegions", \r
240 function () {\r
241 if (this.length == 0) {\r
242 return null;\r
243 }var dr =  new java.util.Vector ();\r
244 var cursor = 0;\r
245 var vcursor = 0;\r
246 for (var i = 0; i < this.length; i++) {\r
247 switch (this.operation[i]) {\r
248 case 'M':\r
249 cursor += this.range[i];\r
250 case 'I':\r
251 vcursor += this.range[i];\r
252 break;\r
253 case 'D':\r
254 dr.addElement ( Clazz.newIntArray (-1, [vcursor, cursor, this.range[i]]));\r
255 cursor += this.range[i];\r
256 }\r
257 }\r
258 if (dr.size () == 0) {\r
259 return null;\r
260 }var delregions =  Clazz.newIntArray (dr.size () * 3, 0);\r
261 for (var i = 0, l = dr.size (); i < l; i++) {\r
262 var reg = dr.elementAt (i);\r
263 delregions[i * 3] = reg[0];\r
264 delregions[i * 3 + 1] = reg[1];\r
265 delregions[i * 3 + 2] = reg[2];\r
266 }\r
267 return delregions;\r
268 });\r
269 Clazz.defineMethod (c$, "getFullWidth", \r
270 function () {\r
271 var w = 0;\r
272 if (this.range != null) {\r
273 for (var i = 0; i < this.length; i++) {\r
274 w += this.range[i];\r
275 }\r
276 }return w;\r
277 });\r
278 Clazz.defineMethod (c$, "getWidth", \r
279 function () {\r
280 var w = 0;\r
281 if (this.range != null) {\r
282 for (var i = 0; i < this.length; i++) {\r
283 if (this.operation[i] == 'M' || this.operation[i] == 'I') {\r
284 w += this.range[i];\r
285 }}\r
286 }return w;\r
287 });\r
288 Clazz.defineMethod (c$, "addInsertion", \r
289 function (range) {\r
290 this.addOperation ('I', range);\r
291 }, "~N");\r
292 Clazz.defineMethod (c$, "addDeleted", \r
293 function (range) {\r
294 this.addOperation ('D', range);\r
295 }, "~N");\r
296 Clazz.defineMethod (c$, "getCigarstring", \r
297 function () {\r
298 var cigarString =  new StringBuffer ();\r
299 for (var i = 0; i < this.length; i++) {\r
300 cigarString.append ("" + this.range[i]);\r
301 cigarString.append (this.operation[i]);\r
302 }\r
303 return cigarString.toString ();\r
304 });\r
305 Clazz.defineStatics (c$,\r
306 "D", 'D',\r
307 "I", 'I',\r
308 "M", 'M',\r
309 "_case_shift", String.fromCharCode (32));\r
310 });\r