JAL-98 ProfileI interface for Profile
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 2 Nov 2016 11:56:49 +0000 (11:56 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 2 Nov 2016 11:56:49 +0000 (11:56 +0000)
13 files changed:
src/jalview/analysis/AAFrequency.java
src/jalview/api/AlignViewportI.java
src/jalview/datamodel/Profile.java
src/jalview/datamodel/ProfileI.java [new file with mode: 0644]
src/jalview/datamodel/SequenceGroup.java
src/jalview/renderer/AnnotationRenderer.java
src/jalview/schemes/ColourSchemeI.java
src/jalview/schemes/FollowerColourScheme.java
src/jalview/schemes/ResidueColourScheme.java
src/jalview/viewmodel/AlignmentViewport.java
src/jalview/workers/ConsensusThread.java
test/jalview/analysis/AAFrequencyTest.java
test/jalview/schemes/ResidueColourSchemeTest.java

index 30d5373..6bdffe1 100755 (executable)
@@ -25,6 +25,7 @@ import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.ResidueCount;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.ResidueCount.SymbolCounts;
@@ -64,13 +65,13 @@ public class AAFrequency
     }
   }
 
-  public static final Profile[] calculate(List<SequenceI> list,
+  public static final ProfileI[] calculate(List<SequenceI> list,
           int start, int end)
   {
     return calculate(list, start, end, false);
   }
 
-  public static final Profile[] calculate(List<SequenceI> sequences,
+  public static final ProfileI[] calculate(List<SequenceI> sequences,
           int start, int end, boolean profile)
   {
     SequenceI[] seqs = new SequenceI[sequences.size()];
@@ -86,7 +87,7 @@ public class AAFrequency
         }
       }
 
-      Profile[] reply = new Profile[width];
+      ProfileI[] reply = new ProfileI[width];
 
       if (end >= width)
       {
@@ -112,7 +113,7 @@ public class AAFrequency
    *          if true, store all symbol counts
    */
   public static final void calculate(final SequenceI[] sequences,
-          int start, int end, Profile[] result, boolean saveFullProfile)
+          int start, int end, ProfileI[] result, boolean saveFullProfile)
   {
     // long now = System.currentTimeMillis();
     int seqCount = sequences.length;
@@ -172,7 +173,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)
@@ -233,7 +234,7 @@ public class AAFrequency
    *          number of sequences
    */
   public static void completeConsensus(AlignmentAnnotation consensus,
-          Profile[] profiles, int iStart, int width, boolean ignoreGaps,
+          ProfileI[] profiles, int iStart, int width, boolean ignoreGaps,
           boolean showSequenceLogo, long nseq)
   {
     // long now = System.currentTimeMillis();
@@ -251,7 +252,7 @@ public class AAFrequency
 
     for (int i = iStart; i < width; i++)
     {
-      Profile profile;
+      ProfileI profile;
       if (i >= profiles.length || ((profile = profiles[i]) == null))
       {
         /*
@@ -301,7 +302,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();
@@ -352,7 +353,7 @@ public class AAFrequency
    *          calculations
    * @return
    */
-  public static int[] extractProfile(Profile profile,
+  public static int[] extractProfile(ProfileI profile,
           boolean ignoreGaps)
   {
     int[] rtnval = new int[64];
index 32f9ecd..e30a052 100644 (file)
@@ -26,7 +26,7 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.CigarArray;
 import jalview.datamodel.ColumnSelection;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
@@ -82,7 +82,7 @@ public interface AlignViewportI extends ViewStyleI
 
   ColumnSelection getColumnSelection();
 
-  Profile[] getSequenceConsensusHash();
+  ProfileI[] getSequenceConsensusHash();
 
   /**
    * Get consensus data table for the cDNA complement of this alignment (if any)
@@ -145,7 +145,7 @@ public interface AlignViewportI extends ViewStyleI
    * 
    * @param hconsensus
    */
-  void setSequenceConsensusHash(Profile[] hconsensus);
+  void setSequenceConsensusHash(ProfileI[] hconsensus);
 
   /**
    * Set the cDNA complement consensus for the viewport
index 2951e9e..5464596 100644 (file)
@@ -2,21 +2,20 @@ package jalview.datamodel;
 
 
 /**
- * A data bean to hold the result of computing a profile for a column of an
- * alignment
+ * A profile for one column of an alignment
  * 
  * @author gmcarstairs
  *
  */
-public class Profile
+public class Profile implements ProfileI
 {
   /*
-   * counts of keys (chars)
+   * an object holding counts of symbols in the profile
    */
   private ResidueCount counts;
 
   /*
-   * the number of sequences in the profile
+   * the number of sequences (gapped or not) in the profile
    */
   private int height;
 
@@ -57,24 +56,19 @@ public class Profile
     this.modalResidue = modalRes;
   }
 
-  /**
-   * Set the full profile of counts
-   * 
-   * @param residueCounts
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#setCounts(jalview.datamodel.ResidueCount)
    */
+  @Override
   public void setCounts(ResidueCount residueCounts)
   {
     this.counts = residueCounts;
   }
 
-  /**
-   * Returns the percentage identity of the profile, i.e. the highest proportion
-   * of conserved (equal) symbols. The percentage is as a fraction of all
-   * sequences, or only ungapped sequences if flag ignoreGaps is set true.
-   * 
-   * @param ignoreGaps
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getPercentageIdentity(boolean)
    */
+  @Override
   public float getPercentageIdentity(boolean ignoreGaps)
   {
     if (height == 0)
@@ -93,63 +87,55 @@ public class Profile
     return pid;
   }
 
-  /**
-   * Returns the full symbol counts for this profile
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getCounts()
    */
+  @Override
   public ResidueCount getCounts()
   {
     return counts;
   }
 
-  /**
-   * Returns the number of sequences in the profile
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getHeight()
    */
+  @Override
   public int getHeight()
   {
     return height;
   }
 
-  /**
-   * Returns the number of sequences in the profile which had a gap character
-   * (or were too short to be included in this column's profile)
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getGapped()
    */
+  @Override
   public int getGapped()
   {
     return gapped;
   }
 
-  /**
-   * Returns the highest count for any symbol(s) in the profile
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getMaxCount()
    */
+  @Override
   public int getMaxCount()
   {
     return maxCount;
   }
 
-  /**
-   * Returns the symbol (or concatenated symbols) which have the highest count
-   * in the profile, or an empty string if there were no symbols counted
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getModalResidue()
    */
+  @Override
   public String getModalResidue()
   {
     return modalResidue;
   }
 
-  /**
-   * Answers the number of non-gapped sequences in the profile
-   * 
-   * @return
+  /* (non-Javadoc)
+   * @see jalview.datamodel.ProfileI#getNonGapped()
    */
+  @Override
   public int getNonGapped()
   {
     return height - gapped;
diff --git a/src/jalview/datamodel/ProfileI.java b/src/jalview/datamodel/ProfileI.java
new file mode 100644 (file)
index 0000000..cf2b394
--- /dev/null
@@ -0,0 +1,67 @@
+package jalview.datamodel;
+
+public interface ProfileI
+{
+
+  /**
+   * Set the full profile of counts
+   * 
+   * @param residueCounts
+   */
+  public abstract void setCounts(ResidueCount residueCounts);
+
+  /**
+   * Returns the percentage identity of the profile, i.e. the highest proportion
+   * of conserved (equal) symbols. The percentage is as a fraction of all
+   * sequences, or only ungapped sequences if flag ignoreGaps is set true.
+   * 
+   * @param ignoreGaps
+   * @return
+   */
+  public abstract float getPercentageIdentity(boolean ignoreGaps);
+
+  /**
+   * Returns the full symbol counts for this profile
+   * 
+   * @return
+   */
+  public abstract ResidueCount getCounts();
+
+  /**
+   * Returns the number of sequences in the profile
+   * 
+   * @return
+   */
+  public abstract int getHeight();
+
+  /**
+   * Returns the number of sequences in the profile which had a gap character
+   * (or were too short to be included in this column's profile)
+   * 
+   * @return
+   */
+  public abstract int getGapped();
+
+  /**
+   * Returns the highest count for any symbol(s) in the profile
+   * 
+   * @return
+   */
+  public abstract int getMaxCount();
+
+  /**
+   * Returns the symbol (or concatenated symbols) which have the highest count
+   * in the profile, or an empty string if there were no symbols counted
+   * 
+   * @return
+   */
+  public abstract String getModalResidue();
+
+  /**
+   * Answers the number of non-gapped sequences in the profile
+   * 
+   * @return
+   */
+  public abstract int getNonGapped();
+
+}
\ No newline at end of file
index a92eade..2870a2c 100755 (executable)
@@ -527,7 +527,7 @@ public class SequenceGroup implements AnnotatedCollectionI
     boolean upd = false;
     try
     {
-      Profile[] cnsns = AAFrequency.calculate(sequences, startRes,
+      ProfileI[] cnsns = AAFrequency.calculate(sequences, startRes,
               endRes + 1, showSequenceLogo);
       if (consensus != null)
       {
@@ -599,9 +599,9 @@ public class SequenceGroup implements AnnotatedCollectionI
     c.completeAnnotations(conservation, null, startRes, endRes + 1);
   }
 
-  public Profile[] consensusData = null;
+  public ProfileI[] consensusData = null;
 
-  private void _updateConsensusRow(Profile[] cnsns, long nseq)
+  private void _updateConsensusRow(ProfileI[] cnsns, long nseq)
   {
     if (consensus == null)
     {
index adcedcb..d7ae950 100644 (file)
@@ -28,7 +28,7 @@ import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ResidueProperties;
 import jalview.util.Platform;
@@ -74,7 +74,7 @@ public class AnnotationRenderer
 
   private ColumnSelection columnSelection;
 
-  private Profile[] hconsensus;
+  private ProfileI[] hconsensus;
 
   private Hashtable[] complementConsensus;
 
index 54c8c99..fb71686 100755 (executable)
@@ -21,7 +21,7 @@
 package jalview.schemes;
 
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 
@@ -53,7 +53,7 @@ public interface ColourSchemeI
   /**
    * assign the given consensus profile for the colourscheme
    */
-  public void setConsensus(Profile[] hconsensus);
+  public void setConsensus(ProfileI[] hconsensus);
 
   /**
    * assign the given conservation to the colourscheme
index e1c343c..86fce4e 100644 (file)
@@ -21,7 +21,7 @@
 package jalview.schemes;
 
 import jalview.analysis.Conservation;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 
 /**
  * Colourscheme that takes its colours from some other colourscheme
@@ -40,7 +40,7 @@ public class FollowerColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public void setConsensus(Profile[] consensus)
+  public void setConsensus(ProfileI[] consensus)
   {
     if (colourScheme != null)
     {
index c9abb0e..31b8320 100755 (executable)
@@ -22,7 +22,7 @@ package jalview.schemes;
 
 import jalview.analysis.Conservation;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.util.ColorUtils;
@@ -54,7 +54,7 @@ public class ResidueColourScheme implements ColourSchemeI
   /*
    * Consensus data indexed by column
    */
-  Profile[] consensus;
+  ProfileI[] consensus;
 
   /*
    * Conservation string as a char array 
@@ -234,7 +234,7 @@ public class ResidueColourScheme implements ColourSchemeI
    *          DOCUMENT ME!
    */
   @Override
-  public void setConsensus(Profile[] consensus)
+  public void setConsensus(ProfileI[] consensus)
   {
     if (consensus == null)
     {
index 54215e1..254a201 100644 (file)
@@ -36,7 +36,7 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.CigarArray;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceCollectionI;
@@ -701,7 +701,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   /**
    * results of alignment consensus analysis for visible portion of view
    */
-  protected Profile[] hconsensus = null;
+  protected ProfileI[] hconsensus = null;
 
   /**
    * results of cDNA complement consensus visible portion of view
@@ -735,7 +735,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public void setSequenceConsensusHash(Profile[] hconsensus)
+  public void setSequenceConsensusHash(ProfileI[] hconsensus)
   {
     this.hconsensus = hconsensus;
   }
@@ -747,7 +747,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public Profile[] getSequenceConsensusHash()
+  public ProfileI[] getSequenceConsensusHash()
   {
     return hconsensus;
   }
index 4bd8c48..2b11477 100644 (file)
@@ -26,7 +26,7 @@ import jalview.api.AlignmentViewPanel;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.Annotation;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 
@@ -124,7 +124,7 @@ public class ConsensusThread extends AlignCalcWorker
    */
   protected void computeConsensus(AlignmentI alignment)
   {
-    Profile[] hconsensus = new Profile[alignment.getWidth()];
+    ProfileI[] hconsensus = new ProfileI[alignment.getWidth()];
 
     SequenceI[] aseqs = getSequences();
     AAFrequency.calculate(aseqs, 0, alignment.getWidth(), hconsensus, true);
@@ -144,7 +144,7 @@ public class ConsensusThread extends AlignCalcWorker
   /**
    * @param hconsensus
    */
-  protected void setColourSchemeConsensus(Profile[] hconsensus)
+  protected void setColourSchemeConsensus(ProfileI[] hconsensus)
   {
     ColourSchemeI globalColourScheme = alignViewport
             .getGlobalColourScheme();
@@ -177,7 +177,7 @@ public class ConsensusThread extends AlignCalcWorker
   public void updateResultAnnotation(boolean immediate)
   {
     AlignmentAnnotation consensus = getConsensusAnnotation();
-    Profile[] hconsensus = (Profile[]) getViewportConsensus();
+    ProfileI[] hconsensus = (ProfileI[]) getViewportConsensus();
     if (immediate || !calcMan.isWorking(this) && consensus != null
             && hconsensus != null)
     {
@@ -195,7 +195,7 @@ public class ConsensusThread extends AlignCalcWorker
    *          the computed consensus data
    */
   protected void deriveConsensus(AlignmentAnnotation consensusAnnotation,
-          Profile[] hconsensus)
+          ProfileI[] hconsensus)
   {
     long nseq = getSequences().length;
     AAFrequency.completeConsensus(consensusAnnotation, hconsensus, 0,
index bb3510a..1c04b8e 100644 (file)
@@ -25,7 +25,7 @@ import static org.testng.AssertJUnit.assertNull;
 
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
-import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 
@@ -41,12 +41,12 @@ public class AAFrequencyTest
     SequenceI seq3 = new Sequence("Seq3", "C---G");
     SequenceI seq4 = new Sequence("Seq4", "CA--t");
     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
-    Profile[] result = new Profile[seq1.getLength()];
+    ProfileI[] result = new ProfileI[seq1.getLength()];
 
     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, false);
 
     // col 0 is 100% C
-    Profile col = result[0];
+    ProfileI col = result[0];
     assertEquals(100f, col.getPercentageIdentity(false));
     assertEquals(100f, col.getPercentageIdentity(true));
     assertEquals(4, col.getMaxCount());
@@ -90,10 +90,10 @@ public class AAFrequencyTest
     SequenceI seq3 = new Sequence("Seq3", "C--G");
     SequenceI seq4 = new Sequence("Seq4", "CA-t");
     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
-    Profile[] result = new Profile[seq1.getLength()];
+    ProfileI[] result = new ProfileI[seq1.getLength()];
 
     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, true);
-    Profile profile = result[0];
+    ProfileI profile = result[0];
     assertEquals(4, profile.getCounts().getCount('C'));
     assertEquals(4, profile.getHeight());
     assertEquals(4, profile.getNonGapped());
@@ -124,7 +124,7 @@ public class AAFrequencyTest
     SequenceI seq3 = new Sequence("Seq3", "C--G");
     SequenceI seq4 = new Sequence("Seq4", "CA-t");
     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
-    Profile[] result = new Profile[seq1.getLength()];
+    ProfileI[] result = new ProfileI[seq1.getLength()];
 
     // ensure class loaded and initialized
     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, true);
@@ -154,7 +154,7 @@ public class AAFrequencyTest
     SequenceI seq3 = new Sequence("Seq3", "C---G");
     SequenceI seq4 = new Sequence("Seq4", "CA--t");
     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
-    Profile[] profiles = new Profile[seq1.getLength()];
+    ProfileI[] profiles = new ProfileI[seq1.getLength()];
     AAFrequency.calculate(seqs, 0, seq1.getLength(), profiles, true);
 
     AlignmentAnnotation consensus = new AlignmentAnnotation("Consensus",
@@ -195,7 +195,7 @@ public class AAFrequencyTest
     SequenceI seq3 = new Sequence("Seq3", "C---G");
     SequenceI seq4 = new Sequence("Seq4", "CA--t");
     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
-    Profile[] profiles = new Profile[seq1.getLength()];
+    ProfileI[] profiles = new ProfileI[seq1.getLength()];
     AAFrequency.calculate(seqs, 0, seq1.getLength(), profiles, true);
   
     AlignmentAnnotation consensus = new AlignmentAnnotation("Consensus",
index dcd9f94..318ba3f 100644 (file)
@@ -5,6 +5,7 @@ import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertTrue;
 
 import jalview.datamodel.Profile;
+import jalview.datamodel.ProfileI;
 
 import java.awt.Color;
 
@@ -22,7 +23,7 @@ public class ResidueColourSchemeTest
      * SR-T
      * SR-T
      */
-    Profile[] profiles = new Profile[4]; 
+    ProfileI[] profiles = new ProfileI[4]; 
     profiles[0] = new Profile(4, 0, 2, "AS");
     profiles[1] = new Profile(4, 0, 4, "R");
     profiles[2] = new Profile(4, 4, 0, "");