1 Clazz.declarePackage ("jalview.datamodel");
\r
2 Clazz.load (null, "jalview.datamodel.CigarBase", ["jalview.util.MessageManager", "java.lang.Error", "$.Exception", "$.StringBuffer", "java.util.Vector", "javajs.util.AU"], function () {
\r
3 c$ = Clazz.decorateAsClass (function () {
\r
5 this._inc_length = 10;
\r
6 this.operation = null;
\r
8 Clazz.instantialize (this, arguments);
\r
9 }, jalview.datamodel, "CigarBase");
\r
10 Clazz.makeConstructor (c$,
\r
13 Clazz.defineMethod (c$, "getSequenceAndDeletions",
\r
14 function (reference, GapChar) {
\r
16 var deletions = javajs.util.AU.newInt2 (this.length);
\r
17 var trunc_deletions = null;
\r
18 var sq = new StringBuffer ();
\r
26 var consecutive_del = false;
\r
27 if (this.length == 0) {
\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
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
42 consecutive_del = false;
\r
43 for (var r = 0; r < this.range[i]; r++) {
\r
44 sq.append (GapChar);
\r
49 consecutive_del = false;
\r
52 startpos = alcursor;
\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
62 sq.append (reference.substring (cursor, sbend));
\r
63 }}alcursor += this.range[i];
\r
64 cursor += this.range[i];
\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
72 if (++delcount > 0) {
\r
73 trunc_deletions = Clazz.newIntArray (delcount, 0);
\r
74 System.arraycopy (deletions, 0, trunc_deletions, 0, delcount);
\r
76 return Clazz.newArray (-1, [((reference != null) ? sq.toString () : null), Clazz.newIntArray (-1, [start, startpos, end, endpos]), trunc_deletions]);
\r
78 Clazz.defineMethod (c$, "compact_operations",
\r
81 if (this.operation == null) {
\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
89 System.arraycopy (this.range, i + 1, this.range, i, r);
\r
90 System.arraycopy (this.operation, i + 1, this.operation, i, r);
\r
93 last = this.operation[i++];
\r
96 c$.parseCigarString = Clazz.defineMethod (c$, "parseCigarString",
\r
97 function (cigarString) {
\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
104 var operation = Clazz.newCharArray (ops, '\0');
\r
105 var range = Clazz.newIntArray (ops, 0);
\r
108 var l = cigarString.length;
\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
118 var rangeint = cigarString.substring (i, j - 1);
\r
119 range[op] = Integer.parseInt (rangeint);
\r
122 if (Clazz.exceptionOf (e, Exception)) {
\r
123 throw new Error (jalview.util.MessageManager.getString ("error.implementation_bug_parse_cigar_string"));
\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
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
135 return Clazz.newArray (-1, [operation, range]);
\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
146 throw new Error (jalview.util.MessageManager.getString ("error.invalid_range_string"));
\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
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
160 }if ((this.length > 0) && (this.operation[this.length - 1] == op)) {
\r
163 this.range[this.length] = 0;
\r
164 }this.operation[this.length] = op;
\r
165 this.range[this.length++] += range;
\r
167 Clazz.defineMethod (c$, "deleteRange",
\r
168 function (start, end) {
\r
170 if (this.length == 0) {
\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
175 var rlength = 1 + end - start;
\r
176 var oldlen = this.length;
\r
178 var editing = false;
\r
179 var oldops = this.operation;
\r
180 var oldrange = this.range;
\r
182 this.operation = 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
189 }var remain = oldrange[o];
\r
191 if ((cursor + remain) <= start) {
\r
192 this.addOperation (oldops[o], oldrange[o]);
\r
193 cursor += oldrange[o++];
\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
202 if (rlength > remain) {
\r
203 this.addDeleted (remain);
\r
206 deleted += rlength;
\r
207 this.addDeleted (rlength);
\r
208 if (remain - rlength > 0) {
\r
209 this.addOperation ('M', remain - rlength);
\r
214 if (remain - rlength > 0) {
\r
215 this.addInsertion (remain - rlength);
\r
219 throw new Error (jalview.util.MessageManager.getString ("error.implementation_error"));
\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
224 remain = oldrange[++o];
\r
226 while (o < oldlen) {
\r
227 this.addOperation (oldops[o], oldrange[o++]);
\r
231 Clazz.defineMethod (c$, "hasDeletedRegions",
\r
233 for (var i = 0; i < this.length; i++) {
\r
234 if (this.operation[i] == 'D') {
\r
239 Clazz.defineMethod (c$, "getDeletedRegions",
\r
241 if (this.length == 0) {
\r
243 }var dr = new java.util.Vector ();
\r
246 for (var i = 0; i < this.length; i++) {
\r
247 switch (this.operation[i]) {
\r
249 cursor += this.range[i];
\r
251 vcursor += this.range[i];
\r
254 dr.addElement ( Clazz.newIntArray (-1, [vcursor, cursor, this.range[i]]));
\r
255 cursor += this.range[i];
\r
258 if (dr.size () == 0) {
\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
269 Clazz.defineMethod (c$, "getFullWidth",
\r
272 if (this.range != null) {
\r
273 for (var i = 0; i < this.length; i++) {
\r
274 w += this.range[i];
\r
278 Clazz.defineMethod (c$, "getWidth",
\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
288 Clazz.defineMethod (c$, "addInsertion",
\r
290 this.addOperation ('I', range);
\r
292 Clazz.defineMethod (c$, "addDeleted",
\r
294 this.addOperation ('D', range);
\r
296 Clazz.defineMethod (c$, "getCigarstring",
\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
303 return cigarString.toString ();
\r
305 Clazz.defineStatics (c$,
\r
309 "_case_shift", String.fromCharCode (32));
\r