X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fclade_analysis%2FResultMulti.java;h=3f553642604148557aff60961e7f8c6f6ba5fda1;hb=1706deea223bc1a30d170596192d726b6847b7eb;hp=0fcda8b9747845fbe0b069f0195e920992e428e4;hpb=50c2ff100214fbb04b5f9665466e6d98d26b051d;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 0fcda8b..3f55364 100644 --- a/forester/java/src/org/forester/clade_analysis/ResultMulti.java +++ b/forester/java/src/org/forester/clade_analysis/ResultMulti.java @@ -36,27 +36,35 @@ import java.util.SortedMap; import java.util.TreeMap; import org.forester.util.ForesterUtil; +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 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(); } @@ -114,9 +122,24 @@ public final class ResultMulti { return _has_specifics; } + public String getQueryNamePrefix() { + 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(); + sb.append( "Query: " ); + sb.append( getQueryNamePrefix() ); + sb.append( ForesterUtil.LINE_SEPARATOR ); sb.append( "Matching Clade(s):" ); sb.append( ForesterUtil.LINE_SEPARATOR ); for( final Prefix prefix : _collapsed ) { @@ -163,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(); } @@ -178,7 +204,28 @@ public final class ResultMulti { _greatest_common_prefixes_down.add( new Prefix( prefix_down, confidence, _separator ) ); } - final void analyze( final double cutoff_for_specifics ) { + void setQueryNamePrefix( final String query_name_prefix ) { + if ( !ForesterUtil.isEmpty( _query_name_prefix ) ) { + throw new IllegalStateException( "illegal attempt to change the query name prefix" ); + } + _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 ); analyzeGreatestCommonPrefixesUp( _greatest_common_prefixes_up, _separator, cutoff_for_specifics ); @@ -186,31 +233,32 @@ public final class ResultMulti { } private final void reset() { - _all = new ArrayList<>(); - _collapsed = new ArrayList<>(); - _cleaned_spec = new ArrayList<>(); + _all = new ArrayList(); + _collapsed = new ArrayList(); + _cleaned_spec = new ArrayList(); _has_specifics = false; - _all_up = new ArrayList<>(); - _collapsed_up = new ArrayList<>(); - _cleaned_spec_up = new ArrayList<>(); + _all_up = new ArrayList(); + _collapsed_up = new ArrayList(); + _cleaned_spec_up = new ArrayList(); _has_specifics_up = false; - _all_down = new ArrayList<>(); - _collapsed_down = new ArrayList<>(); - _cleaned_spec_down = new ArrayList<>(); + _all_down = new ArrayList(); + _collapsed_down = new ArrayList(); + _cleaned_spec_down = new ArrayList(); _has_specifics_down = false; } private final void analyzeGreatestCommonPrefixes( final List greatest_common_prefixes, final String separator, - final double cutoff ) { + final double cutoff ) + throws UserException { 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; } @@ -220,15 +268,16 @@ public final class ResultMulti { private final void analyzeGreatestCommonPrefixesUp( final List greatest_common_prefixes_up, final String separator, - final double cutoff ) { + final double cutoff ) + throws UserException { 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; } @@ -238,15 +287,16 @@ public final class ResultMulti { final void analyzeGreatestCommonPrefixesDown( final List greatest_common_prefixes_down, final String separator, - final double cutoff ) { + final double cutoff ) + throws UserException { 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; } @@ -256,13 +306,14 @@ public final class ResultMulti { final static List obtainSpecifics( final double cutoff, final List cleaned, - final List collapsed ) { - final List cleaned_spec = new ArrayList<>(); - final Set collapsed_set = new HashSet<>(); + final List collapsed, + final String separator ) { + final List cleaned_spec = new ArrayList(); + final Set collapsed_set = new HashSet(); for( final Prefix prefix : collapsed ) { collapsed_set.add( prefix.getPrefix() ); } - final List spec = new ArrayList<>(); + final List spec = new ArrayList(); for( final Prefix prefix : cleaned ) { if ( ( prefix.getConfidence() >= cutoff ) && !collapsed_set.contains( prefix.getPrefix() ) ) { spec.add( prefix ); @@ -271,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 ); @@ -283,9 +339,9 @@ public final class ResultMulti { return cleaned_spec; } - private final static List collapse( final List cleaned ) { - final List collapsed = new ArrayList<>(); - final Set firsts = new HashSet<>(); + private final static List collapse( final List cleaned ) throws UserException { + final List collapsed = new ArrayList(); + final Set firsts = new HashSet(); double confidence_sum = 0; for( final Prefix prefix : cleaned ) { final String f = prefix.getPrefixFirstElement(); @@ -295,8 +351,8 @@ public final class ResultMulti { confidence_sum += prefix.getConfidence(); } } - if ( !ForesterUtil.isEqual( confidence_sum, 1.0, 1E-5 ) ) { - throw new IllegalArgumentException( "Confidences add up to " + confidence_sum + " instead of 1.0" ); + if ( !ForesterUtil.isEqual( confidence_sum, 1.0, MIN_DIFF ) ) { + throw new UserException( "confidences add up to " + confidence_sum + " instead of 1.0" ); } return collapsed; } @@ -311,12 +367,19 @@ public final class ResultMulti { * I.e. it removes less specific prefixes. * */ - private final static List removeLessSpecificPrefixes( final List l ) { - final List cleaned = new ArrayList<>(); + 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; @@ -346,7 +409,7 @@ public final class ResultMulti { private final static List obtainAllPrefixes( final List greatest_common_prefixes, final String separator ) { - final SortedMap map = new TreeMap<>(); + final SortedMap map = new TreeMap(); for( final Prefix prefix : greatest_common_prefixes ) { final List prefixes = ForesterUtil.spliIntoPrefixes( prefix.getPrefix(), separator ); for( final String p : prefixes ) { @@ -355,12 +418,12 @@ 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() ); } } } - final List l = new ArrayList<>(); + final List l = new ArrayList(); for( final Entry entry : map.entrySet() ) { l.add( new Prefix( entry.getKey(), entry.getValue(), separator ) ); }