X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=cf5a57a4e86a808182a842d87a75af60da874ae4;hb=ca74dc496f023941a3cf5f452506cfb44db211ac;hp=fe2cfc7c7dfb70d5861f72c2dbc52831a3e3c743;hpb=506d60f0e188723ddc91c26824b41ac7034df3fe;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index fe2cfc7..cf5a57a 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -54,9 +54,17 @@ 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; + + /** * Sort by Percentage Identity w.r.t. s * * @param align @@ -590,7 +598,7 @@ public class AlignmentSorter { if (!hasScore[i]) { - scores[i] = (max + i); + scores[i] = (max + i+1.0); } } } @@ -606,4 +614,230 @@ 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 + && (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