From: <rv...@us...> - 2012-02-01 21:29:19
|
Revision: 1033 http://treebase.svn.sourceforge.net/treebase/?rev=1033&view=rev Author: rvos Date: 2012-02-01 21:29:13 +0000 (Wed, 01 Feb 2012) Log Message: ----------- Now implements getNormalizedSymbolString, which, like getSymbolString returns a string representation of the row's character state sequence. - getNormalizedSymbolString (and its helper methods) return a sequence of single character symbols: IUPAC symbols, such as N. - getSymbolString returns a sequence with a mini-syntax for indicating ambiguous states, using curled braces, like so: {ACGT} Modified Paths: -------------- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java Modified: trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java =================================================================== --- trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java 2012-02-01 21:17:20 UTC (rev 1032) +++ trunk/treebase-core/src/main/java/org/cipres/treebase/domain/matrix/MatrixRow.java 2012-02-01 21:29:13 UTC (rev 1033) @@ -5,7 +5,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set; import javax.persistence.AttributeOverride; @@ -52,6 +51,9 @@ private static final int DISPLAY_STRING_LENGTH = 30; private String mSymbolString; + + @Transient + private String mNormalizedSymbolString = null; private TaxonLabel mTaxonLabel; private CharacterMatrix mMatrix; @@ -173,16 +175,30 @@ * * Note that this method post-processes the output of getSymbolString(), i.e. * if that method returns an {ACGT} this method replaces that with whatever - * ambiguity mapping was provided. E.g. if the map pMapping holds a slot for + * ambiguity mapping was provided. E.g. if the mapper holds a slot for * "ACGT" => "N" this method will return that N instead. * * @return String */ @Transient - public String getSymbolString(Map<String,String> pMapping) { - String inputString = getSymbolString(); + public String getNormalizedSymbolString() { + if ( null == mNormalizedSymbolString ) { + StateSetMapper mapper = StateSetMapper.createMapperForDataType(getMatrix().getDataType().getDescription()); + String inputString = getSymbolString(); + if ( null != mapper ) { + mNormalizedSymbolString = buildNormalizedSymbolString(mapper,inputString); + } + else { + mNormalizedSymbolString = inputString; + } + } + return mNormalizedSymbolString; + } + + @Transient + public static String buildNormalizedSymbolString(StateSetMapper mapper,String inputString) { StringBuffer outputString = new StringBuffer(); - List<Character> ambiguous = new ArrayList<Character>(); + HashSet<Character> ambiguous = new HashSet<Character>(); boolean isAmbiguous = false; for ( int i = 0; i < inputString.length(); i++ ) { char current = inputString.charAt(i); @@ -191,15 +207,19 @@ ambiguous.clear(); continue; } - if ( current == '}' ) { + else if ( current == '}' ) { isAmbiguous = false; - Collections.sort(ambiguous); - StringBuffer ambigBuffer = new StringBuffer(); - ambigBuffer.append(ambiguous.toArray(new Character[ambiguous.size()])); - String ambigString = ambigBuffer.toString(); - if ( pMapping.containsKey(ambigString) ) { - outputString.append(pMapping.get(ambigString)); + if ( null != mapper ) { + outputString.append(mapper.getSymbolForAmbiguousSet(ambiguous)); } + else { + Iterator<Character> charIter = ambiguous.iterator(); + outputString.append('{'); + while ( charIter.hasNext() ) { + outputString.append(charIter.next()); + } + outputString.append('}'); + } continue; } if ( isAmbiguous ) { @@ -209,7 +229,7 @@ outputString.append(current); } } - return outputString.toString(); + return outputString.toString(); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |