JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / datamodel / SeqCigar.js
1 Clazz.declarePackage ("jalview.datamodel");\r
2 Clazz.load (["jalview.datamodel.CigarSimple"], "jalview.datamodel.SeqCigar", ["jalview.analysis.AlignSeq", "$.SeqsetUtils", "jalview.datamodel.Sequence", "jalview.util.Comparison", "$.MessageManager", "$.ShiftList", "java.lang.Error", "$.StringBuffer", "java.util.Hashtable"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.start = 0;\r
5 this.end = 0;\r
6 this.refseq = null;\r
7 this.seqProps = null;\r
8 this.selGroups = null;\r
9 Clazz.instantialize (this, arguments);\r
10 }, jalview.datamodel, "SeqCigar", jalview.datamodel.CigarSimple);\r
11 Clazz.defineMethod (c$, "getRefSeq", \r
12 function () {\r
13 return this.refseq;\r
14 });\r
15 Clazz.defineMethod (c$, "getStart", \r
16 function () {\r
17 return this.start;\r
18 });\r
19 Clazz.defineMethod (c$, "getEnd", \r
20 function () {\r
21 return this.end;\r
22 });\r
23 Clazz.overrideMethod (c$, "getSequenceString", \r
24 function (GapChar) {\r
25 return (this.length == 0) ? "" : this.getSequenceAndDeletions (this.refseq.getSequenceAsString (this.start, this.end), GapChar)[0];\r
26 }, "~S");\r
27 Clazz.defineMethod (c$, "getSeq", \r
28 function (GapChar) {\r
29 var seq;\r
30 if (this.refseq == null || this.length == 0) {\r
31 return null;\r
32 }var edit_result = this.getSequenceAndDeletions (this.refseq.getSequenceAsString (this.start, this.end), GapChar);\r
33 if (edit_result == null) {\r
34 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_unexpected_null_from_get_sequence_and_deletions"));\r
35 }var bounds = edit_result[1];\r
36 seq =  new jalview.datamodel.Sequence (this.refseq.getName (), edit_result[0], this.refseq.getStart () + this.start + bounds[0], this.refseq.getStart () + this.start + ((bounds[2] == 0) ? -1 : bounds[2]));\r
37 seq.setDescription (this.refseq.getDescription ());\r
38 var sstart = seq.getStart ();\r
39 var send = seq.getEnd ();\r
40 if (this.seqProps != null) {\r
41 jalview.analysis.SeqsetUtils.SeqCharacterUnhash (seq, this.seqProps);\r
42 }seq.setDatasetSequence (this.refseq);\r
43 seq.setStart (sstart);\r
44 seq.setEnd (send);\r
45 return seq;\r
46 }, "~S");\r
47 Clazz.defineMethod (c$, "_setSeq", \r
48  function (seq, initialDeletion, _s, _e) {\r
49 var hasgaps = false;\r
50 if (seq == null) {\r
51 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_set_seq_null"));\r
52 }if (_s < 0) {\r
53 throw  new Error (jalview.util.MessageManager.formatMessage ("error.implementation_error_s",  Clazz.newArray (-1, [Integer.$valueOf (_s).toString ()])));\r
54 }var seq_string = seq.getSequenceAsString ();\r
55 if (_e == 0 || _e < _s || _e > seq_string.length) {\r
56 _e = seq_string.length;\r
57 }this.start = seq.findPosition (_s) - seq.getStart ();\r
58 this.end = seq.findPosition (_e) - seq.getStart ();\r
59 var l_ungapped = this.end - this.start;\r
60 var ds = seq.getDatasetSequence ();\r
61 if (ds == null) {\r
62 var ungapped = jalview.analysis.AlignSeq.extractGaps (jalview.util.Comparison.GapChars,  String.instantialize (seq_string));\r
63 l_ungapped = ungapped.length;\r
64 if (l_ungapped == seq.getLength ()) {\r
65 ds = seq;\r
66 } else {\r
67 ds =  new jalview.datamodel.Sequence (seq.getName (), ungapped, seq.getStart (), seq.getStart () + ungapped.length - 1);\r
68 }}if (ds.getStart () < seq.getStart ()) {\r
69 var offset = seq.getStart () - ds.getStart ();\r
70 if (initialDeletion) {\r
71 this.addDeleted (_s + offset);\r
72 this.start = 0;\r
73 this.end += offset;\r
74 } else {\r
75 this.start += offset;\r
76 this.end += offset;\r
77 }}if (l_ungapped != (_e - _s)) {\r
78 hasgaps = true;\r
79 }this.refseq = ds;\r
80 this.seqProps = jalview.analysis.SeqsetUtils.SeqCharacterHash (seq);\r
81 if (this.end > ds.getLength ()) {\r
82 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_seqcigar_possible"));\r
83 }return hasgaps;\r
84 }, "jalview.datamodel.SequenceI,~B,~N,~N");\r
85 Clazz.makeConstructor (c$, \r
86 function (seq, operation, range) {\r
87 Clazz.superConstructor (this, jalview.datamodel.SeqCigar);\r
88 if (seq == null) {\r
89 throw  new Error (jalview.util.MessageManager.getString ("error.implmentation_bug_seq_null"));\r
90 }if (operation.length != range.length) {\r
91 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_bug_cigar_operation_list_range_list"));\r
92 }if (operation != null) {\r
93 this.operation =  Clazz.newCharArray (operation.length + this._inc_length, '\0');\r
94 this.range =  Clazz.newIntArray (operation.length + this._inc_length, 0);\r
95 if (this._setSeq (seq, false, 0, 0)) {\r
96 throw  new Error (jalview.util.MessageManager.getString ("error.not_yet_implemented_cigar_object_from_cigar_string"));\r
97 }for (var i = this.length, j = 0; j < operation.length; i++, j++) {\r
98 var op = operation[j];\r
99 if (op != 'M' && op != 'I' && op != 'D') {\r
100 throw  new Error (jalview.util.MessageManager.formatMessage ("error.implementation_bug_cigar_operation",  Clazz.newArray (-1, [Integer.$valueOf (j).toString (), Integer.$valueOf (op.charCodeAt (0)).toString (), Integer.$valueOf ('M'.charCodeAt (0)).toString (), Integer.$valueOf ('I'.charCodeAt (0)).toString (), Integer.$valueOf ('D'.charCodeAt (0)).toString ()])));\r
101 }this.operation[i] = op;\r
102 this.range[i] = range[j];\r
103 }\r
104 this.length += operation.length;\r
105 } else {\r
106 this.operation = null;\r
107 this.range = null;\r
108 this.length = 0;\r
109 if (this._setSeq (seq, false, 0, 0)) {\r
110 throw  new Error (jalview.util.MessageManager.getString ("error.not_yet_implemented_cigar_object_from_cigar_string"));\r
111 }}}, "jalview.datamodel.SequenceI,~A,~A");\r
112 Clazz.defineMethod (c$, "addMatch", \r
113 function (range) {\r
114 this.addOperation ('M', range);\r
115 }, "~N");\r
116 c$.addSequenceOps = Clazz.defineMethod (c$, "addSequenceOps", \r
117 function (cigar, seq, startpos, endpos, initialDeletions) {\r
118 var op = '\u0000';\r
119 var range = 0;\r
120 var p = 0;\r
121 var res = seq.getLength ();\r
122 if (!initialDeletions) {\r
123 p = startpos;\r
124 }while (p <= endpos) {\r
125 var isGap = (p < res) ? jalview.util.Comparison.isGap (seq.getCharAt (p)) : true;\r
126 if ((startpos <= p) && (p <= endpos)) {\r
127 if (isGap) {\r
128 if (range > 0 && op != 'I') {\r
129 cigar.addOperation (op, range);\r
130 range = 0;\r
131 }op = 'I';\r
132 range++;\r
133 } else {\r
134 if (range > 0 && op != 'M') {\r
135 cigar.addOperation (op, range);\r
136 range = 0;\r
137 }op = 'M';\r
138 range++;\r
139 }} else {\r
140 if (!isGap) {\r
141 if (range > 0 && op != 'D') {\r
142 cigar.addOperation (op, range);\r
143 range = 0;\r
144 }op = 'D';\r
145 range++;\r
146 } else {\r
147 }}p++;\r
148 }\r
149 if (range > 0) {\r
150 cigar.addOperation (op, range);\r
151 }}, "jalview.datamodel.CigarBase,jalview.datamodel.SequenceI,~N,~N,~B");\r
152 Clazz.makeConstructor (c$, \r
153 function (seq) {\r
154 Clazz.superConstructor (this, jalview.datamodel.SeqCigar);\r
155 if (seq == null) {\r
156 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_for_new_cigar"));\r
157 }this._setSeq (seq, false, 0, 0);\r
158 jalview.datamodel.SeqCigar.addSequenceOps (this, seq, 0, seq.getLength () - 1, false);\r
159 }, "jalview.datamodel.SequenceI");\r
160 Clazz.makeConstructor (c$, \r
161 function (seq, start, end) {\r
162 Clazz.superConstructor (this, jalview.datamodel.SeqCigar);\r
163 if (seq == null) {\r
164 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_for_new_cigar"));\r
165 }this._setSeq (seq, false, start, end + 1);\r
166 jalview.datamodel.SeqCigar.addSequenceOps (this, seq, start, end, false);\r
167 }, "jalview.datamodel.SequenceI,~N,~N");\r
168 c$.parseCigar = Clazz.defineMethod (c$, "parseCigar", \r
169 function (seq, cigarString) {\r
170 var opsandrange = jalview.datamodel.CigarBase.parseCigarString (cigarString);\r
171 return  new jalview.datamodel.SeqCigar (seq, opsandrange[0], opsandrange[1]);\r
172 }, "jalview.datamodel.SequenceI,~S");\r
173 c$.createAlignmentSequences = Clazz.defineMethod (c$, "createAlignmentSequences", \r
174 function (alseqs, gapCharacter, colsel, segments) {\r
175 var seqs =  new Array (alseqs.length);\r
176 var g_seqs =  new Array (alseqs.length);\r
177 var alseqs_string =  new Array (alseqs.length);\r
178 var gs_regions =  new Array (alseqs.length);\r
179 for (var i = 0; i < alseqs.length; i++) {\r
180 alseqs_string[i] = alseqs[i].getRefSeq ().getSequenceAsString (alseqs[i].start, alseqs[i].end);\r
181 gs_regions[i] = alseqs[i].getSequenceAndDeletions (alseqs_string[i], gapCharacter);\r
182 if (gs_regions[i] == null) {\r
183 throw  new Error (jalview.util.MessageManager.formatMessage ("error.implementation_error_cigar_seq_no_operations",  Clazz.newArray (-1, [Integer.$valueOf (i).toString ()])));\r
184 }g_seqs[i] =  new StringBuffer ((gs_regions[i])[0]);\r
185 }\r
186 var shifts =  new jalview.util.ShiftList ();\r
187 for (var i = 0; i < alseqs.length; i++) {\r
188 var gs_region = ((gs_regions[i])[2]);\r
189 if (gs_region != null) {\r
190 for (var hr = 0; hr < gs_region.length; hr++) {\r
191 var region = gs_region[hr];\r
192 var insert =  Clazz.newCharArray (region[1] - region[0] + 1, '\0');\r
193 for (var s = 0; s < insert.length; s++) {\r
194 insert[s] = gapCharacter;\r
195 }\r
196 var inspos = shifts.shift (region[2]);\r
197 for (var s = 0; s < alseqs.length; s++) {\r
198 if (s != i) {\r
199 if (g_seqs[s].length () <= inspos) {\r
200 for (var l = inspos - g_seqs[s].length (); l > 0; l--) {\r
201 g_seqs[s].append (gapCharacter);\r
202 }\r
203 }g_seqs[s].insert (inspos, insert);\r
204 } else {\r
205 g_seqs[s].insert (inspos, alseqs_string[i].substring (region[0], region[1] + 1));\r
206 }}\r
207 shifts.addShift (region[2], insert.length);\r
208 if (segments == null) {\r
209 colsel.hideColumns (inspos, inspos + insert.length - 1);\r
210 }}\r
211 }}\r
212 for (var i = 0; i < alseqs.length; i++) {\r
213 var bounds = ((gs_regions[i])[1]);\r
214 var ref = alseqs[i].getRefSeq ();\r
215 seqs[i] =  new jalview.datamodel.Sequence (ref.getName (), g_seqs[i].toString (), ref.getStart () + alseqs[i].start + bounds[0], ref.getStart () + alseqs[i].start + (bounds[2] == 0 ? -1 : bounds[2]));\r
216 seqs[i].setDatasetSequence (ref);\r
217 seqs[i].setDescription (ref.getDescription ());\r
218 }\r
219 if (segments != null) {\r
220 for (var i = 0; i < segments.length; i += 3) {\r
221 colsel.hideColumns (segments[i + 1], segments[i + 1] + segments[i + 2] - 1);\r
222 }\r
223 }return seqs;\r
224 }, "~A,~S,jalview.datamodel.ColumnSelection,~A");\r
225 Clazz.defineMethod (c$, "setGroupMembership", \r
226 function (group) {\r
227 if (this.selGroups == null) {\r
228 this.selGroups =  new java.util.Hashtable ();\r
229 }this.selGroups.put (group,  Clazz.newIntArray (0, 0));\r
230 }, "~O");\r
231 Clazz.defineMethod (c$, "removeGroupMembership", \r
232 function (group) {\r
233 if (this.selGroups != null && this.selGroups.containsKey (group)) {\r
234 this.selGroups.remove (group);\r
235 return true;\r
236 }return false;\r
237 }, "~O");\r
238 Clazz.defineMethod (c$, "clearMemberships", \r
239 function () {\r
240 if (this.selGroups != null) {\r
241 this.selGroups.clear ();\r
242 }this.selGroups = null;\r
243 });\r
244 Clazz.defineMethod (c$, "getAllMemberships", \r
245 function () {\r
246 if (this.selGroups == null) {\r
247 return null;\r
248 }var mmbs =  new Array (this.selGroups.size ());\r
249 var en = this.selGroups.keys ();\r
250 for (var i = 0; en.hasMoreElements (); i++) {\r
251 mmbs[i] = en.nextElement ();\r
252 }\r
253 return mmbs;\r
254 });\r
255 Clazz.defineMethod (c$, "isMemberOf", \r
256 function (sgr) {\r
257 return (this.selGroups != null) && this.selGroups.get (sgr) != null;\r
258 }, "~O");\r
259 });\r