in progress
[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         end
23
24         def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
25             if length < 1
26                 length = MAX_NAME_LENGTH_DEFAULT
27             end
28             @max_name_length = length
29         end
30
31         def clean( clean = true )
32             @clean = clean
33         end
34
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
39             end
40
41             Util.check_file_for_writability( path )
42
43             f = File.open( path, "a" )
44
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() )
49             f.print( " NChar=" )
50             f.print( msa.get_length().to_s() )
51             f.print( ";" )
52             f.print( Evoruby::Constants::LINE_DELIMITER )
53             f.print( "   Format DataType=Protein Interleave=No gap=-;" )
54             f.print( Evoruby::Constants::LINE_DELIMITER )
55             f.print( "   Matrix" )
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 )
64                 f.print( "      " )
65                 f.print( name )
66                 f.print( " " )
67                 if ( @clean )
68                     seq = Util.clean_seq_str( seq )
69                 end
70                 f.print( seq )
71                 f.print( Evoruby::Constants::LINE_DELIMITER )
72             end
73             f.print( "   ;" )
74             f.print( Evoruby::Constants::LINE_DELIMITER )
75             f.print( "End;" )
76             f.print( Evoruby::Constants::LINE_DELIMITER )
77             f.close()
78         end
79
80     end # class NexusWriter
81
82 end # module Evoruby