From: jprocter Date: Mon, 8 Dec 2008 12:37:40 +0000 (+0000) Subject: new sort functions for ordering sequence by annotated features (probably still buggy... X-Git-Tag: Release_2_5~384 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=705e0bc4a3f6ca917e65fecae15c51d87240f49f;p=jalview.git new sort functions for ordering sequence by annotated features (probably still buggy) - sorts on distribution and score --- diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index fe2cfc7..d801ad8 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,226 @@ 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); + } + } + } + + 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