| Title: | Client for Querying the 'Seqout' Genomics Metadata Database |
|---|---|
| Description: | Search and download genomics study metadata from 'Seqout' <https://seqout.org>, which indexes NCBI GEO, NCBI SRA, EBI ENA, DDBJ (DRA and GEA), ArrayExpress and GSA. |
| Authors: | Aniruddha Mukherjee [aut] (ORCID: <https://orcid.org/0009-0008-1350-6787>), Mukesh Reddy [aut], Saket Choudhary [aut, cre] (ORCID: <https://orcid.org/0000-0001-5202-7633>), Saket Lab [cph] |
| Maintainer: | Saket Choudhary <[email protected]> |
| License: | BSD_3_clause + file LICENSE |
| Version: | 0.2.7 |
| Built: | 2026-10-09 16:35:33 UTC |
| Source: | https://github.com/saketlab/seqout |
Uses the accession shape, so no request is made.
accession_kind(accession, archive = FALSE) AccessionKind(accession, archive = FALSE)accession_kind(accession, archive = FALSE) AccessionKind(accession, archive = FALSE)
accession |
An accession from any archive Seqout holds. |
archive |
Include the archive in the result. |
One of "series", "study", "experiment", "sample", "run",
"biosample" or "submission", or NA_character_ when the shape is not
recognised. With archive = TRUE, a named character vector of kind and
archive, the latter one of "geo", "sra", "ena", "ddbj", "gsa",
"arrayexpress", "gea", "bioproject" or "biosample".
AccessionKind("GSE168652") AccessionKind("SRR13927092") AccessionKind("not-an-accession") # PRJCA resolves to GSA under the PRJ shape AccessionKind("PRJCA042384", archive = TRUE) AccessionKind("PRJCA042384", archive = TRUE)[["archive"]]AccessionKind("GSE168652") AccessionKind("SRR13927092") AccessionKind("not-an-accession") # PRJCA resolves to GSA under the PRJ shape AccessionKind("PRJCA042384", archive = TRUE) AccessionKind("PRJCA042384", archive = TRUE)[["archive"]]
Datasets named by an author's publications.
author(name, limit = 200, con = .con()) Author(name, limit = 200, con = .con())author(name, limit = 200, con = .con()) Author(name, limit = 200, con = .con())
name |
The author name as it appears in the publication record. |
limit |
Maximum datasets to return. |
con |
A |
A tibble of projects.
Author("Aviv Regev")Author("Aviv Regev")
join = "inner", the default, keeps the features common to every matrix and
warns when that drops any. Peak-by-cell matrices called per sample rarely
share a feature space, so the difference can be large.
bind_counts( x, labels = NULL, max_cells = NULL, strict = FALSE, join = c("inner", "outer") ) BindCounts( x, labels = NULL, max_cells = NULL, strict = FALSE, join = c("inner", "outer") )bind_counts( x, labels = NULL, max_cells = NULL, strict = FALSE, join = c("inner", "outer") ) BindCounts( x, labels = NULL, max_cells = NULL, strict = FALSE, join = c("inner", "outer") )
x |
A list of |
labels |
Column-name prefix per matrix. Defaults to the list names. |
max_cells |
Cap on columns kept per matrix, sampled at random. |
strict |
Stop rather than warn when the feature sets differ. Ignored
for |
join |
|
join = "outer" keeps the union and fills absent features with zero.
A zero there means "not in this matrix", not "measured as zero".
Dense and sparse inputs may be mixed. Dense outer joins exceeding 5e7 elements use sparse storage to bound memory when features barely overlap.
A matrix, dgCMatrix if the inputs were sparse.
## Not run: counts <- SeqoutCounts("GSE291735") merged <- BindCounts(Matrices(counts, sample = wt$sample), labels = wt$stage, max_cells = 1200 ) ## End(Not run)## Not run: counts <- SeqoutCounts("GSE291735") merged <- BindCounts(Matrices(counts, sample = wt$sample), labels = wt$stage, max_cells = 1200 ) ## End(Not run)
Queries against the cached table use local storage.
cache_table(table, con = .con()) CacheTable(table, con = .con())cache_table(table, con = .con()) CacheTable(table, con = .con())
table |
Table or view name, such as |
con |
A Parquet |
The local table name (invisibly).
Assembles entries from the dataset publication record.
type = "all" includes reanalysis papers.
citations(accession, type = "original", con = .con()) Citations(accession, type = "original", con = .con())citations(accession, type = "original", con = .con()) Citations(accession, type = "original", con = .con())
accession |
A project accession, or several. Several return one bibliography, each entry named for the dataset it came from. |
type |
|
con |
A |
A dataset with no linked paper returns character(0).
Reads REST. The dump lacks reanalysis papers and often publication dates.
A character string of BibTeX entries, or character(0).
seqout_get(x)$pubs for the same papers as a tibble, and paper()
to go the other way, from a paper to the datasets.
cat(Citations("GSE151530")) # include reanalysis papers cat(Citations("GSE168652", type = "all")) writeLines(Citations("GSE151530"), file.path(tempdir(), "GSE151530.bib"))cat(Citations("GSE151530")) # include reanalysis papers cat(Citations("GSE168652", type = "all")) writeLines(Citations("GSE151530"), file.path(tempdir(), "GSE151530.bib"))
Removes *_local tables created by cache_table().
clear_cache(con = .con()) ClearCache(con = .con())clear_cache(con = .con()) ClearCache(con = .con())
con |
A Parquet |
Number of tables removed (invisibly).
Exact lookups against a fixed table; spellings the table lacks give NA.
country_code_to_name(code) country_name_to_code(name) CountryCodeToName(code) CountryNameToCode(name)country_code_to_name(code) country_name_to_code(name) CountryCodeToName(code) CountryNameToCode(name)
code, name
|
Character vectors of alpha-3 codes (e.g. |
A character vector the length of the input, NA where there is no
match.
CountryCodeToName(c("IND", "USA", "XYZ")) CountryNameToCode("India")CountryCodeToName(c("IND", "USA", "XYZ")) CountryNameToCode("India")
Study counts per organism, assay category, archive, year and single-cell status for one country. Each facet holds its top 40 values.
country_facets(code, con = .con()) CountryFacets(code, con = .con())country_facets(code, con = .con()) CountryFacets(code, con = .con())
code |
Character. A two-letter country code. |
con |
A |
A tibble with facet, value and studies columns.
f <- CountryFacets("IN") f[f$facet == "organism", ]f <- CountryFacets("IN") f[f$facet == "organism", ]
One row per study submitted from code. Filter values come from
country_facets().
country_projects( code, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) CountryProjects( code, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )country_projects( code, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) CountryProjects( code, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )
code |
Character. A two-letter country code. |
organism, assay_l1, source
|
Character. Filter to one value from
|
has_fastq, has_sra, is_single_cell
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
sort |
One of |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
con |
A |
A study tibble, with a total attribute for the filtered count
before limit cut it.
country_summary(), country_facets().
# single-cell studies submitted from India, newest first CountryProjects("IN", is_single_cell = TRUE, limit = 100)# single-cell studies submitted from India, newest first CountryProjects("IN", is_single_cell = TRUE, limit = 100)
code is an ISO-3166-1 alpha-2 code (e.g. "US", "IN"); matching is
case-insensitive. A code that isn't two letters, or matches nothing, 404s.
country_summary(code, con = .con()) CountrySummary(code, con = .con())country_summary(code, con = .con()) CountrySummary(code, con = .con())
code |
Character. A two-letter country code. |
con |
A |
A one-row tibble of totals.
country_facets() for the filter values, country_projects()
for the studies themselves.
CountrySummary("US")CountrySummary("US")
The submitter's characteristics spread into one column each. Reuses the
sample record seqout_counts() fetched.
counts_design(counts) CountsDesign(counts)counts_design(counts) CountsDesign(counts)
counts |
A |
A tibble, one row per sample of the study.
counts_samples() for the harmonised cohort fields.
## Not run: counts <- SeqoutListCounts("GSE135251") col_data <- CountsDesign(counts) ## End(Not run)## Not run: counts <- SeqoutListCounts("GSE135251") col_data <- CountsDesign(counts) ## End(Not run)
Keeps samples matching sample_search() with a readable unit.
counts_samples(counts, ..., min_cell_count = 1L) CountsSamples(counts, ..., min_cell_count = 1L)counts_samples(counts, ..., min_cell_count = 1L) CountsSamples(counts, ..., min_cell_count = 1L)
counts |
A |
... |
Filters for |
min_cell_count |
Smallest cell count to keep. Samples with no recorded
count go too; |
Matching samples, sorted by cells, with unit and format.
seqout_counts() for every unit, unfiltered.
## Not run: counts <- seqout_counts("GSE182159") liver <- counts_samples(counts, tissue = "liver", min_cell_count = 1000) m <- seqout_matrix(counts, sample = liver$unit[1]) ## End(Not run)## Not run: counts <- seqout_counts("GSE182159") liver <- counts_samples(counts, tissue = "liver", min_cell_count = 1000) m <- seqout_matrix(counts, sample = liver$unit[1]) ## End(Not run)
Matches q against the GARD and NORD catalogue names and their aliases,
so a colloquial or older name finds the MONDO ids disease_projects()
can then filter on.
disease_aliases(q, limit = 20, con = .con()) DiseaseAliases(q, limit = 20, con = .con())disease_aliases(q, limit = 20, con = .con()) DiseaseAliases(q, limit = 20, con = .con())
q |
Character. A disease name or part of one. |
limit |
Maximum matches to return. |
con |
A |
A tibble with display_name, alias, mondo_ids and sources
(list columns), with a total attribute for all matches and truncated
for whether total exceeds limit.
DiseaseAliases("marfan")DiseaseAliases("marfan")
Study counts per disease category/specialty/group (curated collections) or
organism/assay/journal/country/year/status (a free-text term); see
disease_summary() for the two modes.
disease_facets(collection, con = .con()) DiseaseFacets(collection, con = .con())disease_facets(collection, con = .con()) DiseaseFacets(collection, con = .con())
collection |
Character. |
con |
A |
A tibble with facet, value and studies columns.
DiseaseFacets("rare")DiseaseFacets("rare")
One row per study, filtered and sorted; see disease_summary() for what
distinguishes a curated collection from a free-text term. A curated row
carries the catalogue match (catalogue_diseases, mondo_ids), per-scope
sample counts, and stated/read-derived sex tallies; category/
specialty/group only apply to "rare", nord_type only to "nord".
A term row carries the study's usual metadata plus
n_samples_with_disease, the count of samples resolved to collection
specifically (as opposed to n_samples, the study's total).
disease_projects( collection, category = NULL, specialty = NULL, group = NULL, nord_type = NULL, ancestry = NULL, inheritance = NULL, disease = NULL, assay_category = NULL, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, scope = "human_primary", sort = NULL, order = "desc", limit = NULL, offset = 0, con = .con() ) DiseaseProjects( collection, category = NULL, specialty = NULL, group = NULL, nord_type = NULL, ancestry = NULL, inheritance = NULL, disease = NULL, assay_category = NULL, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, scope = "human_primary", sort = NULL, order = "desc", limit = NULL, offset = 0, con = .con() )disease_projects( collection, category = NULL, specialty = NULL, group = NULL, nord_type = NULL, ancestry = NULL, inheritance = NULL, disease = NULL, assay_category = NULL, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, scope = "human_primary", sort = NULL, order = "desc", limit = NULL, offset = 0, con = .con() ) DiseaseProjects( collection, category = NULL, specialty = NULL, group = NULL, nord_type = NULL, ancestry = NULL, inheritance = NULL, disease = NULL, assay_category = NULL, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, scope = "human_primary", sort = NULL, order = "desc", limit = NULL, offset = 0, con = .con() )
collection |
Character. |
category, specialty, group
|
Character. |
nord_type |
Character. |
ancestry, inheritance, disease, assay_category
|
Character. Curated filters shared by both collections. |
organism, assay_l1, source
|
Character. Filter to one value from
|
has_fastq, has_sra, is_single_cell, is_long_read
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
scope |
One of |
sort |
A curated collection sorts by |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. Curated collections only; a
free-text term pages by cursor internally and errors if |
con |
A |
has_fastq/has_sra are NA when the study is absent from the
download-links table (unknown, not unavailable); filtering on them
accepts only TRUE for that reason. scope (curated only) defaults to
"human_primary" (human material that is neither an immortalized line nor
a derived model); use "patient_derived_model", "cell_line", or "all"
to see what that excludes.
A study tibble, with a total attribute for the filtered count
before limit cut it.
disease_summary(), disease_facets().
DiseaseProjects("rare", category = "Cancers", limit = 100) DiseaseProjects("fatty liver disease", organism = "Homo sapiens", limit = 10)DiseaseProjects("rare", category = "Cancers", limit = 100) DiseaseProjects("fatty liver disease", organism = "Homo sapiens", limit = 10)
collection is either a curated catalogue name ("rare" for NIH GARD,
"nord" for NORD) or any other string, resolved as free text against the
full MONDO ontology and expanded to its descendants. The two modes return
different columns: a curated summary carries per-scope study counts and
stated/read-derived sex tallies; a term summary carries
term/resolution/matched_labels describing how the text resolved,
plus matched_samples scoped to exactly the resolved MONDO ids (samples
is every sample in a matching study, not just the ones that resolved).
disease_summary(collection, con = .con()) DiseaseSummary(collection, con = .con())disease_summary(collection, con = .con()) DiseaseSummary(collection, con = .con())
collection |
Character. |
con |
A |
A free-text term with no MONDO match 404s.
A one-row tibble. Columns depend on collection; see Details.
disease_facets() for the filter values, disease_projects()
for the studies themselves.
DiseaseSummary("rare") DiseaseSummary("fatty liver disease")DiseaseSummary("rare") DiseaseSummary("fatty liver disease")
Fetches submitter BAMs aligned to their chosen reference.
download_bams(accession, dest_dir, quiet = FALSE, con = .con()) DownloadBAMs(accession, dest_dir, quiet = FALSE, con = .con())download_bams(accession, dest_dir, quiet = FALSE, con = .con()) DownloadBAMs(accession, dest_dir, quiet = FALSE, con = .con())
accession |
Any accession Seqout holds. Resolved to its study, since the archive files alignments against one. |
dest_dir |
Directory to write into, created when missing. There is no default, so nothing lands in the working directory unasked. |
quiet |
Suppress progress messages. |
con |
A |
Requester-pays files are named with the command to fetch them.
The paths of the downloaded files, invisibly.
download_runs() for the reads, and seqout_get(x)$bams to see
what exists before fetching any of it.
## Not run: SeqoutGet("SRP071083")$bams # requester-pays inventory DownloadBAMs("SRP071083", "SRP071083") ## End(Not run)## Not run: SeqoutGet("SRP071083")$bams # requester-pays inventory DownloadBAMs("SRP071083", "SRP071083") ## End(Not run)
Fetches .parquet files for the Parquet backend. Existing files are skipped.
HEAD sizes are reported before transfer when available.
download_dump( con = .con(), dest_dir, tables = NULL, overwrite = FALSE, quiet = FALSE ) DownloadDump( con = .con(), dest_dir, tables = NULL, overwrite = FALSE, quiet = FALSE )download_dump( con = .con(), dest_dir, tables = NULL, overwrite = FALSE, quiet = FALSE ) DownloadDump( con = .con(), dest_dir, tables = NULL, overwrite = FALSE, quiet = FALSE )
con |
A |
dest_dir |
Directory to write into, created when missing. There is no default, so nothing lands in the working directory unasked. |
tables |
Which tables to fetch. The default, |
overwrite |
Fetch a file even when it is already on disk. |
quiet |
Suppress progress messages. |
The paths of the downloaded files, invisibly.
seqout_connect() to read the result, and cache_table() to keep
one table in local DuckDB storage.
## Not run: # two common tables DownloadDump(dest_dir = "~/seqout-dump", tables = c("unified_metadata", "geo_series")) con <- SeqoutConnect("parquet", data_dir = "~/seqout-dump") Query("SELECT count(*) FROM unified_metadata", con = con) ## End(Not run)## Not run: # two common tables DownloadDump(dest_dir = "~/seqout-dump", tables = c("unified_metadata", "geo_series")) con <- SeqoutConnect("parquet", data_dir = "~/seqout-dump") Query("SELECT count(*) FROM unified_metadata", con = con) ## End(Not run)
Runs download their own files; larger accessions download all resolved runs. Default mode order is fastq, full SRA, then SRA lite. Published checksums are verified.
download_runs(accession, dest_dir, mode = NULL, quiet = FALSE, con = .con()) DownloadRuns(accession, dest_dir, mode = NULL, quiet = FALSE, con = .con())download_runs(accession, dest_dir, mode = NULL, quiet = FALSE, con = .con()) DownloadRuns(accession, dest_dir, mode = NULL, quiet = FALSE, con = .con())
accession |
Any accession Seqout holds. |
dest_dir |
Directory to write into, created when missing. There is no default, so nothing lands in the working directory unasked. |
mode |
Which copy to take: |
quiet |
Suppress progress messages. |
con |
A |
The paths of the downloaded files, invisibly.
## Not run: DownloadRuns("SRR12012336", "SRR12012336") # one run DownloadRuns("SRP267291", "SRP267291") # every run of a study DownloadRuns("SRP150719", "SRP150719", mode = "fastq") # insist on ENA fastq ## End(Not run)## Not run: DownloadRuns("SRR12012336", "SRR12012336") # one run DownloadRuns("SRP267291", "SRP267291") # every run of a study DownloadRuns("SRP150719", "SRP150719", mode = "fastq") # insist on ENA fastq ## End(Not run)
Downloads processed files: matrices, annotations and archives. Samples stay scoped to their own files.
download_supplementary(accession, dest_dir, quiet = FALSE, con = .con()) DownloadSupplementary(accession, dest_dir, quiet = FALSE, con = .con())download_supplementary(accession, dest_dir, quiet = FALSE, con = .con()) DownloadSupplementary(accession, dest_dir, quiet = FALSE, con = .con())
accession |
Any accession Seqout holds. |
dest_dir |
Directory to write into, created when missing. There is no default, so nothing lands in the working directory unasked. |
quiet |
Suppress progress messages. |
con |
A |
The paths of the downloaded files, invisibly.
## Not run: DownloadSupplementary("GSE168652", "GSE168652") # series files and every sample's DownloadSupplementary("GSM8433846", "GSM8433846") # that one sample's DownloadSupplementary("E-MTAB-11467", "E-MTAB-11467") # processed archives and raw ## End(Not run)## Not run: DownloadSupplementary("GSE168652", "GSE168652") # series files and every sample's DownloadSupplementary("GSM8433846", "GSM8433846") # that one sample's DownloadSupplementary("E-MTAB-11467", "E-MTAB-11467") # processed archives and raw ## End(Not run)
Names the role from the filename, before download.
file_role(name) FileRole(name)file_role(name) FileRole(name)
name |
A file name or URL. |
One of "mtx", "barcodes", "features", "h5", "h5ad",
"rds", "rcc", "table", "tar", "metadata" or "skip".
FileRole("GSM123_matrix.mtx.gz") FileRole("GSM123_barcodes.tsv.gz") FileRole("GSE1_cell_metadata.csv.gz") FileRole("GSM1_fragments.tsv.gz") FileRole("GSM4567420_01_NAS5.RCC.gz")FileRole("GSM123_matrix.mtx.gz") FileRole("GSM123_barcodes.tsv.gz") FileRole("GSE1_cell_metadata.csv.gz") FileRole("GSM1_fragments.tsv.gz") FileRole("GSM4567420_01_NAS5.RCC.gz")
Enumerates values accepted by seqout_search(), with record counts.
list_library_strategies(con = .con()) list_instrument_models(con = .con()) list_journals(con = .con(), limit = 500) list_centers(con = .con(), limit = 500) list_organisms(con = .con(), common_names = FALSE) list_assays(con = .con(), country = NULL) list_platforms(con = .con()) ListAssays(con = .con(), country = NULL) ListCenters(con = .con(), limit = 500) ListInstrumentModels(con = .con()) ListJournals(con = .con(), limit = 500) ListLibraryStrategies(con = .con()) ListOrganisms(con = .con(), common_names = FALSE) ListPlatforms(con = .con())list_library_strategies(con = .con()) list_instrument_models(con = .con()) list_journals(con = .con(), limit = 500) list_centers(con = .con(), limit = 500) list_organisms(con = .con(), common_names = FALSE) list_assays(con = .con(), country = NULL) list_platforms(con = .con()) ListAssays(con = .con(), country = NULL) ListCenters(con = .con(), limit = 500) ListInstrumentModels(con = .con()) ListJournals(con = .con(), limit = 500) ListLibraryStrategies(con = .con()) ListOrganisms(con = .con(), common_names = FALSE) ListPlatforms(con = .con())
con |
A |
limit |
The maximum number of values. Only |
common_names |
Add a
|
country |
Scope the assay counts to one country, by name. The default,
|
list_assays() returns both assay levels in a level column.
These functions read REST; query() can count from the dump.
A tibble of values and counts.
ListLibraryStrategies() # instrument_model values ListInstrumentModels() # connection-first call SeqoutConnect("api") |> ListJournals(limit = 20) ## Not run: # pass a value into search top <- ListLibraryStrategies()$value[1] SeqoutSearch("liver", library_strategy = top, limit = 10) ## End(Not run)ListLibraryStrategies() # instrument_model values ListInstrumentModels() # connection-first call SeqoutConnect("api") |> ListJournals(limit = 20) ## Not run: # pass a value into search top <- ListLibraryStrategies()$value[1] SeqoutSearch("liver", library_strategy = top, limit = 10) ## End(Not run)
CellRanger directories win; otherwise strip compression and role tokens.
Matching stems place matrix.mtx, barcodes.tsv, and features.tsv together.
group_key(name) GroupKey(name)group_key(name) GroupKey(name)
name |
A file name or path. |
The grouping key.
GroupKey("GSM123_pbmc_matrix.mtx.gz") GroupKey("GSM123/filtered_feature_bc_matrix/matrix.mtx.gz")GroupKey("GSM123_pbmc_matrix.mtx.gz") GroupKey("GSM123/filtered_feature_bc_matrix/matrix.mtx.gz")
Find the GEO series a sample belongs to
gsm_series(gsm, con = .con()) GSMSeries(gsm, con = .con())gsm_series(gsm, con = .con()) GSMSeries(gsm, con = .con())
gsm |
A GEO sample accession (GSM). |
con |
A |
The GSE accession, or NA_character_.
Filtered output ranks before raw.
is_filtered(name) IsFiltered(name)is_filtered(name) IsFiltered(name)
name |
A file name. |
TRUE when the name marks filtered output.
IsFiltered("GSM1_filtered_feature_bc_matrix.h5") IsFiltered("GSM1_raw_feature_bc_matrix.h5")IsFiltered("GSM1_filtered_feature_bc_matrix.h5") IsFiltered("GSM1_raw_feature_bc_matrix.h5")
Resolves a sequencing study to its GEO or ArrayExpress series.
linked_geo(accession, con = .con()) LinkedGEO(accession, con = .con())linked_geo(accession, con = .con()) LinkedGEO(accession, con = .con())
accession |
A study accession (SRP, ERP, DRP, PRJ). |
con |
A |
The linked series accession, or NA_character_.
GEO and ArrayExpress runs live under linked sequencing studies. GEA resolves through BioProject.
linked_study(accession, con = .con()) LinkedStudy(accession, con = .con())linked_study(accession, con = .con()) LinkedStudy(accession, con = .con())
accession |
A series accession (GSE, E-MTAB-N, E-GEAD-N). |
con |
A |
The linked study accession, or NA_character_.
Study counts per technology, platform, instrument model, library strategy, organism, archive, chemistry and year.
longread_facets(con = .con()) LongreadFacets(con = .con())longread_facets(con = .con()) LongreadFacets(con = .con())
con |
A |
A tibble with facet, value and studies columns.
f <- LongreadFacets() f[f$facet == "technology", ]f <- LongreadFacets() f[f$facet == "technology", ]
One row per study; a study mirrored in more than one archive counts once.
long_read_only = TRUE had no other platform; FALSE is hybrid; NA has
no experiment rows to judge by (GEO-only entries). Filter values come from
longread_facets().
longread_projects( technology = NULL, platform = NULL, instrument_model = NULL, library_strategy = NULL, organism = NULL, archive = NULL, chemistry = NULL, assay_l1 = NULL, year = NULL, has_fastq = NULL, has_sra = NULL, long_read_only = NULL, has_exact_chemistry = NULL, single_cell = NULL, sort = "n_experiments", order = "desc", limit = NULL, offset = 0, con = .con() ) LongreadProjects( technology = NULL, platform = NULL, instrument_model = NULL, library_strategy = NULL, organism = NULL, archive = NULL, chemistry = NULL, assay_l1 = NULL, year = NULL, has_fastq = NULL, has_sra = NULL, long_read_only = NULL, has_exact_chemistry = NULL, single_cell = NULL, sort = "n_experiments", order = "desc", limit = NULL, offset = 0, con = .con() )longread_projects( technology = NULL, platform = NULL, instrument_model = NULL, library_strategy = NULL, organism = NULL, archive = NULL, chemistry = NULL, assay_l1 = NULL, year = NULL, has_fastq = NULL, has_sra = NULL, long_read_only = NULL, has_exact_chemistry = NULL, single_cell = NULL, sort = "n_experiments", order = "desc", limit = NULL, offset = 0, con = .con() ) LongreadProjects( technology = NULL, platform = NULL, instrument_model = NULL, library_strategy = NULL, organism = NULL, archive = NULL, chemistry = NULL, assay_l1 = NULL, year = NULL, has_fastq = NULL, has_sra = NULL, long_read_only = NULL, has_exact_chemistry = NULL, single_cell = NULL, sort = "n_experiments", order = "desc", limit = NULL, offset = 0, con = .con() )
technology, platform, instrument_model, library_strategy, organism, archive, chemistry, assay_l1
|
Character. Filter to one value from |
year |
Integer. Publication year. |
has_fastq, has_sra, long_read_only, has_exact_chemistry
|
Logical filters. |
single_cell |
|
sort |
One of |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
con |
A |
single_cell keeps only studies also flagged single-cell
(is_single_cell). The server has no such parameter, so this filters
locally.
A study tibble, with a total attribute for the filtered count
before limit cut it.
longread_summary(), longread_facets(),
project_longread_chemistry() for one study's per-run detail.
# long-read-only datasets LongreadProjects(long_read_only = TRUE, limit = 10) # long-read AND single-cell LongreadProjects(single_cell = TRUE, limit = 10) # Oxford Nanopore human studies, newest first LongreadProjects( technology = "Oxford Nanopore", organism = "Homo sapiens", sort = "first_published", limit = 10 )# long-read-only datasets LongreadProjects(long_read_only = TRUE, limit = 10) # long-read AND single-cell LongreadProjects(single_cell = TRUE, limit = 10) # Oxford Nanopore human studies, newest first LongreadProjects( technology = "Oxford Nanopore", organism = "Homo sapiens", sort = "first_published", limit = 10 )
Totals for studies with at least one PacBio or Oxford Nanopore experiment,
across GEO, SRA, ENA, DDBJ DRA and GSA. A study mirrored in more than one
archive counts once. studies_hybrid also sequenced on a short-read
platform; studies_long_read_only did not; the remainder have no
experiment rows to judge by (GEO-only entries).
longread_summary(con = .con()) LongreadSummary(con = .con())longread_summary(con = .con()) LongreadSummary(con = .con())
con |
A |
A one-row tibble of totals.
longread_facets() for the filter values, longread_projects()
for the studies themselves.
LongreadSummary()LongreadSummary()
Adds <column>_ontology_id columns with comma-separated CURIEs.
Missing or empty labels become NA.
map_to_ontology( x, columns, ontology = NULL, use_synonyms = FALSE, max_hops = 1, con = .con() ) MapToOntology( x, columns, ontology = NULL, use_synonyms = FALSE, max_hops = 1, con = .con() )map_to_ontology( x, columns, ontology = NULL, use_synonyms = FALSE, max_hops = 1, con = .con() ) MapToOntology( x, columns, ontology = NULL, use_synonyms = FALSE, max_hops = 1, con = .con() )
x |
A data frame to copy and annotate. |
columns |
Character. The name of one column, or of several. |
ontology |
Keep the identifiers of one source only, for example |
use_synonyms |
Let a label with no identifier of its own take the
identifiers of its synonyms. |
max_hops |
How far to walk the synonym links, 1 to 4. Read only when
|
con |
A |
Only the identifiers of the label itself are read. Under use_synonyms,
synonym IDs can be narrower; own IDs win.
Reads REST. The ontology graph is absent from the dump.
x with one new character column for each column that you named.
ontology() for what the graph holds about one term.
meta <- data.frame(celltype = c("T cell", "hepatocyte", "HeLa")) MapToOntology(meta, "celltype") # Cell Ontology IDs MapToOntology(meta, "celltype", ontology = "CL") # allow synonym IDs MapToOntology(meta, "celltype", use_synonyms = TRUE)meta <- data.frame(celltype = c("T cell", "hepatocyte", "HeLa")) MapToOntology(meta, "celltype") # Cell Ontology IDs MapToOntology(meta, "celltype", ontology = "CL") # allow synonym IDs MapToOntology(meta, "celltype", use_synonyms = TRUE)
Broken units are skipped with a warning.
matrices(counts, sample = NULL) Matrices(counts, sample = NULL)matrices(counts, sample = NULL) Matrices(counts, sample = NULL)
counts |
A |
sample |
Unit labels or sample accessions to read. |
A named list of seqout_matrix objects, keyed by unit label.
Flattens the microbes list column from sample_search() into one row
per (sample, organism, run).
microbe_detections( x, validated_only = FALSE, columns = c("organism", "class", "kingdom", "breadth_frac", "kmer_mass") ) MicrobeDetections( x, validated_only = FALSE, columns = c("organism", "class", "kingdom", "breadth_frac", "kmer_mass") )microbe_detections( x, validated_only = FALSE, columns = c("organism", "class", "kingdom", "breadth_frac", "kmer_mass") ) MicrobeDetections( x, validated_only = FALSE, columns = c("organism", "class", "kingdom", "breadth_frac", "kmer_mass") )
x |
A sample tibble from |
validated_only |
Keep only detections that pass the stored gates. |
columns |
Detection fields to keep. The default set covers the organism, its class and the two evidence measures. |
A tibble of sample plus the requested detection fields, empty when
nothing was detected.
sample_search() for the samples, sample_microbes() for every
detection in one sample.
hpv <- SampleSearch( disease_ontology_id = "MONDO:0002974", microbe = "HPV", limit = 10 ) d <- MicrobeDetections(hpv) sort(table(d$organism), decreasing = TRUE) # only the detections that pass the gates MicrobeDetections(hpv, validated_only = TRUE)hpv <- SampleSearch( disease_ontology_id = "MONDO:0002974", microbe = "HPV", limit = 10 ) d <- MicrobeDetections(hpv) sort(table(d$organism), decreasing = TRUE) # only the detections that pass the gates MicrobeDetections(hpv, validated_only = TRUE)
Looks up one term in the graph used for search expansion. Returns source IDs, synonyms and direct children.
ontology(term, max_hops = 2, children = TRUE, con = .con()) Ontology(term, max_hops = 2, children = TRUE, con = .con())ontology(term, max_hops = 2, children = TRUE, con = .con()) Ontology(term, max_hops = 2, children = TRUE, con = .con())
term |
The word or phrase to look up. Case does not matter. |
max_hops |
How far to walk the synonym links, 1 to 4. |
children |
Set |
con |
A |
max_hops bounds the walk over the synonym links only. Children are always
the direct children of the resulting synonym cluster, at any max_hops.
A term absent from the graph returns an empty tibble.
Reads REST. The ontology graph is absent from the dump.
A tibble with one row for the term, one for each synonym and one for
each child. Columns: relation, name, xrefs (a list column of source
CURIEs) and has_children. The synonym_total, children_truncated and
max_hops attributes report what the server capped.
seqout_search(), which expands a plain query through this graph.
Ontology("liver") # The identifiers alone, without the hierarchy query Ontology("breast cancer", children = FALSE)$xrefs # Terms one level down that expand further onto <- Ontology("liver") onto[onto$relation == "child" & onto$has_children, "name"]Ontology("liver") # The identifiers alone, without the hierarchy query Ontology("breast cancer", children = FALSE)$xrefs # Terms one level down that expand further onto <- Ontology("liver") onto[onto$relation == "child" & onto$has_children, "name"]
Find projects linked to a publication
paper(id = NULL, pmid = NULL, doi = NULL, con = .con()) Paper(id = NULL, pmid = NULL, doi = NULL, con = .con())paper(id = NULL, pmid = NULL, doi = NULL, con = .con()) Paper(id = NULL, pmid = NULL, doi = NULL, con = .con())
id |
Bare PubMed ID (digits) or DOI starting |
pmid |
PubMed ID. |
doi |
DOI. |
con |
A |
A tibble of linked projects, empty when the publication is unknown.
Paper("34764296") Paper(doi = "10.1038/s41467-021-26864-x")Paper("34764296") Paper(doi = "10.1038/s41467-021-26864-x")
Study counts per perturbation type, confidence, data availability, genetic tool, perturbation method, compound, organism, tissue, readout assay and year. Each facet holds its top 100 values.
perturbation_facets(con = .con()) PerturbationFacets(con = .con())perturbation_facets(con = .con()) PerturbationFacets(con = .con())
con |
A |
A tibble with facet, value and studies columns.
f <- PerturbationFacets() f[f$facet == "perturbation_method", ]f <- PerturbationFacets() f[f$facet == "perturbation_method", ]
One row per single-cell study with genetic (CRISPR knockout, CRISPRi, CRISPRa, RNAi, ORF, base or prime editing), chemical (drug or biologic) or other-stimulus perturbation evidence, with the readout assay and whether a counted matrix, raw FASTQ, both or neither is available.
perturbation_projects( perturbation_type = NULL, confidence = NULL, min_confidence = NULL, data_availability = NULL, genetic_subtype = NULL, perturbation_method = NULL, compound = NULL, readout_assay = NULL, cell_line = NULL, organism = NULL, tissue = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_control_arm = NULL, is_pooled = NULL, is_long_read = NULL, q = NULL, sort = "confidence", order = "desc", limit = NULL, offset = 0, con = .con() ) PerturbationProjects( perturbation_type = NULL, confidence = NULL, min_confidence = NULL, data_availability = NULL, genetic_subtype = NULL, perturbation_method = NULL, compound = NULL, readout_assay = NULL, cell_line = NULL, organism = NULL, tissue = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_control_arm = NULL, is_pooled = NULL, is_long_read = NULL, q = NULL, sort = "confidence", order = "desc", limit = NULL, offset = 0, con = .con() )perturbation_projects( perturbation_type = NULL, confidence = NULL, min_confidence = NULL, data_availability = NULL, genetic_subtype = NULL, perturbation_method = NULL, compound = NULL, readout_assay = NULL, cell_line = NULL, organism = NULL, tissue = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_control_arm = NULL, is_pooled = NULL, is_long_read = NULL, q = NULL, sort = "confidence", order = "desc", limit = NULL, offset = 0, con = .con() ) PerturbationProjects( perturbation_type = NULL, confidence = NULL, min_confidence = NULL, data_availability = NULL, genetic_subtype = NULL, perturbation_method = NULL, compound = NULL, readout_assay = NULL, cell_line = NULL, organism = NULL, tissue = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_control_arm = NULL, is_pooled = NULL, is_long_read = NULL, q = NULL, sort = "confidence", order = "desc", limit = NULL, offset = 0, con = .con() )
perturbation_type |
One of |
confidence |
One of |
min_confidence |
One of |
data_availability |
One of |
genetic_subtype, perturbation_method, compound, readout_assay, cell_line, organism, tissue
|
Character. Filter to one value from |
year |
Integer. Publication year. |
has_matrix, has_fastq, has_control_arm, is_pooled, is_long_read
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
sort |
One of |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
con |
A |
Detection is rule-based, from named methods in the study's own text (Perturb-seq, CROP-seq, ECCITE-seq, Mosaic-seq, TAP-seq, Spear-ATAC, sci-Plex, MIX-Seq and others), guide-library and pooled-screen wording, a control-arm design test on sample treatment values, and a ChEBI compound lexicon.
confidence is "high", "medium" or "low". High needs a named method,
a guide library with screen text, or several compound treatments beside a
control arm. Medium is corroborated by a second signal. Low is a single weak
signal and includes false positives, so start from
min_confidence = "medium" when you want studies to rely on. evidence
lists the signals behind each row. perturbation_type is "genetic",
"chemical", "both" or "other" (a cytokine or stimulation design with a
control). Germline knockout and transgenic models are not evidence, and
doxycycline or tamoxifen used as Cre or Tet inducers never count as the
perturbation.
compounds are ChEBI-matched names from sample treatment values. They are
empty when the drug arms live only in supplementary files or cell barcodes,
as in sci-Plex, so a named method with no compounds is expected.
data_availability is "both", "matrix_only", "fastq_only" or
"neither", from has_matrix and has_fastq. Filter values come from
perturbation_facets().
A study tibble, with a total attribute for the filtered count
before limit cut it.
perturbation_summary(), perturbation_facets(),
seqout_counts() to read the matrices of a study with has_matrix.
# studies to rely on that have both a matrix and FASTQ PerturbationProjects( min_confidence = "medium", data_availability = "both", limit = 100 ) # CRISPRi screens in human PerturbationProjects( perturbation_type = "genetic", genetic_subtype = "CRISPRi", organism = "Homo sapiens", min_confidence = "medium", limit = 10 ) # drug studies that name trametinib PerturbationProjects(compound = "trametinib", has_matrix = TRUE, limit = 10)# studies to rely on that have both a matrix and FASTQ PerturbationProjects( min_confidence = "medium", data_availability = "both", limit = 100 ) # CRISPRi screens in human PerturbationProjects( perturbation_type = "genetic", genetic_subtype = "CRISPRi", organism = "Homo sapiens", min_confidence = "medium", limit = 10 ) # drug studies that name trametinib PerturbationProjects(compound = "trametinib", has_matrix = TRUE, limit = 10)
Totals for single-cell studies with genetic or chemical perturbation
evidence, the same population perturbation_projects() lists.
studies_high_medium counts the studies whose evidence is strong enough to
rely on; studies also counts weak single-signal calls.
perturbation_summary(con = .con()) PerturbationSummary(con = .con())perturbation_summary(con = .con()) PerturbationSummary(con = .con())
con |
A |
A one-row tibble of totals.
perturbation_facets() for the filter values,
perturbation_projects() for the studies themselves.
PerturbationSummary()PerturbationSummary()
Every PacBio/Oxford Nanopore run in the study, independent of single-cell
status and Pentimento linkage. chemistry_confidence is exact when read
from the submitted BAM's own header, declared (ONT only) when parsed from
the depositor's own protocol text, bucket when inferred from
instrument_model alone, unknown otherwise.
project_longread_chemistry(accession, con = .con()) ProjectLongreadChemistry(accession, con = .con())project_longread_chemistry(accession, con = .con()) ProjectLongreadChemistry(accession, con = .con())
accession |
A study or series accession, or one resolving to a study. |
con |
A |
A run tibble, empty when the study has no long-read runs.
project_single_cell(), whose longread_chemistry attribute
answers the same question restricted to the study's first page of
samples.
ProjectLongreadChemistry("GSE297547")ProjectLongreadChemistry("GSE297547")
One row per sample with matrix dimensions and read-derived calls.
project_single_cell(accession, limit = NULL, offset = 0, con = .con()) ProjectSingleCell(accession, limit = NULL, offset = 0, con = .con())project_single_cell(accession, limit = NULL, offset = 0, con = .con()) ProjectSingleCell(accession, limit = NULL, offset = 0, con = .con())
accession |
A study or series accession, or one resolving to a study. |
limit |
Maximum samples; |
offset |
Number of samples to skip. |
con |
A |
cells counts matrix columns; for unfiltered 10x matrices these are
barcodes, so the number is an upper bound and sums overcount.
has_*_reads = NA means unscreened; FALSE means screened with no hit.
flags preserves the same distinction.
A sample tibble, empty when the study is unprocessed. The study
and n_samples_total attributes carry the study row and its total. The
longread_chemistry attribute carries every PacBio/Oxford Nanopore run
in the study (empty, not NULL, when there are none); the server only
computes it when offset = 0.
sample_microbes() for the per-organism detections behind the
viral and bacterial flags, project_longread_chemistry() to read the
same run list without an offset argument.
sc <- ProjectSingleCell("GSE168652") sc[, c("sample_accession", "cells", "genes")] attr(sc, "study")$study_cells attr(sc, "longread_chemistry")sc <- ProjectSingleCell("GSE168652") sc[, c("sample_accession", "cells", "genes")] attr(sc, "study")$study_cells attr(sc, "longread_chemistry")
kind describes the evidence behind the call:
matrix_and_readscounts and reads, both confirmed
matrix_reads_unscannedcounts plus linked FASTQ no read-derived call has confirmed yet
matrix_onlycounts, no linked reads
reads_onlyno parsed matrix
project_single_cell_status(accession, con = .con()) ProjectSingleCellStatus(accession, con = .con())project_single_cell_status(accession, con = .con()) ProjectSingleCellStatus(accession, con = .con())
accession |
A study or series accession, or one resolving to a study. |
con |
A |
A one-row tibble, or an empty one when the accession is unknown to both the unified catalogue and the Pentimento.
project_single_cell_summary() for the study-level rollup,
project_single_cell() for the per-sample counts.
st <- ProjectSingleCellStatus("GSE168652") st$single_cell_status st$n_independent_evidencest <- ProjectSingleCellStatus("GSE168652") st$single_cell_status st$n_independent_evidence
Study-level single-cell summary: cells, reads scanned, microbes
project_single_cell_summary(accession, con = .con()) ProjectSingleCellSummary(accession, con = .con())project_single_cell_summary(accession, con = .con()) ProjectSingleCellSummary(accession, con = .con())
accession |
A study or series accession, or one resolving to a study. |
con |
A |
A one-row tibble, empty when the study is not in the Pentimento.
project_single_cell_status() when you need an answer even for a
study absent from the Pentimento.
s <- ProjectSingleCellSummary("GSE168652") s$study_cells s$microbe_measureds <- ProjectSingleCellSummary("GSE168652") s$study_cells s$microbe_measured
The DuckDB database includes remote views and cached local tables.
query(sql, params = NULL, con = .con()) Query(sql, params = NULL, con = .con())query(sql, params = NULL, con = .con()) Query(sql, params = NULL, con = .con())
sql |
SQL query to execute. |
params |
Parameters for a parameterised query. |
con |
A Parquet |
A tibble with query results.
## Not run: con <- SeqoutConnect("parquet") Query("SELECT accession, title FROM geo_series LIMIT 10", con = con) SeqoutDefault(con) # or make it the session default Query(" SELECT dominant_scientific_name AS organism, count(*) AS n FROM unified_metadata WHERE dominant_scientific_name IS NOT NULL GROUP BY organism ORDER BY n DESC LIMIT 20 ") ## End(Not run)## Not run: con <- SeqoutConnect("parquet") Query("SELECT accession, title FROM geo_series LIMIT 10", con = con) SeqoutDefault(con) # or make it the session default Query(" SELECT dominant_scientific_name AS organism, count(*) AS n FROM unified_metadata WHERE dominant_scientific_name IS NOT NULL GROUP BY organism ORDER BY n DESC LIMIT 20 ") ## End(Not run)
Scores markers per cell, averages by cluster, and labels by the top set.
Marker sets with no genes in x are dropped with a warning.
quick_annotation(x, clusters, markers, normalize = "auto") QuickAnnotation(x, clusters, markers, normalize = "auto")quick_annotation(x, clusters, markers, normalize = "auto") QuickAnnotation(x, clusters, markers, normalize = "auto")
x |
A features by cells matrix, as |
clusters |
Cluster assignment per cell, one entry per column of |
markers |
A named list of marker gene vectors, one per cell type. |
normalize |
Scale each cell to 10,000 counts and |
Scores are unscaled; housekeeping-heavy sets can win.
A character vector of labels, named by cluster, with the cluster by
marker-set score matrix attached as attribute scores.
## Not run: markers <- list( neuron = c("Neurod2", "Tbr1"), microglia = c("Cx3cr1", "C1qa") ) expr <- Seurat::GetAssayData(obj, assay = "RNA", slot = "data") # Seurat v4 expr <- SeuratObject::LayerData(Seurat::JoinLayers(obj), layer = "data") # v5 labels <- QuickAnnotation(expr, obj$seurat_clusters, markers) obj$celltype <- unname(labels[as.character(obj$seurat_clusters)]) ## End(Not run)## Not run: markers <- list( neuron = c("Neurod2", "Tbr1"), microglia = c("Cx3cr1", "C1qa") ) expr <- Seurat::GetAssayData(obj, assay = "RNA", slot = "data") # Seurat v4 expr <- SeuratObject::LayerData(Seurat::JoinLayers(obj), layer = "data") # v5 labels <- QuickAnnotation(expr, obj$seurat_clusters, markers) obj$celltype <- unname(labels[as.character(obj$seurat_clusters)]) ## End(Not run)
Views are lazy; catalog reads need them registered first.
register_tables(con = .con(), tables = NULL, progress = interactive()) RegisterTables(con = .con(), tables = NULL, progress = interactive())register_tables(con = .con(), tables = NULL, progress = interactive()) RegisterTables(con = .con(), tables = NULL, progress = interactive())
con |
A Parquet |
tables |
Which tables to register. Defaults to all of them. |
progress |
Show a progress bar. Defaults to |
The names of every registered view, invisibly.
## Not run: con <- SeqoutConnect("parquet") RegisterTables(con, "unified_metadata") dplyr::tbl(con$db, "unified_metadata") # all views SeqoutConnect("parquet") |> RegisterTables() ## End(Not run)## Not run: con <- SeqoutConnect("parquet") RegisterTables(con, "unified_metadata") dplyr::tbl(con$db, "unified_metadata") # all views SeqoutConnect("parquet") |> RegisterTables() ## End(Not run)
Resolves a run, experiment or sample to its study or series.
resolve_study(accession, con = .con()) ResolveStudy(accession, con = .con())resolve_study(accession, con = .con()) ResolveStudy(accession, con = .con())
accession |
A run, experiment or sample accession. |
con |
A |
The study accession, or NA_character_ when nothing links back.
resolve_study("SRR13927092")resolve_study("SRR13927092")
One row per file: a paired run gives two. Uses the same choice of copy as
download_runs(), so this is what that call would fetch.
run_files(x, mode = NULL, con = .con()) RunFiles(x, mode = NULL, con = .con())run_files(x, mode = NULL, con = .con()) RunFiles(x, mode = NULL, con = .con())
x |
A runs table (e.g. |
mode |
Which copy to take: |
con |
A |
A tibble with run, mode, url, name (the file name on disk),
bytes and md5; bytes/md5 are NA where the archive publishes
none. Runs with no downloadable copy are left out.
files <- RunFiles("SRP148597", mode = "fastq") sum(files$bytes, na.rm = TRUE) / 1e9 # GB to fetch "SRR7191948" |> RunFiles()files <- RunFiles("SRP148597", mode = "fastq") sum(files$bytes, na.rm = TRUE) / 1e9 # GB to fetch "SRR7191948" |> RunFiles()
Returns one row per organism, ordered by k-mer mass.
sample_microbes( accession, kind = c("all", "viral", "bacterial", "both"), min_breadth = NULL, min_kmer_mass = NULL, validated_only = FALSE, include_background = FALSE, detail = FALSE, limit = 500, con = .con() ) SampleMicrobes( accession, kind = c("all", "viral", "bacterial", "both"), min_breadth = NULL, min_kmer_mass = NULL, validated_only = FALSE, include_background = FALSE, detail = FALSE, limit = 500, con = .con() )sample_microbes( accession, kind = c("all", "viral", "bacterial", "both"), min_breadth = NULL, min_kmer_mass = NULL, validated_only = FALSE, include_background = FALSE, detail = FALSE, limit = 500, con = .con() ) SampleMicrobes( accession, kind = c("all", "viral", "bacterial", "both"), min_breadth = NULL, min_kmer_mass = NULL, validated_only = FALSE, include_background = FALSE, detail = FALSE, limit = 500, con = .con() )
accession |
A GSM, or the archive sample accession behind one. |
kind |
Detection class: |
min_breadth |
Keep only detections covering at least this fraction of the reference, overriding the stored gate. |
min_kmer_mass |
Keep only detections at or above this weighted k-mer mass. |
validated_only |
Keep only detections that pass the stored gates. |
include_background |
Include reagent kitome and skin flora, which are excluded by default. |
detail |
Return per-run rows; the organism view stays on the
|
limit |
The maximum number of detection rows to read, at most 1000. |
con |
A |
Panel-unitig alignments lack raw-read, UMI and replicate confirmation.
measurable = FALSE or NA means unscreened and triggers a warning.
kmer_mass weights k-mers within a run, so it carries no absolute scale.
n_unitigs counts mapped unitigs.
Spike-in, negative-control and background classes are excluded from totals.
An organism tibble, or a run-by-organism tibble when
detail = TRUE. measurable, n_runs, totals, by_kingdom,
control_kingdoms and the unpicked view are carried as attributes.
project_single_cell() for the study-wide flags.
m <- SampleMicrobes("GSM5155196", kind = "viral") m[, c("organism", "n_unitigs", "max_breadth_frac")] attr(m, "measurable") attr(m, "detections")m <- SampleMicrobes("GSM5155196", kind = "viral") m[, c("organism", "n_unitigs", "max_breadth_frac")] attr(m, "measurable") attr(m, "detections")
Searches harmonised sample metadata. Unharmonised samples are absent.
sample_search( filters = NULL, ..., single_cell = NULL, include_descendants = TRUE, sort = "sample", order = "asc", limit = NULL, con = .con() ) SampleSearch( filters = NULL, ..., single_cell = NULL, include_descendants = TRUE, sort = "sample", order = "asc", limit = NULL, con = .con() )sample_search( filters = NULL, ..., single_cell = NULL, include_descendants = TRUE, sort = "sample", order = "asc", limit = NULL, con = .con() ) SampleSearch( filters = NULL, ..., single_cell = NULL, include_descendants = TRUE, sort = "sample", order = "asc", limit = NULL, con = .con() )
filters |
Filters as a named list. Names in |
... |
The filters, by name, from the set above. At least one is
required, here or in |
single_cell |
How to decide a sample is single-cell:
|
include_descendants |
Expand an ontology filter through the ontology
graph, so |
sort |
|
order |
|
limit |
The maximum number of samples. The default, |
con |
A |
tissue, disease, cell_type, assay,
assay_category, phenotype, treatment, development_stage,
sample_type, genetic_modification, strain, cell_line,
ethnicity, tissue_primary_site. "liver" matches
"liver, left lobe".
organism, sex, taxid, study_accession.
Exact matching keeps "male" from matching "female".
disease_ontology_id, tissue_ontology_id,
cell_type_ontology_id, assay_ontology_id,
development_stage_ontology_id. Give a CURIE such as
"MONDO:0005061". See include_descendants.
age_min_years, age_max_years, min_cell_count,
max_cell_count, min_gene_count, max_gene_count. An age filter
excludes a sample without a recorded age, so age_min_years = 0
means "has a recorded age".
has_matrix keeps samples with a parsed cell-by-gene
matrix.
single_cell_only (but see single_cell),
has_viral_reads, has_bacterial_reads, hpv_type, microbe,
microbe_class, microbe_min_breadth, microbe_min_kmer_mass,
microbe_validated_only.
A microbe* filter keeps samples with matching detections and attaches them.
Requires REST. The harmonised sample table is absent from the Parquet dump.
A sample tibble with total and filters attributes.
sample_microbes() for every detection in one sample,
seqout_search() when the answer should be projects.
# single-cell samples by assay text SampleSearch(tissue = "liver", disease = "steato", single_cell = "assay", limit = 10) # female human liver samples over 50 SampleSearch( organism = "Homo sapiens", sex = "female", tissue = "liver", age_min_years = 50, limit = 10 ) # HPV references use HPV16, HPV18, and related names # "papillomavirus" matches nothing hpv <- SampleSearch( tissue = "cervix", microbe = "HPV", sort = "cell_count", order = "desc", limit = 10 ) attr(hpv, "total") # filters built in code list(tissue = "cervix", microbe = "HPV") |> SampleSearch(limit = 10) # ontology term and subtypes SampleSearch(disease_ontology_id = "MONDO:0005061", limit = 10) # exact term SampleSearch( disease_ontology_id = "MONDO:0005061", include_descendants = FALSE, limit = 10 )# single-cell samples by assay text SampleSearch(tissue = "liver", disease = "steato", single_cell = "assay", limit = 10) # female human liver samples over 50 SampleSearch( organism = "Homo sapiens", sex = "female", tissue = "liver", age_min_years = 50, limit = 10 ) # HPV references use HPV16, HPV18, and related names # "papillomavirus" matches nothing hpv <- SampleSearch( tissue = "cervix", microbe = "HPV", sort = "cell_count", order = "desc", limit = 10 ) attr(hpv, "total") # filters built in code list(tissue = "cervix", microbe = "HPV") |> SampleSearch(limit = 10) # ontology term and subtypes SampleSearch(disease_ontology_id = "MONDO:0005061", limit = 10) # exact term SampleSearch( disease_ontology_id = "MONDO:0005061", include_descendants = FALSE, limit = 10 )
Groups the full seqout_search() match set by facet.
search_facets( query, ..., structured = FALSE, exclude_ontology = NULL, con = .con() ) SearchFacets( query, ..., structured = FALSE, exclude_ontology = NULL, con = .con() )search_facets( query, ..., structured = FALSE, exclude_ontology = NULL, con = .con() ) SearchFacets( query, ..., structured = FALSE, exclude_ontology = NULL, con = .con() )
query |
Character. The text to count the matches of. Required. |
... |
Filters, by name, to count within: |
structured |
Read |
exclude_ontology |
Ontologies to keep out of the query expansion. See
|
con |
A |
Values order by score, the summed match rank. score is 0 without a query.
A tibble of facet, value, count and score, with total and
max_rank attributes.
seqout_search() for the results themselves, search_suggest()
when a query returns nothing.
f <- SearchFacets("liver cancer") attr(f, "total") # organism facet f[f$facet == "organism", ] # count within a narrower set SearchFacets("liver cancer", organism = "Homo sapiens")f <- SearchFacets("liver cancer") attr(f, "total") # organism facet f[f$facet == "organism", ] # count within a narrower set SearchFacets("liver cancer", organism = "Homo sapiens")
Suggest spelling corrections for a query
search_suggest(query, con = .con()) SearchSuggest(query, con = .con())search_suggest(query, con = .con()) SearchSuggest(query, con = .con())
query |
Character. The query as it was typed. |
con |
A |
A tibble of suggestions, empty when the query needs no correction.
seqout_search(), and search_facets() for a query that matched
too much.
SearchSuggest("livre cancr") # already spelled correctly SearchSuggest("liver cancer")SearchSuggest("livre cancr") # already spelled correctly SearchSuggest("liver cancer")
Parquet closes its DuckDB handle; REST has no handle.
seqout_close(con = .con()) SeqoutClose(con = .con())seqout_close(con = .con()) SeqoutClose(con = .con())
con |
A |
NULL, invisibly. Called for its side effect.
Two backends are supported:
seqout_connect( backend = c("api", "parquet"), base_url = Sys.getenv("SEQOUT_BASE_URL", "https://seqout.org"), data_dir = NULL, read_only = FALSE, eager = FALSE, quiet = FALSE ) SeqoutConnect( backend = c("api", "parquet"), base_url = Sys.getenv("SEQOUT_BASE_URL", "https://seqout.org"), data_dir = NULL, read_only = FALSE, eager = FALSE, quiet = FALSE )seqout_connect( backend = c("api", "parquet"), base_url = Sys.getenv("SEQOUT_BASE_URL", "https://seqout.org"), data_dir = NULL, read_only = FALSE, eager = FALSE, quiet = FALSE ) SeqoutConnect( backend = c("api", "parquet"), base_url = Sys.getenv("SEQOUT_BASE_URL", "https://seqout.org"), data_dir = NULL, read_only = FALSE, eager = FALSE, quiet = FALSE )
backend |
|
base_url |
Seqout server URL. Defaults to |
data_dir |
Directory or URL holding the |
read_only |
Make the DuckDB connection read-only. The default is
|
eager |
Register every Parquet view at connection time. The |
quiet |
Do not show the message at the start. |
"api", the default, reads https://seqout.org with HTTP.
"parquet" reads the Parquet dump with DuckDB through httpfs. It
answers SQL and can read a local dump. Requires the duckdb package.
Select Parquet explicitly; one lookup can become a dump scan.
A seqout_connection object.
## Not run: # REST API default project("GSE297547") # Parquet for SQL and local dumps con <- SeqoutConnect("parquet") Query("SELECT * FROM geo_series LIMIT 5", con = con) SeqoutClose(con) # local dump con <- SeqoutConnect("parquet", data_dir = "~/seqout-dump") Query("SELECT count(*) FROM geo_series", con = con) SeqoutClose(con) ## End(Not run)## Not run: # REST API default project("GSE297547") # Parquet for SQL and local dumps con <- SeqoutConnect("parquet") Query("SELECT * FROM geo_series LIMIT 5", con = con) SeqoutClose(con) # local dump con <- SeqoutConnect("parquet", data_dir = "~/seqout-dump") Query("SELECT count(*) FROM geo_series", con = con) SeqoutClose(con) ## End(Not run)
Uses genevintage::correct_genenames() to resolve date-like gene names against
the chosen species and annotation. Tokens with multiple candidates or no
candidate are retained and reported. This cannot reconstruct every Excel
error or recover information lost through rounding.
seqout_correct_names( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE ) SeqoutCorrectNames( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE )seqout_correct_names( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE ) SeqoutCorrectNames( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE )
x |
A |
ids |
Gene names to repair, in matrix row order. Defaults to row names.
Pass |
species, release, assembly, source
|
Annotation choices passed to
genevintage. |
mapping |
Optional annotation table with |
quiet |
Suppress genevintage's progress messages and, with a supplied mapping, mapping warnings. |
Supply mapping, or both species and release; genevintage refuses
damaged input otherwise, since symbols alone cannot establish species or
annotation vintage. Choosing a release explicitly also distinguishes
historical names such as SEPT9 from SEPTIN9.
Only call this on gene labels: real dates and numeric identifiers can look
like Excel damage. Neither this function nor the matrix reader repairs
arbitrary spreadsheet cells.
See seqout_gene_names(). Status is "corrected", "ambiguous",
"unresolved", or "unchanged". The audit preserves damaged input tokens.
x <- matrix(1:4, nrow = 2, dimnames = list(c("9-Sep", "TP53"), c("s1", "s2")) ) mapping <- data.frame( id = c("ENSG00000184640", "ENSG00000141510"), name = c("SEPTIN9", "TP53"), chr = "17", biotype = "protein_coding" ) SeqoutCorrectNames(x, mapping = mapping)x <- matrix(1:4, nrow = 2, dimnames = list(c("9-Sep", "TP53"), c("s1", "s2")) ) mapping <- data.frame( id = c("ENSG00000184640", "ENSG00000141510"), name = c("SEPTIN9", "TP53"), chr = "17", biotype = "protein_coding" ) SeqoutCorrectNames(x, mapping = mapping)
Groups supplementary files into readable units without downloading them.
seqout_counts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) SeqoutCounts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) SeqoutListCounts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) seqout_list_counts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() )seqout_counts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) SeqoutCounts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) SeqoutListCounts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() ) seqout_list_counts( accession, assay = "rna", feature_type = NULL, cache_dir = NULL, con = .con() )
accession |
A GSE or GSM accession. |
assay |
Assay preference: |
feature_type |
10x feature class to keep, overriding the one implied by
|
cache_dir |
Where downloads land. Defaults to a per-accession directory
under
|
con |
A |
A unit is a 10x triplet, CellRanger .h5, .h5ad, .rds, tar, or table.
has_metadata means embedded metadata or a named sidecar was found.
preferred ranks requested assay, filtered output, then format.
10x feature class follows assay; feature_type overrides it.
A tibble, one row per readable unit.
## Not run: counts <- SeqoutListCounts("GSE297547") counts[, c("unit", "sample", "format", "preferred")] m <- SeqoutMatrix(counts, sample = "GSM8994520") "GSE297547" |> SeqoutListCounts() |> SeqoutMatrix(sample = "GSM8994520") ## End(Not run)## Not run: counts <- SeqoutListCounts("GSE297547") counts[, c("unit", "sample", "format", "preferred")] m <- SeqoutMatrix(counts, sample = "GSM8994520") "GSE297547" |> SeqoutListCounts() |> SeqoutMatrix(sample = "GSM8994520") ## End(Not run)
Download a unit's files without parsing them
seqout_counts_files(counts, sample = NULL) SeqoutCountsFiles(counts, sample = NULL)seqout_counts_files(counts, sample = NULL) SeqoutCountsFiles(counts, sample = NULL)
counts |
A |
sample |
A unit label or sample accession. |
The paths of the downloaded files.
Set the process-wide default connection
seqout_default(con) SeqoutDefault(con)seqout_default(con) SeqoutDefault(con)
con |
A |
The previous default, invisibly.
## Not run: SeqoutDefault(SeqoutConnect("parquet")) project("GSE297547") # now reads Parquet SeqoutDefault(NULL) # back to REST ## End(Not run)## Not run: SeqoutDefault(SeqoutConnect("parquet")) project("GSE297547") # now reads Parquet SeqoutDefault(NULL) # back to REST ## End(Not run)
A fragments file holds one bgzipped BED-like row per ATAC fragment, with
columns chrom, start, end, barcode and read_support.
seqout_fragments(counts, sample = NULL, download = FALSE) SeqoutFragments(counts, sample = NULL, download = FALSE)seqout_fragments(counts, sample = NULL, download = FALSE) SeqoutFragments(counts, sample = NULL, download = FALSE)
counts |
A |
sample |
Sample accessions to keep. |
download |
Fetch the files and report where they landed. |
Files download only when download = TRUE.
GEO rarely holds the .tbi index Signac wants. Build one after downloading
with Rsamtools::indexTabix(path, format = "bed").
That works on a CellRanger fragments file, which is bgzipped and sorted by
coordinate. Some deposits are neither: GSE184462 ships plain-gzipped files
sorted by barcode, and tabix rejects them with "Chromosome blocks not
continuous". Sort and recompress first:
sort -k1,1 -k2,2n, then Rsamtools::bgzip(), then indexTabix().
A tibble of sample, file, url, indexed and path. path is
NA until the file is downloaded.
seqout_counts() for the matrices, seqout_counts_files() for a
unit's own files.
## Not run: counts <- SeqoutListCounts("GSE156478") SeqoutFragments(counts) frags <- SeqoutFragments(counts, sample = "GSM5065524", download = TRUE) Rsamtools::indexTabix(frags$path[1], format = "bed") ## End(Not run)## Not run: counts <- SeqoutListCounts("GSE156478") SeqoutFragments(counts) frags <- SeqoutFragments(counts, sample = "GSM5065524", download = TRUE) Rsamtools::indexTabix(frags$path[1], format = "bed") ## End(Not run)
Uses genevintage::geneid2name() to detect species and rank compatible
annotation releases, or genevintage::gene_names() with a supplied mapping.
Detection is an estimate, especially for small or filtered gene sets. Pass
the known annotation explicitly when available. Unmapped IDs are retained.
seqout_gene_names( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE ) SeqoutGeneNames( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE )seqout_gene_names( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE ) SeqoutGeneNames( x, ids = NULL, species = NULL, release = NULL, assembly = NULL, source = NULL, mapping = NULL, quiet = FALSE )
x |
A |
ids |
Gene identifiers in row order. Defaults to the matrix row names;
may instead come from a feature annotation column such as |
species, release, assembly, source
|
Annotation choices passed to
genevintage. |
mapping |
Optional annotation table with |
quiet |
Suppress genevintage's progress messages and, with a supplied mapping, mapping warnings. |
The same kind of object with renamed rows. Counts, row order and
observation metadata are preserved. For a seqout_matrix, var row names
are updated together with X; original annotation columns are preserved.
An audit is appended to x$gene_annotation (or the gene_annotation
attribute of a plain matrix). Each entry records operation, annotation
and a features table with the original row, input token, resolved name,
unique output row name and status. Colliding row names get .1, .2, etc.;
the unsuffixed gene name remains in the audit. Rows are never aggregated.
seqout_correct_names(), genevintage::detect_release()
x <- matrix(1:4, nrow = 2, dimnames = list( c("ENSG00000141510.16", "ENSG00000012048.23"), c("s1", "s2") )) mapping <- data.frame( id = c("ENSG00000141510", "ENSG00000012048"), name = c("TP53", "BRCA1") ) SeqoutGeneNames(x, mapping = mapping)x <- matrix(1:4, nrow = 2, dimnames = list( c("ENSG00000141510.16", "ENSG00000012048.23"), c("s1", "s2") )) mapping <- data.frame( id = c("ENSG00000141510", "ENSG00000012048"), name = c("TP53", "BRCA1") ) SeqoutGeneNames(x, mapping = mapping)
Reads the audit seqout_gene_names() or seqout_correct_names() appended,
wherever it lives: x$gene_annotation for a seqout_matrix, the
gene_annotation attribute for a plain matrix.
seqout_gene_report(x, which = NULL) SeqoutGeneReport(x, which = NULL)seqout_gene_report(x, which = NULL) SeqoutGeneReport(x, which = NULL)
x |
A result of |
which |
Which audit, when |
The audit's features table: original, input, name,
row_name and status, one row per matrix row. The call's operation
and annotation are attached as attributes of the same names.
x <- matrix(1:4, nrow = 2, dimnames = list( c("ENSG00000141510.16", "ENSG00000012048.23"), c("s1", "s2") )) mapping <- data.frame( id = c("ENSG00000141510", "ENSG00000012048"), name = c("TP53", "BRCA1") ) x |> SeqoutGeneNames(mapping = mapping) |> SeqoutGeneReport()x <- matrix(1:4, nrow = 2, dimnames = list( c("ENSG00000141510.16", "ENSG00000012048.23"), c("s1", "s2") )) mapping <- data.frame( id = c("ENSG00000141510", "ENSG00000012048"), name = c("TP53", "BRCA1") ) x |> SeqoutGeneNames(mapping = mapping) |> SeqoutGeneReport()
Lazy fields fetch on first access and then cache their result.
seqout_get(accession, con = .con()) SeqoutGet(accession, con = .con())seqout_get(accession, con = .con()) SeqoutGet(accession, con = .con())
accession |
Any accession Seqout holds. |
con |
A |
The fields are:
metathe project record: title, summary, design, dates, files
samplesone record per sample
experimentsone record per library preparation
runsone record per sequencing run, with its file URLs
supplementaryone row per supplementary file, series and sample
alike; sample is NA on the ones the series carries itself
bamsthe alignment files a submitter sent, where there are any
pubsthe publications linked to the dataset
linksthe same data in other archives
enrichedthe harmonised data for the samples: the submitter's free text read into one vocabulary, with ontology IDs
detailthe record for a sample or run accession
A seqout_dataset object with lazy fields.
d <- SeqoutGet("GSE168652") d$meta$title nrow(d$samples) nrow(d$runs)d <- SeqoutGet("GSE168652") d$meta$title nrow(d$samples) nrow(d$runs)
Read one unit as a counts matrix
seqout_matrix(counts, sample = NULL) SeqoutMatrix(counts, sample = NULL)seqout_matrix(counts, sample = NULL) SeqoutMatrix(counts, sample = NULL)
counts |
A |
sample |
A unit label or sample accession. Required when the accession holds more than one unit. |
A seqout_matrix: a list with X (features by observations),
obs, var, kind, fmt and evidence.
Asks the REST root once per session with a short timeout, so scripts, examples and vignettes can skip cleanly while the service is down instead of failing on their first query.
seqout_online(con = .con()) SeqoutOnline(con = .con())seqout_online(con = .con()) SeqoutOnline(con = .con())
con |
A |
TRUE when the API answered, FALSE otherwise.
SeqoutOnline()SeqoutOnline()
X becomes counts; obs becomes colData; var becomes rowData.
A GSE or GSM accession is resolved through seqout_counts().
Requires SingleCellExperiment.
seqout_sce( x, assay_name = "counts", sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... ) Seqout2SCE( x, assay_name = "counts", sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... )seqout_sce( x, assay_name = "counts", sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... ) Seqout2SCE( x, assay_name = "counts", sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... )
x |
A |
assay_name |
Assay name. Defaults to |
sample |
Unit labels or sample accessions to read when |
max_cells |
Cap on cells kept per unit, sampled at random. |
multimodal |
Carry the other modalities as |
sample_metadata |
Join the study's sample record onto every cell, by the accession the cell came from. A column already in the cell metadata wins. |
... |
Passed to |
A SingleCellExperiment object.
seqout_seurat(), seqout_matrix() and matrices().
## Not run: sce <- Seqout2SCE("GSM8994520") sce <- Seqout2SCE("GSE297547", sample = "GSM8994520") counts <- SeqoutListCounts("GSE297547") sce <- Seqout2SCE(counts, sample = "GSM8994520") ## End(Not run)## Not run: sce <- Seqout2SCE("GSM8994520") sce <- Seqout2SCE("GSE297547", sample = "GSM8994520") counts <- SeqoutListCounts("GSE297547") sce <- Seqout2SCE(counts, sample = "GSM8994520") ## End(Not run)
Searches GEO, SRA, ArrayExpress, ENA, GSA, DRA and GEA together.
seqout_search( query = NULL, ..., sortby = NULL, order = "desc", limit = NULL, structured = FALSE, expand = TRUE, exclude_ontology = NULL, con = .con() ) SeqoutSearch( query = NULL, ..., sortby = NULL, order = "desc", limit = NULL, structured = FALSE, expand = TRUE, exclude_ontology = NULL, con = .con() )seqout_search( query = NULL, ..., sortby = NULL, order = "desc", limit = NULL, structured = FALSE, expand = TRUE, exclude_ontology = NULL, con = .con() ) SeqoutSearch( query = NULL, ..., sortby = NULL, order = "desc", limit = NULL, structured = FALSE, expand = TRUE, exclude_ontology = NULL, con = .con() )
query |
Character. The text to search for; optional if you give a filter. |
... |
The filters, by name, from the set above. |
sortby |
|
order |
|
limit |
Maximum rows. |
structured |
Read |
expand |
Expand terms with ontology synonyms. |
exclude_ontology |
Character vector. The ontologies to keep out of the
expansion, from |
con |
A |
A tibble of results, with a took_ms attribute.
sample_search() when the answer should be samples, and the
Search article for the filters and the costs.
SeqoutSearch("liver cancer scRNA", limit = 10) # filters combine freely SeqoutSearch("liver cancer", organism = "Homo sapiens", country = "Japan", limit = 10) # exact words SeqoutSearch("spinal muscular atrophy", expand = FALSE, limit = 10) ## Not run: # boolean syntax triggers structured parsing SeqoutSearch('("aging" OR "aged") (gut OR colon) immun*', limit = 10) # force structured parsing SeqoutSearch("liver cancer", structured = TRUE, limit = 10) # exclude ontology sources SeqoutSearch("spinal muscular atrophy", exclude_ontology = c("MeSH", "CVCL"), limit = 10) # rank or count a broad match set SeqoutSearch("liver cancer scRNA", db = "geo", sortby = "citations", limit = 10) SeqoutSearch(organism = "Mus musculus", assay_l1 = "Transcriptomic", limit = 10) # restrict to long-read (PacBio / Oxford Nanopore) studies SeqoutSearch("liver fibrosis", long_read = TRUE, limit = 10) # exact case: LINE retrotransposons, not "cell line" SeqoutSearch("LINE", case_sensitive = TRUE, limit = 10) ## End(Not run)SeqoutSearch("liver cancer scRNA", limit = 10) # filters combine freely SeqoutSearch("liver cancer", organism = "Homo sapiens", country = "Japan", limit = 10) # exact words SeqoutSearch("spinal muscular atrophy", expand = FALSE, limit = 10) ## Not run: # boolean syntax triggers structured parsing SeqoutSearch('("aging" OR "aged") (gut OR colon) immun*', limit = 10) # force structured parsing SeqoutSearch("liver cancer", structured = TRUE, limit = 10) # exclude ontology sources SeqoutSearch("spinal muscular atrophy", exclude_ontology = c("MeSH", "CVCL"), limit = 10) # rank or count a broad match set SeqoutSearch("liver cancer scRNA", db = "geo", sortby = "citations", limit = 10) SeqoutSearch(organism = "Mus musculus", assay_l1 = "Transcriptomic", limit = 10) # restrict to long-read (PacBio / Oxford Nanopore) studies SeqoutSearch("liver fibrosis", long_read = TRUE, limit = 10) # exact case: LINE retrotransposons, not "cell line" SeqoutSearch("LINE", case_sensitive = TRUE, limit = 10) ## End(Not run)
X becomes counts and obs becomes meta.data.
A GSE or GSM accession is resolved through seqout_counts().
Requires SeuratObject.
seqout_seurat( x, sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... ) Seqout2Seurat( x, sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... )seqout_seurat( x, sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... ) Seqout2Seurat( x, sample = NULL, max_cells = NULL, multimodal = TRUE, sample_metadata = FALSE, ... )
x |
A |
sample |
Unit labels or sample accessions to read when |
max_cells |
Cap on cells kept per unit, sampled at random. |
multimodal |
Build one object per modality found, as extra assays.
|
sample_metadata |
Join the study's sample record onto every cell, by the accession the cell came from. A column already in the cell metadata wins. |
... |
Passed to |
A Seurat object.
seqout_matrix() and matrices().
## Not run: obj <- Seqout2Seurat("GSM8994520", min.cells = 3) obj <- Seqout2Seurat("GSE297547", sample = "GSM8994520") counts <- SeqoutListCounts("GSE297547") obj <- Seqout2Seurat(counts, sample = "GSM8994520") ## End(Not run)## Not run: obj <- Seqout2Seurat("GSM8994520", min.cells = 3) obj <- Seqout2Seurat("GSE297547", sample = "GSM8994520") counts <- SeqoutListCounts("GSE297547") obj <- Seqout2Seurat(counts, sample = "GSM8994520") ## End(Not run)
Species is inferred from Ensembl-like row identifiers with genevintage, then
sex-chromosome markers are obtained from the same annotation registry used by
SexSeek. The returned table contains the dual-evidence coordinates
(y_percent and x_percent) used by seqout_sex_plot().
seqout_sex( x, sample = NULL, species = NULL, model = "ratio", symbol_index = NULL, ... ) SeqoutSex( x, sample = NULL, species = NULL, model = "ratio", symbol_index = NULL, ... )seqout_sex( x, sample = NULL, species = NULL, model = "ratio", symbol_index = NULL, ... ) SeqoutSex( x, sample = NULL, species = NULL, model = "ratio", symbol_index = NULL, ... )
x |
A |
sample |
Unit/sample to read when |
species |
Optional species override. Usually unnecessary for Ensembl IDs. |
model |
Model passed to |
symbol_index |
Optional genevintage symbol index for standalone symbol matrices. |
... |
Other arguments passed to |
A data frame of per-unit calls with inferred species and evidence coordinates.
Plot dual sex-chromosome evidence
seqout_sex_plot(x) SeqoutSexPlot(x)seqout_sex_plot(x) SeqoutSexPlot(x)
x |
A result from |
A ggplot object.
The readable units behind a counts table
seqout_units(counts, preferred_only = TRUE) SeqoutUnits(counts, preferred_only = TRUE)seqout_units(counts, preferred_only = TRUE) SeqoutUnits(counts, preferred_only = TRUE)
counts |
A |
preferred_only |
Return only the preferred unit per sample. |
A list of units.
data selects on the kind column, which says what a study carries:
single_cell_studies( con = .con(), min_evidence = 1, data = c("any", "matrix", "fastq", "both"), limit = NULL, offset = 0 ) SingleCellStudies( con = .con(), min_evidence = 1, data = c("any", "matrix", "fastq", "both"), limit = NULL, offset = 0 )single_cell_studies( con = .con(), min_evidence = 1, data = c("any", "matrix", "fastq", "both"), limit = NULL, offset = 0 ) SingleCellStudies( con = .con(), min_evidence = 1, data = c("any", "matrix", "fastq", "both"), limit = NULL, offset = 0 )
con |
A |
min_evidence |
Minimum independent measurements, 1 to 3. |
data |
What the study must carry:
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
matrix_and_readscounts and reads, both confirmed
matrix_reads_unscannedcounts plus linked FASTQ no read-derived call has confirmed yet
matrix_onlycounts, no linked reads
reads_onlyno parsed matrix
"any" includes reads-only studies and warns when rows lack matrices.
reads_only means Pentimento parsed no matrix. GEO supplementary files
may contain a matrix readable by seqout_counts().
A study tibble, one row per study.
# unrestricted, with matrix warning sc <- SingleCellStudies(limit = 100) # parsed matrices SingleCellStudies(data = "matrix", limit = 100) # linked reads SingleCellStudies(data = "fastq", limit = 100)# unrestricted, with matrix warning sc <- SingleCellStudies(limit = 100) # parsed matrices SingleCellStudies(data = "matrix", limit = 100) # linked reads SingleCellStudies(data = "fastq", limit = 100)
Study counts per chemistry, organism, tissue, modality, assay category, year, and has_matrix/has_fastq/is_long_read status.
singlecell_facets(con = .con()) SingleCellFacets(con = .con())singlecell_facets(con = .con()) SingleCellFacets(con = .con())
con |
A |
A tibble with facet, value and studies columns.
f <- SingleCellFacets() f[f$facet == "chemistry", ]f <- SingleCellFacets() f[f$facet == "chemistry", ]
One row per study with matrix or read-derived single-cell evidence, or a
declared single-cell classification: modality, chemistries (read-derived
barcode chemistry), cell_or_nucleus (read-derived from intron fraction /
mito %, independent of chemistry; NA when never scanned or ambiguous),
tissues, organisms, sample count, matrix availability, FASTQ/.sra
availability, and whether the study also has long-read sequencing.
singlecell_projects( chemistry = NULL, organism = NULL, tissue = NULL, cell_or_nucleus = NULL, perturbation_method = NULL, intervention_kind = NULL, modality = NULL, assay_l1 = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_sra = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) SingleCellProjects( chemistry = NULL, organism = NULL, tissue = NULL, cell_or_nucleus = NULL, perturbation_method = NULL, intervention_kind = NULL, modality = NULL, assay_l1 = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_sra = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )singlecell_projects( chemistry = NULL, organism = NULL, tissue = NULL, cell_or_nucleus = NULL, perturbation_method = NULL, intervention_kind = NULL, modality = NULL, assay_l1 = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_sra = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) SingleCellProjects( chemistry = NULL, organism = NULL, tissue = NULL, cell_or_nucleus = NULL, perturbation_method = NULL, intervention_kind = NULL, modality = NULL, assay_l1 = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, has_sra = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )
chemistry, organism, tissue, cell_or_nucleus, perturbation_method, intervention_kind, modality, assay_l1
|
Character. Filter to one value from |
year |
Integer. Publication year. |
has_matrix, has_fastq, has_sra, is_long_read
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
sort |
One of |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
con |
A |
perturbation_method is a named method (Perturb-seq, CROP-seq,
ECCITE-seq, Mosaic-seq, sci-Plex, CRISPR-detect) mentioned in the study's
title or description, not a confirmed design; NA means none was
detected. intervention_kind (genetic/chemical) and is_pooled follow
from which method matched. Filter values come from singlecell_facets().
A study tibble, with a total attribute for the filtered count
before limit cut it.
singlecell_summary(), singlecell_facets().
SingleCellProjects(tissue = "liver", has_matrix = TRUE, limit = 100)SingleCellProjects(tissue = "liver", has_matrix = TRUE, limit = 100)
Totals for studies with matrix or read-derived single-cell evidence, or a
declared single-cell classification; the population
singlecell_projects() lists. cells excludes studies whose only matrix
is unfiltered (raw 10x barcodes, not real cells).
singlecell_summary(con = .con()) SingleCellSummary(con = .con())singlecell_summary(con = .con()) SingleCellSummary(con = .con())
con |
A |
A one-row tibble of totals.
singlecell_facets() for the filter values, singlecell_projects()
for the studies themselves.
SingleCellSummary()SingleCellSummary()
Study counts per platform, resolution, data availability, organism, tissue, readout assay, cell line, sample type and year. Each facet holds its top 100 values.
spatial_facets(con = .con()) SpatialFacets(con = .con())spatial_facets(con = .con()) SpatialFacets(con = .con())
con |
A |
A tibble with facet, value and studies columns.
f <- SpatialFacets() f[f$facet == "platform", ]f <- SpatialFacets() f[f$facet == "platform", ]
One row per study the modality classifier flags "Spatial Transcriptomics". The platform is named by regex over the study's own text (Visium, Xenium, MERFISH, CosMx, Slide-seq, Slide-seqV2, Curio Seeker, Stereo-seq, GeoMx DSP, DBiT-seq, STARmap, osmFISH, HDST, Tomo-seq, Pixel-seq, Molecular Cartography).
spatial_projects( platform = NULL, resolution = NULL, technology = NULL, data_availability = NULL, organism = NULL, tissue = NULL, readout_assay = NULL, cell_line = NULL, sample_type = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) SpatialProjects( platform = NULL, resolution = NULL, technology = NULL, data_availability = NULL, organism = NULL, tissue = NULL, readout_assay = NULL, cell_line = NULL, sample_type = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )spatial_projects( platform = NULL, resolution = NULL, technology = NULL, data_availability = NULL, organism = NULL, tissue = NULL, readout_assay = NULL, cell_line = NULL, sample_type = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() ) SpatialProjects( platform = NULL, resolution = NULL, technology = NULL, data_availability = NULL, organism = NULL, tissue = NULL, readout_assay = NULL, cell_line = NULL, sample_type = NULL, year = NULL, has_matrix = NULL, has_fastq = NULL, is_long_read = NULL, q = NULL, sort = "year", order = "desc", limit = NULL, offset = 0, con = .con() )
platform |
Character. One value from |
resolution |
One of |
technology |
One of |
data_availability |
One of |
organism, tissue, readout_assay, cell_line, sample_type
|
Character. Filter to one value from |
year |
Integer. Publication year. |
has_matrix, has_fastq, is_long_read
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
sort |
One of |
order |
|
limit |
Maximum studies; |
offset |
Number of studies to skip. |
con |
A |
platforms is empty when the text never names a platform. A named
platform is a text mention: a comparison paper can name one it did not run.
resolution groups platforms into "single-cell" (Xenium, MERFISH,
CosMx, seqFISH, STARmap, osmFISH, Molecular Cartography), "spot"
(coarser than single-cell: Visium, Slide-seq, Curio Seeker, Stereo-seq,
DBiT-seq, HDST, Tomo-seq, Pixel-seq) or "roi" (GeoMx DSP,
region-of-interest, not single-cell resolution despite reaching this
population). technology is "imaging", "sequencing" or "hybrid"
(GeoMx DSP: optical ROI selection, sequencing/nCounter readout); it
currently tracks resolution one-to-one but is stored separately. A study
naming platforms from two groups (e.g. a GeoMx-vs-Xenium
comparison) collapses both columns to whichever group is checked first
(single-cell/imaging, then spot/sequencing, then roi/hybrid);
platforms still lists every name found. data_availability is
"both", "matrix_only", "fastq_only" or "neither", from
has_matrix and has_fastq. Filter values come from spatial_facets().
A study tibble, with a total attribute for the filtered count
before limit cut it.
spatial_summary(), spatial_facets(),
seqout_counts() to read the matrices of a study with has_matrix.
# Xenium studies in human SpatialProjects(platform = "Xenium", organism = "Homo sapiens", limit = 10) # single-cell-resolution spatial studies with both a matrix and FASTQ SpatialProjects( resolution = "single-cell", data_availability = "both", limit = 10 )# Xenium studies in human SpatialProjects(platform = "Xenium", organism = "Homo sapiens", limit = 10) # single-cell-resolution spatial studies with both a matrix and FASTQ SpatialProjects( resolution = "single-cell", data_availability = "both", limit = 10 )
Totals for studies flagged single-cell modality "Spatial Transcriptomics",
the same population spatial_projects() lists. studies_named_platform
counts studies whose own text names a specific platform (Visium, Xenium,
MERFISH, ...); the rest only say "spatial transcriptomics" generically.
spatial_summary(con = .con()) SpatialSummary(con = .con())spatial_summary(con = .con()) SpatialSummary(con = .con())
con |
A |
A one-row tibble of totals.
spatial_facets() for the filter values,
spatial_projects() for the studies themselves.
SpatialSummary()SpatialSummary()
Batches project lookup.
summaries(accessions, con = .con()) Summaries(accessions, con = .con())summaries(accessions, con = .con()) Summaries(accessions, con = .con())
accessions |
A character vector of project accessions. |
con |
A |
A tibble, one row per project.
Summaries(c("GSE168652", "GSE100379"))Summaries(c("GSE168652", "GSE100379"))
Only GEO, ArrayExpress and DDBJ GEA projects expose this endpoint. Each row's
gene_corruption is NULL when the file has not been scanned yet for Excel's
gene-symbol-to-date autocorrupt bug (e.g. "SEPT1" -> "1-Sep"). NULL means
no data, not a clean result.
supplementary_files(accession, con = .con()) SupplementaryFiles(accession, con = .con())supplementary_files(accession, con = .con()) SupplementaryFiles(accession, con = .con())
accession |
A GEO (GSE), ArrayExpress (E-) or DDBJ GEA (E-GEAD-) accession. |
con |
A |
A tibble with one row per supplementary file: accession, source,
url, filename, path, download_command, and gene_corruption (a
list-column, each element NULL or a list with n_hits, kinds,
examples, checked_at).
supplementary_files("GSE139368")supplementary_files("GSE139368")
registered is FALSE until a remote view is created in DuckDB.
tables(con = .con()) Tables(con = .con())tables(con = .con()) Tables(con = .con())
con |
A Parquet |
A tibble with table_name, table_type and registered columns.
Study counts per organism, assay category, archive, journal, submitter
country, year, and FASTQ/single-cell/long-read status for studies matching
term.
tissue_facets(term, con = .con()) TissueFacets(term, con = .con())tissue_facets(term, con = .con()) TissueFacets(term, con = .con())
term |
Character. A tissue name or UBERON term, e.g. |
con |
A |
A tibble with facet, value and studies columns.
f <- TissueFacets("liver") f[f$facet == "organism", ]f <- TissueFacets("liver") f[f$facet == "organism", ]
One row per study with a sample annotated with a tissue matching term.
has_fastq/has_sra are NA when the study is absent from the
download-links table (unknown, not unavailable); filtering on them
accepts only TRUE for that reason. n_samples_with_tissue counts every
sample the study has any resolved tissue for; tissue_summary()'s
matched_samples counts only the ones matching term.
tissue_projects( term, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, sort = "pub_date", order = "desc", limit = NULL, con = .con() ) TissueProjects( term, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, sort = "pub_date", order = "desc", limit = NULL, con = .con() )tissue_projects( term, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, sort = "pub_date", order = "desc", limit = NULL, con = .con() ) TissueProjects( term, organism = NULL, assay_l1 = NULL, source = NULL, has_fastq = NULL, has_sra = NULL, is_single_cell = NULL, is_long_read = NULL, q = NULL, sort = "pub_date", order = "desc", limit = NULL, con = .con() )
term |
Character. A tissue name or UBERON term, e.g. |
organism, assay_l1, source
|
Character. Filter to one value from
|
has_fastq, has_sra, is_single_cell, is_long_read
|
Logical filters. |
q |
Character. Case-insensitive substring match on title or study_accession. |
sort |
One of |
order |
|
limit |
Maximum studies; |
con |
A |
A study tibble, with a total attribute for the filtered count
before limit cut it.
Pages by cursor internally, as seqout_search()'s sortby pagination
does. There is no offset argument; limit caps the rows returned.
tissue_summary(), tissue_facets().
TissueProjects("liver", organism = "Homo sapiens", limit = 100)TissueProjects("liver", organism = "Homo sapiens", limit = 100)
term is resolved as free text against the full UBERON ontology and
expanded to its descendants ("blood" also reaches "whole blood",
"peripheral blood mononuclear cell", ...). resolution says whether it
matched an UBERON label exactly or only as a substring; matched_labels
lists what actually matched. matched_samples counts only samples
resolved to one of the matched ids; samples is the matching studies'
total sample count across all annotations.
tissue_summary(term, con = .con()) TissueSummary(term, con = .con())tissue_summary(term, con = .con()) TissueSummary(term, con = .con())
term |
Character. A tissue name or UBERON term, e.g. |
con |
A |
A term with no match 404s.
A one-row tibble of totals.
tissue_facets() for the filter values, tissue_projects() for
the studies themselves.
TissueSummary("liver")TissueSummary("liver")