seqtrimnext 2.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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