From 35f6448d781832160eab0f24b865f824cd9dab8c Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Wed, 20 Jun 2012 02:02:19 +0000 Subject: [PATCH] improving GSDI, under construction... works again... but slow... --- .../java/src/org/forester/application/gsdi.java | 1 + forester/java/src/org/forester/sdi/GSDI.java | 161 +++++++++++++------- 2 files changed, 107 insertions(+), 55 deletions(-) diff --git a/forester/java/src/org/forester/application/gsdi.java b/forester/java/src/org/forester/application/gsdi.java index 0c1a387..5bf4e14 100644 --- a/forester/java/src/org/forester/application/gsdi.java +++ b/forester/java/src/org/forester/application/gsdi.java @@ -287,6 +287,7 @@ public final class gsdi { } } catch ( final Exception e ) { + e.printStackTrace(); ForesterUtil.fatalError( PRG_NAME, e.getLocalizedMessage() ); } System.out.println(); diff --git a/forester/java/src/org/forester/sdi/GSDI.java b/forester/java/src/org/forester/sdi/GSDI.java index 5939037..5fd72bb 100644 --- a/forester/java/src/org/forester/sdi/GSDI.java +++ b/forester/java/src/org/forester/sdi/GSDI.java @@ -264,62 +264,62 @@ public final class GSDI extends SDI { * */ @Override + // final void linkNodesOfG() { + // final HashMap speciestree_ext_nodes = createTaxonomyToNodeMap(); + // if ( _strip_gene_tree ) { + // stripGeneTree( speciestree_ext_nodes ); + // if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { + // throw new IllegalArgumentException( "species tree does not contain any" + // + " nodes matching species in the gene tree" ); + // } + // } + // // Retrieve the reference to the PhylogenyNode with a matching species. + // for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { + // final PhylogenyNode g = iter.next(); + // if ( !g.getNodeData().isHasTaxonomy() ) { + // throw new IllegalArgumentException( "gene tree node " + g + " has no taxonomic data" ); + // } + // final PhylogenyNode s = speciestree_ext_nodes.get( g.getNodeData().getTaxonomy() ); + // if ( s == null ) { + // throw new IllegalArgumentException( "species " + g.getNodeData().getTaxonomy() + // + " not present in species tree" ); + // } + // g.setLink( s ); + // } + // } final void linkNodesOfG() { - final HashMap speciestree_ext_nodes = createTaxonomyToNodeMap(); - if ( _strip_gene_tree ) { - stripGeneTree( speciestree_ext_nodes ); - if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { - throw new IllegalArgumentException( "species tree does not contain any" - + " nodes matching species in the gene tree" ); - } - } - // Retrieve the reference to the PhylogenyNode with a matching species. - for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { - final PhylogenyNode g = iter.next(); - if ( !g.getNodeData().isHasTaxonomy() ) { - throw new IllegalArgumentException( "gene tree node " + g + " has no taxonomic data" ); - } - final PhylogenyNode s = speciestree_ext_nodes.get( g.getNodeData().getTaxonomy() ); - if ( s == null ) { - throw new IllegalArgumentException( "species " + g.getNodeData().getTaxonomy() - + " not present in species tree" ); - } - g.setLink( s ); - } - } - - final void linkNodesOfG2() { - final HashMap speciestree_ext_nodes = createTaxonomyToNodeMap(); - if ( _strip_gene_tree ) { - stripGeneTree( speciestree_ext_nodes ); - if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { - throw new IllegalArgumentException( "species tree does not contain any" - + " nodes matching species in the gene tree" ); - } - } - // Retrieve the reference to the PhylogenyNode with a matching species. - for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { - final PhylogenyNode g = iter.next(); - if ( !g.getNodeData().isHasTaxonomy() ) { - throw new IllegalArgumentException( "gene tree node " + g + " has no taxonomic data" ); - } - final PhylogenyNode s = speciestree_ext_nodes.get( g.getNodeData().getTaxonomy() ); - if ( s == null ) { - throw new IllegalArgumentException( "species " + g.getNodeData().getTaxonomy() - + " not present in species tree" ); - } - g.setLink( s ); - } + // final HashMap speciestree_ext_nodes = createTaxonomyToNodeMap(); + // if ( _strip_gene_tree ) { + // stripGeneTree( speciestree_ext_nodes ); + // if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { + // throw new IllegalArgumentException( "species tree does not contain any" + // + " nodes matching species in the gene tree" ); + // } + // } + // // Retrieve the reference to the PhylogenyNode with a matching species. + // for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { + // final PhylogenyNode g = iter.next(); + // if ( !g.getNodeData().isHasTaxonomy() ) { + // throw new IllegalArgumentException( "gene tree node " + g + " has no taxonomic data" ); + // } + // final PhylogenyNode s = speciestree_ext_nodes.get( g.getNodeData().getTaxonomy() ); + // if ( s == null ) { + // throw new IllegalArgumentException( "species " + g.getNodeData().getTaxonomy() + // + " not present in species tree" ); + // } + // g.setLink( s ); + // } ////// final Map speciestree_ext_nodes = new HashMap(); final TaxonomyComparisonBase tax_comp_base = determineTaxonomyComparisonBase( _gene_tree ); - if ( _strip_gene_tree ) { - stripGeneTree( speciestree_ext_nodes ); - if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { - throw new IllegalArgumentException( "species tree does not contain any" - + " nodes matching species in the gene tree" ); - } - } + System.out.println( "comp base is: " + tax_comp_base ); + // if ( _strip_gene_tree ) { + // stripGeneTree2( speciestree_ext_nodes ); + // if ( ( _gene_tree == null ) || ( _gene_tree.getNumberOfExternalNodes() < 2 ) ) { + // throw new IllegalArgumentException( "species tree does not contain any" + // + " nodes matching species in the gene tree" ); + // } + //} // Put references to all external nodes of the species tree into a map. // Stringyfied taxonomy is the key, node is the value. for( final PhylogenyNodeIterator iter = _species_tree.iteratorExternalForward(); iter.hasNext(); ) { @@ -333,13 +333,46 @@ public final class GSDI extends SDI { // Retrieve the reference to the node with a matching stringyfied taxonomy. for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { final PhylogenyNode g = iter.next(); + if ( !g.getNodeData().isHasTaxonomy() ) { + if ( _strip_gene_tree ) { + _stripped_gene_tree_nodes.add( g ); + continue; + } + else { + throw new IllegalArgumentException( "gene tree node [" + g + "] has no taxonomic data" ); + } + } final String tax_str = taxonomyToString( g, tax_comp_base ); + if ( ForesterUtil.isEmpty( tax_str ) ) { + if ( _strip_gene_tree ) { + _stripped_gene_tree_nodes.add( g ); + continue; + } + else { + throw new IllegalArgumentException( "gene tree node [" + g + "] has no appropriate taxonomic data" ); + } + } final PhylogenyNode s = speciestree_ext_nodes.get( tax_str ); if ( s == null ) { - throw new IllegalArgumentException( "taxonomy [" + g.getNodeData().getTaxonomy() - + "] not present in species tree" ); + if ( _strip_gene_tree ) { + _stripped_gene_tree_nodes.add( g ); + } + else { + throw new IllegalArgumentException( "taxonomy [" + g.getNodeData().getTaxonomy() + + "] not present in species tree" ); + } + } + else { + g.setLink( s ); + System.out.println( "setting link of " + g + " to " + s ); + } + if ( _strip_gene_tree ) { + for( final PhylogenyNode n : _stripped_gene_tree_nodes ) { + if ( _gene_tree.getNode( n.getId() ) != null ) { + _gene_tree.deleteSubtree( _gene_tree.getNode( n.getId() ), true ); + } + } } - g.setLink( s ); } } @@ -374,6 +407,24 @@ public final class GSDI extends SDI { } } + private final void stripGeneTree2( final HashMap speciestree_ext_nodes ) { + // final Set to_delete = new HashSet(); + for( final PhylogenyNodeIterator iter = _gene_tree.iteratorExternalForward(); iter.hasNext(); ) { + final PhylogenyNode g = iter.next(); + if ( !g.getNodeData().isHasTaxonomy() ) { + _stripped_gene_tree_nodes.add( g ); + } + else { + if ( !speciestree_ext_nodes.containsKey( g.getNodeData().getTaxonomy() ) ) { + _stripped_gene_tree_nodes.add( g ); + } + } + } + for( final PhylogenyNode n : _stripped_gene_tree_nodes ) { + _gene_tree.deleteSubtree( n, true ); + } + } + public static TaxonomyComparisonBase determineTaxonomyComparisonBase( final Phylogeny gene_tree ) { int with_id_count = 0; int with_code_count = 0; -- 1.7.10.2