Merge branch 'develop' into features/JAL-250_hideredundantseqs
[jalview.git] / src / jalview / analysis / AlignSeq.java
index 6bf812c..98f257f 100755 (executable)
@@ -116,16 +116,19 @@ public class AlignSeq
 
   String type; // AlignSeq.PEP or AlignSeq.DNA
 
-  private ScoreMatrix scoreModel;
+  private ScoreMatrix scoreMatrix;
 
   private static final int GAP_INDEX = -1;
 
   /**
    * Creates a new AlignSeq object.
    * 
-   * @param s1 first sequence for alignment
-   * @param s2 second sequence for alignment
-   * @param type molecule type, either AlignSeq.PEP or AlignSeq.DNA
+   * @param s1
+   *          first sequence for alignment
+   * @param s2
+   *          second sequence for alignment
+   * @param type
+   *          molecule type, either AlignSeq.PEP or AlignSeq.DNA
    */
   public AlignSeq(SequenceI s1, SequenceI s2, String type)
   {
@@ -258,8 +261,8 @@ public class AlignSeq
     SequenceI alSeq1 = new Sequence(s1.getName(), getAStr1());
     alSeq1.setStart(s1.getStart() + getSeq1Start() - 1);
     alSeq1.setEnd(s1.getStart() + getSeq1End() - 1);
-    alSeq1.setDatasetSequence(s1.getDatasetSequence() == null ? s1 : s1
-            .getDatasetSequence());
+    alSeq1.setDatasetSequence(
+            s1.getDatasetSequence() == null ? s1 : s1.getDatasetSequence());
     return alSeq1;
   }
 
@@ -272,8 +275,8 @@ public class AlignSeq
     SequenceI alSeq2 = new Sequence(s2.getName(), getAStr2());
     alSeq2.setStart(s2.getStart() + getSeq2Start() - 1);
     alSeq2.setEnd(s2.getStart() + getSeq2End() - 1);
-    alSeq2.setDatasetSequence(s2.getDatasetSequence() == null ? s2 : s2
-            .getDatasetSequence());
+    alSeq2.setDatasetSequence(
+            s2.getDatasetSequence() == null ? s2 : s2.getDatasetSequence());
     return alSeq2;
   }
 
@@ -314,9 +317,9 @@ public class AlignSeq
 
     if (s1str.length() == 0 || s2str.length() == 0)
     {
-      output.append("ALL GAPS: "
-              + (s1str.length() == 0 ? s1.getName() : " ")
-              + (s2str.length() == 0 ? s2.getName() : ""));
+      output.append(
+              "ALL GAPS: " + (s1str.length() == 0 ? s1.getName() : " ")
+                      + (s2str.length() == 0 ? s2.getName() : ""));
       return;
     }
 
@@ -337,14 +340,14 @@ public class AlignSeq
     if (!PEP.equals(moleculeType) && !DNA.equals(moleculeType))
     {
       output.append("Wrong type = dna or pep only");
-      throw new Error(MessageManager.formatMessage(
-              "error.unknown_type_dna_or_pep",
-              new String[] { moleculeType }));
+      throw new Error(MessageManager
+              .formatMessage("error.unknown_type_dna_or_pep", new String[]
+              { moleculeType }));
     }
 
     type = moleculeType;
-    scoreModel = ScoreModels.getInstance().getDefaultModel(
-            PEP.equals(type));
+    scoreMatrix = ScoreModels.getInstance()
+            .getDefaultModel(PEP.equals(type));
   }
 
   /**
@@ -589,7 +592,7 @@ public class AlignSeq
   {
     int t = 0;
     // float pairwiseScore = lookup[seq1[i]][seq2[j]];
-    float pairwiseScore = scoreModel.getPairwiseScore(s1str.charAt(i),
+    float pairwiseScore = scoreMatrix.getPairwiseScore(s1str.charAt(i),
             s2str.charAt(j));
     float max = score[i - 1][j - 1] + (pairwiseScore * 10);
 
@@ -635,7 +638,7 @@ public class AlignSeq
     int m = seq2.length;
 
     // top left hand element
-    score[0][0] = scoreModel.getPairwiseScore(s1str.charAt(0),
+    score[0][0] = scoreMatrix.getPairwiseScore(s1str.charAt(0),
             s2str.charAt(0)) * 10;
     E[0][0] = -gapExtend;
     F[0][0] = 0;
@@ -647,7 +650,7 @@ public class AlignSeq
       E[0][j] = max(score[0][j - 1] - gapOpen, E[0][j - 1] - gapExtend);
       F[0][j] = -gapExtend;
 
-      float pairwiseScore = scoreModel.getPairwiseScore(s1str.charAt(0),
+      float pairwiseScore = scoreMatrix.getPairwiseScore(s1str.charAt(0),
               s2str.charAt(j));
       score[0][j] = max(pairwiseScore * 10, -gapOpen, -gapExtend);
 
@@ -660,7 +663,7 @@ public class AlignSeq
       E[i][0] = -gapOpen;
       F[i][0] = max(score[i - 1][0] - gapOpen, F[i - 1][0] - gapExtend);
 
-      float pairwiseScore = scoreModel.getPairwiseScore(s1str.charAt(i),
+      float pairwiseScore = scoreMatrix.getPairwiseScore(s1str.charAt(i),
               s2str.charAt(0));
       score[i][0] = max(pairwiseScore * 10, E[i][0], F[i][0]);
       traceback[i][0] = -1;
@@ -674,10 +677,10 @@ public class AlignSeq
         E[i][j] = max(score[i][j - 1] - gapOpen, E[i][j - 1] - gapExtend);
         F[i][j] = max(score[i - 1][j] - gapOpen, F[i - 1][j] - gapExtend);
 
-        float pairwiseScore = scoreModel.getPairwiseScore(s1str.charAt(i),
+        float pairwiseScore = scoreMatrix.getPairwiseScore(s1str.charAt(i),
                 s2str.charAt(j));
-        score[i][j] = max(score[i - 1][j - 1]
-                + (pairwiseScore * 10), E[i][j], F[i][j]);
+        score[i][j] = max(score[i - 1][j - 1] + (pairwiseScore * 10),
+                E[i][j], F[i][j]);
         traceback[i][j] = findTrace(i, j);
       }
     }
@@ -776,7 +779,7 @@ public class AlignSeq
     for (int i = 0; i < s.length(); i++)
     {
       char c = s.charAt(i);
-      encoded[i] = scoreModel.getMatrixIndex(c);
+      encoded[i] = scoreMatrix.getMatrixIndex(c);
     }
 
     return encoded;
@@ -863,7 +866,8 @@ public class AlignSeq
    */
   public jalview.datamodel.Mapping getMappingFromS1(boolean allowmismatch)
   {
-    ArrayList<Integer> as1 = new ArrayList<Integer>(), as2 = new ArrayList<Integer>();
+    ArrayList<Integer> as1 = new ArrayList<Integer>(),
+            as2 = new ArrayList<Integer>();
     int pdbpos = s2.getStart() + getSeq2Start() - 2;
     int alignpos = s1.getStart() + getSeq1Start() - 2;
     int lp2 = pdbpos - 3, lp1 = alignpos - 3;
@@ -907,8 +911,8 @@ public class AlignSeq
     }
     // construct range pairs
 
-    int[] mapseq1 = new int[as1.size() + (lastmatch ? 1 : 0)], mapseq2 = new int[as2
-            .size() + (lastmatch ? 1 : 0)];
+    int[] mapseq1 = new int[as1.size() + (lastmatch ? 1 : 0)],
+            mapseq2 = new int[as2.size() + (lastmatch ? 1 : 0)];
     int i = 0;
     for (Integer ip : as1)
     {
@@ -951,7 +955,8 @@ public class AlignSeq
           List<SequenceI> ochains, AlignmentI al, String dnaOrProtein,
           boolean removeOldAnnots)
   {
-    List<SequenceI> orig = new ArrayList<SequenceI>(), repl = new ArrayList<SequenceI>();
+    List<SequenceI> orig = new ArrayList<SequenceI>(),
+            repl = new ArrayList<SequenceI>();
     List<AlignSeq> aligs = new ArrayList<AlignSeq>();
     if (al != null && al.getHeight() > 0)
     {
@@ -1052,8 +1057,18 @@ public class AlignSeq
           SequenceI[] originalSequences, String[] omitHidden, int start,
           int end, boolean ungapped)
   {
+    return (float[]) computeRedundancyMatrixWithRep(originalSequences,
+            omitHidden, start, end, ungapped)[0];
+  }
+
+  public static Object[] computeRedundancyMatrixWithRep(
+          SequenceI[] originalSequences, String[] omitHidden, int start,
+          int end, boolean ungapped)
+  {
+
     int height = originalSequences.length;
     float[] redundancy = new float[height];
+    SequenceI[] rep = new SequenceI[height];
     int[] lngth = new int[height];
     for (int i = 0; i < height; i++)
     {
@@ -1110,15 +1125,23 @@ public class AlignSeq
         // use real sequence length rather than string length
         if (lngth[j] < lngth[i])
         {
-          redundancy[j] = Math.max(pid, redundancy[j]);
+          if (pid > redundancy[j])
+          {
+            rep[j] = originalSequences[i];
+            redundancy[j] = pid;
+          }
         }
         else
         {
-          redundancy[i] = Math.max(pid, redundancy[i]);
+          if (pid > redundancy[i])
+          {
+            rep[i] = originalSequences[j];
+            redundancy[i] = pid;
+          }
         }
 
       }
     }
-    return redundancy;
+    return new Object[] { redundancy, rep };
   }
 }