bio-rocker 1.3.1 → 1.4.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
2
  SHA256:
3
- metadata.gz: e1d57ddce91458189a74b7d7f104b2b663396f0df6a2ab7077d4bea45028d982
4
- data.tar.gz: 2625bbba04cec1435ae82518cdee6848d6c1fa3775e8030e6bcd6b754db54409
3
+ metadata.gz: 7cf59c3a66eb06806a91fd768c0ec6202149b7b4b16090bc7be19e96b073fcd3
4
+ data.tar.gz: 513a5c4de89965d9a852b87ce5b0d7d3da9fb9246471e919fe337dc571cdbe3a
5
5
  SHA512:
6
- metadata.gz: 5e7f492f6a9c48aebb3a263345567942e0021dc5027d5dafaeac415a10b66fe0670e709ad007e6d607fad9b32c0fb88d8f5b0e9df19b09ebbd92fdc2bf88e6bf
7
- data.tar.gz: fb260962739d7b8c0e65629786154ff295c1a46b243a7502697cb497bf56f6390147731823a0c390c8e7855e4402c5ce4fdfa3a66ef86d044ed7ba08ed3b3ed0
6
+ metadata.gz: 95cd32ec66b65516c6253ea5396354b621ac05a945f4a743fefafb9eb9b9b6df67eb0badc93a8dd7329643a7ecadc32a15c3aedd3ef683ef57cfe51a6ddbe304
7
+ data.tar.gz: 8528c3c5f10b4b5a8a895c51de9368aeafef413edf2931ab9ac5d5f4d92f211f2289636a9b6efbb98573ac305afacf1a127ed27482639f1e3a14496699eb9578
data/bin/ROCker CHANGED
@@ -238,6 +238,9 @@ opts = OptionParser.new do |opt|
238
238
  "kept."){ |v| o[:qblast]=v }
239
239
  opt.on('-L', '--length-correction',
240
240
  'Apply read-length correction to bit scores.'){ |v| o[:lencorr] = v }
241
+ opt.on('-M', '--max-length-correction FLOAT',
242
+ 'Maximum length correction, as a read length fraction.'
243
+ ){ |v| o[:lencorr_max] = v.to_f }
241
244
 
242
245
  opt.separator ""
243
246
  opt.separator "+ EXTERNAL SOFTWARE OPTIONS"
@@ -276,6 +279,9 @@ opts = OptionParser.new do |opt|
276
279
  opt.on('-L', '--length-correction PATH',
277
280
  'Path to the query reads, used to apply read-length correction to ' +
278
281
  'bit scores.'){ |v| o[:lencorr] = v }
282
+ opt.on('-M', '--max-length-correction FLOAT',
283
+ 'Maximum length correction, as a read length fraction.'
284
+ ){ |v| o[:lencorr_max] = v.to_f }
279
285
  when "plot"
280
286
  opt.separator "+ PLOTTING ARGUMENTS"
281
287
  opt.on("-k", "--rocker PATH",
@@ -4,83 +4,83 @@
4
4
  # @license Artistic-2.0
5
5
  #
6
6
 
7
- require "rocker/blasthit"
8
- require "rocker/rocdata"
7
+ require 'rocker/blasthit'
8
+ require 'rocker/rocdata'
9
9
 
10
10
  class ROCker
11
- #================================[ Class ]
12
- @@VERSION = "1.3.1"
13
- @@CITATION = [
14
- "Orellana, Rodriguez-R & Konstantinidis, 2016. DOI:10.1093/nar/gkw900.",
15
- "ROCker: accurate detection and quantification of target genes in",
16
- "short-read metagenomic data sets by modeling sliding-window bitscores.",
17
- "Nucleic Acids Research 45(3):e14."]
18
- @@DATE = "2019-06-02"
19
- @@DEFAULTS = {
20
- # General
21
- q: false, r: "R", nucl: false, debug: false, thr: 2, search: :blast,
22
- # External software
23
- searchbins: "",
24
- searchcmd: {
25
- blast: '%1$s%2$s -query "%3$s" -db "%4$s" -out "%5$s" ' +
26
- '-num_threads %6$d -outfmt 6 -max_target_seqs 1',
27
- diamond: '%1$sdiamond %2$s -q "%3$s" -d "%4$s" -a "%5$s.daa" -p %6$d' +
28
- ' -k 1 --min-score 20 --sensitive && %1$sdiamond view -a "%5$s"' +
29
- ' -o "%5$s"'},
30
- makedbcmd: {
31
- blast: '%1$smakeblastdb -dbtype %2$s -in "%3$s" -out "%4$s"',
32
- diamond: '%1$sdiamond makedb --in "%3$s" -d "%4$s"'}
33
- }
34
- def self.defaults() @@DEFAULTS ; end
35
- def self.default(k) @@DEFAULTS[k] ; end
36
- def self.VERSION; @@VERSION ; end
37
- def self.DATE; @@DATE ; end
38
- def self.CITATION(j=" ") @@CITATION.join(j) ; end
11
+ #================================[ Class ]
12
+ @@VERSION = '1.4.0'
13
+ @@CITATION = [
14
+ 'Orellana, Rodriguez-R & Konstantinidis, 2016. DOI:10.1093/nar/gkw900.',
15
+ 'ROCker: accurate detection and quantification of target genes in',
16
+ 'short-read metagenomic data sets by modeling sliding-window bitscores.',
17
+ 'Nucleic Acids Research 45(3):e14.']
18
+ @@DATE = '2019-07-20'
19
+ @@DEFAULTS = {
20
+ # General
21
+ q: false, r: 'R', nucl: false, debug: false, thr: 2, search: :blast,
22
+ # External software
23
+ searchbins: '',
24
+ searchcmd: {
25
+ blast: '%1$s%2$s -query "%3$s" -db "%4$s" -out "%5$s" ' +
26
+ '-num_threads %6$d -outfmt 6 -max_target_seqs 1',
27
+ diamond: '%1$sdiamond %2$s -q "%3$s" -d "%4$s" -a "%5$s.daa" -p %6$d' +
28
+ ' -k 1 --min-score 20 --sensitive && %1$sdiamond view -a "%5$s"' +
29
+ ' -o "%5$s"'},
30
+ makedbcmd: {
31
+ blast: '%1$smakeblastdb -dbtype %2$s -in "%3$s" -out "%4$s"',
32
+ diamond: '%1$sdiamond makedb --in "%3$s" -d "%4$s"'}
33
+ }
34
+ def self.defaults() @@DEFAULTS ; end
35
+ def self.default(k) @@DEFAULTS[k] ; end
36
+ def self.VERSION; @@VERSION ; end
37
+ def self.DATE; @@DATE ; end
38
+ def self.CITATION(j = ' ') @@CITATION.join(j) ; end
39
39
 
40
- #================================[ Instance ]
41
- attr_reader :o
42
- def initialize(opts)
43
- @o = ROCker.defaults
44
- opts.each{ |k,v| @o[k] = v }
45
- RInterface.R_BIN = opts[:r] unless opts[:r].nil?
46
- end
40
+ #================================[ Instance ]
41
+ attr_reader :o
42
+ def initialize(opts)
43
+ @o = ROCker.defaults
44
+ opts.each{ |k,v| @o[k] = v }
45
+ RInterface.R_BIN = opts[:r] unless opts[:r].nil?
46
+ end
47
47
 
48
- #================================[ Utilities ]
49
- def blast2table(blast_f, table_f, aln, minscore)
50
- ifh = File.open(blast_f, "r")
51
- ofh = File.open(table_f, "w")
52
- while ln = ifh.gets
53
- bh = BlastHit.new(ln, aln)
54
- ofh.print bh.to_s if bh.bits >= minscore
55
- end
56
- ifh.close
57
- ofh.close
58
- end
59
- def bash(cmd, err_msg=nil)
60
- o = `#{cmd} 2>&1 && echo '{'`
61
- raise (err_msg.nil? ? "Error executing: #{cmd}\n\n#{o}" : err_msg) unless
62
- o[-2]=="{"
63
- true
64
- end
48
+ #================================[ Utilities ]
49
+ def blast2table(blast_f, table_f, aln, minscore)
50
+ ifh = File.open(blast_f, 'r')
51
+ ofh = File.open(table_f, 'w')
52
+ while ln = ifh.gets
53
+ bh = BlastHit.new(ln, aln)
54
+ ofh.print bh.to_s if bh.bits >= minscore
55
+ end
56
+ ifh.close
57
+ ofh.close
58
+ end
59
+ def bash(cmd, err_msg=nil)
60
+ o = `#{cmd} 2>&1 && echo '{'`
61
+ raise (err_msg.nil? ? "Error executing: #{cmd}\n\n#{o}" : err_msg) unless
62
+ o[-2]=="{"
63
+ true
64
+ end
65
65
  end
66
66
 
67
67
  #================================[ Extensions ]
68
68
  # To ROCker
69
- require "rocker/step/build"
70
- require "rocker/step/compile"
71
- require "rocker/step/search"
72
- require "rocker/step/filter"
73
- require "rocker/step/plot"
69
+ require 'rocker/step/build'
70
+ require 'rocker/step/compile'
71
+ require 'rocker/step/search'
72
+ require 'rocker/step/filter'
73
+ require 'rocker/step/plot'
74
74
 
75
75
  # To other
76
76
  class Numeric
77
- def ordinalize
77
+ def ordinalize
78
78
  n= self.to_s
79
- s= n[-2]=='1' ? "th" :
80
- n[-1]=='1' ? "st" :
81
- n[-1]=='2' ? "nd" :
82
- n[-1]=='3' ? "rd" : "th"
79
+ s= n[-2]=='1' ? 'th' :
80
+ n[-1]=='1' ? 'st' :
81
+ n[-1]=='2' ? 'nd' :
82
+ n[-1]=='3' ? 'rd' : 'th'
83
83
  n + s
84
- end
84
+ end
85
85
  end
86
86
 
@@ -20,20 +20,21 @@ class ROCker
20
20
  puts "Loading ROCker file: #{@o[:rocker]}." unless @o[:q]
21
21
  data = ROCData.new @o[:rocker]
22
22
  end
23
- corr = {}
24
- readlen = 0
23
+ readlengths = {}
24
+ exp_readlen = 0
25
25
  unless @o[:lencorr].nil?
26
+ @o[:lencorr_max] ||= 0.4
26
27
  raise "Unsigned length in model, please re-compile model to use -L" if
27
28
  data.signatures[:l].nil?
28
- readlen = data.signatures[:l].to_i
29
+ exp_readlen = data.signatures[:l].to_i
29
30
  File.open(@o[:lencorr], 'r') do |fh|
30
31
  k = nil
31
32
  fh.each_line do |ln|
32
33
  if ln =~ /^>(\S+)/
33
34
  k = $1
34
- corr[k] = 0
35
+ readlengths[k] = 0
35
36
  else
36
- corr[k] += ln.chomp.size
37
+ readlengths[k] += ln.chomp.size
37
38
  end
38
39
  end
39
40
  end
@@ -45,16 +46,26 @@ class ROCker
45
46
  File.open(@o[:qblast], 'r') do |ih|
46
47
  ih.each_line do |ln|
47
48
  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
49
+ next if bh.sbj.nil? # <- When the hit is not against a known target
50
+ bs = @o[:lencorr].nil? ? bh.bits :
51
+ correct_bs(bh, readlengths[bh.qry], exp_readlen, @o[:lencorr_max])
52
+ oh.print ln if not(bh.sfrom.nil?) and
53
+ bs >= data.win_at_col(bh.midpoint).thr
55
54
  end
56
55
  end
57
56
  oh.close
58
57
  end # filter!
58
+
59
+ def correct_bs(bh, readlen, exp_readlen, max_corr)
60
+ bs = bh.bits
61
+ return bs if @o[:lencorr].nil? or readlen.nil? or readlen >= exp_readlen
62
+ bits_per_aa = bs.to_f / readlen
63
+ miss = exp_readlen - readlen
64
+ max_tri = max_corr * readlen * bits_per_aa / 2
65
+ extra = [0.0, readlen * (max_corr + 1.0) - exp_readlen].max
66
+ tanTheta = max_corr > 0.0 ? bits_per_aa / (max_corr * readlen) : 0.0
67
+ extra_tri = extra * extra * tanTheta / 2
68
+ bs + (max_tri - extra_tri)
69
+ end
59
70
  end # ROCker
60
71
 
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.3.1
4
+ version: 1.4.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: 2019-06-02 00:00:00.000000000 Z
12
+ date: 2019-07-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client