Class: ExonerateResult

Inherits:
Object
  • Object
show all
Defined in:
lib/gene_assembler/exonerate_result.rb

Overview

Extracts results from blast table’s file and uses it to create instances of “BlastQuery” and “BlastHit”

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input, all) ⇒ ExonerateResult

Parser initialization



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/gene_assembler/exonerate_result.rb', line 39

def initialize(input,all)
  @querys = []

  if input.is_a?(Array)
  	input.each do |file|
    	fich = File.open(file,'r')
    	lines = fich.readlines
    	fich.close
    	parse_file(lines,all)
   	end
  else
    fich = File.open(input,'r')
    lines = fich.readlines
    fich.close
    parse_file(lines,all)
  end
  query_name=''
  
end

Instance Attribute Details

#querysObject

Returns the value of attribute querys.



229
230
231
# File 'lib/gene_assembler/exonerate_result.rb', line 229

def querys
  @querys
end

Instance Method Details

#convert_parsed_lines(lines_parsed) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/gene_assembler/exonerate_result.rb', line 86

def convert_parsed_lines(lines_parsed)
  lines_parsed.each do |line|
    align_data=nil
    features=nil
    if lines_parsed.class.to_s=='Array'
      align_data=line['align_data']
      features=line
    else #hash
      align_data=line[1]['align_data']
      features=line[1]        
    end
    tags=[]
    elm=[]
    align_data_len=align_data.length-1
    align_data.each_with_index do |field,c|
      mod=c.modulo(3)
      if mod==0 #tag operation      
        if c>0
          tags << elm
        end
        elm=[] #array q inicia segunda dimension en el array principal
        elm << field
      elsif mod==1 # Coordenada relativa del query
        elm << field.to_i
      elsif mod==2 # Coordenada relativa del target
        elm << field.to_i
      end
      if align_data_len==c #Guardar ultima operacion x fin de parseo
        tags << elm
      end           
    end
    hiting(features,tags)
  end    
end

#empty?Boolean

check if there are querys

Returns:

  • (Boolean)


219
220
221
222
# File 'lib/gene_assembler/exonerate_result.rb', line 219

def empty?

  return @querys.empty?
end

#find_query(querys, name_q) ⇒ Object

find query by name



207
208
209
210
211
212
213
214
215
216
# File 'lib/gene_assembler/exonerate_result.rb', line 207

def find_query(querys,name_q)
  #  newq = querys.find{|q| ( q.find{|h| (h.subject_id)})}
  new_q=nil

  if !querys.empty?
    new_q=querys.find{|q| (q.query_id==name_q)}
  end

  return new_q
end

#hiting(features, tags) ⇒ Object

Convierte las coordenadas relativas del exonerate a absolutas tipo blast, definiendo solo los hits



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/gene_assembler/exonerate_result.rb', line 121

def hiting(features,tags) #Convierte las coordenadas relativas del exonerate a absolutas tipo blast, definiendo solo los hits		
 	query=ExoBlastQuery.new(features['target_id'])
	#Variables para hit
	if features['target_strand']=='+'
		reversed=FALSE
		strand=1
	else 
		reversed=TRUE 
		strand=-1
	end
	#------------------
	start_target=features['target_start_align'].to_i#paso de coord 0 a 1
	ends_target=0
	start_query=features['query_start_align'].to_i
	ends_query=0
	tag_len=tags.length-1
	counter_target=start_target
	counter_query=start_query
	add=TRUE #Hay casos q hay q realizar la adicion de coordenadas relativas antes de la operacion de guardado, esta varible se define para impedir la suma al final de la iteracion
	tags.each_with_index do |tag,c|
		if c==tag_len||tag[0]=='S'||tag[0]=='G'
			counter_query+=tag[1]
			counter_target+=(tag[2]*strand)
			add=FALSE
		else
			if tag[0]=='F'
				query.s_frameshift << counter_query 
				query.q_frameshift << counter_target
			end
			add=TRUE
		end
		if tag[0]=='5'||c==tag_len #Comienzo de intron o final de secuencia
			ends_target=counter_target
			ends_query=counter_query 
			
			# creates the hit
			hit = BlastHit.new(start_target+1, ends_target, start_query+1, ends_query) 
			hit.align_len=(ends_target-start_target)*strand
			hit.ident=0

			hit.gaps=0
			hit.mismatches=0
			hit.e_val=0
			hit.bit_score=0

			hit.score = features['score'].to_i
			if reversed
				hit.q_frame = -1
			else
				hit.q_frame =1
			end
			hit.s_frame = nil
			
			hit.reversed=reversed
			hit.subject_id = features['query_id']
			hit.full_subject_length=0
			hit.definition=features['query_id']
			hit.acc=features['query_id']
			hit.q_seq=''
			hit.s_seq=''
			#puts "#{features['target_id']}\t#{hit.inspect}"
			query.add_hit(hit)
		end
		if add
			counter_query+=tag[1]
			counter_target+=tag[2]*strand
		end
		
		if tag[0]=='3' # Final de intron x lo tanto comienzo de exon
			start_query=counter_query
			start_target=counter_target
		end
	end#end do
	@querys << query
end

#inspectObject

inspect results



198
199
200
201
202
203
204
# File 'lib/gene_assembler/exonerate_result.rb', line 198

def inspect
  res = "Exonerate results:\n"
  res+= '-'*20
  res+= "\nQuerys: #{@querys.count}\n"
  @querys.each{|q| res+=q.inspect+"\n"}
  return res
end

#parse_file(lines, all) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/gene_assembler/exonerate_result.rb', line 59

def parse_file(lines,all)
  lines_parsed=nil
  if !all
    lines_parsed={}
  else
    lines_parsed=[]
  end
  lines.each do |line|
	if line=~ /^vulgar:/
		fields=line.split
		features={'query_id'=> fields[1], 'query_start_align'=> fields[2], 'query_end_align'=> fields[3], 'query_strand'=> fields[4],'target_id'=> fields[5], 'target_start_align'=> fields[6], 'target_end_align'=> fields[7], 'target_strand'=> fields[8], 'score'=> fields[9], 'align_data'=> fields[10..fields.length]}
		if all
		  lines_parsed << features
		else
		  if !lines_parsed.key?(features['target_id']) # Añadir valor si no existe
		    lines_parsed[features['target_id']]=features
		  else
		    if features['score']>lines_parsed[features['target_id']]['score'] # Si ya existe una query, ver si la nueva presenta un mayor score y reemplazar la antigua
		      lines_parsed[features['target_id']]=features
		    end
		  end
		end
	end
end		
convert_parsed_lines(lines_parsed)	
end

#sizeObject

get query count



225
226
227
# File 'lib/gene_assembler/exonerate_result.rb', line 225

def size
  @querys.size
end