in progress
[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         end
26
27
28         def set_line_width( line_width = LINE_WIDTH_DEFAULT )
29             if ( line_width < 1 )
30                 line_width = LINE_WIDTH_DEFAULT
31             end
32             @line_width = line_width
33         end
34
35         def set_max_name_length( length = MAX_NAME_LENGTH_DEFAULT )
36             if ( length < 1 )
37                 length = MAX_NAME_LENGTH_DEFAULT
38             end
39             @max_name_length = length
40         end
41
42         def remove_gap_chars( remove_gap_chars = true )
43             @remove_gap_chars = remove_gap_chars
44         end
45
46         def clean( clean = true )
47             @clean = clean
48         end
49
50         def write( msa, path )
51             Util.check_file_for_writability( path )
52             f = File.open( path, "a" )
53             for i in 0 ... msa.get_number_of_seqs()
54                 seq_obj = msa.get_sequence( i )
55                 name = seq_obj.get_name()
56                 f.print( ">" )
57                 if ( @max_name_length != MAX_NAME_LENGTH_DEFAULT )
58                     name = Util.normalize_seq_name( name, @max_name_length )
59                 end
60                 f.print( name )
61                 counter = 0
62                 for j in 0 ... seq_obj.get_length()
63                     unless @remove_gap_chars && Util.is_aa_gap_character?( seq_obj.get_character_code( j ) )
64                         char = seq_obj.get_residue( j )
65                         if ( @clean )
66                             char = Util.clean_seq_str( char )
67                             if ( char.length < 1 )
68                                 next
69                             end
70                         end
71                         if counter % @line_width == 0
72                             f.print( Evoruby::Constants::LINE_DELIMITER )
73                         end
74                         f.print( char )
75                         counter += 1
76                     end
77                 end
78                 f.print( Evoruby::Constants::LINE_DELIMITER )
79             end
80             f.close()
81         end
82
83     end # class FastaWriter
84
85 end # module Evoruby
86