X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=a993e26c772d3a885f097b5a5eb7d155bfd3ad86;hb=d197025c26793dc26ef790633ee6ab394c8eff85;hp=39af6490320efa7072e49f8fc5966c3087cb4565;hpb=d423f22792e47dbc800ae220a58677f988971d06;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index 39af649..a993e26 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -1,19 +1,22 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) + * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.analysis; @@ -146,11 +149,15 @@ public class AlignmentSorter } // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work - for (int i = 0; i < len; i++) + List asq; + synchronized (asq = align.getSequences()) { - // SequenceI tmp = seqs[i]; - align.getSequences().setElementAt(seqs[nSeq - i - 1], i); - align.getSequences().setElementAt(seqs[i], nSeq - i - 1); + for (int i = 0; i < len; i++) + { + // SequenceI tmp = seqs[i]; + asq.set(i, seqs[nSeq - i - 1]); + asq.set(nSeq - i - 1, seqs[i]); + } } } @@ -178,24 +185,26 @@ public class AlignmentSorter public static void setOrder(AlignmentI align, SequenceI[] seqs) { // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work - Vector algn = align.getSequences(); - Vector tmp = new Vector(); - - for (int i = 0; i < seqs.length; i++) + List algn; + synchronized (algn = align.getSequences()) { - if (algn.contains(seqs[i])) + List tmp = new ArrayList(); + + for (int i = 0; i < seqs.length; i++) { - tmp.addElement(seqs[i]); + if (algn.contains(seqs[i])) + { + tmp.add(seqs[i]); + } } - } - algn.removeAllElements(); - // User may have hidden seqs, then clicked undo or redo - for (int i = 0; i < tmp.size(); i++) - { - algn.addElement(tmp.elementAt(i)); + algn.clear(); + // User may have hidden seqs, then clicked undo or redo + for (int i = 0; i < tmp.size(); i++) + { + algn.add(tmp.get(i)); + } } - } /** @@ -247,7 +256,7 @@ public class AlignmentSorter for (int i = 0; i < nSeq; i++) { seqs[i] = align.getSequenceAt(i); - length[i] = (float) (seqs[i].getEnd() - seqs[i].getStart()); + length[i] = (seqs[i].getEnd() - seqs[i].getStart()); } QuickSort.sort(length, seqs); @@ -290,10 +299,8 @@ public class AlignmentSorter // SORTS GROUPS BY SIZE // //////////////////// - for (int i = 0; i < align.getGroups().size(); i++) + for (SequenceGroup sg : align.getGroups()) { - SequenceGroup sg = (SequenceGroup) align.getGroups().elementAt(i); - for (int j = 0; j < groups.size(); j++) { SequenceGroup sg2 = (SequenceGroup) groups.elementAt(j); @@ -359,18 +366,20 @@ public class AlignmentSorter } /** - * DOCUMENT ME! + * Select sequences in order from tmp that is present in mask, and any + * remaining seqeunces in mask not in tmp * * @param tmp - * DOCUMENT ME! + * thread safe collection of sequences * @param mask - * DOCUMENT ME! + * thread safe collection of sequences * - * @return DOCUMENT ME! + * @return intersect(tmp,mask)+intersect(complement(tmp),mask) */ - private static SequenceI[] vectorSubsetToArray(Vector tmp, Vector mask) + private static SequenceI[] vectorSubsetToArray(List tmp, + List mask) { - Vector seqs = new Vector(); + ArrayList seqs = new ArrayList(); int i, idx; boolean[] tmask = new boolean[mask.size()]; @@ -381,12 +390,12 @@ public class AlignmentSorter for (i = 0; i < tmp.size(); i++) { - Object sq = tmp.elementAt(i); + SequenceI sq = tmp.get(i); idx = mask.indexOf(sq); if (idx > -1 && tmask[idx]) { tmask[idx] = false; - seqs.addElement(sq); + seqs.add(sq); } } @@ -394,11 +403,11 @@ public class AlignmentSorter { if (tmask[i]) { - seqs.addElement(mask.elementAt(i)); + seqs.add(mask.get(i)); } } - return vectorToArray(seqs); + return seqs.toArray(new SequenceI[seqs.size()]); } /** @@ -456,15 +465,19 @@ public class AlignmentSorter // TODO: JBPNote - decide if this is always an error // (eg. not when a tree is associated to another alignment which has more // sequences) - if (tmp.size() < nSeq) + if (tmp.size() != nSeq) { addStrays(align, tmp); } if (tmp.size() != nSeq) { - System.err.println("ERROR: tmp.size()=" + tmp.size() + " != nseq=" - + nSeq + " in getOrderByTree"); + System.err + .println("WARNING: tmp.size()=" + + tmp.size() + + " != nseq=" + + nSeq + + " in getOrderByTree - tree contains sequences not in alignment"); } } @@ -544,7 +557,7 @@ public class AlignmentSorter * @return DOCUMENT ME! */ private static Vector _sortByTree(SequenceNode node, Vector tmp, - Vector seqset) + List seqset) { if (node == null) { @@ -560,9 +573,11 @@ public class AlignmentSorter { if (node.element() instanceof SequenceI) { - if (!tmp.contains(node.element())) + if (!tmp.contains(node.element())) // && (seqset==null || + // seqset.size()==0 || + // seqset.contains(tmp))) { - tmp.addElement((SequenceI) node.element()); + tmp.addElement(node.element()); } } } @@ -798,9 +813,8 @@ public class AlignmentSorter // filter for selection criteria if ( // ignore features outwith alignment start-stop positions. - (sf[f].end < sstart || sf[f].begin > sstop) - || - // or ignore based on selection criteria + (sf[f].end < sstart || sf[f].begin > sstop) || + // or ignore based on selection criteria (featureLabels != null && !AlignmentSorter .containsIgnoreCase(sf[f].type, featureLabels)) || (groupLabels != null