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