require 'inline'
require 'maasha/fasta'
+require 'maasha/align'
BYTES_IN_INT = 4
BYTES_IN_FLOAT = 4
@result_count = 0
@q_ids = []
@s_ids = []
+ @q_entries = []
+ @s_entries = []
end
# Method to load sequences from a query file in FASTA format
Fasta.open(file, 'r') do |ios|
ios.each do |entry|
- @q_ids << entry.seq_name if @opt_hash[:query_ids]
+ @q_ids << entry.seq_name if @opt_hash[:query_ids]
+ @q_entries << entry if @opt_hash[:precise]
oligos = str_to_oligo_rb_ary_c(entry.seq, @opt_hash[:kmer], 1).uniq.sort
Fasta.open(file, 'r') do |ios|
ios.each_with_index do |entry, s_index|
- @s_ids << entry.seq_name if @opt_hash[:subject_ids]
+ @s_ids << entry.seq_name if @opt_hash[:subject_ids]
+ @s_entries << entry if @opt_hash[:precise]
zero_ary_c(oligo_ary, (4 ** @opt_hash[:kmer]) * BYTES_IN_INT)
zero_ary_c(shared_ary, @q_size * BYTES_IN_INT)
q_id = @opt_hash[:query_ids] ? @q_ids[q_index] : q_index
s_id = @opt_hash[:subject_ids] ? @s_ids[s_index] : s_index
+ if @opt_hash[:precise]
+ new_score = Align.muscle([@q_entries[q_index], @s_entries[s_index]]).identity
+ score = new_score if new_score > score
+ end
+
yield Hit.new(q_id, s_id, score)
end