JAL-838 tests for PID calculation with parameter options
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 27 Feb 2017 18:00:15 +0000 (18:00 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 27 Feb 2017 18:00:15 +0000 (18:00 +0000)
src/jalview/analysis/scoremodels/PIDModel.java
test/jalview/analysis/scoremodels/PIDModelTest.java

index aff1210..24e9a1c 100644 (file)
@@ -103,7 +103,7 @@ public class PIDModel implements SimilarityScoreModelI,
    * @param options
    * @return
    */
-  protected double computePID(String seq1, String seq2,
+  protected static double computePID(String seq1, String seq2,
           SimilarityParamsI options)
   {
     int len1 = seq1.length();
index 24b44a3..d968e0e 100644 (file)
@@ -2,6 +2,7 @@ package jalview.analysis.scoremodels;
 
 import static org.testng.Assert.assertEquals;
 
+import jalview.api.analysis.SimilarityParamsI;
 import jalview.util.Comparison;
 
 import org.testng.annotations.Test;
@@ -31,13 +32,16 @@ public class PIDModelTest
   @Test(groups = "Functional")
   public void testComputePID_matchesComparisonPID()
   {
+    SimilarityParamsI params = new SimilarityParams(true, true, true, true);
+
     /*
      * same length, no gaps
      */
     String s1 = "ARFNQDWSGI";
     String s2 = "ARKNQDQSGI";
-    double newScore = new PIDModel().computePID(s1, s2,
-            SimilarityParams.Jalview);
+
+    new PIDModel();
+    double newScore = PIDModel.computePID(s1, s2, params);
     double oldScore = Comparison.PID(s1, s2);
     assertEquals(newScore, oldScore, DELTA);
 
@@ -46,8 +50,8 @@ public class PIDModelTest
      */
     s1 = "-RFNQDWSGI";
     s2 = "ARKNQ-QSGI";
-    newScore = new PIDModel().computePID(s1, s2,
-            SimilarityParams.Jalview);
+    new PIDModel();
+    newScore = PIDModel.computePID(s1, s2, params);
     oldScore = Comparison.PID(s1, s2);
     assertEquals(newScore, oldScore, DELTA);
 
@@ -56,8 +60,8 @@ public class PIDModelTest
      */
     s1 = "ARK-";
     s2 = "-RFNQ";
-    newScore = new PIDModel().computePID(s1, s2,
-            SimilarityParams.Jalview);
+    new PIDModel();
+    newScore = PIDModel.computePID(s1, s2, params);
     oldScore = Comparison.PID(s1, s2);
     assertEquals(newScore, oldScore, DELTA);
 
@@ -66,8 +70,8 @@ public class PIDModelTest
      */
     s1 = "-RFNQ";
     s2 = "ARK-";
-    newScore = new PIDModel().computePID(s1, s2,
-            SimilarityParams.Jalview);
+    new PIDModel();
+    newScore = PIDModel.computePID(s1, s2, params);
     oldScore = Comparison.PID(s1, s2);
     assertEquals(newScore, oldScore, DELTA);
 
@@ -76,8 +80,92 @@ public class PIDModelTest
      */
     s1 = "-R-F-NQ";
     s2 = "AR-K--";
-    newScore = new PIDModel().computePID(s1, s2, SimilarityParams.Jalview);
+    new PIDModel();
+    newScore = PIDModel.computePID(s1, s2, params);
     oldScore = Comparison.PID(s1, s2);
     assertEquals(newScore, oldScore, DELTA);
   }
+
+  /**
+   * Tests for percentage identity variants where only the shorter length of two
+   * sequences is used
+   */
+  @Test(groups = "Functional")
+  public void testComputePID_matchShortestSequence()
+  {
+    String s1 = "FR-K-S";
+    String s2 = "FS--L";
+
+    /*
+     * match gap-gap and gap-char
+     * PID = 4/5 = 80%
+     */
+    SimilarityParamsI params = new SimilarityParams(true, true, true, true);
+    assertEquals(PIDModel.computePID(s1, s2, params), 80d);
+
+    /*
+     * match gap-char but not gap-gap
+     * PID = 3/4 = 75%
+     */
+    params = new SimilarityParams(false, true, true, true);
+    assertEquals(PIDModel.computePID(s1, s2, params), 75d);
+
+    /*
+     * include gaps but don't match them
+     * include gap-gap, counted as identity
+     * PID = 2/5 = 40%
+     */
+    params = new SimilarityParams(true, false, true, true);
+    assertEquals(PIDModel.computePID(s1, s2, params), 40d);
+
+    /*
+     * include gaps but don't match them
+     * exclude gap-gap
+     * PID = 1/4 = 25%
+     */
+    params = new SimilarityParams(false, false, true, true);
+    assertEquals(PIDModel.computePID(s1, s2, params), 25d);
+  }
+
+  /**
+   * Tests for percentage identity variants where the longer length of two
+   * sequences is used
+   */
+  @Test(groups = "Functional")
+  public void testComputePID_matchLongestSequence()
+  {
+    String s1 = "FR-K-S";
+    String s2 = "FS--L";
+  
+    /*
+     * match gap-gap and gap-char
+     * shorter sequence treated as if with trailing gaps
+     * PID = 5/6 = 83.333...%
+     */
+    SimilarityParamsI params = new SimilarityParams(true, true, true, false);
+    assertEquals(PIDModel.computePID(s1, s2, params), 500d / 6);
+  
+    /*
+     * match gap-char but not gap-gap
+     * PID = 4/5 = 80%
+     */
+    params = new SimilarityParams(false, true, true, false);
+    assertEquals(PIDModel.computePID(s1, s2, params), 80d);
+  
+    /*
+     * include gaps but don't match them
+     * include gap-gap, counted as identity
+     * PID = 2/6 = 33.333...%
+     */
+    params = new SimilarityParams(true, false, true, false);
+    assertEquals(PIDModel.computePID(s1, s2, params), 100d / 3);
+  
+    /*
+     * include gaps but don't match them
+     * exclude gap-gap
+     * PID = 1/5 = 25%
+     */
+    params = new SimilarityParams(false, false, true, false);
+    assertEquals(PIDModel.computePID(s1, s2, params), 20d);
+  }
 }