X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=cde4b4ffee0d4c25f4d2f869773ec1386217d04c;hb=ce886100c1eae01eac7d59c961e694f4493d4bcb;hp=58fd444e2836a058e31e7ec5190b8fcdbefb5566;hpb=33c59ebddbc51bbd26bc4c8576ec17c1498b19e8;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index 58fd444..cde4b4f 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -1,265 +1,554 @@ -package jalview.analysis; - -import jalview.datamodel.*; -import jalview.util.*; -import jalview.io.*; - -import java.util.*; - -/** Data structure to hold and manipulate a multiple sequence alignment - */ -public class AlignmentSorter { - - private AlignmentSorter() { - } - - public static void sortGroups(AlignmentI align) { - Vector groups = align.getGroups(); - int nGroup = groups.size(); - - float[] arr = new float [nGroup]; - Object[] s = new Object[nGroup]; - - for (int i=0; i < nGroup; i++) { - arr[i] = ((SequenceGroup)groups.elementAt(i)).getSize(); - s[i] = groups.elementAt(i); - } - - QuickSort.sort(arr,s); - - Vector newg = new Vector(nGroup); - - for (int i=nGroup-1; i >= 0; i--) { - newg.addElement(s[i]); - } - - // align.setGroups(newg); - } - - /** - * Sort by Percentage Identity - * - * @param align AlignmentI - * @param s SequenceI - */ - public static void sortByPID(AlignmentI align, SequenceI s) { - int nSeq = align.getHeight(); - - float scores[] = new float[nSeq]; - SequenceI seqs[] = new SequenceI[nSeq]; - - for (int i = 0; i < nSeq; i++) { - scores[i] = Comparison.compare(align.getSequenceAt(i),s); - seqs[i] = align.getSequenceAt(i); - } - - QuickSort.sort(scores,0,scores.length-1,seqs); - - setReverseOrder(align,seqs); - } - - private static void setReverseOrder(AlignmentI align, SequenceI [] seqs) { - int nSeq = seqs.length; - - int len = 0; - if (nSeq%2 == 0) { - len = nSeq/2; - } else { - len = (nSeq+1)/2; - } - -// NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work - for (int i = 0; i < len; i++) { - //SequenceI tmp = seqs[i]; - align.getSequences().setElementAt(seqs[nSeq-i-1],i); - align.getSequences().setElementAt(seqs[i],nSeq-i-1); - } - } - - private static void setOrder(AlignmentI align, Vector tmp) { - setOrder(align,vectorSubsetToArray(tmp, align.getSequences())); - } - - private static void setOrder(AlignmentI align, SequenceI [] seqs) { - // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work - - Vector algn = align.getSequences(); - - for (int i = 0, p = 0; i < seqs.length; i++) - algn.setElementAt(seqs[i], p++); - } - /** */ - static boolean sortIdAscending = true; - public static void sortByID(AlignmentI align) { - int nSeq = align.getHeight(); - - String ids[] = new String[nSeq]; - SequenceI seqs[] = new SequenceI[nSeq]; - - for (int i = 0; i < nSeq; i++) { - ids[i] = align.getSequenceAt(i).getName(); - seqs[i] = align.getSequenceAt(i); - } - - QuickSort.sort(ids,seqs); - - if(sortIdAscending) - setReverseOrder(align,seqs); - else - setOrder(align, seqs); - - sortIdAscending = !sortIdAscending; - } - - static boolean sortGroupAscending = true; - public static void sortByGroup(AlignmentI align) { - int nSeq = align.getHeight(); - Vector groups = align.getGroups(); - - Vector seqs = new Vector(); - - for (int i=0; i < groups.size(); i++) { - SequenceGroup sg = (SequenceGroup)groups.elementAt(i); - - for (int j = 0; j < sg.getSize(); j++) { - seqs.addElement(sg.getSequenceAt(j)); - } - } - - if (seqs.size() != nSeq) { - System.err.println("ERROR: tmp.size() != nseq in sortByGroups"); - if (seqs.size() < nSeq) { - addStrays(align,seqs); - } - } - - if(sortGroupAscending) - setOrder(align,seqs); - else - setReverseOrder( align, vectorToArray(seqs)); - - sortGroupAscending = ! sortGroupAscending; - } - - private static SequenceI [] vectorToArray(Vector tmp) { - SequenceI[] seqs = new SequenceI[tmp.size()]; - - for (int i=0; i < tmp.size(); i++) { - seqs[i] = (SequenceI)tmp.elementAt(i); - } - return seqs; - } - - private static SequenceI [] vectorSubsetToArray(Vector tmp, Vector mask) { - Vector seqs = new Vector(); - int i,m, p; - boolean[] tmask = new boolean[m=mask.size()]; - for (i=0; i