From fb4f2b0270ed95a91fcf192253b7195b101dfd0a Mon Sep 17 00:00:00 2001 From: TuomasBorman Date: Mon, 23 Sep 2024 07:39:10 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20EBI-Meta?= =?UTF-8?q?genomics/MGnifyR@97a4d531f30b7474227d402405d2dd7774fe09df=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/MGnifyR.html | 10 +++++++--- .../figure-html/plot_abundance-1.png | Bin 58387 -> 57407 bytes articles/MGnifyR_long.html | 8 ++++++-- articles/MGnify_course.html | 2 +- pkgdown.yml | 2 +- search.json | 2 +- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/articles/MGnifyR.html b/articles/MGnifyR.html index 1f00d06..73bc052 100644 --- a/articles/MGnifyR.html +++ b/articles/MGnifyR.html @@ -59,7 +59,7 @@

MGnifyR

-

2024-09-19

+

2024-09-23

Source: vignettes/MGnifyR.Rmd
MGnifyR.Rmd
@@ -188,7 +188,7 @@

Create a client#> [1] TRUE #> #> Slot "cacheDir": -#> [1] "/tmp/Rtmpgw8elH/.MGnifyR_cache" +#> [1] "/tmp/Rtmpv8nU5N/.MGnifyR_cache" #> #> Slot "showWarnings": #> [1] FALSE @@ -346,7 +346,11 @@

Fetch microbiome datatop_taxa <- getTopFeatures(altExp(mae[[1]], "Phylum"), 10) #> Warning in getTopFeatures(altExp(mae[[1]], "Phylum"), 10): 'getTopFeatures' is #> deprecated. Use 'getTop' instead. -plotAbundance(altExp(mae[[1]], "Phylum")[top_taxa, ], rank = "Phylum") +plotAbundance( + altExp(mae[[1]], "Phylum")[top_taxa, ], + rank = "Phylum", + as.relative = TRUE + ) #> Warning: The following values are already present in `metadata` and will be #> overwritten: 'agglomerated_by_rank'. Consider using the 'name' argument to #> specify alternative names. diff --git a/articles/MGnifyR_files/figure-html/plot_abundance-1.png b/articles/MGnifyR_files/figure-html/plot_abundance-1.png index ef115a52a6e7f1127a2af81aff6cccd997c2d3f3..6c57a126c74ab37296cbfe6267217d8c0a6bb1cc 100644 GIT binary patch literal 57407 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 literal 58387 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, extended vignette

-

2024-09-19

+

2024-09-23

Source:
vignettes/MGnifyR_long.Rmd
MGnifyR_long.Rmd
@@ -309,7 +309,11 @@

Amplicon sequencing
 library(miaViz)
 
-plotAbundance(tse[!is.na( rowData(tse)[["Kingdom"]] ), ], rank = "Kingdom")
+plotAbundance( + tse[!is.na( rowData(tse)[["Kingdom"]] ), ], + rank = "Kingdom", + as.relative = TRUE + )

If needed, TreeSE can be converted to phyloseq.

diff --git a/articles/MGnify_course.html b/articles/MGnify_course.html
index 1f05302..b54175a 100644
--- a/articles/MGnify_course.html
+++ b/articles/MGnify_course.html
@@ -59,7 +59,7 @@
 
       

Metagenomics bioinformatics at MGnify

-

2024-09-19

+

2024-09-23

Source: vignettes/MGnify_course.Rmd
MGnify_course.Rmd
diff --git a/pkgdown.yml b/pkgdown.yml index 88c6918..9c87b94 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -5,4 +5,4 @@ articles: MGnify_course: MGnify_course.html MGnifyR_long: MGnifyR_long.html MGnifyR: MGnifyR.html -last_built: 2024-09-19T09:08Z +last_built: 2024-09-23T07:35Z diff --git a/search.json b/search.json index 53a3038..4df2349 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":"/articles/MGnifyR.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"MGnifyR","text":"MGnifyR package designed ease access EBI’s MGnify resource, allowing searching retrieval multiple datasets downstream analysis. latest version MGnifyR seamlessly integrates miaverse framework providing access cutting-edge tools microbiome -stream analytics.","code":""},{"path":"/articles/MGnifyR.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"MGnifyR","text":"MGnifyR hosted Bioconductor, can installed using via BiocManager.","code":"BiocManager::install(\"MGnifyR\")"},{"path":"/articles/MGnifyR.html","id":"load-mgnifyr-package","dir":"Articles","previous_headings":"","what":"Load MGnifyR package","title":"MGnifyR","text":"installed, MGnifyR made available usual way.","code":"library(MGnifyR) #> Loading required package: MultiAssayExperiment #> Loading required package: SummarizedExperiment #> Loading required package: MatrixGenerics #> Loading required package: matrixStats #> #> Attaching package: 'MatrixGenerics' #> The following objects are masked from 'package:matrixStats': #> #> colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, #> colCounts, colCummaxs, colCummins, colCumprods, colCumsums, #> colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, #> colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats, #> colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds, #> colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads, #> colWeightedMeans, colWeightedMedians, colWeightedSds, #> colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet, #> rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, #> rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps, #> rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins, #> rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks, #> rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, #> rowWeightedMads, rowWeightedMeans, rowWeightedMedians, #> rowWeightedSds, rowWeightedVars #> Loading required package: GenomicRanges #> Loading required package: stats4 #> Loading required package: BiocGenerics #> #> Attaching package: 'BiocGenerics' #> The following objects are masked from 'package:stats': #> #> IQR, mad, sd, var, xtabs #> The following objects are masked from 'package:base': #> #> anyDuplicated, aperm, append, as.data.frame, basename, cbind, #> colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find, #> get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, #> match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, #> Position, rank, rbind, Reduce, rownames, sapply, setdiff, table, #> tapply, union, unique, unsplit, which.max, which.min #> Loading required package: S4Vectors #> #> Attaching package: 'S4Vectors' #> The following object is masked from 'package:utils': #> #> findMatches #> The following objects are masked from 'package:base': #> #> expand.grid, I, unname #> Loading required package: IRanges #> Loading required package: GenomeInfoDb #> Loading required package: Biobase #> Welcome to Bioconductor #> #> Vignettes contain introductory material; view with #> 'browseVignettes()'. To cite Bioconductor, see #> 'citation(\"Biobase\")', and for packages 'citation(\"pkgname\")'. #> #> Attaching package: 'Biobase' #> The following object is masked from 'package:MatrixGenerics': #> #> rowMedians #> The following objects are masked from 'package:matrixStats': #> #> anyMissing, rowMedians #> Loading required package: TreeSummarizedExperiment #> Loading required package: SingleCellExperiment #> Loading required package: Biostrings #> Loading required package: XVector #> #> Attaching package: 'Biostrings' #> The following object is masked from 'package:base': #> #> strsplit"},{"path":"/articles/MGnifyR.html","id":"create-a-client","dir":"Articles","previous_headings":"","what":"Create a client","title":"MGnifyR","text":"functions MGnifyR make use MgnifyClient object keep track JSONAPI url, disk cache location user access tokens. Thus first thing starting analysis instantiate object. following snippet creates . MgnifyClient object contains slots previously mentioned settings.","code":"mg <- MgnifyClient(useCache = TRUE) mg #> An object of class \"MgnifyClient\" #> Slot \"databaseUrl\": #> [1] \"https://www.ebi.ac.uk/metagenomics/api/v1\" #> #> Slot \"authTok\": #> [1] NA #> #> Slot \"useCache\": #> [1] TRUE #> #> Slot \"cacheDir\": #> [1] \"/tmp/Rtmpgw8elH/.MGnifyR_cache\" #> #> Slot \"showWarnings\": #> [1] FALSE #> #> Slot \"clearCache\": #> [1] FALSE #> #> Slot \"verbose\": #> [1] TRUE"},{"path":[]},{"path":"/articles/MGnifyR.html","id":"search-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Search data","title":"MGnifyR","text":"doQuery() function can utilized search results samples studies MGnify database. , fetch information drinking water samples. result table containing accession IDs description – case – samples.","code":"# Fetch studies samples <- doQuery( mg, type = \"samples\", biome_name = \"root:Environmental:Aquatic:Freshwater:Drinking water\", max.hits = 10) colnames(samples) |> head() #> [1] \"biosample\" \"accession\" \"sample-desc\" #> [4] \"environment-biome\" \"environment-feature\" \"environment-material\""},{"path":"/articles/MGnifyR.html","id":"find-relevent-analyses-accessions","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Find relevent analyses accessions","title":"MGnifyR","text":"Now want find analysis accessions. sample might multiple analyses. analysis ID corresponds single run particular pipeline single sample single study. running searchAnalysis() function, get vector analysis IDs samples fed input.","code":"analyses_accessions <- searchAnalysis(mg, \"samples\", samples$accession) analyses_accessions |> head() #> [1] \"MGYA00652201\" \"MGYA00652185\" \"MGYA00643487\" \"MGYA00643486\" \"MGYA00643485\" #> [6] \"MGYA00643484\""},{"path":"/articles/MGnifyR.html","id":"fetch-metadata","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch metadata","title":"MGnifyR","text":"can now check metadata get hint kind data . use getMetadata() function fetch data based analysis IDs. returned value data.frame includes metadata example analysis conducted kind samples analyzed.","code":"analyses_metadata <- getMetadata(mg, analyses_accessions) colnames(analyses_metadata) |> head() #> [1] \"analysis_analysis-status\" \"analysis_pipeline-version\" #> [3] \"analysis_experiment-type\" \"analysis_accession\" #> [5] \"analysis_is-private\" \"analysis_complete-time\""},{"path":"/articles/MGnifyR.html","id":"fetch-microbiome-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch microbiome data","title":"MGnifyR","text":"selected data fetch, can use getResult() output TreeSummarizedExperiment (TreeSE) MultiAssayExperiment (MAE) depending dataset. dataset includes taxonomic profiling data, output single TreeSE. dataset includes also functional data, output multiple TreeSE objects linked together utilizing MAE. can get access individual TreeSE object MAE specifying index name. TreeSE object uniquely positioned support SummarizedExperiment-based microbiome data manipulation visualization. Moreover, enables access miaverse tools. example, can estimate diversity samples… … plot abundances abundant phyla. can also perform analyses principal component analysis microbial profiling data utilizing miaverse tools.","code":"mae <- getResult(mg, accession = analyses_accessions) mae #> A MultiAssayExperiment object of 6 listed #> experiments with user-defined names and respective classes. #> Containing an ExperimentList class object of length 6: #> [1] microbiota: TreeSummarizedExperiment with 3506 rows and 50 columns #> [2] go-slim: TreeSummarizedExperiment with 116 rows and 38 columns #> [3] go-terms: TreeSummarizedExperiment with 3133 rows and 38 columns #> [4] interpro-identifiers: TreeSummarizedExperiment with 18223 rows and 38 columns #> [5] taxonomy: TreeSummarizedExperiment with 3617 rows and 50 columns #> [6] taxonomy-lsu: TreeSummarizedExperiment with 3378 rows and 42 columns #> Functionality: #> experiments() - obtain the ExperimentList instance #> colData() - the primary/phenotype DataFrame #> sampleMap() - the sample coordination DataFrame #> `$`, `[`, `[[` - extract colData columns, subset, or experiment #> *Format() - convert into a long or wide DataFrame #> assays() - convert ExperimentList to a SimpleList of matrices #> exportClass() - save data to flat files mae[[1]] #> class: TreeSummarizedExperiment #> dim: 3506 50 #> metadata(0): #> assays(1): counts #> rownames(3506): 82608 62797 ... 5820 6794 #> rowData names(9): Kingdom Phylum ... taxonomy1 taxonomy #> colnames(50): MGYA00144458 MGYA00144419 ... MGYA00652185 MGYA00652201 #> colData names(64): analysis_analysis.status analysis_pipeline.version #> ... sample_geo.loc.name sample_instrument.model #> reducedDimNames(0): #> mainExpName: NULL #> altExpNames(0): #> rowLinks: NULL #> rowTree: NULL #> colLinks: NULL #> colTree: NULL library(mia) #> This is mia version 1.13.36 #> - Online documentation and vignettes: https://microbiome.github.io/mia/ #> - Online book 'Orchestrating Microbiome Analysis (OMA)': https://microbiome.github.io/OMA/docs/devel/ mae[[1]] <- estimateDiversity(mae[[1]], index = \"shannon\") #> Warning in estimateDiversity(mae[[1]], index = \"shannon\"): 'estimateDiversity' #> is deprecated. Use 'addAlpha' instead. library(scater) #> Loading required package: scuttle #> Loading required package: ggplot2 plotColData(mae[[1]], \"shannon\", x = \"sample_environment..biome.\") # Agglomerate data altExps(mae[[1]]) <- splitByRanks(mae[[1]]) library(miaViz) #> Loading required package: ggraph #> #> Attaching package: 'miaViz' #> The following object is masked from 'package:mia': #> #> plotNMDS # Plot top taxa top_taxa <- getTopFeatures(altExp(mae[[1]], \"Phylum\"), 10) #> Warning in getTopFeatures(altExp(mae[[1]], \"Phylum\"), 10): 'getTopFeatures' is #> deprecated. Use 'getTop' instead. plotAbundance(altExp(mae[[1]], \"Phylum\")[top_taxa, ], rank = \"Phylum\") #> Warning: The following values are already present in `metadata` and will be #> overwritten: 'agglomerated_by_rank'. Consider using the 'name' argument to #> specify alternative names. # Apply relative transformation mae[[1]] <- transformAssay(mae[[1]], method = \"relabundance\") # Perform PCoA mae[[1]] <- runMDS( mae[[1]], assay.type = \"relabundance\", FUN = vegan::vegdist, method = \"bray\") # Plot plotReducedDim( mae[[1]], \"MDS\", colour_by = \"sample_environment..biome.\")"},{"path":"/articles/MGnifyR.html","id":"fetch-raw-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch raw files","title":"MGnifyR","text":"getResult() can utilized retrieve microbial profiling data, getData() can used flexibly retrieve kind data database. returns data simple data.frame list format. result data.frame default. case, includes information publications fetched data portal.","code":"publications <- getData(mg, type = \"publications\") colnames(publications) |> head() #> [1] \"document.id\" \"type\" #> [3] \"id\" \"attributes.pubmed-id\" #> [5] \"attributes.pubmed-central-id\" \"attributes.pub-title\""},{"path":"/articles/MGnifyR.html","id":"fetch-sequence-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch sequence files","title":"MGnifyR","text":"Finally, can use searchFile() getFile() retrieve MGnify pipeline outputs merged sequence reads, assembled contigs, details functional analyses. searchFile(), can search files database. returned table contains search results related analyses fed input. table contains information file also URL address file can loaded. Finally, can download files getFile(). function returns path file stored.","code":"dl_urls <- searchFile(mg, analyses_accessions, type = \"analyses\") target_urls <- dl_urls[ dl_urls$attributes.description.label == \"Predicted alpha tmRNA\", ] colnames(target_urls) |> head() #> [1] \"type\" \"id\" #> [3] \"attributes.alias\" \"attributes.file.format.name\" #> [5] \"attributes.file.format.extension\" \"attributes.file.format.compression\" # Just select a single file from the target_urls list for demonstration. file_url <- target_urls$download_url[[1]] cached_location <- getFile(mg, file_url) # Where are the files? cached_location #> [1] \"/.MGnifyR_cache/analyses/MGYA00652201/file/ERZ20300939_alpha_tmRNA.RF01849.fasta.gz\" sessionInfo() #> R version 4.4.1 (2024-06-14) #> Platform: x86_64-pc-linux-gnu #> Running under: Ubuntu 22.04.4 LTS #> #> Matrix products: default #> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 #> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0 #> #> locale: #> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C #> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 #> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 #> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C #> [9] LC_ADDRESS=C LC_TELEPHONE=C #> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C #> #> time zone: UTC #> tzcode source: system (glibc) #> #> attached base packages: #> [1] stats4 stats graphics grDevices utils datasets methods #> [8] base #> #> other attached packages: #> [1] miaViz_1.13.10 ggraph_2.2.1 #> [3] scater_1.33.4 ggplot2_3.5.1 #> [5] scuttle_1.15.4 mia_1.13.36 #> [7] MGnifyR_0.99.30 TreeSummarizedExperiment_2.13.0 #> [9] Biostrings_2.73.1 XVector_0.45.0 #> [11] SingleCellExperiment_1.27.2 MultiAssayExperiment_1.31.5 #> [13] SummarizedExperiment_1.35.1 Biobase_2.65.1 #> [15] GenomicRanges_1.57.1 GenomeInfoDb_1.41.1 #> [17] IRanges_2.39.2 S4Vectors_0.43.2 #> [19] BiocGenerics_0.51.1 MatrixGenerics_1.17.0 #> [21] matrixStats_1.4.1 knitr_1.48 #> [23] BiocStyle_2.33.1 #> #> loaded via a namespace (and not attached): #> [1] splines_4.4.1 ggplotify_0.1.2 #> [3] urltools_1.7.3 tibble_3.2.1 #> [5] triebeard_0.4.1 polyclip_1.10-7 #> [7] rpart_4.1.23 DirichletMultinomial_1.47.0 #> [9] lifecycle_1.0.4 lattice_0.22-6 #> [11] MASS_7.3-61 SnowballC_0.7.1 #> [13] backports_1.5.0 magrittr_2.0.3 #> [15] Hmisc_5.1-3 sass_0.4.9 #> [17] rmarkdown_2.28 jquerylib_0.1.4 #> [19] yaml_2.3.10 DBI_1.2.3 #> [21] minqa_1.2.8 abind_1.4-8 #> [23] zlibbioc_1.51.1 purrr_1.0.2 #> [25] yulab.utils_0.1.7 nnet_7.3-19 #> [27] tweenr_2.0.3 sandwich_3.1-0 #> [29] GenomeInfoDbData_1.2.12 ggrepel_0.9.6 #> [31] tokenizers_0.3.0 irlba_2.3.5.1 #> [33] tidytree_0.4.6 vegan_2.6-8 #> [35] rbiom_1.0.3 tidyjson_0.3.2 #> [37] pkgdown_2.1.1 permute_0.9-7 #> [39] DelayedMatrixStats_1.27.3 codetools_0.2-20 #> [41] DelayedArray_0.31.11 ggforce_0.4.2 #> [43] tidyselect_1.2.1 aplot_0.2.3 #> [45] UCSC.utils_1.1.0 farver_2.1.2 #> [47] lme4_1.1-35.5 ScaledMatrix_1.13.0 #> [49] viridis_0.6.5 base64enc_0.1-3 #> [51] jsonlite_1.8.8 BiocNeighbors_1.99.0 #> [53] decontam_1.25.0 tidygraph_1.3.1 #> [55] Formula_1.2-5 systemfonts_1.1.0 #> [57] ggnewscale_0.5.0 tools_4.4.1 #> [59] treeio_1.29.1 ragg_1.3.3 #> [61] Rcpp_1.0.13 glue_1.7.0 #> [63] gridExtra_2.3 SparseArray_1.5.34 #> [65] BiocBaseUtils_1.7.3 xfun_0.47 #> [67] mgcv_1.9-1 dplyr_1.1.4 #> [69] withr_3.0.1 BiocManager_1.30.25 #> [71] fastmap_1.2.0 boot_1.3-31 #> [73] bluster_1.15.1 fansi_1.0.6 #> [75] digest_0.6.37 rsvd_1.0.5 #> [77] gridGraphics_0.5-1 R6_2.5.1 #> [79] textshaping_0.4.0 colorspace_2.1-1 #> [81] lpSolve_5.6.21 utf8_1.2.4 #> [83] tidyr_1.3.1 generics_0.1.3 #> [85] data.table_1.16.0 DECIPHER_3.1.4 #> [87] graphlayouts_1.1.1 httr_1.4.7 #> [89] htmlwidgets_1.6.4 S4Arrays_1.5.7 #> [91] pkgconfig_2.0.3 gtable_0.3.5 #> [93] janeaustenr_1.0.0 htmltools_0.5.8.1 #> [95] bookdown_0.40 scales_1.3.0 #> [97] ggfun_0.1.6 rstudioapi_0.16.0 #> [99] reshape2_1.4.4 checkmate_2.3.2 #> [101] nlme_3.1-166 nloptr_2.1.1 #> [103] cachem_1.1.0 zoo_1.8-12 #> [105] stringr_1.5.1 parallel_4.4.1 #> [107] vipor_0.4.7 foreign_0.8-87 #> [109] desc_1.4.3 pillar_1.9.0 #> [111] grid_4.4.1 vctrs_0.6.5 #> [113] slam_0.1-53 BiocSingular_1.21.3 #> [115] beachmat_2.21.6 cluster_2.1.6 #> [117] beeswarm_0.4.0 htmlTable_2.4.3 #> [119] evaluate_0.24.0 mvtnorm_1.3-1 #> [121] cli_3.6.3 compiler_4.4.1 #> [123] rlang_1.1.4 crayon_1.5.3 #> [125] tidytext_0.4.2 labeling_0.4.3 #> [127] mediation_4.5.0 plyr_1.8.9 #> [129] fs_1.6.4 ggbeeswarm_0.7.2 #> [131] stringi_1.8.4 viridisLite_0.4.2 #> [133] BiocParallel_1.39.0 assertthat_0.2.1 #> [135] munsell_0.5.1 lazyeval_0.2.2 #> [137] Matrix_1.7-0 patchwork_1.2.0 #> [139] sparseMatrixStats_1.17.2 highr_0.11 #> [141] igraph_2.0.3 memoise_2.0.1 #> [143] RcppParallel_5.1.9 bslib_0.8.0 #> [145] ggtree_3.13.1 ape_5.8"},{"path":"/articles/MGnifyR_long.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"MGnifyR, extended vignette","text":"MGnifyR package designed ease access EBI’s MGnify resource, allowing searching retrieval multiple datasets downstream analysis. MGnify pipelines undoubtedly useful, currently implemented produce results strictly per-sample basis. whole study results available, comparisons across studies difficult. MGnifyR package designed facilitate cross-study analyses handling per-sample data retrieval merging details internally, leaving user free perform analysis see fit. latest version MGnifyR seamlessly integrates miaverse framework providing access tools microbiome -stream analytics. integration enables users leverage optimized standardized methods analyzing microbiome. Additionally, users can benefit comprehensive tutorial book offers valuable guidance support.","code":""},{"path":"/articles/MGnifyR_long.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"MGnifyR, extended vignette","text":"MGnifyR currently hosted GitHub, can installed using via devtools. MGnifyR built using following snippet.","code":"BiocManager::install(\"MGnifyR\")"},{"path":"/articles/MGnifyR_long.html","id":"load-mgnifyr-package","dir":"Articles","previous_headings":"","what":"Load MGnifyR package","title":"MGnifyR, extended vignette","text":"installed, MGnifyR made available usual way.","code":"library(MGnifyR)"},{"path":"/articles/MGnifyR_long.html","id":"create-a-client","dir":"Articles","previous_headings":"","what":"Create a client","title":"MGnifyR, extended vignette","text":"functions MGnifyR make use MgnifyClient object keep track JSONAPI url, disk cache location user access tokens. Thus first thing starting analysis instantiate object. following snippet creates . ’s recommended local caching enabled useCache = TRUE. Queries MGnify API can quite slow, particularly retrieving multipage results many analyses (many Interpro results). Using local disk cache can significantly speed subsequent work, bypassing need re-query API. Use cache entirely transparent, caching occurs raw data level. cache can persist across MGnifyR sessions, can even used multiple sessions simultaneously - provided different sets accessions queried . Optionally, username password may specified client creation, causing MGnifyR attempt retrieval authentication token API. gives access non-public results, currently author imposed embargo period.","code":"mg <- MgnifyClient() mg mg <- MgnifyClient( username = \"Webin-username\", password = \"your-password\", useCache = TRUE)"},{"path":[]},{"path":"/articles/MGnifyR_long.html","id":"search-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Search data","title":"MGnifyR, extended vignette","text":"MGnifyR gives users access complete range search functionality implemented MGnify JSON API. single function doQuery() used perform searching, allowing Studies, Samples, Runs Accession interrogated common interface. MGnifyR functions first argument client must valid MgnifyClient instance. remaining required parameter qtype, specifying type data queried, may one studies, samples, runs, analyses assemblies. general parameter include max.hits. Unlike MGnifyR high level functions, caching turned default doQuery(). New data analyses added MGnify time, enabling caching default may lead --date search results long-lived sessions. However, ’s easy switch back , may useful many cases. Also, given huge ever increasing number datasets available MGnify, limit number results returned may set using max.hits. default set 200, exploratory queries sufficient. may increased decreased directly specifying max.hits, disabled completely (limit) setting max.hits=NULL. cases want specific search, also use either accession parameter, many filter options available API, discussed . Specifying accession id, case samples, runs assemblies may vector ids, returns data.frame metadata one row per matching accession. accession NULL (default) remaining parameters define filters applied API search result. Details parameters given help(doQuery). way example though, supposing interested amplicon Illumina samples arctic, might try following query: Specifying accession parameter restrict results just matching particular entry, study, sample run. example, retrieve information study “MGYS00002891”:","code":"northpolar <- doQuery( mg, \"samples\", latitude_gte=60.0, experiment_type=\"amplicon\", biome_name=\"Soil\", instrument_platform = \"Illumina\", max.hits = 10) head(northpolar) study_samples <- doQuery(mg, \"studies\", accession=\"MGYS00002891\") head(study_samples)"},{"path":"/articles/MGnifyR_long.html","id":"find-relevent-analyses-accessions","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Find relevent analyses accessions","title":"MGnifyR, extended vignette","text":"obtained particular set search hits, ’s now time retrieve associated results. General automated analysis complicated MGnify database design, wherein example samples may shared multiple studies, studies analysed multiple times using different versions pipeline. Navigating “many--one” relationships can tricky, MGnifyR resorts using analyses accessions ’s canonical identifier. analysis corresponds single run particular pipeline single sample single study. downside approach queries returning studies, samples (anything analyses) accessions need converting corresponding analyses. MGnifyR therefore provides helper function handle conversion - searchAnalysis(). Following previous search, list study accessions, convert corresponding analyses use: useful side effect call attribute metadata sample now retrieved stored local cache. Thus subsequent API calls samples (occur multiple times later steps) significantly faster. ’s important aware results searchAnalysis() command necessarily one--one match input accessions. MGnify analysis runs sometimes performed multiple times, perhaps using different versions pipeline. Thus filtering result list may required, easily performed illustrated next section.","code":"analyses_accessions <- searchAnalysis( mg, type=\"studies\", accession = study_samples$accession) head(analyses_accessions)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-metadata","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch metadata","title":"MGnifyR, extended vignette","text":"point long list analysis instances (potential duplicates) corresponding samples previously found. use getMetadata function download combine associated sample, run study metadata, filter required include rows want. resulting data.frame columns names prefixed source type. example, “sample_xxx” columns correspond metadata gleaned querying accession’s sample entry. MGnify allows quite flexible specification arbitray metadata submission time, many cases leading quite sparse data.frame results accession queries sourced one study. instance, one sample contains entry “sample_soil_PH”, entries rows filled NA. MGnifyR automatically clean missing values - instead opting allow user choose correct action. particular study ’re looking marine biome, suppose interested samples analyses sampling depth known. following snippet filters full data.frame selecting entries contain valid sample_depth. ’s worth noting .numeric call ensure column converted numeric type checked. sample data MGnifyR initially retrieved type character, ’s user make sure ostensibly numeric entries converted properly.","code":"analyses_metadata <- getMetadata(mg, analyses_accessions) head(analyses_metadata) known_depths <- analyses_metadata[ !is.na(as.numeric(analyses_metadata$sample_depth)), ] # How many are left? dim(known_depths)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-microbiome-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch microbiome data","title":"MGnifyR, extended vignette","text":"selected analyses wish examine , getResult() used download associated OTU tables taxonomy, join results single TreeSummarizedExperiment (TreeSE) object. TreeSE becoming defacto standard taxonomic abundance munging R. TreeSE objects integrate abundance, taxonomic, phylogenetic, sample sequence data single object, powerful facilities filtering, processing plotting results. Compared phyloseq object, TreeSE scalable capable efficient data analysis. miaverse framework developed around TreeSE data container. provides tools analysis visualization. Moreover, includes comprehensive tutorial book called OMA.","code":""},{"path":"/articles/MGnifyR_long.html","id":"amplicon-sequencing","dir":"Articles","previous_headings":"Functions for fetching the data > Fetch microbiome data","what":"Amplicon sequencing","title":"MGnifyR, extended vignette","text":"dataset includes amplicon sequencing data, .e., dataset include function predictions, getResult() method returns dataset TreeSE default. See output types function documentation. TreeSE object uniquely positioned support SummarizedExperiment-based microbiome data manipulation visualization. Moreover, enables access miaverse tools. example, can estimate diversity samples. needed, TreeSE can converted phyloseq.","code":"tse <- getResult(mg, accession = analyses_accessions, get.func = FALSE) tse library(mia) tse <- estimateDiversity(tse, index = \"shannon\") library(scater) plotColData(tse, \"shannon\", x = \"sample_geo.loc.name\") library(miaViz) plotAbundance(tse[!is.na( rowData(tse)[[\"Kingdom\"]] ), ], rank = \"Kingdom\") pseq <- makePhyloseqFromTreeSE(tse) pseq"},{"path":"/articles/MGnifyR_long.html","id":"metagenomics","dir":"Articles","previous_headings":"Functions for fetching the data > Fetch microbiome data","what":"Metagenomics","title":"MGnifyR, extended vignette","text":"Although previous queries based results doQuery(), now concentrate combining comparing results specific studies. Since newly performed analyses retrieved first doQuery() call, ’s likely time vignette read, query results different. principally due rapid increase MGnify submissions, leading potential lack consistency even closely spaced queries. mentioned previously, may best use useCache=FALSE MgnifyCLient object doQuery() calls, ensure queries actually returning latest data. remainder vignette however, ’ll comparing 3 ostensibly different studies. study saltmarsh soils York University, human faecal samples survey healthy Sardinians, set samples hydrothermal vents Mid-Cayman rise Carribbean Sea. simplify things, first 20 samples study used. Furthermore, intention demonstrate functionality MGnifyR package, rather produce scientifically rigorous results. first step new accession list , previously, retrieve associated metadata using getMetadata(), seen doQuery() results, returned data.frame contains large number columns. autogenerated flexible, column names can little difficult predict, examining colnames(full_metadata) make things clearer. full_metadata get idea type data ’re dealing , can extract useul information sequencing platform, source biome, etc. next code snippet tallies columns give idea ’s available. boxplot also indicates within study read counts similar, probably need use sort normalization procedure comparing across samples. might also want drop particularly low read coverage samples analysis. , can fetch data calling getResult(). bulk.dl=TRUE potential significantly speed data retrieval. MGnify makes functional results available two separate ways, either per-analysis basis web api, whole study level large files, tab separated (TSV), columns representing results analysis. bulk.dl FALSE, MGnifyR queries web api get results (given functional analyses results may consist thousands entries) may take significant time. Setting bulk.dl TRUE causes MGnifyR determine source study associated particular analysis instead download parse corresponding results file. Since result file contains entries analyses associated study, taking advantage MGnifyR’s local caching single download provides results many future analyses. cases affords several orders magnitude speedup api query case. Unfortunately, column entries per-study results files always directly correspond particular analysis run, causing retrieval fail. principal cause believed running multiple analyses jobs sample. Thus reliability, bulk.dl FALSE default. general recommendation though, try setting TRUE first time getResult() used set accessions. fails, setting bulk.dl FALSE enable robust approach allowing analysis continue. might take though. Hopefully future sample/analysis correspondence mismatches fixed default bulk.dl switch TRUE. metagenomic samples, result MultiAssayExperiment (MAE) links multiple TreeSE objects one dataset. TreeSE objects include taxonomic profiling data along functional data unique objects. objects linked sample names. can get access individual object experiment specifying index name. can perform principal component analysis microbial profiling data utilizing miaverse tools.","code":"soil <- searchAnalysis(mg, \"studies\", \"MGYS00001447\") human <- searchAnalysis(mg, \"studies\", \"MGYS00001442\") marine <- searchAnalysis(mg, \"studies\", \"MGYS00001282\") # Combine analyses all_accessions <- c(soil, human, marine) head(all_accessions) full_metadata <- getMetadata(mg, all_accessions) colnames(full_metadata) head(full_metadata) # Load ggplot2 library(ggplot2) #Distribution of sample source material: table(full_metadata$`sample_environment-material`) #What sequencing machine(s) were used? table(full_metadata$`sample_instrument model`) # Boxplot of raw read counts: ggplot( full_metadata, aes(x=study_accession, y=log( as.numeric(`analysis_Submitted nucleotide sequences`)))) + geom_boxplot(aes(group=study_accession)) + theme_bw() + ylab(\"log(submitted reads)\") mae <- getResult(mg, all_accessions, bulk.dl = TRUE) mae mae[[2]] # Apply relative transformation mae[[1]] <- transformAssay(mae[[1]], method = \"relabundance\") # Perform PCoA mae[[1]] <- runMDS( mae[[1]], assay.type = \"relabundance\", FUN = vegan::vegdist, method = \"bray\") # Plot plotReducedDim(mae[[1]], \"MDS\", colour_by = \"sample_environment.feature\")"},{"path":"/articles/MGnifyR_long.html","id":"fetch-raw-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch raw files","title":"MGnifyR, extended vignette","text":"getResult() can utilized retrieve microbial profiling data, getData() can used flexibly retrieve kind data database. returns data simple data.frame list format.","code":"kegg <- getData( mg, type = \"kegg-modules\", accession = \"MGYA00642773\", accession.type = \"analyses\") head(kegg)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-sequence-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch sequence files","title":"MGnifyR, extended vignette","text":"Finally, can use searchFile() getFile() retrieve MGnify pipeline outputs merged sequence reads, assembled contigs, details functional analyses. searchFile() simple wrapper function , supplied list accessions, finds urls files ’re . cases ’ll want filter returned list files interest, easily done resulting data.frame object. addition actual download location (download_url column), extra columns include file type, contents compression. ’s recommended colnames data.frame examined get grasp available metadata. demonstrate process, code retrieves data.frame containing available downloads accession ’ve examining previously. filters retain files corresponding retain annotated amino acid sequence files. list types available files, guide filtering, something like following might useful. Unlike MGnifyR functions, searchFile() limited analyses, specifying accession_type results types may found. instance, general genome functionality yet integrated MGnifyR, can retrieve associated files particular genome accession following: found set target urls, final step use getFile() actually retrieve file. Unlike functions, works single url location , entry target_urls must downloaded individually - easily done either looping applying list. files intended used external programs, might easiest provide file parameter function call, specifies local filename writing file. default MGnifyR use local cache, can make getting file afterwards awkward. Regardless, default behaviour getFile() retrieve file specified parameter url, save disk, return filepath saved . second download option available, allows built-parsing file. know ahead time processing performed, may possible integrate function, pass function getFile() read.func argument. function question take single argument (complete path name locally downloaded file) result call returned place usual output file name. Alternatively files first downloaded standard way, processed using function loop. Therefore many cases read.func parameter redundant. However, many outputs MGnify can quite large, meaning local storage many files may become issue. providing read_func parameter (necessarily setting MgnifyClient object: useCache=FALSE) analysis large number datasets may possible minimal storage requirements. illustrate, suppose interested retrieving detected sequences matching particular PFAM motif set analyses. simple function uses Biostrings package read amino acid fasta file, searches matching PFAM tag sequence name, tallies unique sequences single data.frame row. case PFAM motif identifies sequences coding amoC gene, found ammonia methane oxidizing organisms, filtering method used. defined function, just remains include call getFile().","code":"# Find list of available downloads dl_urls <- searchFile( mg, full_metadata$analysis_accession, type = \"analyses\") # Filter table target_urls <- dl_urls[ dl_urls$attributes.description.label == \"Predicted CDS with annotation\", ] head(target_urls) table(dl_urls$attributes.description.label) genome_urls <- searchFile(mg, \"MGYG000433953\", type = \"genomes\") genome_urls[ , c(\"id\", \"attributes.file.format.name\", \"download_url\")] # Just select a single file from the target_urls list for demonstration. # Default behavior - use local cache. cached_location1 = getFile(mg, target_urls$download_url[[1]]) # Specifying a file cached_location2 <- getFile( mg, target_urls$download_url[[1]]) cached_location <- c(cached_location1, cached_location2) # Where are the files? cached_location library(Biostrings) # Simple function to a count of unique sequences matching PFAM amoC/mmoC motif getAmoCseqs <- function(fname){ sequences <- readAAStringSet(fname) tgtvec <- grepl(\"PF04896\", names(sequences)) as.data.frame(as.list(table(as.character(sequences[tgtvec])))) } # Just download a single accession for demonstration, specifying a read_function amoC_seq_counts <- getFile( mg, target_urls$download_url[[1]], read_func = getAmoCseqs) amoC_seq_counts sessionInfo()"},{"path":"/articles/MGnify_course.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Metagenomics bioinformatics at MGnify","text":"notebook aim demonstrate MGnifyR tool can used fetch data MGnify metagenomic analysis. show analyse data utilizing cutting-edge tools microbiome data science including estimating alpha beta diversity along differential abundance analysis. MGnifyR R/Bioconductor package provides set tools easily accessing processing MGnify data R, making queries MGnify databases MGnify API. benefit MGnifyR data can either fetched tsv format directly combined TreeSummarizedExperiment (TreeSE) object run analysis custom workflow. Utilizing TreeSE enables access wide range tools Bioconductor’s SummarizedExperiment (SE) ecosystem, mia package covering microbiome-specific methods SE ecosystem. information microbiome data science Bioconductor, refer Orchestrating Microbiome Analysis (OMA) online book.","code":""},{"path":"/articles/MGnify_course.html","id":"load-packages","dir":"Articles","previous_headings":"","what":"Load packages","title":"Metagenomics bioinformatics at MGnify","text":"","code":"# List of packages that we need packages <- c(\"ANCOMBC\", \"caret\", \"MGnifyR\", \"mia\", \"miaViz\", \"scater\") # Get packages that are already installed packages_already_installed <- packages[ packages %in% installed.packages() ] # Get packages that need to be installed packages_need_to_install <- setdiff( packages, packages_already_installed ) # Loads BiocManager into the session. Install it if it is not already installed. if( !require(\"BiocManager\") ){ install.packages(\"BiocManager\") library(\"BiocManager\") } # If there are packages that need to be installed, installs them with BiocManager # Updates old packages. if( length(packages_need_to_install) > 0 ) { install(packages_need_to_install, ask = FALSE) } # Load all packages into session. Stop if there are packages that were not # successfully loaded pkgs_not_loaded <- !sapply(packages, require, character.only = TRUE) pkgs_not_loaded <- names(pkgs_not_loaded)[ pkgs_not_loaded ] if( length(pkgs_not_loaded) > 0 ){ stop( \"Error in loading the following packages into the session: '\", paste0(pkgs_not_loaded, collapse = \"', '\"), \"'\") }"},{"path":"/articles/MGnify_course.html","id":"data-import","dir":"Articles","previous_headings":"","what":"Data import","title":"Metagenomics bioinformatics at MGnify","text":"example, going fetch MGnify analysis results metadata dataset human gut microbiome viewed across age geography. interact MGnify database, need create MgnifyClient object. object allows us fetch data MGnify, can configure use cache efficiency. Using MgnifyClient object, can search analyses associated study. analysis refers metagenomic runs performed samples. sample can multiple runs made, work analyses samples; analysis identifier points single entity. MGnify database, study unique identifier. study interested accession ID “MGYS00005154”. Now ready load metadata analyses get idea kind data dealing . currently (17 Sep 2024) almost 1,000 analyses available. Downloading whole dataset take time use memory cache. can see analyses performed different pipelines. Let’s take analyses generated pipeline version 5.0. now analyses point unique sample. final step fetch abundance tables TreeSummarizedExperiment format. fetched data TreeSE object, including taxonomy annotations. See OMA online book handle data format.","code":"# Create the MgnifyClient object with caching enabled mg <- MgnifyClient( useCache = TRUE, # cacheDir = \"/home/trainers\" cacheDir = \"/home/tvborm/Downloads/.mgnify_cache\" ) study_id <- \"MGYS00005154\" analysis_id <- searchAnalysis(mg, \"studies\", study_id) analysis_id |> head() metadata <- getMetadata(mg, accession = analysis_id) metadata <- metadata[metadata[[\"analysis_pipeline-version\"]] == \"5.0\", ] tse <- getResult( mg, accession = metadata[[\"analysis_accession\"]], get.func = FALSE ) tse"},{"path":"/articles/MGnify_course.html","id":"preprocessing","dir":"Articles","previous_headings":"","what":"Preprocessing","title":"Metagenomics bioinformatics at MGnify","text":"agglomerate data Order level means summarize abundances specific level. OMA provides chapter explains agglomeration detail. unique properties microbiome data, apply transformations. , perform relative CLR transformations. can find information transformations OMA.","code":"tse_order <- agglomerateByRank(tse, rank = \"Order\") # Transform the main TreeSE tse <- transformAssay(tse, method = \"relabundance\") tse <- transformAssay(tse, method = \"rclr\") # Transform the agglomerated TreeSE tse_order <- transformAssay(tse_order, method = \"relabundance\") tse_order <- transformAssay(tse_order, method = \"rclr\")"},{"path":"/articles/MGnify_course.html","id":"alpha-diversity","dir":"Articles","previous_headings":"","what":"Alpha diversity","title":"Metagenomics bioinformatics at MGnify","text":"Alpha diversity measures community diversity within sample. Leanr community diversity . can test whether diversity differences statistically significant. utilize Mann Whithney U test (Wilcoxon test). add p-values plot, see OMA.","code":"# Calculate alpha diversity tse <- addAlpha(tse) # Create a plot p <- plotColData( tse, y = \"shannon_diversity\", x = \"sample_geographic.location..country.and.or.sea.region.\", show_boxplot = TRUE ) p pairwise.wilcox.test( tse[[\"shannon_diversity\"]], tse[[\"sample_geographic.location..country.and.or.sea.region.\"]], p.adjust.method = \"fdr\" )"},{"path":"/articles/MGnify_course.html","id":"beta-diversity","dir":"Articles","previous_headings":"","what":"Beta diversity","title":"Metagenomics bioinformatics at MGnify","text":"can evaluate different microbial compositions samples. aim evaluate whether can find patterns data associates covariates. perform Principal Coodinate Analysis (PCoA) Bray-Curtis dissimilarity. See community similarity chapter OMA information.","code":"# Perform PCoA tse <- runMDS( tse, FUN = getDissimilarity, method = \"bray\", assay.type = \"relabundance\" ) # Visualize PCoA p <- plotReducedDim( tse, dimred = \"MDS\", colour_by = \"sample_geographic.location..country.and.or.sea.region.\" ) p"},{"path":"/articles/MGnify_course.html","id":"differetial-abundance-analysis-daa","dir":"Articles","previous_headings":"","what":"Differetial abundance analysis (DAA)","title":"Metagenomics bioinformatics at MGnify","text":"DAA, analyze certain featues’ abundances differ certain groups. , OMA dedicated chapter also topic. Next visualize 5 features lowest p-values.","code":"# Perform DAA res <- ancombc2( data = tse_order, assay.type = \"counts\", fix_formula = \"sample_geographic.location..country.and.or.sea.region.\", p_adj_method = \"fdr\", ) # Get the most significant features n_top <- 4 res_tab <- res[[\"res\"]] res_tab <- res_tab[order(res_tab[[\"q_(Intercept)\"]]), ] top_feat <- res_tab[seq_len(n_top), \"taxon\"] # Create a plot p <- plotExpression( tse_order, features = top_feat, assay.type = \"relabundance\", x = \"sample_geographic.location..country.and.or.sea.region.\", show_boxplot = TRUE, show_violin = FALSE, point_shape = NA ) + scale_y_log10() p"},{"path":"/articles/MGnify_course.html","id":"session-info","dir":"Articles","previous_headings":"","what":"Session info","title":"Metagenomics bioinformatics at MGnify","text":"","code":"sessionInfo()"},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Tuomas Borman. Author, maintainer. Ben Allen. Author. Leo Lahti. Author.","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Borman T, Allen B, Lahti L (2024). MGnifyR: R interface EBI MGnify metagenomics resource. R package version 0.99.30, https://github.com/EBI-Metagenomics/MGnifyR.","code":"@Manual{, title = {MGnifyR: R interface to EBI MGnify metagenomics resource}, author = {Tuomas Borman and Ben Allen and Leo Lahti}, year = {2024}, note = {R package version 0.99.30}, url = {https://github.com/EBI-Metagenomics/MGnifyR}, }"},{"path":"/index.html","id":"mgnifyr-","dir":"","previous_headings":"","what":"R interface to EBI MGnify metagenomics resource","title":"R interface to EBI MGnify metagenomics resource","text":"R package searching retrieving data EBI Metagenomics resource. cases, MGnifyR interacts directly JSONAPI, rather relying downloading analyses outputs TSV files. Thus general - allowing example intuitive combining multiple studies analyses single workflow, cases slower afformentioned direct access. Local caching results disk implemented help counter overheads, data downloads can slow - particularly functional annotation retrieval. MGnifyR package part miaverse microbiome analysis ecosystem enabling usage mia miaverse packages. research received funding Horizon 2020 Programme European Union within FindingPheno project grant agreement 952914. FindingPheno, EU-funded project, dedicated developing computational tools methodologies integration analysis multi-omics data. primary objective deepen understanding interactions hosts microbiomes. can find information FindingPheno website.","code":""},{"path":[]},{"path":"/index.html","id":"bioc-release","dir":"","previous_headings":"Installation","what":"Bioc-release","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"if (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"MGnifyR\")"},{"path":"/index.html","id":"bioc-devel","dir":"","previous_headings":"Installation","what":"Bioc-devel","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"if (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") # The following initializes usage of Bioc devel BiocManager::install(version='devel') BiocManager::install(\"MGnifyR\")"},{"path":"/index.html","id":"github","dir":"","previous_headings":"Installation","what":"GitHub","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"remotes::install_github(\"EBI-Metagenomics/MGnifyR\")"},{"path":"/index.html","id":"basic-usage","dir":"","previous_headings":"","what":"Basic usage","title":"R interface to EBI MGnify metagenomics resource","text":"detailed instructions read associated function help vignette (vignette(\"MGNifyR\"))","code":"library(MGnifyR) # Set up the MGnify client instance mgclnt <- MgnifyClient(usecache = TRUE, cache_dir = '/tmp/MGnify_cache') # Retrieve the list of analyses associated with a study accession_list <- searchAnalysis(mgclnt, \"studies\", \"MGYS00005058\", usecache = TRUE) # Download all associated study/sample and analysis metadata meta_dataframe <- getMetadata(mgclnt, accession_list, usecache = TRUE) # Convert analyses outputs to a single `MultiAssayExperiment` object mae <- getResult(mgclnt, meta_dataframe$analysis_accession, usecache = TRUE) mae"},{"path":"/reference/MGnifyR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"MGnifyR Package. — MGnifyR-package","title":"MGnifyR Package. — MGnifyR-package","text":"MGnifyR implements interface EBI MGnify database. See vignette general introduction package. MGnify general MGnify information, API documentation details JSONAPI implementation.","code":""},{"path":[]},{"path":"/reference/MGnifyR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"MGnifyR Package. — MGnifyR-package","text":"Maintainer: Tuomas Borman tuomas.v.borman@utu.fi (ORCID) Authors: Ben Allen ben.allen@ncl.ac.uk Leo Lahti leo.lahti@iki.fi (ORCID)","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":null,"dir":"Reference","previous_headings":"","what":"MgnifyClient accessors and mutators — databaseUrl","title":"MgnifyClient accessors and mutators — databaseUrl","text":"MgnifyClient accessors mutators","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"MgnifyClient accessors and mutators — databaseUrl","text":"","code":"databaseUrl(x) authTok(x) useCache(x) cacheDir(x) showWarnings(x) clearCache(x) verbose(x) databaseUrl(x) <- value authTok(x) <- value useCache(x) <- value cacheDir(x) <- value showWarnings(x) <- value clearCache(x) <- value verbose(x) <- value # S4 method for class 'MgnifyClient' databaseUrl(x) # S4 method for class 'MgnifyClient' authTok(x) # S4 method for class 'MgnifyClient' useCache(x) # S4 method for class 'MgnifyClient' cacheDir(x) # S4 method for class 'MgnifyClient' showWarnings(x) # S4 method for class 'MgnifyClient' clearCache(x) # S4 method for class 'MgnifyClient' verbose(x) # S4 method for class 'MgnifyClient' databaseUrl(x) <- value # S4 method for class 'MgnifyClient' authTok(x) <- value # S4 method for class 'MgnifyClient' useCache(x) <- value # S4 method for class 'MgnifyClient' cacheDir(x) <- value # S4 method for class 'MgnifyClient' showWarnings(x) <- value # S4 method for class 'MgnifyClient' clearCache(x) <- value # S4 method for class 'MgnifyClient' verbose(x) <- value"},{"path":"/reference/MgnifyClient-accessors.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"MgnifyClient accessors and mutators — databaseUrl","text":"x MgnifyClient object. value value added certain slot.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"MgnifyClient accessors and mutators — databaseUrl","text":"value MgnifyClient object nothing.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"MgnifyClient accessors and mutators — databaseUrl","text":"functions fetching mutating slots MgnifyClient object.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"MgnifyClient accessors and mutators — databaseUrl","text":"","code":"mg <- MgnifyClient() databaseUrl(mg) #> [1] \"https://www.ebi.ac.uk/metagenomics/api/v1\" showWarnings(mg) <- FALSE"},{"path":"/reference/MgnifyClient.html","id":null,"dir":"Reference","previous_headings":"","what":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"Constructor creating MgnifyClient object allow access MGnify database. MgnifyClient object","code":""},{"path":"/reference/MgnifyClient.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"","code":"MgnifyClient( username = NULL, password = NULL, useCache = FALSE, cacheDir = tempdir(), showWarnings = FALSE, verbose = TRUE, clearCache = FALSE, ... )"},{"path":"/reference/MgnifyClient.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"username single character value specifying optional username authentication. (default: username = NULL) password single character value specifying optional password authentication. (default: password = NULL) useCache single boolean value specifying whether enable -disk caching results session. use cases TRUE. (default: useCache = FALSE) cacheDir single character value specifying folder contain local cache. Note cached files persistent, cache directory may reused sessions, taking advantage previously downloaded results. directory created exist already. (default: cacheDir = tempdir()) showWarnings single boolean value specifying whether print warnings invocation MGnifyR functions. (default: showWarnings = FALSE) verbose single boolean value specifying whether print extra output invocation MGnifyR functions. (default: verbose = FALSE) clearCache single boolean value specifying whether clear cache. (default: clearCache = FALSE) ... optional arguments: url single character value specifying url address database. (default: url = \"https://www.ebi.ac.uk/metagenomics/api/v1\")","code":""},{"path":"/reference/MgnifyClient.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"MgnifyClient object.","code":""},{"path":"/reference/MgnifyClient.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"functions MGnifyR package take MgnifyClient object first argument. object allows simple handling user authentication access private data, manages general options querying MGnify database. object required functions MGnifyR package.","code":""},{"path":"/reference/MgnifyClient.html","id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"databaseUrl single character value specifying URL address database. authTok single character value specifying authentication token. useCache single boolean value specifying whether use cache. cacheDir single character value specifying cache directory. showWarnings single boolean value specifying whether show warnings. clearCache single boolean value specifying whether clear cache. verbose single boolean value specifying whether show messages.","code":""},{"path":"/reference/MgnifyClient.html","id":"constructor","dir":"Reference","previous_headings":"","what":"Constructor","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"See MgnifyClient constructor.","code":""},{"path":"/reference/MgnifyClient.html","id":"accessor","dir":"Reference","previous_headings":"","what":"Accessor","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"See MgnifyClient-accessors accessor functions.","code":""},{"path":"/reference/MgnifyClient.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"","code":"my_client <- MgnifyClient( useCache = TRUE, cacheDir = \"/scratch/MGnify_cache_location\" ) if (FALSE) { # \\dontrun{ # Use username and password to get access to non-public data my_client <- MgnifyClient( username = \"Webin-1122334\", password = \"SecretPassword\", useCache = TRUE, cacheDir = \"/scratch/MGnify_cache_location\" ) } # }"},{"path":"/reference/deprecate.html","id":null,"dir":"Reference","previous_headings":"","what":"These functions will be deprecated. Please use other functions instead. — deprecate","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"functions deprecated. Please use functions instead.","code":""},{"path":"/reference/deprecate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"","code":"mgnify_client( username = NULL, password = NULL, usecache = FALSE, cache_dir = NULL, warnings = FALSE, use_memcache = FALSE, ... ) mgnify_query( client, qtype = \"samples\", accession = NULL, asDataFrame = TRUE, maxhits = 200, usecache = FALSE, ... ) mgnify_analyses_from_samples(client, accession, usecache = TRUE, ...) mgnify_analyses_from_studies(client, accession, usecache = TRUE, ...) mgnify_get_download_urls( client, accessions, accession_type, usecache = TRUE, ... ) mgnify_download( client, url, file = NULL, read_func = NULL, usecache = TRUE, Debug = FALSE, ... ) mgnify_get_analyses_results( client = NULL, accessions, retrievelist = c(), compact_results = TRUE, usecache = TRUE, bulk_dl = FALSE, ... ) mgnify_get_analyses_phyloseq( client = NULL, accessions, usecache = TRUE, returnLists = FALSE, tax_SU = \"SSU\", get_tree = FALSE, ... ) mgnify_get_analyses_metadata(client, accessions, usecache = TRUE, ...) mgnify_retrieve_json( client, path = \"biomes\", complete_url = NULL, qopts = NULL, maxhits = 200, usecache = FALSE, Debug = FALSE, ... )"},{"path":"/reference/deprecate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"username - password - usecache - cache_dir - warnings - use_memcache - ... - client - qtype - accession - asDataFrame - maxhits - accessions - accession_type - url - file - read_func - Debug - retrievelist - compact_results - bulk_dl - returnLists - tax_SU - get_tree - path - complete_url - qopts -","code":""},{"path":"/reference/deprecate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"-","code":""},{"path":"/reference/doQuery.html","id":null,"dir":"Reference","previous_headings":"","what":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"Search MGnify database studies, samples, runs, analyses, biomes, assemblies, genomes.","code":""},{"path":"/reference/doQuery.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"","code":"doQuery(x, ...) # S4 method for class 'MgnifyClient' doQuery( x, type = \"studies\", accession = NULL, as.df = TRUE, max.hits = 200, ... )"},{"path":"/reference/doQuery.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"x MgnifyClient object. ... Remaining parameter key/value pairs may supplied filter returned values. Available options differ types. See discussion Details section details. type single character value specifying type objects query. Must one following options: studies, samples, runs, analyses, biomes, assemblies, super-studies, experiment-types, pipelines, pipeline-tools, publications, genomes, genome-search, genome-search/gather, genome-catalogues, genomeset, cogs, kegg-modules, kegg-classes, antismash-geneclusters, annotations/go-terms, annotations/interpro-identifiers, annotations/kegg-modules, annotations/pfam-entries, annotations/kegg-orthologs, annotations/genome-properties, annotations/antismash-gene-clusters, annotations/organisms, mydata. (default: type = \"studies\") accession single character value vector character values specifying MGnify accession identifiers (type type) NULL. NULL, results defined parameters retrieved. (default: accession = NULL) .df single boolean value specifying whether return results data.frame leave nested list. cases, .df = TRUE make sense. (default: .df = TRUE) max.hits single integer value specifying maximum number results return FALSE. actual number results actually higher max.hits, clipping occurs pagination page boundaries. disable limit, set max.hits = NULL. (default: max.hits = 200)","code":""},{"path":"/reference/doQuery.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"nested list data.frame containing results query.","code":""},{"path":"/reference/doQuery.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"doQuery flexible query function, harnessing \"full\" power JSONAPI MGnify search filters. Search results may filtered metadata value, associated study/sample/analyse etc. See Api browser information MGnify database filters. can find help customizing queries . example following filters available: studies: accession, biome_name, lineage, centre_name, include samples: accession, experiment_type, biome_name, lineage, geo_loc_name, latitude_gte, latitude_lte, longitude_gte, longitude_lte, species, instrument_model, instrument_platform, metadata_key, metadata_value_gte, metadata_value_lte, metadata_value, environment_material, environment_feature, study_accession, include runs: accession, experiment_type, biome_name, lineage, species, instrument_platform, instrument_model, metdata_key, metadata_value_gte, metadata_value_lte, metadata_value, sample_accession, study_accession, include analyses: biome_name, lineage, experiment_type, species, sample_accession, pipeline_version biomes: depth_gte, depth_lte assemblies: depth_gte, depth_lte Unfortunately appears cases, filters work expected, important check results returned match expected. Even unfortunately error parameter specification, query run filter parameters present . Thus result appear superficially correct infact correspond something completely different. behaviour hopefully fixed future incarnations MGnifyR JSONAPI, now users double check returned values. currently possible combine queries type single call (example search samples latitude). However, possible run multiple queries combine results using set operations R get desired behaviour.","code":""},{"path":"/reference/doQuery.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"","code":"mg <- MgnifyClient(useCache = FALSE) # Get a list of studies from the Agricultural Wastewater : agwaste_studies <- doQuery( mg, \"studies\", biome_name=\"Agricultural wastewater\" ) if (FALSE) { # \\dontrun{ # Get all samples from a particular study samps <- doQuery(mg, \"samples\", accession=\"MGYS00004521\") # Search polar samples samps_np <- doQuery(mg, \"samples\", latitude_gte=66, max.hits=10) samps_sp <- doQuery(mg, \"samples\", latitude_lte=-66, max.hits=10) # Search studies that have studied drinking water tbl <- doQuery( mg, type = \"studies\", biome_name = \"root:Environmental:Aquatic:Freshwater:Drinking water\", max.hits = 10) } # }"},{"path":"/reference/getData.html","id":null,"dir":"Reference","previous_headings":"","what":"Versatile function to retrieve raw results — getData","title":"Versatile function to retrieve raw results — getData","text":"Versatile function retrieve raw results","code":""},{"path":"/reference/getData.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Versatile function to retrieve raw results — getData","text":"","code":"getData(x, ...) # S4 method for class 'MgnifyClient' getData(x, type, accession.type = NULL, accession = NULL, as.df = TRUE, ...)"},{"path":"/reference/getData.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Versatile function to retrieve raw results — getData","text":"x MgnifyClient object. ... optional arguments fed internal functions. type single character value specifying type data retrieve. Must one following options: studies, samples, runs, analyses, biomes, assemblies, super-studies, experiment-types, pipelines, pipeline-tools, publications, genomes, genome-search, genome-search/gather, genome-catalogues, genomeset, cogs, kegg-modules, kegg-classes, antismash-geneclusters, annotations/go-terms, annotations/interpro-identifiers, annotations/kegg-modules, annotations/pfam-entries, annotations/kegg-orthologs, annotations/genome-properties, annotations/antismash-gene-clusters, annotations/organisms, mydata. accession.type single character value specifying type accession IDs (accession). Must specified accession specified. (default: accession.type = NULL) accession single character value vector character values specifying accession IDs return results . (default: accession = NULL) .df single boolean value specifying whether return results data.frame leave nested list. (default: .df = TRUE)","code":""},{"path":"/reference/getData.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Versatile function to retrieve raw results — getData","text":"data.frame list","code":""},{"path":"/reference/getData.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Versatile function to retrieve raw results — getData","text":"function returns data MGnify database. Compared getResult, function allows flexible framework fetching data. However, drawbacks: counts data, getResult returns optimally structured data container easier downstream analysis. getData returns raw data database. However, want retrieve data pipelines publications, instance, getResult suitable , getData can utilized instead.","code":""},{"path":[]},{"path":"/reference/getData.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Versatile function to retrieve raw results — getData","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Find kegg modules for certain analysis df <- getData( mg, type = \"kegg-modules\", accession = \"MGYA00642773\", accession.type = \"analyses\")"},{"path":"/reference/getFile.html","id":null,"dir":"Reference","previous_headings":"","what":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"Download MGnify files, also including processed reads identified protein sequences Listing files available download","code":""},{"path":"/reference/getFile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"","code":"getFile(x, ...) searchFile(x, ...) # S4 method for class 'MgnifyClient' getFile(x, url, file = NULL, read.func = NULL, ...) # S4 method for class 'MgnifyClient' searchFile( x, accession, type = c(\"studies\", \"samples\", \"analyses\", \"assemblies\", \"genomes\", \"run\"), ... )"},{"path":"/reference/getFile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"x MgnifyClient object. ... Additional arguments; used currently. url single character value specifying url address file wish download. file single character value NULL specifying optional local filename use saving file. NULL, MGNify local cache settings used. file intended processed separate program, may sensible provide meaningful file, rather hunt cache folders. file NULL useCache(client) FALSE, read.func parameter must supplied file downloaded deleted. (default: file = NULL) read.func function specifying optional function process downloaded file return results, rather relying post processing. primary use-case parameter local disk space limited downloaded files can quickly processed discarded. function take single parameter, downloaded filename, may return valid R object. (default: read.func = NULL) accession single character value vector character values specifying accession IDs return results . type single character value specifying type objects query. Must one following options: analysis, samples, studies, assembly, genome run. (default: type = \"samples\")","code":""},{"path":"/reference/getFile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"getFile(), either local filename downloaded file, either location MGNifyR cache file. read.func used, result returned. searchFile() data.frame containing discovered downloads. multiple accessions queried, accessions column may filter results - since rownames set (make sense query return multiple items)","code":""},{"path":"/reference/getFile.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"getFile convenient wrapper round generic URL downloading functionality R, taking care things like local caching authentication. searchFile() function wrapper function allowing easy enumeration downloads available given accession IDs. Returns single data.frame containing available downloads associated metadata, including url location description. can filtered extract urls interest, actually retrieving files using getFile()","code":""},{"path":"/reference/getFile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"","code":"# Make a client object mg <- MgnifyClient(useCache = FALSE) # Create a vector of accession ids - these happen to be \\code{analysis} # accessions accession_vect <- c(\"MGYA00563876\", \"MGYA00563877\") downloads <- searchFile(mg, accession_vect, \"analyses\") #> Searching files... #> | | | 0% | |=================================== | 50% | |======================================================================| 100% # Filter to find the urls of 16S encoding sequences url_list <- downloads[ downloads$attributes.description.label == \"Contigs encoding SSU rRNA\", \"download_url\"] # Example 1: # Download the first file supplied_filename <- getFile( mg, url_list[[1]], file=\"SSU_file.fasta.gz\") if (FALSE) { # \\dontrun{ # Example 2: # Just use local caching cached_filename <- getFile(mg, url_list[[2]]) # Example 3: # Using read.func to open the reads with readDNAStringSet from # \\code{biostrings}. Without retaining on disk dna_seqs <- getFile( mg, url_list[[3]], read.func = readDNAStringSet) } # } # Make a client object mg <- MgnifyClient(useCache = TRUE) # Create a vector of accession ids - these happen to be \\code{analysis} # accessions accession_vect <- c( \"MGYA00563876\", \"MGYA00563877\", \"MGYA00563878\", \"MGYA00563879\", \"MGYA00563880\" ) downloads <- searchFile(mg, accession_vect, \"analyses\") #> Searching files... #> | | | 0% | |============== | 20% | |============================ | 40% | |========================================== | 60% | |======================================================== | 80% | |======================================================================| 100%"},{"path":"/reference/getMetadata.html","id":null,"dir":"Reference","previous_headings":"","what":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"Get study, sample analysis metadata supplied analysis accessions","code":""},{"path":"/reference/getMetadata.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"","code":"getMetadata(x, ...) # S4 method for class 'MgnifyClient' getMetadata(x, accession, ...)"},{"path":"/reference/getMetadata.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"x MgnifyClient object. ... Optional arguments; currently used. accession single character value vector analysis accession IDs specifying accessions retrieve data .","code":""},{"path":"/reference/getMetadata.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"data.frame containing metadata analysis accession list. row represents single analysis.","code":""},{"path":"/reference/getMetadata.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"function retrieves study, sample analysis metadata associated provided analysis accessions.","code":""},{"path":"/reference/getMetadata.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Download all associated study/sample and analysis metadata accession_list <- c(\"MGYA00377505\") meta_dataframe <- getMetadata(mg, accession_list) #> Fetching metadata... #> | | | 0% | |======================================================================| 100%"},{"path":"/reference/getResult.html","id":null,"dir":"Reference","previous_headings":"","what":"Get microbial and/or functional profiling data for a list of accessions — getResult","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"Get microbial /functional profiling data list accessions","code":""},{"path":"/reference/getResult.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"","code":"getResult(x, ...) # S4 method for class 'MgnifyClient' getResult( x, accession, get.taxa = TRUE, get.func = TRUE, output = \"TreeSE\", ... )"},{"path":"/reference/getResult.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"x MgnifyClient object. ... optional arguments: taxa.su single character value specifying taxa subunit results selected. Currently, taxonomy assignments MGnify pipelines rely rRNA matches existing databases (GreenGenes SILVA), later pipelines checking SSU LSU portions rRNA sequence. taxa.su allows selection either Small subunit (\"SSU\") Large subunit (\"LSU\") results final TreeSummarizedExperiment object. Older pipeline versions report results subunits, thus accessions value effect. get.tree single boolean value specifying whether include available phylogenetic trees TreeSummarizedExperiment object. Available get.taxa = TRUE. (default: get.tree = TRUE) .df single boolean value enabled output = \"list\". argument specifies whether return functional data named list (one entry per element output list) data.frames, data.frame containing results requested accessions. FALSE, function returns list lists, element consisting results single accession. (default: .df = TRUE) bulk.dl single boolean value specifying MGnifyR attempt speed things downloading relevant studies TSV results extracting required columns, rather using JSONAPI interface. getting results multiple accessions share study, option may result significantly faster processing. However, appear (quite ) cases database TSV result columns match expected accession names. hopefully fixed future, now bulk.dl defaults TRUE. work, can orders magnitude efficient. (default: buld_dl = TRUE) accession single character value vector character values specifying accession IDs return results . get.taxa boolean value specifying whether retrieve taxonomy data (OTU table). See taxa.su specifying taxonomy type. data retrieved BIOM files subsequently parsed. (default: get.taxa = TRUE) get.func boolean value single character value vector character values specifying functional analysis types retrieve. get.func = TRUE, available functional datatypes retrieved, FALSE, functional data retrieved. current list available types \"antismash-gene-clusters\", \"go-slim\", \"go-terms\", \"interpro-identifiers\", \"taxonomy\", \"taxonomy-itsonedb\", \"taxonomy-itsunite\", \"taxonomy-lsu\", \"taxonomy-ssu\". Note depending particular analysis type, pipeline version etc., functional results available. Furthermore, taxonomy also available via get.func, loading data might considerable faster bulk.dl = TRUE. However, phylogeny available via get.taxa. (default: get.func = TRUE) output single character value specifying format output. Must one following options: \"TreeSE\", \"list\", \"phyloseq\". (default: output = \"TreeSE\")","code":""},{"path":"/reference/getResult.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"taxonomy data retrieved, result returned TreeSummarizedExperiment object default. result can also returned phyloseq object list data.frames. Note phyloseq object can include one phylogenetic tree meaning taxa might lost data subsetted based tree. functional data retrieved addition taxonomy data, result returned MultiAssayExperiment object. options list containing phyloseq object data.frames just data.frames. Functional data can returned MultiAssayExperiment object list data.frames.","code":""},{"path":"/reference/getResult.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"Given set analysis accessions collection annotation types, function queries MGNify API returns results. function convenient retrieving highly structured (analysis vs counts) data certain instances. example, BIOM files downloaded automatically. want just retrieve raw data database, see getData.","code":""},{"path":[]},{"path":"/reference/getResult.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Get OTU tables as TreeSE accession_list <- c(\"MGYA00377505\") tse <- getResult(mg, accession_list, get.func=FALSE, get.taxa=TRUE) #> Fetching taxonomy data... #> | | | 0% | |======================================================================| 100% #> Merging with full join... #> 1/1 #> if (FALSE) { # \\dontrun{ # Get functional data along with OTU tables as MAE mae <- getResult(mg, accession_list, get.func=TRUE, get.taxa=TRUE) # Get same data as list list <- getResult( mg, accession_list, get.func=TRUE, get.taxa=TRUE, output = \"list\", as.df = TRUE, use.cache = TRUE) } # }"},{"path":"/reference/searchAnalysis.html","id":null,"dir":"Reference","previous_headings":"","what":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Look analysis accession IDs one study sample accessions","code":""},{"path":"/reference/searchAnalysis.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"","code":"searchAnalysis(x, ...) # S4 method for class 'MgnifyClient' searchAnalysis(x, type, accession, ...)"},{"path":"/reference/searchAnalysis.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"x MgnifyClient object. ... Optional arguments; currently used. type single character value specifying type accession IDs specified accession. Must \"studies\" \"samples\". accession single character value vector character values specifying study sample accession IDs used retrieve analyses IDs.","code":""},{"path":"/reference/searchAnalysis.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Vector analysis accession IDs.","code":""},{"path":"/reference/searchAnalysis.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Retrieve analysis accession IDs associated supplied study sample accession. MGnify, analysis accession refers certain pipeline analysis, specific 16S rRNA shotgun metagenomic mapping. Studies can include multiple samples, sample can undergo multiple analyses using pipelines. analysis identified unique accession ID, allowing precise tracking retrieval analysis results within MGnify database.","code":""},{"path":"/reference/searchAnalysis.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Retrieve analysis ids from study MGYS00005058 result <- searchAnalysis(mg, \"studies\", c(\"MGYS00005058\")) #> Fetching analyses... #> | | | 0% | |======================================================================| 100% if (FALSE) { # \\dontrun{ # Retrieve all analysis ids from samples result <- searchAnalysis( mg, \"samples\", c(\"SRS4392730\", \"SRS4392743\")) } # }"}] +[{"path":"/articles/MGnifyR.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"MGnifyR","text":"MGnifyR package designed ease access EBI’s MGnify resource, allowing searching retrieval multiple datasets downstream analysis. latest version MGnifyR seamlessly integrates miaverse framework providing access cutting-edge tools microbiome -stream analytics.","code":""},{"path":"/articles/MGnifyR.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"MGnifyR","text":"MGnifyR hosted Bioconductor, can installed using via BiocManager.","code":"BiocManager::install(\"MGnifyR\")"},{"path":"/articles/MGnifyR.html","id":"load-mgnifyr-package","dir":"Articles","previous_headings":"","what":"Load MGnifyR package","title":"MGnifyR","text":"installed, MGnifyR made available usual way.","code":"library(MGnifyR) #> Loading required package: MultiAssayExperiment #> Loading required package: SummarizedExperiment #> Loading required package: MatrixGenerics #> Loading required package: matrixStats #> #> Attaching package: 'MatrixGenerics' #> The following objects are masked from 'package:matrixStats': #> #> colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, #> colCounts, colCummaxs, colCummins, colCumprods, colCumsums, #> colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, #> colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats, #> colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds, #> colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads, #> colWeightedMeans, colWeightedMedians, colWeightedSds, #> colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet, #> rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, #> rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps, #> rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins, #> rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks, #> rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, #> rowWeightedMads, rowWeightedMeans, rowWeightedMedians, #> rowWeightedSds, rowWeightedVars #> Loading required package: GenomicRanges #> Loading required package: stats4 #> Loading required package: BiocGenerics #> #> Attaching package: 'BiocGenerics' #> The following objects are masked from 'package:stats': #> #> IQR, mad, sd, var, xtabs #> The following objects are masked from 'package:base': #> #> anyDuplicated, aperm, append, as.data.frame, basename, cbind, #> colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find, #> get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, #> match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, #> Position, rank, rbind, Reduce, rownames, sapply, setdiff, table, #> tapply, union, unique, unsplit, which.max, which.min #> Loading required package: S4Vectors #> #> Attaching package: 'S4Vectors' #> The following object is masked from 'package:utils': #> #> findMatches #> The following objects are masked from 'package:base': #> #> expand.grid, I, unname #> Loading required package: IRanges #> Loading required package: GenomeInfoDb #> Loading required package: Biobase #> Welcome to Bioconductor #> #> Vignettes contain introductory material; view with #> 'browseVignettes()'. To cite Bioconductor, see #> 'citation(\"Biobase\")', and for packages 'citation(\"pkgname\")'. #> #> Attaching package: 'Biobase' #> The following object is masked from 'package:MatrixGenerics': #> #> rowMedians #> The following objects are masked from 'package:matrixStats': #> #> anyMissing, rowMedians #> Loading required package: TreeSummarizedExperiment #> Loading required package: SingleCellExperiment #> Loading required package: Biostrings #> Loading required package: XVector #> #> Attaching package: 'Biostrings' #> The following object is masked from 'package:base': #> #> strsplit"},{"path":"/articles/MGnifyR.html","id":"create-a-client","dir":"Articles","previous_headings":"","what":"Create a client","title":"MGnifyR","text":"functions MGnifyR make use MgnifyClient object keep track JSONAPI url, disk cache location user access tokens. Thus first thing starting analysis instantiate object. following snippet creates . MgnifyClient object contains slots previously mentioned settings.","code":"mg <- MgnifyClient(useCache = TRUE) mg #> An object of class \"MgnifyClient\" #> Slot \"databaseUrl\": #> [1] \"https://www.ebi.ac.uk/metagenomics/api/v1\" #> #> Slot \"authTok\": #> [1] NA #> #> Slot \"useCache\": #> [1] TRUE #> #> Slot \"cacheDir\": #> [1] \"/tmp/Rtmpv8nU5N/.MGnifyR_cache\" #> #> Slot \"showWarnings\": #> [1] FALSE #> #> Slot \"clearCache\": #> [1] FALSE #> #> Slot \"verbose\": #> [1] TRUE"},{"path":[]},{"path":"/articles/MGnifyR.html","id":"search-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Search data","title":"MGnifyR","text":"doQuery() function can utilized search results samples studies MGnify database. , fetch information drinking water samples. result table containing accession IDs description – case – samples.","code":"# Fetch studies samples <- doQuery( mg, type = \"samples\", biome_name = \"root:Environmental:Aquatic:Freshwater:Drinking water\", max.hits = 10) colnames(samples) |> head() #> [1] \"biosample\" \"accession\" \"sample-desc\" #> [4] \"environment-biome\" \"environment-feature\" \"environment-material\""},{"path":"/articles/MGnifyR.html","id":"find-relevent-analyses-accessions","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Find relevent analyses accessions","title":"MGnifyR","text":"Now want find analysis accessions. sample might multiple analyses. analysis ID corresponds single run particular pipeline single sample single study. running searchAnalysis() function, get vector analysis IDs samples fed input.","code":"analyses_accessions <- searchAnalysis(mg, \"samples\", samples$accession) analyses_accessions |> head() #> [1] \"MGYA00652201\" \"MGYA00652185\" \"MGYA00643487\" \"MGYA00643486\" \"MGYA00643485\" #> [6] \"MGYA00643484\""},{"path":"/articles/MGnifyR.html","id":"fetch-metadata","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch metadata","title":"MGnifyR","text":"can now check metadata get hint kind data . use getMetadata() function fetch data based analysis IDs. returned value data.frame includes metadata example analysis conducted kind samples analyzed.","code":"analyses_metadata <- getMetadata(mg, analyses_accessions) colnames(analyses_metadata) |> head() #> [1] \"analysis_analysis-status\" \"analysis_pipeline-version\" #> [3] \"analysis_experiment-type\" \"analysis_accession\" #> [5] \"analysis_is-private\" \"analysis_complete-time\""},{"path":"/articles/MGnifyR.html","id":"fetch-microbiome-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch microbiome data","title":"MGnifyR","text":"selected data fetch, can use getResult() output TreeSummarizedExperiment (TreeSE) MultiAssayExperiment (MAE) depending dataset. dataset includes taxonomic profiling data, output single TreeSE. dataset includes also functional data, output multiple TreeSE objects linked together utilizing MAE. can get access individual TreeSE object MAE specifying index name. TreeSE object uniquely positioned support SummarizedExperiment-based microbiome data manipulation visualization. Moreover, enables access miaverse tools. example, can estimate diversity samples… … plot abundances abundant phyla. can also perform analyses principal component analysis microbial profiling data utilizing miaverse tools.","code":"mae <- getResult(mg, accession = analyses_accessions) mae #> A MultiAssayExperiment object of 6 listed #> experiments with user-defined names and respective classes. #> Containing an ExperimentList class object of length 6: #> [1] microbiota: TreeSummarizedExperiment with 3506 rows and 50 columns #> [2] go-slim: TreeSummarizedExperiment with 116 rows and 38 columns #> [3] go-terms: TreeSummarizedExperiment with 3133 rows and 38 columns #> [4] interpro-identifiers: TreeSummarizedExperiment with 18223 rows and 38 columns #> [5] taxonomy: TreeSummarizedExperiment with 3617 rows and 50 columns #> [6] taxonomy-lsu: TreeSummarizedExperiment with 3378 rows and 42 columns #> Functionality: #> experiments() - obtain the ExperimentList instance #> colData() - the primary/phenotype DataFrame #> sampleMap() - the sample coordination DataFrame #> `$`, `[`, `[[` - extract colData columns, subset, or experiment #> *Format() - convert into a long or wide DataFrame #> assays() - convert ExperimentList to a SimpleList of matrices #> exportClass() - save data to flat files mae[[1]] #> class: TreeSummarizedExperiment #> dim: 3506 50 #> metadata(0): #> assays(1): counts #> rownames(3506): 82608 62797 ... 5820 6794 #> rowData names(9): Kingdom Phylum ... taxonomy1 taxonomy #> colnames(50): MGYA00144458 MGYA00144419 ... MGYA00652185 MGYA00652201 #> colData names(64): analysis_analysis.status analysis_pipeline.version #> ... sample_geo.loc.name sample_instrument.model #> reducedDimNames(0): #> mainExpName: NULL #> altExpNames(0): #> rowLinks: NULL #> rowTree: NULL #> colLinks: NULL #> colTree: NULL library(mia) #> This is mia version 1.13.36 #> - Online documentation and vignettes: https://microbiome.github.io/mia/ #> - Online book 'Orchestrating Microbiome Analysis (OMA)': https://microbiome.github.io/OMA/docs/devel/ mae[[1]] <- estimateDiversity(mae[[1]], index = \"shannon\") #> Warning in estimateDiversity(mae[[1]], index = \"shannon\"): 'estimateDiversity' #> is deprecated. Use 'addAlpha' instead. library(scater) #> Loading required package: scuttle #> Loading required package: ggplot2 plotColData(mae[[1]], \"shannon\", x = \"sample_environment..biome.\") # Agglomerate data altExps(mae[[1]]) <- splitByRanks(mae[[1]]) library(miaViz) #> Loading required package: ggraph #> #> Attaching package: 'miaViz' #> The following object is masked from 'package:mia': #> #> plotNMDS # Plot top taxa top_taxa <- getTopFeatures(altExp(mae[[1]], \"Phylum\"), 10) #> Warning in getTopFeatures(altExp(mae[[1]], \"Phylum\"), 10): 'getTopFeatures' is #> deprecated. Use 'getTop' instead. plotAbundance( altExp(mae[[1]], \"Phylum\")[top_taxa, ], rank = \"Phylum\", as.relative = TRUE ) #> Warning: The following values are already present in `metadata` and will be #> overwritten: 'agglomerated_by_rank'. Consider using the 'name' argument to #> specify alternative names. # Apply relative transformation mae[[1]] <- transformAssay(mae[[1]], method = \"relabundance\") # Perform PCoA mae[[1]] <- runMDS( mae[[1]], assay.type = \"relabundance\", FUN = vegan::vegdist, method = \"bray\") # Plot plotReducedDim( mae[[1]], \"MDS\", colour_by = \"sample_environment..biome.\")"},{"path":"/articles/MGnifyR.html","id":"fetch-raw-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch raw files","title":"MGnifyR","text":"getResult() can utilized retrieve microbial profiling data, getData() can used flexibly retrieve kind data database. returns data simple data.frame list format. result data.frame default. case, includes information publications fetched data portal.","code":"publications <- getData(mg, type = \"publications\") colnames(publications) |> head() #> [1] \"document.id\" \"type\" #> [3] \"id\" \"attributes.pubmed-id\" #> [5] \"attributes.pubmed-central-id\" \"attributes.pub-title\""},{"path":"/articles/MGnifyR.html","id":"fetch-sequence-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch sequence files","title":"MGnifyR","text":"Finally, can use searchFile() getFile() retrieve MGnify pipeline outputs merged sequence reads, assembled contigs, details functional analyses. searchFile(), can search files database. returned table contains search results related analyses fed input. table contains information file also URL address file can loaded. Finally, can download files getFile(). function returns path file stored.","code":"dl_urls <- searchFile(mg, analyses_accessions, type = \"analyses\") target_urls <- dl_urls[ dl_urls$attributes.description.label == \"Predicted alpha tmRNA\", ] colnames(target_urls) |> head() #> [1] \"type\" \"id\" #> [3] \"attributes.alias\" \"attributes.file.format.name\" #> [5] \"attributes.file.format.extension\" \"attributes.file.format.compression\" # Just select a single file from the target_urls list for demonstration. file_url <- target_urls$download_url[[1]] cached_location <- getFile(mg, file_url) # Where are the files? cached_location #> [1] \"/.MGnifyR_cache/analyses/MGYA00652201/file/ERZ20300939_alpha_tmRNA.RF01849.fasta.gz\" sessionInfo() #> R version 4.4.1 (2024-06-14) #> Platform: x86_64-pc-linux-gnu #> Running under: Ubuntu 22.04.4 LTS #> #> Matrix products: default #> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 #> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0 #> #> locale: #> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C #> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 #> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 #> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C #> [9] LC_ADDRESS=C LC_TELEPHONE=C #> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C #> #> time zone: UTC #> tzcode source: system (glibc) #> #> attached base packages: #> [1] stats4 stats graphics grDevices utils datasets methods #> [8] base #> #> other attached packages: #> [1] miaViz_1.13.10 ggraph_2.2.1 #> [3] scater_1.33.4 ggplot2_3.5.1 #> [5] scuttle_1.15.4 mia_1.13.36 #> [7] MGnifyR_0.99.30 TreeSummarizedExperiment_2.13.0 #> [9] Biostrings_2.73.1 XVector_0.45.0 #> [11] SingleCellExperiment_1.27.2 MultiAssayExperiment_1.31.5 #> [13] SummarizedExperiment_1.35.1 Biobase_2.65.1 #> [15] GenomicRanges_1.57.1 GenomeInfoDb_1.41.1 #> [17] IRanges_2.39.2 S4Vectors_0.43.2 #> [19] BiocGenerics_0.51.1 MatrixGenerics_1.17.0 #> [21] matrixStats_1.4.1 knitr_1.48 #> [23] BiocStyle_2.33.1 #> #> loaded via a namespace (and not attached): #> [1] splines_4.4.1 ggplotify_0.1.2 #> [3] urltools_1.7.3 tibble_3.2.1 #> [5] triebeard_0.4.1 polyclip_1.10-7 #> [7] rpart_4.1.23 DirichletMultinomial_1.47.0 #> [9] lifecycle_1.0.4 lattice_0.22-6 #> [11] MASS_7.3-61 SnowballC_0.7.1 #> [13] backports_1.5.0 magrittr_2.0.3 #> [15] Hmisc_5.1-3 sass_0.4.9 #> [17] rmarkdown_2.28 jquerylib_0.1.4 #> [19] yaml_2.3.10 DBI_1.2.3 #> [21] minqa_1.2.8 abind_1.4-8 #> [23] zlibbioc_1.51.1 purrr_1.0.2 #> [25] yulab.utils_0.1.7 nnet_7.3-19 #> [27] tweenr_2.0.3 sandwich_3.1-0 #> [29] GenomeInfoDbData_1.2.12 ggrepel_0.9.6 #> [31] tokenizers_0.3.0 irlba_2.3.5.1 #> [33] tidytree_0.4.6 vegan_2.6-8 #> [35] rbiom_1.0.3 tidyjson_0.3.2 #> [37] pkgdown_2.1.1 permute_0.9-7 #> [39] DelayedMatrixStats_1.27.3 codetools_0.2-20 #> [41] DelayedArray_0.31.11 ggforce_0.4.2 #> [43] tidyselect_1.2.1 aplot_0.2.3 #> [45] UCSC.utils_1.1.0 farver_2.1.2 #> [47] lme4_1.1-35.5 ScaledMatrix_1.13.0 #> [49] viridis_0.6.5 base64enc_0.1-3 #> [51] jsonlite_1.8.8 BiocNeighbors_1.99.0 #> [53] decontam_1.25.0 tidygraph_1.3.1 #> [55] Formula_1.2-5 systemfonts_1.1.0 #> [57] ggnewscale_0.5.0 tools_4.4.1 #> [59] treeio_1.29.1 ragg_1.3.3 #> [61] Rcpp_1.0.13 glue_1.7.0 #> [63] gridExtra_2.3 SparseArray_1.5.34 #> [65] BiocBaseUtils_1.7.3 xfun_0.47 #> [67] mgcv_1.9-1 dplyr_1.1.4 #> [69] withr_3.0.1 BiocManager_1.30.25 #> [71] fastmap_1.2.0 boot_1.3-31 #> [73] bluster_1.15.1 fansi_1.0.6 #> [75] digest_0.6.37 rsvd_1.0.5 #> [77] gridGraphics_0.5-1 R6_2.5.1 #> [79] textshaping_0.4.0 colorspace_2.1-1 #> [81] lpSolve_5.6.21 utf8_1.2.4 #> [83] tidyr_1.3.1 generics_0.1.3 #> [85] data.table_1.16.0 DECIPHER_3.1.4 #> [87] graphlayouts_1.1.1 httr_1.4.7 #> [89] htmlwidgets_1.6.4 S4Arrays_1.5.7 #> [91] pkgconfig_2.0.3 gtable_0.3.5 #> [93] janeaustenr_1.0.0 htmltools_0.5.8.1 #> [95] bookdown_0.40 scales_1.3.0 #> [97] ggfun_0.1.6 rstudioapi_0.16.0 #> [99] reshape2_1.4.4 checkmate_2.3.2 #> [101] nlme_3.1-166 nloptr_2.1.1 #> [103] cachem_1.1.0 zoo_1.8-12 #> [105] stringr_1.5.1 parallel_4.4.1 #> [107] vipor_0.4.7 foreign_0.8-87 #> [109] desc_1.4.3 pillar_1.9.0 #> [111] grid_4.4.1 vctrs_0.6.5 #> [113] slam_0.1-53 BiocSingular_1.21.3 #> [115] beachmat_2.21.6 cluster_2.1.6 #> [117] beeswarm_0.4.0 htmlTable_2.4.3 #> [119] evaluate_0.24.0 mvtnorm_1.3-1 #> [121] cli_3.6.3 compiler_4.4.1 #> [123] rlang_1.1.4 crayon_1.5.3 #> [125] tidytext_0.4.2 labeling_0.4.3 #> [127] mediation_4.5.0 plyr_1.8.9 #> [129] fs_1.6.4 ggbeeswarm_0.7.2 #> [131] stringi_1.8.4 viridisLite_0.4.2 #> [133] BiocParallel_1.39.0 assertthat_0.2.1 #> [135] munsell_0.5.1 lazyeval_0.2.2 #> [137] Matrix_1.7-0 patchwork_1.2.0 #> [139] sparseMatrixStats_1.17.2 highr_0.11 #> [141] igraph_2.0.3 memoise_2.0.1 #> [143] RcppParallel_5.1.9 bslib_0.8.0 #> [145] ggtree_3.13.1 ape_5.8"},{"path":"/articles/MGnifyR_long.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"MGnifyR, extended vignette","text":"MGnifyR package designed ease access EBI’s MGnify resource, allowing searching retrieval multiple datasets downstream analysis. MGnify pipelines undoubtedly useful, currently implemented produce results strictly per-sample basis. whole study results available, comparisons across studies difficult. MGnifyR package designed facilitate cross-study analyses handling per-sample data retrieval merging details internally, leaving user free perform analysis see fit. latest version MGnifyR seamlessly integrates miaverse framework providing access tools microbiome -stream analytics. integration enables users leverage optimized standardized methods analyzing microbiome. Additionally, users can benefit comprehensive tutorial book offers valuable guidance support.","code":""},{"path":"/articles/MGnifyR_long.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"MGnifyR, extended vignette","text":"MGnifyR currently hosted GitHub, can installed using via devtools. MGnifyR built using following snippet.","code":"BiocManager::install(\"MGnifyR\")"},{"path":"/articles/MGnifyR_long.html","id":"load-mgnifyr-package","dir":"Articles","previous_headings":"","what":"Load MGnifyR package","title":"MGnifyR, extended vignette","text":"installed, MGnifyR made available usual way.","code":"library(MGnifyR)"},{"path":"/articles/MGnifyR_long.html","id":"create-a-client","dir":"Articles","previous_headings":"","what":"Create a client","title":"MGnifyR, extended vignette","text":"functions MGnifyR make use MgnifyClient object keep track JSONAPI url, disk cache location user access tokens. Thus first thing starting analysis instantiate object. following snippet creates . ’s recommended local caching enabled useCache = TRUE. Queries MGnify API can quite slow, particularly retrieving multipage results many analyses (many Interpro results). Using local disk cache can significantly speed subsequent work, bypassing need re-query API. Use cache entirely transparent, caching occurs raw data level. cache can persist across MGnifyR sessions, can even used multiple sessions simultaneously - provided different sets accessions queried . Optionally, username password may specified client creation, causing MGnifyR attempt retrieval authentication token API. gives access non-public results, currently author imposed embargo period.","code":"mg <- MgnifyClient() mg mg <- MgnifyClient( username = \"Webin-username\", password = \"your-password\", useCache = TRUE)"},{"path":[]},{"path":"/articles/MGnifyR_long.html","id":"search-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Search data","title":"MGnifyR, extended vignette","text":"MGnifyR gives users access complete range search functionality implemented MGnify JSON API. single function doQuery() used perform searching, allowing Studies, Samples, Runs Accession interrogated common interface. MGnifyR functions first argument client must valid MgnifyClient instance. remaining required parameter qtype, specifying type data queried, may one studies, samples, runs, analyses assemblies. general parameter include max.hits. Unlike MGnifyR high level functions, caching turned default doQuery(). New data analyses added MGnify time, enabling caching default may lead --date search results long-lived sessions. However, ’s easy switch back , may useful many cases. Also, given huge ever increasing number datasets available MGnify, limit number results returned may set using max.hits. default set 200, exploratory queries sufficient. may increased decreased directly specifying max.hits, disabled completely (limit) setting max.hits=NULL. cases want specific search, also use either accession parameter, many filter options available API, discussed . Specifying accession id, case samples, runs assemblies may vector ids, returns data.frame metadata one row per matching accession. accession NULL (default) remaining parameters define filters applied API search result. Details parameters given help(doQuery). way example though, supposing interested amplicon Illumina samples arctic, might try following query: Specifying accession parameter restrict results just matching particular entry, study, sample run. example, retrieve information study “MGYS00002891”:","code":"northpolar <- doQuery( mg, \"samples\", latitude_gte=60.0, experiment_type=\"amplicon\", biome_name=\"Soil\", instrument_platform = \"Illumina\", max.hits = 10) head(northpolar) study_samples <- doQuery(mg, \"studies\", accession=\"MGYS00002891\") head(study_samples)"},{"path":"/articles/MGnifyR_long.html","id":"find-relevent-analyses-accessions","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Find relevent analyses accessions","title":"MGnifyR, extended vignette","text":"obtained particular set search hits, ’s now time retrieve associated results. General automated analysis complicated MGnify database design, wherein example samples may shared multiple studies, studies analysed multiple times using different versions pipeline. Navigating “many--one” relationships can tricky, MGnifyR resorts using analyses accessions ’s canonical identifier. analysis corresponds single run particular pipeline single sample single study. downside approach queries returning studies, samples (anything analyses) accessions need converting corresponding analyses. MGnifyR therefore provides helper function handle conversion - searchAnalysis(). Following previous search, list study accessions, convert corresponding analyses use: useful side effect call attribute metadata sample now retrieved stored local cache. Thus subsequent API calls samples (occur multiple times later steps) significantly faster. ’s important aware results searchAnalysis() command necessarily one--one match input accessions. MGnify analysis runs sometimes performed multiple times, perhaps using different versions pipeline. Thus filtering result list may required, easily performed illustrated next section.","code":"analyses_accessions <- searchAnalysis( mg, type=\"studies\", accession = study_samples$accession) head(analyses_accessions)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-metadata","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch metadata","title":"MGnifyR, extended vignette","text":"point long list analysis instances (potential duplicates) corresponding samples previously found. use getMetadata function download combine associated sample, run study metadata, filter required include rows want. resulting data.frame columns names prefixed source type. example, “sample_xxx” columns correspond metadata gleaned querying accession’s sample entry. MGnify allows quite flexible specification arbitray metadata submission time, many cases leading quite sparse data.frame results accession queries sourced one study. instance, one sample contains entry “sample_soil_PH”, entries rows filled NA. MGnifyR automatically clean missing values - instead opting allow user choose correct action. particular study ’re looking marine biome, suppose interested samples analyses sampling depth known. following snippet filters full data.frame selecting entries contain valid sample_depth. ’s worth noting .numeric call ensure column converted numeric type checked. sample data MGnifyR initially retrieved type character, ’s user make sure ostensibly numeric entries converted properly.","code":"analyses_metadata <- getMetadata(mg, analyses_accessions) head(analyses_metadata) known_depths <- analyses_metadata[ !is.na(as.numeric(analyses_metadata$sample_depth)), ] # How many are left? dim(known_depths)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-microbiome-data","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch microbiome data","title":"MGnifyR, extended vignette","text":"selected analyses wish examine , getResult() used download associated OTU tables taxonomy, join results single TreeSummarizedExperiment (TreeSE) object. TreeSE becoming defacto standard taxonomic abundance munging R. TreeSE objects integrate abundance, taxonomic, phylogenetic, sample sequence data single object, powerful facilities filtering, processing plotting results. Compared phyloseq object, TreeSE scalable capable efficient data analysis. miaverse framework developed around TreeSE data container. provides tools analysis visualization. Moreover, includes comprehensive tutorial book called OMA.","code":""},{"path":"/articles/MGnifyR_long.html","id":"amplicon-sequencing","dir":"Articles","previous_headings":"Functions for fetching the data > Fetch microbiome data","what":"Amplicon sequencing","title":"MGnifyR, extended vignette","text":"dataset includes amplicon sequencing data, .e., dataset include function predictions, getResult() method returns dataset TreeSE default. See output types function documentation. TreeSE object uniquely positioned support SummarizedExperiment-based microbiome data manipulation visualization. Moreover, enables access miaverse tools. example, can estimate diversity samples. needed, TreeSE can converted phyloseq.","code":"tse <- getResult(mg, accession = analyses_accessions, get.func = FALSE) tse library(mia) tse <- estimateDiversity(tse, index = \"shannon\") library(scater) plotColData(tse, \"shannon\", x = \"sample_geo.loc.name\") library(miaViz) plotAbundance( tse[!is.na( rowData(tse)[[\"Kingdom\"]] ), ], rank = \"Kingdom\", as.relative = TRUE ) pseq <- makePhyloseqFromTreeSE(tse) pseq"},{"path":"/articles/MGnifyR_long.html","id":"metagenomics","dir":"Articles","previous_headings":"Functions for fetching the data > Fetch microbiome data","what":"Metagenomics","title":"MGnifyR, extended vignette","text":"Although previous queries based results doQuery(), now concentrate combining comparing results specific studies. Since newly performed analyses retrieved first doQuery() call, ’s likely time vignette read, query results different. principally due rapid increase MGnify submissions, leading potential lack consistency even closely spaced queries. mentioned previously, may best use useCache=FALSE MgnifyCLient object doQuery() calls, ensure queries actually returning latest data. remainder vignette however, ’ll comparing 3 ostensibly different studies. study saltmarsh soils York University, human faecal samples survey healthy Sardinians, set samples hydrothermal vents Mid-Cayman rise Carribbean Sea. simplify things, first 20 samples study used. Furthermore, intention demonstrate functionality MGnifyR package, rather produce scientifically rigorous results. first step new accession list , previously, retrieve associated metadata using getMetadata(), seen doQuery() results, returned data.frame contains large number columns. autogenerated flexible, column names can little difficult predict, examining colnames(full_metadata) make things clearer. full_metadata get idea type data ’re dealing , can extract useul information sequencing platform, source biome, etc. next code snippet tallies columns give idea ’s available. boxplot also indicates within study read counts similar, probably need use sort normalization procedure comparing across samples. might also want drop particularly low read coverage samples analysis. , can fetch data calling getResult(). bulk.dl=TRUE potential significantly speed data retrieval. MGnify makes functional results available two separate ways, either per-analysis basis web api, whole study level large files, tab separated (TSV), columns representing results analysis. bulk.dl FALSE, MGnifyR queries web api get results (given functional analyses results may consist thousands entries) may take significant time. Setting bulk.dl TRUE causes MGnifyR determine source study associated particular analysis instead download parse corresponding results file. Since result file contains entries analyses associated study, taking advantage MGnifyR’s local caching single download provides results many future analyses. cases affords several orders magnitude speedup api query case. Unfortunately, column entries per-study results files always directly correspond particular analysis run, causing retrieval fail. principal cause believed running multiple analyses jobs sample. Thus reliability, bulk.dl FALSE default. general recommendation though, try setting TRUE first time getResult() used set accessions. fails, setting bulk.dl FALSE enable robust approach allowing analysis continue. might take though. Hopefully future sample/analysis correspondence mismatches fixed default bulk.dl switch TRUE. metagenomic samples, result MultiAssayExperiment (MAE) links multiple TreeSE objects one dataset. TreeSE objects include taxonomic profiling data along functional data unique objects. objects linked sample names. can get access individual object experiment specifying index name. can perform principal component analysis microbial profiling data utilizing miaverse tools.","code":"soil <- searchAnalysis(mg, \"studies\", \"MGYS00001447\") human <- searchAnalysis(mg, \"studies\", \"MGYS00001442\") marine <- searchAnalysis(mg, \"studies\", \"MGYS00001282\") # Combine analyses all_accessions <- c(soil, human, marine) head(all_accessions) full_metadata <- getMetadata(mg, all_accessions) colnames(full_metadata) head(full_metadata) # Load ggplot2 library(ggplot2) #Distribution of sample source material: table(full_metadata$`sample_environment-material`) #What sequencing machine(s) were used? table(full_metadata$`sample_instrument model`) # Boxplot of raw read counts: ggplot( full_metadata, aes(x=study_accession, y=log( as.numeric(`analysis_Submitted nucleotide sequences`)))) + geom_boxplot(aes(group=study_accession)) + theme_bw() + ylab(\"log(submitted reads)\") mae <- getResult(mg, all_accessions, bulk.dl = TRUE) mae mae[[2]] # Apply relative transformation mae[[1]] <- transformAssay(mae[[1]], method = \"relabundance\") # Perform PCoA mae[[1]] <- runMDS( mae[[1]], assay.type = \"relabundance\", FUN = vegan::vegdist, method = \"bray\") # Plot plotReducedDim(mae[[1]], \"MDS\", colour_by = \"sample_environment.feature\")"},{"path":"/articles/MGnifyR_long.html","id":"fetch-raw-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch raw files","title":"MGnifyR, extended vignette","text":"getResult() can utilized retrieve microbial profiling data, getData() can used flexibly retrieve kind data database. returns data simple data.frame list format.","code":"kegg <- getData( mg, type = \"kegg-modules\", accession = \"MGYA00642773\", accession.type = \"analyses\") head(kegg)"},{"path":"/articles/MGnifyR_long.html","id":"fetch-sequence-files","dir":"Articles","previous_headings":"Functions for fetching the data","what":"Fetch sequence files","title":"MGnifyR, extended vignette","text":"Finally, can use searchFile() getFile() retrieve MGnify pipeline outputs merged sequence reads, assembled contigs, details functional analyses. searchFile() simple wrapper function , supplied list accessions, finds urls files ’re . cases ’ll want filter returned list files interest, easily done resulting data.frame object. addition actual download location (download_url column), extra columns include file type, contents compression. ’s recommended colnames data.frame examined get grasp available metadata. demonstrate process, code retrieves data.frame containing available downloads accession ’ve examining previously. filters retain files corresponding retain annotated amino acid sequence files. list types available files, guide filtering, something like following might useful. Unlike MGnifyR functions, searchFile() limited analyses, specifying accession_type results types may found. instance, general genome functionality yet integrated MGnifyR, can retrieve associated files particular genome accession following: found set target urls, final step use getFile() actually retrieve file. Unlike functions, works single url location , entry target_urls must downloaded individually - easily done either looping applying list. files intended used external programs, might easiest provide file parameter function call, specifies local filename writing file. default MGnifyR use local cache, can make getting file afterwards awkward. Regardless, default behaviour getFile() retrieve file specified parameter url, save disk, return filepath saved . second download option available, allows built-parsing file. know ahead time processing performed, may possible integrate function, pass function getFile() read.func argument. function question take single argument (complete path name locally downloaded file) result call returned place usual output file name. Alternatively files first downloaded standard way, processed using function loop. Therefore many cases read.func parameter redundant. However, many outputs MGnify can quite large, meaning local storage many files may become issue. providing read_func parameter (necessarily setting MgnifyClient object: useCache=FALSE) analysis large number datasets may possible minimal storage requirements. illustrate, suppose interested retrieving detected sequences matching particular PFAM motif set analyses. simple function uses Biostrings package read amino acid fasta file, searches matching PFAM tag sequence name, tallies unique sequences single data.frame row. case PFAM motif identifies sequences coding amoC gene, found ammonia methane oxidizing organisms, filtering method used. defined function, just remains include call getFile().","code":"# Find list of available downloads dl_urls <- searchFile( mg, full_metadata$analysis_accession, type = \"analyses\") # Filter table target_urls <- dl_urls[ dl_urls$attributes.description.label == \"Predicted CDS with annotation\", ] head(target_urls) table(dl_urls$attributes.description.label) genome_urls <- searchFile(mg, \"MGYG000433953\", type = \"genomes\") genome_urls[ , c(\"id\", \"attributes.file.format.name\", \"download_url\")] # Just select a single file from the target_urls list for demonstration. # Default behavior - use local cache. cached_location1 = getFile(mg, target_urls$download_url[[1]]) # Specifying a file cached_location2 <- getFile( mg, target_urls$download_url[[1]]) cached_location <- c(cached_location1, cached_location2) # Where are the files? cached_location library(Biostrings) # Simple function to a count of unique sequences matching PFAM amoC/mmoC motif getAmoCseqs <- function(fname){ sequences <- readAAStringSet(fname) tgtvec <- grepl(\"PF04896\", names(sequences)) as.data.frame(as.list(table(as.character(sequences[tgtvec])))) } # Just download a single accession for demonstration, specifying a read_function amoC_seq_counts <- getFile( mg, target_urls$download_url[[1]], read_func = getAmoCseqs) amoC_seq_counts sessionInfo()"},{"path":"/articles/MGnify_course.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Metagenomics bioinformatics at MGnify","text":"notebook aim demonstrate MGnifyR tool can used fetch data MGnify metagenomic analysis. show analyse data utilizing cutting-edge tools microbiome data science including estimating alpha beta diversity along differential abundance analysis. MGnifyR R/Bioconductor package provides set tools easily accessing processing MGnify data R, making queries MGnify databases MGnify API. benefit MGnifyR data can either fetched tsv format directly combined TreeSummarizedExperiment (TreeSE) object run analysis custom workflow. Utilizing TreeSE enables access wide range tools Bioconductor’s SummarizedExperiment (SE) ecosystem, mia package covering microbiome-specific methods SE ecosystem. information microbiome data science Bioconductor, refer Orchestrating Microbiome Analysis (OMA) online book.","code":""},{"path":"/articles/MGnify_course.html","id":"load-packages","dir":"Articles","previous_headings":"","what":"Load packages","title":"Metagenomics bioinformatics at MGnify","text":"","code":"# List of packages that we need packages <- c(\"ANCOMBC\", \"caret\", \"MGnifyR\", \"mia\", \"miaViz\", \"scater\") # Get packages that are already installed packages_already_installed <- packages[ packages %in% installed.packages() ] # Get packages that need to be installed packages_need_to_install <- setdiff( packages, packages_already_installed ) # Loads BiocManager into the session. Install it if it is not already installed. if( !require(\"BiocManager\") ){ install.packages(\"BiocManager\") library(\"BiocManager\") } # If there are packages that need to be installed, installs them with BiocManager # Updates old packages. if( length(packages_need_to_install) > 0 ) { install(packages_need_to_install, ask = FALSE) } # Load all packages into session. Stop if there are packages that were not # successfully loaded pkgs_not_loaded <- !sapply(packages, require, character.only = TRUE) pkgs_not_loaded <- names(pkgs_not_loaded)[ pkgs_not_loaded ] if( length(pkgs_not_loaded) > 0 ){ stop( \"Error in loading the following packages into the session: '\", paste0(pkgs_not_loaded, collapse = \"', '\"), \"'\") }"},{"path":"/articles/MGnify_course.html","id":"data-import","dir":"Articles","previous_headings":"","what":"Data import","title":"Metagenomics bioinformatics at MGnify","text":"example, going fetch MGnify analysis results metadata dataset human gut microbiome viewed across age geography. interact MGnify database, need create MgnifyClient object. object allows us fetch data MGnify, can configure use cache efficiency. Using MgnifyClient object, can search analyses associated study. analysis refers metagenomic runs performed samples. sample can multiple runs made, work analyses samples; analysis identifier points single entity. MGnify database, study unique identifier. study interested accession ID “MGYS00005154”. Now ready load metadata analyses get idea kind data dealing . currently (17 Sep 2024) almost 1,000 analyses available. Downloading whole dataset take time use memory cache. can see analyses performed different pipelines. Let’s take analyses generated pipeline version 5.0. now analyses point unique sample. final step fetch abundance tables TreeSummarizedExperiment format. fetched data TreeSE object, including taxonomy annotations. See OMA online book handle data format.","code":"# Create the MgnifyClient object with caching enabled mg <- MgnifyClient( useCache = TRUE, # cacheDir = \"/home/trainers\" cacheDir = \"/home/tvborm/Downloads/.mgnify_cache\" ) study_id <- \"MGYS00005154\" analysis_id <- searchAnalysis(mg, \"studies\", study_id) analysis_id |> head() metadata <- getMetadata(mg, accession = analysis_id) metadata <- metadata[metadata[[\"analysis_pipeline-version\"]] == \"5.0\", ] tse <- getResult( mg, accession = metadata[[\"analysis_accession\"]], get.func = FALSE ) tse"},{"path":"/articles/MGnify_course.html","id":"preprocessing","dir":"Articles","previous_headings":"","what":"Preprocessing","title":"Metagenomics bioinformatics at MGnify","text":"agglomerate data Order level means summarize abundances specific level. OMA provides chapter explains agglomeration detail. unique properties microbiome data, apply transformations. , perform relative CLR transformations. can find information transformations OMA.","code":"tse_order <- agglomerateByRank(tse, rank = \"Order\") # Transform the main TreeSE tse <- transformAssay(tse, method = \"relabundance\") tse <- transformAssay(tse, method = \"rclr\") # Transform the agglomerated TreeSE tse_order <- transformAssay(tse_order, method = \"relabundance\") tse_order <- transformAssay(tse_order, method = \"rclr\")"},{"path":"/articles/MGnify_course.html","id":"alpha-diversity","dir":"Articles","previous_headings":"","what":"Alpha diversity","title":"Metagenomics bioinformatics at MGnify","text":"Alpha diversity measures community diversity within sample. Leanr community diversity . can test whether diversity differences statistically significant. utilize Mann Whithney U test (Wilcoxon test). add p-values plot, see OMA.","code":"# Calculate alpha diversity tse <- addAlpha(tse) # Create a plot p <- plotColData( tse, y = \"shannon_diversity\", x = \"sample_geographic.location..country.and.or.sea.region.\", show_boxplot = TRUE ) p pairwise.wilcox.test( tse[[\"shannon_diversity\"]], tse[[\"sample_geographic.location..country.and.or.sea.region.\"]], p.adjust.method = \"fdr\" )"},{"path":"/articles/MGnify_course.html","id":"beta-diversity","dir":"Articles","previous_headings":"","what":"Beta diversity","title":"Metagenomics bioinformatics at MGnify","text":"can evaluate different microbial compositions samples. aim evaluate whether can find patterns data associates covariates. perform Principal Coodinate Analysis (PCoA) Bray-Curtis dissimilarity. See community similarity chapter OMA information.","code":"# Perform PCoA tse <- runMDS( tse, FUN = getDissimilarity, method = \"bray\", assay.type = \"relabundance\" ) # Visualize PCoA p <- plotReducedDim( tse, dimred = \"MDS\", colour_by = \"sample_geographic.location..country.and.or.sea.region.\" ) p"},{"path":"/articles/MGnify_course.html","id":"differetial-abundance-analysis-daa","dir":"Articles","previous_headings":"","what":"Differetial abundance analysis (DAA)","title":"Metagenomics bioinformatics at MGnify","text":"DAA, analyze certain featues’ abundances differ certain groups. , OMA dedicated chapter also topic. Next visualize 5 features lowest p-values.","code":"# Perform DAA res <- ancombc2( data = tse_order, assay.type = \"counts\", fix_formula = \"sample_geographic.location..country.and.or.sea.region.\", p_adj_method = \"fdr\", ) # Get the most significant features n_top <- 4 res_tab <- res[[\"res\"]] res_tab <- res_tab[order(res_tab[[\"q_(Intercept)\"]]), ] top_feat <- res_tab[seq_len(n_top), \"taxon\"] # Create a plot p <- plotExpression( tse_order, features = top_feat, assay.type = \"relabundance\", x = \"sample_geographic.location..country.and.or.sea.region.\", show_boxplot = TRUE, show_violin = FALSE, point_shape = NA ) + scale_y_log10() p"},{"path":"/articles/MGnify_course.html","id":"session-info","dir":"Articles","previous_headings":"","what":"Session info","title":"Metagenomics bioinformatics at MGnify","text":"","code":"sessionInfo()"},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Tuomas Borman. Author, maintainer. Ben Allen. Author. Leo Lahti. Author.","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Borman T, Allen B, Lahti L (2024). MGnifyR: R interface EBI MGnify metagenomics resource. R package version 0.99.30, https://github.com/EBI-Metagenomics/MGnifyR.","code":"@Manual{, title = {MGnifyR: R interface to EBI MGnify metagenomics resource}, author = {Tuomas Borman and Ben Allen and Leo Lahti}, year = {2024}, note = {R package version 0.99.30}, url = {https://github.com/EBI-Metagenomics/MGnifyR}, }"},{"path":"/index.html","id":"mgnifyr-","dir":"","previous_headings":"","what":"R interface to EBI MGnify metagenomics resource","title":"R interface to EBI MGnify metagenomics resource","text":"R package searching retrieving data EBI Metagenomics resource. cases, MGnifyR interacts directly JSONAPI, rather relying downloading analyses outputs TSV files. Thus general - allowing example intuitive combining multiple studies analyses single workflow, cases slower afformentioned direct access. Local caching results disk implemented help counter overheads, data downloads can slow - particularly functional annotation retrieval. MGnifyR package part miaverse microbiome analysis ecosystem enabling usage mia miaverse packages. research received funding Horizon 2020 Programme European Union within FindingPheno project grant agreement 952914. FindingPheno, EU-funded project, dedicated developing computational tools methodologies integration analysis multi-omics data. primary objective deepen understanding interactions hosts microbiomes. can find information FindingPheno website.","code":""},{"path":[]},{"path":"/index.html","id":"bioc-release","dir":"","previous_headings":"Installation","what":"Bioc-release","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"if (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") BiocManager::install(\"MGnifyR\")"},{"path":"/index.html","id":"bioc-devel","dir":"","previous_headings":"Installation","what":"Bioc-devel","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"if (!requireNamespace(\"BiocManager\", quietly = TRUE)) install.packages(\"BiocManager\") # The following initializes usage of Bioc devel BiocManager::install(version='devel') BiocManager::install(\"MGnifyR\")"},{"path":"/index.html","id":"github","dir":"","previous_headings":"Installation","what":"GitHub","title":"R interface to EBI MGnify metagenomics resource","text":"","code":"remotes::install_github(\"EBI-Metagenomics/MGnifyR\")"},{"path":"/index.html","id":"basic-usage","dir":"","previous_headings":"","what":"Basic usage","title":"R interface to EBI MGnify metagenomics resource","text":"detailed instructions read associated function help vignette (vignette(\"MGNifyR\"))","code":"library(MGnifyR) # Set up the MGnify client instance mgclnt <- MgnifyClient(usecache = TRUE, cache_dir = '/tmp/MGnify_cache') # Retrieve the list of analyses associated with a study accession_list <- searchAnalysis(mgclnt, \"studies\", \"MGYS00005058\", usecache = TRUE) # Download all associated study/sample and analysis metadata meta_dataframe <- getMetadata(mgclnt, accession_list, usecache = TRUE) # Convert analyses outputs to a single `MultiAssayExperiment` object mae <- getResult(mgclnt, meta_dataframe$analysis_accession, usecache = TRUE) mae"},{"path":"/reference/MGnifyR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"MGnifyR Package. — MGnifyR-package","title":"MGnifyR Package. — MGnifyR-package","text":"MGnifyR implements interface EBI MGnify database. See vignette general introduction package. MGnify general MGnify information, API documentation details JSONAPI implementation.","code":""},{"path":[]},{"path":"/reference/MGnifyR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"MGnifyR Package. — MGnifyR-package","text":"Maintainer: Tuomas Borman tuomas.v.borman@utu.fi (ORCID) Authors: Ben Allen ben.allen@ncl.ac.uk Leo Lahti leo.lahti@iki.fi (ORCID)","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":null,"dir":"Reference","previous_headings":"","what":"MgnifyClient accessors and mutators — databaseUrl","title":"MgnifyClient accessors and mutators — databaseUrl","text":"MgnifyClient accessors mutators","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"MgnifyClient accessors and mutators — databaseUrl","text":"","code":"databaseUrl(x) authTok(x) useCache(x) cacheDir(x) showWarnings(x) clearCache(x) verbose(x) databaseUrl(x) <- value authTok(x) <- value useCache(x) <- value cacheDir(x) <- value showWarnings(x) <- value clearCache(x) <- value verbose(x) <- value # S4 method for class 'MgnifyClient' databaseUrl(x) # S4 method for class 'MgnifyClient' authTok(x) # S4 method for class 'MgnifyClient' useCache(x) # S4 method for class 'MgnifyClient' cacheDir(x) # S4 method for class 'MgnifyClient' showWarnings(x) # S4 method for class 'MgnifyClient' clearCache(x) # S4 method for class 'MgnifyClient' verbose(x) # S4 method for class 'MgnifyClient' databaseUrl(x) <- value # S4 method for class 'MgnifyClient' authTok(x) <- value # S4 method for class 'MgnifyClient' useCache(x) <- value # S4 method for class 'MgnifyClient' cacheDir(x) <- value # S4 method for class 'MgnifyClient' showWarnings(x) <- value # S4 method for class 'MgnifyClient' clearCache(x) <- value # S4 method for class 'MgnifyClient' verbose(x) <- value"},{"path":"/reference/MgnifyClient-accessors.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"MgnifyClient accessors and mutators — databaseUrl","text":"x MgnifyClient object. value value added certain slot.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"MgnifyClient accessors and mutators — databaseUrl","text":"value MgnifyClient object nothing.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"MgnifyClient accessors and mutators — databaseUrl","text":"functions fetching mutating slots MgnifyClient object.","code":""},{"path":"/reference/MgnifyClient-accessors.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"MgnifyClient accessors and mutators — databaseUrl","text":"","code":"mg <- MgnifyClient() databaseUrl(mg) #> [1] \"https://www.ebi.ac.uk/metagenomics/api/v1\" showWarnings(mg) <- FALSE"},{"path":"/reference/MgnifyClient.html","id":null,"dir":"Reference","previous_headings":"","what":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"Constructor creating MgnifyClient object allow access MGnify database. MgnifyClient object","code":""},{"path":"/reference/MgnifyClient.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"","code":"MgnifyClient( username = NULL, password = NULL, useCache = FALSE, cacheDir = tempdir(), showWarnings = FALSE, verbose = TRUE, clearCache = FALSE, ... )"},{"path":"/reference/MgnifyClient.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"username single character value specifying optional username authentication. (default: username = NULL) password single character value specifying optional password authentication. (default: password = NULL) useCache single boolean value specifying whether enable -disk caching results session. use cases TRUE. (default: useCache = FALSE) cacheDir single character value specifying folder contain local cache. Note cached files persistent, cache directory may reused sessions, taking advantage previously downloaded results. directory created exist already. (default: cacheDir = tempdir()) showWarnings single boolean value specifying whether print warnings invocation MGnifyR functions. (default: showWarnings = FALSE) verbose single boolean value specifying whether print extra output invocation MGnifyR functions. (default: verbose = FALSE) clearCache single boolean value specifying whether clear cache. (default: clearCache = FALSE) ... optional arguments: url single character value specifying url address database. (default: url = \"https://www.ebi.ac.uk/metagenomics/api/v1\")","code":""},{"path":"/reference/MgnifyClient.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"MgnifyClient object.","code":""},{"path":"/reference/MgnifyClient.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"functions MGnifyR package take MgnifyClient object first argument. object allows simple handling user authentication access private data, manages general options querying MGnify database. object required functions MGnifyR package.","code":""},{"path":"/reference/MgnifyClient.html","id":"slots","dir":"Reference","previous_headings":"","what":"Slots","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"databaseUrl single character value specifying URL address database. authTok single character value specifying authentication token. useCache single boolean value specifying whether use cache. cacheDir single character value specifying cache directory. showWarnings single boolean value specifying whether show warnings. clearCache single boolean value specifying whether clear cache. verbose single boolean value specifying whether show messages.","code":""},{"path":"/reference/MgnifyClient.html","id":"constructor","dir":"Reference","previous_headings":"","what":"Constructor","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"See MgnifyClient constructor.","code":""},{"path":"/reference/MgnifyClient.html","id":"accessor","dir":"Reference","previous_headings":"","what":"Accessor","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"See MgnifyClient-accessors accessor functions.","code":""},{"path":"/reference/MgnifyClient.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Constructor for creating a MgnifyClient object to allow the access to MGnify database. — MgnifyClient","text":"","code":"my_client <- MgnifyClient( useCache = TRUE, cacheDir = \"/scratch/MGnify_cache_location\" ) if (FALSE) { # \\dontrun{ # Use username and password to get access to non-public data my_client <- MgnifyClient( username = \"Webin-1122334\", password = \"SecretPassword\", useCache = TRUE, cacheDir = \"/scratch/MGnify_cache_location\" ) } # }"},{"path":"/reference/deprecate.html","id":null,"dir":"Reference","previous_headings":"","what":"These functions will be deprecated. Please use other functions instead. — deprecate","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"functions deprecated. Please use functions instead.","code":""},{"path":"/reference/deprecate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"","code":"mgnify_client( username = NULL, password = NULL, usecache = FALSE, cache_dir = NULL, warnings = FALSE, use_memcache = FALSE, ... ) mgnify_query( client, qtype = \"samples\", accession = NULL, asDataFrame = TRUE, maxhits = 200, usecache = FALSE, ... ) mgnify_analyses_from_samples(client, accession, usecache = TRUE, ...) mgnify_analyses_from_studies(client, accession, usecache = TRUE, ...) mgnify_get_download_urls( client, accessions, accession_type, usecache = TRUE, ... ) mgnify_download( client, url, file = NULL, read_func = NULL, usecache = TRUE, Debug = FALSE, ... ) mgnify_get_analyses_results( client = NULL, accessions, retrievelist = c(), compact_results = TRUE, usecache = TRUE, bulk_dl = FALSE, ... ) mgnify_get_analyses_phyloseq( client = NULL, accessions, usecache = TRUE, returnLists = FALSE, tax_SU = \"SSU\", get_tree = FALSE, ... ) mgnify_get_analyses_metadata(client, accessions, usecache = TRUE, ...) mgnify_retrieve_json( client, path = \"biomes\", complete_url = NULL, qopts = NULL, maxhits = 200, usecache = FALSE, Debug = FALSE, ... )"},{"path":"/reference/deprecate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"username - password - usecache - cache_dir - warnings - use_memcache - ... - client - qtype - accession - asDataFrame - maxhits - accessions - accession_type - url - file - read_func - Debug - retrievelist - compact_results - bulk_dl - returnLists - tax_SU - get_tree - path - complete_url - qopts -","code":""},{"path":"/reference/deprecate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"These functions will be deprecated. Please use other functions instead. — deprecate","text":"-","code":""},{"path":"/reference/doQuery.html","id":null,"dir":"Reference","previous_headings":"","what":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"Search MGnify database studies, samples, runs, analyses, biomes, assemblies, genomes.","code":""},{"path":"/reference/doQuery.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"","code":"doQuery(x, ...) # S4 method for class 'MgnifyClient' doQuery( x, type = \"studies\", accession = NULL, as.df = TRUE, max.hits = 200, ... )"},{"path":"/reference/doQuery.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"x MgnifyClient object. ... Remaining parameter key/value pairs may supplied filter returned values. Available options differ types. See discussion Details section details. type single character value specifying type objects query. Must one following options: studies, samples, runs, analyses, biomes, assemblies, super-studies, experiment-types, pipelines, pipeline-tools, publications, genomes, genome-search, genome-search/gather, genome-catalogues, genomeset, cogs, kegg-modules, kegg-classes, antismash-geneclusters, annotations/go-terms, annotations/interpro-identifiers, annotations/kegg-modules, annotations/pfam-entries, annotations/kegg-orthologs, annotations/genome-properties, annotations/antismash-gene-clusters, annotations/organisms, mydata. (default: type = \"studies\") accession single character value vector character values specifying MGnify accession identifiers (type type) NULL. NULL, results defined parameters retrieved. (default: accession = NULL) .df single boolean value specifying whether return results data.frame leave nested list. cases, .df = TRUE make sense. (default: .df = TRUE) max.hits single integer value specifying maximum number results return FALSE. actual number results actually higher max.hits, clipping occurs pagination page boundaries. disable limit, set max.hits = NULL. (default: max.hits = 200)","code":""},{"path":"/reference/doQuery.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"nested list data.frame containing results query.","code":""},{"path":"/reference/doQuery.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"doQuery flexible query function, harnessing \"full\" power JSONAPI MGnify search filters. Search results may filtered metadata value, associated study/sample/analyse etc. See Api browser information MGnify database filters. can find help customizing queries . example following filters available: studies: accession, biome_name, lineage, centre_name, include samples: accession, experiment_type, biome_name, lineage, geo_loc_name, latitude_gte, latitude_lte, longitude_gte, longitude_lte, species, instrument_model, instrument_platform, metadata_key, metadata_value_gte, metadata_value_lte, metadata_value, environment_material, environment_feature, study_accession, include runs: accession, experiment_type, biome_name, lineage, species, instrument_platform, instrument_model, metdata_key, metadata_value_gte, metadata_value_lte, metadata_value, sample_accession, study_accession, include analyses: biome_name, lineage, experiment_type, species, sample_accession, pipeline_version biomes: depth_gte, depth_lte assemblies: depth_gte, depth_lte Unfortunately appears cases, filters work expected, important check results returned match expected. Even unfortunately error parameter specification, query run filter parameters present . Thus result appear superficially correct infact correspond something completely different. behaviour hopefully fixed future incarnations MGnifyR JSONAPI, now users double check returned values. currently possible combine queries type single call (example search samples latitude). However, possible run multiple queries combine results using set operations R get desired behaviour.","code":""},{"path":"/reference/doQuery.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Search MGnify database for studies, samples, runs, analyses, biomes, assemblies, and genomes. — doQuery","text":"","code":"mg <- MgnifyClient(useCache = FALSE) # Get a list of studies from the Agricultural Wastewater : agwaste_studies <- doQuery( mg, \"studies\", biome_name=\"Agricultural wastewater\" ) if (FALSE) { # \\dontrun{ # Get all samples from a particular study samps <- doQuery(mg, \"samples\", accession=\"MGYS00004521\") # Search polar samples samps_np <- doQuery(mg, \"samples\", latitude_gte=66, max.hits=10) samps_sp <- doQuery(mg, \"samples\", latitude_lte=-66, max.hits=10) # Search studies that have studied drinking water tbl <- doQuery( mg, type = \"studies\", biome_name = \"root:Environmental:Aquatic:Freshwater:Drinking water\", max.hits = 10) } # }"},{"path":"/reference/getData.html","id":null,"dir":"Reference","previous_headings":"","what":"Versatile function to retrieve raw results — getData","title":"Versatile function to retrieve raw results — getData","text":"Versatile function retrieve raw results","code":""},{"path":"/reference/getData.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Versatile function to retrieve raw results — getData","text":"","code":"getData(x, ...) # S4 method for class 'MgnifyClient' getData(x, type, accession.type = NULL, accession = NULL, as.df = TRUE, ...)"},{"path":"/reference/getData.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Versatile function to retrieve raw results — getData","text":"x MgnifyClient object. ... optional arguments fed internal functions. type single character value specifying type data retrieve. Must one following options: studies, samples, runs, analyses, biomes, assemblies, super-studies, experiment-types, pipelines, pipeline-tools, publications, genomes, genome-search, genome-search/gather, genome-catalogues, genomeset, cogs, kegg-modules, kegg-classes, antismash-geneclusters, annotations/go-terms, annotations/interpro-identifiers, annotations/kegg-modules, annotations/pfam-entries, annotations/kegg-orthologs, annotations/genome-properties, annotations/antismash-gene-clusters, annotations/organisms, mydata. accession.type single character value specifying type accession IDs (accession). Must specified accession specified. (default: accession.type = NULL) accession single character value vector character values specifying accession IDs return results . (default: accession = NULL) .df single boolean value specifying whether return results data.frame leave nested list. (default: .df = TRUE)","code":""},{"path":"/reference/getData.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Versatile function to retrieve raw results — getData","text":"data.frame list","code":""},{"path":"/reference/getData.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Versatile function to retrieve raw results — getData","text":"function returns data MGnify database. Compared getResult, function allows flexible framework fetching data. However, drawbacks: counts data, getResult returns optimally structured data container easier downstream analysis. getData returns raw data database. However, want retrieve data pipelines publications, instance, getResult suitable , getData can utilized instead.","code":""},{"path":[]},{"path":"/reference/getData.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Versatile function to retrieve raw results — getData","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Find kegg modules for certain analysis df <- getData( mg, type = \"kegg-modules\", accession = \"MGYA00642773\", accession.type = \"analyses\")"},{"path":"/reference/getFile.html","id":null,"dir":"Reference","previous_headings":"","what":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"Download MGnify files, also including processed reads identified protein sequences Listing files available download","code":""},{"path":"/reference/getFile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"","code":"getFile(x, ...) searchFile(x, ...) # S4 method for class 'MgnifyClient' getFile(x, url, file = NULL, read.func = NULL, ...) # S4 method for class 'MgnifyClient' searchFile( x, accession, type = c(\"studies\", \"samples\", \"analyses\", \"assemblies\", \"genomes\", \"run\"), ... )"},{"path":"/reference/getFile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"x MgnifyClient object. ... Additional arguments; used currently. url single character value specifying url address file wish download. file single character value NULL specifying optional local filename use saving file. NULL, MGNify local cache settings used. file intended processed separate program, may sensible provide meaningful file, rather hunt cache folders. file NULL useCache(client) FALSE, read.func parameter must supplied file downloaded deleted. (default: file = NULL) read.func function specifying optional function process downloaded file return results, rather relying post processing. primary use-case parameter local disk space limited downloaded files can quickly processed discarded. function take single parameter, downloaded filename, may return valid R object. (default: read.func = NULL) accession single character value vector character values specifying accession IDs return results . type single character value specifying type objects query. Must one following options: analysis, samples, studies, assembly, genome run. (default: type = \"samples\")","code":""},{"path":"/reference/getFile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"getFile(), either local filename downloaded file, either location MGNifyR cache file. read.func used, result returned. searchFile() data.frame containing discovered downloads. multiple accessions queried, accessions column may filter results - since rownames set (make sense query return multiple items)","code":""},{"path":"/reference/getFile.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"getFile convenient wrapper round generic URL downloading functionality R, taking care things like local caching authentication. searchFile() function wrapper function allowing easy enumeration downloads available given accession IDs. Returns single data.frame containing available downloads associated metadata, including url location description. can filtered extract urls interest, actually retrieving files using getFile()","code":""},{"path":"/reference/getFile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Download any MGnify files, also including processed reads and identified protein sequences — getFile","text":"","code":"# Make a client object mg <- MgnifyClient(useCache = FALSE) # Create a vector of accession ids - these happen to be \\code{analysis} # accessions accession_vect <- c(\"MGYA00563876\", \"MGYA00563877\") downloads <- searchFile(mg, accession_vect, \"analyses\") #> Searching files... #> | | | 0% | |=================================== | 50% | |======================================================================| 100% # Filter to find the urls of 16S encoding sequences url_list <- downloads[ downloads$attributes.description.label == \"Contigs encoding SSU rRNA\", \"download_url\"] # Example 1: # Download the first file supplied_filename <- getFile( mg, url_list[[1]], file=\"SSU_file.fasta.gz\") if (FALSE) { # \\dontrun{ # Example 2: # Just use local caching cached_filename <- getFile(mg, url_list[[2]]) # Example 3: # Using read.func to open the reads with readDNAStringSet from # \\code{biostrings}. Without retaining on disk dna_seqs <- getFile( mg, url_list[[3]], read.func = readDNAStringSet) } # } # Make a client object mg <- MgnifyClient(useCache = TRUE) # Create a vector of accession ids - these happen to be \\code{analysis} # accessions accession_vect <- c( \"MGYA00563876\", \"MGYA00563877\", \"MGYA00563878\", \"MGYA00563879\", \"MGYA00563880\" ) downloads <- searchFile(mg, accession_vect, \"analyses\") #> Searching files... #> | | | 0% | |============== | 20% | |============================ | 40% | |========================================== | 60% | |======================================================== | 80% | |======================================================================| 100%"},{"path":"/reference/getMetadata.html","id":null,"dir":"Reference","previous_headings":"","what":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"Get study, sample analysis metadata supplied analysis accessions","code":""},{"path":"/reference/getMetadata.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"","code":"getMetadata(x, ...) # S4 method for class 'MgnifyClient' getMetadata(x, accession, ...)"},{"path":"/reference/getMetadata.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"x MgnifyClient object. ... Optional arguments; currently used. accession single character value vector analysis accession IDs specifying accessions retrieve data .","code":""},{"path":"/reference/getMetadata.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"data.frame containing metadata analysis accession list. row represents single analysis.","code":""},{"path":"/reference/getMetadata.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"function retrieves study, sample analysis metadata associated provided analysis accessions.","code":""},{"path":"/reference/getMetadata.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get all study, sample and analysis metadata for the supplied analysis accessions — getMetadata","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Download all associated study/sample and analysis metadata accession_list <- c(\"MGYA00377505\") meta_dataframe <- getMetadata(mg, accession_list) #> Fetching metadata... #> | | | 0% | |======================================================================| 100%"},{"path":"/reference/getResult.html","id":null,"dir":"Reference","previous_headings":"","what":"Get microbial and/or functional profiling data for a list of accessions — getResult","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"Get microbial /functional profiling data list accessions","code":""},{"path":"/reference/getResult.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"","code":"getResult(x, ...) # S4 method for class 'MgnifyClient' getResult( x, accession, get.taxa = TRUE, get.func = TRUE, output = \"TreeSE\", ... )"},{"path":"/reference/getResult.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"x MgnifyClient object. ... optional arguments: taxa.su single character value specifying taxa subunit results selected. Currently, taxonomy assignments MGnify pipelines rely rRNA matches existing databases (GreenGenes SILVA), later pipelines checking SSU LSU portions rRNA sequence. taxa.su allows selection either Small subunit (\"SSU\") Large subunit (\"LSU\") results final TreeSummarizedExperiment object. Older pipeline versions report results subunits, thus accessions value effect. get.tree single boolean value specifying whether include available phylogenetic trees TreeSummarizedExperiment object. Available get.taxa = TRUE. (default: get.tree = TRUE) .df single boolean value enabled output = \"list\". argument specifies whether return functional data named list (one entry per element output list) data.frames, data.frame containing results requested accessions. FALSE, function returns list lists, element consisting results single accession. (default: .df = TRUE) bulk.dl single boolean value specifying MGnifyR attempt speed things downloading relevant studies TSV results extracting required columns, rather using JSONAPI interface. getting results multiple accessions share study, option may result significantly faster processing. However, appear (quite ) cases database TSV result columns match expected accession names. hopefully fixed future, now bulk.dl defaults TRUE. work, can orders magnitude efficient. (default: buld_dl = TRUE) accession single character value vector character values specifying accession IDs return results . get.taxa boolean value specifying whether retrieve taxonomy data (OTU table). See taxa.su specifying taxonomy type. data retrieved BIOM files subsequently parsed. (default: get.taxa = TRUE) get.func boolean value single character value vector character values specifying functional analysis types retrieve. get.func = TRUE, available functional datatypes retrieved, FALSE, functional data retrieved. current list available types \"antismash-gene-clusters\", \"go-slim\", \"go-terms\", \"interpro-identifiers\", \"taxonomy\", \"taxonomy-itsonedb\", \"taxonomy-itsunite\", \"taxonomy-lsu\", \"taxonomy-ssu\". Note depending particular analysis type, pipeline version etc., functional results available. Furthermore, taxonomy also available via get.func, loading data might considerable faster bulk.dl = TRUE. However, phylogeny available via get.taxa. (default: get.func = TRUE) output single character value specifying format output. Must one following options: \"TreeSE\", \"list\", \"phyloseq\". (default: output = \"TreeSE\")","code":""},{"path":"/reference/getResult.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"taxonomy data retrieved, result returned TreeSummarizedExperiment object default. result can also returned phyloseq object list data.frames. Note phyloseq object can include one phylogenetic tree meaning taxa might lost data subsetted based tree. functional data retrieved addition taxonomy data, result returned MultiAssayExperiment object. options list containing phyloseq object data.frames just data.frames. Functional data can returned MultiAssayExperiment object list data.frames.","code":""},{"path":"/reference/getResult.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"Given set analysis accessions collection annotation types, function queries MGNify API returns results. function convenient retrieving highly structured (analysis vs counts) data certain instances. example, BIOM files downloaded automatically. want just retrieve raw data database, see getData.","code":""},{"path":[]},{"path":"/reference/getResult.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Get microbial and/or functional profiling data for a list of accessions — getResult","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Get OTU tables as TreeSE accession_list <- c(\"MGYA00377505\") tse <- getResult(mg, accession_list, get.func=FALSE, get.taxa=TRUE) #> Fetching taxonomy data... #> | | | 0% | |======================================================================| 100% #> Merging with full join... #> 1/1 #> if (FALSE) { # \\dontrun{ # Get functional data along with OTU tables as MAE mae <- getResult(mg, accession_list, get.func=TRUE, get.taxa=TRUE) # Get same data as list list <- getResult( mg, accession_list, get.func=TRUE, get.taxa=TRUE, output = \"list\", as.df = TRUE, use.cache = TRUE) } # }"},{"path":"/reference/searchAnalysis.html","id":null,"dir":"Reference","previous_headings":"","what":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Look analysis accession IDs one study sample accessions","code":""},{"path":"/reference/searchAnalysis.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"","code":"searchAnalysis(x, ...) # S4 method for class 'MgnifyClient' searchAnalysis(x, type, accession, ...)"},{"path":"/reference/searchAnalysis.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"x MgnifyClient object. ... Optional arguments; currently used. type single character value specifying type accession IDs specified accession. Must \"studies\" \"samples\". accession single character value vector character values specifying study sample accession IDs used retrieve analyses IDs.","code":""},{"path":"/reference/searchAnalysis.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Vector analysis accession IDs.","code":""},{"path":"/reference/searchAnalysis.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"Retrieve analysis accession IDs associated supplied study sample accession. MGnify, analysis accession refers certain pipeline analysis, specific 16S rRNA shotgun metagenomic mapping. Studies can include multiple samples, sample can undergo multiple analyses using pipelines. analysis identified unique accession ID, allowing precise tracking retrieval analysis results within MGnify database.","code":""},{"path":"/reference/searchAnalysis.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Look up analysis accession IDs for one or more study or sample accessions — searchAnalysis","text":"","code":"# Create a client object mg <- MgnifyClient(useCache = FALSE) # Retrieve analysis ids from study MGYS00005058 result <- searchAnalysis(mg, \"studies\", c(\"MGYS00005058\")) #> Fetching analyses... #> | | | 0% | |======================================================================| 100% if (FALSE) { # \\dontrun{ # Retrieve all analysis ids from samples result <- searchAnalysis( mg, \"samples\", c(\"SRS4392730\", \"SRS4392743\")) } # }"}]