recover original data for tree and pca as alignment view.
[jalview.git] / src / jalview / analysis / NJTree.java
index 0683265..674af7f 100755 (executable)
@@ -39,6 +39,11 @@ public class NJTree
 {\r
     Vector cluster;\r
     SequenceI[] sequence;\r
+\r
+    //SequenceData is a string representation of what the user\r
+    //sees. The display may contain hidden columns.\r
+    public AlignmentView seqData=null;\r
+\r
     int[] done;\r
     int noseqs;\r
     int noClus;\r
@@ -58,29 +63,62 @@ public class NJTree
     String pwtype;\r
     Object found = null;\r
     Object leaves = null;\r
-    int start;\r
-    int end;\r
+\r
+    boolean hasDistances = true; // normal case for jalview trees\r
+    boolean hasBootstrap = false; // normal case for jalview trees\r
+\r
+    private boolean hasRootDistance = true;\r
 \r
     /**\r
-     * Creates a new NJTree object.\r
-     *\r
-     * @param node DOCUMENT ME!\r
+     * Create a new NJTree object with leaves associated with sequences in seqs,\r
+     * and original alignment data represented by Cigar strings.\r
+     * @param seqs SequenceI[]\r
+     * @param odata Cigar[]\r
+     * @param treefile NewickFile\r
      */\r
-    public NJTree(SequenceNode node)\r
-    {\r
-        top = node;\r
-        maxheight = findHeight(top);\r
+    public NJTree(SequenceI[] seqs, AlignmentView odata, NewickFile treefile) {\r
+      this(seqs, treefile);\r
+      if (odata!=null)\r
+        seqData = odata;\r
+      /*\r
+      sequenceString = new String[odata.length];\r
+      char gapChar = jalview.util.Comparison.GapChars.charAt(0);\r
+      for (int i = 0; i < odata.length; i++)\r
+      {\r
+        SequenceI oseq_aligned = odata[i].getSeq(gapChar);\r
+          sequenceString[i] = oseq_aligned.getSequence();\r
+      } */\r
     }\r
 \r
     /**\r
-     * Creates a new NJTree object.\r
+     * Creates a new NJTree object from a tree from an external source\r
      *\r
-     * @param seqs DOCUMENT ME!\r
-     * @param treefile DOCUMENT ME!\r
+     * @param seqs SequenceI which should be associated with leafs of treefile\r
+     * @param treefile A parsed tree\r
      */\r
-    public NJTree(SequenceI[] seqs, NewickFile treefile)\r
+    public NJTree(SequenceI[] seqs,  NewickFile treefile)\r
     {\r
+        this.sequence = seqs;\r
         top = treefile.getTree();\r
+\r
+        /**\r
+         * There is no dependent alignment to be recovered from an\r
+         * imported tree.\r
+         *\r
+        if (sequenceString == null)\r
+        {\r
+          sequenceString = new String[seqs.length];\r
+          for (int i = 0; i < seqs.length; i++)\r
+          {\r
+            sequenceString[i] = seqs[i].getSequence();\r
+          }\r
+        }\r
+        */\r
+\r
+        hasDistances = treefile.HasDistances();\r
+        hasBootstrap = treefile.HasBootstrap();\r
+        hasRootDistance = treefile.HasRootDistance();\r
+\r
         maxheight = findHeight(top);\r
 \r
         SequenceIdMatcher algnIds = new SequenceIdMatcher(seqs);\r
@@ -123,32 +161,33 @@ public class NJTree
      * Creates a new NJTree object.\r
      *\r
      * @param sequence DOCUMENT ME!\r
-     * @param start DOCUMENT ME!\r
-     * @param end DOCUMENT ME!\r
-     */\r
-    public NJTree(SequenceI[] sequence, int start, int end)\r
-    {\r
-        this(sequence, "NJ", "BL", start, end);\r
-    }\r
-\r
-    /**\r
-     * Creates a new NJTree object.\r
-     *\r
-     * @param sequence DOCUMENT ME!\r
      * @param type DOCUMENT ME!\r
      * @param pwtype DOCUMENT ME!\r
      * @param start DOCUMENT ME!\r
      * @param end DOCUMENT ME!\r
      */\r
-    public NJTree(SequenceI[] sequence, String type, String pwtype, int start,\r
-        int end)\r
+    public NJTree(SequenceI[] sequence,\r
+                  AlignmentView seqData,\r
+                  String type,\r
+                  String pwtype,\r
+                  int start, int end)\r
     {\r
         this.sequence = sequence;\r
         this.node = new Vector();\r
         this.type = type;\r
         this.pwtype = pwtype;\r
-        this.start = start;\r
-        this.end = end;\r
+        if (seqData!=null) {\r
+          this.seqData = seqData;\r
+        } else {\r
+          SeqCigar[] seqs = new SeqCigar[sequence.length];\r
+          for(int i=0; i<sequence.length; i++)\r
+            {\r
+              seqs[i] = new SeqCigar(sequence[i], start, end);\r
+            }\r
+            CigarArray sdata = new CigarArray(seqs);\r
+            sdata.addOperation(CigarArray.M, end-start+1);\r
+            this.seqData = new AlignmentView(sdata);\r
+        }\r
 \r
         if (!(type.equals("NJ")))\r
         {\r
@@ -172,7 +211,7 @@ public class NJTree
 \r
         noseqs = i++;\r
 \r
-        distance = findDistances();\r
+        distance = findDistances(this.seqData.getSequenceStrings(Comparison.GapChars.charAt(0)));\r
 \r
         makeLeaves();\r
 \r
@@ -581,7 +620,7 @@ public class NJTree
      *\r
      * @return DOCUMENT ME!\r
      */\r
-    public float[][] findDistances()\r
+    public float[][] findDistances(String[] sequenceString)\r
     {\r
         float[][] distance = new float[noseqs][noseqs];\r
 \r
@@ -598,7 +637,8 @@ public class NJTree
                     else\r
                     {\r
                         distance[i][j] = 100 -\r
-                            Comparison.PID(sequence[i], sequence[j], start, end);\r
+                             Comparison.PID(sequenceString[i], sequenceString[j]);\r
+\r
                         distance[j][i] = distance[i][j];\r
                     }\r
                 }\r
@@ -607,20 +647,20 @@ public class NJTree
         else if (pwtype.equals("BL"))\r
         {\r
             int maxscore = 0;\r
-\r
+            int end = sequenceString[0].length();\r
             for (int i = 0; i < (noseqs - 1); i++)\r
             {\r
                 for (int j = i; j < noseqs; j++)\r
                 {\r
                     int score = 0;\r
 \r
-                    for (int k = start; k < end; k++)\r
+                    for (int k = 0; k < end; k++)\r
                     {\r
                         try\r
                         {\r
-                            score += ResidueProperties.getBLOSUM62(sequence[i].getSequence(\r
-                                    k, k + 1), sequence[j].getSequence(k, k +\r
-                                    1));\r
+                            score += ResidueProperties.getBLOSUM62(\r
+                              sequenceString[i].substring(k, k + 1),\r
+                              sequenceString[j].substring(k, k + 1));\r
                         }\r
                         catch (Exception ex)\r
                         {\r
@@ -647,7 +687,7 @@ public class NJTree
                 }\r
             }\r
         }\r
-        else if (pwtype.equals("SW"))\r
+      /*  else if (pwtype.equals("SW"))\r
         {\r
             float max = -1;\r
 \r
@@ -676,7 +716,7 @@ public class NJTree
                     distance[j][i] = distance[i][j];\r
                 }\r
             }\r
-        }\r
+        }/*/\r
 \r
         return distance;\r
     }\r
@@ -966,13 +1006,40 @@ public class NJTree
 \r
         return top;\r
     }\r
-\r
+    /**\r
+     *\r
+     * @return true if original sequence data can be recovered\r
+     */\r
+    public boolean hasOriginalSequenceData() {\r
+      return seqData!=null;\r
+    }\r
+    /**\r
+     * Returns original alignment data used for calculation - or null where\r
+     * not available.\r
+     *\r
+     * @return null or cut'n'pasteable alignment\r
+     */\r
+    public String printOriginalSequenceData(char gapChar)\r
+    {\r
+      if (seqData==null)\r
+        return null;\r
+\r
+      StringBuffer sb = new StringBuffer();\r
+      String[] seqdatas = seqData.getSequenceStrings(gapChar);\r
+      for(int i=0; i<seqdatas.length; i++)\r
+      {\r
+        sb.append(new jalview.util.Format("%-" + 15 + "s").form(\r
+            sequence[i].getName()));\r
+        sb.append(" "+seqdatas[i]+"\n");\r
+      }\r
+      return sb.toString();\r
+    }\r
     /**\r
      * DOCUMENT ME!\r
      *\r
      * @param node DOCUMENT ME!\r
      */\r
-    public static void printN(SequenceNode node)\r
+    public void printN(SequenceNode node)\r
     {\r
         if (node == null)\r
         {\r
@@ -1134,6 +1201,27 @@ public class NJTree
     {\r
         return top;\r
     }\r
+    /**\r
+     *\r
+     * @return true if tree has real distances\r
+     */\r
+    public boolean isHasDistances() {\r
+      return hasDistances;\r
+    }\r
+\r
+    /**\r
+     *\r
+     * @return true if tree has real bootstrap values\r
+     */\r
+    public boolean isHasBootstrap() {\r
+      return hasBootstrap;\r
+    }\r
+\r
+  public boolean isHasRootDistance()\r
+  {\r
+    return hasRootDistance;\r
+  }\r
+\r
 }\r
 \r
 \r