X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAAFrequency.java;h=0e055e450a3ae6983946062d4e28bf56c39ab551;hb=679e63aab1a22d128bf429a07514eb15f8b288e1;hp=61e11c4ec70f9da32b93ae5259cae2f4f7ce4019;hpb=d94db336381e48d9155736ca4ea058d9f747439c;p=jalview.git diff --git a/src/jalview/analysis/AAFrequency.java b/src/jalview/analysis/AAFrequency.java index 61e11c4..0e055e4 100755 --- a/src/jalview/analysis/AAFrequency.java +++ b/src/jalview/analysis/AAFrequency.java @@ -20,11 +20,20 @@ */ package jalview.analysis; -import jalview.analysis.ResidueCount.SymbolCounts; +import java.util.Arrays; +import java.util.Hashtable; +import java.util.List; + import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.Annotation; +import jalview.datamodel.Profile; +import jalview.datamodel.ProfileI; +import jalview.datamodel.Profiles; +import jalview.datamodel.ProfilesI; +import jalview.datamodel.ResidueCount; +import jalview.datamodel.ResidueCount.SymbolCounts; import jalview.datamodel.SequenceI; import jalview.ext.android.SparseIntArray; import jalview.util.Comparison; @@ -32,10 +41,6 @@ import jalview.util.Format; import jalview.util.MappingUtils; import jalview.util.QuickSort; -import java.util.Arrays; -import java.util.Hashtable; -import java.util.List; - /** * Takes in a vector or array of sequences and column start and column end and * returns a new Hashtable[] of size maxSeqLength, if Hashtable not supplied. @@ -62,13 +67,13 @@ public class AAFrequency } } - public static final Profile[] calculate(List list, - int start, int end) + public static final ProfilesI calculate(List list, int start, + int end) { return calculate(list, start, end, false); } - public static final Profile[] calculate(List sequences, + public static final ProfilesI calculate(List sequences, int start, int end, boolean profile) { SequenceI[] seqs = new SequenceI[sequences.size()]; @@ -78,20 +83,19 @@ public class AAFrequency for (int i = 0; i < sequences.size(); i++) { seqs[i] = sequences.get(i); - if (seqs[i].getLength() > width) + int length = seqs[i].getLength(); + if (length > width) { - width = seqs[i].getLength(); + width = length; } } - Profile[] reply = new Profile[width]; - if (end >= width) { end = width; } - calculate(seqs, start, end, reply, profile); + ProfilesI reply = calculate(seqs, width, start, end, profile); return reply; } } @@ -100,17 +104,17 @@ public class AAFrequency * Calculate the consensus symbol(s) for each column in the given range. * * @param sequences + * @param width + * the full width of the alignment * @param start * start column (inclusive, base zero) * @param end * end column (exclusive) - * @param result - * array in which to store profile per column * @param saveFullProfile * if true, store all symbol counts */ - public static final void calculate(final SequenceI[] sequences, - int start, int end, Profile[] result, boolean saveFullProfile) + public static final ProfilesI calculate(final SequenceI[] sequences, + int width, int start, int end, boolean saveFullProfile) { // long now = System.currentTimeMillis(); int seqCount = sequences.length; @@ -118,6 +122,8 @@ public class AAFrequency int nucleotideCount = 0; int peptideCount = 0; + ProfileI[] result = new ProfileI[width]; + for (int column = start; column < end; column++) { /* @@ -170,7 +176,7 @@ public class AAFrequency int maxCount = residueCounts.getModalCount(); String maxResidue = residueCounts.getResiduesForCount(maxCount); int gapCount = residueCounts.getGapCount(); - Profile profile = new Profile(seqCount, gapCount, maxCount, + ProfileI profile = new Profile(seqCount, gapCount, maxCount, maxResidue); if (saveFullProfile) @@ -180,6 +186,7 @@ public class AAFrequency result[column] = profile; } + return new Profiles(result); // long elapsed = System.currentTimeMillis() - now; // System.out.println(elapsed); } @@ -218,10 +225,10 @@ public class AAFrequency * the annotation row to add annotations to * @param profiles * the source consensus data - * @param iStart - * start column - * @param width - * end column + * @param startCol + * start column (inclusive) + * @param endCol + * end column (exclusive) * @param ignoreGaps * if true, normalise residue percentages ignoring gaps * @param showSequenceLogo @@ -231,12 +238,12 @@ public class AAFrequency * number of sequences */ public static void completeConsensus(AlignmentAnnotation consensus, - Profile[] profiles, int iStart, int width, boolean ignoreGaps, + ProfilesI profiles, int startCol, int endCol, boolean ignoreGaps, boolean showSequenceLogo, long nseq) { // long now = System.currentTimeMillis(); if (consensus == null || consensus.annotations == null - || consensus.annotations.length < width) + || consensus.annotations.length < endCol) { /* * called with a bad alignment annotation row @@ -245,21 +252,21 @@ public class AAFrequency return; } - final int dp = getPercentageDp(nseq); - - for (int i = iStart; i < width; i++) + for (int i = startCol; i < endCol; i++) { - Profile profile; - if (i >= profiles.length || ((profile = profiles[i]) == null)) + ProfileI profile = profiles.get(i); + if (profile == null) { /* * happens if sequences calculated over were * shorter than alignment width */ consensus.annotations[i] = null; - continue; + return; } + final int dp = getPercentageDp(nseq); + float value = profile.getPercentageIdentity(ignoreGaps); String description = getTooltip(profile, value, showSequenceLogo, @@ -274,14 +281,63 @@ public class AAFrequency { modalResidue = "+"; } - consensus.annotations[i] = new Annotation(modalResidue, - description, ' ', value); + consensus.annotations[i] = new Annotation(modalResidue, description, + ' ', value); } // long elapsed = System.currentTimeMillis() - now; // System.out.println(-elapsed); } /** + * Derive the gap count annotation row. + * + * @param consensus + * the annotation row to add annotations to + * @param profiles + * the source consensus data + * @param startCol + * start column (inclusive) + * @param endCol + * end column (exclusive) + */ + public static void completeGapAnnot(AlignmentAnnotation consensus, + ProfilesI profiles, int startCol, int endCol, long nseq) + { + if (consensus == null || consensus.annotations == null + || consensus.annotations.length < endCol) + { + /* + * called with a bad alignment annotation row + * wait for it to be initialised properly + */ + return; + } + // always set ranges again + consensus.graphMax = nseq; + consensus.graphMin = 0; + for (int i = startCol; i < endCol; i++) + { + ProfileI profile = profiles.get(i); + if (profile == null) + { + /* + * happens if sequences calculated over were + * shorter than alignment width + */ + consensus.annotations[i] = null; + return; + } + + final int gapped = profile.getGapped(); + + String description = String.valueOf(gapped); + + consensus.annotations[i] = new Annotation("", description, '0', + gapped); + } + } + + /** * Returns a tooltip showing either *
    *
  • the full profile (percentages of all residues present), if @@ -299,7 +355,7 @@ public class AAFrequency * the number of decimal places to format percentages to * @return */ - static String getTooltip(Profile profile, float pid, + static String getTooltip(ProfileI profile, float pid, boolean showSequenceLogo, boolean ignoreGaps, int dp) { ResidueCount counts = profile.getCounts(); @@ -350,8 +406,7 @@ public class AAFrequency * calculations * @return */ - public static int[] extractProfile(Profile profile, - boolean ignoreGaps) + public static int[] extractProfile(ProfileI profile, boolean ignoreGaps) { int[] rtnval = new int[64]; ResidueCount counts = profile.getCounts();