From 3ca49e9277c7939fa282b67d14ee49fa3352d9c7 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 30 Aug 2007 11:41:21 +0000 Subject: [PATCH] improved vamsas treenode node binding support --- src/jalview/io/vamsas/Tree.java | 392 +++++++++++++++++++++++---------------- 1 file changed, 233 insertions(+), 159 deletions(-) diff --git a/src/jalview/io/vamsas/Tree.java b/src/jalview/io/vamsas/Tree.java index de8230c..af4e7b7 100644 --- a/src/jalview/io/vamsas/Tree.java +++ b/src/jalview/io/vamsas/Tree.java @@ -15,6 +15,7 @@ import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.datamodel.SequenceNode; +import jalview.gui.AlignFrame; import jalview.gui.AlignViewport; import jalview.gui.TreePanel; import jalview.io.NewickFile; @@ -33,33 +34,47 @@ import uk.ac.vamsas.objects.core.Vref; public class Tree extends DatastoreItem { AlignmentI jal; + TreePanel tp; + uk.ac.vamsas.objects.core.Tree tree; + uk.ac.vamsas.objects.core.Alignment alignment; // may be null => dataset or - // other kind of tree + + // other kind of tree private NewickFile ntree; + private String title; + private AlignmentView inputData = null; - public static void updateFrom(VamsasAppDatastore datastore, jalview.gui.AlignFrame alignFrame, uk.ac.vamsas.objects.core.Tree vtree) { + + public static void updateFrom(VamsasAppDatastore datastore, + jalview.gui.AlignFrame alignFrame, + uk.ac.vamsas.objects.core.Tree vtree) + { Tree toTree = new Tree(datastore, alignFrame, vtree); - + } - public Tree(VamsasAppDatastore datastore, jalview.gui.AlignFrame alignFrame, uk.ac.vamsas.objects.core.Tree vtree) + + public Tree(VamsasAppDatastore datastore, + jalview.gui.AlignFrame alignFrame, + uk.ac.vamsas.objects.core.Tree vtree) { super(datastore); tree = vtree; TreePanel tp = (TreePanel) getvObj2jv(tree); - if (tp != null) { + if (tp != null) + { if (tree.isUpdated()) { - Cache.log.info( - "Update from vamsas document to alignment associated tree not implemented yet."); + Cache.log + .info("Update from vamsas document to alignment associated tree not implemented yet."); } } else { // make a new tree - Object[] idata = this.recoverInputData(tree.getProvenance()); + Object[] idata = recoverInputData(tree.getProvenance()); try { if (idata != null && idata[0] != null) @@ -68,30 +83,32 @@ public class Tree extends DatastoreItem } ntree = getNtree(); title = tree.getNewick(0).getTitle(); - if (title==null || title.length()==0) + if (title == null || title.length() == 0) { title = tree.getTitle(); // hack!!!! } - } - catch (Exception e) + } catch (Exception e) { - Cache.log.warn("Problems parsing treefile '" + - tree.getNewick(0).getContent() + "'", e); + Cache.log.warn("Problems parsing treefile '" + + tree.getNewick(0).getContent() + "'", e); } } } + private NewickFile getNtree() throws IOException { return new jalview.io.NewickFile(tree.getNewick(0).getContent()); } - public Tree(VamsasAppDatastore datastore, TreePanel tp2, AlignmentI jal2, uk.ac.vamsas.objects.core.Alignment alignment2) + + public Tree(VamsasAppDatastore datastore, TreePanel tp2, AlignmentI jal2, + uk.ac.vamsas.objects.core.Alignment alignment2) { super(datastore); jal = jal2; tp = tp2; alignment = alignment2; - + tree = (uk.ac.vamsas.objects.core.Tree) getjv2vObj(tp); if (tree == null) { @@ -108,11 +125,11 @@ public class Tree extends DatastoreItem else { // handle conflict - System.out - .println("Add modified tree as new tree in document."); + System.out.println("Add modified tree as new tree in document."); } } } + /** * correctly creates provenance for trees calculated on an alignment by * jalview. @@ -123,7 +140,7 @@ public class Tree extends DatastoreItem */ private Provenance makeTreeProvenance(AlignmentI jal, TreePanel tp) { - Cache.log.debug("Making Tree provenance for "+tp.getTitle()); + Cache.log.debug("Making Tree provenance for " + tp.getTitle()); Provenance prov = new Provenance(); prov.addEntry(new Entry()); prov.getEntry(0).setAction("imported " + tp.getTitle()); @@ -137,7 +154,8 @@ public class Tree extends DatastoreItem // or just correctly resolve the tree's seqData to the correct alignment // in // the document. - Vector alsqrefs = getjv2vObjs(findAlignmentSequences(jal, tp.getTree().seqData.getSequences())); + Vector alsqrefs = getjv2vObjs(findAlignmentSequences(jal, tp + .getTree().seqData.getSequences())); Object[] alsqs = new Object[alsqrefs.size()]; alsqrefs.copyInto(alsqs); vInput.setObjRef(alsqs); @@ -149,7 +167,8 @@ public class Tree extends DatastoreItem prov.getEntry(0).addParam(new Param()); prov.getEntry(0).getParam(0).setName("treeType"); prov.getEntry(0).getParam(0).setType("utf8"); - prov.getEntry(0).getParam(0).setContent("NJ"); // TODO: type of tree is a general parameter + prov.getEntry(0).getParam(0).setContent("NJ"); // TODO: type of tree is a + // general parameter int ranges[] = tp.getTree().seqData.getVisibleContigs(); // VisibleContigs are with respect to alignment coordinates. Still need // offsets @@ -163,9 +182,10 @@ public class Tree extends DatastoreItem vInput.addSeg(visSeg); } } - Cache.log.debug("Finished Tree provenance for "+tp.getTitle()); + Cache.log.debug("Finished Tree provenance for " + tp.getTitle()); return prov; } + /** * look up SeqCigars in an existing alignment. * @@ -183,81 +203,96 @@ public class Tree extends DatastoreItem while (as.hasMoreElements()) { SequenceI asq = (SequenceI) as.nextElement(); - for (int t = 0; t=asq.getStart() && tseqs[t].getEnd()<=asq.getEnd()) + if (tseqs[t] != null + && (tseqs[t].getRefSeq() == asq || tseqs[t].getRefSeq() == asq + .getDatasetSequence())) + // && tseqs[t].getStart()>=asq.getStart() && + // tseqs[t].getEnd()<=asq.getEnd()) { tseqs[t] = null; alsq.add(asq); } } } - if (alsq.size()0) + if (tnv.size() > 0) { Treenode[] tn = new Treenode[tnv.size()]; - tnv.copyInto(tn); + tnv.copyInto(tn); return tn; } - return new Treenode[] {}; + return new Treenode[] + {}; } - private String makeNodeSpec(Hashtable nodespecs, jalview.datamodel.BinaryNode tnode) - { + + private String makeNodeSpec(Hashtable nodespecs, + jalview.datamodel.BinaryNode tnode) + { String nname = new String(tnode.getName()); Integer nindx = (Integer) nodespecs.get(nname); - if (nindx==null) + if (nindx == null) { nindx = new Integer(1); } - nname = nindx.toString()+" "+nname; + nname = nindx.toString() + " " + nname; return nname; } + /** * call to match up Treenode specs to NJTree parsed from document object. * * @param nodespec * @param leaves - * as returned from NJTree.findLeaves( .., ..) .. + * as returned from NJTree.findLeaves( .., ..) .. * @return */ - private jalview.datamodel.BinaryNode findNodeSpec(String nodespec, Vector leaves) + private jalview.datamodel.BinaryNode findNodeSpec(String nodespec, + Vector leaves) { - int occurence=-1; - String nspec = nodespec.substring(nodespec.indexOf(' ')+1); + int occurence = -1; + String nspec = nodespec.substring(nodespec.indexOf(' ') + 1); String oval = nodespec.substring(0, nodespec.indexOf(' ')); - try { + try + { occurence = new Integer(oval).intValue(); - } - catch (Exception e) + } catch (Exception e) { - System.err.println("Invalid nodespec '"+nodespec+"'"); + System.err.println("Invalid nodespec '" + nodespec + "'"); return null; } jalview.datamodel.BinaryNode bn = null; - + int nocc = 0; Enumeration en = leaves.elements(); - while (en.hasMoreElements() && nocc 0) { if (tp.getEntry(pe).getInputCount() > 1) { - Cache.log.warn("Ignoring additional input spec in provenance entry " - + tp.getEntry(pe).toString()); + Cache.log + .warn("Ignoring additional input spec in provenance entry " + + tp.getEntry(pe).toString()); } // LATER: deal sensibly with multiple inputs Input vInput = tp.getEntry(pe).getInput(0); // is this the whole alignment or a specific set of sequences ? - if (vInput.getObjRefCount()==0) - continue; - if (vInput.getObjRefCount()==1 && vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.Alignment) + if (vInput.getObjRefCount() == 0) { - // recover an AlignmentView for the input data - javport = (AlignViewport) getvObj2jv( (uk.ac.vamsas. - client.Vobject) vInput - .getObjRef(0)); - jal = javport.getAlignment(); - view = javport.getAlignment(). - getCompactAlignment(); - } else - if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence) { + if (tree.getV_parent()!=null && tree.getV_parent() instanceof uk.ac.vamsas.objects.core.Alignment) + { + javport = getViewport(tree.getV_parent()); + jal = javport.getAlignment(); + view = javport.getAlignment().getCompactAlignment(); + } + } + else + { + // Explicit reference - to alignment, sequences or what. + if (vInput.getObjRefCount() == 1 + && vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.Alignment) + { // recover an AlignmentView for the input data - javport = getViewport(((Vobject)vInput.getObjRef(0)).getV_parent()); + javport = getViewport((Vobject) vInput.getObjRef(0)); jal = javport.getAlignment(); - jalview.datamodel.SequenceI[] seqs = new jalview.datamodel.SequenceI[vInput.getObjRefCount()]; - for (int i=0,iSize=vInput.getObjRefCount(); i from) - { - view.deleteRange(offset + from - 1, offset + se[0] - 2); - offset -= se[0] - from; - } - from = se[1] + 1; - } } - if (from < to) + else { - view.deleteRange(offset + from - 1, offset + to - 1); // final - // deletion - - // TODO: check - // off by - // one for to + if (se[0] > from) + { + view.deleteRange(offset + from - 1, offset + se[0] - 2); + offset -= se[0] - from; + } + from = se[1] + 1; } - return new Object[]{new AlignmentView(view), jal}; } + if (from < to) + { + view.deleteRange(offset + from - 1, offset + to - 1); // final + // deletion - + // TODO: check + // off by + // one for to + } + return new Object[] + { new AlignmentView(view), jal }; + } } - Cache.log.debug("Returning null for input data recovery from provenance."); + Cache.log + .debug("Returning null for input data recovery from provenance."); return null; } - + private AlignViewport getViewport(Vobject v_parent) { if (v_parent instanceof uk.ac.vamsas.objects.core.Alignment) { - return datastore.findViewport((uk.ac.vamsas.objects.core.Alignment) v_parent); + return datastore + .findViewport((uk.ac.vamsas.objects.core.Alignment) v_parent); } return null; } - + public NewickFile getNewickTree() { return ntree; } + public String getTitle() { return title; } + public AlignmentView getInputData() { return inputData; } + public boolean isValidTree() { - try { + try + { ntree.parse(); - if (ntree.getTree()!=null) + if (ntree.getTree() != null) { ntree = getNtree(); } - return true; - } - catch (Exception e) + return true; + } catch (Exception e) { - Cache.log.debug("Failed to parse newick tree string",e); + Cache.log.debug("Failed to parse newick tree string", e); } return false; } -- 1.7.10.2