X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Fmsa%2FBasicMsa.java;h=4c00a30dc20dadf4d6ab840a3678fec985a74a6f;hb=db8b10baefc3e1b5fee9b8192657ecc97ca5b86d;hp=1fdef107de80aa97c7d6dd8e6d06a47334bc71b0;hpb=b1a74bd076c917d428002284a53a2c6f390226fb;p=jalview.git diff --git a/forester/java/src/org/forester/msa/BasicMsa.java b/forester/java/src/org/forester/msa/BasicMsa.java index 1fdef10..4c00a30 100644 --- a/forester/java/src/org/forester/msa/BasicMsa.java +++ b/forester/java/src/org/forester/msa/BasicMsa.java @@ -21,17 +21,20 @@ // 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.msa; import java.io.IOException; +import java.io.StringWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.forester.io.writers.SequenceWriter; +import org.forester.io.writers.SequenceWriter.SEQ_FORMAT; import org.forester.sequence.BasicSequence; import org.forester.sequence.Sequence; import org.forester.sequence.Sequence.TYPE; @@ -69,8 +72,8 @@ public class BasicMsa implements Msa { private int determineMaxIdLength() { int max = 0; - for( int row = 0; row < _data.length; ++row ) { - final int l = _identifiers[ row ].toString().length(); + for( int row = 0; row < getNumberOfSequences(); ++row ) { + final int l = getIdentifier( row ).length(); if ( l > max ) { max = l; } @@ -115,8 +118,8 @@ public class BasicMsa implements Msa { @Override public StringBuffer getSequenceAsString( final int row ) { - final StringBuffer sb = new StringBuffer( _data[ 0 ].length ); - for( int col = 0; col < _data[ 0 ].length; ++col ) { + final StringBuffer sb = new StringBuffer( getLength() ); + for( int col = 0; col < getLength(); ++col ) { sb.append( getResidueAt( row, col ) ); } return sb; @@ -139,24 +142,39 @@ public class BasicMsa implements Msa { @Override public String toString() { - final int max = determineMaxIdLength() + 1; - final StringBuffer sb = new StringBuffer(); - for( int row = 0; row < _data.length; ++row ) { - sb.append( ForesterUtil.pad( _identifiers[ row ].toString(), max, ' ', false ) ); - for( int col = 0; col < _data[ 0 ].length; ++col ) { - sb.append( getResidueAt( row, col ) ); - } - sb.append( ForesterUtil.LINE_SEPARATOR ); + final Writer w = new StringWriter(); + try { + write( w, MSA_FORMAT.PHYLIP ); + } + catch ( final IOException e ) { + e.printStackTrace(); } - return sb.toString(); + return w.toString(); } @Override - public void write( final Writer w ) throws IOException { + public void write( final Writer w, final MSA_FORMAT format ) throws IOException { + switch ( format ) { + case PHYLIP: + writeToPhylip( w ); + break; + case FASTA: + writeToFasta( w ); + break; + default: + throw new RuntimeException( "unknown format " + format ); + } + } + + private void writeToFasta( final Writer w ) throws IOException { + SequenceWriter.writeSeqs( asSequenceList(), w, SEQ_FORMAT.FASTA, 100 ); + } + + private void writeToPhylip( final Writer w ) throws IOException { final int max = determineMaxIdLength() + 1; - for( int row = 0; row < _data.length; ++row ) { - w.write( ForesterUtil.pad( _identifiers[ row ].toString(), max, ' ', false ).toString() ); - for( int col = 0; col < _data[ 0 ].length; ++col ) { + for( int row = 0; row < getNumberOfSequences(); ++row ) { + w.write( ForesterUtil.pad( getIdentifier( row ), max, ' ', false ).toString() ); + for( int col = 0; col < getLength(); ++col ) { w.write( getResidueAt( row, col ) ); } w.write( ForesterUtil.LINE_SEPARATOR ); @@ -173,10 +191,12 @@ public class BasicMsa implements Msa { for( int row = 0; row < seqs.size(); ++row ) { final Sequence seq = seqs.get( row ); if ( seq.getLength() != length ) { - throw new IllegalArgumentException( "illegal attempt to build msa from sequences of unequal length" ); + throw new IllegalArgumentException( "illegal attempt to build msa from sequences of unequal length [" + + seq.getIdentifier() + "]" ); } if ( seq.getType() != msa.getType() ) { - throw new IllegalArgumentException( "illegal attempt to build msa from sequences of different type" ); + throw new IllegalArgumentException( "illegal attempt to build msa from sequences of different type [" + + seq.getIdentifier() + "]" ); } if ( ids.contains( seq.getIdentifier() ) ) { throw new IllegalArgumentException( "illegal attempt to create msa with non-unique identifiers [" @@ -199,4 +219,9 @@ public class BasicMsa implements Msa { } return column; } + + @Override + public boolean isGapAt( final int row, final int col ) { + return getResidueAt( row, col ) == Sequence.GAP; + } }