inprogress
[jalview.git] / forester / ruby / evoruby / lib / evo / io / writer / fasta_writer.rb
1 #
2 # = lib/evo/io/writer/fasta_writer.rb - FastaWriter class
3 #
4 # Copyright::  Copyright (C) 2006-2007 Christian M. Zmasek
5 # License::    GNU Lesser General Public License (LGPL)
6 #
7 # $Id: fasta_writer.rb,v 1.6 2008/09/12 23:52:11 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 FastaWriter < MsaWriter
16
17         LINE_WIDTH_DEFAULT      = 60
18         MAX_NAME_LENGTH_DEFAULT = 0
19
20         def initialize()
21             @line_width          = LINE_WIDTH_DEFAULT
22             @max_name_length     = MAX_NAME_LENGTH_DEFAULT
23             @remove_gap_chars    = false
24             @clean               = false
25             @ex_if_name_too_long = false
26         end
27
28
29         def set_line_width( line_width = LINE_WIDTH_DEFAULT )
30             if ( line_width < 1 )
31                 line_width = LINE_WIDTH_DEFAULT
32             end
33             @line_width = line_width
34         end
35
36         def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
37             if ( length < 1 )
38                 length = MAX_NAME_LENGTH_DEFAULT
39             end
40             @max_name_length = length
41         end
42
43         def remove_gap_chars( remove_gap_chars = true )
44             @remove_gap_chars = remove_gap_chars
45         end
46
47         def clean( clean = true )
48             @clean = clean
49         end
50
51         def set_exception_if_name_too_long( exception_if_name_too_long )
52           @ex_if_name_too_long = exception_if_name_too_long
53         end
54
55         def write( msa, path )
56             Util.check_file_for_writability( path )
57             f = File.open( path, "a" )
58             for i in 0 ... msa.get_number_of_seqs()
59                 seq_obj = msa.get_sequence( i )
60                 name = seq_obj.get_name()
61                 f.print( ">" )
62                 if ( @max_name_length != MAX_NAME_LENGTH_DEFAULT )
63                     name = Util.normalize_seq_name( name, @max_name_length, @ex_if_name_too_long )
64                 end
65                 f.print( name )
66                 counter = 0
67                 for j in 0 ... seq_obj.get_length()
68                     unless @remove_gap_chars && Util.is_aa_gap_character?( seq_obj.get_character_code( j ) )
69                         char = seq_obj.get_residue( j )
70                         if ( @clean )
71                             char = Util.clean_seq_str( char )
72                             if ( char.length < 1 )
73                                 next
74                             end
75                         end
76                         if counter % @line_width == 0
77                             f.print( Evoruby::Constants::LINE_DELIMITER )
78                         end
79                         f.print( char )
80                         counter += 1
81                     end
82                 end
83                 f.print( Evoruby::Constants::LINE_DELIMITER )
84             end
85             f.close()
86         end
87
88     end # class FastaWriter
89
90 end # module Evoruby
91