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. |