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,438 @@
1
+ require "plugin"
2
+
3
+ ########################################################
4
+ # Author: Almudena Bocinos Rioboo
5
+ #
6
+ # Defines the main methods that are necessary to execute PluginLinker
7
+ # Inherit: Plugin
8
+ ########################################################
9
+
10
+ class PluginExtractInserts < Plugin
11
+
12
+ #------------------------------------------------------
13
+ # check if part of a vector is in a linker
14
+ #------------------------------------------------------
15
+ def part_left_overlap?(r1_start,r1_end,r2_start,r2_end)
16
+
17
+
18
+
19
+ return ((r1_start<r2_start) and (r1_end<=r2_end) and (r1_end>=r2_start) ) #overlap on the left of r2
20
+
21
+ end
22
+
23
+ def part_right_overlap?(r1_start,r1_end,r2_start,r2_end)
24
+
25
+
26
+
27
+ return ((r1_end>r2_end) and (r1_start<=r2_end) and (r1_start>=r2_start) ) #overlap on the right of r2
28
+ end
29
+
30
+
31
+ # crea una action insert controlado si el inserto es corto o no y actualiza las stats según sea inserto izquierdo o derecho
32
+ def add_action_inserts(insert,linker,actions,seq)
33
+
34
+ insert_size = insert[1]-insert[0]+1
35
+
36
+ min_insert_size = @params.get_param('min_insert_size_paired').to_i
37
+
38
+ if (insert_size >= min_insert_size)
39
+ if (insert[0]<linker.start_pos) #insert is on the left from the linker
40
+
41
+ add_stats('left_insert_size',insert_size)
42
+ elsif (insert[0]>linker.end_pos) #insert is on the right from the linker
43
+
44
+ add_stats('right_insert_size',insert_size)
45
+ end
46
+
47
+ a = seq.new_action(insert[0]-seq.insert_start,insert[1]-seq.insert_start,"ActionInsert") # adds the ActionInsert to the sequence
48
+ actions.push a
49
+
50
+ else
51
+
52
+ if (insert[0]<linker.start_pos) #insert is on the left from the linker
53
+ # @stats[:short_left_insert_size]={insert_size => 1}
54
+ add_stats('short_left_insert_size',insert_size)
55
+ elsif (insert[0]>linker.end_pos) #insert is on the right from the linker
56
+ # @stats[:short_right_insert_size]={insert_size => 1}
57
+ add_stats('short_right_insert_size',insert_size)
58
+ end
59
+
60
+
61
+ #create an ActionShortInsert before the ActionLinker
62
+
63
+ # adds the ActionInsert to the sequence
64
+ a = seq.new_action(insert[0]-seq.insert_start,insert[1]-seq.insert_start,"ActionShortInsert") # adds the ActionInsert to the sequence
65
+
66
+
67
+ actions.push a
68
+
69
+ end
70
+
71
+
72
+
73
+
74
+
75
+ end
76
+
77
+ #-------------------------------------------------------------------------
78
+ #It's created an ActionInsert or ActionShortInsert before the ActionLinker
79
+ #Used: in class PluginLinker and PluginMid
80
+ #-------------------------------------------------------------------------
81
+ def add_action_before_linker(overlap,actions,seq)
82
+
83
+ # puts "INSERT1: [#{seq.insert_start},#{overlap.start_pos}]"
84
+
85
+ insert_size = overlap.start_pos - seq.insert_start
86
+
87
+ min_insert_size = @params.get_param('min_insert_size_trimmed').to_i
88
+
89
+ # puts "INSERT1: [#{overlap.start_pos},#{seq.insert_start} #{seq.insert_end} seqsize #{seq.seq_fasta.size} insert_size #{insert_size} #{min_insert_size}]"
90
+
91
+
92
+
93
+ if ((overlap.start_pos>seq.insert_start) && (insert_size >= min_insert_size))#if overlap's positions are right
94
+ #It's created an ActionInsert or ActionShortInsert before the Actionoverlap
95
+ # a = seq.new_action(seq.insert_start_last,overlap.start_pos-1-seq.insert_start,"ActionInsert") # adds the ActionInsert to the sequence
96
+ a = seq.new_action(0,overlap.start_pos-1-seq.insert_start,"ActionInsert") # adds the ActionInsert to the sequence
97
+
98
+ actions.push a
99
+ # puts " 1---------- Inserto antes del linker en pos #{a.start_pos} #{a.end_pos}"
100
+ elsif (overlap.start_pos>seq.insert_start) #if overlap's positions are right and insert's size is short
101
+ # puts " 2---------- #{seq.insert_start},#{overlap.start_pos}-1-#{seq.insert_start}"
102
+
103
+
104
+ #It's created an ActionShortInsert before the ActionLinker
105
+ # a = seq.new_action(seq.insert_start_last-seq.insert_start,overlap.start_pos-1-seq.insert_start,"ActionShortInsert") # adds the ActionInsert to the sequence
106
+ a = seq.new_action(0,overlap.start_pos-1-seq.insert_start,"ActionShortInsert") # adds the ActionInsert to the sequence
107
+
108
+ actions.push a
109
+ # puts " 2---------- Inserto corto antes del linker en pos #{a.start_pos} #{a.end_pos}"
110
+
111
+
112
+ end
113
+
114
+
115
+ @stats[:insert_size_left]={insert_size => 1}
116
+
117
+ end
118
+
119
+ #-------------------------------------------------------------------------
120
+ #It's created an ActionInsert or ActionShortInsert after the ActionLinker
121
+ #-------------------------------------------------------------------------
122
+ def add_action_after_linker(overlap,actions,seq)
123
+
124
+ # puts "INSERT2: [#{overlap.end_pos},#{seq.insert_end}]"
125
+
126
+ insert_size = seq.insert_end-overlap.end_pos
127
+
128
+ min_insert_size = @params.get_param('min_insert_size_trimmed').to_i
129
+
130
+ # puts "INSERT_SIZE2 #{insert_size} > #{min_insert_size}"
131
+
132
+ # puts "INSERT2: [#{overlap.end_pos},#{seq.insert_start} #{seq.insert_end} #{seq.seq_fasta.size} #{seq.seq_fasta_orig.size}]"
133
+
134
+ if ((overlap.end_pos-seq.insert_start < seq.seq_fasta_orig.size-1) && (insert_size>=min_insert_size) ) #if overlap's positions are left
135
+ #It's created an ActionInsert after the Actionoverlap
136
+ a = seq.new_action(overlap.end_pos-seq.insert_start+1,seq.seq_fasta.size-1,"ActionInsert") # adds the ActionInsert to the sequence
137
+ # puts " new after action #{overlap.end_pos} - #{seq.insert_start}"
138
+ # puts " 1---new insert despues del linker #{a.start_pos} #{a.end_pos} "
139
+
140
+
141
+ actions.push a
142
+
143
+ elsif (overlap.end_pos-seq.insert_start<seq.seq_fasta_orig.size-1) #if overlap's positions are right and insert's size is short
144
+ #It's created an ActionInsert after the ActionLinker
145
+ a = seq.new_action(overlap.end_pos-seq.insert_start+1,seq.seq_fasta.size-1,"ActionShortInsert") # adds the ActionInsert to the sequence
146
+
147
+ # puts " new after action #{overlap.end_pos} - #{seq.insert_start} +1"
148
+ # puts "2---new insert short despues del linker #{a.start_pos} #{a.end_pos} "
149
+ actions.push a
150
+ end
151
+ # puts "#{a.start_pos} #{a.end_pos}" if !a.nil?
152
+ @stats[:insert_size_right]={insert_size => 1}
153
+
154
+ end
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+ def split_by(actions,sub_inserts)
164
+
165
+ delete=false
166
+
167
+ # puts " split #{sub_inserts.each{|i| i.join(',')}}"
168
+ if !sub_inserts.empty?
169
+ actions.each do |action|
170
+ sub_inserts.reverse_each do |sub_i|
171
+ # puts "A: [#{action.start_pos},#{action.end_pos}] cuts [#{sub_i[0]},#{sub_i[1]}] "
172
+ if ((action.start_pos<=sub_i[0]) && (action.end_pos>=sub_i[1]))
173
+ # if not exists any subinsert
174
+ delete=true
175
+
176
+ elsif ((action.end_pos>=sub_i[0]) && (action.end_pos+1<=sub_i[1]))
177
+ # if exists an subinsert between the action one and the end of subinsert
178
+
179
+ sub_inserts.push [action.end_pos+1,sub_i[1]] # mark subinsert after the action
180
+
181
+ delete=true
182
+ # puts " !!!! 1"
183
+ if ((action.start_pos-1>=sub_i[0]))
184
+ # if exists an subinsert between the start of the subinsert and the action
185
+ sub_inserts.push [sub_i[0],action.start_pos-1] # mark subinsert before the action
186
+ delete=true
187
+
188
+ # puts " !!!! 2-1"
189
+ end
190
+
191
+ elsif ((action.start_pos-1>=sub_i[0]) && (action.start_pos<=sub_i[1]))
192
+ # if exists an subinsert between the start of the subinsert and the action
193
+ sub_inserts.push [sub_i[0],action.start_pos-1,] # mark subinsert before the action
194
+ delete=true
195
+
196
+ # puts " !!!! 2-2"
197
+
198
+
199
+ end
200
+
201
+
202
+ # sub_inserts.delete [sub_i[0],sub_i[1]] and delete=false and puts " DELETEEE ___________ #{delete}" if delete
203
+ if delete
204
+ sub_inserts.delete [sub_i[0],sub_i[1]]
205
+ delete=false
206
+ # puts " DELETEEE ___________ #{delete} #{[sub_i[0] , sub_i[1]] }"
207
+ end
208
+ # puts " eee #{sub_inserts.join(',')}"
209
+
210
+
211
+ end #each sub_insert
212
+ end #each action
213
+ end
214
+ end
215
+
216
+ #select the best subinsert, when there is not a linker
217
+ def select_the_best(sub_inserts)
218
+
219
+ insert_size = 0
220
+
221
+ insert = nil
222
+
223
+ sub_inserts.each do |sub_i|
224
+
225
+ if (insert_size<(sub_i[1]-sub_i[0]+1))
226
+ insert_size = (sub_i[1]-sub_i[0]+1)
227
+ insert=sub_i
228
+ end
229
+
230
+ end
231
+
232
+ sub_inserts=[]
233
+ sub_inserts.push insert if !insert.nil?
234
+
235
+ # puts " subinsert #{sub_inserts.join(' ')}"
236
+
237
+ return sub_inserts
238
+ end
239
+
240
+ #select the best subinsert when there is a linker
241
+ def select_the_best_with_linker(sub_inserts,linker)
242
+
243
+ left_insert_size = 0
244
+ right_insert_size = 0
245
+
246
+ left_insert = nil
247
+ right_insert = nil
248
+
249
+ sub_inserts.each do |sub_i|
250
+ #puts "*SBI: "+sub_i.join(',')
251
+ if (sub_i[0]<linker.start_pos) #if the subinsert is on the left from the linker
252
+ if (left_insert_size<(sub_i[1]-sub_i[0]+1))
253
+ left_insert_size = (sub_i[1]-sub_i[0]+1)
254
+ left_insert=sub_i
255
+ # puts " left"
256
+ end
257
+
258
+ elsif (sub_i[0]>linker.end_pos) #if the subinsert is on the right from the linker
259
+ if (right_insert_size<(sub_i[1]-sub_i[0]+1))
260
+ right_insert_size = (sub_i[1]-sub_i[0]+1)
261
+ right_insert=sub_i
262
+ end
263
+ # puts " right"
264
+ end
265
+ end
266
+ # puts " left #{left_insert} #{left_insert_size} right #{right_insert} #{right_insert_size}"
267
+ sub_inserts=[]
268
+ sub_inserts.push left_insert if !left_insert.nil?
269
+ sub_inserts.push right_insert if !right_insert.nil?
270
+ # puts " subinsert #{sub_inserts.join(' ')}"
271
+ #puts "SELECTED SUBINSERTS"
272
+ # sub_inserts.each do |sub_i|
273
+ # puts "*SBI: "+sub_i.join(',')
274
+ # end
275
+ #
276
+ return sub_inserts
277
+ end
278
+
279
+
280
+ # Begins the plugin1's execution to warn that there is linker into the sequence
281
+ def execute(seqs)
282
+ seqs.each do |s|
283
+ exec_seq(s)
284
+ end
285
+ end
286
+
287
+
288
+ def exec_seq(seq)
289
+ $LOG.info "[#{self.class.to_s}, seq: #{seq.seq_name}]: extract inserts"
290
+
291
+ # puts "INSERTO ANTES LINKER INSERT:"+seq.seq_fasta
292
+
293
+ #look for ActionLinker into the sequence's actions
294
+ linkers=seq.get_actions(ActionLinker)
295
+ #look for ActionVectors into the sequence's actions
296
+ vectors=seq.get_actions(ActionVectors)
297
+ #look for ActionLowQuality into the sequence's actions
298
+ low_quals=seq.get_actions(ActionLowQuality)
299
+
300
+ insert_size=0
301
+ actions=[]
302
+ sub_inserts=[]
303
+
304
+ if (linkers.count==1) #linker found
305
+ linker=linkers[0]
306
+
307
+ # get left insert
308
+ if linker.start_pos>seq.insert_start
309
+ sub_inserts.push [ seq.insert_start,linker.start_pos-1 ]
310
+ end
311
+
312
+ #get right insert
313
+ if linker.end_pos<seq.insert_end
314
+ sub_inserts.push [ linker.end_pos+1, seq.insert_end]
315
+ end
316
+ # puts '1ST SUBS:'
317
+ # puts sub_inserts.join("\n")
318
+ #split sub_inserts by vectors
319
+ split_by(vectors,sub_inserts)
320
+ # puts 'SUBS:'
321
+ # puts sub_inserts.join("\n")
322
+
323
+ #sub_inserts=select_the_best_with_linker(sub_inserts,linker) if not sub_inserts.empty?
324
+
325
+ # split by low qual actions
326
+ split_by(low_quals,sub_inserts)
327
+ # puts 'SUBS:'
328
+ # puts sub_inserts.join("\n")
329
+ sub_inserts=select_the_best_with_linker(sub_inserts,linker) if not sub_inserts.empty?
330
+
331
+ if sub_inserts.empty?
332
+ # if is an empty insert
333
+ a=seq.new_action(0,0,'ActionEmptyInsert')
334
+ seq.seq_rejected=true
335
+ seq.seq_rejected_by_message='empty insert'
336
+ actions.push a
337
+ end
338
+
339
+ sub_inserts.each do |sub_i|
340
+ add_action_inserts(sub_i,linker,actions,seq) # ponerlo también abajo para que controle si la accion es de inserto corto o no
341
+ end
342
+
343
+
344
+ else # no linker found => add whole insert
345
+
346
+ sub_inserts.push [ seq.insert_start, seq.insert_end ]
347
+
348
+ split_by(vectors,sub_inserts)
349
+
350
+ #sub_inserts=select_the_best(sub_inserts) if not sub_inserts.empty?
351
+
352
+ split_by(low_quals,sub_inserts)
353
+
354
+ sub_inserts=select_the_best(sub_inserts) if not sub_inserts.empty?
355
+
356
+ # ordena los subinsertos por tamaño
357
+ # sub_inserts.sort!{|i,j| j[1]-j[0]<=>i[1]-i[0]}
358
+
359
+ if sub_inserts.empty?
360
+ found_insert_size = 0 # position from an empty insert
361
+
362
+ a=seq.new_action(0,0,'ActionEmptyInsert') # refactorizando codigo
363
+ seq.seq_rejected=true
364
+ seq.seq_rejected_by_message='empty insert'
365
+ else
366
+ found_insert_size =(sub_inserts[0][1]-sub_inserts[0][0]+1)
367
+ end
368
+
369
+
370
+ if (found_insert_size >= (@params.get_param('min_insert_size_trimmed').to_i))
371
+ add_stats('insert_size',found_insert_size)
372
+ a = seq.new_action(sub_inserts[0][0]-seq.insert_start, sub_inserts[0][1]-seq.insert_start,"ActionInsert") # adds the ActionInsert to the sequence before adding the actionMid
373
+ elsif (found_insert_size!=0) # if is a short insert
374
+ add_stats('short_insert_size',found_insert_size)
375
+ a = seq.new_action(sub_inserts[0][0]-seq.insert_start, sub_inserts[0][1]-seq.insert_start,"ActionShortInsert") # adds the ActionInsert to the sequence before adding the actionMid
376
+ seq.seq_rejected=true
377
+ seq.seq_rejected_by_message='short insert'
378
+ end
379
+ actions.push a
380
+ end
381
+
382
+ seq.add_actions(actions)
383
+
384
+
385
+ # find inserts to see if it is necessary to reject it
386
+
387
+ if ! seq.seq_rejected
388
+ inserts=seq.get_actions(ActionInsert)
389
+ if inserts.empty?
390
+ seq.seq_rejected=true
391
+
392
+ if seq.get_actions(ActionShortInsert).empty?
393
+ seq.seq_rejected_by_message='empty insert'
394
+ else
395
+ seq.seq_rejected_by_message='short insert'
396
+ end
397
+ end
398
+ end
399
+ end
400
+
401
+ #Returns an array with the errors due to parameters are missing
402
+
403
+ def self.check_params(params)
404
+ errors=[]
405
+
406
+ # self.check_param(errors,params,'min_insert_size_trimmed','Integer')
407
+
408
+ return errors
409
+ end
410
+
411
+ def self.plot_setup(stats_value,stats_name,x,y,init_stats,plot)
412
+
413
+ # puts "============== #{stats_name}"
414
+
415
+ # puts stats_name
416
+ case stats_name
417
+
418
+ when 'insert_size'
419
+ plot.x_label= "Length"
420
+ plot.y_label= "Count"
421
+ plot.x_range="[0:#{init_stats['biggest_sequence_size'].to_i}]"
422
+ # plot.x_range="[0:200]"
423
+
424
+ plot.add_x(x)
425
+ plot.add_y(y)
426
+
427
+ plot.do_graph
428
+
429
+ return true
430
+ else
431
+ return false
432
+ end
433
+
434
+ end
435
+
436
+
437
+
438
+ end