inprogress
[jalview.git] / forester / ruby / evoruby / exe / select_same_gn.rb
1 #!/usr/local/bin/ruby -w
2
3
4 require 'lib/evo/sequence/sequence'
5 require 'lib/evo/msa/msa'
6 require 'lib/evo/msa/msa_factory'
7 require 'lib/evo/io/writer/fasta_writer'
8 require 'lib/evo/io/parser/fasta_parser'
9
10
11 module Evoruby
12
13   input = ARGV[ 0 ]
14   f = MsaFactory.new()
15
16   IGNORE_SEQS_LACKING_GN = false
17
18   msa = nil
19
20   begin
21     msa = f.create_msa_from_file( input, FastaParser.new() )
22   rescue Exception => e
23     puts "error: " + e.to_s
24     exit
25   end
26
27   all_names = Set.new
28   all_seqs_per_species = Hash.new
29   gn_to_seqs = Hash.new
30   unique_genes_msa = Msa.new
31   longest_non_unique_genes_msa = Msa.new
32   gn_re = /GN=(\S+)/
33   fragment_re = /fragment/i
34   species_re = /\[([A-Z]{3,5})\]$/
35
36   frag_counter = 0
37   no_gn_counter = 0
38   same_seq_counter = 0
39
40   for i in 0 ... msa.get_number_of_seqs()
41     seq = msa.get_sequence( i )
42     name = seq.get_name
43     if all_names.include?( name )
44       puts "error: sequence name \"" + name + "\" is not unique (#" + i.to_s + ")"
45       exit
46     else
47       all_names << name
48     end
49
50     if fragment_re.match( name )
51       puts "ignored because fragment: " + name
52       frag_counter += 1
53       next
54     end
55
56     if species_re.match( name )
57       s_match = species_re.match( name )
58       species = s_match[1]
59
60       unless all_seqs_per_species.include?( species )
61         all_seqs_per_species[ species ] = Set.new
62       end
63       all_seqs = all_seqs_per_species[ species ]
64       mol_seq = seq.get_sequence_as_string.upcase
65       if all_seqs.include?( mol_seq )
66         puts "ignored because identical sequence in same species: " + name
67         same_seq_counter += 1
68         next
69       else
70         all_seqs << mol_seq
71       end
72     else
73       puts "no species for: " + name
74     end
75
76     gn_match = gn_re.match( name )
77     if IGNORE_SEQS_LACKING_GN
78       unless gn_match
79         puts "ignored because no GN=: " + name
80         no_gn_counter += 1
81         next
82       end
83     else
84       unless gn_match
85         puts "no GN=: " + name
86       end
87     end
88
89     gn =nil
90     if gn_match
91       gn = gn_match[1]
92     else
93       if IGNORE_SEQS_LACKING_GN
94         puts "cannot be"
95         exit
96       end
97       gn = name
98     end
99
100     unless gn_to_seqs.has_key?(gn)
101       gn_to_seqs[gn] = Msa.new
102     end
103     gn_to_seqs[gn].add_sequence(seq)
104   end
105
106   puts "Sequences ignored because \"fragment\" in desc                : " + frag_counter.to_s
107   if IGNORE_SEQS_LACKING_GN
108     puts "Sequences ignored because no \"GN=\" in desc                  : " + no_gn_counter.to_s
109   end
110   puts "Sequences ignored because dentical sequence in same species : " + same_seq_counter.to_s
111   puts
112   puts
113
114   counter = 1
115   gn_to_seqs.each_pair do |gene,seqs|
116     if seqs.get_number_of_seqs > 1
117       puts counter.to_s + ": " + gene
118       puts seqs.to_fasta
119       puts
120       puts
121       counter += 1
122       longest = 0
123       longest_seq = nil
124       for j in 0 ... seqs.get_number_of_seqs()
125         current = seqs.get_sequence( j )
126         if current.get_length > longest
127           longest =  current.get_length
128           longest_seq = current
129         end
130       end
131       longest_non_unique_genes_msa.add_sequence(longest_seq)
132     else
133       unique_genes_msa.add_sequence( seqs.get_sequence( 0 ) )
134     end
135   end
136   w = FastaWriter.new
137   w.write(unique_genes_msa, "seqs_from_unique_genes.fasta")
138   w.write(longest_non_unique_genes_msa, "longest_seqs_from_nonunique_genes.fasta")
139 end