JAL-2704 unit test for Above PID gap colour, simplified findColour() bug/JAL-2704gapColourFading
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 31 Aug 2017 07:47:05 +0000 (08:47 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 31 Aug 2017 07:47:05 +0000 (08:47 +0100)
src/jalview/renderer/ResidueShader.java
test/jalview/renderer/ResidueShaderTest.java

index aa84816..c031170 100644 (file)
@@ -235,6 +235,11 @@ public class ResidueShader implements ResidueShaderI
   @Override
   public Color findColour(char symbol, int position, SequenceI seq)
   {
+    if (colourScheme == null)
+    {
+      return Color.white; // Colour is 'None'
+    }
+
     /*
      * get 'base' colour
      */
@@ -243,9 +248,8 @@ public class ResidueShader implements ResidueShaderI
             : profile.getModalResidue();
     float pid = profile == null ? 0f
             : profile.getPercentageIdentity(ignoreGaps);
-    Color colour = colourScheme == null ? Color.white
-            : colourScheme.findColour(symbol, position, seq, modalResidue,
-                    pid);
+    Color colour = colourScheme.findColour(symbol, position, seq,
+            modalResidue, pid);
 
     /*
      * apply PID threshold and consensus fading if in force
index 26d4b15..eba5f59 100644 (file)
@@ -8,12 +8,15 @@ import jalview.analysis.Conservation;
 import jalview.datamodel.Profile;
 import jalview.datamodel.ProfileI;
 import jalview.datamodel.Profiles;
+import jalview.datamodel.ProfilesI;
+import jalview.datamodel.ResidueCount;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.PIDColourScheme;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.UserColourScheme;
+import jalview.schemes.ZappoColourScheme;
 
 import java.awt.Color;
 import java.util.Collections;
@@ -166,19 +169,26 @@ public class ResidueShaderTest
     assertEquals(Color.WHITE, ccs.applyConservation(colour, 12));
   }
 
-  /**
-   * A custom gap colour should not be affected by Colour by Conservation
-   */
   @Test(groups = "Functional")
   public void testFindColour_gapColour()
   {
+    /*
+     * normally, a gap is coloured white
+     */
+    ResidueShader rs = new ResidueShader(new ZappoColourScheme());
+    assertEquals(Color.white, rs.findColour(' ', 7, null));
+
+    /*
+     * a User Colour Scheme may specify a bespoke gap colour
+     */
     Color[] colours = new Color[ResidueProperties.maxProteinIndex + 1];
     colours[5] = Color.blue; // Q colour
     colours[23] = Color.red; // gap colour
     ColourSchemeI cs = new UserColourScheme(colours);
-    ResidueShader ccs = new ResidueShader(cs);
+    rs = new ResidueShader(cs);
   
-    assertEquals(Color.red, ccs.findColour(' ', 7, null));
+    assertEquals(Color.red, rs.findColour(' ', 7, null));
+    assertEquals(Color.blue, rs.findColour('Q', 7, null));
   
     /*
      * stub Conservation to return a given consensus string
@@ -193,33 +203,131 @@ public class ResidueShaderTest
         return new Sequence("seq", consSequence);
       }
     };
-    ccs.setConservation(cons);
+    rs.setConservation(cons);
   
     /*
      * with 0% threshold, there should be no fading
      */
-    ccs.setConservationInc(0);
-    assertEquals(Color.red, ccs.findColour(' ', 7, null));
-    assertEquals(Color.blue, ccs.findColour('Q', 7, null));
+    rs.setConservationInc(0);
+    assertEquals(Color.red, rs.findColour(' ', 7, null));
+    assertEquals(Color.blue, rs.findColour('Q', 7, null));
   
     /*
      * with 40% threshold, 'fade factor' is 
      * (11-score)/10 * 40/20 = (11-score)/5
      * so position 7, score 7 fades 80% of the way to white (255, 255, 255)
      */
-    ccs.setConservationInc(40);
+    rs.setConservationInc(40);
 
     /*
      * gap colour is unchanged for Conservation
      */
-    assertEquals(Color.red, ccs.findColour(' ', 7, null));
+    assertEquals(Color.red, rs.findColour(' ', 7, null));
+    assertEquals(Color.red, rs.findColour('-', 7, null));
+    assertEquals(Color.red, rs.findColour('.', 7, null));
 
     /*
      * residue colour is faded 80% of the way from
      * blue(0, 0, 255) to white(255, 255, 255)
      * making (204, 204, 255)
      */
-    assertEquals(new Color(204, 204, 255), ccs.findColour('Q', 7, null));
+    assertEquals(new Color(204, 204, 255), rs.findColour('Q', 7, null));
+
+    /*
+     * turn off By Conservation, apply Above Identity Threshold
+     * providing a stub Consensus that has modal residue "Q" with pid 60%
+     */
+    rs.setConservationApplied(false);
+    ProfilesI consensus = getStubConsensus("Q", 60f);
+    rs.setConsensus(consensus);
+
+    // with consensus pid (60) above threshold (50), colours are unchanged
+    rs.setThreshold(50, false);
+    assertEquals(Color.blue, rs.findColour('Q', 7, null));
+    assertEquals(Color.red, rs.findColour('-', 7, null));
+
+    // with consensus pid (60) below threshold (70),
+    // residue colour becomes white, gap colour is unchanged
+    rs.setThreshold(70, false);
+    assertEquals(Color.white, rs.findColour('Q', 7, null));
+    assertEquals(Color.red, rs.findColour('-', 7, null));
   }
 
+  /**
+   * @param modalResidue
+   * @param pid
+   * @return
+   */
+  protected ProfilesI getStubConsensus(final String modalResidue,
+          final float pid)
+  {
+    ProfilesI consensus = new ProfilesI() {
+
+      @Override
+      public ProfileI get(int i)
+      {
+        return new ProfileI() {
+          @Override
+          public void setCounts(ResidueCount residueCounts)
+          {
+          }
+
+          @Override
+          public float getPercentageIdentity(boolean ignoreGaps)
+          {
+            return pid;
+          }
+
+          @Override
+          public ResidueCount getCounts()
+          {
+            return null;
+          }
+
+          @Override
+          public int getHeight()
+          {
+            return 0;
+          }
+
+          @Override
+          public int getGapped()
+          {
+            return 0;
+          }
+
+          @Override
+          public int getMaxCount()
+          {
+            return 0;
+          }
+
+          @Override
+          public String getModalResidue()
+          {
+            return modalResidue;
+          }
+
+          @Override
+          public int getNonGapped()
+          {
+            return 0;
+         }};
+      }
+
+      @Override
+      public int getStartColumn()
+      {
+        return 0;
+      }
+
+      @Override
+      public int getEndColumn()
+      {
+        return 0;
+      }
+      
+    };
+    return consensus;
+  }
 }