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
22 @ex_if_name_too_long = false
25 def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
27 length = MAX_NAME_LENGTH_DEFAULT
29 @max_name_length = length
32 def clean( clean = true )
36 def set_exception_if_name_too_long( exception_if_name_too_long )
37 @ex_if_name_too_long = exception_if_name_too_long
40 def write( msa, path )
41 if ( !msa.is_aligned() )
42 error_msg = "attempt to write unaligned msa in nexus format"
43 raise StandardError, error_msg, caller
46 Util.check_file_for_writability( path )
48 f = File.open( path, "a" )
50 f.print( "Begin Data;" )
51 f.print( Evoruby::Constants::LINE_DELIMITER )
52 f.print( " Dimensions NTax=" )
53 f.print( msa.get_number_of_seqs().to_s() )
55 f.print( msa.get_length().to_s() )
57 f.print( Evoruby::Constants::LINE_DELIMITER )
58 f.print( " Format DataType=Protein Interleave=No gap=-;" )
59 f.print( Evoruby::Constants::LINE_DELIMITER )
61 f.print( Evoruby::Constants::LINE_DELIMITER )
62 for i in 0 ... msa.get_number_of_seqs()
63 seq_obj = msa.get_sequence( i )
64 name = seq_obj.get_name()
65 seq = seq_obj.get_sequence_as_string()
66 name = name.gsub( /\s+$/, '')
67 name = name.gsub( /\s+/, '_')
68 name = Util.normalize_seq_name( name, @max_name_length, @ex_if_name_too_long )
73 seq = Util.clean_seq_str( seq )
76 f.print( Evoruby::Constants::LINE_DELIMITER )
79 f.print( Evoruby::Constants::LINE_DELIMITER )
81 f.print( Evoruby::Constants::LINE_DELIMITER )
85 end # class NexusWriter