miga-base 0.7.26.0 → 1.0.0.1

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 (337) hide show
  1. checksums.yaml +4 -4
  2. data/lib/miga/_data/aai-intax.blast.tsv.gz +0 -0
  3. data/lib/miga/_data/aai-intax.diamond.tsv.gz +0 -0
  4. data/lib/miga/_data/aai-novel.blast.tsv.gz +0 -0
  5. data/lib/miga/_data/aai-novel.diamond.tsv.gz +0 -0
  6. data/lib/miga/cli/action/classify_wf.rb +2 -2
  7. data/lib/miga/cli/action/derep_wf.rb +1 -1
  8. data/lib/miga/cli/action/doctor.rb +57 -14
  9. data/lib/miga/cli/action/doctor/base.rb +47 -23
  10. data/lib/miga/cli/action/init.rb +11 -7
  11. data/lib/miga/cli/action/init/files_helper.rb +1 -0
  12. data/lib/miga/cli/action/ncbi_get.rb +3 -3
  13. data/lib/miga/cli/action/tax_dist.rb +2 -2
  14. data/lib/miga/cli/action/wf.rb +5 -4
  15. data/lib/miga/common.rb +1 -0
  16. data/lib/miga/daemon.rb +11 -4
  17. data/lib/miga/dataset/result.rb +10 -6
  18. data/lib/miga/json.rb +5 -4
  19. data/lib/miga/metadata.rb +5 -1
  20. data/lib/miga/parallel.rb +36 -0
  21. data/lib/miga/project.rb +8 -8
  22. data/lib/miga/project/base.rb +4 -4
  23. data/lib/miga/project/result.rb +2 -2
  24. data/lib/miga/sqlite.rb +10 -2
  25. data/lib/miga/version.rb +23 -9
  26. data/scripts/aai_distances.bash +16 -18
  27. data/scripts/ani_distances.bash +16 -17
  28. data/scripts/assembly.bash +31 -16
  29. data/scripts/haai_distances.bash +3 -27
  30. data/scripts/miga.bash +6 -4
  31. data/scripts/p.bash +1 -1
  32. data/scripts/read_quality.bash +9 -18
  33. data/scripts/trimmed_fasta.bash +14 -30
  34. data/scripts/trimmed_reads.bash +36 -36
  35. data/test/parallel_test.rb +31 -0
  36. data/test/project_test.rb +2 -1
  37. data/test/remote_dataset_test.rb +1 -1
  38. data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Archaea_SCG.hmm +41964 -0
  39. data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Bacteria_SCG.hmm +32439 -0
  40. data/utils/FastAAI/00.Libraries/01.SCG_HMMs/Complete_SCG_DB.hmm +62056 -0
  41. data/utils/FastAAI/FastAAI/FastAAI +1336 -0
  42. data/utils/FastAAI/README.md +84 -0
  43. data/utils/FastAAI/kAAI_v1.0_virus.py +1296 -0
  44. data/utils/distance/commands.rb +1 -0
  45. data/utils/distance/database.rb +0 -1
  46. data/utils/distance/runner.rb +2 -4
  47. data/utils/enveomics/Docs/recplot2.md +244 -0
  48. data/utils/enveomics/Examples/aai-matrix.bash +66 -0
  49. data/utils/enveomics/Examples/ani-matrix.bash +66 -0
  50. data/utils/enveomics/Examples/essential-phylogeny.bash +105 -0
  51. data/utils/enveomics/Examples/unus-genome-phylogeny.bash +100 -0
  52. data/utils/enveomics/LICENSE.txt +73 -0
  53. data/utils/enveomics/Makefile +52 -0
  54. data/utils/enveomics/Manifest/Tasks/aasubs.json +103 -0
  55. data/utils/enveomics/Manifest/Tasks/blasttab.json +786 -0
  56. data/utils/enveomics/Manifest/Tasks/distances.json +161 -0
  57. data/utils/enveomics/Manifest/Tasks/fasta.json +802 -0
  58. data/utils/enveomics/Manifest/Tasks/fastq.json +291 -0
  59. data/utils/enveomics/Manifest/Tasks/graphics.json +126 -0
  60. data/utils/enveomics/Manifest/Tasks/mapping.json +137 -0
  61. data/utils/enveomics/Manifest/Tasks/ogs.json +382 -0
  62. data/utils/enveomics/Manifest/Tasks/other.json +906 -0
  63. data/utils/enveomics/Manifest/Tasks/remote.json +355 -0
  64. data/utils/enveomics/Manifest/Tasks/sequence-identity.json +638 -0
  65. data/utils/enveomics/Manifest/Tasks/tables.json +308 -0
  66. data/utils/enveomics/Manifest/Tasks/trees.json +68 -0
  67. data/utils/enveomics/Manifest/Tasks/variants.json +111 -0
  68. data/utils/enveomics/Manifest/categories.json +165 -0
  69. data/utils/enveomics/Manifest/examples.json +154 -0
  70. data/utils/enveomics/Manifest/tasks.json +4 -0
  71. data/utils/enveomics/Pipelines/assembly.pbs/CONFIG.mock.bash +69 -0
  72. data/utils/enveomics/Pipelines/assembly.pbs/FastA.N50.pl +1 -0
  73. data/utils/enveomics/Pipelines/assembly.pbs/FastA.filterN.pl +1 -0
  74. data/utils/enveomics/Pipelines/assembly.pbs/FastA.length.pl +1 -0
  75. data/utils/enveomics/Pipelines/assembly.pbs/README.md +189 -0
  76. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-2.bash +112 -0
  77. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-3.bash +23 -0
  78. data/utils/enveomics/Pipelines/assembly.pbs/RUNME-4.bash +44 -0
  79. data/utils/enveomics/Pipelines/assembly.pbs/RUNME.bash +50 -0
  80. data/utils/enveomics/Pipelines/assembly.pbs/kSelector.R +37 -0
  81. data/utils/enveomics/Pipelines/assembly.pbs/newbler.pbs +68 -0
  82. data/utils/enveomics/Pipelines/assembly.pbs/newbler_preparator.pl +49 -0
  83. data/utils/enveomics/Pipelines/assembly.pbs/soap.pbs +80 -0
  84. data/utils/enveomics/Pipelines/assembly.pbs/stats.pbs +57 -0
  85. data/utils/enveomics/Pipelines/assembly.pbs/velvet.pbs +63 -0
  86. data/utils/enveomics/Pipelines/blast.pbs/01.pbs.bash +38 -0
  87. data/utils/enveomics/Pipelines/blast.pbs/02.pbs.bash +73 -0
  88. data/utils/enveomics/Pipelines/blast.pbs/03.pbs.bash +21 -0
  89. data/utils/enveomics/Pipelines/blast.pbs/BlastTab.recover_job.pl +72 -0
  90. data/utils/enveomics/Pipelines/blast.pbs/CONFIG.mock.bash +98 -0
  91. data/utils/enveomics/Pipelines/blast.pbs/FastA.split.pl +1 -0
  92. data/utils/enveomics/Pipelines/blast.pbs/README.md +127 -0
  93. data/utils/enveomics/Pipelines/blast.pbs/RUNME.bash +109 -0
  94. data/utils/enveomics/Pipelines/blast.pbs/TASK.check.bash +128 -0
  95. data/utils/enveomics/Pipelines/blast.pbs/TASK.dry.bash +16 -0
  96. data/utils/enveomics/Pipelines/blast.pbs/TASK.eo.bash +22 -0
  97. data/utils/enveomics/Pipelines/blast.pbs/TASK.pause.bash +26 -0
  98. data/utils/enveomics/Pipelines/blast.pbs/TASK.run.bash +89 -0
  99. data/utils/enveomics/Pipelines/blast.pbs/sentinel.pbs.bash +29 -0
  100. data/utils/enveomics/Pipelines/idba.pbs/README.md +49 -0
  101. data/utils/enveomics/Pipelines/idba.pbs/RUNME.bash +95 -0
  102. data/utils/enveomics/Pipelines/idba.pbs/run.pbs +56 -0
  103. data/utils/enveomics/Pipelines/trim.pbs/README.md +54 -0
  104. data/utils/enveomics/Pipelines/trim.pbs/RUNME.bash +70 -0
  105. data/utils/enveomics/Pipelines/trim.pbs/run.pbs +130 -0
  106. data/utils/enveomics/README.md +42 -0
  107. data/utils/enveomics/Scripts/AAsubs.log2ratio.rb +171 -0
  108. data/utils/enveomics/Scripts/Aln.cat.rb +221 -0
  109. data/utils/enveomics/Scripts/Aln.convert.pl +35 -0
  110. data/utils/enveomics/Scripts/AlphaDiversity.pl +152 -0
  111. data/utils/enveomics/Scripts/BedGraph.tad.rb +93 -0
  112. data/utils/enveomics/Scripts/BedGraph.window.rb +71 -0
  113. data/utils/enveomics/Scripts/BlastPairwise.AAsubs.pl +102 -0
  114. data/utils/enveomics/Scripts/BlastTab.addlen.rb +63 -0
  115. data/utils/enveomics/Scripts/BlastTab.advance.bash +48 -0
  116. data/utils/enveomics/Scripts/BlastTab.best_hit_sorted.pl +55 -0
  117. data/utils/enveomics/Scripts/BlastTab.catsbj.pl +104 -0
  118. data/utils/enveomics/Scripts/BlastTab.cogCat.rb +76 -0
  119. data/utils/enveomics/Scripts/BlastTab.filter.pl +47 -0
  120. data/utils/enveomics/Scripts/BlastTab.kegg_pep2path_rest.pl +194 -0
  121. data/utils/enveomics/Scripts/BlastTab.metaxaPrep.pl +104 -0
  122. data/utils/enveomics/Scripts/BlastTab.pairedHits.rb +157 -0
  123. data/utils/enveomics/Scripts/BlastTab.recplot2.R +48 -0
  124. data/utils/enveomics/Scripts/BlastTab.seqdepth.pl +86 -0
  125. data/utils/enveomics/Scripts/BlastTab.seqdepth_ZIP.pl +119 -0
  126. data/utils/enveomics/Scripts/BlastTab.seqdepth_nomedian.pl +86 -0
  127. data/utils/enveomics/Scripts/BlastTab.subsample.pl +47 -0
  128. data/utils/enveomics/Scripts/BlastTab.sumPerHit.pl +114 -0
  129. data/utils/enveomics/Scripts/BlastTab.taxid2taxrank.pl +90 -0
  130. data/utils/enveomics/Scripts/BlastTab.topHits_sorted.rb +101 -0
  131. data/utils/enveomics/Scripts/Chao1.pl +97 -0
  132. data/utils/enveomics/Scripts/CharTable.classify.rb +234 -0
  133. data/utils/enveomics/Scripts/EBIseq2tax.rb +83 -0
  134. data/utils/enveomics/Scripts/FastA.N50.pl +60 -0
  135. data/utils/enveomics/Scripts/FastA.extract.rb +152 -0
  136. data/utils/enveomics/Scripts/FastA.filter.pl +52 -0
  137. data/utils/enveomics/Scripts/FastA.filterLen.pl +28 -0
  138. data/utils/enveomics/Scripts/FastA.filterN.pl +60 -0
  139. data/utils/enveomics/Scripts/FastA.fragment.rb +100 -0
  140. data/utils/enveomics/Scripts/FastA.gc.pl +42 -0
  141. data/utils/enveomics/Scripts/FastA.interpose.pl +93 -0
  142. data/utils/enveomics/Scripts/FastA.length.pl +38 -0
  143. data/utils/enveomics/Scripts/FastA.mask.rb +89 -0
  144. data/utils/enveomics/Scripts/FastA.per_file.pl +36 -0
  145. data/utils/enveomics/Scripts/FastA.qlen.pl +57 -0
  146. data/utils/enveomics/Scripts/FastA.rename.pl +65 -0
  147. data/utils/enveomics/Scripts/FastA.revcom.pl +23 -0
  148. data/utils/enveomics/Scripts/FastA.sample.rb +98 -0
  149. data/utils/enveomics/Scripts/FastA.slider.pl +85 -0
  150. data/utils/enveomics/Scripts/FastA.split.pl +55 -0
  151. data/utils/enveomics/Scripts/FastA.split.rb +79 -0
  152. data/utils/enveomics/Scripts/FastA.subsample.pl +131 -0
  153. data/utils/enveomics/Scripts/FastA.tag.rb +65 -0
  154. data/utils/enveomics/Scripts/FastA.toFastQ.rb +69 -0
  155. data/utils/enveomics/Scripts/FastA.wrap.rb +48 -0
  156. data/utils/enveomics/Scripts/FastQ.filter.pl +54 -0
  157. data/utils/enveomics/Scripts/FastQ.interpose.pl +90 -0
  158. data/utils/enveomics/Scripts/FastQ.maskQual.rb +89 -0
  159. data/utils/enveomics/Scripts/FastQ.offset.pl +90 -0
  160. data/utils/enveomics/Scripts/FastQ.split.pl +53 -0
  161. data/utils/enveomics/Scripts/FastQ.tag.rb +70 -0
  162. data/utils/enveomics/Scripts/FastQ.test-error.rb +81 -0
  163. data/utils/enveomics/Scripts/FastQ.toFastA.awk +24 -0
  164. data/utils/enveomics/Scripts/GFF.catsbj.pl +127 -0
  165. data/utils/enveomics/Scripts/GenBank.add_fields.rb +84 -0
  166. data/utils/enveomics/Scripts/HMM.essential.rb +351 -0
  167. data/utils/enveomics/Scripts/HMM.haai.rb +168 -0
  168. data/utils/enveomics/Scripts/HMMsearch.extractIds.rb +83 -0
  169. data/utils/enveomics/Scripts/JPlace.distances.rb +88 -0
  170. data/utils/enveomics/Scripts/JPlace.to_iToL.rb +320 -0
  171. data/utils/enveomics/Scripts/M5nr.getSequences.rb +81 -0
  172. data/utils/enveomics/Scripts/MeTaxa.distribution.pl +198 -0
  173. data/utils/enveomics/Scripts/MyTaxa.fragsByTax.pl +35 -0
  174. data/utils/enveomics/Scripts/MyTaxa.seq-taxrank.rb +49 -0
  175. data/utils/enveomics/Scripts/NCBIacc2tax.rb +92 -0
  176. data/utils/enveomics/Scripts/Newick.autoprune.R +27 -0
  177. data/utils/enveomics/Scripts/RAxML-EPA.to_iToL.pl +228 -0
  178. data/utils/enveomics/Scripts/RecPlot2.compareIdentities.R +32 -0
  179. data/utils/enveomics/Scripts/RefSeq.download.bash +48 -0
  180. data/utils/enveomics/Scripts/SRA.download.bash +55 -0
  181. data/utils/enveomics/Scripts/TRIBS.plot-test.R +36 -0
  182. data/utils/enveomics/Scripts/TRIBS.test.R +39 -0
  183. data/utils/enveomics/Scripts/Table.barplot.R +31 -0
  184. data/utils/enveomics/Scripts/Table.df2dist.R +30 -0
  185. data/utils/enveomics/Scripts/Table.filter.pl +61 -0
  186. data/utils/enveomics/Scripts/Table.merge.pl +77 -0
  187. data/utils/enveomics/Scripts/Table.prefScore.R +60 -0
  188. data/utils/enveomics/Scripts/Table.replace.rb +69 -0
  189. data/utils/enveomics/Scripts/Table.round.rb +63 -0
  190. data/utils/enveomics/Scripts/Table.split.pl +57 -0
  191. data/utils/enveomics/Scripts/Taxonomy.silva2ncbi.rb +227 -0
  192. data/utils/enveomics/Scripts/VCF.KaKs.rb +147 -0
  193. data/utils/enveomics/Scripts/VCF.SNPs.rb +88 -0
  194. data/utils/enveomics/Scripts/aai.rb +419 -0
  195. data/utils/enveomics/Scripts/ani.rb +362 -0
  196. data/utils/enveomics/Scripts/anir.rb +137 -0
  197. data/utils/enveomics/Scripts/clust.rand.rb +102 -0
  198. data/utils/enveomics/Scripts/gi2tax.rb +103 -0
  199. data/utils/enveomics/Scripts/in_silico_GA_GI.pl +96 -0
  200. data/utils/enveomics/Scripts/lib/data/dupont_2012_essential.hmm.gz +0 -0
  201. data/utils/enveomics/Scripts/lib/data/lee_2019_essential.hmm.gz +0 -0
  202. data/utils/enveomics/Scripts/lib/enveomics.R +1 -0
  203. data/utils/enveomics/Scripts/lib/enveomics_rb/anir.rb +293 -0
  204. data/utils/enveomics/Scripts/lib/enveomics_rb/bm_set.rb +175 -0
  205. data/utils/enveomics/Scripts/lib/enveomics_rb/enveomics.rb +24 -0
  206. data/utils/enveomics/Scripts/lib/enveomics_rb/errors.rb +17 -0
  207. data/utils/enveomics/Scripts/lib/enveomics_rb/gmm_em.rb +30 -0
  208. data/utils/enveomics/Scripts/lib/enveomics_rb/jplace.rb +253 -0
  209. data/utils/enveomics/Scripts/lib/enveomics_rb/match.rb +63 -0
  210. data/utils/enveomics/Scripts/lib/enveomics_rb/og.rb +182 -0
  211. data/utils/enveomics/Scripts/lib/enveomics_rb/rbm.rb +49 -0
  212. data/utils/enveomics/Scripts/lib/enveomics_rb/remote_data.rb +74 -0
  213. data/utils/enveomics/Scripts/lib/enveomics_rb/seq_range.rb +237 -0
  214. data/utils/enveomics/Scripts/lib/enveomics_rb/stats.rb +3 -0
  215. data/utils/enveomics/Scripts/lib/enveomics_rb/stats/rand.rb +31 -0
  216. data/utils/enveomics/Scripts/lib/enveomics_rb/stats/sample.rb +152 -0
  217. data/utils/enveomics/Scripts/lib/enveomics_rb/utils.rb +73 -0
  218. data/utils/enveomics/Scripts/lib/enveomics_rb/vcf.rb +135 -0
  219. data/utils/enveomics/Scripts/ogs.annotate.rb +88 -0
  220. data/utils/enveomics/Scripts/ogs.core-pan.rb +160 -0
  221. data/utils/enveomics/Scripts/ogs.extract.rb +125 -0
  222. data/utils/enveomics/Scripts/ogs.mcl.rb +186 -0
  223. data/utils/enveomics/Scripts/ogs.rb +104 -0
  224. data/utils/enveomics/Scripts/ogs.stats.rb +131 -0
  225. data/utils/enveomics/Scripts/rbm-legacy.rb +172 -0
  226. data/utils/enveomics/Scripts/rbm.rb +100 -0
  227. data/utils/enveomics/Scripts/sam.filter.rb +148 -0
  228. data/utils/enveomics/Tests/Makefile +10 -0
  229. data/utils/enveomics/Tests/Mgen_M2288.faa +3189 -0
  230. data/utils/enveomics/Tests/Mgen_M2288.fna +8282 -0
  231. data/utils/enveomics/Tests/Mgen_M2321.fna +8288 -0
  232. data/utils/enveomics/Tests/Nequ_Kin4M.faa +2970 -0
  233. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.tribs.Rdata +0 -0
  234. data/utils/enveomics/Tests/Xanthomonas_oryzae-PilA.txt +7 -0
  235. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai-mat.tsv +17 -0
  236. data/utils/enveomics/Tests/Xanthomonas_oryzae.aai.tsv +137 -0
  237. data/utils/enveomics/Tests/a_mg.cds-go.blast.tsv +123 -0
  238. data/utils/enveomics/Tests/a_mg.reads-cds.blast.tsv +200 -0
  239. data/utils/enveomics/Tests/a_mg.reads-cds.counts.tsv +55 -0
  240. data/utils/enveomics/Tests/alkB.nwk +1 -0
  241. data/utils/enveomics/Tests/anthrax-cansnp-data.tsv +13 -0
  242. data/utils/enveomics/Tests/anthrax-cansnp-key.tsv +17 -0
  243. data/utils/enveomics/Tests/hiv1.faa +59 -0
  244. data/utils/enveomics/Tests/hiv1.fna +134 -0
  245. data/utils/enveomics/Tests/hiv2.faa +70 -0
  246. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv +233 -0
  247. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.lim +1 -0
  248. data/utils/enveomics/Tests/hiv_mix-hiv1.blast.tsv.rec +233 -0
  249. data/utils/enveomics/Tests/phyla_counts.tsv +10 -0
  250. data/utils/enveomics/Tests/primate_lentivirus.ogs +11 -0
  251. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv1.rbm +9 -0
  252. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-hiv2.rbm +8 -0
  253. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv1-siv.rbm +6 -0
  254. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-hiv2.rbm +9 -0
  255. data/utils/enveomics/Tests/primate_lentivirus.rbm/hiv2-siv.rbm +6 -0
  256. data/utils/enveomics/Tests/primate_lentivirus.rbm/siv-siv.rbm +6 -0
  257. data/utils/enveomics/build_enveomics_r.bash +45 -0
  258. data/utils/enveomics/enveomics.R/DESCRIPTION +31 -0
  259. data/utils/enveomics/enveomics.R/NAMESPACE +39 -0
  260. data/utils/enveomics/enveomics.R/R/autoprune.R +155 -0
  261. data/utils/enveomics/enveomics.R/R/barplot.R +184 -0
  262. data/utils/enveomics/enveomics.R/R/cliopts.R +135 -0
  263. data/utils/enveomics/enveomics.R/R/df2dist.R +154 -0
  264. data/utils/enveomics/enveomics.R/R/growthcurve.R +331 -0
  265. data/utils/enveomics/enveomics.R/R/prefscore.R +79 -0
  266. data/utils/enveomics/enveomics.R/R/recplot.R +354 -0
  267. data/utils/enveomics/enveomics.R/R/recplot2.R +1631 -0
  268. data/utils/enveomics/enveomics.R/R/tribs.R +583 -0
  269. data/utils/enveomics/enveomics.R/R/utils.R +80 -0
  270. data/utils/enveomics/enveomics.R/README.md +81 -0
  271. data/utils/enveomics/enveomics.R/data/growth.curves.rda +0 -0
  272. data/utils/enveomics/enveomics.R/data/phyla.counts.rda +0 -0
  273. data/utils/enveomics/enveomics.R/man/cash-enve.GrowthCurve-method.Rd +16 -0
  274. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2-method.Rd +16 -0
  275. data/utils/enveomics/enveomics.R/man/cash-enve.RecPlot2.Peak-method.Rd +16 -0
  276. data/utils/enveomics/enveomics.R/man/enve.GrowthCurve-class.Rd +25 -0
  277. data/utils/enveomics/enveomics.R/man/enve.TRIBS-class.Rd +46 -0
  278. data/utils/enveomics/enveomics.R/man/enve.TRIBS.merge.Rd +23 -0
  279. data/utils/enveomics/enveomics.R/man/enve.TRIBStest-class.Rd +47 -0
  280. data/utils/enveomics/enveomics.R/man/enve.__prune.iter.Rd +23 -0
  281. data/utils/enveomics/enveomics.R/man/enve.__prune.reduce.Rd +23 -0
  282. data/utils/enveomics/enveomics.R/man/enve.__tribs.Rd +40 -0
  283. data/utils/enveomics/enveomics.R/man/enve.barplot.Rd +103 -0
  284. data/utils/enveomics/enveomics.R/man/enve.cliopts.Rd +67 -0
  285. data/utils/enveomics/enveomics.R/man/enve.col.alpha.Rd +24 -0
  286. data/utils/enveomics/enveomics.R/man/enve.col2alpha.Rd +19 -0
  287. data/utils/enveomics/enveomics.R/man/enve.df2dist.Rd +45 -0
  288. data/utils/enveomics/enveomics.R/man/enve.df2dist.group.Rd +44 -0
  289. data/utils/enveomics/enveomics.R/man/enve.df2dist.list.Rd +47 -0
  290. data/utils/enveomics/enveomics.R/man/enve.growthcurve.Rd +75 -0
  291. data/utils/enveomics/enveomics.R/man/enve.prefscore.Rd +50 -0
  292. data/utils/enveomics/enveomics.R/man/enve.prune.dist.Rd +44 -0
  293. data/utils/enveomics/enveomics.R/man/enve.recplot.Rd +139 -0
  294. data/utils/enveomics/enveomics.R/man/enve.recplot2-class.Rd +45 -0
  295. data/utils/enveomics/enveomics.R/man/enve.recplot2.ANIr.Rd +24 -0
  296. data/utils/enveomics/enveomics.R/man/enve.recplot2.Rd +77 -0
  297. data/utils/enveomics/enveomics.R/man/enve.recplot2.__counts.Rd +25 -0
  298. data/utils/enveomics/enveomics.R/man/enve.recplot2.__peakHist.Rd +21 -0
  299. data/utils/enveomics/enveomics.R/man/enve.recplot2.__whichClosestPeak.Rd +19 -0
  300. data/utils/enveomics/enveomics.R/man/enve.recplot2.changeCutoff.Rd +19 -0
  301. data/utils/enveomics/enveomics.R/man/enve.recplot2.compareIdentities.Rd +47 -0
  302. data/utils/enveomics/enveomics.R/man/enve.recplot2.coordinates.Rd +29 -0
  303. data/utils/enveomics/enveomics.R/man/enve.recplot2.corePeak.Rd +18 -0
  304. data/utils/enveomics/enveomics.R/man/enve.recplot2.extractWindows.Rd +45 -0
  305. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.Rd +36 -0
  306. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_e.Rd +19 -0
  307. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__em_m.Rd +19 -0
  308. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__emauto_one.Rd +27 -0
  309. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mow_one.Rd +52 -0
  310. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.__mower.Rd +17 -0
  311. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.em.Rd +51 -0
  312. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.emauto.Rd +43 -0
  313. data/utils/enveomics/enveomics.R/man/enve.recplot2.findPeaks.mower.Rd +82 -0
  314. data/utils/enveomics/enveomics.R/man/enve.recplot2.peak-class.Rd +59 -0
  315. data/utils/enveomics/enveomics.R/man/enve.recplot2.seqdepth.Rd +27 -0
  316. data/utils/enveomics/enveomics.R/man/enve.recplot2.windowDepthThreshold.Rd +36 -0
  317. data/utils/enveomics/enveomics.R/man/enve.selvector.Rd +23 -0
  318. data/utils/enveomics/enveomics.R/man/enve.tribs.Rd +68 -0
  319. data/utils/enveomics/enveomics.R/man/enve.tribs.test.Rd +28 -0
  320. data/utils/enveomics/enveomics.R/man/enve.truncate.Rd +27 -0
  321. data/utils/enveomics/enveomics.R/man/growth.curves.Rd +14 -0
  322. data/utils/enveomics/enveomics.R/man/phyla.counts.Rd +13 -0
  323. data/utils/enveomics/enveomics.R/man/plot.enve.GrowthCurve.Rd +78 -0
  324. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBS.Rd +46 -0
  325. data/utils/enveomics/enveomics.R/man/plot.enve.TRIBStest.Rd +45 -0
  326. data/utils/enveomics/enveomics.R/man/plot.enve.recplot2.Rd +125 -0
  327. data/utils/enveomics/enveomics.R/man/summary.enve.GrowthCurve.Rd +19 -0
  328. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBS.Rd +19 -0
  329. data/utils/enveomics/enveomics.R/man/summary.enve.TRIBStest.Rd +19 -0
  330. data/utils/enveomics/globals.mk +8 -0
  331. data/utils/enveomics/manifest.json +9 -0
  332. data/utils/multitrim/Multitrim How-To.pdf +0 -0
  333. data/utils/multitrim/README.md +67 -0
  334. data/utils/multitrim/multitrim.py +1555 -0
  335. data/utils/multitrim/multitrim.yml +13 -0
  336. data/utils/requirements.txt +4 -3
  337. metadata +304 -3
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # @author: Luis M. Rodriguez-R
5
+ # @update: Feb-06-2015
6
+ # @license: artistic license 2.0
7
+ #
8
+
9
+ require 'optparse'
10
+ require 'rubygems'
11
+ require 'restclient'
12
+ require 'open-uri'
13
+ require 'JSON'
14
+
15
+ o = {:q=>FALSE, :url=>'http://api.metagenomics.anl.gov/m5nr', :max=>0, :recover=>FALSE}
16
+ ARGV << '-h' if ARGV.size==0
17
+ OptionParser.new do |opts|
18
+ opts.banner = "
19
+ Downloads a set of sequences from M5nr with a given functional annotation.
20
+
21
+ Usage: #{$0} [options]"
22
+ opts.separator ""
23
+ opts.separator "Mandatory"
24
+ opts.on("-f", "--function STR", "Functional annotation."){ |v| o[:function] = v }
25
+ opts.separator ""
26
+ opts.separator "Options"
27
+ opts.on("-m", "--max INT", "Maximum number of sequences to download. By default: all (0)."){ |v| o[:max] = v.to_i }
28
+ opts.on("-r", "--recover", "If set, tries to recover a previous FastA."){ o[:recover]=TRUE }
29
+ opts.on("-n", "--url STR", "URL for M5nr API. By default: #{o[:url]}."){ |v| o[:url] = v }
30
+ opts.on("-o", "--out FILE", "File containing the sequences. By default: value of -f appended with .fa."){ |v| o[:out] = v }
31
+ opts.on("-q", "--quiet", "Run quietly (no STDERR output)"){ o[:q] = TRUE }
32
+ opts.on("-h", "--help", "Display this screen") do
33
+ puts opts
34
+ exit
35
+ end
36
+ opts.separator ""
37
+ end.parse!
38
+ abort "-f is mandatory" if o[:function].nil?
39
+ o[:out] = "#{o[:function].gsub(/ /,'_')}.fa" if o[:out].nil?
40
+ uri_fun = URI::encode(o[:function])
41
+
42
+ ignore = {}
43
+ if o[:recover] and File.exists? o[:out]
44
+ ih = File.open(o[:out], "r")
45
+ ih.each_line do |ln|
46
+ id = /^>(\S+)\s/.match(ln)
47
+ unless id.nil?
48
+ ignore[id[1]] = 1
49
+ end
50
+ end
51
+ ih.close
52
+ of = File.open(o[:out], "a+")
53
+ else
54
+ of = File.open(o[:out], "w")
55
+ end
56
+
57
+ next_url = "#{o[:url]}/function/#{uri_fun}"
58
+ i = 0
59
+ loop do
60
+ $stderr.print "Downloading sequence #{i+1}. \r" unless o[:q]
61
+ res_fun = RestClient.get next_url
62
+ abort "Unable to reach MG-RAST M5nr API, error code #{res_fun.code}." unless res_fun.code == 200
63
+ fun = JSON.parse(res_fun.to_str)
64
+ fun["data"].each do |datum|
65
+ if ignore["#{datum["source"]}:#{datum["accession"]}"].nil?
66
+ res_seq = RestClient.get "#{o[:url]}/md5/#{datum["md5"]}", {:params=>{:sequence=>1}}
67
+ abort "Unable to reach MG-RAST M5nr API, error code #{res_seq.code}." unless res_seq.code == 200
68
+ seq = JSON.parse(res_seq.to_str)
69
+ of.puts ">#{datum["source"]}:#{datum["accession"]} #{datum["function"]} [#{datum["organism"]} taxid:#{datum["ncbi_tax_id"]}]"
70
+ of.puts seq["data"]["sequence"].scan(/.{80}|.+/).map{ |x| x.strip }.join($/)
71
+ end
72
+ i += 1
73
+ break if o[:max]>0 and i >= o[:max]
74
+ end # |datum|
75
+ next_url = fun["next"]
76
+ break if next_url.nil? or (o[:max] > 0 and i >= o[:max])
77
+ end
78
+ of.close
79
+
80
+ $stderr.puts "Downloaded #{i} sequences." unless o[:q]
81
+
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env perl
2
+ #
3
+ # @author Luis M. Rodriguez-R <lmrodriguezr at gmail dot com>
4
+ # @license artistic license 2.0
5
+ # @update Mar-23-2015
6
+ #
7
+ use warnings;
8
+ use strict;
9
+ use Symbol;
10
+ use Getopt::Std;
11
+ use List::Util qw/max/;
12
+
13
+ sub HELP_MESSAGE { die "
14
+ Usage:
15
+ $0 [args]
16
+
17
+ Mandatory:
18
+ -m <str> MyTaxa output.
19
+
20
+ Optional:
21
+ -g <str> Genes predicted in the format defined by -f. If not passed, abundance is assumed to be based
22
+ on contigs.
23
+ -f <str> Format of the predicted genes. One of:
24
+ o gff2: GFF v2 as produced by MetaGeneMark.hmm (default).
25
+ o gff3: GFF v3, including the field id in the last column (with the Gene ID).
26
+ o tab: A tab-delimited file with the gene ID (col #1), the length of the gene in bp (col #2),
27
+ and the ID of the corresponding contig (col #3). The length of the gene (col #2) isn't used
28
+ (and it can be empty), but the column must exist (i.e., 2 tabs per line) for compatibility
29
+ with BlastTab.metaxaPrep.pl
30
+ -c <str> Counts file: Sequence IDs (genes if -g is provided, contigs otherwise) and reads per sequence
31
+ in a tab-delimited file. If not provided, each sequence counts as 1.
32
+ -O <str> Prefix of the output files to be generated. By default, the value of -m.
33
+ -I <str> File containing the complete classification of all the contigs identified as Innominate taxa.
34
+ By default, this file is not created.
35
+ -G <str> File containing the classification of each gene. By default, this file is not created. This
36
+ requires -g to be set. Note: This option requires extra RAM.
37
+ -K <str> File containing a krona input file. By default, this file is not created.
38
+ -k <str> List of ranks to include in the Krona file, delimited by comma. It MUST be decreasing rank.
39
+ By default: 'superkingdom,phylum,class,family,genus,species'. This is ignored unless -K also
40
+ is passed.
41
+ -R <str> List of taxonomic ranks for which individual reports should be generated, delimited by comma.
42
+ It MUST be decreasing rank. By default: 'phylum,genus,species'.
43
+ -r If set, reports raw counts. Otherwise, reports permil of the rank.
44
+ -u Report Unknown taxa.
45
+ -q Run quietly.
46
+ -h Display this help message and exits.
47
+
48
+ " }
49
+
50
+ my %o;
51
+ getopts('g:f:c:m:O:I:G:K:k:R:ruqh', \%o);
52
+ $o{h} and &HELP_MESSAGE;
53
+ $o{m} or &HELP_MESSAGE;
54
+ $o{O} ||= $o{m};
55
+ $o{f} ||= "gff2";
56
+ $o{k} ||= "superkingdom,phylum,class,family,genus,species";
57
+ my @K = split /,/, lc $o{k};
58
+ $o{R} ||= "phylum,genus,species";
59
+ my @R = split /,/, lc $o{R};
60
+ ($o{G} and not $o{g}) and die "-G requires -g to be set.\n";
61
+
62
+
63
+ my %gene;
64
+ my %count;
65
+ my %ctg=();
66
+ if($o{g}){
67
+ print STDERR "Reading genes collection.\n" unless $o{q};
68
+ open GFF, "<", $o{g} or die "Cannot read file: $o{g}: $!\n";
69
+ while(<GFF>){
70
+ next if /^#/;
71
+ next if /^\s*$/;
72
+ chomp;
73
+ my($id,$ctg);
74
+ my @ln = split /\t/;
75
+ if($o{f} eq 'gff2'){
76
+ exists $ln[8] or die "Cannot parse line $., expecting 9 columns: $_\n";
77
+ $id = $ln[8];
78
+ $id =~ s/gene_id /gene_id_/;
79
+ $ctg=$ln[0];
80
+ }elsif($o{f} eq 'gff3'){
81
+ exists $ln[8] or die "Cannot parse line $., expecting 9 columns: $_\n";
82
+ $ln[8] =~ /id=([^;]+)/ or die "Cannot parse line $.: $_\n";
83
+ $id = $1;
84
+ $ctg = $ln[0];
85
+ }elsif($o{f} eq 'tab'){
86
+ exists $ln[2] or die "Cannot parse line $., expecting 3 columns: $_\n";
87
+ $id = $ln[0];
88
+ $ctg = $ln[2];
89
+ }else{
90
+ die "Unsupported format: ".$o{f}.".\n";
91
+ }
92
+ $ctg =~ s/ .*//;
93
+ if($o{c}){
94
+ $gene{$id} = $ctg;
95
+ }else{
96
+ $count{$ctg}++;
97
+ }
98
+ push( @{$ctg{$ctg}||=[]}, $id ) if $o{G};
99
+ }
100
+ close GFF;
101
+ print STDERR " Found ".(scalar(keys %gene))." genes.\n" unless $o{q};
102
+ }
103
+
104
+ my $Nreads = 0;
105
+ if($o{c}){
106
+ print STDERR "Reading read-counts.\n" unless $o{q};
107
+ open COUNT, "<", $o{c} or die "Cannot read file: $o{c}: $!\n";
108
+ while(<COUNT>){
109
+ chomp;
110
+ my @l = split /\t/;
111
+ if($o{g}){
112
+ exists $gene{$l[0]} or die "Cannot find gene's contig: $l[0].\n";
113
+ $count{ $gene{$l[0]} } += $l[1];
114
+ delete $gene{$l[0]};
115
+ }else{
116
+ $count{ $l[0] } += $l[1];
117
+ }
118
+ $Nreads += $l[1];
119
+ }
120
+ close COUNT;
121
+ print STDERR " Found ".scalar(keys %gene)." genes without reads.\n" if scalar(keys %gene) and not $o{q};
122
+ $count{$_}+=0 for values %gene;
123
+ print STDERR " Found ".scalar(keys %count)." sequences and $Nreads reads.\n" unless $o{q};
124
+ }
125
+
126
+ print STDERR "Reading Metaxa results.\n";
127
+ open METAXA, "<", $o{m} or die "Cannot read file: $o{m}: $!\n";
128
+ my $ctg;
129
+ my $rank;
130
+ my @ofh = ();
131
+ my @n = (0,0,0);
132
+ my @out = ({},{},{});
133
+ my @rank_name = map { ucfirst } ('unknown', @R);
134
+ my %rank = map { ($rank_name[$_]=>$_) } 0 .. $#rank_name;
135
+ my @rank_tag = ("NA", map { "<$_>" } @R);
136
+ $o{I} and (open OUT_I, ">", $o{I} or die "Cannot create file: $o{I}: $!\n");
137
+ $o{K} and (open OUT_K, ">", $o{K} or die "Cannot create file: $o{K}: $!\n");
138
+ $o{G} and (open OUT_G, ">", $o{G} or die "Cannot create file: $o{G}: $!\n");
139
+
140
+ my $Nreads_class = 0;
141
+ my $Nno_read_ctg = 0;
142
+ while(not eof(METAXA)){
143
+ my @h=split /\t/, <METAXA>;
144
+ my $t=<METAXA>; chomp $t;
145
+ exists $h[3] or die "Cannot parse MyTaxa file, line $.: $_\n";
146
+ my $count_h;
147
+ if($o{c} or $o{g}){
148
+ unless(exists $count{$h[0]}){
149
+ $Nno_read_ctg++;
150
+ next;
151
+ }
152
+ $count_h = $count{$h[0]};
153
+ }else{
154
+ $count_h = 1;
155
+ }
156
+ if($o{G}){ print OUT_G "$_\t$t\n" for @{$ctg{$h[0]}} }
157
+ next unless $count_h;
158
+ my $last = 'organism';
159
+ $n[0] += $count_h;
160
+ for my $r (1 .. max(values %rank)){
161
+ if($rank{$h[1]} >= $r){
162
+ if($t =~ m/$rank_tag[$r]([^;]*)/){
163
+ $last = $1 if $1;
164
+ }else{
165
+ $last = $last=~/^Innominate / ? $last : "Innominate $last";
166
+ $o{I} and print OUT_I "$h[0]\t$rank_name[$r]\t$last\t$t\n";
167
+ }
168
+ $out[$r]->{$last} += $count_h;
169
+ $n[$r] += $count_h;
170
+ }else{
171
+ $out[$r]->{"Unknown $last"} += $count_h if $o{u};
172
+ }
173
+ }
174
+ if($o{K}){
175
+ my $ln = $count_h;
176
+ for my $r (@K){ $ln.= "\t".($t=~m/<$r>([^;]+)/?$1:'') }
177
+ print OUT_K "$ln\n";
178
+ }
179
+ $Nreads_class+= $count_h;
180
+ }
181
+ print OUT_K "".($Nreads-$Nreads_class)."\n" if $o{K} and $Nreads>$Nreads_class;
182
+ close METAXA;
183
+ $o{I} and close OUT_I;
184
+ $o{K} and close OUT_K;
185
+ $o{G} and close OUT_G;
186
+ print " Found $n[0] reads.\n" unless $o{q};
187
+ print " Couldn't find counts for $Nno_read_ctg contigs.\n" if $Nno_read_ctg;
188
+ unless($o{q}){ print " Found $n[$_] classified reads at ".$rank_name[$_]." level.\n" for (1 .. max(values %rank)) }
189
+
190
+ print STDERR "Generating output.\n" unless $o{q};
191
+ for my $rank (1 .. max(values %rank)){
192
+ open OUT, ">", "$o{O}.".$rank_name[$rank].".txt" or die "Cannot create file: $o{O}.".$rank_name[$rank].".txt: $!\n";
193
+ for my $class (keys %{$out[$rank]}){
194
+ printf OUT "%s\t%.20f\n", $class, ($out[$rank]->{$class}*($o{r}?1:1000/$n[$rank]));
195
+ }
196
+ close OUT;
197
+ }
198
+
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env perl
2
+ #
3
+ # @author: Luis M. Rodriguez-R <lmrodriguezr at gmail dot com>
4
+ # @update: Mar-23-2015
5
+ # @license: artistic license 2.0
6
+ #
7
+
8
+ use warnings;
9
+ use strict;
10
+
11
+ my($file,$tax,$rank) = @ARGV;
12
+ ($file and $tax) or die "
13
+ .Usage:
14
+ $0 file.txt taxon[ rank]
15
+
16
+ file.txt MyTaxa output.
17
+ taxon Taxon to look for.
18
+ rank Rank of taxon (optional). By default: any rank.
19
+
20
+ ";
21
+ $rank ||= ".*";
22
+ $rank = lc $rank;
23
+
24
+ open MT, "<", $file or die "Cannot read file: $file: $!\n";
25
+ my $last = '';
26
+ while(my $ln=<MT>){
27
+ chomp $ln;
28
+ if($ln =~ /<$rank>$tax(;|$)/){
29
+ $last =~ s/\t.*//;
30
+ print $last, "\n";
31
+ }
32
+ $last = $ln;
33
+ }
34
+ close MT;
35
+
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # @author Luis M. Rodriguez-R <lmrodriguezr at gmail dot com>
5
+ # @update: Feb-06-2015
6
+ # @license artistic license 2.0
7
+ #
8
+
9
+ require 'optparse'
10
+
11
+ opts = {:rank=>'genus', :quiet=>FALSE}
12
+ ARGV << '-h' if ARGV.size==0
13
+ OptionParser.new do |opt|
14
+ opt.separator "Generates a simple tabular file with the classification of each sequence at a given taxonomic rank from a MyTaxa output."
15
+ opt.separator ""
16
+ opt.on("-i", "--mytaxa FILE", "Input MyTaxa file."){ |v| opts[:mytaxa]=v }
17
+ opt.on("-r", "--rank STR", "Taxonomic rank. By default: #{opts[:rank]}."){ |v| opts[:rank] = v.downcase }
18
+ opt.on("-q","--quiet","Run quietly.") { opts[:quiet]=TRUE }
19
+ opt.on("-h","--help","Display this screen.") do
20
+ puts opt
21
+ exit
22
+ end
23
+ opt.separator ""
24
+ end.parse!
25
+ abort "-i/--mytaxa is mandatory." if opts[:mytaxa].nil?
26
+ abort "-i/--mytaxa must exist." unless File.exists? opts[:mytaxa]
27
+
28
+ begin
29
+ f = File.open(opts[:mytaxa], "r")
30
+ ctg = nil;
31
+ while(ln = f.gets)
32
+ m = /^(.+)(\t.+){3}/.match(ln)
33
+ if m
34
+ raise "Couldn't find classification for contig #{ctg}" unless ctg.nil?
35
+ ctg = m[1]
36
+ else
37
+ raise "Couldn't find the contig name at line #{$.}" if ctg.nil?
38
+ m = /<#{opts[:rank]}>([^;]+)/.match(ln)
39
+ puts "#{ctg}\t#{m ? m[1] : "Unclassified"}"
40
+ ctg = nil
41
+ end
42
+ end
43
+ f.close
44
+ rescue => err
45
+ $stderr.puts "Exception: #{err}\n\n"
46
+ err.backtrace.each { |l| $stderr.puts l + "\n" }
47
+ err
48
+ end
49
+
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # @author Luis M. Rodriguez-R <lmrodriguezr at gmail dot com>
5
+ # @license artistic license 2.0
6
+ #
7
+
8
+ $:.push File.expand_path(File.dirname(__FILE__) + "/lib")
9
+ require "enveomics_rb/remote_data"
10
+ use "nokogiri"
11
+
12
+ #================================[ Options parsing ]
13
+ o = {
14
+ :q=>false, :accs=>[], :dbfrom=>"nuccore", :header=>true,
15
+ :no_nil=>false, :ret=>"ScientificName",
16
+ :ranks=>%w(superkingdom phylum class order family genus species)}
17
+ OptionParser.new do |opt|
18
+ opt.banner = "
19
+ Maps a list of NCBI accessions to their corresponding taxonomy using the NCBI
20
+ EUtilities. Avoid using this script on millions of entries at a time, since
21
+ each entry elicits two requests to NCBI's servers.
22
+
23
+ Usage: #{$0} [options]".gsub(/^ +/,"")
24
+ opt.separator ""
25
+ opt.on("-a", "--acc acc1,acc2.ver,...", Array,
26
+ "Comma-separated list of accessions. Required unless -i is passed."
27
+ ){ |v| o[:accs]=v }
28
+ opt.on("-i", "--infile FILE",
29
+ "Raw text file containing the list of accessions, one per line.",
30
+ "Required unless -g is passed."){ |v| o[:infile]=v }
31
+ opt.on("-p", "--protein",
32
+ "Use if the accessions are proteins. Otherwise, accessions are assumed " +
33
+ "to be from the Nuccore Database."){ o[:dbfrom]="protein" }
34
+ opt.on("-r", "--ranks RANK1,RANK2,...", Array,
35
+ "Taxonomic ranks to report. By default: #{o[:ranks].join(",")}."
36
+ ){ |v| o[:ranks]=v }
37
+ opt.on("-n", "--noheader",
38
+ "Do not include a header in the output."){ o[:header]=false }
39
+ opt.on("-t", "--taxids",
40
+ "Return Taxonomy IDs instead of scientific names."){ o[:ret]="TaxId" }
41
+ opt.on("--ignore-missing",
42
+ "Does not report missing accessions in the output file.",
43
+ "By default, it reports accessions and empty values for all other columns."
44
+ ){ |v| o[:no_nil]=v }
45
+ opt.on("-q", "--quiet", "Run quietly."){ |v| o[:q]=true }
46
+ opt.on("-h", "--help","Display this screen") do
47
+ puts opt
48
+ exit
49
+ end
50
+ opt.separator ""
51
+ end.parse!
52
+
53
+ #================================[ Functions ]
54
+ def acc2taxid(db, acc)
55
+ doc = Nokogiri::XML( RemoteData.elink({:dbfrom=>db,
56
+ :db=>"taxonomy", :id=>acc, :idtype=>"acc"}) )
57
+ doc.at_xpath("/eLinkResult/LinkSet/LinkSetDb/Link/Id")
58
+ end
59
+ #================================[ Main ]
60
+ begin
61
+ o[:accs] += File.readlines(o[:infile]).map{ |l| l.chomp } unless
62
+ o[:infile].nil?
63
+ o[:ranks].map!{ |r| r.downcase }
64
+ puts (["Acc", "TaxId"] + o[:ranks].map{ |r| r.capitalize }).join("\t") if
65
+ o[:header]
66
+ o[:accs].each do |acc|
67
+ taxid = acc2taxid(o[:dbfrom], acc)
68
+ status = ""
69
+ if taxid.nil?
70
+ warn "Cannot find link to taxonomy: #{acc} #{status}"
71
+ puts ([acc, ""] + o[:ranks].map{ |i| "" }).join("\t") unless o[:no_nil]
72
+ next
73
+ end
74
+ taxonomy = {}
75
+ unless taxid.nil?
76
+ doc = Nokogiri::XML( RemoteData.efetch({:db=>"taxonomy",
77
+ :id=>taxid.content}) )
78
+ taxonomy[ doc.at_xpath("/TaxaSet/Taxon/Rank").content ] =
79
+ doc.at_xpath("/TaxaSet/Taxon/#{o[:ret]}").content
80
+ doc.xpath("/TaxaSet/Taxon/LineageEx/Taxon").each do |taxon|
81
+ taxonomy[ taxon.at_xpath("./Rank").content ] =
82
+ taxon.at_xpath("./#{o[:ret]}").content
83
+ end
84
+ end
85
+ puts ([acc, taxid.content] +
86
+ o[:ranks].map{ |rank| taxonomy[ rank ] ||= "" }).join("\t")
87
+ end
88
+ rescue => err
89
+ $stderr.puts "Exception: #{err}\n\n"
90
+ err.backtrace.each { |l| $stderr.puts l + "\n" }
91
+ err
92
+ end