import jalview.datamodel.Sequence;\r
import jalview.datamodel.SequenceI;\r
import jalview.datamodel.SequenceNode;\r
+import jalview.gui.AlignFrame;\r
import jalview.gui.AlignViewport;\r
import jalview.gui.TreePanel;\r
import jalview.io.NewickFile;\r
public class Tree extends DatastoreItem\r
{\r
AlignmentI jal;\r
+\r
TreePanel tp;\r
+\r
uk.ac.vamsas.objects.core.Tree tree;\r
+\r
uk.ac.vamsas.objects.core.Alignment alignment; // may be null => dataset or\r
- // other kind of tree\r
+\r
+ // other kind of tree\r
private NewickFile ntree;\r
+\r
private String title;\r
+\r
private AlignmentView inputData = null;\r
- public static void updateFrom(VamsasAppDatastore datastore, jalview.gui.AlignFrame alignFrame, uk.ac.vamsas.objects.core.Tree vtree) {\r
+\r
+ public static void updateFrom(VamsasAppDatastore datastore,\r
+ jalview.gui.AlignFrame alignFrame,\r
+ uk.ac.vamsas.objects.core.Tree vtree)\r
+ {\r
Tree toTree = new Tree(datastore, alignFrame, vtree);\r
- \r
+\r
}\r
- public Tree(VamsasAppDatastore datastore, jalview.gui.AlignFrame alignFrame, uk.ac.vamsas.objects.core.Tree vtree)\r
+\r
+ public Tree(VamsasAppDatastore datastore,\r
+ jalview.gui.AlignFrame alignFrame,\r
+ uk.ac.vamsas.objects.core.Tree vtree)\r
{\r
super(datastore);\r
tree = vtree;\r
TreePanel tp = (TreePanel) getvObj2jv(tree);\r
- if (tp != null) {\r
+ if (tp != null)\r
+ {\r
if (tree.isUpdated())\r
{\r
- Cache.log.info(\r
- "Update from vamsas document to alignment associated tree not implemented yet.");\r
+ Cache.log\r
+ .info("Update from vamsas document to alignment associated tree not implemented yet.");\r
}\r
}\r
else\r
{\r
// make a new tree\r
- Object[] idata = this.recoverInputData(tree.getProvenance());\r
+ Object[] idata = recoverInputData(tree.getProvenance());\r
try\r
{\r
if (idata != null && idata[0] != null)\r
}\r
ntree = getNtree();\r
title = tree.getNewick(0).getTitle();\r
- if (title==null || title.length()==0)\r
+ if (title == null || title.length() == 0)\r
{\r
title = tree.getTitle(); // hack!!!!\r
}\r
- }\r
- catch (Exception e)\r
+ } catch (Exception e)\r
{\r
- Cache.log.warn("Problems parsing treefile '" +\r
- tree.getNewick(0).getContent() + "'", e);\r
+ Cache.log.warn("Problems parsing treefile '"\r
+ + tree.getNewick(0).getContent() + "'", e);\r
}\r
}\r
}\r
+\r
private NewickFile getNtree() throws IOException\r
{\r
return new jalview.io.NewickFile(tree.getNewick(0).getContent());\r
}\r
- public Tree(VamsasAppDatastore datastore, TreePanel tp2, AlignmentI jal2, uk.ac.vamsas.objects.core.Alignment alignment2)\r
+\r
+ public Tree(VamsasAppDatastore datastore, TreePanel tp2, AlignmentI jal2,\r
+ uk.ac.vamsas.objects.core.Alignment alignment2)\r
{\r
super(datastore);\r
\r
jal = jal2;\r
tp = tp2;\r
alignment = alignment2;\r
- \r
+\r
tree = (uk.ac.vamsas.objects.core.Tree) getjv2vObj(tp);\r
if (tree == null)\r
{\r
else\r
{\r
// handle conflict\r
- System.out\r
- .println("Add modified tree as new tree in document.");\r
+ System.out.println("Add modified tree as new tree in document.");\r
}\r
}\r
}\r
+\r
/**\r
* correctly creates provenance for trees calculated on an alignment by\r
* jalview.\r
*/\r
private Provenance makeTreeProvenance(AlignmentI jal, TreePanel tp)\r
{\r
- Cache.log.debug("Making Tree provenance for "+tp.getTitle());\r
+ Cache.log.debug("Making Tree provenance for " + tp.getTitle());\r
Provenance prov = new Provenance();\r
prov.addEntry(new Entry());\r
prov.getEntry(0).setAction("imported " + tp.getTitle());\r
// or just correctly resolve the tree's seqData to the correct alignment\r
// in\r
// the document.\r
- Vector alsqrefs = getjv2vObjs(findAlignmentSequences(jal, tp.getTree().seqData.getSequences()));\r
+ Vector alsqrefs = getjv2vObjs(findAlignmentSequences(jal, tp\r
+ .getTree().seqData.getSequences()));\r
Object[] alsqs = new Object[alsqrefs.size()];\r
alsqrefs.copyInto(alsqs);\r
vInput.setObjRef(alsqs);\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"); // TODO: type of tree is a general parameter\r
+ prov.getEntry(0).getParam(0).setContent("NJ"); // TODO: type of tree is a\r
+ // general parameter\r
int ranges[] = tp.getTree().seqData.getVisibleContigs();\r
// VisibleContigs are with respect to alignment coordinates. Still need\r
// offsets\r
vInput.addSeg(visSeg);\r
}\r
}\r
- Cache.log.debug("Finished Tree provenance for "+tp.getTitle());\r
+ Cache.log.debug("Finished Tree provenance for " + tp.getTitle());\r
return prov;\r
}\r
+\r
/**\r
* look up SeqCigars in an existing alignment.\r
* \r
while (as.hasMoreElements())\r
{\r
SequenceI asq = (SequenceI) as.nextElement();\r
- for (int t = 0; t<sequences.length; t++)\r
+ for (int t = 0; t < sequences.length; t++)\r
{\r
- if (tseqs[t]!=null \r
- && (tseqs[t].getRefSeq()==asq || tseqs[t].getRefSeq() == asq.getDatasetSequence()))\r
- // && tseqs[t].getStart()>=asq.getStart() && tseqs[t].getEnd()<=asq.getEnd())\r
+ if (tseqs[t] != null\r
+ && (tseqs[t].getRefSeq() == asq || tseqs[t].getRefSeq() == asq\r
+ .getDatasetSequence()))\r
+ // && tseqs[t].getStart()>=asq.getStart() &&\r
+ // tseqs[t].getEnd()<=asq.getEnd())\r
{\r
tseqs[t] = null;\r
alsq.add(asq);\r
}\r
}\r
}\r
- if (alsq.size()<sequences.length)\r
- Cache.log.warn("Not recovered all alignment sequences for given set of input sequence CIGARS");\r
+ if (alsq.size() < sequences.length)\r
+ Cache.log\r
+ .warn("Not recovered all alignment sequences for given set of input sequence CIGARS");\r
return alsq;\r
}\r
+\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
+ * @param tp\r
+ * 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
+ 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\r
+ // 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
+ {\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
+ }\r
+ else\r
+ {\r
+ refv = 0;\r
+ vrf++;\r
+ }\r
+ }\r
+ if (jvseq instanceof SequenceI)\r
+ {\r
+ leaf.setElement(jvseq);\r
+ leaf.setPlaceholder(false);\r
+ }\r
+ else\r
+ {\r
+ leaf.setPlaceholder(true);\r
+ leaf\r
+ .setElement(new Sequence(leaf.getName(),\r
+ "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
+ * @param newick \r
* @return\r
*/\r
- public Treenode[] makeTreeNodes(NJTree ntree) {\r
+ public Treenode[] makeTreeNodes(NJTree ntree, Newick newick)\r
+ {\r
Vector leaves = new Vector();\r
ntree.findLeaves(ntree.getTopNode(), leaves);\r
Vector tnv = new Vector();\r
Hashtable nodespecs = new Hashtable();\r
while (l.hasMoreElements())\r
{\r
- jalview.datamodel.BinaryNode tnode = (jalview.datamodel.BinaryNode) l.nextElement();\r
+ jalview.datamodel.BinaryNode tnode = (jalview.datamodel.BinaryNode) l\r
+ .nextElement();\r
if (tnode instanceof jalview.datamodel.SequenceNode)\r
{\r
if (!((jalview.datamodel.SequenceNode) tnode).isPlaceholder())\r
{\r
- Object assocseq = ((jalview.datamodel.SequenceNode) tnode).element();\r
+ Object assocseq = ((jalview.datamodel.SequenceNode) tnode)\r
+ .element();\r
if (assocseq instanceof SequenceI)\r
{\r
Vobject vobj = this.getjv2vObj(assocseq);\r
- if (vobj!=null)\r
+ if (vobj != null)\r
{\r
Treenode node = new Treenode();\r
+ if (newick.isRegisterable())\r
+ {\r
+ this.cdoc.registerObject(newick);\r
+ node.addTreeId(newick);\r
+ }\r
node.setNodespec(makeNodeSpec(nodespecs, tnode));\r
node.setName(tnode.getName());\r
Vref vr = new Vref();\r
}\r
else\r
{\r
- System.err.println("WARNING: Unassociated treeNode "+tnode.element().toString()+" "\r
- +((tnode.getName()!=null) ? " label "+tnode.getName() : ""));\r
+ System.err.println("WARNING: Unassociated treeNode "\r
+ + tnode.element().toString()\r
+ + " "\r
+ + ((tnode.getName() != null) ? " label "\r
+ + tnode.getName() : ""));\r
}\r
}\r
}\r
}\r
}\r
- if (tnv.size()>0)\r
+ if (tnv.size() > 0)\r
{\r
Treenode[] tn = new Treenode[tnv.size()];\r
- tnv.copyInto(tn); \r
+ tnv.copyInto(tn);\r
return tn;\r
}\r
- return new Treenode[] {};\r
+ return new Treenode[]\r
+ {};\r
}\r
- private String makeNodeSpec(Hashtable nodespecs, jalview.datamodel.BinaryNode tnode)\r
- { \r
+\r
+ private String makeNodeSpec(Hashtable nodespecs,\r
+ jalview.datamodel.BinaryNode tnode)\r
+ {\r
String nname = new String(tnode.getName());\r
Integer nindx = (Integer) nodespecs.get(nname);\r
- if (nindx==null)\r
+ if (nindx == null)\r
{\r
nindx = new Integer(1);\r
}\r
- nname = nindx.toString()+" "+nname;\r
+ nname = nindx.toString() + " " + nname;\r
return nname;\r
}\r
+\r
/**\r
* call to match up Treenode specs to NJTree parsed from document object.\r
* \r
* @param nodespec\r
* @param leaves\r
- * as returned from NJTree.findLeaves( .., ..) ..\r
+ * as returned from NJTree.findLeaves( .., ..) ..\r
* @return\r
*/\r
- private jalview.datamodel.BinaryNode findNodeSpec(String nodespec, Vector leaves)\r
+ private jalview.datamodel.BinaryNode findNodeSpec(String nodespec,\r
+ Vector leaves)\r
{\r
- int occurence=-1;\r
- String nspec = nodespec.substring(nodespec.indexOf(' ')+1);\r
+ int occurence = -1;\r
+ String nspec = nodespec.substring(nodespec.indexOf(' ') + 1);\r
String oval = nodespec.substring(0, nodespec.indexOf(' '));\r
- try {\r
+ try\r
+ {\r
occurence = new Integer(oval).intValue();\r
- }\r
- catch (Exception e)\r
+ } catch (Exception e)\r
{\r
- System.err.println("Invalid nodespec '"+nodespec+"'");\r
+ System.err.println("Invalid nodespec '" + nodespec + "'");\r
return null;\r
}\r
jalview.datamodel.BinaryNode bn = null;\r
- \r
+\r
int nocc = 0;\r
Enumeration en = leaves.elements();\r
- while (en.hasMoreElements() && nocc<occurence)\r
+ while (en.hasMoreElements() && nocc < occurence)\r
{\r
bn = (jalview.datamodel.BinaryNode) en.nextElement();\r
- if (bn instanceof jalview.datamodel.SequenceNode && bn.getName().equals(nspec))\r
+ if (bn instanceof jalview.datamodel.SequenceNode\r
+ && bn.getName().equals(nspec))\r
{\r
- --occurence;\r
- } else \r
- bn=null;\r
+ --occurence;\r
+ }\r
+ else\r
+ bn = null;\r
}\r
return bn;\r
}\r
+\r
// todo: end refactor to vamsas library\r
/**\r
* add jalview object to vamsas document\r
* \r
*/\r
- public void add() {\r
+ public void add()\r
+ {\r
tree = new uk.ac.vamsas.objects.core.Tree();\r
bindjvvobj(tp, tree);\r
tree.setTitle(tp.getTitle());\r
newick.setTitle(tp.getTitle());\r
tree.addNewick(newick);\r
tree.setProvenance(makeTreeProvenance(jal, tp));\r
- tree.setTreenode(makeTreeNodes(tp.getTree()));\r
- \r
+ tree.setTreenode(makeTreeNodes(tp.getTree(), newick));\r
+\r
alignment.addTree(tree);\r
}\r
\r
* referenced in input data has already been associated with jalview objects.\r
* \r
* @param tp\r
+ * @param alignFrame \r
* @return Object[] { AlignmentView, AlignmentI - reference alignment for\r
* input }\r
*/\r
public Object[] recoverInputData(Provenance tp)\r
{\r
- AlignViewport javport=null;\r
- jalview.datamodel.AlignmentI jal=null;\r
- jalview.datamodel.CigarArray view=null;\r
+ AlignViewport javport = null;\r
+ jalview.datamodel.AlignmentI jal = null;\r
+ jalview.datamodel.CigarArray view = null;\r
for (int pe = 0; pe < tp.getEntryCount(); pe++)\r
{\r
if (tp.getEntry(pe).getInputCount() > 0)\r
{\r
if (tp.getEntry(pe).getInputCount() > 1)\r
{\r
- Cache.log.warn("Ignoring additional input spec in provenance entry "\r
- + tp.getEntry(pe).toString());\r
+ Cache.log\r
+ .warn("Ignoring additional input spec in provenance entry "\r
+ + tp.getEntry(pe).toString());\r
}\r
// LATER: deal sensibly with multiple inputs\r
Input vInput = tp.getEntry(pe).getInput(0);\r
// is this the whole alignment or a specific set of sequences ?\r
- if (vInput.getObjRefCount()==0)\r
- continue;\r
- if (vInput.getObjRefCount()==1 && vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.Alignment)\r
+ if (vInput.getObjRefCount() == 0)\r
{\r
- // recover an AlignmentView for the input data\r
- javport = (AlignViewport) getvObj2jv( (uk.ac.vamsas.\r
- client.Vobject) vInput\r
- .getObjRef(0));\r
- jal = javport.getAlignment();\r
- view = javport.getAlignment().\r
- getCompactAlignment();\r
- } else \r
- if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence) {\r
+ if (tree.getV_parent()!=null && tree.getV_parent() instanceof uk.ac.vamsas.objects.core.Alignment)\r
+ {\r
+ javport = getViewport(tree.getV_parent());\r
+ jal = javport.getAlignment();\r
+ view = javport.getAlignment().getCompactAlignment();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // Explicit reference - to alignment, sequences or what.\r
+ if (vInput.getObjRefCount() == 1\r
+ && vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.Alignment)\r
+ {\r
// recover an AlignmentView for the input data\r
- javport = getViewport(((Vobject)vInput.getObjRef(0)).getV_parent());\r
+ javport = getViewport((Vobject) vInput.getObjRef(0));\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
+ view = javport.getAlignment().getCompactAlignment();\r
+ }\r
+ else if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence)\r
+ {\r
+ // recover an AlignmentView for the input data\r
+ javport = getViewport(((Vobject) vInput.getObjRef(0)).getV_parent());\r
+ jal = javport.getAlignment();\r
+ jalview.datamodel.SequenceI[] seqs = new jalview.datamodel.SequenceI[vInput\r
+ .getObjRefCount()];\r
+ for (int i = 0, iSize = vInput.getObjRefCount(); i < iSize; i++)\r
{\r
- SequenceI seq = (SequenceI) getvObj2jv((Vobject) vInput.getObjRef(i));\r
+ SequenceI seq = (SequenceI) getvObj2jv((Vobject) vInput\r
+ .getObjRef(i));\r
seqs[i] = seq;\r
}\r
- view = new jalview.datamodel.Alignment(seqs).getCompactAlignment();\r
- \r
- \r
+ view = new jalview.datamodel.Alignment(seqs)\r
+ .getCompactAlignment();\r
+\r
+ }\r
}\r
int from = 1, to = jal.getWidth();\r
int offset = 0; // deleteRange modifies its frame of reference\r
{\r
Seg visSeg = vInput.getSeg(r);\r
int se[] = getSegRange(visSeg, true); // jalview doesn't do\r
- // bidirection alignments yet.\r
+ // bidirection alignments yet.\r
if (to < se[1])\r
{\r
Cache.log.warn("Ignoring invalid segment in InputData spec.");\r
- }\r
- else\r
- {\r
- if (se[0] > from)\r
- {\r
- view.deleteRange(offset + from - 1, offset + se[0] - 2);\r
- offset -= se[0] - from;\r
- }\r
- from = se[1] + 1;\r
- }\r
}\r
- if (from < to)\r
+ else\r
{\r
- view.deleteRange(offset + from - 1, offset + to - 1); // final\r
- // deletion -\r
- // TODO: check\r
- // off by\r
- // one for to\r
+ if (se[0] > from)\r
+ {\r
+ view.deleteRange(offset + from - 1, offset + se[0] - 2);\r
+ offset -= se[0] - from;\r
+ }\r
+ from = se[1] + 1;\r
}\r
- return new Object[]{new AlignmentView(view), jal};\r
}\r
+ if (from < to)\r
+ {\r
+ view.deleteRange(offset + from - 1, offset + to - 1); // final\r
+ // deletion -\r
+ // TODO: check\r
+ // off by\r
+ // one for to\r
+ }\r
+ return new Object[]\r
+ { new AlignmentView(view), jal };\r
+ }\r
}\r
- Cache.log.debug("Returning null for input data recovery from provenance.");\r
+ Cache.log\r
+ .debug("Returning null for input data recovery from provenance.");\r
return null;\r
}\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
+ return datastore\r
+ .findViewport((uk.ac.vamsas.objects.core.Alignment) v_parent);\r
}\r
return null;\r
}\r
- \r
+\r
public NewickFile getNewickTree()\r
{\r
return ntree;\r
}\r
+\r
public String getTitle()\r
{\r
return title;\r
}\r
+\r
public AlignmentView getInputData()\r
{\r
return inputData;\r
}\r
+\r
public boolean isValidTree()\r
{\r
- try {\r
+ try\r
+ {\r
ntree.parse();\r
- if (ntree.getTree()!=null)\r
+ if (ntree.getTree() != null)\r
{\r
ntree = getNtree();\r
}\r
- return true;\r
- }\r
- catch (Exception e)\r
+ return true;\r
+ } catch (Exception e)\r
{\r
- Cache.log.debug("Failed to parse newick tree string",e);\r
+ Cache.log.debug("Failed to parse newick tree string", e);\r
}\r
return false;\r
}\r