2 # = lib/evo/io/writer/nexus_writer.rb - NexusWriter class
4 # Copyright:: Copyright (C) 2006-2007 Christian M. Zmasek
5 # License:: GNU Lesser General Public License (LGPL)
7 # $Id: nexus_writer.rb,v 1.4 2009/11/04 01:50:59 cmzmasek Exp $
9 # last modified: 05/16/2007
11 require 'lib/evo/io/writer/msa_writer'
15 class NexusWriter < MsaWriter
17 MAX_NAME_LENGTH_DEFAULT = 10
20 @max_name_length = MAX_NAME_LENGTH_DEFAULT
24 def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
26 length = MAX_NAME_LENGTH_DEFAULT
28 @max_name_length = length
31 def clean( clean = true )
35 def write( msa, path )
36 if ( !msa.is_aligned() )
37 error_msg = "attempt to write unaligned msa in nexus format"
38 raise StandardError, error_msg, caller
41 Util.check_file_for_writability( path )
43 f = File.open( path, "a" )
45 f.print( "Begin Data;" )
46 f.print( Evoruby::Constants::LINE_DELIMITER )
47 f.print( " Dimensions NTax=" )
48 f.print( msa.get_number_of_seqs().to_s() )
50 f.print( msa.get_length().to_s() )
52 f.print( Evoruby::Constants::LINE_DELIMITER )
53 f.print( " Format DataType=Protein Interleave=No gap=-;" )
54 f.print( Evoruby::Constants::LINE_DELIMITER )
56 f.print( Evoruby::Constants::LINE_DELIMITER )
57 for i in 0 ... msa.get_number_of_seqs()
58 seq_obj = msa.get_sequence( i )
59 name = seq_obj.get_name()
60 seq = seq_obj.get_sequence_as_string()
61 name = name.gsub( /\s+$/, '')
62 name = name.gsub( /\s+/, '_')
63 name = Util.normalize_seq_name( name, @max_name_length )
68 seq = Util.clean_seq_str( seq )
71 f.print( Evoruby::Constants::LINE_DELIMITER )
74 f.print( Evoruby::Constants::LINE_DELIMITER )
76 f.print( Evoruby::Constants::LINE_DELIMITER )
80 end # class NexusWriter