miga-base 0.7.24.0 → 0.7.26.0

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 (295) hide show
  1. checksums.yaml +4 -4
  2. data/lib/miga/cli/action/add.rb +9 -6
  3. data/lib/miga/cli/action/derep_wf.rb +1 -1
  4. data/lib/miga/cli/action/index_wf.rb +4 -2
  5. data/lib/miga/cli/action/init.rb +83 -68
  6. data/lib/miga/cli/action/init/files_helper.rb +2 -1
  7. data/lib/miga/cli/action/option.rb +21 -2
  8. data/lib/miga/cli/action/preproc_wf.rb +7 -5
  9. data/lib/miga/cli/action/wf.rb +40 -24
  10. data/lib/miga/cli/base.rb +16 -5
  11. data/lib/miga/common/with_option.rb +1 -1
  12. data/lib/miga/dataset/result.rb +2 -1
  13. data/lib/miga/project/base.rb +1 -1
  14. data/lib/miga/result.rb +18 -15
  15. data/lib/miga/version.rb +2 -2
  16. data/scripts/essential_genes.bash +17 -1
  17. data/scripts/miga.bash +8 -2
  18. data/test/lair_test.rb +1 -2
  19. data/test/result_test.rb +22 -0
  20. data/utils/distance/base.rb +9 -0
  21. data/utils/distance/commands.rb +183 -81
  22. data/utils/distance/database.rb +68 -9
  23. data/utils/distance/pipeline.rb +14 -18
  24. data/utils/distance/runner.rb +17 -30
  25. data/utils/distance/temporal.rb +4 -2
  26. data/utils/distances.rb +2 -2
  27. data/utils/requirements.txt +5 -5
  28. metadata +5 -272
  29. data/utils/enveomics/Docs/recplot2.md +0 -244
  30. data/utils/enveomics/Examples/aai-matrix.bash +0 -66
  31. data/utils/enveomics/Examples/ani-matrix.bash +0 -66
  32. data/utils/enveomics/Examples/essential-phylogeny.bash +0 -105
  33. data/utils/enveomics/Examples/unus-genome-phylogeny.bash +0 -100
  34. data/utils/enveomics/LICENSE.txt +0 -73
  35. data/utils/enveomics/Makefile +0 -52
  36. data/utils/enveomics/Manifest/Tasks/aasubs.json +0 -103
  37. data/utils/enveomics/Manifest/Tasks/blasttab.json +0 -786
  38. data/utils/enveomics/Manifest/Tasks/distances.json +0 -161
  39. data/utils/enveomics/Manifest/Tasks/fasta.json +0 -766
  40. data/utils/enveomics/Manifest/Tasks/fastq.json +0 -243
  41. data/utils/enveomics/Manifest/Tasks/graphics.json +0 -126
  42. data/utils/enveomics/Manifest/Tasks/mapping.json +0 -67
  43. data/utils/enveomics/Manifest/Tasks/ogs.json +0 -382
  44. data/utils/enveomics/Manifest/Tasks/other.json +0 -829
  45. data/utils/enveomics/Manifest/Tasks/remote.json +0 -355
  46. data/utils/enveomics/Manifest/Tasks/sequence-identity.json +0 -501
  47. data/utils/enveomics/Manifest/Tasks/tables.json +0 -308
  48. data/utils/enveomics/Manifest/Tasks/trees.json +0 -68
  49. data/utils/enveomics/Manifest/Tasks/variants.json +0 -111
  50. data/utils/enveomics/Manifest/categories.json +0 -156
  51. data/utils/enveomics/Manifest/examples.json +0 -154
  52. data/utils/enveomics/Manifest/tasks.json +0 -4
  53. data/utils/enveomics/Pipelines/assembly.pbs/CONFIG.mock.bash +0 -69
  54. data/utils/enveomics/Pipelines/assembly.pbs/FastA.N50.pl +0 -1
  55. data/utils/enveomics/Pipelines/assembly.pbs/FastA.filterN.pl +0 -1
  56. data/utils/enveomics/Pipelines/assembly.pbs/FastA.length.pl +0 -1
  57. data/utils/enveomics/Pipelines/assembly.pbs/README.md +0 -189
  58. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-2.bash +0 -112
  59. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-3.bash +0 -23
  60. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-4.bash +0 -44
  61. data/utils/enveomics/Pipelines/assembly.pbs/RUNME.bash +0 -50
  62. data/utils/enveomics/Pipelines/assembly.pbs/kSelector.R +0 -37
  63. data/utils/enveomics/Pipelines/assembly.pbs/newbler.pbs +0 -68
  64. data/utils/enveomics/Pipelines/assembly.pbs/newbler_preparator.pl +0 -49
  65. data/utils/enveomics/Pipelines/assembly.pbs/soap.pbs +0 -80
  66. data/utils/enveomics/Pipelines/assembly.pbs/stats.pbs +0 -57
  67. data/utils/enveomics/Pipelines/assembly.pbs/velvet.pbs +0 -63
  68. data/utils/enveomics/Pipelines/blast.pbs/01.pbs.bash +0 -38
  69. data/utils/enveomics/Pipelines/blast.pbs/02.pbs.bash +0 -73
  70. data/utils/enveomics/Pipelines/blast.pbs/03.pbs.bash +0 -21
  71. data/utils/enveomics/Pipelines/blast.pbs/BlastTab.recover_job.pl +0 -72
  72. data/utils/enveomics/Pipelines/blast.pbs/CONFIG.mock.bash +0 -98
  73. data/utils/enveomics/Pipelines/blast.pbs/FastA.split.pl +0 -1
  74. data/utils/enveomics/Pipelines/blast.pbs/README.md +0 -127
  75. data/utils/enveomics/Pipelines/blast.pbs/RUNME.bash +0 -109
  76. data/utils/enveomics/Pipelines/blast.pbs/TASK.check.bash +0 -128
  77. data/utils/enveomics/Pipelines/blast.pbs/TASK.dry.bash +0 -16
  78. data/utils/enveomics/Pipelines/blast.pbs/TASK.eo.bash +0 -22
  79. data/utils/enveomics/Pipelines/blast.pbs/TASK.pause.bash +0 -26
  80. data/utils/enveomics/Pipelines/blast.pbs/TASK.run.bash +0 -89
  81. data/utils/enveomics/Pipelines/blast.pbs/sentinel.pbs.bash +0 -29
  82. data/utils/enveomics/Pipelines/idba.pbs/README.md +0 -49
  83. data/utils/enveomics/Pipelines/idba.pbs/RUNME.bash +0 -95
  84. data/utils/enveomics/Pipelines/idba.pbs/run.pbs +0 -56
  85. data/utils/enveomics/Pipelines/trim.pbs/README.md +0 -54
  86. data/utils/enveomics/Pipelines/trim.pbs/RUNME.bash +0 -70
  87. data/utils/enveomics/Pipelines/trim.pbs/run.pbs +0 -130
  88. data/utils/enveomics/README.md +0 -42
  89. data/utils/enveomics/Scripts/AAsubs.log2ratio.rb +0 -171
  90. data/utils/enveomics/Scripts/Aln.cat.rb +0 -163
  91. data/utils/enveomics/Scripts/Aln.convert.pl +0 -35
  92. data/utils/enveomics/Scripts/AlphaDiversity.pl +0 -152
  93. data/utils/enveomics/Scripts/BedGraph.tad.rb +0 -93
  94. data/utils/enveomics/Scripts/BedGraph.window.rb +0 -71
  95. data/utils/enveomics/Scripts/BlastPairwise.AAsubs.pl +0 -102
  96. data/utils/enveomics/Scripts/BlastTab.addlen.rb +0 -63
  97. data/utils/enveomics/Scripts/BlastTab.advance.bash +0 -48
  98. data/utils/enveomics/Scripts/BlastTab.best_hit_sorted.pl +0 -55
  99. data/utils/enveomics/Scripts/BlastTab.catsbj.pl +0 -104
  100. data/utils/enveomics/Scripts/BlastTab.cogCat.rb +0 -76
  101. data/utils/enveomics/Scripts/BlastTab.filter.pl +0 -47
  102. data/utils/enveomics/Scripts/BlastTab.kegg_pep2path_rest.pl +0 -194
  103. data/utils/enveomics/Scripts/BlastTab.metaxaPrep.pl +0 -104
  104. data/utils/enveomics/Scripts/BlastTab.pairedHits.rb +0 -157
  105. data/utils/enveomics/Scripts/BlastTab.recplot2.R +0 -48
  106. data/utils/enveomics/Scripts/BlastTab.seqdepth.pl +0 -86
  107. data/utils/enveomics/Scripts/BlastTab.seqdepth_ZIP.pl +0 -119
  108. data/utils/enveomics/Scripts/BlastTab.seqdepth_nomedian.pl +0 -86
  109. data/utils/enveomics/Scripts/BlastTab.subsample.pl +0 -47
  110. data/utils/enveomics/Scripts/BlastTab.sumPerHit.pl +0 -114
  111. data/utils/enveomics/Scripts/BlastTab.taxid2taxrank.pl +0 -90
  112. data/utils/enveomics/Scripts/BlastTab.topHits_sorted.rb +0 -101
  113. data/utils/enveomics/Scripts/Chao1.pl +0 -97
  114. data/utils/enveomics/Scripts/CharTable.classify.rb +0 -234
  115. data/utils/enveomics/Scripts/EBIseq2tax.rb +0 -83
  116. data/utils/enveomics/Scripts/FastA.N50.pl +0 -56
  117. data/utils/enveomics/Scripts/FastA.extract.rb +0 -152
  118. data/utils/enveomics/Scripts/FastA.filter.pl +0 -52
  119. data/utils/enveomics/Scripts/FastA.filterLen.pl +0 -28
  120. data/utils/enveomics/Scripts/FastA.filterN.pl +0 -60
  121. data/utils/enveomics/Scripts/FastA.fragment.rb +0 -92
  122. data/utils/enveomics/Scripts/FastA.gc.pl +0 -42
  123. data/utils/enveomics/Scripts/FastA.interpose.pl +0 -93
  124. data/utils/enveomics/Scripts/FastA.length.pl +0 -38
  125. data/utils/enveomics/Scripts/FastA.mask.rb +0 -89
  126. data/utils/enveomics/Scripts/FastA.per_file.pl +0 -36
  127. data/utils/enveomics/Scripts/FastA.qlen.pl +0 -57
  128. data/utils/enveomics/Scripts/FastA.rename.pl +0 -65
  129. data/utils/enveomics/Scripts/FastA.revcom.pl +0 -23
  130. data/utils/enveomics/Scripts/FastA.sample.rb +0 -83
  131. data/utils/enveomics/Scripts/FastA.slider.pl +0 -85
  132. data/utils/enveomics/Scripts/FastA.split.pl +0 -55
  133. data/utils/enveomics/Scripts/FastA.split.rb +0 -79
  134. data/utils/enveomics/Scripts/FastA.subsample.pl +0 -131
  135. data/utils/enveomics/Scripts/FastA.tag.rb +0 -65
  136. data/utils/enveomics/Scripts/FastA.wrap.rb +0 -48
  137. data/utils/enveomics/Scripts/FastQ.filter.pl +0 -54
  138. data/utils/enveomics/Scripts/FastQ.interpose.pl +0 -90
  139. data/utils/enveomics/Scripts/FastQ.offset.pl +0 -90
  140. data/utils/enveomics/Scripts/FastQ.split.pl +0 -53
  141. data/utils/enveomics/Scripts/FastQ.tag.rb +0 -63
  142. data/utils/enveomics/Scripts/FastQ.test-error.rb +0 -81
  143. data/utils/enveomics/Scripts/FastQ.toFastA.awk +0 -24
  144. data/utils/enveomics/Scripts/GFF.catsbj.pl +0 -127
  145. data/utils/enveomics/Scripts/GenBank.add_fields.rb +0 -84
  146. data/utils/enveomics/Scripts/HMM.essential.rb +0 -351
  147. data/utils/enveomics/Scripts/HMM.haai.rb +0 -168
  148. data/utils/enveomics/Scripts/HMMsearch.extractIds.rb +0 -83
  149. data/utils/enveomics/Scripts/JPlace.distances.rb +0 -88
  150. data/utils/enveomics/Scripts/JPlace.to_iToL.rb +0 -320
  151. data/utils/enveomics/Scripts/M5nr.getSequences.rb +0 -81
  152. data/utils/enveomics/Scripts/MeTaxa.distribution.pl +0 -198
  153. data/utils/enveomics/Scripts/MyTaxa.fragsByTax.pl +0 -35
  154. data/utils/enveomics/Scripts/MyTaxa.seq-taxrank.rb +0 -49
  155. data/utils/enveomics/Scripts/NCBIacc2tax.rb +0 -92
  156. data/utils/enveomics/Scripts/Newick.autoprune.R +0 -27
  157. data/utils/enveomics/Scripts/RAxML-EPA.to_iToL.pl +0 -228
  158. data/utils/enveomics/Scripts/RecPlot2.compareIdentities.R +0 -32
  159. data/utils/enveomics/Scripts/RefSeq.download.bash +0 -48
  160. data/utils/enveomics/Scripts/SRA.download.bash +0 -57
  161. data/utils/enveomics/Scripts/TRIBS.plot-test.R +0 -36
  162. data/utils/enveomics/Scripts/TRIBS.test.R +0 -39
  163. data/utils/enveomics/Scripts/Table.barplot.R +0 -31
  164. data/utils/enveomics/Scripts/Table.df2dist.R +0 -30
  165. data/utils/enveomics/Scripts/Table.filter.pl +0 -61
  166. data/utils/enveomics/Scripts/Table.merge.pl +0 -77
  167. data/utils/enveomics/Scripts/Table.replace.rb +0 -69
  168. data/utils/enveomics/Scripts/Table.round.rb +0 -63
  169. data/utils/enveomics/Scripts/Table.split.pl +0 -57
  170. data/utils/enveomics/Scripts/Taxonomy.silva2ncbi.rb +0 -227
  171. data/utils/enveomics/Scripts/VCF.KaKs.rb +0 -147
  172. data/utils/enveomics/Scripts/VCF.SNPs.rb +0 -88
  173. data/utils/enveomics/Scripts/aai.rb +0 -418
  174. data/utils/enveomics/Scripts/ani.rb +0 -362
  175. data/utils/enveomics/Scripts/clust.rand.rb +0 -102
  176. data/utils/enveomics/Scripts/gi2tax.rb +0 -103
  177. data/utils/enveomics/Scripts/in_silico_GA_GI.pl +0 -96
  178. data/utils/enveomics/Scripts/lib/data/dupont_2012_essential.hmm.gz +0 -0
  179. data/utils/enveomics/Scripts/lib/data/lee_2019_essential.hmm.gz +0 -0
  180. data/utils/enveomics/Scripts/lib/enveomics.R +0 -1
  181. data/utils/enveomics/Scripts/lib/enveomics_rb/enveomics.rb +0 -24
  182. data/utils/enveomics/Scripts/lib/enveomics_rb/jplace.rb +0 -253
  183. data/utils/enveomics/Scripts/lib/enveomics_rb/og.rb +0 -182
  184. data/utils/enveomics/Scripts/lib/enveomics_rb/remote_data.rb +0 -74
  185. data/utils/enveomics/Scripts/lib/enveomics_rb/seq_range.rb +0 -237
  186. data/utils/enveomics/Scripts/lib/enveomics_rb/stat.rb +0 -30
  187. data/utils/enveomics/Scripts/lib/enveomics_rb/vcf.rb +0 -135
  188. data/utils/enveomics/Scripts/ogs.annotate.rb +0 -88
  189. data/utils/enveomics/Scripts/ogs.core-pan.rb +0 -160
  190. data/utils/enveomics/Scripts/ogs.extract.rb +0 -125
  191. data/utils/enveomics/Scripts/ogs.mcl.rb +0 -186
  192. data/utils/enveomics/Scripts/ogs.rb +0 -104
  193. data/utils/enveomics/Scripts/ogs.stats.rb +0 -131
  194. data/utils/enveomics/Scripts/rbm.rb +0 -146
  195. data/utils/enveomics/Tests/Makefile +0 -10
  196. data/utils/enveomics/Tests/Mgen_M2288.faa +0 -3189
  197. data/utils/enveomics/Tests/Mgen_M2288.fna +0 -8282
  198. data/utils/enveomics/Tests/Mgen_M2321.fna +0 -8288
  199. data/utils/enveomics/Tests/Nequ_Kin4M.faa +0 -2970
  200. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.tribs.Rdata +0 -0
  201. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.txt +0 -7
  202. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai-mat.tsv +0 -17
  203. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai.tsv +0 -137
  204. data/utils/enveomics/Tests/a_mg.cds-go.blast.tsv +0 -123
  205. data/utils/enveomics/Tests/a_mg.reads-cds.blast.tsv +0 -200
  206. data/utils/enveomics/Tests/a_mg.reads-cds.counts.tsv +0 -55
  207. data/utils/enveomics/Tests/alkB.nwk +0 -1
  208. data/utils/enveomics/Tests/anthrax-cansnp-data.tsv +0 -13
  209. data/utils/enveomics/Tests/anthrax-cansnp-key.tsv +0 -17
  210. data/utils/enveomics/Tests/hiv1.faa +0 -59
  211. data/utils/enveomics/Tests/hiv1.fna +0 -134
  212. data/utils/enveomics/Tests/hiv2.faa +0 -70
  213. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv +0 -233
  214. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.lim +0 -1
  215. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.rec +0 -233
  216. data/utils/enveomics/Tests/phyla_counts.tsv +0 -10
  217. data/utils/enveomics/Tests/primate_lentivirus.ogs +0 -11
  218. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv1.rbm +0 -9
  219. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv2.rbm +0 -8
  220. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-siv.rbm +0 -6
  221. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-hiv2.rbm +0 -9
  222. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-siv.rbm +0 -6
  223. data/utils/enveomics/Tests/primate_lentivirus.rbm/siv-siv.rbm +0 -6
  224. data/utils/enveomics/build_enveomics_r.bash +0 -45
  225. data/utils/enveomics/enveomics.R/DESCRIPTION +0 -31
  226. data/utils/enveomics/enveomics.R/NAMESPACE +0 -39
  227. data/utils/enveomics/enveomics.R/R/autoprune.R +0 -155
  228. data/utils/enveomics/enveomics.R/R/barplot.R +0 -184
  229. data/utils/enveomics/enveomics.R/R/cliopts.R +0 -135
  230. data/utils/enveomics/enveomics.R/R/df2dist.R +0 -154
  231. data/utils/enveomics/enveomics.R/R/growthcurve.R +0 -331
  232. data/utils/enveomics/enveomics.R/R/recplot.R +0 -354
  233. data/utils/enveomics/enveomics.R/R/recplot2.R +0 -1631
  234. data/utils/enveomics/enveomics.R/R/tribs.R +0 -583
  235. data/utils/enveomics/enveomics.R/R/utils.R +0 -50
  236. data/utils/enveomics/enveomics.R/README.md +0 -80
  237. data/utils/enveomics/enveomics.R/data/growth.curves.rda +0 -0
  238. data/utils/enveomics/enveomics.R/data/phyla.counts.rda +0 -0
  239. data/utils/enveomics/enveomics.R/man/cash-enve.GrowthCurve-method.Rd +0 -17
  240. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2-method.Rd +0 -17
  241. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2.Peak-method.Rd +0 -17
  242. data/utils/enveomics/enveomics.R/man/enve.GrowthCurve-class.Rd +0 -25
  243. data/utils/enveomics/enveomics.R/man/enve.TRIBS-class.Rd +0 -46
  244. data/utils/enveomics/enveomics.R/man/enve.TRIBS.merge.Rd +0 -23
  245. data/utils/enveomics/enveomics.R/man/enve.TRIBStest-class.Rd +0 -47
  246. data/utils/enveomics/enveomics.R/man/enve.__prune.iter.Rd +0 -23
  247. data/utils/enveomics/enveomics.R/man/enve.__prune.reduce.Rd +0 -23
  248. data/utils/enveomics/enveomics.R/man/enve.__tribs.Rd +0 -32
  249. data/utils/enveomics/enveomics.R/man/enve.barplot.Rd +0 -91
  250. data/utils/enveomics/enveomics.R/man/enve.cliopts.Rd +0 -57
  251. data/utils/enveomics/enveomics.R/man/enve.col.alpha.Rd +0 -24
  252. data/utils/enveomics/enveomics.R/man/enve.col2alpha.Rd +0 -19
  253. data/utils/enveomics/enveomics.R/man/enve.df2dist.Rd +0 -39
  254. data/utils/enveomics/enveomics.R/man/enve.df2dist.group.Rd +0 -38
  255. data/utils/enveomics/enveomics.R/man/enve.df2dist.list.Rd +0 -40
  256. data/utils/enveomics/enveomics.R/man/enve.growthcurve.Rd +0 -67
  257. data/utils/enveomics/enveomics.R/man/enve.prune.dist.Rd +0 -37
  258. data/utils/enveomics/enveomics.R/man/enve.recplot.Rd +0 -122
  259. data/utils/enveomics/enveomics.R/man/enve.recplot2-class.Rd +0 -45
  260. data/utils/enveomics/enveomics.R/man/enve.recplot2.ANIr.Rd +0 -24
  261. data/utils/enveomics/enveomics.R/man/enve.recplot2.Rd +0 -68
  262. data/utils/enveomics/enveomics.R/man/enve.recplot2.__counts.Rd +0 -25
  263. data/utils/enveomics/enveomics.R/man/enve.recplot2.__peakHist.Rd +0 -21
  264. data/utils/enveomics/enveomics.R/man/enve.recplot2.__whichClosestPeak.Rd +0 -19
  265. data/utils/enveomics/enveomics.R/man/enve.recplot2.changeCutoff.Rd +0 -19
  266. data/utils/enveomics/enveomics.R/man/enve.recplot2.compareIdentities.Rd +0 -41
  267. data/utils/enveomics/enveomics.R/man/enve.recplot2.coordinates.Rd +0 -29
  268. data/utils/enveomics/enveomics.R/man/enve.recplot2.corePeak.Rd +0 -18
  269. data/utils/enveomics/enveomics.R/man/enve.recplot2.extractWindows.Rd +0 -40
  270. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.Rd +0 -36
  271. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_e.Rd +0 -19
  272. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_m.Rd +0 -19
  273. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__emauto_one.Rd +0 -27
  274. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mow_one.Rd +0 -41
  275. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mower.Rd +0 -17
  276. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.em.Rd +0 -43
  277. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.emauto.Rd +0 -37
  278. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.mower.Rd +0 -74
  279. data/utils/enveomics/enveomics.R/man/enve.recplot2.peak-class.Rd +0 -59
  280. data/utils/enveomics/enveomics.R/man/enve.recplot2.seqdepth.Rd +0 -27
  281. data/utils/enveomics/enveomics.R/man/enve.recplot2.windowDepthThreshold.Rd +0 -32
  282. data/utils/enveomics/enveomics.R/man/enve.tribs.Rd +0 -59
  283. data/utils/enveomics/enveomics.R/man/enve.tribs.test.Rd +0 -28
  284. data/utils/enveomics/enveomics.R/man/enve.truncate.Rd +0 -27
  285. data/utils/enveomics/enveomics.R/man/growth.curves.Rd +0 -14
  286. data/utils/enveomics/enveomics.R/man/phyla.counts.Rd +0 -13
  287. data/utils/enveomics/enveomics.R/man/plot.enve.GrowthCurve.Rd +0 -63
  288. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBS.Rd +0 -38
  289. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBStest.Rd +0 -38
  290. data/utils/enveomics/enveomics.R/man/plot.enve.recplot2.Rd +0 -111
  291. data/utils/enveomics/enveomics.R/man/summary.enve.GrowthCurve.Rd +0 -19
  292. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBS.Rd +0 -19
  293. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBStest.Rd +0 -19
  294. data/utils/enveomics/globals.mk +0 -8
  295. data/utils/enveomics/manifest.json +0 -9
data/lib/miga/cli/base.rb CHANGED
@@ -88,19 +88,30 @@ module MiGA::Cli::Base
88
88
  @@EXECS = @@TASK_DESC.keys
89
89
 
90
90
  @@FILE_REGEXP =
91
- %r{^(?:.*/)?(.+?)(\.[A-Z]*([12]|Reads|Contigs))?(\.f[nastq]+)?$}i
91
+ %r{^(?:.*/)?(.+?)(\.[A-Z]*(Reads|Contigs))?(\.f[nastq]+)?(\.gz)?$}i
92
+
93
+ @@PAIRED_FILE_REGEXP =
94
+ %r{^(?:.*/)?(.+?)(\.[A-Z]*([12]|Reads))?(\.f[nastq]+)?(\.gz)?$}i
92
95
  end
93
96
 
94
97
  class MiGA::Cli < MiGA::MiGA
95
98
  include MiGA::Cli::Base
96
99
 
97
100
  class << self
98
- def TASK_DESC; @@TASK_DESC end
101
+ def TASK_DESC
102
+ @@TASK_DESC
103
+ end
99
104
 
100
- def TASK_ALIAS; @@TASK_ALIAS end
105
+ def TASK_ALIAS
106
+ @@TASK_ALIAS
107
+ end
101
108
 
102
- def EXECS; @@EXECS end
109
+ def EXECS
110
+ @@EXECS
111
+ end
103
112
 
104
- def FILE_REGEXP; @@FILE_REGEXP end
113
+ def FILE_REGEXP(paired = false)
114
+ paired ? @@PAIRED_FILE_REGEXP : @@FILE_REGEXP
115
+ end
105
116
  end
106
117
  end
@@ -53,7 +53,7 @@ module MiGA::Common::WithOption
53
53
  end
54
54
 
55
55
  if opt[:in] && !opt[:in].include?(value)
56
- raise "Value out of range for #{key}: #{value}, not #{opt[:in]}"
56
+ raise "Value out of range for #{key}: #{value}, not in #{opt[:in]}"
57
57
  end
58
58
 
59
59
  value
@@ -276,7 +276,8 @@ module MiGA::Dataset::Result
276
276
  ess_genes: '.ess.faa',
277
277
  collection: '.ess',
278
278
  report: '.ess/log',
279
- alignments: '.ess/proteins.aln'
279
+ alignments: '.ess/proteins.aln',
280
+ fastaai_index: '.faix.db.gz'
280
281
  )
281
282
  end
282
283
 
@@ -132,7 +132,7 @@ module MiGA::Project::Base
132
132
  haai_p: {
133
133
  desc: 'Value of aai.rb -p on hAAI', type: String,
134
134
  default: proc { |project| project.clade? ? 'no' : 'blast+' },
135
- in: %w[blast+ blast blat diamond no]
135
+ in: %w[fastaai blast+ blast blat diamond no]
136
136
  },
137
137
  aai_p: {
138
138
  desc: 'Value of aai.rb -p on AAI', default: 'blast+', type: String,
data/lib/miga/result.rb CHANGED
@@ -1,5 +1,4 @@
1
- # @package MiGA
2
- # @license Artistic-2.0
1
+ # frozen_string_literal: true
3
2
 
4
3
  require 'miga/result/dates'
5
4
  require 'miga/result/source'
@@ -29,13 +28,17 @@ class MiGA::Result < MiGA::MiGA
29
28
  MiGA::Result.new(path)
30
29
  end
31
30
 
32
- def create(path, force = false, &blk)
31
+ ##
32
+ # Check if +path+ describes a result and otherwise create
33
+ # it using the passed block. If +force+, ignore existing
34
+ # JSON in +path+ if any.
35
+ def create(path, force = false)
33
36
  FileUtils.rm(path) if force && File.exist?(path)
34
- r_pre = self.load(path)
37
+ r_pre = load(path)
35
38
  return r_pre unless r_pre.nil?
36
39
 
37
40
  yield
38
- self.load(path)
41
+ load(path)
39
42
  end
40
43
  end
41
44
 
@@ -49,7 +52,7 @@ class MiGA::Result < MiGA::MiGA
49
52
  # Load or create the MiGA::Result described by the JSON file +path+
50
53
  def initialize(path)
51
54
  @path = File.absolute_path(path)
52
- MiGA::Result.exist?(@path) ? self.load : create
55
+ MiGA::Result.exist?(@path) ? load : create
53
56
  end
54
57
 
55
58
  ##
@@ -162,7 +165,7 @@ class MiGA::Result < MiGA::MiGA
162
165
  File.unlink s
163
166
  end
164
167
  MiGA::Json.generate(data, path)
165
- self.load
168
+ load
166
169
  end
167
170
 
168
171
  ##
@@ -182,10 +185,9 @@ class MiGA::Result < MiGA::MiGA
182
185
  # Unlink result by removing the .done and .start timestamps and the
183
186
  # .json descriptor, but don't remove any other associated files
184
187
  def unlink
185
- %i(start done).each do |i|
186
- f = path(i) and File.exists?(f) and File.unlink(f)
188
+ %i[start done json].each do |i|
189
+ f = path(i) and File.exist?(f) and File.unlink(f)
187
190
  end
188
- File.unlink path
189
191
  end
190
192
 
191
193
  ##
@@ -201,13 +203,14 @@ class MiGA::Result < MiGA::MiGA
201
203
 
202
204
  @data[:files] ||= {}
203
205
  self[:files].each do |k, files|
204
- files = [files] unless files.kind_of? Array
206
+ files = [files] unless files.is_a? Array
205
207
  files.each do |file|
206
208
  case blk.arity
207
- when 1; blk.call(file)
208
- when 2; blk.call(k, file)
209
- when 3; blk.call(k, file, File.expand_path(file, dir))
210
- else; raise "Wrong number of arguments: #{blk.arity} for 1..3"
209
+ when 1 then blk.call(file)
210
+ when 2 then blk.call(k, file)
211
+ when 3 then blk.call(k, file, File.expand_path(file, dir))
212
+ else
213
+ raise "Wrong number of arguments: #{blk.arity} for 1..3"
211
214
  end
212
215
  end
213
216
  end
data/lib/miga/version.rb CHANGED
@@ -10,7 +10,7 @@ module MiGA
10
10
  # - Float representing the major.minor version.
11
11
  # - Integer representing gem releases of the current version.
12
12
  # - Integer representing minor changes that require new version number.
13
- VERSION = [0.7, 24, 0].freeze
13
+ VERSION = [0.7, 26, 0].freeze
14
14
 
15
15
  ##
16
16
  # Nickname for the current major.minor version.
@@ -18,7 +18,7 @@ module MiGA
18
18
 
19
19
  ##
20
20
  # Date of the current gem release.
21
- VERSION_DATE = Date.new(2021, 2, 16)
21
+ VERSION_DATE = Date.new(2021, 3, 1)
22
22
 
23
23
  ##
24
24
  # Reference of MiGA.
@@ -28,13 +28,29 @@ COLL=$(miga option -P "$PROJECT" --key ess_coll)
28
28
  if [[ "$TYPE" == "metagenome" || "$TYPE" == "virome" ]] ; then
29
29
  FLAGS="--metagenome"
30
30
  else
31
- FLAGS="--alignments ${DATASET}.ess/proteins.aln"
31
+ FLAGS=""
32
32
  fi
33
33
  HMM.essential.rb \
34
34
  -i "$FAA" -o "${DATASET}.ess.faa" -m "${DATASET}.ess/" \
35
35
  -t "$CORES" -r "$DATASET" --collection "$COLL" $FLAGS \
36
36
  > "${DATASET}.ess/log"
37
37
 
38
+ # Index for FastAAI
39
+ NOMULTI=$(miga list_datasets -P "$PROJECT" -D "$DATASET" --no-multi \
40
+ | wc -l | awk '{print $1}')
41
+ if [[ "$NOMULTI" -eq "1" ]] ; then
42
+ if [[ "$FAA" == *.gz ]] ; then
43
+ gzip -cd "$FAA" > "${DATASET}.faix"
44
+ else
45
+ cp "$FAA" "${DATASET}.faix"
46
+ fi
47
+ FastAAI --qp "${DATASET}.faix" --output "${DATASET}.faix" \
48
+ --ext ".faix" --index --input-paths --all-vs-all --threads "$CORES"
49
+ rm "${DATASET}.faix"
50
+ rm "${DATASET}.faix.hmm"
51
+ rm "${DATASET}.faix.hmm.filt"
52
+ fi
53
+
38
54
  # Reduce files
39
55
  if exists "$DATASET".ess/*.faa ; then
40
56
  ( cd "${DATASET}.ess" \
data/scripts/miga.bash CHANGED
@@ -1,12 +1,17 @@
1
1
  #!/bin/bash
2
+
3
+ # Setup environment
2
4
  set -e
3
- #MIGA=${MIGA:-$(cd "$(dirname "$0")/.."; pwd)}
4
5
  MIGA_HOME=${MIGA_HOME:-"$HOME"}
6
+ SCRIPT=${SCRIPT:-$(basename "$0" .bash)}
5
7
  # shellcheck source=/dev/null
6
8
  . "$MIGA_HOME/.miga_rc"
9
+
10
+ # Ensure submodules are first in PATH
7
11
  export PATH="$MIGA/bin:$MIGA/utils/enveomics/Scripts:$PATH"
8
- SCRIPT=${SCRIPT:-$(basename "$0" .bash)}
12
+ export PATH="$MIGA/utils/FastAAI/FastAAI:$PATH"
9
13
 
14
+ # Ancillary functions
10
15
  function exists { [[ -e "$1" ]] ; }
11
16
  function fx_exists { [[ $(type -t "$1") == "function" ]] ; }
12
17
  function miga_start_project_step {
@@ -28,6 +33,7 @@ function miga_end_project_step {
28
33
  miga add_result -P "$PROJECT" -r "$SCRIPT" -f
29
34
  }
30
35
 
36
+ # Environment header
31
37
  if [[ "$SCRIPT" != "d" && "$SCRIPT" != "p" ]] ; then
32
38
  echo ""
33
39
  echo "######[ $SCRIPT ]######"
data/test/lair_test.rb CHANGED
@@ -75,10 +75,9 @@ class LairTest < Test::Unit::TestCase
75
75
  assert_predicate(d, :active?)
76
76
  end
77
77
 
78
- out = capture_stderr { lair.terminate_daemons }.string
78
+ out = capture_stderr { lair.terminate_daemons ; sleep(2) }.string
79
79
  assert_match(/Probing MiGA::Daemon/, out)
80
80
  assert_match(/Sending termination message/, out)
81
- sleep(2)
82
81
  assert_not_predicate(d, :active?)
83
82
 
84
83
  out = capture_stderr { assert { lair.daemon_loop } }.string
data/test/result_test.rb CHANGED
@@ -38,6 +38,28 @@ class ResultTest < Test::Unit::TestCase
38
38
  assert_instance_of(MiGA::Result, r)
39
39
  end
40
40
 
41
+ def test_unlink
42
+ r = project.add_result(:clade_finding)
43
+ path = r.path
44
+ done = r.path(:done)
45
+ data = r.file_path(:empty)
46
+ assert(File.exist?(path))
47
+ assert(File.exist?(done))
48
+ assert(File.exist?(data))
49
+ r.unlink
50
+ assert(!File.exist?(path))
51
+ assert(!File.exist?(done))
52
+ assert(File.exist?(data))
53
+ end
54
+
55
+ def test_remove
56
+ r = project.add_result(:clade_finding)
57
+ data = r.file_path(:empty)
58
+ assert(File.exist?(data))
59
+ r.remove!
60
+ assert(!File.exist?(data))
61
+ end
62
+
41
63
  def test_result_source
42
64
  r = dataset.add_result(:trimmed_reads)
43
65
  assert_equal(dataset.name, r.source.name)
@@ -2,4 +2,13 @@ require 'miga'
2
2
  require 'miga/tax_dist'
3
3
 
4
4
  class MiGA::DistanceRunner
5
+ require_relative 'temporal.rb'
6
+ require_relative 'database.rb'
7
+ require_relative 'commands.rb'
8
+ require_relative 'pipeline.rb'
9
+
10
+ include MiGA::DistanceRunner::Temporal
11
+ include MiGA::DistanceRunner::Database
12
+ include MiGA::DistanceRunner::Commands
13
+ include MiGA::DistanceRunner::Pipeline
5
14
  end
@@ -1,105 +1,207 @@
1
1
  module MiGA::DistanceRunner::Commands
2
- # Estimates or calculates AAI against +target+
3
- def aai(target)
4
- # Check if the request makes sense
5
- return nil if target.nil? || target.result(:essential_genes).nil?
6
-
7
- # Check if it's been calculated
8
- y = stored_value(target, :aai)
9
- return y unless y.nil? || y.zero?
10
-
11
- # Try hAAI (except in clade projects)
12
- unless @ref_project.clade?
13
- y = haai(target)
14
- return y unless y.nil? || y.zero?
2
+ ##
3
+ # Estimates AAI against +targets+ using hAAI
4
+ def haai(targets)
5
+ puts "[#{Time.now}] hAAI: #{dataset.name} vs #{targets.size} targets"
6
+ empty_vals = targets.map { |_i| nil }
7
+ return empty_vals if opts[:haai_p] == 'no'
8
+
9
+ # Launch comparisons
10
+ sbj = pending_targets(targets, :haai)
11
+ unless sbj.empty?
12
+ opts[:haai_p] == 'fastaai' ? fastaai_cmd(sbj) : haai_cmd(sbj)
15
13
  end
16
- # Full AAI
17
- aai_cmd(
18
- tmp_file('proteins.fa'), target.result(:cds).file_path(:proteins),
19
- dataset.name, target.name, tmp_dbs[:aai]
20
- ).tap { checkpoint :aai }
14
+
15
+ # Return AAI estimates from the database
16
+ batch_values_from_db(:aai, targets.map { |i| i&.name })
21
17
  end
22
18
 
23
19
  ##
24
- # Estimates AAI against +target+ using hAAI
25
- def haai(target)
26
- return nil if opts[:haai_p] == 'no'
27
-
28
- haai = aai_cmd(tmp_file('ess_genes.fa'),
29
- target.result(:essential_genes).file_path(:ess_genes),
30
- dataset.name, target.name, tmp_dbs[:haai],
31
- aai_save_rbm: 'no-save-rbm', aai_p: opts[:haai_p])
32
- checkpoint :haai
33
- return nil if haai.nil? || haai.zero? || haai > 90.0
34
-
35
- aai = 100.0 - Math.exp(2.435076 + 0.4275193 * Math.log(100.0 - haai))
36
- SQLite3::Database.new(tmp_dbs[:aai]) do |conn|
37
- conn.execute 'insert into aai values(?, ?, ?, 0, 0, 0)',
38
- [dataset.name, target.name, aai]
20
+ # Estimates or calculates AAI against +targets+
21
+ def aai(targets)
22
+ puts "[#{Time.now}] AAI: #{dataset.name} vs #{targets.size} targets"
23
+
24
+ # Try hAAI first
25
+ haai(targets)
26
+
27
+ # Launch comparisons
28
+ pending_targets(targets, :aai).each do |target|
29
+ # Full AAI
30
+ target_cds = target.result(:cds).file_path(:proteins) or next
31
+ aairb_cmd(
32
+ tmp_file('proteins.fa'), target_cds,
33
+ dataset.name, target.name, tmp_dbs[:aai], checkpoint: :aai
34
+ )
39
35
  end
40
- checkpoint :aai
41
- aai
36
+
37
+ # Return AAI from the database
38
+ batch_values_from_db(:aai, targets.map { |i| i&.name })
42
39
  end
43
40
 
44
41
  ##
45
- # Calculates ANI against +target+
46
- def ani(target)
47
- # Check if the request makes sense
48
- t = tmp_file('largecontigs.fa')
49
- r = target.result(:assembly)
50
- return nil if r.nil? || !File.size?(t)
51
-
52
- # Check if it's been calculated
53
- y = stored_value(target, :ani)
54
- return y unless y.nil? || y.zero?
55
-
56
- # Run it
57
- ani_cmd(
58
- t, r.file_path(:largecontigs),
59
- dataset.name, target.name, tmp_dbs[:ani]
60
- ).tap { checkpoint :ani }
42
+ # Calculates ANI against +targets+
43
+ def ani(targets)
44
+ puts "[#{Time.now}] ANI: #{dataset.name} vs #{targets.size} targets"
45
+ empty_vals = targets.map { |_i| nil }
46
+ return empty_vals unless File.size?(tmp_file('largecontigs.fa'))
47
+
48
+ # Launch comparisons
49
+ sbj = pending_targets(targets, :ani)
50
+ unless sbj.empty?
51
+ opts[:ani_p] == 'fastani' ? fastani_cmd(sbj) : anirb_cmd(sbj)
52
+ end
53
+
54
+ # Return ANI from the database
55
+ batch_values_from_db(:ani, targets.map { |i| i&.name })
61
56
  end
62
57
 
63
58
  ##
64
- # Calculates and returns ANI against +target+ if AAI >= +aai_limit+.
65
- # Returns +nil+ otherwise
66
- def ani_after_aai(target, aai_limit = 85.0)
67
- aai = aai(target)
68
- (aai.nil? || aai < aai_limit) ? nil : ani(target)
59
+ # Calculates and returns ANI against +targets+ if AAI >= +aai_limit+.
60
+ # Note that ANI values may be returned for lower (or failing) AAIs if the
61
+ # value is already stored in the database
62
+ def ani_after_aai(targets, aai_limit = 85.0)
63
+ # Run AAI and select targets with AAI ≥ aai_limit
64
+ aai = aai(targets)
65
+ sbj = aai.each_with_index.map { |i, k| targets[k] if i&.> aai_limit }
66
+ sbj.compact!
67
+
68
+ # Run ANI
69
+ ani(sbj) unless sbj.empty?
70
+
71
+ # Return ANI from the database
72
+ batch_values_from_db(:ani, targets.map { |i| i&.name })
69
73
  end
70
74
 
71
75
  ##
72
76
  # Execute an AAI command
73
- def aai_cmd(f1, f2, n1, n2, db, o = {})
77
+ def aairb_cmd(f1, f2, n1, n2, db, o = {})
74
78
  o = opts.merge(o)
75
- v = `aai.rb -1 "#{f1}" -2 "#{f2}" -S "#{db}" \
76
- --name1 "#{n1}" --name2 "#{n2}" \
77
- -t "#{o[:thr]}" -a --lookup-first "--#{o[:aai_save_rbm]}" \
78
- -p "#{o[:aai_p]}"`.chomp
79
- (v.nil? || v.empty?) ? 0 : v.to_f
79
+ run_cmd <<~CMD
80
+ aai.rb -1 "#{f1}" -2 "#{f2}" -S "#{db}" \
81
+ --name1 "#{n1}" --name2 "#{n2}" \
82
+ -t "#{o[:thr]}" -a --#{'no-' unless o[:aai_save_rbm]}save-rbm \
83
+ -p "#{o[:aai_p]}"
84
+ CMD
85
+ ensure
86
+ checkpoint(o[:checkpoint]) if o[:checkpoint]
80
87
  end
81
88
 
82
89
  ##
83
- # Execute an ANI command
84
- def ani_cmd(f1, f2, n1, n2, db, o = {})
85
- o = opts.merge(o)
86
- v = nil
87
- if o[:ani_p] == 'fastani'
88
- out = `fastANI -r "#{f1}" -q "#{f2}" \
89
- -o /dev/stdout 2>/dev/null`.chomp.split(/\s+/)
90
- unless out.empty?
91
- SQLite3::Database.new(db) do |conn|
92
- conn.execute 'insert into ani values(?, ?, ?, 0, ?, ?)',
93
- [n1, n2, out[2], out[3], out[4]]
94
- end
90
+ # Execute an ani.rb command
91
+ def anirb_cmd(targets)
92
+ f1 = tmp_file('largecontigs.fa')
93
+ return unless File.size?(f1)
94
+
95
+ targets.each do |target|
96
+ target_asm = target&.result(:assembly)&.file_path(:largecontigs) or next
97
+ run_cmd <<~CMD
98
+ ani.rb -1 "#{f1}" -2 "#{target_asm}" -S "#{tmp_dbs[:ani]}" \
99
+ --name1 "#{dataset.name}" --name2 "#{target.name}" \
100
+ -t "#{opts[:thr]}" -a --no-save-regions --no-save-rbm \
101
+ -p "#{opts[:ani_p]}"
102
+ CMD
103
+ checkpoint(:ani)
104
+ end
105
+ end
106
+
107
+ ##
108
+ # Execute a FastANI command
109
+ def fastani_cmd(targets)
110
+ f1 = tmp_file('largecontigs.fa')
111
+ return unless File.size?(f1)
112
+
113
+ # Run FastANI
114
+ File.open(f2 = tmp_file, 'w') do |fh|
115
+ targets.each do |target|
116
+ target_asm = target&.result(:assembly)&.file_path(:largecontigs)
117
+ fh.puts target_asm if target_asm
118
+ end
119
+ end
120
+ run_cmd <<~CMD
121
+ fastANI -q "#{f1}" --rl "#{f2}" -t #{opts[:thr]} \
122
+ -o "#{f3 = tmp_file}"
123
+ CMD
124
+
125
+ # Retrieve resulting data and save to DB
126
+ data = {}
127
+ File.open(f3, 'r') do |fh|
128
+ fh.each do |ln|
129
+ row = ln.chomp.split("\t")
130
+ n2 = File.basename(row[1], '.gz')
131
+ n2 = File.basename(n2, '.LargeContigs.fna')
132
+ data[n2] = [row[2].to_f, 0.0, row[3].to_i, row[4].to_i]
133
+ end
134
+ end
135
+ batch_data_to_db(:ani, data)
136
+
137
+ # Cleanup
138
+ [f2, f3].each { |i| File.unlink(i) }
139
+ end
140
+
141
+ ##
142
+ # Execute a FastAAI command
143
+ def fastaai_cmd(targets)
144
+ qry_idx = dataset.result(:essential_genes).file_path(:fastaai_index)
145
+ return nil unless qry_idx
146
+
147
+ # Run FastAAI
148
+ File.open(f1 = tmp_file, 'w') { |fh| fh.puts qry_idx }
149
+ File.open(f2 = tmp_file, 'w') do |fh|
150
+ targets.each do |target|
151
+ target_idx = target&.result(:essential_genes)&.file_path(:fastaai_index)
152
+ fh.puts target_idx if target_idx
153
+ end
154
+ end
155
+ run_cmd <<~CMD
156
+ FastAAI --qd "#{f1}" --rd "#{f2}" --output "#{f3 = tmp_file}" \
157
+ --threads #{opts[:thr]}
158
+ CMD
159
+
160
+ # Save values in the databases
161
+ haai_data = {}
162
+ aai_data = {}
163
+ File.open(f3, 'r') do |fh|
164
+ fh.each do |ln|
165
+ out = ln.chomp.split("\t")
166
+ haai_data[out[1]] = [
167
+ out[2].to_f * 100, out[3].to_f * 100, out[4].to_i, out[5].to_i
168
+ ]
169
+ aai_data[out[1]] = [out[6].to_f, 0, 0, 0] if out[6] !~ /^>/
95
170
  end
96
- v = out[2]
97
- else
98
- v = `ani.rb -1 "#{f1}" -2 "#{f2}" -S "#{db}" \
99
- --name1 "#{n1}" --name2 "#{n2}" \
100
- -t "#{opts[:thr]}" -a --no-save-regions --no-save-rbm \
101
- --lookup-first -p "#{o[:ani_p] || 'blast+'}"`.chomp
102
171
  end
103
- v.nil? || v.empty? ? 0 : v.to_f
172
+ batch_data_to_db(:haai, haai_data)
173
+ batch_data_to_db(:aai, aai_data)
174
+
175
+ # Cleanup
176
+ [f1, f2, f3].each { |i| File.unlink(i) }
177
+ end
178
+
179
+ ##
180
+ # Execute an hAAI command
181
+ def haai_cmd(targets)
182
+ aai_data = {}
183
+ targets.each do |target|
184
+ target_ess = target&.result(:essential_genes)&.file_path(:ess_genes)
185
+ next unless target_ess
186
+
187
+ # hAAI
188
+ h = aairb_cmd(
189
+ tmp_file('ess_genes.fa'), target_ess,
190
+ dataset.name, target.name, tmp_dbs[:haai],
191
+ aai_save_rbm: false, aai_p: opts[:haai_p], checkpoint: :haai
192
+ )&.chomp&.to_f
193
+ next if h.nil? || h.zero? || h > 90.0
194
+
195
+ # Estimated AAI
196
+ aai_data[target.name] = [
197
+ 100.0 - Math.exp(2.435076 + 0.4275193 * Math.log(100.0 - h)), 0, 0, 0
198
+ ] unless h&.zero? || h > 90.0
199
+ end
200
+ batch_data_to_db(:aai, aai_data)
201
+ end
202
+
203
+ def run_cmd(cmd)
204
+ puts "CMD: #{cmd}"
205
+ `#{cmd}`
104
206
  end
105
207
  end