Module: ChimericSeqs

Defined in:
lib/full_lengther_next/classes/chimeric_seqs.rb

Instance Method Summary collapse

Instance Method Details

#search_chimeras(seq, blast_query, options, db_name) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/full_lengther_next/classes/chimeric_seqs.rb', line 6

def search_chimeras(seq, blast_query, options, db_name)
	
	# used to detect if the sequence and the blast are from different query
	if (seq.seq_name != blast_query.query_def)
		puts "#{seq.seq_name} --> #{blast_query.query_def}"
		raise "BLAST query name and sequence are different"
	end
	
	q=blast_query
	# puts "#{q.query_def}"
	
	ref_hit_beg = q.hits[0].q_beg
	ref_hit_end = q.hits[0].q_end

	q.hits.each do |hit|
		# puts "---------#{hit.acc}"
		# if overlaps or is contained in the ref hit
		if ((ref_hit_beg <= hit.q_beg) && (ref_hit_end > hit.q_beg)) || ((hit.q_beg <= ref_hit_beg) && (hit.q_end > ref_hit_beg))
			# puts "hits overlapping: ref_hit #{ref_hit_beg}-#{ref_hit_end}, current hit #{hit.q_beg}-#{hit.q_end}"
			ref_hit_beg = [ref_hit_beg,hit.q_beg].min
			ref_hit_end = [ref_hit_end,hit.q_end].max
			# puts "modified ref_hit #{ref_hit_beg}-#{ref_hit_end}"
		end
	end
	q.hits.each do |hit|
		if ((ref_hit_beg <= hit.q_beg) && (ref_hit_end > hit.q_beg)) || ((hit.q_beg <= ref_hit_beg) && (hit.q_end > ref_hit_beg))
		else
			if (hit.acc != q.hits[0].acc)
				# puts "\nreference: #{ref_hit_beg} - #{ref_hit_end}"
				# puts "hit 0: #{q.hits[0].q_beg} - #{q.hits[0].q_end}"
				# puts "current: #{hit.q_beg} - #{hit.q_end}"
				# puts "putative chimeric seq: \n#{q.hits[0].definition}\n#{hit.definition}\n------------------------------------------"
				
				chimera_annotations = "\n#{q.query_def}\t#{seq.fasta_length}\t#{q.hits[0].acc}\t#{db_name}\tPutative chimera\t\t#{q.hits[0].e_val}\t#{q.hits[0].ident}\t\t\tPutative chimera detected showing similarity with two different genes #{q.hits[0].acc} - #{hit.acc}\t#{q.hits[0].q_frame}\t#{q.hits[0].q_beg}\t#{q.hits[0].q_end}\t#{q.hits[0].s_beg.to_i}\t#{q.hits[0].s_end.to_i}\t#{q.hits[0].definition}\t\n#{q.query_def}\t#{seq.fasta_length}\t#{hit.acc}\t#{db_name}\tPutative chimera\t\t#{hit.e_val}\t#{hit.ident}\t\t\tPutative chimera detected showing similarity with two different genes #{q.hits[0].acc} - #{hit.acc}\t#{hit.q_frame}\t#{hit.q_beg}\t#{hit.q_end}\t#{hit.s_beg.to_i}\t#{hit.s_end.to_i}\t#{hit.definition}\t"
				seq.annotate(:chimera,chimera_annotations,false)
			end
			
			return
		end
	end
	
end

#select_best_blast(tmp_blast_obj, new_seqs) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/full_lengther_next/classes/chimeric_seqs.rb', line 49

def select_best_blast(tmp_blast_obj, new_seqs)
	
	my_seqs ={}
	
	new_seqs.each do |seq|
		my_seqs[seq.seq_name] = true
	end
	
	reverse_counter = (tmp_blast_obj.querys.length - 1)
	
	tmp_blast_obj.querys.reverse_each do |query|
		if (!my_seqs[query.query_def]) # los marcados como quimeras se eliminan para no utilizarse posteriormente
			# tmp_blast_obj.querys[reverse_counter].delete
			tmp_blast_obj.querys.delete_at(reverse_counter)
		else
			reverse_hit_counter = (query.hits.length - 1)
			query.hits.reverse_each do |hit|
				if (hit.acc != query.hits[0].acc)
					tmp_blast_obj.querys[reverse_counter].hits.delete_at(reverse_hit_counter)
				end
				reverse_hit_counter -= 1
			end
		end
		reverse_counter -= 1
	end
	
	return tmp_blast_obj
end