Implemented CIGAR representation of an Alignment view for passing to
[jalview.git] / src / jalview / analysis / NJTree.java
index 20d28f7..98916e3 100755 (executable)
@@ -42,7 +42,7 @@ public class NJTree
 \r
     //SequenceData is a string representation of what the user\r
     //sees. The display may contain hidden columns.\r
-    String [] sequenceString;\r
+    CigarArray seqData=null;\r
 \r
     int[] done;\r
     int noseqs;\r
@@ -69,26 +69,51 @@ public class NJTree
 \r
     private boolean hasRootDistance = true;\r
 \r
+    /**\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(SequenceI[] seqs, CigarArray 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
     {\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[sequence.length];\r
-          for (int i = 0; i < sequence.length; i++)\r
+          sequenceString = new String[seqs.length];\r
+          for (int i = 0; i < seqs.length; i++)\r
           {\r
-            sequenceString[i] = sequence[i].getSequence();\r
+            sequenceString[i] = seqs[i].getSequence();\r
           }\r
         }\r
-\r
+        */\r
 \r
         hasDistances = treefile.HasDistances();\r
         hasBootstrap = treefile.HasBootstrap();\r
@@ -142,7 +167,7 @@ public class NJTree
      * @param end DOCUMENT ME!\r
      */\r
     public NJTree(SequenceI[] sequence,\r
-                  String [] sequenceString,\r
+                  CigarArray seqData,\r
                   String type,\r
                   String pwtype,\r
                   int start, int end)\r
@@ -151,18 +176,17 @@ public class NJTree
         this.node = new Vector();\r
         this.type = type;\r
         this.pwtype = pwtype;\r
-\r
-        if (sequenceString == null)\r
-        {\r
-          this.sequenceString = new String[sequence.length];\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
-            this.sequenceString[i] = sequence[i].getSequence(start, end);\r
-          }\r
+            {\r
+              seqs[i] = new SeqCigar(sequence[i], start, end);\r
+            }\r
+            this.seqData = new CigarArray(seqs);\r
+            this.seqData.addOperation(CigarArray.M, end-start+1);\r
         }\r
-        else\r
-          this.sequenceString = sequenceString;\r
-\r
 \r
         if (!(type.equals("NJ")))\r
         {\r
@@ -186,7 +210,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
@@ -595,7 +619,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
@@ -981,15 +1005,31 @@ 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()\r
     {\r
+      if (seqData==null)\r
+        return null;\r
+//      return seqData.getSequenceString(Comparison.GapChars[0]);\r
       StringBuffer sb = new StringBuffer();\r
-      for(int i=0; i<sequenceString.length; i++)\r
+      String[] seqdatas = seqData.getSequenceStrings(Comparison.GapChars.charAt(0));\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(" "+sequenceString[i]+"\n");\r
+        sb.append(" "+seqdatas[i]+"\n");\r
       }\r
       return sb.toString();\r
     }\r