X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fio%2Fparsers%2Fnexus%2FNexusPhylogeniesParser.java;h=0f9a5b6fd5792948e0c8b3e2c8e2b141360abc33;hb=656be28debec520e0e35a8b311114398a40ea366;hp=4279adea6eddd23ffbfbe6a1ef1e4dde214b0a23;hpb=eee996a6476a1e3d84c07f8f690dcde3ff4b2ef5;p=jalview.git diff --git a/forester/java/src/org/forester/io/parsers/nexus/NexusPhylogeniesParser.java b/forester/java/src/org/forester/io/parsers/nexus/NexusPhylogeniesParser.java index 4279ade..0f9a5b6 100644 --- a/forester/java/src/org/forester/io/parsers/nexus/NexusPhylogeniesParser.java +++ b/forester/java/src/org/forester/io/parsers/nexus/NexusPhylogeniesParser.java @@ -21,7 +21,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA // // Contact: phylosoft @ gmail . com -// WWW: www.phylosoft.org/forester +// WWW: https://sites.google.com/site/cmzmasek/home/software/forester package org.forester.io.parsers.nexus; @@ -38,6 +38,7 @@ import org.forester.archaeopteryx.Constants; import org.forester.io.parsers.PhylogenyParser; import org.forester.io.parsers.nhx.NHXFormatException; import org.forester.io.parsers.nhx.NHXParser; +import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION; import org.forester.io.parsers.util.ParserUtils; import org.forester.io.parsers.util.PhylogenyParserException; import org.forester.phylogeny.Phylogeny; @@ -65,79 +66,7 @@ public class NexusPhylogeniesParser implements PhylogenyParser { private Map _translate_map; private boolean _replace_underscores = NHXParser.REPLACE_UNDERSCORES_DEFAULT; private boolean _ignore_quotes_in_nh_data = Constants.NH_PARSING_IGNORE_QUOTES_DEFAULT; - - private void createPhylogeny( final String name, - final StringBuffer nhx, - final boolean rooted_info_present, - final boolean is_rooted ) throws IOException { - final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance(); - final NHXParser pars = new NHXParser(); - pars.setTaxonomyExtraction( ForesterUtil.TAXONOMY_EXTRACTION.NO ); - pars.setReplaceUnderscores( isReplaceUnderscores() ); - pars.setIgnoreQuotes( isIgnoreQuotes() ); - if ( rooted_info_present ) { - pars.setGuessRootedness( false ); - } - final Phylogeny p = factory.create( nhx, pars )[ 0 ]; - p.setName( name ); - if ( rooted_info_present ) { - p.setRooted( is_rooted ); - } - if ( ( getTaxlabels().size() > 0 ) || ( getTranslateMap().size() > 0 ) ) { - final PhylogenyNodeIterator it = p.iteratorExternalForward(); - while ( it.hasNext() ) { - final PhylogenyNode node = it.next(); - if ( ( getTranslateMap().size() > 0 ) && getTranslateMap().containsKey( node.getName() ) ) { - node.setName( getTranslateMap().get( node.getName() ).replaceAll( "['\"]+", "" ) ); - } - else if ( getTaxlabels().size() > 0 ) { - int i = -1; - try { - i = Integer.parseInt( node.getName() ); - } - catch ( final NumberFormatException e ) { - // Ignore. - } - if ( i > 0 ) { - node.setName( getTaxlabels().get( i - 1 ).replaceAll( "['\"]+", "" ) ); - } - } - } - } - getPhylogenies().add( p ); - } - - private Object getNexusSource() { - return _nexus_source; - } - - private List getPhylogenies() { - return _phylogenies; - } - - private Phylogeny[] getPhylogeniesAsArray() { - final Phylogeny[] p = new Phylogeny[ getPhylogenies().size() ]; - for( int i = 0; i < getPhylogenies().size(); ++i ) { - p[ i ] = getPhylogenies().get( i ); - } - return p; - } - - private List getTaxlabels() { - return _taxlabels; - } - - private Map getTranslateMap() { - return _translate_map; - } - - private boolean isIgnoreQuotes() { - return _ignore_quotes_in_nh_data; - } - - private boolean isReplaceUnderscores() { - return _replace_underscores; - } + private TAXONOMY_EXTRACTION _taxonomy_extraction = NHXParser.TAXONOMY_EXTRACTION_DEFAULT; @Override public Phylogeny[] parse() throws IOException, NHXFormatException { @@ -145,12 +74,11 @@ public class NexusPhylogeniesParser implements PhylogenyParser { final BufferedReader reader = ParserUtils.createReader( getNexusSource() ); String line; String name = ""; - StringBuffer nhx = new StringBuffer(); - final StringBuffer translate_sb = new StringBuffer(); + StringBuilder nhx = new StringBuilder(); + final StringBuilder translate_sb = new StringBuilder(); boolean in_trees_block = false; boolean in_taxalabels = false; boolean in_translate = false; - final boolean in_comment = false; boolean in_tree = false; boolean rooted_info_present = false; boolean is_rooted = false; @@ -185,7 +113,7 @@ public class NexusPhylogeniesParser implements PhylogenyParser { in_translate = false; if ( nhx.length() > 0 ) { createPhylogeny( name, nhx, rooted_info_present, is_rooted ); - nhx = new StringBuffer(); + nhx = new StringBuilder(); name = ""; rooted_info_present = false; is_rooted = false; @@ -194,7 +122,7 @@ public class NexusPhylogeniesParser implements PhylogenyParser { else if ( line_lc.startsWith( tree ) || ( line_lc.startsWith( utree ) ) ) { if ( nhx.length() > 0 ) { createPhylogeny( name, nhx, rooted_info_present, is_rooted ); - nhx = new StringBuffer(); + nhx = new StringBuilder(); name = ""; rooted_info_present = false; is_rooted = false; @@ -224,7 +152,7 @@ public class NexusPhylogeniesParser implements PhylogenyParser { in_tree = false; in_translate = false; createPhylogeny( name, nhx, rooted_info_present, is_rooted ); - nhx = new StringBuffer(); + nhx = new StringBuilder(); name = ""; rooted_info_present = false; is_rooted = false; @@ -270,20 +198,10 @@ public class NexusPhylogeniesParser implements PhylogenyParser { return getPhylogeniesAsArray(); } - private void reset() { - setPhylogenies( new ArrayList() ); - setTaxlabels( new ArrayList() ); - setTranslateMap( new HashMap() ); - } - public void setIgnoreQuotes( final boolean ignore_quotes_in_nh_data ) { _ignore_quotes_in_nh_data = ignore_quotes_in_nh_data; } - private void setPhylogenies( final ArrayList phylogenies ) { - _phylogenies = phylogenies; - } - public void setReplaceUnderscores( final boolean replace_underscores ) { _replace_underscores = replace_underscores; } @@ -296,11 +214,120 @@ public class NexusPhylogeniesParser implements PhylogenyParser { _nexus_source = nexus_source; } + public void setTaxonomyExtraction( final TAXONOMY_EXTRACTION taxonomy_extraction ) { + _taxonomy_extraction = taxonomy_extraction; + } + + private void createPhylogeny( final String name, + final StringBuilder nhx, + final boolean rooted_info_present, + final boolean is_rooted ) throws IOException { + final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance(); + final NHXParser pars = new NHXParser(); + if ( ( getTaxlabels().size() < 1 ) && ( getTranslateMap().size() < 1 ) ) { + pars.setTaxonomyExtraction( getTaxonomyExtraction() ); + pars.setReplaceUnderscores( isReplaceUnderscores() ); + pars.setIgnoreQuotes( isIgnoreQuotes() ); + } + else { + pars.setTaxonomyExtraction( TAXONOMY_EXTRACTION.NO ); + pars.setReplaceUnderscores( false ); + pars.setIgnoreQuotes( false ); + } + if ( rooted_info_present ) { + pars.setGuessRootedness( false ); + } + final Phylogeny p = factory.create( nhx, pars )[ 0 ]; + p.setName( name ); + if ( rooted_info_present ) { + p.setRooted( is_rooted ); + } + if ( ( getTaxlabels().size() > 0 ) || ( getTranslateMap().size() > 0 ) ) { + final PhylogenyNodeIterator it = p.iteratorExternalForward(); + while ( it.hasNext() ) { + final PhylogenyNode node = it.next(); + if ( ( getTranslateMap().size() > 0 ) && getTranslateMap().containsKey( node.getName() ) ) { + node.setName( getTranslateMap().get( node.getName() ).replaceAll( "['\"]+", "" ) ); + } + else if ( getTaxlabels().size() > 0 ) { + int i = -1; + try { + i = Integer.parseInt( node.getName() ); + } + catch ( final NumberFormatException e ) { + // Ignore. + } + if ( i > 0 ) { + node.setName( getTaxlabels().get( i - 1 ).replaceAll( "['\"]+", "" ) ); + } + } + if ( !isReplaceUnderscores() && ( ( getTaxonomyExtraction() != TAXONOMY_EXTRACTION.NO ) ) ) { + ParserUtils.extractTaxonomyDataFromNodeName( node, getTaxonomyExtraction() ); + // final String tax = ParserUtils.extractTaxonomyCodeFromNodeName( node.getName(), + // getTaxonomyExtraction() ); + // if ( !ForesterUtil.isEmpty( tax ) ) { + // if ( !node.getNodeData().isHasTaxonomy() ) { + // node.getNodeData().setTaxonomy( new Taxonomy() ); + // } + // node.getNodeData().getTaxonomy().setTaxonomyCode( tax ); + // } + } + } + } + getPhylogenies().add( p ); + } + + private Object getNexusSource() { + return _nexus_source; + } + + private List getPhylogenies() { + return _phylogenies; + } + + private Phylogeny[] getPhylogeniesAsArray() { + final Phylogeny[] p = new Phylogeny[ getPhylogenies().size() ]; + for( int i = 0; i < getPhylogenies().size(); ++i ) { + p[ i ] = getPhylogenies().get( i ); + } + return p; + } + + private List getTaxlabels() { + return _taxlabels; + } + + private TAXONOMY_EXTRACTION getTaxonomyExtraction() { + return _taxonomy_extraction; + } + + private Map getTranslateMap() { + return _translate_map; + } + + private boolean isIgnoreQuotes() { + return _ignore_quotes_in_nh_data; + } + + private boolean isReplaceUnderscores() { + return _replace_underscores; + } + + private void reset() { + setPhylogenies( new ArrayList() ); + setTaxlabels( new ArrayList() ); + setTranslateMap( new HashMap() ); + } + + private void setPhylogenies( final ArrayList phylogenies ) { + _phylogenies = phylogenies; + } + private void setTaxlabels( final List taxlabels ) { _taxlabels = taxlabels; } - private void setTranslateKeyValuePairs( final StringBuffer translate_sb ) throws IOException { + private void setTranslateKeyValuePairs( final StringBuilder translate_sb ) throws IOException { String s = translate_sb.toString().trim(); if ( s.endsWith( ";" ) ) { s = s.substring( 0, s.length() - 1 ).trim(); @@ -308,10 +335,10 @@ public class NexusPhylogeniesParser implements PhylogenyParser { for( final String pair : s.split( "," ) ) { final String[] kv = pair.trim().split( "\\s+" ); if ( ( kv.length < 2 ) || ( kv.length > 3 ) ) { - throw new IOException( "ill formatted translate values: " + translate_sb ); + throw new IOException( "ill-formatted translate values: " + translate_sb ); } if ( ( kv.length == 3 ) && !kv[ 0 ].toLowerCase().trim().equals( translate ) ) { - throw new IOException( "ill formatted translate values: " + translate_sb ); + throw new IOException( "ill-formatted translate values: " + translate_sb ); } String key = ""; String value = "";