miga-base 1.2.1.0 → 1.2.2.3

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: afb7c816474f73c547c7f54982293fe72c24d7829184801ab51fc848adf3d9e3
4
- data.tar.gz: 06d51ebc47e96c28072c8415321014535ea7576d9e6f1c381e3ca62dc880df15
3
+ metadata.gz: 3b3fd16e90667560b5cba41046eb92613187279fd7194d1825cc3dee9690273d
4
+ data.tar.gz: 84043b09c234b825ba0b89ca057b4301a97d5234a87282583516abffbc377e05
5
5
  SHA512:
6
- metadata.gz: a4f5279fdba54ad1f8bcbce86cb84a7643b473b7742686e8e9992f8c4af7c982d5776a5a06775b10df67b61de90c4a32f915b51a17a9b11a223474574e7f8159
7
- data.tar.gz: bcd547a1dc5337fbf036ba8e2df6de6db4c4fb34979afeb30ce6c1a692e76166b5412457fb3cc778e03cb601a192af0c8d33709b2e5d7233508dfdbd1c5156ed
6
+ metadata.gz: 2e0d76139cfd93f77a91ee266bd596d74e8881da94fb750d97b03bb6c491424e75af208177687525d284ae3fe96e77f1e373f0bdce0583445a4070f3ed09cac0
7
+ data.tar.gz: 5bd98ea9eb89bcb4af4b74128c2d84ac1f32047322bb2177f7d47543efcc4122a4f8c23f463e8ae8291c8e6dff753182a39fd11fbdf42679975e5b2dba0ca571
@@ -57,6 +57,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
57
57
 
58
58
  def perform
59
59
  p = cli.load_project
60
+ cli.ensure_par(type: '-t')
60
61
  files, file_type = get_files_and_type
61
62
 
62
63
  paired = cli[:input_type].to_s.include?('_paired')
@@ -113,7 +114,7 @@ class MiGA::Cli::Action::Add < MiGA::Cli::Action
113
114
  cli.ensure_type(Dataset)
114
115
  files = [nil]
115
116
  else
116
- raise 'Please specify input type (-i).' if cli[:input_type].nil?
117
+ cli.ensure_par({ input_type: '-i' }, 'Please specify input type (-i)')
117
118
 
118
119
  file_type = self.class.INPUT_TYPES[cli[:input_type]]
119
120
  raise "Unrecognized input type: #{cli[:input_type]}." if file_type.nil?
@@ -31,6 +31,7 @@ module MiGA::Cli::Action::Doctor::Base
31
31
  file = File.join(base, dir, file_db)
32
32
  blk[file, metric, result, rank] if File.exist? file
33
33
  end
34
+ # Query databases for reference databases refer to taxonomy runs
34
35
  base = File.join(base, '05.taxonomy')
35
36
  result = :taxonomy
36
37
  end
@@ -137,10 +138,11 @@ module MiGA::Cli::Action::Doctor::Base
137
138
  def save_bidirectional(a, dist)
138
139
  each_database_file(a) do |db_file, metric, result, rank|
139
140
  next if rank == :haai # No need for hAAI to be bidirectional
141
+ next if result == :taxonomy # Taxonomy is never bidirectional
140
142
 
141
143
  b2a = dist[rank].map { |b_name, v| b_name if v[a.name] }.compact
142
144
  a2b = dist[rank][a.name]&.keys || []
143
- SQLite3::Database.new(db_file) do |db|
145
+ MiGA::SQLite.new(db_file).run do |db|
144
146
  sql = <<~SQL
145
147
  insert into #{metric}(seq1, seq2, #{metric}, sd, n, omega) \
146
148
  values(?, ?, ?, ?, ?, ?);
@@ -112,7 +112,7 @@ module MiGA::Cli::Action::Init::FilesHelper
112
112
  && tar zxf #{arch.shellescape} \
113
113
  && rm #{arch.shellescape}
114
114
  CMD
115
- run_cmd(cmd, source: nil)
115
+ run_cmd(cli, cmd, source: nil)
116
116
  cli.puts
117
117
  end
118
118
  end
@@ -26,9 +26,7 @@ module MiGA::Common::WithResult
26
26
  task = task.to_sym
27
27
  return nil if result_dirs[task].nil?
28
28
 
29
- base = File.join(
30
- project.path, "data/#{result_dirs[task]}/#{result_base}"
31
- )
29
+ base = File.join(project.path, 'data', result_dirs[task], result_base)
32
30
  json = "#{base}.json"
33
31
  return MiGA::Result.load(json) unless save
34
32
 
data/lib/miga/common.rb CHANGED
@@ -43,9 +43,8 @@ class MiGA::MiGA
43
43
  # +ext+ values (Array of String).
44
44
  def result_files_exist?(base, ext)
45
45
  ext = [ext] unless ext.is_a? Array
46
- ext.all? do |f|
47
- File.exist?(base + f) or File.exist?("#{base}#{f}.gz")
48
- end
46
+ MiGA::MiGA.DEBUG("Assserting files for result: #{ext}")
47
+ ext.all? { |f| File.exist?(base + f) or File.exist?("#{base}#{f}.gz") }
49
48
  end
50
49
 
51
50
  ##
data/lib/miga/daemon.rb CHANGED
@@ -66,6 +66,12 @@ class MiGA::Daemon < MiGA::MiGA
66
66
  "MiGA:#{project.name}"
67
67
  end
68
68
 
69
+ ##
70
+ # Alias to +project.path+ for compatibility with lairs
71
+ def path
72
+ project.path
73
+ end
74
+
69
75
  ##
70
76
  # Run only in the first loop
71
77
  def daemon_first_loop
data/lib/miga/sqlite.rb CHANGED
@@ -31,16 +31,30 @@ class MiGA::SQLite < MiGA::MiGA
31
31
  def initialize(path, opts = {})
32
32
  @opts = MiGA::SQLite.default_opts(opts)
33
33
  @path = File.absolute_path(path)
34
+ MiGA::MiGA.DEBUG("Accessing database: #{path}")
34
35
  end
35
36
 
36
37
  ##
37
- # Executes +cmd+ and returns the result
38
+ # Executes +cmd+ and returns the result. Alternatively, if a block is
39
+ # passed, the commands are ignored and the block is executed with a
40
+ # single parameter of the database connection
38
41
  def run(*cmd)
42
+ if block_given?
43
+ run_block { |conn| yield(conn) }
44
+ else
45
+ y = nil
46
+ run_block { |conn| y = conn.execute(*cmd) }
47
+ y
48
+ end
49
+ end
50
+
51
+ ##
52
+ # Executes +blk+ that accepts a single parameter for the database
53
+ # connection
54
+ def run_block(&blk)
39
55
  busy_attempts ||= 0
40
56
  io_attempts ||= 0
41
- y = nil
42
- SQLite3::Database.new(path) { |conn| y = conn.execute(*cmd) }
43
- y
57
+ SQLite3::Database.new(path) { |conn| blk[conn] }
44
58
  rescue SQLite3::BusyException => e
45
59
  busy_attempts += 1
46
60
  raise "Database busy #{path}: #{e.message}" if busy_attempts >= 3
data/lib/miga/version.rb CHANGED
@@ -12,7 +12,7 @@ module MiGA
12
12
  # - String indicating release status:
13
13
  # - rc* release candidate, not released as gem
14
14
  # - [0-9]+ stable release, released as gem
15
- VERSION = [1.2, 1, 0].freeze
15
+ VERSION = [1.2, 2, 3].freeze
16
16
 
17
17
  ##
18
18
  # Nickname for the current major.minor version.
@@ -20,7 +20,7 @@ module MiGA
20
20
 
21
21
  ##
22
22
  # Date of the current gem relese.
23
- VERSION_DATE = Date.new(2021, 12, 12)
23
+ VERSION_DATE = Date.new(2022, 2, 9)
24
24
 
25
25
  ##
26
26
  # References of MiGA
@@ -1,29 +1,48 @@
1
1
  #!/usr/bin/env Rscript
2
2
 
3
- argv <- commandArgs(trailingOnly=T)
3
+ argv <- commandArgs(trailingOnly = TRUE)
4
4
 
5
- plot_core_pan <- function(core_pan, pdf){
6
- a <- read.table(core_pan, sep="\t", header=TRUE)
5
+ plot_core_pan <- function (core_pan, pdf) {
6
+ a <- read.table(core_pan, sep = "\t", header = TRUE)
7
+ col <- c(
8
+ rgb(96, 11, 64, max = 255),
9
+ rgb(0, 121, 166, max = 255),
10
+ rgb(0.5, 0.5, 0.5, 1/3),
11
+ rep(rgb(0.5, 0.5, 0.5), 2)
12
+ )
7
13
  pdf(pdf, 7, 5)
8
- plot(1, type="n", xlim=c(0, max(a$genomes)*1.05), xaxs="i", yaxs="i",
9
- ylim=c(0, max(a$pan_q3)*1.05), xlab="Genomes", ylab="Orthologous Groups")
14
+ plot(
15
+ 1, type = "n", xlim = c(0, max(a$genomes) * 1.05), xaxs = "i", yaxs = "i",
16
+ ylim = c(0, max(a$pan_q3) * 1.05)/1e3, xlab = "Genomes",
17
+ ylab = "Orthologous Groups (thousands)"
18
+ )
19
+
10
20
  # Core
11
- polygon(c(a$genomes, rev(a$genomes)), c(a$core_q1, rev(a$core_q3)),
12
- border=NA, col=rgb(0, 121, 166, 128/2, max=255))
13
- lines(a$genomes, a$core_avg, col=rgb(0,121,166,max=255), lty=2)
14
- lines(a$genomes, a$core_q2, col=rgb(0,121,166,max=255), lty=1)
21
+ polygon(
22
+ c(a$genomes, rev(a$genomes)), c(a$core_q1, rev(a$core_q3))/1e3,
23
+ border = NA, col = rgb(0, 121, 166, 256/4, max = 255)
24
+ )
25
+ lines(a$genomes, a$core_avg/1e3, col = col[2], lty = 2)
26
+ lines(a$genomes, a$core_q2/1e3, col = col[2], lty = 1)
27
+
15
28
  # Pan
16
- polygon(c(a$genomes, rev(a$genomes)), c(a$pan_q1, rev(a$pan_q3)),
17
- border=NA, col=rgb(96, 11, 64, 128/2, max=255))
18
- lines(a$genomes, a$pan_avg, col=rgb(96,11,64,max=255), lty=2)
19
- lines(a$genomes, a$pan_q2, col=rgb(96,11,64,max=255), lty=1)
29
+ polygon(
30
+ c(a$genomes, rev(a$genomes)), c(a$pan_q1, rev(a$pan_q3))/1e3,
31
+ border = NA, col = rgb(96, 11, 64, 256/4, max = 255)
32
+ )
33
+ lines(a$genomes, a$pan_avg/1e3, col = col[1], lty = 2)
34
+ lines(a$genomes, a$pan_q2/1e3, col = col[1], lty = 1)
35
+
20
36
  # Legend
21
- legend("topleft",
22
- legend=c("pangenome","core genome","Inter-Quartile","Median","Average"),
23
- pch=c(16,16,15,NA,NA),lty=c(NA,NA,NA,1,2), pt.cex=c(1,1,2,NA,NA),
24
- col=c(rgb(96,11,64,max=255), rgb(0,121,166,max=255),
25
- rgb(0.5,0.5,0.5,166/255), rep(rgb(0.5,0.5,0.5),2)), bty="n")
37
+ legend <- c("pangenome", "core genome", "Inter-Quartile", "Median", "Average")
38
+ legend(
39
+ "topleft", legend = legend, col = col, bty = "n",
40
+ pch = c(16, 16, 15, NA, NA),
41
+ lty = c(NA, NA, NA, 1, 2),
42
+ pt.cex = c(1, 1, 2, NA, NA),
43
+ )
26
44
  dev.off()
27
45
  }
28
46
 
29
47
  plot_core_pan(argv[1], argv[2])
48
+
@@ -111,12 +111,17 @@ module MiGA::DistanceRunner::Commands
111
111
  return unless File.size?(f1)
112
112
 
113
113
  # Run FastANI
114
+ empty = true
114
115
  File.open(f2 = tmp_file, 'w') do |fh|
115
116
  targets.each do |target|
116
117
  target_asm = target&.result(:assembly)&.file_path(:largecontigs)
117
- fh.puts target_asm if target_asm
118
+ if target_asm
119
+ fh.puts target_asm
120
+ empty = false
121
+ end
118
122
  end
119
123
  end
124
+ return if empty
120
125
  run_cmd <<~CMD
121
126
  fastANI -q "#{f1}" --rl "#{f2}" -t #{opts[:thr]} \
122
127
  -o "#{f3 = tmp_file}"
@@ -33,6 +33,10 @@ module MiGA::DistanceRunner::Pipeline
33
33
 
34
34
  # Builds a tree with all visited medoids from any classification level
35
35
  def build_medoids_tree(metric)
36
+ # TODO Reduce impact and bring back the medoids tree
37
+ $stderr.puts 'Bypassing medoids tree'
38
+ return
39
+
36
40
  $stderr.puts "Building medoids tree (metric = #{metric})"
37
41
  db = query_db(metric)
38
42
  return unless File.size? db
data/utils/ref-tree.R CHANGED
@@ -5,38 +5,43 @@
5
5
  #
6
6
 
7
7
  #= Load stuff
8
- argv <- commandArgs(trailingOnly=T)
8
+ argv <- commandArgs(trailingOnly = TRUE)
9
9
  suppressPackageStartupMessages(library(ape))
10
- if(Sys.getenv('MIGA') == ''){
10
+ if (Sys.getenv("MIGA") == "") {
11
11
  suppressPackageStartupMessages(library(enveomics.R))
12
- }else{
13
- source(file.path(Sys.getenv('MIGA'),
14
- 'utils', 'enveomics', 'enveomics.R', 'R', 'df2dist.R'))
12
+ } else {
13
+ source(
14
+ file.path(
15
+ Sys.getenv("MIGA"), "utils", "enveomics", "enveomics.R", "R", "df2dist.R"
16
+ )
17
+ )
15
18
  }
16
19
  inst <- c("phangorn", "phytools") %in% rownames(installed.packages())
17
- if(inst[1]){
20
+ if (inst[1]) {
18
21
  suppressPackageStartupMessages(library(phangorn))
19
22
  reroot.fun <- midpoint
20
- }else if(inst[2]){
23
+ } else if (inst[2]) {
21
24
  suppressPackageStartupMessages(library(phytools))
22
25
  reroot.fun <- midpoint.root
23
- }else{
26
+ } else {
24
27
  reroot.fun <- function(x) return(x)
25
28
  }
26
29
 
27
30
  #= Main function
28
31
  ref_tree <- function(ani_file, out_base, q_dataset) {
29
- a <- read.table(ani_file, sep="\t", header=TRUE, as.is=TRUE)
30
- ani.d <- enve.df2dist(a[,1:3], default.d=0.9, max.sim=100)
32
+ a <- read.table(ani_file, sep = "\t", header = TRUE, as.is = TRUE)
33
+ ani.d <- enve.df2dist(a[, 1:3], default.d = 0.9, max.sim = 100)
31
34
  ani.ph <- reroot.fun(bionj(ani.d))
32
- write.tree(ani.ph, paste(out_base, ".nwk", sep=""))
33
- pdf(paste(out_base, ".nwk.pdf", sep=""), 7, 7)
34
- plot(ani.ph, cex=1/3, type='fan',
35
- tip.color=c('red', 'black')[ifelse(ani.ph$tip.label==q_dataset, 1, 2)])
35
+ write.tree(ani.ph, paste(out_base, ".nwk", sep = ""))
36
+ pdf(paste(out_base, ".nwk.pdf", sep = ""), 7, 7)
37
+ plot(
38
+ ani.ph, cex = 1/3, type = "fan",
39
+ tip.color = c("red", "black")[ifelse(ani.ph$tip.label == q_dataset, 1, 2)]
40
+ )
36
41
  add.scale.bar()
37
42
  dev.off()
38
43
  }
39
44
 
40
45
  #= Main
41
- ref_tree(ani_file=argv[1], out_base=argv[2], q_dataset=argv[3])
46
+ ref_tree(ani_file = argv[1], out_base = argv[2], q_dataset = argv[3])
42
47
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miga-base
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1.0
4
+ version: 1.2.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luis M. Rodriguez-R
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-12 00:00:00.000000000 Z
11
+ date: 2022-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: daemons