X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2Fvamsas%2FTree.java;h=1ac7babfa92983b6932651689f76548f094fc762;hb=4b7d3640209c4434d569c746672cf9eed4250ace;hp=5caded1ec3053b177a61b686ef4c9d7edaad3812;hpb=f52f7b378972cc884b5d3e5cc250f89667f558f7;p=jalview.git diff --git a/src/jalview/io/vamsas/Tree.java b/src/jalview/io/vamsas/Tree.java index 5caded1..1ac7bab 100644 --- a/src/jalview/io/vamsas/Tree.java +++ b/src/jalview/io/vamsas/Tree.java @@ -1,30 +1,28 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) - * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle - * + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ 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 + * 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 . + * + * 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.bin.Cache; +import jalview.analysis.TreeBuilder; +import jalview.analysis.TreeModel; +import jalview.bin.Console; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.BinaryNode; @@ -32,10 +30,17 @@ import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import jalview.datamodel.SequenceNode; -import jalview.gui.AlignViewport; import jalview.gui.TreePanel; import jalview.io.NewickFile; import jalview.io.VamsasAppDatastore; +import jalview.viewmodel.AlignmentViewport; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.List; +import java.util.Vector; + import uk.ac.vamsas.client.Vobject; import uk.ac.vamsas.objects.core.AlignmentSequence; import uk.ac.vamsas.objects.core.Entry; @@ -99,7 +104,7 @@ public class Tree extends DatastoreItem /* * (non-Javadoc) - * + * * @see jalview.io.vamsas.DatastoreItem#addFromDocument() */ @Override @@ -123,26 +128,26 @@ public class Tree extends DatastoreItem } } catch (Exception e) { - Cache.log.warn("Problems parsing treefile '" + Console.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."); + Console.info( + "Update (with conflict) from vamsas document to alignment associated tree not implemented yet."); } /* * (non-Javadoc) - * + * * @see jalview.io.vamsas.DatastoreItem#update() */ @Override @@ -157,13 +162,14 @@ public class Tree extends DatastoreItem else { // handle conflict - log.info("TODO: Add the locally modified tree in Jalview as a new tree in document, leaving locked tree unchanged."); + 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 @@ -174,13 +180,13 @@ public class Tree extends DatastoreItem // 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 '" + + * (Exception e) { Cache.warn("Problems parsing treefile '" + * tree.getNewick(0).getContent() + "'", e); } */ log.debug("Update the local tree in jalview from the document."); @@ -201,21 +207,23 @@ public class Tree extends DatastoreItem /** * correctly creates provenance for trees calculated on an alignment by * jalview. - * + * * @param jal * @param tp * @return */ private Provenance makeTreeProvenance(AlignmentI jal, TreePanel tp) { - Cache.log.debug("Making Tree provenance for " + tp.getTitle()); + Console.debug("Making Tree provenance for " + tp.getTitle()); Provenance prov = new Provenance(); prov.addEntry(new Entry()); prov.getEntry(0).setAction("imported " + tp.getTitle()); prov.getEntry(0).setUser(provEntry.getUser()); prov.getEntry(0).setApp(provEntry.getApp()); prov.getEntry(0).setDate(provEntry.getDate()); - if (tp.getTree().hasOriginalSequenceData()) + + AlignmentView originalData = tp.getTree().getOriginalData(); + if (originalData != null) { Input vInput = new Input(); // LATER: check to see if tree input data is contained in this alignment - @@ -223,7 +231,7 @@ public class Tree extends DatastoreItem // in // the document. Vector alsqrefs = getjv2vObjs(findAlignmentSequences(jal, - tp.getTree().seqData.getSequences())); + tp.getTree().getOriginalData().getSequences())); Object[] alsqs = new Object[alsqrefs.size()]; alsqrefs.copyInto(alsqs); vInput.setObjRef(alsqs); @@ -235,12 +243,13 @@ 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 - int ranges[] = tp.getTree().seqData.getVisibleContigs(); + prov.getEntry(0).getParam(0) + .setContent(TreeBuilder.NEIGHBOUR_JOINING); + // TODO: type of tree is a general parameter + int ranges[] = originalData.getVisibleContigs(); // VisibleContigs are with respect to alignment coordinates. Still need // offsets - int start = tp.getTree().seqData.getAlignmentOrigin(); + int start = tp.getTree().getOriginalData().getAlignmentOrigin(); for (int r = 0; r < ranges.length; r += 2) { Seg visSeg = new Seg(); @@ -250,65 +259,71 @@ public class Tree extends DatastoreItem vInput.addSeg(visSeg); } } - Cache.log.debug("Finished Tree provenance for " + tp.getTitle()); + Console.debug("Finished Tree provenance for " + tp.getTitle()); return prov; } /** * look up SeqCigars in an existing alignment. - * + * * @param jal * @param sequences * @return vector of alignment sequences in order of SeqCigar array (but * missing unfound seqcigars) */ - private Vector findAlignmentSequences(AlignmentI jal, SeqCigar[] sequences) + private Vector findAlignmentSequences(AlignmentI jal, + SeqCigar[] sequences) { SeqCigar[] tseqs = new SeqCigar[sequences.length]; System.arraycopy(sequences, 0, tseqs, 0, sequences.length); - Vector alsq = new Vector(); - List jalsqs; - synchronized (jalsqs=jal.getSequences()) - {for (SequenceI asq:jalsqs) + Vector alsq = new Vector<>(); + List jalsqs = jal.getSequences(); + synchronized (jalsqs) { - 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); + } } } - }} + } if (alsq.size() < sequences.length) - Cache.log - .warn("Not recovered all alignment sequences for given set of input sequence CIGARS"); + { + Console.warn( + "Not recovered all alignment sequences for given set of input sequence CIGARS"); + } return alsq; } /** - * + * * Update jalview newick representation with TreeNode map - * + * * @param tp * the treepanel that this tree is bound to. */ public void UpdateSequenceTreeMap(TreePanel tp) { if (tp == null || tree == null) + { return; - Vector leaves = new Vector(); + } + if (tp.getTree() == null) { - Cache.log.warn("Not updating SequenceTreeMap for " - + tree.getVorbaId()); + Console.warn("Not updating SequenceTreeMap for " + tree.getVorbaId()); return; } - tp.getTree().findLeaves(tp.getTree().getTopNode(), leaves); + Vector leaves = tp.getTree() + .findLeaves(tp.getTree().getTopNode()); Treenode[] tn = tree.getTreenode(); // todo: select nodes for this // particular tree int sz = tn.length; @@ -349,7 +364,8 @@ public class Tree extends DatastoreItem else { leaf.setPlaceholder(true); - leaf.setElement(new Sequence(leaf.getName(), "THISISAPLACEHLDER")); + leaf.setElement( + new Sequence(leaf.getName(), "THISISAPLACEHLDER")); } } } @@ -358,15 +374,15 @@ public class Tree extends DatastoreItem // / TODO: refactor to vamsas :start /** * construct treenode mappings for mapped sequences - * - * @param ntree + * + * @param treeModel * @param newick * @return */ - public Treenode[] makeTreeNodes(NJTree ntree, Newick newick) + public Treenode[] makeTreeNodes(TreeModel treeModel, Newick newick) { - Vector leaves = new Vector(); - ntree.findLeaves(ntree.getTopNode(), leaves); + Vector leaves = treeModel + .findLeaves(treeModel.getTopNode()); Vector tnv = new Vector(); Enumeration l = leaves.elements(); Hashtable nodespecs = new Hashtable(); @@ -378,8 +394,7 @@ public class Tree extends DatastoreItem { if (!((jalview.datamodel.SequenceNode) tnode).isPlaceholder()) { - Object assocseq = ((jalview.datamodel.SequenceNode) tnode) - .element(); + Object assocseq = ((BinaryNode) tnode).element(); if (assocseq instanceof SequenceI) { Vobject vobj = this.getjv2vObj(assocseq); @@ -401,10 +416,10 @@ public class Tree extends DatastoreItem else { System.err.println("WARNING: Unassociated treeNode " - + tnode.element().toString() - + " " - + ((tnode.getName() != null) ? " label " - + tnode.getName() : "")); + + tnode.element().toString() + " " + + ((tnode.getName() != null) + ? " label " + tnode.getName() + : "")); } } } @@ -416,8 +431,7 @@ public class Tree extends DatastoreItem tnv.copyInto(tn); return tn; } - return new Treenode[] - {}; + return new Treenode[] {}; } private String makeNodeSpec(Hashtable nodespecs, @@ -427,7 +441,7 @@ public class Tree extends DatastoreItem Integer nindx = (Integer) nodespecs.get(nname); if (nindx == null) { - nindx = new Integer(1); + nindx = Integer.valueOf(1); } nname = nindx.toString() + " " + nname; return nname; @@ -435,7 +449,7 @@ public class Tree extends DatastoreItem /** * call to match up Treenode specs to NJTree parsed from document object. - * + * * @param nodespec * @param leaves * as returned from NJTree.findLeaves( .., ..) .. @@ -449,7 +463,7 @@ public class Tree extends DatastoreItem String oval = nodespec.substring(0, nodespec.indexOf(' ')); try { - occurence = new Integer(oval).intValue(); + occurence = Integer.valueOf(oval).intValue(); } catch (Exception e) { System.err.println("Invalid nodespec '" + nodespec + "'"); @@ -468,7 +482,9 @@ public class Tree extends DatastoreItem --occurence; } else + { bn = null; + } } return bn; } @@ -476,7 +492,7 @@ public class Tree extends DatastoreItem // todo: end refactor to vamsas library /** * add jalview object to vamsas document - * + * */ @Override public void addToDocument() @@ -485,7 +501,7 @@ public class Tree extends DatastoreItem bindjvvobj(tp, tree); tree.setTitle(tp.getTitle()); Newick newick = new Newick(); - newick.setContent(tp.getTree().toString()); + newick.setContent(tp.getTree().print()); newick.setTitle(tp.getTitle()); tree.addNewick(newick); tree.setProvenance(makeTreeProvenance(jal, tp)); @@ -497,7 +513,7 @@ public class Tree extends DatastoreItem /** * note: this function assumes that all sequence and alignment objects * referenced in input data has already been associated with jalview objects. - * + * * @param tp * @param alignFrame * @return Object[] { AlignmentView, AlignmentI - reference alignment for @@ -505,7 +521,7 @@ public class Tree extends DatastoreItem */ public Object[] recoverInputData(Provenance tp) { - AlignViewport javport = null; + AlignmentViewport javport = null; jalview.datamodel.AlignmentI jal = null; jalview.datamodel.CigarArray view = null; for (int pe = 0; pe < tp.getEntryCount(); pe++) @@ -514,17 +530,16 @@ public class Tree extends DatastoreItem { if (tp.getEntry(pe).getInputCount() > 1) { - Cache.log - .warn("Ignoring additional input spec in provenance entry " - + tp.getEntry(pe).toString()); + Console.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) { - 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(); @@ -534,26 +549,27 @@ public class Tree extends DatastoreItem else { // Explicit reference - to alignment, sequences or what. - if (vInput.getObjRefCount() == 1 - && vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.Alignment) + 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)); jal = javport.getAlignment(); view = javport.getAlignment().getCompactAlignment(); } - else if (vInput.getObjRef(0) instanceof uk.ac.vamsas.objects.core.AlignmentSequence) + 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()]; for (int i = 0, iSize = vInput.getObjRefCount(); i < iSize; i++) { - SequenceI seq = (SequenceI) getvObj2jv((Vobject) vInput - .getObjRef(i)); + SequenceI seq = (SequenceI) getvObj2jv( + (Vobject) vInput.getObjRef(i)); seqs[i] = seq; } view = new jalview.datamodel.Alignment(seqs) @@ -570,7 +586,7 @@ public class Tree extends DatastoreItem // bidirection alignments yet. if (to < se[1]) { - Cache.log.warn("Ignoring invalid segment in InputData spec."); + Console.warn("Ignoring invalid segment in InputData spec."); } else { @@ -590,16 +606,15 @@ public class Tree extends DatastoreItem // off by // one for to } - return new Object[] - { new AlignmentView(view), jal }; + return new Object[] { new AlignmentView(view), jal }; } } - Cache.log - .debug("Returning null for input data recovery from provenance."); + Console.debug( + "Returning null for input data recovery from provenance."); return null; } - private AlignViewport getViewport(Vobject v_parent) + private AlignmentViewport getViewport(Vobject v_parent) { if (v_parent instanceof uk.ac.vamsas.objects.core.Alignment) { @@ -640,7 +655,7 @@ public class Tree extends DatastoreItem return true; } catch (Exception e) { - Cache.log.debug("Failed to parse newick tree string", e); + Console.debug("Failed to parse newick tree string", e); } return false; }