|
From: <rv...@us...> - 2009-06-18 09:32:37
|
Revision: 55
http://treebase.svn.sourceforge.net/treebase/?rev=55&view=rev
Author: rvos
Date: 2009-06-18 09:32:34 +0000 (Thu, 18 Jun 2009)
Log Message:
-----------
Adding NeXML conversion classes.
Added Paths:
-----------
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlConverter.java
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixConverter.java
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUConverter.java
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java
trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockConverter.java
Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlConverter.java
===================================================================
--- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlConverter.java (rev 0)
+++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlConverter.java 2009-06-18 09:32:34 UTC (rev 55)
@@ -0,0 +1,72 @@
+package org.cipres.treebase.domain.nexus.nexml;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.cipres.treebase.domain.matrix.Matrix;
+import org.cipres.treebase.domain.nexus.AbstractNexusConverter;
+import org.cipres.treebase.domain.nexus.NexusDataSet;
+import org.cipres.treebase.domain.nexus.NexusParserConverter;
+import org.cipres.treebase.domain.study.Study;
+import org.cipres.treebase.domain.tree.PhyloTree;
+import org.cipres.treebase.domain.tree.TreeBlock;
+import org.cipres.treebase.event.ProgressionListener;
+import org.nexml.model.Document;
+import org.nexml.model.DocumentFactory;
+import org.nexml.model.OTUs;
+
+public class NexmlConverter extends AbstractNexusConverter implements
+ NexusParserConverter {
+
+ /**
+ *
+ */
+ public void processLoadFile(Collection<File> nexusFiles, Study study,
+ NexusDataSet dataSet, ProgressionListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ *
+ * @param pFile
+ * @param pStudy
+ * @param pDataSet
+ */
+ public void parseOneFile(File pFile, Study pStudy, NexusDataSet pDataSet) {
+ Document document = null;
+ try {
+ document = DocumentFactory.parse(pFile);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // Taxa
+ NexmlOTUConverter noc = new NexmlOTUConverter(pStudy,getTaxonLabelHome(),document);
+ for ( OTUs xmlOTUs : document.getOTUsList() ) {
+ pDataSet.addTaxonLabelSet(xmlOTUs, noc.fromXmlToTreeBase(xmlOTUs));
+ }
+
+ // Matrices
+ NexmlMatrixConverter nmc = new NexmlMatrixConverter(pStudy,getTaxonLabelHome(),document);
+ for ( org.nexml.model.Matrix<?> xmlMatrix : document.getMatrices() ) {
+ Matrix tbMatrix = nmc.fromXmlToTreeBase(xmlMatrix);
+ tbMatrix.setNexusFileName(pFile.getName());
+ pDataSet.getMatrices().add(tbMatrix);
+ }
+
+ // Trees
+ NexmlTreeBlockConverter ntbc = new NexmlTreeBlockConverter(pStudy,getTaxonLabelHome(),document);
+ for ( org.nexml.model.TreeBlock xmlTreeBlock : document.getTreeBlockList() ) {
+ TreeBlock tbTreeBlock = ntbc.fromXmlToTreeBase(xmlTreeBlock);
+ for ( PhyloTree phyloTree : tbTreeBlock.getTreeList() ) {
+ phyloTree.setNexusFileName(pFile.getName());
+ }
+ pDataSet.getTreeBlocks().add(tbTreeBlock);
+ }
+
+ // Store document
+ pDataSet.setNexmlProject(document);
+ }
+
+}
Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixConverter.java
===================================================================
--- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixConverter.java (rev 0)
+++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlMatrixConverter.java 2009-06-18 09:32:34 UTC (rev 55)
@@ -0,0 +1,162 @@
+package org.cipres.treebase.domain.nexus.nexml;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.cipres.treebase.dao.jdbc.ContinuousMatrixElementJDBC;
+import org.cipres.treebase.dao.jdbc.ContinuousMatrixJDBC;
+import org.cipres.treebase.dao.jdbc.DiscreteMatrixElementJDBC;
+import org.cipres.treebase.dao.jdbc.DiscreteMatrixJDBC;
+import org.cipres.treebase.dao.jdbc.MatrixColumnJDBC;
+import org.cipres.treebase.domain.matrix.ContinuousChar;
+import org.cipres.treebase.domain.matrix.DiscreteChar;
+import org.cipres.treebase.domain.matrix.DiscreteMatrix;
+import org.cipres.treebase.domain.matrix.Matrix;
+import org.cipres.treebase.domain.study.Study;
+import org.cipres.treebase.domain.taxon.TaxonLabelHome;
+import org.cipres.treebase.domain.taxon.TaxonLabelSet;
+import org.nexml.model.Annotatable;
+import org.nexml.model.CategoricalMatrix;
+import org.nexml.model.CharacterState;
+import org.nexml.model.ContinuousMatrix;
+import org.nexml.model.Document;
+import org.nexml.model.MatrixCell;
+import org.nexml.model.OTUs;
+import org.nexml.model.OTU;
+
+public class NexmlMatrixConverter extends NexmlObjectConverter {
+
+ /**
+ *
+ * @param study
+ * @param taxonLabelHome
+ */
+ public NexmlMatrixConverter(Study study,TaxonLabelHome taxonLabelHome,Document document) {
+ super(study,taxonLabelHome,document);
+ }
+
+ /**
+ *
+ * @param xmlMatrix
+ * @return
+ */
+ public Matrix fromXmlToTreeBase(CategoricalMatrix xmlMatrix) {
+ DiscreteMatrix tbMatrix = new DiscreteMatrix();
+ DiscreteMatrixJDBC matrixJDBC = new DiscreteMatrixJDBC(tbMatrix, xmlMatrix, this);
+ List<MatrixColumnJDBC> columnJDBCs = new ArrayList<MatrixColumnJDBC>();
+ long[] colIds = matrixJDBC.getColIDs();
+ long[] rowIds = matrixJDBC.getRowIDs();
+ List<DiscreteMatrixElementJDBC> elements = new ArrayList<DiscreteMatrixElementJDBC>();
+ int colIndex = 0;
+ for ( org.nexml.model.Character xmlCharacter : xmlMatrix.getCharacters() ) {
+ String charName = xmlCharacter.getLabel();
+ DiscreteChar tbChar = new DiscreteChar();
+ tbChar.setDescription(charName);
+ MatrixColumnJDBC aColumnJDBC = new MatrixColumnJDBC();
+ aColumnJDBC.setPhyloChar(tbChar);
+ columnJDBCs.add(aColumnJDBC);
+ int rowIndex = 0;
+ for ( OTU xmlOTU : xmlMatrix.getOTUs().getAllOTUs() ) {
+ MatrixCell<CharacterState> xmlCell = xmlMatrix.getCell(xmlOTU, xmlCharacter);
+ DiscreteMatrixElementJDBC element = new DiscreteMatrixElementJDBC();
+ //element.setValue(xmlCell.getValue()); // XXX nested stateset lookup song & dance here
+ element.setElementOrder(colIndex);
+ element.setMatrixRowID(rowIds[rowIndex]);
+ element.setMatrixColID(colIds[colIndex]);
+ elements.add(element);
+ rowIndex++;
+ }
+ colIndex++;
+ }
+ DiscreteMatrixElementJDBC.batchDiscreteElements(elements, getTaxonLabelHome().getConnection());
+ return tbMatrix;
+ }
+
+ /**
+ *
+ * @param xmlMatrix
+ * @return
+ */
+ public Matrix fromXmlToTreeBase(ContinuousMatrix xmlMatrix) {
+ org.cipres.treebase.domain.matrix.ContinuousMatrix tbMatrix =
+ new org.cipres.treebase.domain.matrix.ContinuousMatrix();
+ ContinuousMatrixJDBC matrixJDBC = new ContinuousMatrixJDBC(tbMatrix, xmlMatrix, this);
+ List<MatrixColumnJDBC> columnJDBCs = new ArrayList<MatrixColumnJDBC>();
+ long[] colIds = matrixJDBC.getColIDs();
+ long[] rowIds = matrixJDBC.getRowIDs();
+ List<ContinuousMatrixElementJDBC> elements = new ArrayList<ContinuousMatrixElementJDBC>();
+
+ int colIndex = 0;
+ for ( org.nexml.model.Character xmlCharacter : xmlMatrix.getCharacters() ) {
+ String charName = xmlCharacter.getLabel();
+ ContinuousChar tbChar = new ContinuousChar();
+ tbChar.setDescription(charName);
+ MatrixColumnJDBC aColumnJDBC = new MatrixColumnJDBC();
+ aColumnJDBC.setPhyloChar(tbChar);
+ columnJDBCs.add(aColumnJDBC);
+ int rowIndex = 0;
+ for ( OTU xmlOTU : xmlMatrix.getOTUs().getAllOTUs() ) {
+ MatrixCell<Double> xmlCell = xmlMatrix.getCell(xmlOTU, xmlCharacter);
+ ContinuousMatrixElementJDBC element = new ContinuousMatrixElementJDBC();
+ element.setValue(xmlCell.getValue());
+ element.setElementOrder(colIndex);
+ element.setMatrixRowID(rowIds[rowIndex]);
+ element.setMatrixColID(colIds[colIndex]);
+ elements.add(element);
+ rowIndex++;
+ }
+ colIndex++;
+ }
+ ContinuousMatrixElementJDBC.batchContinuousElements(elements, getTaxonLabelHome().getConnection());
+ return tbMatrix;
+ }
+
+ /**
+ *
+ * @param xmlMatrix
+ * @return
+ */
+ public Matrix fromXmlToTreeBase(org.nexml.model.Matrix<?> xmlMatrix) {
+ OTUs xmlOTUs = xmlMatrix.getOTUs();
+ Matrix tbMatrix = null;
+ TaxonLabelSet tbTaxa = null;
+ Long tbTaxonLabelSetID = readTreeBaseID((Annotatable) xmlOTUs,TaxonLabelSet.class);
+ if ( null != tbTaxonLabelSetID ) {
+ tbTaxa = getTaxonLabelHome()
+ .findPersistedObjectByID(TaxonLabelSet.class, tbTaxonLabelSetID);
+ }
+ if ( xmlMatrix instanceof CategoricalMatrix ) {
+ tbMatrix = fromXmlToTreeBase((CategoricalMatrix) xmlMatrix);
+ }
+ else if ( xmlMatrix instanceof ContinuousMatrix ) {
+ tbMatrix = fromXmlToTreeBase((ContinuousMatrix) xmlMatrix);
+ }
+ if ( null != tbMatrix ) {
+ attachTreeBaseID((Annotatable) xmlMatrix, tbMatrix);
+ if ( null != tbTaxa ) {
+ tbMatrix.setTaxa(tbTaxa);
+ }
+ tbMatrix.setStudy(getStudy());
+ tbMatrix.setTitle(xmlMatrix.getLabel());
+ tbMatrix.setPublished(false);
+ }
+ return tbMatrix;
+ }
+
+ public org.nexml.model.Matrix<?> fromTreeBaseToXml(Matrix tbMatrix) {
+ TaxonLabelSet taxonLabelSet = tbMatrix.getTaxa();
+ Long taxonLabelSetId = taxonLabelSet.getId();
+ OTUs xmlOTUs = null;
+ for ( OTUs otus : getDocument().getOTUsList() ) {
+ Long annotatedID = readTreeBaseID(otus, TaxonLabelSet.class);
+ if ( taxonLabelSetId == annotatedID ) {
+ xmlOTUs = otus;
+ break;
+ }
+ }
+ org.nexml.model.Matrix<?> xmlMatrix = getDocument().createCategoricalMatrix(xmlOTUs);
+ xmlMatrix.setLabel(tbMatrix.getTitle());
+ attachTreeBaseID((Annotatable)xmlMatrix, tbMatrix);
+ return xmlMatrix;
+ }
+
+}
Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUConverter.java
===================================================================
--- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUConverter.java (rev 0)
+++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlOTUConverter.java 2009-06-18 09:32:34 UTC (rev 55)
@@ -0,0 +1,80 @@
+package org.cipres.treebase.domain.nexus.nexml;
+
+import org.cipres.treebase.domain.study.Study;
+import org.cipres.treebase.domain.taxon.TaxonLabel;
+import org.cipres.treebase.domain.taxon.TaxonLabelHome;
+import org.cipres.treebase.domain.taxon.TaxonLabelSet;
+import org.nexml.model.Document;
+import org.nexml.model.OTU;
+import org.nexml.model.OTUs;
+
+public class NexmlOTUConverter extends NexmlObjectConverter {
+
+ /**
+ *
+ * @param study
+ * @param taxonLabelHome
+ */
+ public NexmlOTUConverter(Study study,TaxonLabelHome taxonLabelHome,Document document) {
+ super(study,taxonLabelHome,document);
+ }
+
+ /**
+ *
+ * @param xmlOTUs
+ * @return
+ */
+ public TaxonLabelSet fromXmlToTreeBase (OTUs xmlOTUs) {
+ TaxonLabelSet labelSet = new TaxonLabelSet();
+ attachTreeBaseID(xmlOTUs,labelSet);
+ labelSet.setStudy(getStudy());
+ labelSet.setTitle(xmlOTUs.getLabel());
+ labelSet.setTaxa(true);
+ for ( OTU xmlOTU : xmlOTUs.getAllOTUs() ) {
+ TaxonLabel taxonLabel = fromXmlToTreeBase(xmlOTU);
+ labelSet.addPhyloTaxonLabel(taxonLabel);
+ }
+ return labelSet;
+ }
+
+ /**
+ *
+ * @param taxonLabelSet
+ * @return
+ */
+ public OTUs fromTreeBaseToXml(TaxonLabelSet taxonLabelSet) {
+ OTUs xmlOTUs = getDocument().createOTUs();
+ xmlOTUs.setLabel(taxonLabelSet.getTitle());
+ attachTreeBaseID(xmlOTUs,taxonLabelSet);
+ for ( TaxonLabel taxonLabel : taxonLabelSet.getTaxonLabelsReadOnly() ) {
+ fromTreeBaseToXml(taxonLabel,xmlOTUs);
+ }
+ return xmlOTUs;
+ }
+
+ /**
+ *
+ * @param xmlOTU
+ * @return
+ */
+ public TaxonLabel fromXmlToTreeBase(OTU xmlOTU) {
+ TaxonLabel taxonLabel = getTaxonLabelHome().getByDescriptionAndStudy(xmlOTU.getLabel(), getStudy());
+ taxonLabel.setStudy(getStudy());
+ attachTreeBaseID(xmlOTU,taxonLabel);
+ return taxonLabel;
+ }
+
+ /**
+ *
+ * @param taxonLabel
+ * @param xmlOTUs
+ * @return
+ */
+ public OTU fromTreeBaseToXml(TaxonLabel taxonLabel,OTUs xmlOTUs) {
+ OTU xmlOTU = xmlOTUs.createOTU();
+ xmlOTU.setLabel(taxonLabel.getTaxonLabel());
+ attachTreeBaseID(xmlOTU,taxonLabel);
+ return xmlOTU;
+ }
+
+}
Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java
===================================================================
--- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java (rev 0)
+++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlObjectConverter.java 2009-06-18 09:32:34 UTC (rev 55)
@@ -0,0 +1,93 @@
+package org.cipres.treebase.domain.nexus.nexml;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.cipres.treebase.TreebaseIDString;
+import org.cipres.treebase.domain.TBPersistable;
+import org.cipres.treebase.domain.nexus.AbstractNexusConverter;
+import org.cipres.treebase.domain.study.Study;
+import org.cipres.treebase.domain.taxon.TaxonLabelHome;
+import org.nexml.model.Annotatable;
+import org.nexml.model.Document;
+
+public class NexmlObjectConverter extends AbstractNexusConverter {
+ protected static URI mDCURI;
+ private static String mDCURIString = "http://purl.org/dc/elements/1.1/";
+ private static String mDCIdentifier = "dc:identifier";
+ public static String TreeBASE2Prefix = "TreeBASE2";
+ private Document mDocument;
+
+ /**
+ *
+ * @param study
+ * @param taxonLabelHome
+ */
+ public NexmlObjectConverter(Study study, TaxonLabelHome taxonLabelHome, Document document) {
+ try {
+ mDCURI = new URI(mDCURIString);
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ setTaxonLabelHome(taxonLabelHome);
+ setStudy(study);
+ setDocument(document);
+ }
+
+ /**
+ *
+ * @param tbPersistable
+ * @return
+ */
+ public String makeNamespacedID (TBPersistable tbPersistable) {
+ StringBuilder sb = new StringBuilder();
+ sb
+ .append(TreeBASE2Prefix)
+ .append(':')
+ .append(TreebaseIDString.getPrefixForClass(tbPersistable.getClass()))
+ .append(tbPersistable.getId());
+ return sb.toString();
+ }
+
+ /**
+ *
+ * @param annotatable
+ * @param tbPersistable
+ */
+ protected void attachTreeBaseID(Annotatable annotatable,TBPersistable tbPersistable) {
+ annotatable.addAnnotationValue(mDCIdentifier, mDCURI, makeNamespacedID(tbPersistable));
+ }
+
+ /**
+ *
+ * @param annotatable
+ * @param persistableClass
+ * @return
+ */
+ protected Long readTreeBaseID(Annotatable annotatable, Class<? extends TBPersistable> persistableClass) {
+ Set<Object> values = annotatable.getAnnotationValues(mDCIdentifier);
+ Iterator<Object> objectIterator = values.iterator();
+ while ( objectIterator.hasNext() ) {
+ String namespacedId = objectIterator.next().toString();
+ StringBuffer prefix = new StringBuffer();
+ prefix
+ .append(TreeBASE2Prefix)
+ .append(':')
+ .append(TreebaseIDString.getPrefixForClass(persistableClass));
+ if ( namespacedId.startsWith(prefix.toString()) ) {
+ return Long.parseLong(namespacedId.substring(prefix.length()));
+ }
+ }
+ return null;
+ }
+
+ public Document getDocument() {
+ return mDocument;
+ }
+
+ public void setDocument(Document document) {
+ mDocument = document;
+ }
+}
Added: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockConverter.java
===================================================================
--- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockConverter.java (rev 0)
+++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/nexus/nexml/NexmlTreeBlockConverter.java 2009-06-18 09:32:34 UTC (rev 55)
@@ -0,0 +1,226 @@
+package org.cipres.treebase.domain.nexus.nexml;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.cipres.treebase.domain.study.Study;
+import org.cipres.treebase.domain.taxon.TaxonLabel;
+import org.cipres.treebase.domain.taxon.TaxonLabelHome;
+import org.cipres.treebase.domain.taxon.TaxonLabelSet;
+import org.cipres.treebase.domain.tree.PhyloTree;
+import org.cipres.treebase.domain.tree.PhyloTreeNode;
+import org.cipres.treebase.domain.tree.TreeBlock;
+import org.nexml.model.Annotatable;
+import org.nexml.model.Document;
+import org.nexml.model.Edge;
+import org.nexml.model.FloatEdge;
+import org.nexml.model.IntEdge;
+import org.nexml.model.Network;
+import org.nexml.model.Node;
+import org.nexml.model.OTUs;
+import org.nexml.model.Tree;
+
+public class NexmlTreeBlockConverter extends NexmlObjectConverter {
+
+ /**
+ *
+ * @param study
+ * @param taxonLabelHome
+ */
+ public NexmlTreeBlockConverter(Study study,TaxonLabelHome taxonLabelHome,Document document) {
+ super(study,taxonLabelHome,document);
+ }
+
+ /**
+ *
+ * @param xmlTreeBlock
+ * @return
+ */
+ public TreeBlock fromXmlToTreeBase(org.nexml.model.TreeBlock xmlTreeBlock) {
+ OTUs xmlOTUs = xmlTreeBlock.getOTUs();
+ Long tbTaxonLabelSetId = readTreeBaseID(xmlOTUs,TaxonLabelSet.class);
+ TreeBlock tbTreeBlock = new TreeBlock();
+ tbTreeBlock.setTitle(xmlTreeBlock.getLabel());
+ if ( null != tbTaxonLabelSetId ) {
+ TaxonLabelSet tbTaxonLabelSet = getTaxonLabelHome()
+ .findPersistedObjectByID(TaxonLabelSet.class, tbTaxonLabelSetId);
+ tbTreeBlock.setTaxonLabelSet(tbTaxonLabelSet);
+ }
+ Iterator<Network<?>> xmlNetworkIterator = xmlTreeBlock.iterator();
+ while ( xmlNetworkIterator.hasNext() ) {
+ Network<?> xmlNetwork = xmlNetworkIterator.next();
+ if ( xmlNetwork instanceof Tree ) {
+ PhyloTree tbPhyloTree = fromXmlToTreeBase((Tree<?>) xmlNetwork);
+ tbPhyloTree.setStudy(getStudy());
+ tbTreeBlock.addPhyloTree(tbPhyloTree);
+ }
+ }
+ return tbTreeBlock;
+ }
+
+ /**
+ *
+ * @param xmlTree
+ * @return
+ */
+ public PhyloTree fromXmlToTreeBase(Tree<?> xmlTree) {
+ PhyloTree tbPhyloTree = new PhyloTree();
+ tbPhyloTree.setLabel(xmlTree.getLabel());
+ tbPhyloTree.setPublished(false);
+ tbPhyloTree.setRootedTree(((Node)xmlTree.getRoot()).isRoot());
+ copyXmlTree(xmlTree, tbPhyloTree);
+ tbPhyloTree.updateSubtreeBounds();
+ return tbPhyloTree;
+ }
+
+ /**
+ *
+ * @param phyloTree
+ * @return
+ */
+ public Tree<?> fromTreeBaseToXml(PhyloTree phyloTree,org.nexml.model.TreeBlock xmlTreeBlock) {
+ Tree<FloatEdge> xmlTree = xmlTreeBlock.createFloatTree();
+ xmlTree.setLabel(phyloTree.getLabel());
+ attachTreeBaseID(xmlTree, phyloTree);
+ copyTreeBaseTree(phyloTree, xmlTree);
+ return xmlTree;
+ }
+
+ /**
+ *
+ * @param treeBlock
+ * @return
+ */
+ public org.nexml.model.TreeBlock fromTreeBaseToXML(TreeBlock treeBlock) {
+ TaxonLabelSet taxonLabelSet = treeBlock.getTaxonLabelSet();
+ OTUs xmlOTUs = null;
+ Long taxonLabelSetId = taxonLabelSet.getId();
+ for ( OTUs otus : getDocument().getOTUsList() ) {
+ Long otusId = readTreeBaseID(otus, TaxonLabelSet.class);
+ if ( taxonLabelSetId == otusId ) {
+ xmlOTUs = otus;
+ break;
+ }
+ }
+ org.nexml.model.TreeBlock xmlTreeBlock = getDocument().createTreeBlock(xmlOTUs);
+ xmlTreeBlock.setLabel(treeBlock.getTitle());
+ attachTreeBaseID((Annotatable)xmlTreeBlock,treeBlock);
+ for ( PhyloTree phyloTree : treeBlock.getTreeList() ) {
+ fromTreeBaseToXml(phyloTree,xmlTreeBlock);
+ }
+ return xmlTreeBlock;
+ }
+
+ /**
+ *
+ * @param phyloTree
+ * @param xmlTree
+ */
+ private void copyTreeBaseTree(PhyloTree phyloTree,Tree<FloatEdge> xmlTree) {
+ traverseTreeBaseTree(phyloTree,phyloTree.getRootNode(),xmlTree.createNode(),xmlTree);
+ }
+
+ /**
+ *
+ * @param tbTree
+ * @param tbNode
+ * @param xmlNode
+ * @param xmlTree
+ */
+ private void traverseTreeBaseTree(PhyloTree tbTree,PhyloTreeNode tbNode,Node xmlNode,Tree<FloatEdge> xmlTree) {
+ xmlNode.setLabel(tbNode.getName());
+ attachTreeBaseID(xmlNode, tbNode);
+ TaxonLabel taxonLabel = tbNode.getTaxonLabel();
+ if ( null != taxonLabel ) {
+ Long taxonId = taxonLabel.getId();
+ for ( OTUs xmlOTUs : getDocument().getOTUsList() ) {
+ for ( org.nexml.model.OTU xmlOTU : xmlOTUs.getAllOTUs() ) {
+ Long currentTaxonId = readTreeBaseID(xmlOTU, TaxonLabel.class);
+ if ( taxonId == currentTaxonId ) {
+ xmlNode.setOTU(xmlOTU);
+ break;
+ }
+ }
+ }
+ }
+ for ( PhyloTreeNode tbChildNode : tbNode.getChildNodes() ) {
+ Node xmlChildNode = xmlTree.createNode();
+ FloatEdge xmlEdge = xmlTree.createEdge(xmlNode, xmlChildNode);
+ xmlEdge.setLength(tbChildNode.getBranchLength());
+ traverseTreeBaseTree(tbTree, tbChildNode, xmlChildNode, xmlTree);
+ }
+ }
+
+ /**
+ *
+ * @param xmlTree
+ * @param tbPhyloTree
+ */
+ private void copyXmlTree(Tree<?> xmlTree, PhyloTree tbPhyloTree) {
+ StringBuilder sb = new StringBuilder();
+ PhyloTreeNode tbRoot = new PhyloTreeNode();
+ traverseXmlTree(xmlTree,sb,xmlTree.getRoot(), tbRoot, tbPhyloTree);
+ tbPhyloTree.setRootNode(tbRoot);
+ sb.append(';');
+ tbPhyloTree.setNewickString(sb.toString());
+ }
+
+ /**
+ *
+ * @param xmlTree
+ * @param sb
+ * @param xmlNode
+ * @param tbNode
+ * @param tbTree
+ */
+ private void traverseXmlTree(Tree<?> xmlTree, StringBuilder sb, Node xmlNode, PhyloTreeNode tbNode, PhyloTree tbTree) {
+ tbTree.addTreeNode(tbNode);
+ if ( null != xmlNode.getOTU() ) {
+ Long tbTaxonLabelId = readTreeBaseID(xmlNode.getOTU(),TaxonLabel.class);
+ if ( null != tbTaxonLabelId ) {
+ TaxonLabel tbTaxonLabel = getTaxonLabelHome()
+ .findPersistedObjectByID(TaxonLabel.class, tbTaxonLabelId);
+ tbNode.setTaxonLabel(tbTaxonLabel);
+ }
+ }
+
+ Set<Node> xmlChildren = xmlTree.getOutNodes(xmlNode);
+ if ( ! xmlChildren.isEmpty() ) {// xmlNode is internal
+ sb.append('(');
+ }
+ int currentChild = 1;
+ for ( Node child : xmlChildren ) {
+ PhyloTreeNode tbChild = new PhyloTreeNode();
+ tbNode.addChildNode(tbChild);
+ traverseXmlTree(xmlTree,sb,child,tbChild,tbTree);
+ if ( currentChild < xmlChildren.size() ) {
+ sb.append(',');
+ }
+ currentChild++;
+ }
+ if ( ! xmlChildren.isEmpty() ) {// xmlNode is internal
+ sb.append(')');
+ }
+ String label = xmlNode.getLabel();
+ if ( null != label ) {
+ sb.append(label);
+ tbNode.setName(label);
+ }
+
+ Set<Node> xmlParents = xmlTree.getInNodes(xmlNode);
+ if ( ! xmlParents.isEmpty() ) { // xmlNode is not topological root
+ Edge xmlEdge = xmlTree.getEdge(xmlParents.iterator().next(), xmlNode);
+ if ( xmlEdge instanceof FloatEdge ) {
+ Double length = ((FloatEdge)xmlEdge).getLength();
+ sb.append(':').append(length);
+ tbNode.setBranchLength(length);
+ }
+ else if ( xmlEdge instanceof IntEdge ) {
+ Integer length = ((IntEdge)xmlEdge).getLength();
+ sb.append(':').append(length);
+ tbNode.setBranchLength(length.doubleValue());
+ }
+ }
+ }
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|