X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fclade_analysis%2FResultMulti.java;h=285e533a5e599fc1b62ab9cf4a2f23901a8ea8be;hb=0d0b9cde030d50b153eb6d1ff7ce13bc273edc17;hp=566a646af3ad0e9883d917efcf67a4c3bc2db158;hpb=0242e29064e3a7e20cf9c0faec574c6ee5fcde7d;p=jalview.git diff --git a/forester/java/src/org/forester/clade_analysis/ResultMulti.java b/forester/java/src/org/forester/clade_analysis/ResultMulti.java index 566a646..285e533 100644 --- a/forester/java/src/org/forester/clade_analysis/ResultMulti.java +++ b/forester/java/src/org/forester/clade_analysis/ResultMulti.java @@ -40,25 +40,31 @@ import org.forester.util.UserException; public final class ResultMulti { - private final String _separator; - private final List _greatest_common_prefixes = new ArrayList<>(); - private final List _greatest_common_prefixes_up = new ArrayList<>(); - private final List _greatest_common_prefixes_down = new ArrayList<>(); - private List _all = null; - private List _collapsed = null; - private List _cleaned_spec = null; - private boolean _has_specifics = false; - private List _all_up = null; - private List _collapsed_up = null; - private List _cleaned_spec_up = null; - private boolean _has_specifics_up = false; - private List _all_down = null; - private List _collapsed_down = null; - private List _cleaned_spec_down = null; - private boolean _has_specifics_down = false; - private String _query_name_prefix = ""; + private final static double MIN_DIFF = 1E-5; + private final String _separator; + private final List _greatest_common_prefixes = new ArrayList<>(); + private final List _greatest_common_prefixes_up = new ArrayList<>(); + private final List _greatest_common_prefixes_down = new ArrayList<>(); + private List _all = null; + private List _collapsed = null; + private List _cleaned_spec = null; + private boolean _has_specifics = false; + private List _all_up = null; + private List _collapsed_up = null; + private List _cleaned_spec_up = null; + private boolean _has_specifics_up = false; + private List _all_down = null; + private List _collapsed_down = null; + private List _cleaned_spec_down = null; + private boolean _has_specifics_down = false; + private int _matches = 0; + private int _ref_tree_ext_nodes = 0; + private String _query_name_prefix = ""; ResultMulti( final String separator ) { + if ( ForesterUtil.isEmpty( separator ) ) { + throw new IllegalArgumentException( "separator must not be null or empty" ); + } _separator = separator; reset(); } @@ -120,6 +126,14 @@ public final class ResultMulti { return _query_name_prefix; } + public int getNumberOfMatches() { + return _matches; + } + + public int getReferenceTreeNumberOfExternalNodes() { + return _ref_tree_ext_nodes; + } + @Override public final String toString() { final StringBuilder sb = new StringBuilder(); @@ -172,6 +186,9 @@ public final class ResultMulti { sb.append( ForesterUtil.LINE_SEPARATOR ); } } + sb.append( ForesterUtil.LINE_SEPARATOR ); + sb.append( "Total Number of Matches: " + getNumberOfMatches() + "/" + getReferenceTreeNumberOfExternalNodes() ); + sb.append( ForesterUtil.LINE_SEPARATOR ); return sb.toString(); } @@ -194,6 +211,20 @@ public final class ResultMulti { _query_name_prefix = query_name_prefix; } + void setTotalNumberOfMatches( final int matches ) { + if ( _matches > 0 ) { + throw new IllegalStateException( "illegal attempt to change the number of matches" ); + } + _matches = matches; + } + + public void setReferenceTreeNumberOfExternalNodes( final int ext_nodes ) { + if ( _ref_tree_ext_nodes > 0 ) { + throw new IllegalStateException( "illegal attempt to change the number of external nodes" ); + } + _ref_tree_ext_nodes = ext_nodes; + } + final void analyze( final double cutoff_for_specifics ) throws UserException { reset(); analyzeGreatestCommonPrefixes( _greatest_common_prefixes, _separator, cutoff_for_specifics ); @@ -223,11 +254,11 @@ public final class ResultMulti { final List l = obtainAllPrefixes( greatest_common_prefixes, separator ); if ( !ForesterUtil.isEmpty( l ) ) { sortPrefixesAccordingToConfidence( l ); - _all = removeLessSpecificPrefixes( l ); + _all = removeLessSpecificPrefixes( l, separator ); _collapsed = collapse( _all ); _has_specifics = false; if ( cutoff >= 0 ) { - _cleaned_spec = obtainSpecifics( cutoff, _all, _collapsed ); + _cleaned_spec = obtainSpecifics( cutoff, _all, _collapsed, separator ); if ( !ForesterUtil.isEmpty( _cleaned_spec ) ) { _has_specifics = true; } @@ -242,11 +273,11 @@ public final class ResultMulti { final List l = obtainAllPrefixes( greatest_common_prefixes_up, separator ); if ( !ForesterUtil.isEmpty( l ) ) { sortPrefixesAccordingToConfidence( l ); - _all_up = removeLessSpecificPrefixes( l ); + _all_up = removeLessSpecificPrefixes( l, separator ); _collapsed_up = collapse( _all_up ); _has_specifics_up = false; if ( cutoff >= 0 ) { - _cleaned_spec_up = obtainSpecifics( cutoff, _all_up, _collapsed_up ); + _cleaned_spec_up = obtainSpecifics( cutoff, _all_up, _collapsed_up, separator ); if ( !ForesterUtil.isEmpty( _cleaned_spec_up ) ) { _has_specifics_up = true; } @@ -261,11 +292,11 @@ public final class ResultMulti { final List l = obtainAllPrefixes( greatest_common_prefixes_down, separator ); if ( !ForesterUtil.isEmpty( l ) ) { sortPrefixesAccordingToConfidence( l ); - _all_down = removeLessSpecificPrefixes( l ); + _all_down = removeLessSpecificPrefixes( l, separator ); _collapsed_down = collapse( _all_down ); _has_specifics_down = false; if ( cutoff >= 0 ) { - _cleaned_spec_down = obtainSpecifics( cutoff, _all_down, _collapsed_down ); + _cleaned_spec_down = obtainSpecifics( cutoff, _all_down, _collapsed_down, separator ); if ( !ForesterUtil.isEmpty( _cleaned_spec_down ) ) { _has_specifics_down = true; } @@ -275,7 +306,8 @@ public final class ResultMulti { final static List obtainSpecifics( final double cutoff, final List cleaned, - final List collapsed ) { + final List collapsed, + final String separator ) { final List cleaned_spec = new ArrayList<>(); final Set collapsed_set = new HashSet<>(); for( final Prefix prefix : collapsed ) { @@ -290,10 +322,15 @@ public final class ResultMulti { for( final Prefix o : spec ) { boolean ok = true; for( final Prefix i : spec ) { - if ( ( !o.getPrefix().equals( i.getPrefix() ) ) && ( i.getPrefix().startsWith( o.getPrefix() ) ) ) { + if ( ( !o.getPrefix().equals( i.getPrefix() ) ) + && ( ForesterUtil.isContainsPrefix( i.getPrefix(), o.getPrefix(), separator ) ) ) { ok = false; break; } + /* if ( ( !o.getPrefix().equals( i.getPrefix() ) ) && ( i.getPrefix().startsWith( o.getPrefix() ) ) ) { + ok = false; + break; + }*/ } if ( ok ) { cleaned_spec.add( o ); @@ -314,7 +351,7 @@ public final class ResultMulti { confidence_sum += prefix.getConfidence(); } } - if ( !ForesterUtil.isEqual( confidence_sum, 1.0, 1E-5 ) ) { + if ( !ForesterUtil.isEqual( confidence_sum, 1.0, MIN_DIFF ) ) { throw new UserException( "confidences add up to " + confidence_sum + " instead of 1.0" ); } return collapsed; @@ -330,12 +367,19 @@ public final class ResultMulti { * I.e. it removes less specific prefixes. * */ - private final static List removeLessSpecificPrefixes( final List l ) { + private final static List removeLessSpecificPrefixes( final List l, final String separator ) { final List cleaned = new ArrayList<>(); for( final Prefix o : l ) { boolean ok = true; for( final Prefix i : l ) { - if ( ( !o.getPrefix().equals( i.getPrefix() ) ) && ( i.getPrefix().startsWith( o.getPrefix() ) ) + /*if ( ( !o.getPrefix().equals( i.getPrefix() ) ) && ( i.getPrefix().startsWith( o.getPrefix() ) ) + && ForesterUtil.isEqual( i.getConfidence(), + o.getConfidence() ) ) { + ok = false; + break; + }*/ + if ( ( !o.getPrefix().equals( i.getPrefix() ) ) + && ( ForesterUtil.isContainsPrefix( i.getPrefix(), o.getPrefix(), separator ) ) && ForesterUtil.isEqual( i.getConfidence(), o.getConfidence() ) ) { ok = false; @@ -374,7 +418,7 @@ public final class ResultMulti { } for( final String key : map.keySet() ) { for( final Prefix prefix : greatest_common_prefixes ) { - if ( prefix.getPrefix().startsWith( key ) ) { + if ( ForesterUtil.isContainsPrefix( prefix.getPrefix(), key, separator ) ) { map.put( key, map.get( key ) + prefix.getConfidence() ); } }