proper vamsas style binding of alignment sequence objects to newick node labels....
[jalview.git] / src / jalview / io / vamsas / Tree.java
index 82f4f07..de8230c 100644 (file)
@@ -6,16 +6,21 @@ import java.util.Hashtable;
 import java.util.Vector;\r
 \r
 import jalview.analysis.NJTree;\r
+import jalview.analysis.SequenceIdMatcher;\r
 import jalview.bin.Cache;\r
 import jalview.datamodel.AlignmentI;\r
 import jalview.datamodel.AlignmentView;\r
+import jalview.datamodel.BinaryNode;\r
 import jalview.datamodel.SeqCigar;\r
+import jalview.datamodel.Sequence;\r
 import jalview.datamodel.SequenceI;\r
+import jalview.datamodel.SequenceNode;\r
 import jalview.gui.AlignViewport;\r
 import jalview.gui.TreePanel;\r
 import jalview.io.NewickFile;\r
 import jalview.io.VamsasAppDatastore;\r
 import uk.ac.vamsas.client.Vobject;\r
+import uk.ac.vamsas.objects.core.AlignmentSequence;\r
 import uk.ac.vamsas.objects.core.Entry;\r
 import uk.ac.vamsas.objects.core.Input;\r
 import uk.ac.vamsas.objects.core.Newick;\r
@@ -140,11 +145,11 @@ public class Tree extends DatastoreItem
       prov.getEntry(0).setAction("created " + tp.getTitle());\r
       prov.getEntry(0).addInput(vInput);\r
       // jalview's special input parameter for distance matrix calculations\r
-      vInput.setName("jalview:seqdist");\r
+      vInput.setName("jalview:seqdist"); // TODO: settle on appropriate name.\r
       prov.getEntry(0).addParam(new Param());\r
       prov.getEntry(0).getParam(0).setName("treeType");\r
       prov.getEntry(0).getParam(0).setType("utf8");\r
-      prov.getEntry(0).getParam(0).setContent("NJ");\r
+      prov.getEntry(0).getParam(0).setContent("NJ"); // TODO: type of tree is a general parameter\r
       int ranges[] = tp.getTree().seqData.getVisibleContigs();\r
       // VisibleContigs are with respect to alignment coordinates. Still need\r
       // offsets\r
@@ -194,6 +199,59 @@ public class Tree extends DatastoreItem
     return alsq;\r
   }\r
   /**\r
+   *\r
+   * Update jalview newick representation with TreeNode map\r
+\r
+   * @param tp the treepanel that this tree is bound to.\r
+   */\r
+ public void UpdateSequenceTreeMap(TreePanel tp)\r
+ {\r
+   if (tp==null || tree!=null)\r
+     return;\r
+   Vector leaves = new Vector();\r
+   tp.getTree().findLeaves(tp.getTree().getTopNode(), leaves);\r
+   Treenode[] tn = tree.getTreenode(); // todo: select nodes for this particular tree\r
+   int sz = tn.length;\r
+   int i = 0;\r
+   \r
+   while (i < sz)\r
+   {\r
+     Treenode node = tn[i++];\r
+     BinaryNode mappednode = findNodeSpec(node.getNodespec(),leaves);\r
+     if (mappednode!=null && mappednode instanceof SequenceNode) {\r
+       SequenceNode leaf = (SequenceNode) leaves.elementAt(i++);\r
+       // check if we can make the specified association\r
+       Object jvseq = null;\r
+       int vrf=0,refv=0;\r
+       while (jvseq==null && vrf<node.getVrefCount())\r
+       {\r
+         if (refv<node.getVref(vrf).getRefsCount())\r
+         {\r
+           Object noderef = node.getVref(vrf).getRefs(refv++);\r
+           if (noderef instanceof AlignmentSequence)\r
+           {\r
+             // we only make these kind of associations\r
+             jvseq = getvObj2jv((Vobject) noderef);\r
+           }\r
+         } else {\r
+           refv=0;\r
+           vrf++;\r
+         }\r
+       }\r
+       if (jvseq instanceof SequenceI)\r
+       {\r
+         leaf.setElement(jvseq);\r
+         leaf.setPlaceholder(false);\r
+       } else {\r
+         leaf.setPlaceholder(true);\r
+         leaf.setElement(new Sequence(leaf.getName(), "THISISAPLACEHLDER"));\r
+       }\r
+     }\r
+   }\r
+ }\r
+\r
+  /// TODO: refactor to vamsas :start \r
+  /**\r
    * construct treenode mappings for mapped sequences\r
    * \r
    * @param ntree\r
@@ -204,7 +262,6 @@ public class Tree extends DatastoreItem
     ntree.findLeaves(ntree.getTopNode(), leaves);\r
     Vector tnv = new Vector();\r
     Enumeration l = leaves.elements();\r
-    int i=0;\r
     Hashtable nodespecs = new Hashtable();\r
     while (l.hasMoreElements())\r
     {\r
@@ -291,6 +348,7 @@ public class Tree extends DatastoreItem
     }\r
     return bn;\r
   }\r
+  // todo: end refactor to vamsas library\r
   /**\r
    * add jalview object to vamsas document\r
    * \r
@@ -348,7 +406,7 @@ public class Tree extends DatastoreItem
         } else \r
           if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence) {\r
             // recover an AlignmentView for the input data\r
-            javport = (AlignViewport) getvObj2jv(((Vobject)vInput.getObjRef(0)).getV_parent());\r
+            javport = getViewport(((Vobject)vInput.getObjRef(0)).getV_parent());\r
             jal = javport.getAlignment();\r
             jalview.datamodel.SequenceI[] seqs = new jalview.datamodel.SequenceI[vInput.getObjRefCount()];\r
             for (int i=0,iSize=vInput.getObjRefCount(); i<iSize; i++)\r
@@ -395,6 +453,16 @@ public class Tree extends DatastoreItem
     Cache.log.debug("Returning null for input data recovery from provenance.");\r
     return null;\r
   }\r
+  \r
+  private AlignViewport getViewport(Vobject v_parent)\r
+  {\r
+    if (v_parent instanceof uk.ac.vamsas.objects.core.Alignment)\r
+    {\r
+      return datastore.findViewport((uk.ac.vamsas.objects.core.Alignment) v_parent);\r
+    }\r
+    return null;\r
+  }\r
+  \r
   public NewickFile getNewickTree()\r
   {\r
     return ntree;\r
@@ -423,5 +491,4 @@ public class Tree extends DatastoreItem
     }\r
     return false;\r
   }\r
-\r
 }\r