JAL-4366 compute coverage on each side of the pairwise alignment
authorJames Procter <j.procter@dundee.ac.uk>
Fri, 15 Dec 2023 13:56:07 +0000 (13:56 +0000)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 24 May 2024 12:56:25 +0000 (13:56 +0100)
src/jalview/analysis/AlignSeq.java

index ae8638d..1abbda7 100755 (executable)
@@ -99,6 +99,11 @@ public class AlignSeq
   int[] aseq1;
 
   int[] aseq2;
+  
+  /*
+   * matches in alignment
+   */
+  int match=-1;
 
   public String astr1 = "";
 
@@ -327,6 +332,30 @@ public class AlignSeq
             s2.getDatasetSequence() == null ? s2 : s2.getDatasetSequence());
     return alSeq2;
   }
+  /**
+   * fraction of seq2 matched in the alignment
+   * @return NaN or [0..1]
+   */
+  public double getS2Coverage()
+  {
+    if (match>=0)
+    {
+      return ((double)match)/((double)s2.getEnd()-s2.getStart()+1);
+    }
+    return Double.NaN;
+  }
+  /**
+   * fraction of seq1 matched in the alignment
+   * @return NaN or [0..1]
+   */
+  public double getS1Coverage()
+  {
+    if (match>=0)
+    {
+      return ((double)match)/((double)s1.getEnd()-s1.getStart()+1);
+    }
+    return Double.NaN;
+  }
 
   /**
    * Construct score matrix for sequences with standard DNA or PEPTIDE matrix
@@ -441,7 +470,7 @@ public class AlignSeq
 
     aseq1 = new int[seq1.length + seq2.length];
     aseq2 = new int[seq1.length + seq2.length];
-
+    match=0;
     StringBuilder sb1 = new StringBuilder(aseq1.length);
     StringBuilder sb2 = new StringBuilder(aseq2.length);
 
@@ -454,11 +483,11 @@ public class AlignSeq
       sb1.append(s1str.charAt(i));
       aseq2[count] = seq2[j];
       sb2.append(s2str.charAt(j));
-
       trace = findTrace(i, j);
 
       if (trace == 0)
       {
+        match++;
         i--;
         j--;
       }
@@ -491,6 +520,9 @@ public class AlignSeq
     {
       aseq2[count] = seq2[j];
       sb2.append(s2str.charAt(j));
+      if (aseq1[count]!=GAP_INDEX) {
+        match++;
+      }
     }