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);
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 function (align, seqs) {
22 var nSeq = seqs.length;
24 if ((nSeq % 2) == 0) {
25 len = Clazz.doubleToInt (nSeq / 2);
27 len = Clazz.doubleToInt ((nSeq + 1) / 2);
30 for (var i = 0; i < len; i++) {
31 asq.set (i, seqs[nSeq - i - 1]);
32 asq.set (nSeq - i - 1, seqs[i]);
34 }}, "jalview.datamodel.AlignmentI,~A");
35 c$.setOrder = Clazz.defineMethod (c$, "setOrder",
36 function (align, tmp) {
37 jalview.analysis.AlignmentSorter.setOrder (align, jalview.analysis.AlignmentSorter.vectorSubsetToArray (tmp, align.getSequences ()));
38 }, "jalview.datamodel.AlignmentI,java.util.List");
39 c$.setOrder = Clazz.defineMethod (c$, "setOrder",
40 function (align, seqs) {
43 var tmp = new java.util.ArrayList ();
44 for (var i = 0; i < seqs.length; i++) {
45 if (algn.contains (seqs[i])) {
49 for (var i = 0; i < tmp.size (); i++) {
50 algn.add (tmp.get (i));
52 }}, "jalview.datamodel.AlignmentI,~A");
53 c$.sortByID = Clazz.defineMethod (c$, "sortByID",
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);
62 jalview.util.QuickSort.sort (ids, seqs);
63 if (jalview.analysis.AlignmentSorter.sortIdAscending) {
64 jalview.analysis.AlignmentSorter.setReverseOrder (align, seqs);
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",
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 ());
78 jalview.util.QuickSort.sortFloatObject (length, seqs);
79 if (jalview.analysis.AlignmentSorter.sortLengthAscending) {
80 jalview.analysis.AlignmentSorter.setReverseOrder (align, seqs);
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",
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 ();
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 ()) {
100 if (!groups.contains (sg)) {
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]);
111 if (jalview.analysis.AlignmentSorter.sortGroupAscending) {
112 jalview.analysis.AlignmentSorter.setOrder (align, seqs);
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 function (tmp, mask) {
118 var seqs = new java.util.ArrayList ();
121 var tmask = Clazz.newBooleanArray (mask.size (), false);
122 for (i = 0; i < mask.size (); i++) {
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]) {
132 for (i = 0; i < tmask.length; i++) {
134 seqs.add (mask.get (i));
136 return seqs.toArray ( new Array (seqs.size ()));
137 }, "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;
144 jalview.analysis.AlignmentSorter.sortOrderAscending = true;
145 }if (jalview.analysis.AlignmentSorter.sortOrderAscending) {
146 jalview.analysis.AlignmentSorter.setOrder (align, tmp);
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 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");
161 }, "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;
169 jalview.analysis.AlignmentSorter.sortTreeAscending = !jalview.analysis.AlignmentSorter.sortTreeAscending;
170 }if (jalview.analysis.AlignmentSorter.sortTreeAscending) {
171 jalview.analysis.AlignmentSorter.setOrder (align, tmp);
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 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));
182 if (nSeq != tmp.size ()) {
183 System.err.println ("ERROR: Size still not right even after addStrays");
184 }}, "jalview.datamodel.AlignmentI,java.util.List");
185 c$._sortByTree = Clazz.defineMethod (c$, "_sortByTree",
186 function (node, tmp, seqset) {
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 ());
198 jalview.analysis.AlignmentSorter._sortByTree (left, tmp, seqset);
199 jalview.analysis.AlignmentSorter._sortByTree (right, tmp, seqset);
201 }, "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 ();
208 jalview.util.QuickSort.sortFloatObject (ids, alignment);
210 c$.sortByAnnotationScore = Clazz.defineMethod (c$, "sortByAnnotationScore",
211 function (scoreLabel, alignment) {
212 var seqs = alignment.getSequencesArray ();
213 var hasScore = Clazz.newBooleanArray (seqs.length, false);
215 var scores = Clazz.newDoubleArray (seqs.length, 0);
218 for (var i = 0; i < seqs.length; i++) {
219 var scoreAnn = seqs[i].getAnnotation (scoreLabel);
220 if (scoreAnn != null) {
223 scores[i] = scoreAnn[0].getScore ();
224 if (hasScores == 1) {
225 max = min = scores[i];
227 if (max < scores[i]) {
229 }if (min > scores[i]) {
234 if (hasScores == 0) {
236 }if (hasScores < seqs.length) {
237 for (var i = 0; i < seqs.length; i++) {
239 scores[i] = (max + i + 1.0);
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);
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 function (lab, labs) {
258 }for (var q = 0; q < labs.length; q++) {
259 if (labs[q] != null && lab.equalsIgnoreCase (labs[q])) {
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]);
274 for (var i = 0; groupLabels != null && i < groupLabels.length; i++) {
275 scoreLabel.append (groupLabels[i] == null ? "null" : groupLabels[i]);
277 var seqs = alignment.getSequencesArray ();
278 var hasScore = Clazz.newBooleanArray (seqs.length, false);
280 var scores = Clazz.newDoubleArray (seqs.length, 0);
281 var seqScores = Clazz.newIntArray (seqs.length, 0);
282 var feats = new Array (seqs.length);
285 for (var i = 0; i < seqs.length; i++) {
286 var sf = seqs[i].getSequenceFeatures ();
290 var tmp = new Array (sf.length);
291 for (var s = 0; s < tmp.length; s++) {
295 }var sstart = (start == -1) ? start : seqs[i].findPosition (start);
296 var sstop = (stop == -1) ? stop : seqs[i].findPosition (stop);
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)))) {
305 if (!ignoreScore && !Float.isNaN (sf[f].getScore ())) {
306 if (seqScores[i] == 0) {
310 scores[i] += sf[f].getScore ();
313 feats[i] = fs = new Array (n);
316 for (var f = 0; f < sf.length; f++) {
318 (feats[i])[n++] = sf[f];
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 ());
325 jalview.util.QuickSort.sort (labs, (feats[i]));
327 scores[i] /= seqScores[i];
328 if (hasScores == 1) {
329 max = min = scores[i];
331 if (max < scores[i]) {
333 }if (min > scores[i]) {
336 if (method === jalview.analysis.AlignmentSorter.FEATURE_SCORE) {
337 if (hasScores == 0) {
339 }if (hasScores < seqs.length) {
340 for (var i = 0; i < seqs.length; i++) {
342 scores[i] = (max + 1 + i);
344 var nf = (feats[i] == null) ? 0 : (feats[i]).length;
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++) {
351 scores[i] = (0.05 + fr * i) + (nf = ((feats[i] == null) ? 0.0 : 1.0 * (feats[i]).length));
353 jalview.util.QuickSort.sortDouble (scores, seqs);
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;
360 jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending = !jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending;
361 }if (jalview.analysis.AlignmentSorter.sortByFeatureScoreAscending) {
362 jalview.analysis.AlignmentSorter.setOrder (alignment, seqs);
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,
370 "sortGroupAscending", true,
372 "sortOrderAscending", true,
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");