inprogress
[jalview.git] / forester / ruby / evoruby / lib / evo / io / writer / nexus_writer.rb
1 #
2 # = lib/evo/io/writer/nexus_writer.rb - NexusWriter class
3 #
4 # Copyright::  Copyright (C) 2006-2007 Christian M. Zmasek
5 # License::    GNU Lesser General Public License (LGPL)
6 #
7 # $Id: nexus_writer.rb,v 1.4 2009/11/04 01:50:59 cmzmasek Exp $
8 #
9 # last modified: 05/16/2007
10
11 require 'lib/evo/io/writer/msa_writer'
12
13 module Evoruby
14
15     class NexusWriter < MsaWriter
16
17         MAX_NAME_LENGTH_DEFAULT = 10
18
19         def initialize()
20             @max_name_length     = MAX_NAME_LENGTH_DEFAULT
21             @clean               = false
22             @ex_if_name_too_long = false
23         end
24
25         def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
26             if length < 1
27                 length = MAX_NAME_LENGTH_DEFAULT
28             end
29             @max_name_length = length
30         end
31
32         def clean( clean = true )
33             @clean = clean
34         end
35
36         def set_exception_if_name_too_long( exception_if_name_too_long )
37           @ex_if_name_too_long = exception_if_name_too_long
38         end
39
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
44             end
45
46             Util.check_file_for_writability( path )
47
48             f = File.open( path, "a" )
49
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() )
54             f.print( " NChar=" )
55             f.print( msa.get_length().to_s() )
56             f.print( ";" )
57             f.print( Evoruby::Constants::LINE_DELIMITER )
58             f.print( "   Format DataType=Protein Interleave=No gap=-;" )
59             f.print( Evoruby::Constants::LINE_DELIMITER )
60             f.print( "   Matrix" )
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 )
69                 f.print( "      " )
70                 f.print( name )
71                 f.print( " " )
72                 if ( @clean )
73                     seq = Util.clean_seq_str( seq )
74                 end
75                 f.print( seq )
76                 f.print( Evoruby::Constants::LINE_DELIMITER )
77             end
78             f.print( "   ;" )
79             f.print( Evoruby::Constants::LINE_DELIMITER )
80             f.print( "End;" )
81             f.print( Evoruby::Constants::LINE_DELIMITER )
82             f.close()
83         end
84
85     end # class NexusWriter
86
87 end # module Evoruby