JAL-1807 includes ?j2sdebug flag and DebugJS._(msg)
[jalviewjs.git] / bin / jalview / analysis / AlignmentSorter.js
1 Clazz.declarePackage ("jalview.analysis");
2 Clazz.load (null, "jalview.analysis.AlignmentSorter", ["jalview.datamodel.SequenceI", "jalview.util.Comparison", "$.MessageManager", "$.QuickSort", "java.lang.Error", "$.Float", "$.StringBuffer", "java.util.ArrayList"], function () {
3 c$ = Clazz.declareType (jalview.analysis, "AlignmentSorter");
4 c$.sortByPID = Clazz.defineMethod (c$, "sortByPID", 
5 function (align, s, tosort) {
6 jalview.analysis.AlignmentSorter.sortByPID (align, s, tosort, 0, -1);
7 }, "jalview.datamodel.AlignmentI,jalview.datamodel.SequenceI,~A");
8 c$.sortByPID = Clazz.defineMethod (c$, "sortByPID", 
9 function (align, s, tosort, start, end) {
10 var nSeq = align.getHeight ();
11 var scores =  Clazz.newFloatArray (nSeq, 0);
12 var seqs =  new Array (nSeq);
13 for (var i = 0; i < nSeq; i++) {
14 scores[i] = jalview.util.Comparison.PID (align.getSequenceAt (i).getSequenceAsString (), s.getSequenceAsString ());
15 seqs[i] = align.getSequenceAt (i);
16 }
17 jalview.util.QuickSort.sortFloatObject (scores, seqs);
18 jalview.analysis.AlignmentSorter.setReverseOrder (align, seqs);
19 }, "jalview.datamodel.AlignmentI,jalview.datamodel.SequenceI,~A,~N,~N");
20 c$.setReverseOrder = Clazz.defineMethod (c$, "setReverseOrder", 
21 ($fz = function (align, seqs) {
22 var nSeq = seqs.length;
23 var len = 0;
24 if ((nSeq % 2) == 0) {
25 len = Clazz.doubleToInt (nSeq / 2);
26 } else {
27 len = Clazz.doubleToInt ((nSeq + 1) / 2);
28 }var asq;
29 {
30 for (var i = 0; i < len; i++) {
31 asq.set (i, seqs[nSeq - i - 1]);
32 asq.set (nSeq - i - 1, seqs[i]);
33 }
34 }}, $fz.isPrivate = true, $fz), "jalview.datamodel.AlignmentI,~A");
35 c$.setOrder = Clazz.defineMethod (c$, "setOrder", 
36 ($fz = function (align, tmp) {
37 jalview.analysis.AlignmentSorter.setOrder (align, jalview.analysis.AlignmentSorter.vectorSubsetToArray (tmp, align.getSequences ()));
38 }, $fz.isPrivate = true, $fz), "jalview.datamodel.AlignmentI,java.util.List");
39 c$.setOrder = Clazz.defineMethod (c$, "setOrder", 
40 function (align, seqs) {
41 var algn;
42 {
43 var tmp =  new java.util.ArrayList ();
44 for (var i = 0; i < seqs.length; i++) {
45 if (algn.contains (seqs[i])) {
46 tmp.add (seqs[i]);
47 }}
48 algn.clear ();
49 for (var i = 0; i < tmp.size (); i++) {
50 algn.add (tmp.get (i));
51 }
52 }}, "jalview.datamodel.AlignmentI,~A");
53 c$.sortByID = Clazz.defineMethod (c$, "sortByID", 
54 function (align) {
55 var nSeq = align.getHeight ();
56 var ids =  new Array (nSeq);
57 var seqs =  new Array (nSeq);
58 for (var i = 0; i < nSeq; i++) {
59 ids[i] = align.getSequenceAt (i).getName ();
60 seqs[i] = align.getSequenceAt (i);
61 }
62 jalview.util.QuickSort.sort (ids, seqs);
63 if (jalview.analysis.AlignmentSorter.sortIdAscending) {
64 jalview.analysis.AlignmentSorter.setReverseOrder (align, seqs);
65 } else {
66 jalview.analysis.AlignmentSorter.setOrder (align, seqs);
67 }jalview.analysis.AlignmentSorter.sortIdAscending = !jalview.analysis.AlignmentSorter.sortIdAscending;
68 }, "jalview.datamodel.AlignmentI");
69 c$.sortByLength = Clazz.defineMethod (c$, "sortByLength", 
70 function (align) {
71 var nSeq = align.getHeight ();
72 var length =  Clazz.newFloatArray (nSeq, 0);
73 var seqs =  new Array (nSeq);
74 for (var i = 0; i < nSeq; i++) {
75 seqs[i] = align.getSequenceAt (i);
76 length[i] = (seqs[i].getEnd () - seqs[i].getStart ());
77 }
78 jalview.util.QuickSort.sortFloatObject (length, seqs);
79 if (jalview.analysis.AlignmentSorter.sortLengthAscending) {
80 jalview.analysis.AlignmentSorter.setReverseOrder (align, seqs);
81 } else {
82 jalview.analysis.AlignmentSorter.setOrder (align, seqs);
83 }jalview.analysis.AlignmentSorter.sortLengthAscending = !jalview.analysis.AlignmentSorter.sortLengthAscending;
84 }, "jalview.datamodel.AlignmentI");
85 c$.sortByGroup = Clazz.defineMethod (c$, "sortByGroup", 
86 function (align) {
87 var groups =  new java.util.ArrayList ();
88 if (groups.hashCode () != jalview.analysis.AlignmentSorter.lastGroupHash) {
89 jalview.analysis.AlignmentSorter.sortGroupAscending = true;
90 jalview.analysis.AlignmentSorter.lastGroupHash = groups.hashCode ();
91 } else {
92 jalview.analysis.AlignmentSorter.sortGroupAscending = !jalview.analysis.AlignmentSorter.sortGroupAscending;
93 }for (var sg, $sg = align.getGroups ().iterator (); $sg.hasNext () && ((sg = $sg.next ()) || true);) {
94 for (var j = 0; j < groups.size (); j++) {
95 var sg2 = groups.get (j);
96 if (sg.getSize () > sg2.getSize ()) {
97 groups.add (j, sg);
98 break;
99 }}
100 if (!groups.contains (sg)) {
101 groups.add (sg);
102 }}
103 var seqs =  new java.util.ArrayList ();
104 for (var i = 0; i < groups.size (); i++) {
105 var sg = groups.get (i);
106 var orderedseqs = sg.getSequencesInOrder (align);
107 for (var j = 0; j < orderedseqs.length; j++) {
108 seqs.add (orderedseqs[j]);
109 }
110 }
111 if (jalview.analysis.AlignmentSorter.sortGroupAscending) {
112 jalview.analysis.AlignmentSorter.setOrder (align, seqs);
113 } else {
114 jalview.analysis.AlignmentSorter.setReverseOrder (align, jalview.analysis.AlignmentSorter.vectorSubsetToArray (seqs, align.getSequences ()));
115 }}, "jalview.datamodel.AlignmentI");
116 c$.vectorSubsetToArray = Clazz.defineMethod (c$, "vectorSubsetToArray", 
117 ($fz = function (tmp, mask) {
118 var seqs =  new java.util.ArrayList ();
119 var i;
120 var idx;
121 var tmask =  Clazz.newBooleanArray (mask.size (), false);
122 for (i = 0; i < mask.size (); i++) {
123 tmask[i] = true;
124 }
125 for (i = 0; i < tmp.size (); i++) {
126 var sq = tmp.get (i);
127 idx = mask.indexOf (sq);
128 if (idx > -1 && tmask[idx]) {
129 tmask[idx] = false;
130 seqs.add (sq);
131 }}
132 for (i = 0; i < tmask.length; i++) {
133 if (tmask[i]) {
134 seqs.add (mask.get (i));
135 }}
136 return seqs.toArray ( new Array (seqs.size ()));
137 }, $fz.isPrivate = true, $fz), "java.util.List,java.util.List");
138 c$.sortBy = Clazz.defineMethod (c$, "sortBy", 
139 function (align, order) {
140 var tmp = order.getOrder ();
141 if (jalview.analysis.AlignmentSorter.lastOrder === order) {
142 jalview.analysis.AlignmentSorter.sortOrderAscending = !jalview.analysis.AlignmentSorter.sortOrderAscending;
143 } else {
144 jalview.analysis.AlignmentSorter.sortOrderAscending = true;
145 }if (jalview.analysis.AlignmentSorter.sortOrderAscending) {
146 jalview.analysis.AlignmentSorter.setOrder (align, tmp);
147 } else {
148 jalview.analysis.AlignmentSorter.setReverseOrder (align, jalview.analysis.AlignmentSorter.vectorSubsetToArray (tmp, align.getSequences ()));
149 }}, "jalview.datamodel.AlignmentI,jalview.datamodel.AlignmentOrder");
150 c$.getOrderByTree = Clazz.defineMethod (c$, "getOrderByTree", 
151 ($fz = function (align, tree) {
152 var nSeq = align.getHeight ();
153 var tmp =  new java.util.ArrayList ();
154 tmp = jalview.analysis.AlignmentSorter._sortByTree (tree.getTopNode (), tmp, align.getSequences ());
155 if (tmp.size () != nSeq) {
156 if (tmp.size () != nSeq) {
157 jalview.analysis.AlignmentSorter.addStrays (align, tmp);
158 }if (tmp.size () != nSeq) {
159 System.err.println ("WARNING: tmp.size()=" + tmp.size () + " != nseq=" + nSeq + " in getOrderByTree - tree contains sequences not in alignment");
160 }}return tmp;
161 }, $fz.isPrivate = true, $fz), "jalview.datamodel.AlignmentI,jalview.analysis.NJTree");
162 c$.sortByTree = Clazz.defineMethod (c$, "sortByTree", 
163 function (align, tree) {
164 var tmp = jalview.analysis.AlignmentSorter.getOrderByTree (align, tree);
165 if (jalview.analysis.AlignmentSorter.lastTree !== tree) {
166 jalview.analysis.AlignmentSorter.sortTreeAscending = true;
167 jalview.analysis.AlignmentSorter.lastTree = tree;
168 } else {
169 jalview.analysis.AlignmentSorter.sortTreeAscending = !jalview.analysis.AlignmentSorter.sortTreeAscending;
170 }if (jalview.analysis.AlignmentSorter.sortTreeAscending) {
171 jalview.analysis.AlignmentSorter.setOrder (align, tmp);
172 } else {
173 jalview.analysis.AlignmentSorter.setReverseOrder (align, jalview.analysis.AlignmentSorter.vectorSubsetToArray (tmp, align.getSequences ()));
174 }}, "jalview.datamodel.AlignmentI,jalview.analysis.NJTree");
175 c$.addStrays = Clazz.defineMethod (c$, "addStrays", 
176 ($fz = function (align, tmp) {
177 var nSeq = align.getHeight ();
178 for (var i = 0; i < nSeq; i++) {
179 if (!tmp.contains (align.getSequenceAt (i))) {
180 tmp.add (align.getSequenceAt (i));
181 }}
182 if (nSeq != tmp.size ()) {
183 System.err.println ("ERROR: Size still not right even after addStrays");
184 }}, $fz.isPrivate = true, $fz), "jalview.datamodel.AlignmentI,java.util.List");
185 c$._sortByTree = Clazz.defineMethod (c$, "_sortByTree", 
186 ($fz = function (node, tmp, seqset) {
187 if (node == null) {
188 return tmp;
189 }var left = node.left ();
190 var right = node.right ();
191 if ((left == null) && (right == null)) {
192 if (!node.isPlaceholder () && (node.element () != null)) {
193 if (Clazz.instanceOf (node.element (), jalview.datamodel.SequenceI)) {
194 if (!tmp.contains (node.element ())) {
195 tmp.add (node.element ());
196 }}}return tmp;
197 } else {
198 jalview.analysis.AlignmentSorter._sortByTree (left, tmp, seqset);
199 jalview.analysis.AlignmentSorter._sortByTree (right, tmp, seqset);
200 }return tmp;
201 }, $fz.isPrivate = true, $fz), "jalview.datamodel.SequenceNode,java.util.List,java.util.List");
202 c$.recoverOrder = Clazz.defineMethod (c$, "recoverOrder", 
203 function (alignment) {
204 var ids =  Clazz.newFloatArray (alignment.length, 0);
205 for (var i = 0; i < alignment.length; i++) {
206 ids[i] = ( new Float (alignment[i].getName ().substring (8))).floatValue ();
207 }
208 jalview.util.QuickSort.sortFloatObject (ids, alignment);
209 }, "~A");
210 c$.sortByAnnotationScore = Clazz.defineMethod (c$, "sortByAnnotationScore", 
211 function (scoreLabel, alignment) {
212 var seqs = alignment.getSequencesArray ();
213 var hasScore =  Clazz.newBooleanArray (seqs.length, false);
214 var hasScores = 0;
215 var scores =  Clazz.newDoubleArray (seqs.length, 0);
216 var min = 0;
217 var max = 0;
218 for (var i = 0; i < seqs.length; i++) {
219 var scoreAnn = seqs[i].getAnnotation (scoreLabel);
220 if (scoreAnn != null) {
221 hasScores++;
222 hasScore[i] = true;
223 scores[i] = scoreAnn[0].getScore ();
224 if (hasScores == 1) {
225 max = min = scores[i];
226 } else {
227 if (max < scores[i]) {
228 max = scores[i];
229 }if (min > scores[i]) {
230 min = scores[i];
231 }}} else {
232 hasScore[i] = false;
233 }}
234 if (hasScores == 0) {
235 return;
236 }if (hasScores < seqs.length) {
237 for (var i = 0; i < seqs.length; i++) {
238 if (!hasScore[i]) {
239 scores[i] = (max + i + 1.0);
240 }}
241 }jalview.util.QuickSort.sortDouble (scores, seqs);
242 if (jalview.analysis.AlignmentSorter.lastSortByScore !== scoreLabel) {
243 jalview.analysis.AlignmentSorter.lastSortByScore = scoreLabel;
244 jalview.analysis.AlignmentSorter.setOrder (alignment, seqs);
245 } else {
246 jalview.analysis.AlignmentSorter.setReverseOrder (alignment, seqs);
247 }}, "~S,jalview.datamodel.AlignmentI");
248 c$.sortByFeature = Clazz.defineMethod (c$, "sortByFeature", 
249 function (featureLabel, groupLabel, start, stop, alignment, method) {
250 jalview.analysis.AlignmentSorter.sortByFeature (featureLabel == null ? null :  Clazz.newArray (-1, [featureLabel]), groupLabel == null ? null :  Clazz.newArray (-1, [groupLabel]), start, stop, alignment, method);
251 }, "~S,~S,~N,~N,jalview.datamodel.AlignmentI,~S");
252 c$.containsIgnoreCase = Clazz.defineMethod (c$, "containsIgnoreCase", 
253 ($fz = function (lab, labs) {
254 if (labs == null) {
255 return true;
256 }if (lab == null) {
257 return false;
258 }for (var q = 0; q < labs.length; q++) {
259 if (labs[q] != null && lab.equalsIgnoreCase (labs[q])) {
260 return true;
261 }}
262 return false;
263 }, $fz.isPrivate = true, $fz), "~S,~A");
264 c$.sortByFeature = Clazz.defineMethod (c$, "sortByFeature", 
265 function (featureLabels, groupLabels, start, stop, alignment, method) {
266 if (method !== jalview.analysis.AlignmentSorter.FEATURE_SCORE && method !== jalview.analysis.AlignmentSorter.FEATURE_LABEL && method !== jalview.analysis.AlignmentSorter.FEATURE_DENSITY) {
267 throw  new Error (jalview.util.MessageManager.getString ("error.implementation_error_sortbyfeature"));
268 }var ignoreScore = method !== jalview.analysis.AlignmentSorter.FEATURE_SCORE;
269 var scoreLabel =  new StringBuffer ();
270 scoreLabel.append (start + stop + method);
271 for (var i = 0; featureLabels != null && i < featureLabels.length; i++) {
272 scoreLabel.append (featureLabels[i] == null ? "null" : featureLabels[i]);
273 }
274 for (var i = 0; groupLabels != null && i < groupLabels.length; i++) {
275 scoreLabel.append (groupLabels[i] == null ? "null" : groupLabels[i]);
276 }
277 var seqs = alignment.getSequencesArray ();
278 var hasScore =  Clazz.newBooleanArray (seqs.length, false);
279 var hasScores = 0;
280 var scores =  Clazz.newDoubleArray (seqs.length, 0);
281 var seqScores =  Clazz.newIntArray (seqs.length, 0);
282 var feats =  new Array (seqs.length);
283 var min = 0;
284 var max = 0;
285 for (var i = 0; i < seqs.length; i++) {
286 var sf = seqs[i].getSequenceFeatures ();
287 if (sf == null) {
288 sf =  new Array (0);
289 } else {
290 var tmp =  new Array (sf.length);
291 for (var s = 0; s < tmp.length; s++) {
292 tmp[s] = sf[s];
293 }
294 sf = tmp;
295 }var sstart = (start == -1) ? start : seqs[i].findPosition (start);
296 var sstop = (stop == -1) ? stop : seqs[i].findPosition (stop);
297 seqScores[i] = 0;
298 scores[i] = 0.0;
299 var n = sf.length;
300 for (var f = 0; f < sf.length; f++) {
301 if ((sf[f].end < sstart || sf[f].begin > sstop) || (featureLabels != null && !jalview.analysis.AlignmentSorter.containsIgnoreCase (sf[f].type, featureLabels)) || (groupLabels != null && (sf[f].getFeatureGroup () != null && !jalview.analysis.AlignmentSorter.containsIgnoreCase (sf[f].getFeatureGroup (), groupLabels)))) {
302 sf[f] = null;
303 n--;
304 } else {
305 if (!ignoreScore && !Float.isNaN (sf[f].getScore ())) {
306 if (seqScores[i] == 0) {
307 hasScores++;
308 }seqScores[i]++;
309 hasScore[i] = true;
310 scores[i] += sf[f].getScore ();
311 }}}
312 var fs;
313 feats[i] = fs =  new Array (n);
314 if (n > 0) {
315 n = 0;
316 for (var f = 0; f < sf.length; f++) {
317 if (sf[f] != null) {
318 (feats[i])[n++] = sf[f];
319 }}
320 if (method === jalview.analysis.AlignmentSorter.FEATURE_LABEL) {
321 var labs =  new Array (fs.length);
322 for (var l = 0; l < labs.length; l++) {
323 labs[l] = (fs[l].getDescription () != null ? fs[l].getDescription () : fs[l].getType ());
324 }
325 jalview.util.QuickSort.sort (labs, (feats[i]));
326 }}if (hasScore[i]) {
327 scores[i] /= seqScores[i];
328 if (hasScores == 1) {
329 max = min = scores[i];
330 } else {
331 if (max < scores[i]) {
332 max = scores[i];
333 }if (min > scores[i]) {
334 min = scores[i];
335 }}}}
336 if (method === jalview.analysis.AlignmentSorter.FEATURE_SCORE) {
337 if (hasScores == 0) {
338 return;
339 }if (hasScores < seqs.length) {
340 for (var i = 0; i < seqs.length; i++) {
341 if (!hasScore[i]) {
342 scores[i] = (max + 1 + i);
343 } else {
344 var nf = (feats[i] == null) ? 0 : (feats[i]).length;
345 }}
346 }jalview.util.QuickSort.sortDouble (scores, seqs);
347 } else if (method === jalview.analysis.AlignmentSorter.FEATURE_DENSITY) {
348 var fr = 0.9 / (1.0 * seqs.length);
349 for (var i = 0; i < seqs.length; i++) {
350 var nf;
351 scores[i] = (0.05 + fr * i) + (nf = ((feats[i] == null) ? 0.0 : 1.0 * (feats[i]).length));
352 }
353 jalview.util.QuickSort.sortDouble (scores, seqs);
354 } else {
355 if (method === jalview.analysis.AlignmentSorter.FEATURE_LABEL) {
356 throw  new Error (jalview.util.MessageManager.getString ("error.not_yet_implemented"));
357 }}if (jalview.analysis.AlignmentSorter.lastSortByFeatureScore == null || !scoreLabel.toString ().equals (jalview.analysis.AlignmentSorter.lastSortByFeatureScore)) {
358 jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending = true;
359 } else {
360 jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending = !jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending;
361 }if (jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending) {
362 jalview.analysis.AlignmentSorter.setOrder (alignment, seqs);
363 } else {
364 jalview.analysis.AlignmentSorter.setReverseOrder (alignment, seqs);
365 }jalview.analysis.AlignmentSorter.lastSortByFeatureScore = scoreLabel.toString ();
366 }, "~A,~A,~N,~N,jalview.datamodel.AlignmentI,~S");
367 Clazz.defineStatics (c$,
368 "sortIdAscending", true,
369 "lastGroupHash", 0,
370 "sortGroupAscending", true,
371 "lastOrder", null,
372 "sortOrderAscending", true,
373 "lastTree", null,
374 "sortTreeAscending", true,
375 "lastSortByScore", null,
376 "sortByScoreAscending", true,
377 "lastSortByFeatureScore", null,
378 "sortByFeatureScoreAscending", true,
379 "sortLengthAscending", false,
380 "FEATURE_SCORE", "average_score",
381 "FEATURE_LABEL", "text",
382 "FEATURE_DENSITY", "density");
383 });