seqtrimnext 2.0.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/History.txt +3 -0
  2. data/Manifest.txt +114 -0
  3. data/PostInstall.txt +7 -0
  4. data/README.rdoc +159 -0
  5. data/Rakefile +38 -0
  6. data/bin/create_graphs.rb +46 -0
  7. data/bin/extract_seqs.rb +45 -0
  8. data/bin/extract_seqs_from_fasta.rb +56 -0
  9. data/bin/extract_seqs_from_fastq.rb +45 -0
  10. data/bin/fasta2fastq.rb +38 -0
  11. data/bin/fastq2fasta.rb +35 -0
  12. data/bin/gen_qual.rb +46 -0
  13. data/bin/get_seq.rb +46 -0
  14. data/bin/group_by_range.rb +17 -0
  15. data/bin/join_ilumina_paired.rb +130 -0
  16. data/bin/parse_amplicons.rb +95 -0
  17. data/bin/parse_json_results.rb +66 -0
  18. data/bin/parse_params.rb +82 -0
  19. data/bin/resume_clusters.rb +48 -0
  20. data/bin/resume_rejected.sh +9 -0
  21. data/bin/reverse_paired.rb +49 -0
  22. data/bin/seqtrimnext +368 -0
  23. data/bin/split_fastq.rb +42 -0
  24. data/bin/split_ilumina_paired.rb +65 -0
  25. data/bin/split_paired.rb +70 -0
  26. data/lib/seqtrimnext/actions/action_ab_adapter.rb +32 -0
  27. data/lib/seqtrimnext/actions/action_ab_far_adapter.rb +32 -0
  28. data/lib/seqtrimnext/actions/action_ab_left_adapter.rb +32 -0
  29. data/lib/seqtrimnext/actions/action_empty_insert.rb +22 -0
  30. data/lib/seqtrimnext/actions/action_ignore_repeated.rb +24 -0
  31. data/lib/seqtrimnext/actions/action_indetermination.rb +30 -0
  32. data/lib/seqtrimnext/actions/action_induced_low_complexity.rb +29 -0
  33. data/lib/seqtrimnext/actions/action_insert.rb +32 -0
  34. data/lib/seqtrimnext/actions/action_is_contaminated.rb +30 -0
  35. data/lib/seqtrimnext/actions/action_key.rb +30 -0
  36. data/lib/seqtrimnext/actions/action_left_adapter.rb +32 -0
  37. data/lib/seqtrimnext/actions/action_left_primer.rb +17 -0
  38. data/lib/seqtrimnext/actions/action_linker.rb +30 -0
  39. data/lib/seqtrimnext/actions/action_low_complexity.rb +30 -0
  40. data/lib/seqtrimnext/actions/action_low_high_size.rb +31 -0
  41. data/lib/seqtrimnext/actions/action_low_quality.rb +33 -0
  42. data/lib/seqtrimnext/actions/action_mid.rb +30 -0
  43. data/lib/seqtrimnext/actions/action_multiple_linker.rb +29 -0
  44. data/lib/seqtrimnext/actions/action_paired_reads.rb +28 -0
  45. data/lib/seqtrimnext/actions/action_poly_a.rb +29 -0
  46. data/lib/seqtrimnext/actions/action_poly_t.rb +29 -0
  47. data/lib/seqtrimnext/actions/action_rem_adit_artifacts.rb +32 -0
  48. data/lib/seqtrimnext/actions/action_right_adapter.rb +29 -0
  49. data/lib/seqtrimnext/actions/action_right_primer.rb +25 -0
  50. data/lib/seqtrimnext/actions/action_short_insert.rb +32 -0
  51. data/lib/seqtrimnext/actions/action_unexpected_poly_t.rb +29 -0
  52. data/lib/seqtrimnext/actions/action_unexpected_vector.rb +31 -0
  53. data/lib/seqtrimnext/actions/action_vectors.rb +31 -0
  54. data/lib/seqtrimnext/actions/seqtrim_action.rb +136 -0
  55. data/lib/seqtrimnext/classes/action_manager.rb +47 -0
  56. data/lib/seqtrimnext/classes/em_classes/seqtrim_work_manager.rb +335 -0
  57. data/lib/seqtrimnext/classes/em_classes/seqtrim_worker.rb +290 -0
  58. data/lib/seqtrimnext/classes/extract_stats.rb +255 -0
  59. data/lib/seqtrimnext/classes/gnu_plot_graph.rb +140 -0
  60. data/lib/seqtrimnext/classes/graph_stats.rb +74 -0
  61. data/lib/seqtrimnext/classes/install_database.rb +43 -0
  62. data/lib/seqtrimnext/classes/install_requirements.rb +123 -0
  63. data/lib/seqtrimnext/classes/list_db.rb +49 -0
  64. data/lib/seqtrimnext/classes/make_blast_db.rb +113 -0
  65. data/lib/seqtrimnext/classes/one_blast.rb +41 -0
  66. data/lib/seqtrimnext/classes/params.rb +387 -0
  67. data/lib/seqtrimnext/classes/piro.rb +78 -0
  68. data/lib/seqtrimnext/classes/plugin_manager.rb +153 -0
  69. data/lib/seqtrimnext/classes/scan_for_restr_site.rb +138 -0
  70. data/lib/seqtrimnext/classes/scbi_stats.rb +68 -0
  71. data/lib/seqtrimnext/classes/seqtrim.rb +317 -0
  72. data/lib/seqtrimnext/classes/sequence.rb +55 -0
  73. data/lib/seqtrimnext/classes/sequence_group.rb +72 -0
  74. data/lib/seqtrimnext/classes/sequence_with_action.rb +503 -0
  75. data/lib/seqtrimnext/plugins/plugin.rb +267 -0
  76. data/lib/seqtrimnext/plugins/plugin_ab_adapters.rb +189 -0
  77. data/lib/seqtrimnext/plugins/plugin_adapters.rb +165 -0
  78. data/lib/seqtrimnext/plugins/plugin_amplicons.rb +221 -0
  79. data/lib/seqtrimnext/plugins/plugin_contaminants.rb +209 -0
  80. data/lib/seqtrimnext/plugins/plugin_extract_inserts.rb +438 -0
  81. data/lib/seqtrimnext/plugins/plugin_find_poly_at.rb +393 -0
  82. data/lib/seqtrimnext/plugins/plugin_ignore_repeated.rb +101 -0
  83. data/lib/seqtrimnext/plugins/plugin_indeterminations.rb +199 -0
  84. data/lib/seqtrimnext/plugins/plugin_key.rb +70 -0
  85. data/lib/seqtrimnext/plugins/plugin_linker.rb +232 -0
  86. data/lib/seqtrimnext/plugins/plugin_low_complexity.rb +98 -0
  87. data/lib/seqtrimnext/plugins/plugin_low_high_size.rb +74 -0
  88. data/lib/seqtrimnext/plugins/plugin_low_quality.rb +394 -0
  89. data/lib/seqtrimnext/plugins/plugin_mids.rb +231 -0
  90. data/lib/seqtrimnext/plugins/plugin_rem_adit_artifacts.rb +246 -0
  91. data/lib/seqtrimnext/plugins/plugin_short_insert.rb +244 -0
  92. data/lib/seqtrimnext/plugins/plugin_vectors.rb +191 -0
  93. data/lib/seqtrimnext/templates/amplicons.txt +16 -0
  94. data/lib/seqtrimnext/templates/genomics_454.txt +5 -0
  95. data/lib/seqtrimnext/templates/genomics_454_with_paired.txt +5 -0
  96. data/lib/seqtrimnext/templates/low_quality.txt +5 -0
  97. data/lib/seqtrimnext/templates/low_quality_and_low_complexity.txt +5 -0
  98. data/lib/seqtrimnext/templates/transcriptomics_454.txt +8 -0
  99. data/lib/seqtrimnext/templates/transcriptomics_plants.txt +8 -0
  100. data/lib/seqtrimnext/utils/extract_samples.rb +52 -0
  101. data/lib/seqtrimnext/utils/fasta2xml.rb +69 -0
  102. data/lib/seqtrimnext/utils/global_match.rb +65 -0
  103. data/lib/seqtrimnext/utils/hash_stats.rb +29 -0
  104. data/lib/seqtrimnext/utils/json_utils.rb +50 -0
  105. data/lib/seqtrimnext/utils/load_fasta_names_in_hash.rb +37 -0
  106. data/lib/seqtrimnext/utils/load_qual_in_hash.rb +37 -0
  107. data/lib/seqtrimnext/utils/recover_mid.rb +95 -0
  108. data/lib/seqtrimnext/utils/string_utils.rb +56 -0
  109. data/lib/seqtrimnext.rb +37 -0
  110. data/script/console +10 -0
  111. data/script/destroy +14 -0
  112. data/script/generate +14 -0
  113. data/test/test_helper.rb +3 -0
  114. data/test/test_seqtrimnext.rb +11 -0
  115. metadata +318 -0
@@ -0,0 +1,503 @@
1
+
2
+ require "action_manager.rb"
3
+ require "sequence"
4
+ require 'term/ansicolor'
5
+ include Term::ANSIColor
6
+
7
+ ######################################
8
+ # Author:: Almudena Bocinos Rioboo
9
+ # This class create the structure to storage the actions associated to a sequence.
10
+ # It allows to add action, and to write at file the actions for every sequence
11
+ # Inherit:: Sequence
12
+ ######################################
13
+
14
+ class SequenceWithAction < Sequence
15
+ SHOW_QUAL = false
16
+ SHOW_FINAL_INSERTS=true
17
+ attr_accessor :actions,:seq_fasta_orig, :seq_qual_orig ,:insert_start , :insert_end, :stats , :insert_start_last , :insert_end_last
18
+
19
+ # Creates an instance with the structure to storage the actions associated to a sequence
20
+ def initialize(seq_name,seq_fasta,seq_qual, seq_comment = '')
21
+ super
22
+ #Tried
23
+ #if @ns_present then $LOG.debug "The sequence #{seq_name} has N's" else $LOG.debug "The sequence #{seq_name} hasn't N's" end
24
+ #if @xs_present then $LOG.debug "The sequence #{seq_name} has X's" else $LOG.debug "The sequence #{seq_name} hasn't X's" end
25
+ @actions = []
26
+ @seq_fasta_orig = seq_fasta
27
+ @seq_fasta = seq_fasta
28
+
29
+ @seq_qual_orig = seq_qual
30
+ @seq_qual = seq_qual
31
+
32
+ @insert_start = 0
33
+ @insert_end = seq_fasta.length-1
34
+
35
+
36
+ #@seq_qual = seq_qual
37
+
38
+ @stats={}
39
+
40
+ @file_tags=[]
41
+
42
+ end
43
+
44
+ # add a file tag to sequence
45
+ def add_file_tag(tag_level, tag_value, tag_type)
46
+ @file_tags<< {:level => tag_level, :name => tag_value, :type=> tag_type}
47
+ end
48
+
49
+ # join file tags into a path
50
+ def get_file_tag_path
51
+ levels=@file_tags.map{|e| e[:level]}.uniq
52
+
53
+ dirpath = []
54
+ levels.sort.each do |level|
55
+ # select names from all that are not files
56
+ level_path = @file_tags.select{|e| ((e[:level]==level) && (e[:type]!=:file))}.map{|tag| tag[:name]}
57
+ dirpath << level_path.join('_') if !level_path.empty?
58
+ end
59
+
60
+ filepath = []
61
+ levels.sort.each do |level|
62
+ # select names from all that are not files
63
+ level_path = @file_tags.select{|e| ((e[:level]==level) && (e[:type]!=:dir))}.map{|tag| tag[:name]}
64
+ filepath << level_path.join('_') if !level_path.empty?
65
+ end
66
+
67
+
68
+ filename=filepath.join('_')
69
+ dirname=File.join(dirpath)
70
+
71
+
72
+ # puts "#{dirname}, #{filename}"
73
+
74
+ return [dirname,filename]
75
+
76
+ end
77
+
78
+ # Adds a new action to the sequence
79
+ def add_action(a)
80
+ $LOG.info("Adding action #{a.type} to #{seq_name}")
81
+
82
+ @actions.push a
83
+
84
+ a.apply_to(self)
85
+
86
+ return a
87
+
88
+ end
89
+
90
+ # Adds a new action to the sequence
91
+ def new_action(start_pos,end_pos,action_type)
92
+
93
+ a = ActionManager.new_action(start_pos,end_pos,action_type)
94
+
95
+ return a
96
+
97
+ end
98
+
99
+
100
+ # def left_action(seq_fasta,start_pos,end_pos)
101
+ # return ((start_pos - 0 ) < (seq_fasta.length - end_pos))
102
+ # end
103
+ #
104
+ # def right_action(seq_fasta,start_pos,end_pos)
105
+ # return !left_action(seq_fasta,start_pos,end_pos)
106
+ # end
107
+
108
+ # Adds a set of actions to the sequence, update the positon of the cut sequence. #
109
+ # Version with the parameters left_action and rigth action #
110
+
111
+ # TODO - Nuevo algoritmo de corte de seqs.
112
+ # 1 - Ordenar seqs con cut=true en izq y der y por posición de ends o begs
113
+ # 2 - Obtener izq.ends.max y der.begs.min
114
+ # 3 - El corte lo definen esos min y max
115
+
116
+ def add_actions(actions)
117
+
118
+ if !actions.empty?
119
+ start_pos=0
120
+ end_pos = 0
121
+ cut = false
122
+
123
+ max_end_pos = 0
124
+
125
+
126
+
127
+ p_beg = @insert_start
128
+ p_end = @seq_fasta.length-1+@insert_start
129
+ # p_end = @seq_fasta.length-1
130
+ # puts "ADDING ACTIONS"
131
+ # puts "=" * 50
132
+ # puts 'actions ' + actions.inspect
133
+ # para cada accion ordenada por start_pos
134
+ actions.sort{|e,f| e.start_pos<=>f.start_pos}.each do |action|
135
+ # puts ' current ' + action.inspect
136
+ # puts " UUUUUUUUUU1 "
137
+ # puts "vect in pos #{action.start_pos} #{action.end_pos}" if (action.type=='ActionVectors')
138
+ # puts " UUUUUUUUUU2 "
139
+
140
+ # puts "ADD ACTION:",action.to_json
141
+
142
+ # añadir el inicio del inserto si es necesario
143
+ if action.start_pos !=0 or action.end_pos != 0
144
+ action.start_pos+=@insert_start
145
+ action.end_pos+=@insert_start
146
+ end
147
+
148
+ # guardar accion
149
+ a = add_action(action)
150
+
151
+ start_pos= a.start_pos
152
+ end_pos=a.end_pos
153
+
154
+
155
+ # si hay que cortar y es accion izquierda
156
+ # if (a.cut && ( left_action(@seq_fasta,start_pos-p_beg,end_pos) || # action is left in insert
157
+ if (a.cut && a.left_action?(@seq_fasta.length))
158
+ # if (a.cut && ( a.left_action==true ||
159
+ # ( a.right_action==false && (left_action(@seq_fasta,start_pos-p_beg,end_pos-p_beg) || # action is left in insert
160
+ # (start_pos==p_beg)) ))) # action is right in insert but it's continous to the before action
161
+ #
162
+ # puts "in seq w action left act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
163
+ # puts "Cut left: #{a.inspect}"
164
+ if (end_pos+1) > p_beg
165
+ p_beg=end_pos+1
166
+ end
167
+ a.left_action=true
168
+ cut=true
169
+ # puts "in seq w action left act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
170
+
171
+ # elsif (a.cut && right_action(@seq_fasta,start_pos-p_beg,end_pos)) # action is rigth in insert
172
+ elsif (a.cut && a.right_action?(@seq_fasta.length))
173
+ # puts "Cut right: #{a.inspect}"
174
+ # elsif (a.cut && (a.right_action==true || right_action(@seq_fasta,start_pos-p_beg,end_pos-p_beg))) # action is rigth in insert
175
+ # puts "in seq w action right act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
176
+ if (start_pos-1) < p_end
177
+ p_end = start_pos-1
178
+ end
179
+ a.right_action=true
180
+ cut=true
181
+ # puts "in seq w action right act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
182
+ elsif !a.cut
183
+ # puts "NO cut action"
184
+ if a.right_action?(@seq_fasta.length)
185
+ a.right_action=true
186
+ else
187
+ a.left_action = true
188
+ end
189
+
190
+ end
191
+
192
+ # puts "p_beg: #{p_beg} , p_end: #{p_end}"
193
+
194
+ end
195
+
196
+
197
+ if cut then
198
+
199
+ @seq_fasta = @seq_fasta_orig[p_beg..p_end]
200
+ # puts @seq_fasta
201
+ @seq_qual = @seq_qual_orig[p_beg..p_end] if !@seq_qual_orig.nil?
202
+
203
+ # puts "in seq w action1 #{@insert_start} #{@insert_end}"
204
+ @insert_start = p_beg
205
+ size_cut_right = @insert_end - p_end
206
+ @insert_end -= size_cut_right
207
+ # puts "in seq w action2 #{@insert_start} #{@insert_end}"
208
+
209
+
210
+ end
211
+ end
212
+ end
213
+
214
+
215
+ # Adds a set of actions to the sequence, update the positon of the cut sequence. #
216
+ # Version without the parameters left_action and rigth action #
217
+
218
+ def add_actions_no_left_rigth_parameters(actions)
219
+
220
+ if !actions.empty?
221
+ start_pos=0
222
+ end_pos = 0
223
+ cut = false
224
+
225
+ max_end_pos = 0
226
+
227
+
228
+
229
+ p_beg = @insert_start
230
+ p_end = @seq_fasta.length-1+@insert_start
231
+ # p_end = @seq_fasta.length-1
232
+
233
+ # puts 'actions ' + actions.inspect
234
+ # para cada accion ordenada por start_pos
235
+ actions.sort!{|e,f| e.start_pos<=>f.start_pos}.each do |action|
236
+ # puts ' current ' + action.inspect
237
+ # puts " UUUUUUUUUU1 "
238
+ # puts "vect in pos #{action.start_pos} #{action.end_pos}" if (action.type=='ActionVectors')
239
+ # puts " UUUUUUUUUU2 "
240
+
241
+ # puts "ADD ACTION:",action.to_json
242
+
243
+ # añadir el inicio del inserto si es necesario
244
+ if action.start_pos !=0 or action.end_pos != 0
245
+ action.start_pos+=@insert_start
246
+ action.end_pos+=@insert_start
247
+ end
248
+
249
+ # guardar accion
250
+ a = add_action(action)
251
+
252
+ start_pos= a.start_pos
253
+ end_pos=a.end_pos
254
+
255
+
256
+ # si hay que cortar y es accion izquierda
257
+ # if (a.cut && ( left_action(@seq_fasta,start_pos-p_beg,end_pos) || # action is left in insert
258
+ if (a.cut && ( left_action(@seq_fasta,start_pos-p_beg,end_pos-p_beg) || # action is left in insert
259
+ (start_pos==p_beg)) ) # action is right in insert but it's continous to the before action
260
+
261
+ puts "in seq w action left act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
262
+
263
+ p_beg=end_pos+1
264
+ cut=true
265
+ a.left_action=true
266
+ # puts "in seq w action left act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
267
+
268
+ # elsif (a.cut && right_action(@seq_fasta,start_pos-p_beg,end_pos)) # action is rigth in insert
269
+ elsif (a.cut && right_action(@seq_fasta,start_pos-p_beg,end_pos-p_beg)) # action is rigth in insert
270
+ puts "in seq w action right act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
271
+ p_end = start_pos-1
272
+ a.right_action=true
273
+ cut=true
274
+ # puts "in seq w action right act #{start_pos} #{end_pos} pbeg #{p_beg} p_end #{p_end}"
275
+ elsif !a.cut
276
+ puts "NO cut action"
277
+ if right_action(@seq_fasta,start_pos-p_beg,end_pos-p_beg)
278
+ a.right_action=true
279
+ end
280
+
281
+ end
282
+
283
+
284
+
285
+ end
286
+
287
+
288
+ if cut then
289
+
290
+ @seq_fasta = @seq_fasta_orig[p_beg..p_end]
291
+ @seq_qual = @seq_qual_orig[p_beg..p_end] if !@seq_qual_orig.nil?
292
+
293
+ # puts "in seq w action1 #{@insert_start} #{@insert_end}"
294
+ @insert_start = p_beg
295
+ size_cut_right = @insert_end - p_end
296
+ @insert_end -= size_cut_right
297
+ # puts "in seq w action2 #{@insert_start} #{@insert_end}"
298
+
299
+
300
+
301
+ end
302
+ end
303
+ end
304
+
305
+ # check if range defined by q_beg and q_end is inside some action of the type indicated by action_type
306
+ def range_inside_action_type?(q_beg,q_end,action_type)
307
+ res = false
308
+
309
+ action_list = get_actions(action_type)
310
+
311
+ action_list.each do |action|
312
+
313
+ if action.contains_action?(q_beg+@insert_start,q_end+@insert_start,10)
314
+ res = true
315
+ break
316
+ end
317
+ end
318
+
319
+ return res
320
+
321
+ end
322
+
323
+
324
+
325
+ # Prints a sequence with its actions to a file
326
+ def to_text
327
+
328
+ output_res=[]
329
+
330
+ if @seq_rejected
331
+ output_res<< " Sequence #{seq_name} had the next actions: ".bold.underline + " REJECTED: #{@seq_rejected_by_message}".red
332
+ # puts @seq_name.bold + bold + ' REJECTED BECAUSE ' +@seq_rejected_by_message.bold if @seq_rejected
333
+ else
334
+ output_res<< " Sequence #{seq_name} had the next actions: ".bold.underline
335
+
336
+ end
337
+
338
+ n=1
339
+ withMessage = ["ActionIsContaminated","ActionVectors","ActionBadAdapter","ActionLeftAdapter","ActionRightAdapter"]
340
+ color = red
341
+
342
+ @actions.sort!{|e,f| e.start_pos<=>f.start_pos}.each do |a|
343
+ a_type=a.action_type
344
+ color = a.apply_decoration(" EXAMPLE ")
345
+ color2 =a.apply_decoration(" #{a_type.center(8)} ")
346
+
347
+ reversed_str = ''
348
+
349
+ if a.reversed
350
+ reversed_str = " REVERSED ".bold
351
+ end
352
+
353
+ output_res<< " [#{n}] ".bold + color2+ " #{a.title} ".ljust(24).reset + " [ " + " #{a.start_pos+1}".center(6) + " , " + "#{a.end_pos+1}".center(6) + " ]" + clear.to_s + "#{a.message}".rjust(a.message.size+8) + reversed_str
354
+
355
+ n +=1
356
+ end
357
+
358
+ pos = 0
359
+ res = ''
360
+
361
+ @seq_fasta_orig.each_char do |c|
362
+
363
+ @actions.each do |a|
364
+ c= a.decorate(c,pos)
365
+
366
+ end
367
+
368
+ res += c
369
+
370
+ pos += 1
371
+ end
372
+
373
+ output_res<< res
374
+
375
+ if SHOW_QUAL and @seq_qual_orig
376
+ res = ''
377
+ pos=0
378
+ output_res<< ''
379
+ @seq_fasta_orig.each_char do |c2|
380
+ c=@seq_qual_orig[pos].to_s+' '
381
+ @actions.each do |a|
382
+ c= a.decorate(c,pos)
383
+
384
+ end
385
+ res += c
386
+ pos += 1
387
+ end
388
+
389
+ output_res<< res
390
+ end
391
+
392
+ if SHOW_FINAL_INSERTS
393
+ output_res<< "INSERT ==>"+get_inserts.join("\nINSERT ==>")
394
+ output_res<< "="*80
395
+ end
396
+ # puts @seq_name.bold + bold + ' rejected because ' +@seq_rejected_by_message.bold if @seq_rejected
397
+
398
+ return output_res
399
+ end
400
+
401
+ def to_text_seq_fasta
402
+ return " "*@insert_start +@seq_fasta
403
+ end
404
+
405
+ # Saves a sequence with its actions to a file
406
+ def save_to_file
407
+ File.open("results/#{seq_name}"+".txt", 'w') { |file|
408
+
409
+ n=1
410
+
411
+ @actions.each do |a|
412
+ file.puts a.description
413
+ n +=1
414
+ end
415
+ }
416
+
417
+ end
418
+
419
+ def action_right(a,p_beg,p_end)
420
+
421
+ # $LOG.debug " is right action" if ((a.start_pos-p_beg)>(p_end-a.end_pos-1))
422
+ # $LOG.debug " is left action " if !((a.start_pos-p_beg)>(p_end-a.end_pos-1))
423
+ return ((a.start_pos-p_beg)>(p_end-a.end_pos-1))
424
+
425
+ end
426
+
427
+
428
+ # def is_first_action(p_beg,p_end,seq_end)
429
+ # return ((p_beg==0) && (p_end==seq_end))
430
+ # end
431
+
432
+ #Receive a type of action. Be carefull, type is not a string .
433
+ #Return an array of actions of this type
434
+ def get_actions(type=nil)
435
+ res = []
436
+
437
+ @actions.each do |a|
438
+ if a.is_a?(type) or type.nil?
439
+ res.push a
440
+ end
441
+ end
442
+
443
+ return res
444
+ end
445
+
446
+
447
+
448
+
449
+ def get_inserts
450
+
451
+ inserts = get_actions(ActionInsert)
452
+
453
+ res =[]
454
+ inserts.each do |insert|
455
+ res.push @seq_fasta_orig[insert.start_pos..insert.end_pos]
456
+ end
457
+
458
+ return res
459
+
460
+ end
461
+
462
+ def get_qual_inserts
463
+
464
+ inserts = get_actions(ActionInsert)
465
+
466
+ res =[]
467
+
468
+ if @seq_qual_orig
469
+ inserts.each do |insert|
470
+ res.push @seq_qual_orig[insert.start_pos..insert.end_pos]
471
+ end
472
+ end
473
+
474
+ return res
475
+
476
+ end
477
+
478
+ def insert_bounds
479
+ return [@insert_start,@insert_end]
480
+ end
481
+
482
+ def to_json
483
+ s={}
484
+ s[:seq_name]=@seq_name
485
+ s[:seq_fasta]=@seq_fasta_orig
486
+ s[:seq_qual]=''
487
+ if @seq_qual_orig
488
+ s[:seq_qual]=@seq_qual_orig.join(' ')
489
+ end
490
+ s[:rejected]=@rejected
491
+
492
+
493
+ s[:fasta_inserts]= get_inserts
494
+ s[:qual_inserts]=get_qual_inserts.map { |e| e.join(' ') }
495
+ s[:actions]=[]
496
+
497
+ @actions.each { |a| s[:actions].push a.to_hash }
498
+ # puts "YAML",s.to_yaml
499
+ return JSON.pretty_generate(s)
500
+ end
501
+ # private :to_text
502
+
503
+ end