X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=bb554262f5674bcedb5382c9b978602e7077d93c;hb=50ae21686bb576ce02f2a83a1d53744b86290479;hp=fe2cfc7c7dfb70d5861f72c2dbc52831a3e3c743;hpb=506d60f0e188723ddc91c26824b41ac7034df3fe;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index fe2cfc7..bb55426 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -54,9 +54,19 @@ public class AlignmentSorter static boolean sortTreeAscending = true; + /** + * last Annotation Label used by sortByScore + */ private static String lastSortByScore; /** + * compact representation of last arguments to SortByFeatureScore + */ + private static String lastSortByFeatureScore; + + private static boolean sortLengthAscending; + + /** * Sort by Percentage Identity w.r.t. s * * @param align @@ -69,6 +79,23 @@ public class AlignmentSorter public static void sortByPID(AlignmentI align, SequenceI s, SequenceI[] tosort) { + sortByPID(align,s,tosort,0,-1); + } + /** + * Sort by Percentage Identity w.r.t. s + * + * @param align + * AlignmentI + * @param s + * SequenceI + * @param tosort + * sequences from align that are to be sorted. + * @param start start column (0 for beginning + * @param end + */ + public static void sortByPID(AlignmentI align, SequenceI s, + SequenceI[] tosort,int start, int end) + { int nSeq = align.getHeight(); float[] scores = new float[nSeq]; @@ -194,6 +221,38 @@ public class AlignmentSorter sortIdAscending = !sortIdAscending; } + /** + * Sorts by sequence length + * + * @param align + * The alignment object to sort + */ + public static void sortByLength(AlignmentI align) + { + int nSeq = align.getHeight(); + + float[] length = new float[nSeq]; + SequenceI[] seqs = new SequenceI[nSeq]; + + for (int i = 0; i < nSeq; i++) + { + seqs[i] = align.getSequenceAt(i); + length[i] = (float) (seqs[i].getEnd()-seqs[i].getStart()); + } + + QuickSort.sort(length, seqs); + + if (sortLengthAscending) + { + setReverseOrder(align, seqs); + } + else + { + setOrder(align, seqs); + } + + sortLengthAscending = !sortLengthAscending; + } /** * Sorts the alignment by size of group.
@@ -590,7 +649,7 @@ public class AlignmentSorter { if (!hasScore[i]) { - scores[i] = (max + i); + scores[i] = (max + i+1.0); } } } @@ -606,4 +665,231 @@ public class AlignmentSorter setReverseOrder(alignment, seqs); } } + /** + * types of feature ordering: + * Sort by score : average score - or total score - over all features in region + * Sort by feature label text: (or if null - feature type text) - numerical or alphabetical + * Sort by feature density: based on counts - ignoring individual text or scores for each feature + */ + public static String FEATURE_SCORE="average_score"; + public static String FEATURE_LABEL="text"; + public static String FEATURE_DENSITY="density"; + + /** + * sort the alignment using the features on each sequence found between start and stop with the given featureLabel (and optional group qualifier) + * @param featureLabel (may not be null) + * @param groupLabel (may be null) + * @param start (-1 to include non-positional features) + * @param stop (-1 to only sort on non-positional features) + * @param alignment - aligned sequences containing features + * @param method - one of the string constants FEATURE_SCORE, FEATURE_LABEL, FEATURE_DENSITY + */ + public static void sortByFeature(String featureLabel, String groupLabel, int start, int stop, + AlignmentI alignment, String method) + { + sortByFeature(featureLabel==null ? null : new String[] {featureLabel}, + groupLabel==null ? null : new String[] {groupLabel}, start, stop, alignment, method); + } + private static boolean containsIgnoreCase(final String lab, final String[] labs) + { + if (labs==null) + { + return true; + } + if (lab==null) + { + return false; + } + for (int q=0;q sstop) + || + // or ignore based on selection criteria + (featureLabels != null && !AlignmentSorter.containsIgnoreCase(sf[f].type, featureLabels)) + || (groupLabels != null + // problem here: we cannot eliminate null feature group features + && (sf[f].getFeatureGroup() != null + && !AlignmentSorter.containsIgnoreCase(sf[f].getFeatureGroup(), groupLabels)))) + { + // forget about this feature + sf[f] = null; + n--; + } else { + // or, also take a look at the scores if necessary. + if (!ignoreScore && sf[f].getScore()!=Float.NaN) + { + if (seqScores[i]==0) + { + hasScores++; + } + seqScores[i]++; + hasScore[i] = true; + scores[i] += sf[f].getScore(); // take the first instance of this + // score. + } + } + } + SequenceFeature[] fs; + feats[i] = fs = new SequenceFeature[n]; + if (n>0) + { + n=0; + for (int f=0;f scores[i]) + { + min = scores[i]; + } + } + } + } + + if (method==FEATURE_SCORE) + { + if (hasScores == 0) + { + return; // do nothing - no scores present to sort by. + } + // pad score matrix + if (hasScores < seqs.length) + { + for (int i = 0; i < seqs.length; i++) + { + if (!hasScore[i]) + { + scores[i] = (max + i); + } else { + int nf=(feats[i]==null) ? 0 :((SequenceFeature[]) feats[i]).length; + System.err.println("Sorting on Score: seq "+seqs[i].getName()+ " Feats: "+nf+" Score : "+scores[i]); + } + } + } + + jalview.util.QuickSort.sort(scores, seqs); + } + else + if (method==FEATURE_DENSITY) + { + + // break ties between equivalent numbers for adjacent sequences by adding 1/Nseq*i on the original order + double fr = 0.9/(1.0*seqs.length); + for (int i=0;i