package org.forester.clade_analysis;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.SortedMap;
import java.util.regex.Matcher;
import org.forester.phylogeny.Phylogeny;
import org.forester.phylogeny.PhylogenyNode;
-import org.forester.phylogeny.data.Confidence;
import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
import org.forester.util.ForesterUtil;
import org.forester.util.UserException;
final String separator,
final double cutoff_for_specifics )
throws UserException {
+ if ( ForesterUtil.isEmpty( separator ) ) {
+ throw new IllegalArgumentException( "separator must not be null or empty" );
+ }
cleanUpExternalNames( p, separator );
final List<PhylogenyNode> qnodes = p.getNodes( query );
- String query_name_prefix = null;
- for( final PhylogenyNode n : qnodes ) {
- final String name = n.getName();
- final Matcher matcher = query.matcher( name );
- if ( matcher.find() ) {
- final String prefix = name.substring( 0, matcher.start() );
- if ( ForesterUtil.isEmpty( prefix ) ) {
- throw new UserException( "query nodes with empty label prefix found: \"" + prefix + "\"" );
- }
- if ( query_name_prefix == null ) {
- query_name_prefix = prefix;
- }
- else if ( !query_name_prefix.equals( prefix ) ) {
- throw new UserException( "query nodes with different label prefixes found: \"" + query_name_prefix
- + "\" and \"" + prefix + "\"" );
- }
- }
- }
final ResultMulti res = new ResultMulti();
- res.setQueryNamePrefix( query_name_prefix );
+ res.setQueryNamePrefix( obtainQueryPrefix( query, qnodes ) );
+ res.setTotalNumberOfMatches( qnodes.size() );
+ res.setReferenceTreeNumberOfExternalNodes( p.getNumberOfExternalNodes() - qnodes.size() );
for( int i = 0; i < qnodes.size(); ++i ) {
final PhylogenyNode qnode = qnodes.get( i );
if ( qnode.isRoot() ) {
while ( qnode_pp.getNumberOfDescendants() == 1 ) {
qnode_pp = qnode_pp.getParent();
}
- final List<String> qnode_ext_nodes_names = new ArrayList<>();
+ final List<String> qnode_ext_nodes_names = new ArrayList<String>();
for( final PhylogenyNode qnode_ext_node : qnode_pp.getAllExternalDescendants() ) {
final String name = qnode_ext_node.getName();
final Matcher m = query.matcher( name );
conf_str = matcher.group( 1 );
}
else {
- throw new IllegalStateException( "pattern did not match -- this should have never happened!" );
+ throw new IllegalStateException( "query pattern does not match [this should have never happened!]" );
}
final double conf = Double.parseDouble( conf_str );
if ( !ForesterUtil.isEmpty( greatest_common_prefix ) ) {
return res;
}
+ private final static String obtainQueryPrefix( final Pattern query, final List<PhylogenyNode> qnodes )
+ throws UserException {
+ String query_name_prefix = null;
+ for( final PhylogenyNode n : qnodes ) {
+ final String name = n.getName();
+ final Matcher matcher = query.matcher( name );
+ if ( matcher.find() ) {
+ final String prefix = name.substring( 0, matcher.start() );
+ if ( ForesterUtil.isEmpty( prefix ) ) {
+ throw new UserException( "query nodes with empty label prefix found: \"" + prefix + "\"" );
+ }
+ if ( query_name_prefix == null ) {
+ query_name_prefix = prefix;
+ }
+ else if ( !query_name_prefix.equals( prefix ) ) {
+ throw new UserException( "query nodes with different label prefixes found: \"" + query_name_prefix
+ + "\" and \"" + prefix + "\"" );
+ }
+ }
+ }
+ return query_name_prefix;
+ }
+
private final static void cleanUpExternalNames( final Phylogeny p, final String separator ) throws UserException {
final Pattern pattern1 = Pattern.compile( "\\Q" + separator + "\\E" + "\\s+" );
final Pattern pattern2 = Pattern.compile( "\\s+" + "\\Q" + separator + "\\E" );
final String separator,
final Pattern query ) {
final int child_index = child.getChildNodeIndex();
- final List<String> ext_nodes_names = new ArrayList<>();
+ final List<String> ext_nodes_names = new ArrayList<String>();
final List<PhylogenyNode> descs = parent.getDescendants();
for( int i = 0; i < descs.size(); ++i ) {
if ( i != child_index ) {
return greatest_common_prefix;
}
- private final static String obtainConfidence( final PhylogenyNode n ) {
- if ( ( n.getBranchData().getConfidences() != null ) && ( n.getBranchData().getConfidences().size() > 0 ) ) {
- final List<Confidence> confidences = n.getBranchData().getConfidences();
- boolean not_first = false;
- Collections.sort( confidences );
- final StringBuilder sb = new StringBuilder();
- for( final Confidence confidence : confidences ) {
- final double value = confidence.getValue();
- if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
- if ( not_first ) {
- sb.append( " / " );
- }
- else {
- not_first = true;
- }
- sb.append( ( ForesterUtil.isEmpty( confidence.getType() ) ? "confidence: "
- : confidence.getType() + ": " ) + value );
- }
- }
- return sb.toString();
- }
- return null;
- }
-
public final static void performMapping( final Pattern pattern,
final SortedMap<String, String> map,
final Phylogeny p,
}
}
- public final static void performExtraProcessing1( final Pattern pattern,
+ public final static void performExtraProcessing1( final Pattern query_pattern,
final Phylogeny p,
final String extra_sep,
final boolean keep,
if ( ForesterUtil.isEmpty( name ) ) {
throw new UserException( "external node with empty name found" );
}
- final Matcher m = pattern.matcher( name );
- if ( !m.find() ) {
+ if ( !query_pattern.matcher( name ).find() ) {
final StringBuilder sb = new StringBuilder();
final int last_index = name.lastIndexOf( extra_sep );
if ( last_index >= 0 ) {
final String annotation = name.substring( last_index + 1 ).trim();
if ( ForesterUtil.isEmptyTrimmed( annotation ) ) {
- throw new UserException( "illegal format:" + name );
+ throw new UserException( "llegally formatted annotation: " + name );
}
if ( keep ) {
final String extra = name.substring( 0, last_index ).trim();
System.out.println();
}
}
+
+ public final static void performSpecialProcessing1( final Pattern query_pattern,
+ final Phylogeny p,
+ final String annotation_sep,
+ final Pattern special_pattern,
+ final boolean verbose )
+ throws UserException {
+ if ( verbose ) {
+ System.out.println();
+ System.out.println( "Special annotation processing:" );
+ }
+ final PhylogenyNodeIterator it = p.iteratorExternalForward();
+ while ( it.hasNext() ) {
+ final PhylogenyNode node = it.next();
+ final String name = node.getName().trim();
+ if ( ForesterUtil.isEmpty( name ) ) {
+ throw new UserException( "external node with empty name found" );
+ }
+ if ( !query_pattern.matcher( name ).find() ) {
+ final Matcher special_m = special_pattern.matcher( name );
+ if ( special_m.matches() ) {
+ final int c = special_m.groupCount();
+ if ( c < 1 ) {
+ throw new UserException( "illegal special pattern: " + special_pattern
+ + " (need at least one capturing group)" );
+ }
+ final StringBuilder sb = new StringBuilder();
+ for( int i = 1; i <= c; ++i ) {
+ final String g = special_m.group( i );
+ if ( !ForesterUtil.isEmpty( g ) ) {
+ if ( i > 1 ) {
+ sb.append( annotation_sep );
+ }
+ sb.append( special_m.group( i ) );
+ }
+ }
+ node.setName( sb.toString() );
+ if ( verbose ) {
+ System.out.println( name + " -> " + node.getName() );
+ }
+ }
+ else {
+ throw new UserException( "illegally formatted annotation for special processing: " + name
+ + " (expected pattern: " + special_pattern + ")" );
+ }
+ }
+ }
+ if ( verbose ) {
+ System.out.println();
+ }
+ }
}