X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2Fvamsas%2FTree.java;h=e56fa3fdb299189b2953cd7c7ae19b648369430c;hb=ab43013b7e357b84b4abade0dba949668dfb2a0e;hp=8ff825c7ce8b05fa633a8bab33c1d09b67edb59b;hpb=cfa406a916d754e600c60f7dae29b053bf045ace;p=jalview.git diff --git a/src/jalview/io/vamsas/Tree.java b/src/jalview/io/vamsas/Tree.java index 8ff825c..e56fa3f 100644 --- a/src/jalview/io/vamsas/Tree.java +++ b/src/jalview/io/vamsas/Tree.java @@ -1,12 +1,32 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) + * Copyright (C) 2014 The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.io.vamsas; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; +import java.util.List; import java.util.Vector; import jalview.analysis.NJTree; -import jalview.analysis.SequenceIdMatcher; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; @@ -15,7 +35,6 @@ 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; @@ -53,46 +72,14 @@ public class Tree extends DatastoreItem 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) { - super(datastore); - tree = vtree; - TreePanel tp = (TreePanel) getvObj2jv(tree); - if (tp != null) - { - if (tree.isUpdated()) - { - Cache.log - .info("Update from vamsas document to alignment associated tree not implemented yet."); - } - } - else - { - // make a new tree - Object[] idata = recoverInputData(tree.getProvenance()); - try - { - if (idata != null && idata[0] != null) - { - inputData = (AlignmentView) idata[0]; - } - ntree = getNtree(); - title = tree.getNewick(0).getTitle(); - if (title == null || title.length() == 0) - { - title = tree.getTitle(); // hack!!!! - } - } catch (Exception e) - { - Cache.log.warn("Problems parsing treefile '" - + tree.getNewick(0).getContent() + "'", e); - } - } + super(datastore, vtree, TreePanel.class); + doJvUpdate(); } private NewickFile getNtree() throws IOException @@ -103,30 +90,114 @@ public class Tree extends DatastoreItem public Tree(VamsasAppDatastore datastore, TreePanel tp2, AlignmentI jal2, uk.ac.vamsas.objects.core.Alignment alignment2) { - super(datastore); + super(datastore, tp2, uk.ac.vamsas.objects.core.Tree.class); jal = jal2; - tp = tp2; + tp = (TreePanel) jvobj; alignment = alignment2; - tree = (uk.ac.vamsas.objects.core.Tree) getjv2vObj(tp); - if (tree == null) - { - add(); - } - else + tree = (uk.ac.vamsas.objects.core.Tree) vobj; + doSync(); + } + + /* + * (non-Javadoc) + * + * @see jalview.io.vamsas.DatastoreItem#addFromDocument() + */ + @Override + public void addFromDocument() + { + tree = (uk.ac.vamsas.objects.core.Tree) vobj; // vtree; + TreePanel tp = (TreePanel) jvobj; // getvObj2jv(tree); + // make a new tree + Object[] idata = recoverInputData(tree.getProvenance()); + try { - if (isModifiable(tree.getModifiable())) + if (idata != null && idata[0] != null) { - // synchronize(); // update(); - // verify any changes. - System.out.println("Update tree in document."); + inputData = (AlignmentView) idata[0]; } - else + ntree = getNtree(); + title = tree.getNewick(0).getTitle(); + if (title == null || title.length() == 0) { - // handle conflict - System.out.println("Add modified tree as new tree in document."); + title = tree.getTitle(); // hack!!!! } + } catch (Exception e) + { + Cache.log.warn("Problems parsing treefile '" + + tree.getNewick(0).getContent() + "'", e); + } + } + + /* + * (non-Javadoc) + * + * @see jalview.io.vamsas.DatastoreItem#conflict() + */ + @Override + public void conflict() + { + Cache.log + .info("Update (with conflict) from vamsas document to alignment associated tree not implemented yet."); + } + + /* + * (non-Javadoc) + * + * @see jalview.io.vamsas.DatastoreItem#update() + */ + @Override + public void updateToDoc() + { + if (isModifiable(tree.getModifiable())) + { + // synchronize(); // update(); + // verify any changes. + log.info("TODO: Update tree in document from jalview."); + } + else + { + // handle conflict + log.info("TODO: Add the locally modified tree in Jalview as a new tree in document, leaving locked tree unchanged."); + } + } + + /* + * (non-Javadoc) + * + * @see jalview.io.vamsas.DatastoreItem#updateFromDoc() + */ + @Override + public void updateFromDoc() + { + // should probably just open a new tree panel in the same place as the old + // one + // TODO: Tree.updateFromDoc + /* + * TreePanel tp = (TreePanel) jvobj; // getvObj2jv(tree); + * + * // make a new tree Object[] idata = + * recoverInputData(tree.getProvenance()); try { if (idata != null && + * idata[0] != null) { inputData = (AlignmentView) idata[0]; } ntree = + * getNtree(); title = tree.getNewick(0).getTitle(); if (title == null || + * title.length() == 0) { title = tree.getTitle(); // hack!!!! } } catch + * (Exception e) { Cache.log.warn("Problems parsing treefile '" + + * tree.getNewick(0).getContent() + "'", e); } + */ + log.debug("Update the local tree in jalview from the document."); + + if (isModifiable(tree.getModifiable())) + { + // synchronize(); // update(); + // verify any changes. + log.debug("Update tree in document from jalview."); + } + else + { + // handle conflict + log.debug("Add modified jalview tree as new tree in document."); } } @@ -154,8 +225,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); @@ -168,7 +239,7 @@ public class Tree extends DatastoreItem 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 + // general parameter int ranges[] = tp.getTree().seqData.getVisibleContigs(); // VisibleContigs are with respect to alignment coordinates. Still need // offsets @@ -199,20 +270,22 @@ public class Tree extends DatastoreItem SeqCigar[] tseqs = new SeqCigar[sequences.length]; System.arraycopy(sequences, 0, tseqs, 0, sequences.length); Vector alsq = new Vector(); - Enumeration as = jal.getSequences().elements(); - while (as.hasMoreElements()) + List jalsqs; + synchronized (jalsqs = jal.getSequences()) { - SequenceI asq = (SequenceI) as.nextElement(); - for (int t = 0; t < sequences.length; t++) + for (SequenceI asq : jalsqs) { - if (tseqs[t] != null - && (tseqs[t].getRefSeq() == asq || tseqs[t].getRefSeq() == asq - .getDatasetSequence())) - // && tseqs[t].getStart()>=asq.getStart() && - // tseqs[t].getEnd()<=asq.getEnd()) + for (int t = 0; t < sequences.length; t++) { - tseqs[t] = null; - alsq.add(asq); + 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); + } } } } @@ -227,16 +300,22 @@ public class Tree extends DatastoreItem * Update jalview newick representation with TreeNode map * * @param tp - * the treepanel that this tree is bound to. + * the treepanel that this tree is bound to. */ public void UpdateSequenceTreeMap(TreePanel tp) { - if (tp == null || tree != null) + if (tp == null || tree == null) return; Vector leaves = new Vector(); + if (tp.getTree() == null) + { + Cache.log.warn("Not updating SequenceTreeMap for " + + tree.getVorbaId()); + return; + } tp.getTree().findLeaves(tp.getTree().getTopNode(), leaves); Treenode[] tn = tree.getTreenode(); // todo: select nodes for this - // particular tree + // particular tree int sz = tn.length; int i = 0; @@ -246,7 +325,7 @@ public class Tree extends DatastoreItem BinaryNode mappednode = findNodeSpec(node.getNodespec(), leaves); if (mappednode != null && mappednode instanceof SequenceNode) { - SequenceNode leaf = (SequenceNode) leaves.elementAt(i++); + SequenceNode leaf = (SequenceNode) mappednode; // check if we can make the specified association Object jvseq = null; int vrf = 0, refv = 0; @@ -275,9 +354,7 @@ public class Tree extends DatastoreItem else { leaf.setPlaceholder(true); - leaf - .setElement(new Sequence(leaf.getName(), - "THISISAPLACEHLDER")); + leaf.setElement(new Sequence(leaf.getName(), "THISISAPLACEHLDER")); } } } @@ -288,7 +365,7 @@ public class Tree extends DatastoreItem * construct treenode mappings for mapped sequences * * @param ntree - * @param newick + * @param newick * @return */ public Treenode[] makeTreeNodes(NJTree ntree, Newick newick) @@ -366,7 +443,7 @@ public class Tree extends DatastoreItem * * @param nodespec * @param leaves - * as returned from NJTree.findLeaves( .., ..) .. + * as returned from NJTree.findLeaves( .., ..) .. * @return */ private jalview.datamodel.BinaryNode findNodeSpec(String nodespec, @@ -406,7 +483,8 @@ public class Tree extends DatastoreItem * add jalview object to vamsas document * */ - public void add() + @Override + public void addToDocument() { tree = new uk.ac.vamsas.objects.core.Tree(); bindjvvobj(tp, tree); @@ -426,7 +504,7 @@ public class Tree extends DatastoreItem * referenced in input data has already been associated with jalview objects. * * @param tp - * @param alignFrame + * @param alignFrame * @return Object[] { AlignmentView, AlignmentI - reference alignment for * input } */ @@ -450,7 +528,8 @@ public class Tree extends DatastoreItem // is this the whole alignment or a specific set of sequences ? if (vInput.getObjRefCount() == 0) { - if (tree.getV_parent()!=null && tree.getV_parent() instanceof uk.ac.vamsas.objects.core.Alignment) + if (tree.getV_parent() != null + && tree.getV_parent() instanceof uk.ac.vamsas.objects.core.Alignment) { javport = getViewport(tree.getV_parent()); jal = javport.getAlignment(); @@ -471,7 +550,8 @@ public class Tree extends DatastoreItem else if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence) { // recover an AlignmentView for the input data - javport = getViewport(((Vobject) vInput.getObjRef(0)).getV_parent()); + javport = getViewport(((Vobject) vInput.getObjRef(0)) + .getV_parent()); jal = javport.getAlignment(); jalview.datamodel.SequenceI[] seqs = new jalview.datamodel.SequenceI[vInput .getObjRefCount()]; @@ -553,6 +633,10 @@ public class Tree extends DatastoreItem { try { + if (ntree == null) + { + return false; + } ntree.parse(); if (ntree.getTree() != null) {