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
39   for i in 0 ... msa.get_number_of_seqs()
40     seq = msa.get_sequence( i )
41     name = seq.get_name
42     if all_names.include?( name )
43       puts "error: sequence name \"" + name + "\" is not unique (#" + i.to_s + ")"
44       exit
45     else
46       all_names << name
47     end
48     #mol_seq = seq.get_sequence_as_string.upcase
49     #if all_seqs.include?( mol_seq )
50     #  puts "error: sequence of \"" + name + "\" is not unique (#" + i.to_s + ")"
51     #  exit
52     #else
53     #  all_seqs << mol_seq
54     #end
55
56     
57     
58     if fragment_re.match( name )
59       puts "ignored because fragment: " + name
60       frag_counter += 1
61       next
62     end
63     
64     species = nil
65     if species_re.match( name )
66       species = species_re[1]
67       puts species
68     else 
69        puts "no species for: " + name
70        exit
71     end
72
73     gn_match = gn_re.match( name )
74     if IGNORE_SEQS_LACKING_GN
75       unless gn_match
76         puts "ignored because no GN=: " + name
77         no_gn_counter += 1
78         next
79       end
80     else
81       unless gn_match
82         puts "no GN=: " + name
83       end
84     end
85
86     gn =nil
87     if gn_match
88       gn = gn_match[1]
89     else
90       if IGNORE_SEQS_LACKING_GN
91         puts "cannot be"
92         exit
93       end
94       gn = name
95     end
96
97     unless gn_to_seqs.has_key?(gn)
98       gn_to_seqs[gn] = Msa.new
99     end
100     gn_to_seqs[gn].add_sequence(seq)
101   end
102
103   puts "Sequences ignored because \"fragment\" in desc: " + frag_counter.to_s
104   puts "Sequences ignored because no \"GN=\" in desc  : " + no_gn_counter.to_s
105   puts
106   puts
107
108   counter = 1
109   gn_to_seqs.each_pair do |gene,seqs|
110     if seqs.get_number_of_seqs > 1
111       puts counter.to_s + ": " + gene
112       puts seqs.to_fasta
113       puts
114       puts
115       counter += 1
116       longest = 0
117       longest_seq = nil
118       for j in 0 ... seqs.get_number_of_seqs()
119         current = seqs.get_sequence( j )
120         if current.get_length > longest
121           longest =  current.get_length
122           longest_seq = current
123         end
124       end
125       longest_non_unique_genes_msa.add_sequence(longest_seq)
126     else
127       unique_genes_msa.add_sequence( seqs.get_sequence( 0 ) )
128     end
129   end
130   w = FastaWriter.new
131   w.write(unique_genes_msa, "seqs_from_unique_genes.fasta")
132   w.write(longest_non_unique_genes_msa, "longest_seqs_from_nonunique_genes.fasta")
133 end