bio-rocker 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d4f32b4736d380d7e8b0ff7b6ef46b221b9a0651
4
- data.tar.gz: cfbff18723f9b2d95d45350aba30a9b75cb32d5d
2
+ SHA256:
3
+ metadata.gz: 0ecb36031d65a56ae6a7e4144d7102f171d30bebcadfdf5a132622b3a743b901
4
+ data.tar.gz: 5f8251402d40ddbba6097014e1f93a1bce0245e4cc2b3fac4a3d849c5a009c18
5
5
  SHA512:
6
- metadata.gz: 1a6d9fd0c94338415f334e50c928174ee595690c3c093b1478251d169b11265843eafccdec645d9997acd2ccff0cabcb7db67e77960e43a10d5bbc90298592ff
7
- data.tar.gz: bd711c0f3a87f221b60014633130b73a581b5b5f6dd60eee5a948d5740f87bee68714f0b71b9b27412cf36ade84aac314ab20b267ae134e32a5d998e3855c056
6
+ metadata.gz: 5eac28f2473d7b8357d127741c54aab97403872fe9ef3a2185268b049bb4eb32cc3ea0216f56d6d955de66ea7172962a81a76b90a3b229fbad631365c3eb0a40
7
+ data.tar.gz: 8c23e1ad05edc88aa364b4f54ca594897cf971a98b3f98332a165d0a268b65985bba84eb020e509b3a5ae414099bcd79878d025ee2cb164f6c25d8e225ace685
data/bin/ROCker CHANGED
@@ -139,14 +139,14 @@ opts = OptionParser.new do |opt|
139
139
  *ROCker.default(:searchcmd).keys.map do |k|
140
140
  ["By default if --search #{k}:", "'" +
141
141
  ROCker.default(:searchcmd)[k] + "'"]
142
- end.reduce([],:+) ){ |v| o[:searchcmd]=v }
142
+ end.flatten ){ |v| o[:searchcmd]=v }
143
143
  opt.on("--makedb-cmd STR",
144
144
  "Command calling database formater for similarity search, where",
145
145
  "%1$s: binaries, %2$s: dbtype, %3$s: input, %4$s: database.",
146
146
  *ROCker.default(:makedbcmd).keys.map do |k|
147
147
  ["By default if --search #{k}:", "'" +
148
148
  ROCker.default(:makedbcmd)[k] + "'"]
149
- end.reduce([],:+) ){ |v| o[:makedbcmd]=v }
149
+ end.flatten ){ |v| o[:makedbcmd]=v }
150
150
  opt.on("--simulator-cmd STR",
151
151
  "Command calling simulator, where %1$s: binary, %2$s: input,",
152
152
  "%3$s: seq. depth (X), %4$d: read len., %5$s: output file, " +
@@ -154,7 +154,7 @@ opts = OptionParser.new do |opt|
154
154
  *ROCker.default(:simulatorcmd).keys.map do |k|
155
155
  ["By default if --simulator #{k}:", "'" +
156
156
  ROCker.default(:simulatorcmd)[k] + "'"]
157
- end.reduce([],:+) ){ |v| o[:simulatorcmd]=v }
157
+ end.flatten ){ |v| o[:simulatorcmd]=v }
158
158
  opt.on("--aligner-cmd STR",
159
159
  "Command calling aligner, where %1$s: binary, %2$s: input,",
160
160
  "%3$s: output, %4$d: threads.",
@@ -164,6 +164,9 @@ opts = OptionParser.new do |opt|
164
164
  end.reduce([],:+) ){ |v| o[:alignercmd]=v }
165
165
  when "compile"
166
166
  opt.separator "+ COMPILATION ARGUMENTS"
167
+ opt.on("-l", "--readlen INTEGER",
168
+ "Average read length used in the compile step (Mandatory)."
169
+ ){ |v| o[:readlen] = v.to_i }
167
170
  opt.on("-a", "--alignment PATH",
168
171
  "Protein alignment of the reference sequences. Required."
169
172
  ){ |v| o[:aln]=v }
@@ -233,6 +236,9 @@ opts = OptionParser.new do |opt|
233
236
  opt.on("-x", "--query-blast PATH",
234
237
  "Unfiltered tabular BLAST. By default, this file is not " +
235
238
  "kept."){ |v| o[:qblast]=v }
239
+ opt.on('-L', '--length-correction PATH',
240
+ 'Path to the query reads, used to apply read-length correction to ' +
241
+ 'bit scores.'){ |v| o[:lencorr] = v }
236
242
 
237
243
  opt.separator ""
238
244
  opt.separator "+ EXTERNAL SOFTWARE OPTIONS"
@@ -248,16 +254,16 @@ opts = OptionParser.new do |opt|
248
254
  "Command calling similarity search, where %1$s: binaries, %2$s: " +
249
255
  "program, %3$s: input, %4$s: database, %5$s: output, %6$d: threads.",
250
256
  *ROCker.default(:searchcmd).keys.map do |k|
251
- "By default if --search #{k}: '" + ROCker.default(:searchcmd)[k] +
252
- "'."
253
- end ){ |v| o[:searchcmd]=v }
257
+ ["By default if --search #{k}:",
258
+ "'" + ROCker.default(:searchcmd)[k] + "'"]
259
+ end.flatten ){ |v| o[:searchcmd]=v }
254
260
  opt.on("--makedb-cmd STR",
255
261
  "Command calling database format for similarity search, where %1$s: " +
256
262
  "binaries, %2$s: dbtype, %3$s: input, %4$s: database.",
257
263
  *ROCker.default(:makedbcmd).keys.map do |k|
258
- "By default if --search #{k}: '" + ROCker.default(:makedbcmd)[k] +
259
- "'."
260
- end ){ |v| o[:makedbcmd]=v }
264
+ ["By default if --search #{k}:",
265
+ "'" + ROCker.default(:makedbcmd)[k] + "'" ]
266
+ end.flatten ){ |v| o[:makedbcmd]=v }
261
267
  when "filter"
262
268
  opt.separator "+ FILTERING ARGUMENTS"
263
269
  opt.on("-k", "--rocker PATH",
@@ -268,6 +274,9 @@ opts = OptionParser.new do |opt|
268
274
  "dataset. Required."){ |v| o[:qblast]=v }
269
275
  opt.on("-o", "--out-blast PATH",
270
276
  "Filtered tabular BLAST to be created. Required."){ |v| o[:oblast]=v }
277
+ opt.on('-L', '--length-correction PATH',
278
+ 'Path to the query reads, used to apply read-length correction to ' +
279
+ 'bit scores.'){ |v| o[:lencorr] = v }
271
280
  when "plot"
272
281
  opt.separator "+ PLOTTING ARGUMENTS"
273
282
  opt.on("-k", "--rocker PATH",
@@ -9,13 +9,13 @@ require "rocker/rocdata"
9
9
 
10
10
  class ROCker
11
11
  #================================[ Class ]
12
- @@VERSION = "1.2.0"
12
+ @@VERSION = "1.3.0"
13
13
  @@CITATION = [
14
14
  "Orellana, Rodriguez-R & Konstantinidis, 2016. DOI:10.1093/nar/gkw900.",
15
15
  "ROCker: accurate detection and quantification of target genes in",
16
16
  "short-read metagenomic data sets by modeling sliding-window bitscores.",
17
17
  "Nucleic Acids Research 45(3):e14."]
18
- @@DATE = "2018-06-28"
18
+ @@DATE = "2019-06-02"
19
19
  @@DEFAULTS = {
20
20
  # General
21
21
  q: false, r: "R", nucl: false, debug: false, thr: 2, search: :blast,
@@ -6,7 +6,7 @@
6
6
  #
7
7
 
8
8
  class BlastHit
9
- attr_reader :sbj, :sfrom, :sto, :bits, :istrue, :isfalse, :midpoint
9
+ attr_reader :qry, :sbj, :sfrom, :sto, :bits, :istrue, :isfalse, :midpoint
10
10
  # Initialize from BLAST using new(ln,aln),
11
11
  # initialize from TABLE using new(ln)
12
12
  def initialize(ln, aln=nil)
@@ -20,6 +20,7 @@ class BlastHit
20
20
  @istrue = l[4]=='-1'
21
21
  @midpoint = l[5].to_i
22
22
  else
23
+ @qry = l[0]
23
24
  s = aln.seq(l[1])
24
25
  return nil if s.nil?
25
26
  @sbj = s.id
@@ -11,24 +11,30 @@ require 'rocker/alignment'
11
11
  require 'tmpdir'
12
12
 
13
13
  class ROCData
14
- attr_reader :aln, :windows, :r, :refined
14
+ attr_reader :aln, :windows, :r, :refined, :signatures
15
15
  # Use ROCData.new(table,aln,window) to re-compute from table, use
16
16
  # ROCData.new(data) to load
17
- def initialize(val, aln=nil, window=nil)
17
+ def initialize(val, aln = nil, window = nil)
18
18
  @r = RInterface.new
19
19
  @nucl = false
20
20
  @refined = false
21
21
  if not aln.nil?
22
22
  @aln = aln
23
+ @signatures = { v: "ROCker #{ROCker.VERSION}", d: Time.now.to_s }
23
24
  self.rrun "library('pROC');"
24
25
  self.rrun "x <- read.table('#{val}', sep='\\t', h=F);"
25
26
  self.init_windows! window
26
27
  else
27
28
  f = File.open(val, "r")
28
29
  @windows = []
30
+ @signatures = {}
29
31
  while ln = f.gets
30
- break unless /^#:/.match(ln).nil?
31
- @windows << ROCWindow.new(self, ln)
32
+ break unless /^#:/.match(ln).nil?
33
+ if ln =~ /^#(\S+) (.*)/
34
+ @signatures[$1.to_sym] = $2
35
+ else
36
+ @windows << ROCWindow.new(self, ln)
37
+ end
32
38
  end
33
39
  f.close
34
40
  @aln = Alignment.new
@@ -126,16 +132,15 @@ class ROCData
126
132
  end
127
133
  end
128
134
  def rrun(cmd, type=nil) self.r.run cmd, type end
129
- def save(file)
130
- f = File.open(file, "w")
131
- f.print self.to_s
132
- f.close
135
+ def save(file, sign = {})
136
+ @signatures.merge! sign
137
+ File.open(file, 'w') { |fh| fh.print self.to_s }
133
138
  end
134
139
  def to_s
135
- o = "#v ROCker " + ROCker.VERSION + "\n"
136
- self.windows.each{|w| o += w.to_s}
137
- o += self.aln.to_s
138
- return o
140
+ o = signatures.map{ |k,v| "##{k} #{v}\n" }.join
141
+ self.windows.each{ |w| o += w.to_s }
142
+ o += self.aln.to_s
143
+ return o
139
144
  end
140
145
  end
141
146
 
@@ -13,6 +13,7 @@ class ROCker
13
13
  def compile!
14
14
  raise "-a/--alignment is mandatory." if @o[:aln].nil?
15
15
  raise "-a/--alignment must exist." unless File.exist? @o[:aln]
16
+ raise "-l/--readlen is mandatory." if @o[:readlen].nil?
16
17
  if @o[:table].nil?
17
18
  raise "-T/--table is mandatory unless -b is provided." if
18
19
  @o[:blast].nil? or not File.exist? @o[:blast]
@@ -52,7 +53,7 @@ class ROCker
52
53
  data.refine! @o[:table]
53
54
  end
54
55
  puts " * saving ROCker file: #{@o[:rocker]}." unless @o[:q]
55
- data.save @o[:rocker]
56
+ data.save(@o[:rocker], l: @o[:readlen])
56
57
  end # compile!
57
58
  end # ROCker
58
59
 
@@ -6,31 +6,55 @@
6
6
  #
7
7
 
8
8
  class ROCker
9
- #================================[ Class ]
10
- #@@DEFAULTS.merge!({ })
11
-
12
- #================================[ Filter ]
13
- def filter!(data=nil)
14
- raise "-k/--rocker is mandatory." if @o[:rocker].nil?
15
- raise "-x/--query-blast is mandatory." if @o[:qblast].nil?
16
- raise "-o/--out-blast is mandatory." if @o[:oblast].nil?
17
-
18
- # Read ROCker file
19
- if data.nil?
20
- puts "Loading ROCker file: #{@o[:rocker]}." unless @o[:q]
21
- data = ROCData.new @o[:rocker]
9
+ #================================[ Class ]
10
+ #@@DEFAULTS.merge!({ })
11
+
12
+ #================================[ Filter ]
13
+ def filter!(data=nil)
14
+ raise "-k/--rocker is mandatory." if @o[:rocker].nil?
15
+ raise "-x/--query-blast is mandatory." if @o[:qblast].nil?
16
+ raise "-o/--out-blast is mandatory." if @o[:oblast].nil?
17
+
18
+ # Read ROCker file
19
+ if data.nil?
20
+ puts "Loading ROCker file: #{@o[:rocker]}." unless @o[:q]
21
+ data = ROCData.new @o[:rocker]
22
+ end
23
+ corr = {}
24
+ readlen = 0
25
+ unless @o[:lencorr].nil?
26
+ raise "Unsigned length in model, please re-compile model to use -L" if
27
+ data.signatures[:l].nil?
28
+ readlen = data.signatures[:l].to_i
29
+ File.open(@o[:lencorr], 'r') do |fh|
30
+ k = nil
31
+ fh.each_line do |ln|
32
+ if ln =~ /^>(\S+)/
33
+ k = $1
34
+ corr[k] = 0
35
+ else
36
+ corr[k] += ln.chomp.size
37
+ end
38
+ end
22
39
  end
40
+ end
23
41
 
24
- # Filter similarity search
25
- puts "Filtering similarity search: #{@o[:qblast]}." unless @o[:q]
26
- ih = File.open(@o[:qblast], "r")
27
- oh = File.open(@o[:oblast], "w")
28
- while ln = ih.gets
29
- bh = BlastHit.new(ln, data.aln)
30
- oh.print ln if not(bh.sfrom.nil?) and bh.bits >= data.win_at_col(bh.midpoint).thr
42
+ # Filter similarity search
43
+ puts "Filtering similarity search: #{@o[:qblast]}." unless @o[:q]
44
+ oh = File.open(@o[:oblast], 'w')
45
+ File.open(@o[:qblast], 'r') do |ih|
46
+ ih.each_line do |ln|
47
+ bh = BlastHit.new(ln, data.aln)
48
+ bs = bh.bits
49
+ unless @o[:lencorr].nil?
50
+ corrlen = [corr[bh.qry].to_i, 0.6 * readlen].max
51
+ bs = bs * readlen / corrlen if corrlen < readlen
52
+ end
53
+ oh.print ln if
54
+ not(bh.sfrom.nil?) and bs >= data.win_at_col(bh.midpoint).thr
31
55
  end
32
- ih.close
33
- oh.close
34
- end # filter!
56
+ end
57
+ oh.close
58
+ end # filter!
35
59
  end # ROCker
36
60
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bio-rocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luis (Coto) Orellana
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-06-28 00:00:00.000000000 Z
12
+ date: 2019-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -81,8 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
- rubyforge_project:
85
- rubygems_version: 2.6.13
84
+ rubygems_version: 3.0.3
86
85
  signing_key:
87
86
  specification_version: 4
88
87
  summary: ROCker