From e2babb154d17af0192a5dff235389aa69f4000eb Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Sun, 24 Sep 2023 12:05:45 -0400
Subject: [PATCH 01/22] Remove data_to_zarr stuff
---
.BBSoptions | 1 -
DESCRIPTION | 23 +--
NAMESPACE | 22 --
R/basilisk.R | 28 ---
R/config.R | 2 +
R/data_to_zarr.R | 274 -------------------------
R/mock_objects.R | 105 ----------
configure | 3 -
configure.win | 3 -
index.md | 2 +-
man/VitessceConfig-cash-from_list.Rd | 6 +-
man/VitessceConfig-cash-from_object.Rd | 6 +-
man/get_giotto_obj.Rd | 18 --
man/get_sce_obj.Rd | 18 --
man/get_seurat_obj.Rd | 18 --
man/get_spe_obj.Rd | 18 --
man/giotto_to_anndata_zarr.Rd | 26 ---
man/py_env.Rd | 19 --
man/sce_to_anndata_zarr.Rd | 24 ---
man/seurat_to_anndata_zarr.Rd | 26 ---
man/spe_to_anndata_zarr.Rd | 20 --
man/spe_to_ome_zarr.Rd | 28 ---
tools/check.env | 47 -----
23 files changed, 11 insertions(+), 726 deletions(-)
delete mode 100644 .BBSoptions
delete mode 100644 R/basilisk.R
delete mode 100644 R/data_to_zarr.R
delete mode 100644 R/mock_objects.R
delete mode 100755 configure
delete mode 100755 configure.win
delete mode 100644 man/get_giotto_obj.Rd
delete mode 100644 man/get_sce_obj.Rd
delete mode 100644 man/get_seurat_obj.Rd
delete mode 100644 man/get_spe_obj.Rd
delete mode 100644 man/giotto_to_anndata_zarr.Rd
delete mode 100644 man/py_env.Rd
delete mode 100644 man/sce_to_anndata_zarr.Rd
delete mode 100644 man/seurat_to_anndata_zarr.Rd
delete mode 100644 man/spe_to_anndata_zarr.Rd
delete mode 100644 man/spe_to_ome_zarr.Rd
delete mode 100644 tools/check.env
diff --git a/.BBSoptions b/.BBSoptions
deleted file mode 100644
index 7a13ab8..0000000
--- a/.BBSoptions
+++ /dev/null
@@ -1 +0,0 @@
-UnsupportedPlatforms: win32
diff --git a/DESCRIPTION b/DESCRIPTION
index d8f7cb7..cc11bb2 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -14,11 +14,10 @@ Authors@R: c(
Description:
R API and htmlwidget facilitating interactive visualization
of spatial single-cell data with Vitessce. The R API contains
- classes and functions for loading single-cell data stored as
- SingleCellExperiment, SpatialExperiment, and Seurat objects.
- The htmlwidget is a wrapper around the Vitessce JavaScript
- library and can be used in the Viewer tab of RStudio or Shiny
- apps.
+ classes and functions for loading single-cell data stored in
+ compatible on-disk formats. The htmlwidget is a wrapper around
+ the Vitessce JavaScript library and can be used in the Viewer tab
+ of RStudio or Shiny apps.
biocViews: SingleCell, Spatial, Visualization, ShinyApps
License: MIT + file LICENSE
BugReports: https://github.com/vitessce/vitessceR/issues
@@ -40,18 +39,11 @@ Imports:
future,
httpuv,
stringr,
- reticulate,
- varhandle,
tools,
stats,
methods,
S4Vectors,
- grDevices,
- basilisk,
- zellkonverter,
- SummarizedExperiment,
- SingleCellExperiment,
- SpatialExperiment
+ grDevices
Suggests:
testthat,
knitr,
@@ -60,7 +52,4 @@ Suggests:
pkgdown,
rmarkdown,
purrr,
- rjson,
- Seurat,
- SeuratDisk,
- Giotto
+ rjson
diff --git a/NAMESPACE b/NAMESPACE
index 709fe20..300b1bb 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -12,33 +12,11 @@ export(SCEWrapper)
export(SPEWrapper)
export(SeuratWrapper)
export(VitessceConfig)
-export(get_giotto_obj)
-export(get_sce_obj)
-export(get_seurat_obj)
-export(get_spe_obj)
-export(giotto_to_anndata_zarr)
export(hconcat)
export(obj_list)
export(render_vitessce)
-export(sce_to_anndata_zarr)
-export(seurat_to_anndata_zarr)
-export(spe_to_anndata_zarr)
-export(spe_to_ome_zarr)
export(vconcat)
export(vitessce_output)
export(vitessce_widget)
import(R6)
import(plumber)
-importFrom(SingleCellExperiment,"reducedDims<-")
-importFrom(SingleCellExperiment,int_colData)
-importFrom(SingleCellExperiment,reducedDims)
-importFrom(SpatialExperiment,"colData<-")
-importFrom(SpatialExperiment,getImg)
-importFrom(SummarizedExperiment,colData)
-importFrom(grDevices,as.raster)
-importFrom(grDevices,col2rgb)
-importFrom(methods,new)
-importFrom(methods,slot)
-importFrom(stats,rnorm)
-importFrom(stats,rpois)
-importFrom(stats,runif)
diff --git a/R/basilisk.R b/R/basilisk.R
deleted file mode 100644
index a704283..0000000
--- a/R/basilisk.R
+++ /dev/null
@@ -1,28 +0,0 @@
-#' The Python environment
-#'
-#' Defines a conda environment via Basilisk, which is used
-#' to convert R objects to Zarr stores.
-#' This environment has been adapted from zellkonverter::.AnnDataDependencies.
-#' Reference: https://bioconductor.org/packages/release/bioc/vignettes/basilisk/inst/doc/motivation.html
-#'
-#' @keywords internal
-py_env <- basilisk::BasiliskEnvironment(
- envname="vitessce_basilisk_env",
- pkgname="vitessceR",
- packages=c(
- "numpy==1.*",
- "pandas==1.*",
- "anndata==0.7.*",
- "h5py==3.*",
- "hdf5==1.*",
- "natsort==7.*",
- "packaging==20.*",
- "scipy==1.*",
- "sqlite==3.*",
- "zarr==2.*",
- "numcodecs==0.*"
- ),
- pip=c(
- "ome-zarr==0.2.1"
- )
-)
diff --git a/R/config.R b/R/config.R
index 5757edd..67a76d9 100644
--- a/R/config.R
+++ b/R/config.R
@@ -665,6 +665,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @name VitessceConfig$from_list
#' @title Create a new Vitessce Config from a list
+#' @description
#'
#' A helper function to construct a new `VitessceConfig` object based on an existing config in a list format.
#'
@@ -703,6 +704,7 @@ VitessceConfig$from_list <- function(config) {
#' @name VitessceConfig$from_object
#' @title Create a new Vitessce Config from a data object
+#' @description
#'
#' A helper function to construct a new `VitessceConfig` object based on an object containing single-cell or imaging data.
#'
diff --git a/R/data_to_zarr.R b/R/data_to_zarr.R
deleted file mode 100644
index 1e89a40..0000000
--- a/R/data_to_zarr.R
+++ /dev/null
@@ -1,274 +0,0 @@
-
-#' Save a Seurat object to an AnnData-Zarr store.
-#'
-#' @keywords internal
-#' @param seurat_obj The object to save.
-#' @param out_path A path to the output Zarr store.
-#' @param assay The name of the assay to save.
-#' @return TRUE if the conversion succeeds.
-#'
-#' @export
-#' @examples
-#' obj <- get_seurat_obj()
-#' seurat_to_anndata_zarr(obj, out_path = "data/seurat.zarr", assay = "RNA")
-seurat_to_anndata_zarr <- function(seurat_obj, out_path, assay) {
- if(!requireNamespace("SeuratDisk", quietly = TRUE)) {
- stop("Install 'SeuratDisk' to enable conversion of Seurat objects to AnnData objects.")
- }
-
- h5seurat_path <- paste0(out_path, ".h5Seurat")
- h5ad_path <- paste0(out_path, ".h5ad")
-
- # Convert factor columns to string/numeric.
- seurat_obj@meta.data <- varhandle::unfactor(seurat_obj@meta.data)
-
- SeuratDisk::SaveH5Seurat(seurat_obj, filename = h5seurat_path, overwrite = TRUE)
- SeuratDisk::Convert(h5seurat_path, dest = "h5ad", overwrite = TRUE, assay = assay)
-
- # Use basilisk
- proc <- basilisk::basiliskStart(py_env)
- on.exit(basilisk::basiliskStop(proc))
-
- success <- basilisk::basiliskRun(proc, function(h5ad_path, out_path) {
- anndata <- reticulate::import("anndata")
- zarr <- reticulate::import("zarr")
-
- adata <- anndata$read_h5ad(h5ad_path)
-
- cleanup_colnames <- function(df) {
- # Reference: https://github.com/theislab/scvelo/issues/255#issuecomment-739995301
- new_colnames <- colnames(df)
- new_colnames[new_colnames == "_index"] <- "features"
- return(new_colnames)
- }
-
- noop <- function(cond) { }
-
- tryCatch({
- colnames(adata$var) <- cleanup_colnames(adata$var)
- }, error = noop)
-
- # Reconstruct, omitting raw and uns.
- adata <- anndata$AnnData(
- X = adata$X,
- obs = as.data.frame(adata$obs),
- var = as.data.frame(adata$var),
- obsm = adata$obsm,
- varm = adata$varm
- )
-
- adata$write_zarr(out_path)
-
- return(TRUE)
- }, h5ad_path = h5ad_path, out_path = out_path)
- return(success)
-}
-
-#' Save a SingleCellExperiment to an AnnData-Zarr store.
-#'
-#' @keywords internal
-#' @param sce_obj The object to save.
-#' @param out_path A path to the output Zarr store.
-#' @return TRUE if the conversion succeeds.
-#'
-#' @export
-#' @examples
-#' obj <- get_sce_obj()
-#' sce_to_anndata_zarr(obj, out_path = "data/sce.zarr")
-#' @importFrom SingleCellExperiment reducedDims reducedDims<-
-sce_to_anndata_zarr <- function(sce_obj, out_path) {
- obsm_keys <- names(as.list(reducedDims(sce_obj)))
- for(obsm_key in obsm_keys) {
- # If there are column names, then the obsm element will be stored as a data.frame,
- # but Vitessce can only handle array obsm, so we need to remove any column names.
- # Reference: https://github.com/theislab/zellkonverter/blob/e1e95b1/R/SCE2AnnData.R#L159
- colnames(reducedDims(sce_obj)[[obsm_key]]) <- NULL
- }
-
- # Use basilisk
- proc <- basilisk::basiliskStart(py_env)
- on.exit(basilisk::basiliskStop(proc))
-
- success <- basilisk::basiliskRun(proc, function(sce_obj, out_path) {
- anndata <- reticulate::import("anndata")
- zarr <- reticulate::import("zarr")
-
- adata <- zellkonverter::SCE2AnnData(sce_obj)
- adata$write_zarr(out_path)
- return(TRUE)
- }, sce_obj = sce_obj, out_path = out_path)
- return(success)
-}
-
-#' Save a SpatialExperiment to an AnnData-Zarr store.
-#'
-#' @keywords internal
-#' @param spe_obj The object to save.
-#' @param out_path A path to the output Zarr store.
-#' @return TRUE if the conversion succeeds.
-#'
-#' @export
-#' @importFrom SummarizedExperiment colData
-#' @importFrom SingleCellExperiment int_colData
-#' @importFrom SpatialExperiment colData<-
-spe_to_anndata_zarr <- function(spe_obj, out_path) {
- internal_col_data <- int_colData(spe_obj)
-
- colData(spe_obj) <- cbind(
- colData(spe_obj),
- internal_col_data$spatialCoords,
- # spatialData deprecated in 1.5.2
- # internal_col_data$spatialData,
- internal_col_data$reducedDims
- )
-
- success <- sce_to_anndata_zarr(spe_obj, out_path)
- return(success)
-}
-
-#' Save an image in a SpatialExperiment to an OME-Zarr store
-#'
-#' @keywords internal
-#' @param spe_obj The object containing the image.
-#' @param sample_id The sample_id in the imgData data frame.
-#' @param image_id The image_id in the imgData data frame.
-#' @param out_path A path to the output Zarr store.
-#' @return TRUE if the conversion succeeds.
-#'
-#' @export
-#' @examples
-#' obj <- get_spe_obj()
-#' spe_to_ome_zarr(obj, "sample1", "image1", "data/spe_image.zarr")
-#' @importFrom SpatialExperiment getImg
-#' @importFrom grDevices as.raster col2rgb
-spe_to_ome_zarr <- function(spe_obj, sample_id, image_id, out_path) {
- img_arr <- apply(as.matrix(as.raster(getImg(spe_obj, image_id = image_id, sample_id = sample_id))), c(1, 2), col2rgb)
-
- # Use basilisk
- proc <- basilisk::basiliskStart(py_env)
- on.exit(basilisk::basiliskStop(proc))
-
- success <- basilisk::basiliskRun(proc, function(img_arr, sample_id, image_id, out_path) {
- zarr <- reticulate::import("zarr")
- ome_zarr <- reticulate::import("ome_zarr")
-
- z_root <- zarr$open_group(out_path, mode = "w")
-
- # Need to copy this here since can't refer to functions in the outside environment.
- obj_list <- function(...) {
- retval <- stats::setNames(list(), character(0))
- param_list <- list(...)
- for(key in names(param_list)) {
- retval[[key]] = param_list[[key]]
- }
- retval
- }
-
- default_window <- obj_list(
- start = 0,
- min = 0,
- max = 255,
- end = 255
- )
-
- ome_zarr$writer$write_image(
- image = img_arr,
- group = z_root,
- axes = "cyx",
- omero = obj_list(
- name = image_id,
- version = "0.3",
- rdefs = obj_list(
-
- ),
- channels = list(
- obj_list(
- label = "r",
- color = "FF0000",
- window = default_window
- ),
- obj_list(
- label = "g",
- color = "00FF00",
- window = default_window
- ),
- obj_list(
- label = "b",
- color = "0000FF",
- window = default_window
- )
- )
- )
- )
- return(TRUE)
- }, img_arr = img_arr, sample_id = sample_id, image_id = image_id, out_path = out_path)
- return(success)
-}
-
-#' Save a Giotto object to an AnnData-Zarr store
-#'
-#' @keywords internal
-#' @param giotto_obj The object to save.
-#' @param out_path A path to the output Zarr store.
-#' @param X_slot The name of the slot in the Giotto object to use for adata.X
-#' @return TRUE if the conversion succeeds.
-#'
-#' @export
-#' @examples
-#' obj <- get_giotto_obj()
-#' giotto_to_anndata_zarr(obj, "data/giotto.zarr")
-#' @importFrom methods slot
-giotto_to_anndata_zarr <- function(giotto_obj, out_path, X_slot = "raw_exprs") {
-
- # Use basilisk
- proc <- basilisk::basiliskStart(py_env)
- on.exit(basilisk::basiliskStop(proc))
-
- success <- basilisk::basiliskRun(proc, function(giotto_obj, out_path, X_slot) {
- anndata <- reticulate::import("anndata")
- zarr <- reticulate::import("zarr")
-
- # Reference: https://github.com/theislab/zellkonverter/blob/master/R/SCE2AnnData.R#L237
- make_numpy_friendly <- function(x, transpose = TRUE) {
- if (transpose) {
- x <- Matrix::t(x)
- }
- if (DelayedArray::is_sparse(x)) {
- methods::as(x, "dgCMatrix")
- } else {
- as.matrix(x)
- }
- }
-
- X <- make_numpy_friendly(slot(giotto_obj, X_slot))
- obs <- slot(giotto_obj, "cell_metadata")
- var <- slot(giotto_obj, "gene_metadata")
-
- adata <- anndata$AnnData(X = X, obs = obs, var = var)
-
- obsm <- list()
-
- if(!is.null(slot(giotto_obj, "spatial_locs"))) {
- spatial_locs <- slot(giotto_obj, "spatial_locs")
- obsm[['spatial']] <- t(as.matrix(spatial_locs[, c("sdimx", "sdimy")]))
- }
-
- if(!is.null(slot(giotto_obj, "dimension_reduction"))) {
- dim_reducs <- slot(giotto_obj, "dimension_reduction")$cells
- for(dim_reduc_name in names(dim_reducs)) {
- dim_reduc_coords <- dim_reducs[[dim_reduc_name]][[dim_reduc_name]]$coordinates
- obsm[[dim_reduc_name]] <- t(as.matrix(dim_reduc_coords))
- }
- }
-
- if(length(obsm) > 0) {
- # TODO make_numpy_friendly is outside scope
- obsm <- lapply(obsm, make_numpy_friendly)
- adata$obsm <- obsm
- }
-
- adata$write_zarr(out_path)
- return(TRUE)
- }, giotto_obj = giotto_obj, out_path = out_path, X_slot = X_slot)
- return(success)
-}
diff --git a/R/mock_objects.R b/R/mock_objects.R
deleted file mode 100644
index 866435c..0000000
--- a/R/mock_objects.R
+++ /dev/null
@@ -1,105 +0,0 @@
-#' Create a mock Seurat object for tests and examples.
-#' @return The object.
-#' @keywords internal
-#' @export
-#' @examples
-#' obj <- get_seurat_obj()
-#' @importFrom stats rpois
-get_seurat_obj <- function() {
- if(!requireNamespace("Seurat", quietly = TRUE)) {
- stop("Install 'Seurat' to enable creation of Seurat objects.")
- }
-
- ncells <- 100
- u <- matrix(rpois(20000, 5), ncol=ncells)
- cell_names <- paste0("Cell", seq_len(ncells))
- rownames(u) <- paste0("Gene", seq_len(nrow(u)))
- colnames(u) <- cell_names
- metadata.test <- data.frame(
- cluster_id = c(rep(1, 50), rep(2, 50))
- )
- rownames(metadata.test) <- cell_names
-
- obj <- Seurat::CreateSeuratObject(
- counts = u,
- project = "TESTING",
- assay = "RNA",
- names.field = 2,
- names.delim = "-",
- meta.data = metadata.test
- )
-
- return(obj)
-}
-
-#' Create a mock SCE object for tests and examples.
-#' @return The object.
-#' @keywords internal
-#' @export
-#' @examples
-#' obj <- get_sce_obj()
-get_sce_obj <- function() {
- ncells <- 100
- u <- matrix(rpois(20000, 5), ncol=ncells)
- v <- matrix(rnorm(20000), ncol=ncells)
- obj <- SingleCellExperiment::SingleCellExperiment(assays=list(counts=u, logcounts=v))
- rownames(obj) <- paste0("Gene", seq_len(nrow(v)))
- colnames(obj) <- paste0("Cell", seq_len(ncells))
- return(obj)
-}
-
-#' Create a mock SPE object for tests and examples.
-#' @return The object.
-#' @keywords internal
-#' @export
-#' @examples
-#' obj <- get_spe_obj()
-#' @importFrom methods new
-#' @importFrom stats rnorm rpois runif
-get_spe_obj <- function() {
-
- # Reference: https://github.com/drighelli/SpatialExperiment/blob/cbf6515/tests/testthat/test_SpatialImage-methods.R#L26
- n <- 10 # number of rows / height
- m <- 20 # number of columns / width
- N <- 3 # number of images in SpE
- .mockRaster <- function(n, m) {
- x <- runif(n*m)
- y <- matrix(x, n, m)
- as.raster(y)
- }
- .mockSPI <- function(n, m) {
- r <- .mockRaster(n, m)
- new("LoadedSpatialImage", image=r)
- }
- l <- replicate(N, .mockSPI(n, m))
- sample_id <- paste0("sample", seq_len(N))
- image_id <- paste0("image", seq_len(N))
-
- u <- matrix(rpois(3*100, 5), ncol=N)
- v <- matrix(rnorm(3*100), ncol=N)
-
- cd <- S4Vectors::DataFrame(sample_id)
- df <- S4Vectors::DataFrame(sample_id, image_id, data=I(l), scaleFactor=seq_len(N))
- obj <- SpatialExperiment::SpatialExperiment(assays=list(counts=u, logcounts=v), colData=cd, imgData=df)
- return(obj)
-}
-
-#' Create a mock Giotto object for tests and examples.
-#' @return The object.
-#' @keywords internal
-#' @export
-#' @examples
-#' obj <- get_giotto_obj()
-get_giotto_obj <- function() {
-
- if(!requireNamespace("Giotto", quietly = TRUE)) {
- stop("Install 'Giotto' to enable creation of Giotto objects.")
- }
-
- expr_path <- system.file("extdata", "giotto", "visium_DG_expr.txt", package = "vitessceR")
- loc_path <- system.file("extdata", "giotto", "visium_DG_locs.txt", package = "vitessceR")
-
- obj <- Giotto::createGiottoObject(raw_exprs = expr_path, spatial_locs = loc_path)
-
- return(obj)
-}
diff --git a/configure b/configure
deleted file mode 100755
index 9b03c32..0000000
--- a/configure
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-${R_HOME}/bin/Rscript -e "basilisk::configureBasiliskEnv()"
diff --git a/configure.win b/configure.win
deleted file mode 100755
index e9af497..0000000
--- a/configure.win
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe -e "basilisk::configureBasiliskEnv()"
diff --git a/index.md b/index.md
index dae4f1f..ad3aa92 100644
--- a/index.md
+++ b/index.md
@@ -15,7 +15,7 @@ The ``vitessceR`` package includes:
* **Data preparation**
- * Use our data conversion wrapper classes to process data stored in common single-cell file types including Seurat objects.
+ * Use data conversion functions from the `vitessceAnalysisR` package to process data stored in common single-cell data structures including Seurat objects.
## Installation
diff --git a/man/VitessceConfig-cash-from_list.Rd b/man/VitessceConfig-cash-from_list.Rd
index 75589fe..5946f84 100644
--- a/man/VitessceConfig-cash-from_list.Rd
+++ b/man/VitessceConfig-cash-from_list.Rd
@@ -2,9 +2,7 @@
% Please edit documentation in R/config.R
\name{VitessceConfig$from_list}
\alias{VitessceConfig$from_list}
-\title{Create a new Vitessce Config from a list
-
-A helper function to construct a new \code{VitessceConfig} object based on an existing config in a list format.}
+\title{Create a new Vitessce Config from a list}
\arguments{
\item{config}{A list containing a valid config.}
}
@@ -12,7 +10,5 @@ A helper function to construct a new \code{VitessceConfig} object based on an ex
A \code{VitessceConfig} object reflecting the list-based configuration values.
}
\description{
-Create a new Vitessce Config from a list
-
A helper function to construct a new \code{VitessceConfig} object based on an existing config in a list format.
}
diff --git a/man/VitessceConfig-cash-from_object.Rd b/man/VitessceConfig-cash-from_object.Rd
index 442bd91..af64808 100644
--- a/man/VitessceConfig-cash-from_object.Rd
+++ b/man/VitessceConfig-cash-from_object.Rd
@@ -2,9 +2,7 @@
% Please edit documentation in R/config.R
\name{VitessceConfig$from_object}
\alias{VitessceConfig$from_object}
-\title{Create a new Vitessce Config from a data object
-
-A helper function to construct a new \code{VitessceConfig} object based on an object containing single-cell or imaging data.}
+\title{Create a new Vitessce Config from a data object}
\arguments{
\item{obj}{An object from which to construct a config. Can be a SingleCellExperiment or Seurat object.}
@@ -16,7 +14,5 @@ A helper function to construct a new \code{VitessceConfig} object based on an ob
A \code{VitessceConfig} object containing the object as a member of the datasets list, with some automatically-configured views.
}
\description{
-Create a new Vitessce Config from a data object
-
A helper function to construct a new \code{VitessceConfig} object based on an object containing single-cell or imaging data.
}
diff --git a/man/get_giotto_obj.Rd b/man/get_giotto_obj.Rd
deleted file mode 100644
index 659fa4a..0000000
--- a/man/get_giotto_obj.Rd
+++ /dev/null
@@ -1,18 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mock_objects.R
-\name{get_giotto_obj}
-\alias{get_giotto_obj}
-\title{Create a mock Giotto object for tests and examples.}
-\usage{
-get_giotto_obj()
-}
-\value{
-The object.
-}
-\description{
-Create a mock Giotto object for tests and examples.
-}
-\examples{
-obj <- get_giotto_obj()
-}
-\keyword{internal}
diff --git a/man/get_sce_obj.Rd b/man/get_sce_obj.Rd
deleted file mode 100644
index 4cc3c4c..0000000
--- a/man/get_sce_obj.Rd
+++ /dev/null
@@ -1,18 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mock_objects.R
-\name{get_sce_obj}
-\alias{get_sce_obj}
-\title{Create a mock SCE object for tests and examples.}
-\usage{
-get_sce_obj()
-}
-\value{
-The object.
-}
-\description{
-Create a mock SCE object for tests and examples.
-}
-\examples{
-obj <- get_sce_obj()
-}
-\keyword{internal}
diff --git a/man/get_seurat_obj.Rd b/man/get_seurat_obj.Rd
deleted file mode 100644
index 23a00fc..0000000
--- a/man/get_seurat_obj.Rd
+++ /dev/null
@@ -1,18 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mock_objects.R
-\name{get_seurat_obj}
-\alias{get_seurat_obj}
-\title{Create a mock Seurat object for tests and examples.}
-\usage{
-get_seurat_obj()
-}
-\value{
-The object.
-}
-\description{
-Create a mock Seurat object for tests and examples.
-}
-\examples{
-obj <- get_seurat_obj()
-}
-\keyword{internal}
diff --git a/man/get_spe_obj.Rd b/man/get_spe_obj.Rd
deleted file mode 100644
index 960567c..0000000
--- a/man/get_spe_obj.Rd
+++ /dev/null
@@ -1,18 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mock_objects.R
-\name{get_spe_obj}
-\alias{get_spe_obj}
-\title{Create a mock SPE object for tests and examples.}
-\usage{
-get_spe_obj()
-}
-\value{
-The object.
-}
-\description{
-Create a mock SPE object for tests and examples.
-}
-\examples{
-obj <- get_spe_obj()
-}
-\keyword{internal}
diff --git a/man/giotto_to_anndata_zarr.Rd b/man/giotto_to_anndata_zarr.Rd
deleted file mode 100644
index 50eea05..0000000
--- a/man/giotto_to_anndata_zarr.Rd
+++ /dev/null
@@ -1,26 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/data_to_zarr.R
-\name{giotto_to_anndata_zarr}
-\alias{giotto_to_anndata_zarr}
-\title{Save a Giotto object to an AnnData-Zarr store}
-\usage{
-giotto_to_anndata_zarr(giotto_obj, out_path, X_slot = "raw_exprs")
-}
-\arguments{
-\item{giotto_obj}{The object to save.}
-
-\item{out_path}{A path to the output Zarr store.}
-
-\item{X_slot}{The name of the slot in the Giotto object to use for adata.X}
-}
-\value{
-TRUE if the conversion succeeds.
-}
-\description{
-Save a Giotto object to an AnnData-Zarr store
-}
-\examples{
-obj <- get_giotto_obj()
-giotto_to_anndata_zarr(obj, "data/giotto.zarr")
-}
-\keyword{internal}
diff --git a/man/py_env.Rd b/man/py_env.Rd
deleted file mode 100644
index dbebd2b..0000000
--- a/man/py_env.Rd
+++ /dev/null
@@ -1,19 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/basilisk.R
-\docType{data}
-\name{py_env}
-\alias{py_env}
-\title{The Python environment}
-\format{
-An object of class \code{BasiliskEnvironment} of length 1.
-}
-\usage{
-py_env
-}
-\description{
-Defines a conda environment via Basilisk, which is used
-to convert R objects to Zarr stores.
-This environment has been adapted from zellkonverter::.AnnDataDependencies.
-Reference: https://bioconductor.org/packages/release/bioc/vignettes/basilisk/inst/doc/motivation.html
-}
-\keyword{internal}
diff --git a/man/sce_to_anndata_zarr.Rd b/man/sce_to_anndata_zarr.Rd
deleted file mode 100644
index f5f9555..0000000
--- a/man/sce_to_anndata_zarr.Rd
+++ /dev/null
@@ -1,24 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/data_to_zarr.R
-\name{sce_to_anndata_zarr}
-\alias{sce_to_anndata_zarr}
-\title{Save a SingleCellExperiment to an AnnData-Zarr store.}
-\usage{
-sce_to_anndata_zarr(sce_obj, out_path)
-}
-\arguments{
-\item{sce_obj}{The object to save.}
-
-\item{out_path}{A path to the output Zarr store.}
-}
-\value{
-TRUE if the conversion succeeds.
-}
-\description{
-Save a SingleCellExperiment to an AnnData-Zarr store.
-}
-\examples{
-obj <- get_sce_obj()
-sce_to_anndata_zarr(obj, out_path = "data/sce.zarr")
-}
-\keyword{internal}
diff --git a/man/seurat_to_anndata_zarr.Rd b/man/seurat_to_anndata_zarr.Rd
deleted file mode 100644
index 847441d..0000000
--- a/man/seurat_to_anndata_zarr.Rd
+++ /dev/null
@@ -1,26 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/data_to_zarr.R
-\name{seurat_to_anndata_zarr}
-\alias{seurat_to_anndata_zarr}
-\title{Save a Seurat object to an AnnData-Zarr store.}
-\usage{
-seurat_to_anndata_zarr(seurat_obj, out_path, assay)
-}
-\arguments{
-\item{seurat_obj}{The object to save.}
-
-\item{out_path}{A path to the output Zarr store.}
-
-\item{assay}{The name of the assay to save.}
-}
-\value{
-TRUE if the conversion succeeds.
-}
-\description{
-Save a Seurat object to an AnnData-Zarr store.
-}
-\examples{
-obj <- get_seurat_obj()
-seurat_to_anndata_zarr(obj, out_path = "data/seurat.zarr", assay = "RNA")
-}
-\keyword{internal}
diff --git a/man/spe_to_anndata_zarr.Rd b/man/spe_to_anndata_zarr.Rd
deleted file mode 100644
index 4cc1b88..0000000
--- a/man/spe_to_anndata_zarr.Rd
+++ /dev/null
@@ -1,20 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/data_to_zarr.R
-\name{spe_to_anndata_zarr}
-\alias{spe_to_anndata_zarr}
-\title{Save a SpatialExperiment to an AnnData-Zarr store.}
-\usage{
-spe_to_anndata_zarr(spe_obj, out_path)
-}
-\arguments{
-\item{spe_obj}{The object to save.}
-
-\item{out_path}{A path to the output Zarr store.}
-}
-\value{
-TRUE if the conversion succeeds.
-}
-\description{
-Save a SpatialExperiment to an AnnData-Zarr store.
-}
-\keyword{internal}
diff --git a/man/spe_to_ome_zarr.Rd b/man/spe_to_ome_zarr.Rd
deleted file mode 100644
index 4711b72..0000000
--- a/man/spe_to_ome_zarr.Rd
+++ /dev/null
@@ -1,28 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/data_to_zarr.R
-\name{spe_to_ome_zarr}
-\alias{spe_to_ome_zarr}
-\title{Save an image in a SpatialExperiment to an OME-Zarr store}
-\usage{
-spe_to_ome_zarr(spe_obj, sample_id, image_id, out_path)
-}
-\arguments{
-\item{spe_obj}{The object containing the image.}
-
-\item{sample_id}{The sample_id in the imgData data frame.}
-
-\item{image_id}{The image_id in the imgData data frame.}
-
-\item{out_path}{A path to the output Zarr store.}
-}
-\value{
-TRUE if the conversion succeeds.
-}
-\description{
-Save an image in a SpatialExperiment to an OME-Zarr store
-}
-\examples{
-obj <- get_spe_obj()
-spe_to_ome_zarr(obj, "sample1", "image1", "data/spe_image.zarr")
-}
-\keyword{internal}
diff --git a/tools/check.env b/tools/check.env
deleted file mode 100644
index fd9ef01..0000000
--- a/tools/check.env
+++ /dev/null
@@ -1,47 +0,0 @@
-# Reference: https://cran.r-project.org/doc/manuals/r-devel/R-ints.html#Tools
-
-# Report if package size is larger than 25 megabytes
-_R_CHECK_PKG_SIZES_THRESHOLD_=25
-
-# If true, give an error if suggested packages are not available.
-_R_CHECK_FORCE_SUGGESTS_=FALSE
-
-# Reference: https://github.com/Bioconductor/packagebuilder/blob/master/check.Renviron
-#_R_CHECK_FORCE_SUGGESTS_=TRUE
-_R_CHECK_RD_LINE_WIDTHS_=TRUE
-_R_CHECK_EXECUTABLES_=FALSE
-_R_CHECK_EXECUTABLES_EXCLUSIONS_=FALSE
-_R_CHECK_FF_DUP_=TRUE
-_R_CHECK_VC_DIR_=TRUE
-_R_CHECK_PKG_SIZES_=TRUE
-#_R_CHECK_PKG_SIZES_THRESHOLD_=5
-_R_CHECK_REPLACING_IMPORTS_=TRUE
-_R_CHECK_TIMINGS_="0"
-_R_CHECK_INSTALL_DEPENDS_=TRUE
-_R_CHECK_SUGGESTS_ONLY_=TRUE
-_R_CHECK_NO_RECOMMENDED_=TRUE
-_R_CHECK_CODE_ASSIGN_TO_GLOBALENV_=TRUE
-_R_CHECK_CODE_ATTACH_=TRUE
-_R_CHECK_CODE_DATA_INTO_GLOBALENV_=TRUE
-_R_CHECK_DOT_FIRSTLIB_=TRUE
-_R_CHECK_DEPRECATED_DEFUNCT_=TRUE
-_R_CHECK_TOPLEVELFILES_=TRUE
-_R_CHECK_LIMIT_CORES_=TRUE
-_R_CHECK_CODE_USAGE_VIA_NAMESPACES_=TRUE
-_R_CHECK_S3_METHODS_NOT_REGISTERED_=TRUE
-_R_CHECK_OVERWRITE_REGISTERED_S3_METHODS_=TRUE
-_R_S3_METHOD_LOOKUP_BASEENV_AFTER_GLOBALENV_=TRUE
-_R_CHECK_TESTS_NLINES_=20
-_R_CHECK_NATIVE_ROUTINE_REGISTRATION_=TRUE
-_R_CHECK_NO_STOP_ON_TEST_ERROR_=TRUE
-_R_CHECK_PRAGMAS_=TRUE
-_R_CHECK_COMPILATION_FLAGS_=TRUE
-_R_CHECK_R_DEPENDS_="warn"
-_R_CHECK_SERIALIZATION_=TRUE
-_R_CHECK_R_ON_PATH_=TRUE
-_R_CHECK_PACKAGES_USED_IN_TESTS_USE_SUBDIRS_=TRUE
-_R_CHECK_SHLIB_OPENMP_FLAGS_=TRUE
-_R_CHECK_CONNECTIONS_LEFT_OPEN_=TRUE
-_R_CHECK_FUTURE_FILE_TIMESTAMPS_=TRUE
-_R_CHECK_LENGTH_1_CONDITION_ =package:_R_CHECK_PACKAGE_NAME_
-_R_CHECK_LENGTH_1_LOGIC2_=package:_R_CHECK_PACKAGE_NAME_
From 116c5c9bd88cea96fd4f786eaed86553a44f89e4 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Sun, 24 Sep 2023 16:13:47 -0400
Subject: [PATCH 02/22] Update AbstractWrapper class
---
R/wrappers.R | 53 +++++++++++++++++++++++++++++++++-
tests/testthat/test-wrappers.R | 18 ++++++++++++
2 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/R/wrappers.R b/R/wrappers.R
index 8647e24..0f9c0d1 100644
--- a/R/wrappers.R
+++ b/R/wrappers.R
@@ -1,3 +1,23 @@
+
+
+make_unique_filename <- function(file_ext) {
+ return(paste0("some_uuid", file_ext))
+}
+
+
+file_path_to_url_path <- function(local_path, prepend_slash = TRUE) {
+ if(grepl("\\", local_path, fixed = TRUE)) {
+ segments <- stringr::str_split(local_path, "\\\\")[[1]]
+ url_path <- paste(segments, collapse = "/")
+ } else {
+ url_path <- local_path
+ }
+ if(prepend_slash && substr(url_path, 1, 1) != "/") {
+ url_path <- paste0("/", url_path)
+ }
+ return(url_path)
+}
+
#' Abstract dataset object wrapper class
#' @title AbstractWrapper Class
#' @docType class
@@ -23,6 +43,9 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
#' @field file_def_creators A list of file definition creator functions.
#' @keywords internal
file_def_creators = NULL,
+ #' @field base_dir The base directory for local data.
+ #' @keywords internal
+ base_dir = NULL,
#' @description
#' Create an abstract wrapper around a data object.
#' @param out_dir The directory for processed output files.
@@ -38,6 +61,7 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
self$use_cache <- use_cache
self$routes <- list()
self$file_def_creators <- list()
+ self$base_dir <- NA
},
#' @description
#' Fill in the file_def_creators array.
@@ -47,8 +71,10 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
#'
#' @param dataset_uid A unique identifier for this dataset.
#' @param obj_i Within the dataset, the index of this data wrapper object.
- convert_and_save = function(dataset_uid, obj_i) {
+ #' @param base_dir Path to a base directory.
+ convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
dir.create(self$get_out_dir(dataset_uid, obj_i), recursive = TRUE, showWarnings = FALSE)
+ self$base_dir <- base_dir
},
#' @description
#' Obtain the routes that have been created for this wrapper class.
@@ -85,6 +111,28 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
)
return(route)
},
+ get_local_dir_url = function(base_url, dataset_uid, obj_i, local_dir_path, local_dir_uid) {
+ if(!self$is_remote && !is.na(self$base_dir)) {
+ return(self$get_url_simple(base_url, file_path_to_url_path(local_dir_path, prepend_slash = FALSE)))
+ }
+ return(self$get_url(base_url, dataset_uid, obj_i, local_dir_uid))
+ },
+ get_local_dir_route = function(dataset_uid, obj_i, local_dir_path, local_dir_uid) {
+ if(!self$is_remote) {
+ if(is.na(self$base_dir)) {
+ route_path <- self$get_route_str(dataset_uid, obj_i, local_dir_uid)
+ } else {
+ route_path <- file_path_to_url_path(local_dir_path)
+ local_dir_path <- file.path(self$base_dir, local_dir_path)
+ }
+ route <- VitessceConfigServerStaticRoute$new(
+ route_path,
+ local_dir_path
+ )
+ return(list(route))
+ }
+ return(list())
+ },
#' @description
#' Create a local web server URL for a dataset object.
#' @param base_url The base URL on which the web server is serving.
@@ -96,6 +144,9 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
retval <- paste0(base_url, self$get_route_str(dataset_uid, obj_i, ...))
return(retval)
},
+ get_url_simple = function(base_url, suffix) {
+ return(paste0(base_url, "/", suffix))
+ },
#' @description
#' Create a string representing a web server route path (the part following the base URL).
#' @param dataset_uid The ID for this dataset.
diff --git a/tests/testthat/test-wrappers.R b/tests/testthat/test-wrappers.R
index 49b4216..2435755 100644
--- a/tests/testthat/test-wrappers.R
+++ b/tests/testthat/test-wrappers.R
@@ -28,3 +28,21 @@ test_that("AbstractWrapper get_out_dir", {
out_dir <- w$get_out_dir("A", 1, "cells")
expect_equal(out_dir, "test/A/1/cells")
})
+
+test_that("file_path_to_url_path", {
+ posix_with_slash <- file_path_to_url_path("tests/data/test.snap.mtx")
+ expect_equal(posix_with_slash, "/tests/data/test.snap.mtx")
+
+ posix_without_slash <- file_path_to_url_path("tests/data/test.snap.mtx", prepend_slash = FALSE)
+ expect_equal(posix_without_slash, "tests/data/test.snap.mtx")
+
+ windows_with_slash <- file_path_to_url_path("tests\\data\\test.snap.mtx")
+ expect_equal(windows_with_slash, "/tests/data/test.snap.mtx")
+
+ # TODO: do we need to support this?
+ # posix_with_dot_and_slash <- file_path_to_url_path("./tests/data/test.snap.mtx")
+ # expect_equal(posix_with_dot_and_slash, "/tests/data/test.snap.mtx")
+
+ # posix_with_dot_without_slash <- file_path_to_url_path("./tests/data/test.snap.mtx", prepend_slash = FALSE)
+ # expect_equal(posix_with_dot_without_slash, "tests/data/test.snap.mtx")
+})
From 2144ac4cd8909e2c6a9acd0d349b48c01d32b4c7 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Sun, 24 Sep 2023 19:07:25 -0400
Subject: [PATCH 03/22] OmeTiffWrapper update
---
DESCRIPTION | 3 +-
R/wrappers.R | 2 +-
R/wrappers_images.R | 76 +++++++++++++++++++++-------------
tests/testthat/test-wrappers.R | 25 +++++++++++
4 files changed, 75 insertions(+), 31 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index cc11bb2..9230152 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -43,7 +43,8 @@ Imports:
stats,
methods,
S4Vectors,
- grDevices
+ grDevices,
+ uuid
Suggests:
testthat,
knitr,
diff --git a/R/wrappers.R b/R/wrappers.R
index 0f9c0d1..9ba190e 100644
--- a/R/wrappers.R
+++ b/R/wrappers.R
@@ -1,7 +1,7 @@
make_unique_filename <- function(file_ext) {
- return(paste0("some_uuid", file_ext))
+ return(paste0(uuid::UUIDgenerate(output = "string"), file_ext))
}
diff --git a/R/wrappers_images.R b/R/wrappers_images.R
index 31b7a2e..cc6b886 100644
--- a/R/wrappers_images.R
+++ b/R/wrappers_images.R
@@ -118,6 +118,9 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
#' @field is_remote Whether or not this image is remote.
#' @keywords internal
is_remote = NULL,
+ #' @field local_img_uid
+ #' @keywords internal
+ local_img_uid = NULL,
#' @description
#' Create a wrapper around multiple image objects.
#' @param img_path A local filepath to an OME-TIFF file.
@@ -137,6 +140,8 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
self$transformation_matrix <- transformation_matrix
self$is_bitmask <- is_bitmask
+ self$local_img_uid <- make_unique_filename(".ome.tif")
+
if(!is.na(img_url) && !is.na(img_path)) {
warning("Expected either img_path or img_url to be provided, but not both.")
}
@@ -147,9 +152,9 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
#' Create the web server routes and file definition creators.
#' @param dataset_uid The ID for this dataset.
#' @param obj_i The index of this data object within the dataset.
- convert_and_save = function(dataset_uid, obj_i) {
+ convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
if(!self$is_remote) {
- super$convert_and_save(dataset_uid, obj_i)
+ super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
}
# Get the file definition creator functions.
@@ -169,11 +174,18 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
if(self$is_remote) {
return(list())
} else {
- route <- VitessceConfigServerRangeRoute$new(
- self$get_route_str(dataset_uid, obj_i, basename(self$img_path)),
- self$img_path
- )
- return(list(route))
+ if(is.na(self$base_dir)) {
+ local_img_path <- self$img_path
+ local_img_route_path <- self$get_route_str(dataset_uid, obj_i, self$local_img_uid)
+ } else {
+ local_img_path <- file.path(self$base_dir, self$img_path)
+ local_img_route_path <- file_path_to_url_path(self$img_path)
+ }
+ route <- VitessceConfigServerRangeRoute$new(
+ local_img_route_path,
+ local_img_path
+ )
+ return(list(route))
}
},
#' @description
@@ -184,27 +196,8 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
#' @return A list that can be converted to JSON.
#' @keywords internal
make_image_def = function(dataset_uid, obj_i, base_url) {
- img_url <- NA
- if(self$is_remote) {
- img_url <- self$img_url
- } else {
- img_url <- self$get_url(base_url, dataset_uid, obj_i, basename(self$img_path))
- }
-
- img_def <- list(
- name = self$name,
- type = "ome-tiff",
- url = img_url
- )
- metadata <- obj_list()
- if(!is.na(self$transformation_matrix)) {
- metadata[['transform']] = list(
- matrix = self$transformation_matrix
- )
- }
- metadata[['isBitmask']] = self$is_bitmask
- img_def[['metadata']] = metadata
- img_def
+ img_url <- self$get_img_url(base_url, dataset_uid, obj_i)
+ return(self$create_image_json(img_url))
},
#' @description
#' Make the file definition creator function for the raster data type.
@@ -220,13 +213,38 @@ OmeTiffWrapper <- R6::R6Class("OmeTiffWrapper",
)
)
file_def <- list(
- type = DataType$RASTER,
fileType = FileType$RASTER_JSON,
options = options_def
)
return(file_def)
}
return(get_raster)
+ },
+ create_image_json = function(img_url, offsets_url = NA) {
+ metadata <- obj_list()
+ img_def <- list(
+ name = self$name,
+ type = "ome-tiff",
+ url = img_url
+ )
+ # TODO: offsets_url
+ if(!is.na(self$transformation_matrix)) {
+ metadata[['transform']] = list(
+ matrix = self$transformation_matrix
+ )
+ }
+ metadata[['isBitmask']] = self$is_bitmask
+ img_def[['metadata']] = metadata
+ img_def
+ },
+ get_img_url = function(base_url = "", dataset_uid = "", obj_i = "") {
+ if(self$is_remote) {
+ return(self$img_url)
+ }
+ if(!is.na(self$base_dir)) {
+ return(self$get_url_simple(base_url, file_path_to_url_path(self$img_path, prepend_slash = FALSE)))
+ }
+ return(self$get_url(base_url, dataset_uid, obj_i, self$local_img_uid))
}
),
)
diff --git a/tests/testthat/test-wrappers.R b/tests/testthat/test-wrappers.R
index 2435755..1531aae 100644
--- a/tests/testthat/test-wrappers.R
+++ b/tests/testthat/test-wrappers.R
@@ -46,3 +46,28 @@ test_that("file_path_to_url_path", {
# posix_with_dot_without_slash <- file_path_to_url_path("./tests/data/test.snap.mtx", prepend_slash = FALSE)
# expect_equal(posix_with_dot_without_slash, "tests/data/test.snap.mtx")
})
+
+test_that("OmeTiffWrapper", {
+ w <- OmeTiffWrapper$new(img_path = "tests/data/test.ome.tiff", name = "Test")
+ w$local_img_uid <- "test.ome.tiff"
+
+ file_def_creator <- w$make_raster_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ expect_equal(file_def, list(
+ fileType = "raster.json",
+ options = list(
+ schemaVersion = "0.0.2",
+ images = list(
+ obj_list(
+ name = "Test",
+ type = "ome-tiff",
+ url = "http://localhost:8000/A/0/test.ome.tiff",
+ metadata = list(
+ isBitmask = FALSE
+ )
+ )
+ )
+ )
+ ))
+})
\ No newline at end of file
From 6669ff53f6850c7d8d7f78868ff29b2395261d4c Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Wed, 27 Sep 2023 15:18:43 -0400
Subject: [PATCH 04/22] Add file def properties
---
R/config.R | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/R/config.R b/R/config.R
index 67a76d9..f46d11e 100644
--- a/R/config.R
+++ b/R/config.R
@@ -61,16 +61,18 @@ VitessceConfigDatasetFile <- R6::R6Class("VitessceConfigDatasetFile",
#' @param file_type A file type for the file.
#' @param options A list of options to include for the file.
#' @return A new `VitessceConfigDatasetFile` object.
- initialize = function(url = NA, data_type = NA, file_type = NA, options = NA) {
+ initialize = function(url = NA, data_type = NA, file_type = NA, options = NA, coordination_values = NA) {
private$file <- obj_list()
+ private$file[['fileType']] = file_type
if(!is_na(url)) {
private$file[['url']] = url
}
- private$file[['type']] = data_type
- private$file[['fileType']] = file_type
if(!is_na(options)) {
private$file[['options']] = options
}
+ if(!is_na(coordination_values)) {
+ private$file[['coordinationValues']] = coordination_values
+ }
},
#' @description
#' Convert the object to an R list. Helpful when converting the config to JSON.
From b877fdfa9dd9b06d79a472c866ea100dae9ce646 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Wed, 27 Sep 2023 15:24:36 -0400
Subject: [PATCH 05/22] VitessceConfigDataset updates
---
R/config.R | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/R/config.R b/R/config.R
index f46d11e..1e2f8f2 100644
--- a/R/config.R
+++ b/R/config.R
@@ -61,7 +61,7 @@ VitessceConfigDatasetFile <- R6::R6Class("VitessceConfigDatasetFile",
#' @param file_type A file type for the file.
#' @param options A list of options to include for the file.
#' @return A new `VitessceConfigDatasetFile` object.
- initialize = function(url = NA, data_type = NA, file_type = NA, options = NA, coordination_values = NA) {
+ initialize = function(url = NA, file_type = NA, options = NA, coordination_values = NA, data_type = NA) {
private$file <- obj_list()
private$file[['fileType']] = file_type
if(!is_na(url)) {
@@ -97,18 +97,27 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
public = list(
#' @field dataset The dataset as a list.
dataset = NULL,
+ #' @field base_dir The base directory for the config.
+ base_dir = NULL,
#' @description
#' Create a new dataset object.
#' @param uid A unique identifier string for the dataset.
#' @param name A name for the dataset
#' @return A new `VitessceConfigDataset` object.
- initialize = function(uid, name) {
+ initialize = function(uid, name, base_dir = NA) {
self$dataset <- list(
uid = uid,
name = name,
files = list()
)
private$objs <- list()
+ self$base_dir <- base_dir
+ },
+ get_name = function() {
+ return(self$dataset[['name']])
+ },
+ get_uid = function() {
+ return(self$dataset[['uid']])
},
#' @description
#' Add a file to this dataset.
@@ -125,8 +134,8 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
#' data_type = DataType$CELLS,
#' file_type = FileType$CELLS_JSON
#' )
- add_file = function(url = NA, data_type = NA, file_type = NA, options = NA) {
- new_file <- VitessceConfigDatasetFile$new(url = url, data_type = data_type, file_type = file_type, options = options)
+ add_file = function(url = NA, file_type = NA, options = NA, coordination_values = NA, data_type = NA) {
+ new_file <- VitessceConfigDatasetFile$new(url = url, file_type = file_type, options = options, coordination_values = coordination_values)
self$dataset$files <- append(self$dataset$files, new_file)
invisible(self)
},
@@ -135,7 +144,7 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
#' @param obj The data object to add.
#' @return Invisible self, to allow chaining.
add_object = function(obj) {
- obj$convert_and_save(self$dataset$uid, length(private$objs))
+ obj$convert_and_save(self$dataset$uid, length(private$objs), base_dir = self$base_dir)
private$objs <- append(private$objs, obj)
invisible(self)
},
@@ -174,7 +183,7 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
retval <- self$dataset
retval$files <- obj_file_defs
- retval
+ return(retval)
}
)
)
From b94dd9260ba53baaf77196453364373f1d87926b Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Wed, 27 Sep 2023 15:46:39 -0400
Subject: [PATCH 06/22] CL, MetaCoordinationScope
---
R/config.R | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--
R/constants.R | 2 ++
2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/R/config.R b/R/config.R
index 1e2f8f2..24a95fe 100644
--- a/R/config.R
+++ b/R/config.R
@@ -188,6 +188,30 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
)
)
+CoordinationLevel <- R6::R6Class("CoordinationLevel",
+ public = list(
+ value = NULL,
+ cached_value = NULL,
+ initialize = function(value) {
+ self$value <- value
+ self$cached_value <- NA
+ },
+ set_cached = function(processed_level) {
+ self$cached_value <- processed_level
+ },
+ get_cached = function() {
+ return(self$cached_value)
+ },
+ is_cached = function() {
+ return(!is.na(self$cached_value))
+ }
+ )
+)
+
+CL <- function(value) {
+ return(CoordinationLevel$new(value))
+}
+
#' Coordination scope in a VitessceConfig
#' @title VitessceConfigCoordinationScope Class
#' @docType class
@@ -208,10 +232,10 @@ VitessceConfigCoordinationScope <- R6::R6Class("VitessceConfigCoordinationScope"
#' @param c_type A coordination type name.
#' @param c_scope A coordination scope name.
#' @return A new `VitessceConfigCoordinationScope` object.
- initialize = function(c_type, c_scope) {
+ initialize = function(c_type, c_scope, c_value = NA) {
self$c_type <- c_type
self$c_scope <- c_scope
- self$c_value <- NA
+ self$c_value <- c_value
},
#' @description
#' Set the coordination value of this coordination scope object.
@@ -236,6 +260,35 @@ VitessceConfigCoordinationScope <- R6::R6Class("VitessceConfigCoordinationScope"
)
)
+VitessceConfigMetaCoordinationScope <- R6::R6Class("VitessceConfigMetaCoordinationScope",
+ public = list(
+ #' @field meta_scope The name of the coordination scope for metaCoordinationScopes.
+ meta_scope = NULL,
+ #' @field meta_by_scope The name of the coordination scope for metaCoordinationScopesBy.
+ meta_by_scope = NULL,
+ initialize = function(meta_scope, meta_by_scope) {
+ self$meta_scope = VitessceConfigCoordinationScope$new(CoordinationType$META_COORDINATION_SCOPES, meta_scope)
+ self$meta_by_scope = VitessceConfigCoordinationScope$new(CoordinationType$META_COORDINATION_SCOPES_BY, meta_by_scope)
+ },
+ use_coordination = function(c_scopes) {
+ if(is.na(self$meta_scope4c_value)) {
+ self$meta_scope$set_value(obj_list())
+ }
+
+ meta_scopes_val <- self$meta_scope$c_value
+ for(c_scope in c_scopes) {
+ meta_scopes_val[[c_scope$c_type]] <- c_scope$c_scope
+ }
+ self$meta_scope$set_value(meta_scopes_val)
+ invisible(self)
+ },
+ use_coordination_by_dict = function(scopes) {
+ # TODO
+ invisible(self)
+ }
+ )
+)
+
#' Horizontal view concatenation in a VitessceConfig
#' @title VitessceConfigViewHConcat Class
#' @docType class
@@ -321,6 +374,7 @@ VitessceConfigView <- R6::R6Class("VitessceConfigView",
}
invisible(self)
},
+
#' @description
#' Set the dimensions of the view.
#' @param x The x-coordinate of the view in the layout.
diff --git a/R/constants.R b/R/constants.R
index a3fb5d2..babeeff 100644
--- a/R/constants.R
+++ b/R/constants.R
@@ -51,6 +51,8 @@
#' c_values = c(0, 0)
#' )
CoordinationType <- list(
+ META_COORDINATION_SCOPES = "metaCoordinationScopes",
+ META_COORDINATION_SCOPES_BY = "metaCoordinationScopesBy",
DATASET = "dataset",
EMBEDDING_TYPE = "embeddingType",
EMBEDDING_ZOOM = "embeddingZoom",
From cfef448e088dbab092e60b43dddc9ce6d11f5616 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Wed, 27 Sep 2023 15:54:59 -0400
Subject: [PATCH 07/22] VitessceConfig, TODOs for multi-level coordination
functions
---
R/config.R | 40 ++++++++++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 10 deletions(-)
diff --git a/R/config.R b/R/config.R
index 24a95fe..94db46a 100644
--- a/R/config.R
+++ b/R/config.R
@@ -374,7 +374,14 @@ VitessceConfigView <- R6::R6Class("VitessceConfigView",
}
invisible(self)
},
-
+ use_coordination_by_dict = function(scopes) {
+ # TODO
+ invisible(self)
+ },
+ use_meta_coordination = function(meta_scope) {
+ # TODO
+ invisible(self)
+ },
#' @description
#' Set the dimensions of the view.
#' @param x The x-coordinate of the view in the layout.
@@ -418,14 +425,16 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
public = list(
#' @field config The internal representation of the view config.
config = NULL,
+ #' @field base_dir The base directory for the config.
+ base_dir = NULL,
#' @description
#' Create a new config object.
#' @param name A name for the config.
#' @param description A description for the config.
#' @return A new `VitessceConfig` object.
- initialize = function(name = NA, description = NA) {
+ initialize = function(schema_version, name = NA, description = NA, base_dir = NA) {
self$config <- list(
- version = "1.0.9",
+ version = schema_version,
name = ifelse(is_na(name), "", name),
description = ifelse(is_na(description), "", description),
datasets = list(),
@@ -433,6 +442,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
layout = list(),
initStrategy = "auto"
)
+ self$base_dir <- base_dir
},
#' @description
#' Add a dataset to the config.
@@ -448,7 +458,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
prev_dataset_uids <- c(prev_dataset_uids, d$dataset$uid)
}
uid <- ifelse(is_na(uid), get_next_scope(prev_dataset_uids), uid)
- new_dataset <- VitessceConfigDataset$new(uid, name)
+ new_dataset <- VitessceConfigDataset$new(uid, name, base_dir = self$base_dir)
self$config$datasets <- append(self$config$datasets, new_dataset)
new_scopes <- self$add_coordination(CoordinationType$DATASET)
@@ -536,6 +546,15 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
}
result
},
+ add_meta_coordination = function() {
+ # TODO
+ },
+ add_coordination_by_dict = function(input_val) {
+ # TODO
+ },
+ link_views_by_dict = function(views, input_val, meta = TRUE) {
+ # TODO
+ },
#' @description
#' Define the layout of views.
#' @param view_concat A concatenation of views.
@@ -737,14 +756,15 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param config A list containing a valid config.
#' @return A `VitessceConfig` object reflecting the list-based configuration values.
VitessceConfig$from_list <- function(config) {
- vc <- VitessceConfig$new(config$name, config$description)
+ vc <- VitessceConfig$new(config$version, name = config$name, description = config$description)
for(d in config$datasets) {
new_dataset <- vc$add_dataset(d$name, uid = d$uid)
for(f in d$files) {
new_dataset$add_file(
- f$url,
- f$type,
- f$fileType
+ url = f$url,
+ file_type = ifelse(!is.null(f$fileType), f$fileType, NA),
+ coordination_values = ifelse(!is.null(f$coordinationValues), f$coordinationValues, NA),
+ options = ifelse(!is.null(f$options), f$options, NA)
)
}
}
@@ -777,8 +797,8 @@ VitessceConfig$from_list <- function(config) {
#' @param name A name for the view config.
#' @param description A description for the view config.
#' @return A `VitessceConfig` object containing the object as a member of the datasets list, with some automatically-configured views.
-VitessceConfig$from_object <- function(obj, name = NA, description = NA) {
- vc <- VitessceConfig$new(name, description)
+VitessceConfig$from_object <- function(obj, schema_version, name = NA, description = NA) {
+ vc <- VitessceConfig$new(schema_version, name = name, description = description)
obj$auto_view_config(vc)
return(vc)
}
From 59bb052160e859ec518c24a927f813c1844a9296 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Thu, 28 Sep 2023 14:32:48 -0400
Subject: [PATCH 08/22] AnnDataWrapper with test
---
R/constants.R | 1 +
R/wrappers_anndata.R | 230 +++++++++++++++++++++++++
tests/testthat/test-wrappers-anndata.R | 45 +++++
3 files changed, 276 insertions(+)
create mode 100644 R/wrappers_anndata.R
create mode 100644 tests/testthat/test-wrappers-anndata.R
diff --git a/R/constants.R b/R/constants.R
index babeeff..0cd8011 100644
--- a/R/constants.R
+++ b/R/constants.R
@@ -152,6 +152,7 @@ FileType <- list(
CELL_SETS_JSON = "cell-sets.json",
CLUSTERS_JSON = "clusters.json",
EXPRESSION_MATRIX_ZARR = "expression-matrix.zarr",
+ ANNDATA_ZARR = "anndata.zarr",
ANNDATA_CELLS_ZARR = "anndata-cells.zarr",
ANNDATA_CELL_SETS_ZARR = "anndata-cell-sets.zarr",
ANNDATA_EXPRESSION_MATRIX_ZARR = "anndata-expression-matrix.zarr"
diff --git a/R/wrappers_anndata.R b/R/wrappers_anndata.R
new file mode 100644
index 0000000..a455c37
--- /dev/null
+++ b/R/wrappers_anndata.R
@@ -0,0 +1,230 @@
+#' Seurat object wrapper class
+#' @title SeuratWrapper Class
+#' @docType class
+#' @description
+#' Class representing a local Seurat object in a Vitessce dataset.
+#'
+#' @rdname SeuratWrapper
+#' @export
+#' @examples
+#' obj <- get_seurat_obj()
+#' w <- SeuratWrapper$new(
+#' obj,
+#' cell_embeddings = c("pca"),
+#' cell_embedding_names = c("PCA")
+#' )
+AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
+ inherit = AbstractWrapper,
+ public = list(
+ #' @field adata_path The object to wrap.
+ #' @keywords internal
+ adata_path = NULL,
+ #' @field adata_url The object to wrap.
+ #' @keywords internal
+ adata_url = NULL,
+ #' @field local_dir_uid The path to the local zarr store.
+ #' @keywords internal
+ local_dir_uid = NULL,
+
+
+ obs_feature_matrix_path=NULL,
+ feature_filter_path=NULL,
+ initial_feature_filter_path=NULL,
+ obs_set_paths=NULL,
+ obs_set_names=NULL,
+ obs_locations_path=NULL,
+ obs_segmentations_path=NULL,
+ obs_embedding_paths=NULL,
+ obs_embedding_names=NULL,
+ obs_embedding_dims=NULL,
+ request_init=NULL,
+ feature_labels_path=NULL,
+ obs_labels_path=NULL,
+ obs_labels_paths=NULL,
+ obs_labels_names=NULL,
+ coordination_values=NULL,
+
+ #' @description
+ #' Create a wrapper around an AnnData object saved to a Zarr store.
+ #' @param adata_path The path to a local Zarr store.
+ #' @param ... Parameters inherited from `AbstractWrapper`.
+ #' @return A new `SeuratWrapper` object.
+ initialize = function(adata_path = NA, adata_url = NA, obs_feature_matrix_path = NA, feature_filter_path = NA, initial_feature_filter_path = NA, obs_set_paths = NA, obs_set_names = NA, obs_locations_path = NA, obs_segmentations_path = NA, obs_embedding_paths = NA, obs_embedding_names = NA, obs_embedding_dims = NA, request_init = NA, feature_labels_path = NA, obs_labels_path = NA, coordination_values = NA, obs_labels_paths = NA, obs_labels_names = NA, ...) {
+ super$initialize(...)
+ self$adata_path <- adata_path
+ self$adata_url <- adata_url
+
+ if(!is.na(adata_url) && !is.na(adata_path)) {
+ stop("Did not expect adata_url to be provided with adata_path")
+ }
+
+ if(is.na(adata_url) && is.na(adata_path)) {
+ stop("Expected either adata_url or adata_path to be provided")
+ }
+
+ if(!is.na(adata_path)) {
+ self$is_remote <- FALSE
+ } else {
+ self$is_remote <- TRUE
+ }
+
+ self$local_dir_uid <- make_unique_filename(".adata.zarr")
+
+ self$obs_feature_matrix_path <- obs_feature_matrix_path
+ self$obs_set_names <- obs_set_names
+ self$obs_embedding_names <- obs_embedding_names
+ self$feature_filter_path <- feature_filter_path
+ self$initial_feature_filter_path <- initial_feature_filter_path
+ self$obs_set_paths <- obs_set_paths
+ self$obs_locations_path <- obs_locations_path
+ self$obs_segmentations_path <- obs_segmentations_path
+ self$obs_embedding_paths <- obs_embedding_paths
+ self$obs_embedding_dims <- obs_embedding_dims
+ self$request_init <- request_init
+ self$feature_labels_path <- feature_labels_path
+ self$obs_labels_paths <- obs_labels_paths
+ self$obs_labels_names <- obs_labels_names
+
+ self$coordination_values <- coordination_values
+ },
+ #' @description
+ #' Create the JSON output files, web server routes, and file definition creators.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
+ if(self$is_remote) {
+ super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
+ }
+
+ # Get the file definition creator functions.
+ file_def_creator <- self$make_file_def_creator(dataset_uid, obj_i)
+
+ # Append the new file definition creators functions to the main list.
+ self$file_def_creators <- append(self$file_def_creators, file_def_creator)
+
+ # Create a web server route object for the directory of JSON files.
+ new_routes <- self$make_routes(dataset_uid, obj_i)
+ for(route in new_routes) {
+ self$routes <- append(self$routes, route)
+ }
+ },
+ make_routes = function(dataset_uid, obj_i) {
+ return(self$get_local_dir_route(dataset_uid, obj_i, self$adata_path, self$local_dir_uid))
+ },
+ #' @description
+ #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
+ #' @param base_url The base URL, on which the route will be served.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @keywords internal
+ #' @return A URL as a string.
+ get_zarr_url = function(base_url, dataset_uid, obj_i) {
+ if(self$is_remote) {
+ return(self$adata_url)
+ } else {
+ return(self$get_local_dir_url(base_url, dataset_uid, obj_i, self$adata_path, self$local_dir_uid))
+ }
+ },
+ #' @description
+ #' Make the file definition creator function for the cells data type.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @return A file definition creator function which takes a `base_url` parameter.
+ make_file_def_creator = function(dataset_uid, obj_i) {
+ get_anndata_zarr <- function(base_url) {
+ options <- obj_list()
+ if(!is_na(self$obs_locations_path)) {
+ options[['obsLocations']] <- obj_list()
+ options[['obsLocations']][['path']] <- self$obs_locations_path
+ }
+ if(!is_na(self$obs_segmentations_path)) {
+ options[['obsSegmentations']] <- obj_list()
+ options[['obsSegmentations']][['path']] <- self$obs_segmentations_path
+ }
+ if(!is_na(self$obs_embedding_paths)) {
+ options[['obsEmbedding']] <- list()
+ for(i in seq_len(length(self$obs_embedding_paths))) {
+ embedding_path <- self$obs_embedding_paths[i]
+ if(!is_na(self$obs_embedding_names)) {
+ embedding_name <- self$obs_embedding_names[i]
+ } else {
+ segments <- stringr::str_split(embedding_path, "/")[[1]]
+ embedding_name <- segments[-1]
+ }
+ if(!is_na(self$obs_embedding_dims)) {
+ embedding_dims <- self$obs_embedding_dims[i]
+ } else {
+ embedding_dims <- c(0, 1)
+ }
+ options[['obsEmbedding']] <- append(options[['obsEmbedding']], list(obj_list(
+ path = embedding_path,
+ embeddingType = embedding_name,
+ dims = embedding_dims
+ )))
+ }
+ }
+ if(!is_na(self$obs_set_paths)) {
+ options[['obsSets']] <- list()
+ for(i in seq_len(length(self$obs_set_paths))) {
+ set_path <- self$obs_set_paths[i]
+ if(!is_na(self$obs_set_names)) {
+ set_name <- self$obs_set_names[i]
+ } else {
+ segments <- stringr::str_split(set_path, "/")[[1]]
+ set_name <- segments[-1]
+ }
+ options[['obsSets']] <- append(options[['obsSets']], list(obj_list(
+ path = set_path,
+ name = set_name
+ )))
+ }
+ }
+ if(!is_na(self$obs_feature_matrix_path)) {
+ options[['obsFeatureMatrix']] <- obj_list()
+ options[['obsFeatureMatrix']][['path']] <- self$obs_feature_matrix_path
+ if(!is_na(self$feature_filter_path)) {
+ options[['obsFeatureMatrix']][['featureFilterPath']] <- self$feature_filter_path
+ }
+ if(!is_na(self$initial_feature_filter_path)) {
+ options[['obsFeatureMatrix']][['initialFeatureFilterPath']] <- self$initial_feature_filter_path
+ }
+ }
+ if(!is_na(self$feature_labels_path)) {
+ options[['featureLabels']] <- obj_list()
+ options[['featureLabels']][['path']] <- self$feature_labels_path
+ }
+ if(!is_na(self$obs_labels_paths)) {
+ options[['obsLabels']] <- list()
+ for(i in seq_len(length(self$obs_labels_paths))) {
+ obs_labels_path <- self$obs_labels_paths[i]
+ if(!is_na(self$obs_labels_names)) {
+ obs_labels_name <- self$obs_labels_names[i]
+ } else {
+ segments <- stringr::str_split(obs_labels_path, "/")[[1]]
+ obs_labels_name <- segments[-1]
+ }
+ options[['obsLabels']] <- append(options[['obsLabels']], list(obj_list(
+ path = obs_labels_path,
+ obsLabelsType = obs_labels_name
+ )))
+ }
+ }
+
+ file_def <- list(
+ fileType = FileType$ANNDATA_ZARR,
+ url = self$get_zarr_url(base_url, dataset_uid, obj_i),
+ options = options
+ )
+ if(!is_na(self$request_init)) {
+ file_def[['requestInit']] <- self$request_init
+ }
+ if(!is_na(self$coordination_values)) {
+ file_def[['coordinationValues']] <- self$coordination_values
+ }
+
+ return(file_def)
+ }
+ return(get_anndata_zarr)
+ }
+ ),
+)
diff --git a/tests/testthat/test-wrappers-anndata.R b/tests/testthat/test-wrappers-anndata.R
new file mode 100644
index 0000000..d3edc68
--- /dev/null
+++ b/tests/testthat/test-wrappers-anndata.R
@@ -0,0 +1,45 @@
+library(vitessceR)
+
+test_that("AnnDataWrapper", {
+ w <- AnnDataWrapper$new(
+ adata_path = "tests/data/test.h5ad.zarr",
+ obs_set_paths=c('obs/CellType'),
+ obs_set_names=c('Cell Type'),
+ obs_labels_names=c('Cell Label'),
+ obs_labels_paths=c('obs/CellLabel'),
+ obs_embedding_paths=c('obsm/X_umap'),
+ obs_embedding_names=c('UMAP')
+ )
+ w$local_dir_uid <- "some_uuid.h5ad.zarr"
+
+ file_def_creator <- w$make_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ print(file_def)
+
+ expect_equal(file_def, list(
+ fileType = "anndata.zarr",
+ url = "http://localhost:8000/A/0/some_uuid.h5ad.zarr",
+ options = list(
+ obsEmbedding = list(
+ obj_list(
+ path = "obsm/X_umap",
+ embeddingType = "UMAP",
+ dims = c(0, 1)
+ )
+ ),
+ obsSets = list(
+ obj_list(
+ path = "obs/CellType",
+ name = "Cell Type"
+ )
+ ),
+ obsLabels = list(
+ obj_list(
+ path = "obs/CellLabel",
+ obsLabelsType = "Cell Label"
+ )
+ )
+ )
+ ))
+})
From 163e5810871f8abfd4e97618ed11141b784f08f1 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Thu, 28 Sep 2023 15:18:06 -0400
Subject: [PATCH 09/22] Remove wrapper classes; update NAMESPACE
---
NAMESPACE | 5 +-
R/wrappers_giotto.R | 248 ----------------
R/wrappers_sce.R | 244 ----------------
R/wrappers_seurat.R | 262 -----------------
R/wrappers_spe.R | 319 ---------------------
man/AbstractWrapper.Rd | 47 +++-
man/CoordinationType.Rd | 2 +-
man/FileType.Rd | 2 +-
man/GiottoWrapper.Rd | 290 -------------------
man/MultiImageWrapper.Rd | 3 +
man/OmeTiffWrapper.Rd | 25 +-
man/SCEWrapper.Rd | 290 -------------------
man/SPEWrapper.Rd | 373 -------------------------
man/SeuratWrapper.Rd | 223 ++++-----------
man/VitessceConfig.Rd | 34 ++-
man/VitessceConfigCoordinationScope.Rd | 2 +-
man/VitessceConfigDataset.Rd | 33 ++-
man/VitessceConfigDatasetFile.Rd | 9 +-
man/VitessceConfigView.Rd | 20 ++
tests/testthat/setup-wrappers-seurat.R | 10 -
tests/testthat/test-config.R | 50 ++--
tests/testthat/test-utils.R | 19 ++
tests/testthat/test-wrappers-anndata.R | 37 ++-
tests/testthat/test-wrappers-images.R | 26 ++
tests/testthat/test-wrappers-seurat.R | 64 -----
tests/testthat/test-wrappers.R | 43 ---
26 files changed, 329 insertions(+), 2351 deletions(-)
delete mode 100644 R/wrappers_giotto.R
delete mode 100644 R/wrappers_sce.R
delete mode 100644 R/wrappers_seurat.R
delete mode 100644 R/wrappers_spe.R
delete mode 100644 man/GiottoWrapper.Rd
delete mode 100644 man/SCEWrapper.Rd
delete mode 100644 man/SPEWrapper.Rd
delete mode 100644 tests/testthat/setup-wrappers-seurat.R
create mode 100644 tests/testthat/test-utils.R
create mode 100644 tests/testthat/test-wrappers-images.R
delete mode 100644 tests/testthat/test-wrappers-seurat.R
diff --git a/NAMESPACE b/NAMESPACE
index 300b1bb..8988f2e 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,16 +1,13 @@
# Generated by roxygen2: do not edit by hand
export(AbstractWrapper)
+export(AnnDataWrapper)
export(Component)
export(CoordinationType)
export(DataType)
export(FileType)
-export(GiottoWrapper)
export(MultiImageWrapper)
export(OmeTiffWrapper)
-export(SCEWrapper)
-export(SPEWrapper)
-export(SeuratWrapper)
export(VitessceConfig)
export(hconcat)
export(obj_list)
diff --git a/R/wrappers_giotto.R b/R/wrappers_giotto.R
deleted file mode 100644
index 09b6344..0000000
--- a/R/wrappers_giotto.R
+++ /dev/null
@@ -1,248 +0,0 @@
-#' Giotto object wrapper class
-#' @title GiottoWrapper Class
-#' @docType class
-#' @description
-#' Class representing a local Giotto object in a Vitessce dataset.
-#'
-#' @rdname GiottoWrapper
-#' @export
-#' @examples
-#' obj <- get_giotto_obj()
-#' w <- GiottoWrapper$new(
-#' obj,
-#' cell_embeddings = c("pca"),
-#' cell_embedding_names = c("PCA")
-#' )
-GiottoWrapper <- R6::R6Class("GiottoWrapper",
- inherit = AbstractWrapper,
- public = list(
- #' @field obj The object to wrap.
- #' @keywords internal
- obj = NULL,
- #' @field cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embeddings = NULL,
- #' @field cell_embedding_names Names
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_names = NULL,
- #' @field cell_embedding_dims The dimension indices
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_dims = NULL,
- #' @field cell_set_metas The keys in the Seurat object's meta.data
- #' to use for creating cell sets.
- #' @keywords internal
- cell_set_metas = NULL,
- #' @field cell_set_meta_names The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to new names.
- #' @keywords internal
- cell_set_meta_names = NULL,
- #' @field cell_set_meta_scores The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to keys for scores.
- #' @keywords internal
- cell_set_meta_scores = NULL,
- #' @field zarr_folder The name for the folder at the root of the zarr store.
- #' @keywords internal
- zarr_folder = NULL,
- #' @description
- #' Create a wrapper around a Seurat object.
- #' @param obj The object to wrap.
- #' @param cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_names Names
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_dims An array of dimension indices to use for each cell_embedding.
- #' @param cell_set_metas An optional list of keys in the object's meta.data
- #' list to use for creating cell sets.
- #' @param cell_set_meta_names If cell_set_metas is provided, this list can
- #' also be provided to set new names to replace
- #' the keys in the interface.
- #' @param cell_set_meta_scores If cell_set_metas is provided, this list can
- #' also be provided to map between meta.data keys for set annotations
- #' and keys for annotation scores.
- #' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `GiottoWrapper` object.
- initialize = function(obj, cell_embeddings = NA, cell_embedding_names = NA, cell_embedding_dims = NA, cell_set_metas = NA, cell_set_meta_names = NA, cell_set_meta_scores = NA, ...) {
- super$initialize(...)
- self$obj <- obj
- self$cell_embeddings <- cell_embeddings
- self$cell_embedding_names <- cell_embedding_names
- self$cell_embedding_dims <- cell_embedding_dims
- self$cell_set_metas <- cell_set_metas
- self$cell_set_meta_names <- cell_set_meta_names
- self$cell_set_meta_scores <- cell_set_meta_scores
-
- self$zarr_folder <- "giotto.zarr"
-
- self$check_obj()
- },
- #' @description
- #' Check that the object is valid
- #' @keywords internal
- #' @return Success or failure.
- check_obj = function() {
- success <- TRUE
- if(!methods::is(self$obj, "giotto")) {
- warning("Object is not of type giotto.")
- success <- FALSE
- }
- if(!is_na(self$cell_embeddings) && !all(self$cell_embeddings %in% names(self$obj@dimension_reduction$cells))) {
- warning("Specified cell_embeddings not all present in Giotto object dimension_reduction")
- success <- FALSE
- }
- if(!is_na(self$cell_set_metas) && !all(self$cell_set_metas %in% colnames(self$obj@cell_metadata))) {
- warning("Specified cell_set_metas not all present in Giotto object cell_metadata.")
- success <- FALSE
- }
- return(success)
- },
- #' @description
- #' Get the path to the zarr store, relative to the current directory.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A path as a string.
- get_zarr_path = function(dataset_uid, obj_i) {
- out_dir <- super$get_out_dir(dataset_uid, obj_i)
- zarr_filepath <- file.path(out_dir, self$zarr_folder)
- return(zarr_filepath)
- },
- #' @description
- #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
- #' @param base_url The base URL, on which the route will be served.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A URL as a string.
- get_zarr_url = function(base_url, dataset_uid, obj_i) {
- return(super$get_url(base_url, dataset_uid, obj_i, self$zarr_folder))
- },
- #' @description
- #' Create the JSON output files, web server routes, and file definition creators.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- convert_and_save = function(dataset_uid, obj_i) {
- super$convert_and_save(dataset_uid, obj_i)
-
- zarr_filepath <- self$get_zarr_path(dataset_uid, obj_i)
- if(!file.exists(zarr_filepath) || !self$use_cache) {
- giotto_to_anndata_zarr(self$obj, out_path = zarr_filepath)
- }
-
- # Get the file definition creator functions.
- cells_file_creator <- self$make_cells_file_def_creator(dataset_uid, obj_i)
- cell_sets_file_creator <- self$make_cell_sets_file_def_creator(dataset_uid, obj_i)
- expression_matrix_file_creator <- self$make_expression_matrix_file_def_creator(dataset_uid, obj_i)
-
- # Append the new file definition creators functions to the main list.
- self$file_def_creators <- append(self$file_def_creators, cells_file_creator)
- self$file_def_creators <- append(self$file_def_creators, cell_sets_file_creator)
- self$file_def_creators <- append(self$file_def_creators, expression_matrix_file_creator)
-
- # Create a web server route object for the directory of JSON files.
- self$routes <- append(self$routes, self$get_out_dir_route(dataset_uid, obj_i))
- },
- #' @description
- #' Make the file definition creator function for the cells data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cells_file_def_creator = function(dataset_uid, obj_i) {
- get_cells <- function(base_url) {
- options <- obj_list()
- if(!is_na(slot(self$obj, "spatial_locs"))) {
- options[['xy']] <- "obsm/spatial"
- }
- if(!is_na(self$cell_embeddings)) {
- options[['mappings']] <- obj_list()
- for(i in seq_len(length(self$cell_embeddings))) {
- embedding_key <- self$cell_embeddings[i]
- if(!is_na(self$cell_embedding_names)) {
- embedding_name <- self$cell_embedding_names[i]
- } else {
- embedding_name <- embedding_key
- }
- if(!is_na(self$cell_embedding_dims)) {
- embedding_dims <- self$cell_embedding_dims[i]
- } else {
- embedding_dims <- c(0, 1)
- }
- options[['mappings']][[embedding_name]] <- obj_list(
- key = paste0("obsm/", embedding_key),
- dims = embedding_dims
- )
- }
- }
- file_def <- list(
- type = DataType$CELLS,
- fileType = FileType$ANNDATA_CELLS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cells)
- },
- #' @description
- #' Make the file definition creator function for the cell sets data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cell_sets_file_def_creator = function(dataset_uid, obj_i) {
- get_cell_sets <- function(base_url) {
- options <- list()
- if(!is_na(self$cell_set_metas)) {
- for(i in seq_len(length(self$cell_set_metas))) {
- cell_set_key <- self$cell_set_metas[i]
- if(!is_na(self$cell_set_meta_names)) {
- group_name <- self$cell_set_meta_names[i]
- } else {
- group_name <- cell_set_key
- }
-
- cell_set_def <- obj_list(
- groupName = group_name,
- setName = paste0("obs/", cell_set_key)
- )
- if(!is_na(self$cell_set_meta_scores)) {
- score_name <- self$cell_set_meta_scores[i]
- # TODO: uncomment
- #cell_set_def[['scoreName']] <- score_name
- }
- options <- append(options, list(cell_set_def))
- }
- }
- file_def <- list(
- type = DataType$CELL_SETS,
- fileType = FileType$ANNDATA_CELL_SETS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cell_sets)
- },
- #' @description
- #' Make the file definition creator function for the expression matrix data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_expression_matrix_file_def_creator = function(dataset_uid, obj_i) {
- get_expression_matrix <- function(base_url) {
- options = obj_list(
- matrix = "X"
- )
- file_def <- list(
- type = DataType$EXPRESSION_MATRIX,
- fileType = FileType$ANNDATA_EXPRESSION_MATRIX_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_expression_matrix)
- }
- ),
-)
diff --git a/R/wrappers_sce.R b/R/wrappers_sce.R
deleted file mode 100644
index 704ebc2..0000000
--- a/R/wrappers_sce.R
+++ /dev/null
@@ -1,244 +0,0 @@
-#' SingleCellExperiment object wrapper class
-#' @title SCEWrapper Class
-#' @docType class
-#' @description
-#' Class representing a local SingleCellExperiment object in a Vitessce dataset.
-#'
-#' @rdname SCEWrapper
-#' @export
-#' @examples
-#' obj <- get_sce_obj()
-#' w <- SCEWrapper$new(
-#' obj,
-#' cell_embeddings = c("pca"),
-#' cell_embedding_names = c("PCA")
-#' )
-SCEWrapper <- R6::R6Class("SCEWrapper",
- inherit = AbstractWrapper,
- public = list(
- #' @field obj The object to wrap.
- #' @keywords internal
- obj = NULL,
- #' @field cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embeddings = NULL,
- #' @field cell_embedding_names Names
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_names = NULL,
- #' @field cell_embedding_dims The dimension indices
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_dims = NULL,
- #' @field cell_set_metas The keys in the Seurat object's meta.data
- #' to use for creating cell sets.
- #' @keywords internal
- cell_set_metas = NULL,
- #' @field cell_set_meta_names The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to new names.
- #' @keywords internal
- cell_set_meta_names = NULL,
- #' @field cell_set_meta_scores The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to keys for scores.
- #' @keywords internal
- cell_set_meta_scores = NULL,
- #' @field zarr_folder The name for the folder at the root of the zarr store.
- #' @keywords internal
- zarr_folder = NULL,
- #' @description
- #' Create a wrapper around a Seurat object.
- #' @param obj The object to wrap.
- #' @param cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_names Names
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_dims An array of dimension indices to use for each cell_embedding.
- #' @param cell_set_metas An optional list of keys in the object's meta.data
- #' list to use for creating cell sets.
- #' @param cell_set_meta_names If cell_set_metas is provided, this list can
- #' also be provided to set new names to replace
- #' the keys in the interface.
- #' @param cell_set_meta_scores If cell_set_metas is provided, this list can
- #' also be provided to map between meta.data keys for set annotations
- #' and keys for annotation scores.
- #' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `SCEWrapper` object.
- initialize = function(obj, cell_embeddings = NA, cell_embedding_names = NA, cell_embedding_dims = NA, cell_set_metas = NA, cell_set_meta_names = NA, cell_set_meta_scores = NA, ...) {
- super$initialize(...)
- self$obj <- obj
- self$cell_embeddings <- cell_embeddings
- self$cell_embedding_names <- cell_embedding_names
- self$cell_embedding_dims <- cell_embedding_dims
- self$cell_set_metas <- cell_set_metas
- self$cell_set_meta_names <- cell_set_meta_names
- self$cell_set_meta_scores <- cell_set_meta_scores
-
- self$zarr_folder <- "sce.zarr"
- self$check_obj()
- },
- #' @description
- #' Check that the object is valid
- #' @keywords internal
- #' @return Success or failure.
- check_obj = function() {
- success <- TRUE
- if(!methods::is(self$obj, "SingleCellExperiment")) {
- warning("Object is not of type SingleCellExperiment.")
- success <- FALSE
- }
- if(!is_na(self$cell_embeddings) && !all(self$cell_embeddings %in% SingleCellExperiment::reducedDimNames(self$obj))) {
- warning("Specified cell_embeddings not all present in SCE object reducedDims.")
- success <- FALSE
- }
- if(!is_na(self$cell_set_metas) && !all(self$cell_set_metas %in% colnames(SingleCellExperiment::colData(self$obj)))) {
- warning("Specified cell_set_metas not all present in SCE object colData.")
- success <- FALSE
- }
- return(success)
- },
- #' @description
- #' Get the path to the zarr store, relative to the current directory.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A path as a string.
- get_zarr_path = function(dataset_uid, obj_i) {
- out_dir <- super$get_out_dir(dataset_uid, obj_i)
- zarr_filepath <- file.path(out_dir, self$zarr_folder)
- return(zarr_filepath)
- },
- #' @description
- #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
- #' @param base_url The base URL, on which the route will be served.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A URL as a string.
- get_zarr_url = function(base_url, dataset_uid, obj_i) {
- return(super$get_url(base_url, dataset_uid, obj_i, self$zarr_folder))
- },
- #' @description
- #' Create the JSON output files, web server routes, and file definition creators.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- convert_and_save = function(dataset_uid, obj_i) {
- super$convert_and_save(dataset_uid, obj_i)
-
- zarr_filepath <- self$get_zarr_path(dataset_uid, obj_i)
- if(!file.exists(zarr_filepath) || !self$use_cache) {
- sce_to_anndata_zarr(self$obj, out_path = zarr_filepath)
- }
-
- # Get the file definition creator functions.
- cells_file_creator <- self$make_cells_file_def_creator(dataset_uid, obj_i)
- cell_sets_file_creator <- self$make_cell_sets_file_def_creator(dataset_uid, obj_i)
- expression_matrix_file_creator <- self$make_expression_matrix_file_def_creator(dataset_uid, obj_i)
-
- # Append the new file definition creators functions to the main list.
- self$file_def_creators <- append(self$file_def_creators, cells_file_creator)
- self$file_def_creators <- append(self$file_def_creators, cell_sets_file_creator)
- self$file_def_creators <- append(self$file_def_creators, expression_matrix_file_creator)
-
- # Create a web server route object for the directory of JSON files.
- self$routes <- append(self$routes, self$get_out_dir_route(dataset_uid, obj_i))
- },
- #' @description
- #' Make the file definition creator function for the cells data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cells_file_def_creator = function(dataset_uid, obj_i) {
- get_cells <- function(base_url) {
- options <- obj_list()
- if(!is_na(self$cell_embeddings)) {
- options[['mappings']] <- obj_list()
- for(i in seq_len(length(self$cell_embeddings))) {
- embedding_key <- self$cell_embeddings[i]
- if(!is_na(self$cell_embedding_names)) {
- embedding_name <- self$cell_embedding_names[i]
- } else {
- embedding_name <- embedding_key
- }
- if(!is_na(self$cell_embedding_dims)) {
- embedding_dims <- self$cell_embedding_dims[i]
- } else {
- embedding_dims <- c(0, 1)
- }
- options[['mappings']][[embedding_name]] <- obj_list(
- key = paste0("obsm/", embedding_key),
- dims = embedding_dims
- )
- }
- }
- file_def <- list(
- type = DataType$CELLS,
- fileType = FileType$ANNDATA_CELLS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cells)
- },
- #' @description
- #' Make the file definition creator function for the cell sets data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cell_sets_file_def_creator = function(dataset_uid, obj_i) {
- get_cell_sets <- function(base_url) {
- options <- list()
- if(!is_na(self$cell_set_metas)) {
- for(i in seq_len(length(self$cell_set_metas))) {
- cell_set_key <- self$cell_set_metas[i]
- if(!is_na(self$cell_set_meta_names)) {
- group_name <- self$cell_set_meta_names[i]
- } else {
- group_name <- cell_set_key
- }
-
- cell_set_def <- obj_list(
- groupName = group_name,
- setName = paste0("obs/", cell_set_key)
- )
- if(!is_na(self$cell_set_meta_scores)) {
- score_name <- self$cell_set_meta_scores[i]
- # TODO: uncomment
- #cell_set_def[['scoreName']] <- score_name
- }
- options <- append(options, list(cell_set_def))
- }
- }
- file_def <- list(
- type = DataType$CELL_SETS,
- fileType = FileType$ANNDATA_CELL_SETS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cell_sets)
- },
- #' @description
- #' Make the file definition creator function for the expression matrix data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_expression_matrix_file_def_creator = function(dataset_uid, obj_i) {
- get_expression_matrix <- function(base_url) {
- options = obj_list(
- matrix = "X"
- )
- file_def <- list(
- type = DataType$EXPRESSION_MATRIX,
- fileType = FileType$ANNDATA_EXPRESSION_MATRIX_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_expression_matrix)
- }
- ),
-)
diff --git a/R/wrappers_seurat.R b/R/wrappers_seurat.R
deleted file mode 100644
index 8f004b5..0000000
--- a/R/wrappers_seurat.R
+++ /dev/null
@@ -1,262 +0,0 @@
-#' Seurat object wrapper class
-#' @title SeuratWrapper Class
-#' @docType class
-#' @description
-#' Class representing a local Seurat object in a Vitessce dataset.
-#'
-#' @rdname SeuratWrapper
-#' @export
-#' @examples
-#' obj <- get_seurat_obj()
-#' w <- SeuratWrapper$new(
-#' obj,
-#' cell_embeddings = c("pca"),
-#' cell_embedding_names = c("PCA")
-#' )
-SeuratWrapper <- R6::R6Class("SeuratWrapper",
- inherit = AbstractWrapper,
- public = list(
- #' @field obj The object to wrap.
- #' @keywords internal
- obj = NULL,
- #' @field assay The assay name in the Seurat object.
- #' @keywords internal
- assay = NULL,
- #' @field cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embeddings = NULL,
- #' @field cell_embedding_names Names
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_names = NULL,
- #' @field cell_embedding_dims The dimension indices
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_dims = NULL,
- #' @field cell_set_metas The keys in the Seurat object's meta.data
- #' to use for creating cell sets.
- #' @keywords internal
- cell_set_metas = NULL,
- #' @field cell_set_meta_names The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to new names.
- #' @keywords internal
- cell_set_meta_names = NULL,
- #' @field cell_set_meta_scores The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to keys for scores.
- #' @keywords internal
- cell_set_meta_scores = NULL,
- #' @field zarr_folder The name for the folder at the root of the zarr store.
- #' @keywords internal
- zarr_folder = NULL,
- #' @description
- #' Create a wrapper around a Seurat object.
- #' @param obj The object to wrap.
- #' @param assay The assay name under the assays part of the Seurat object.
- #' @param cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_names Names
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_dims An array of dimension indices to use for each cell_embedding.
- #' @param cell_set_metas An optional list of keys in the object's meta.data
- #' list to use for creating cell sets.
- #' @param cell_set_meta_names If cell_set_metas is provided, this list can
- #' also be provided to set new names to replace
- #' the keys in the interface.
- #' @param cell_set_meta_scores If cell_set_metas is provided, this list can
- #' also be provided to map between meta.data keys for set annotations
- #' and keys for annotation scores.
- #' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `SeuratWrapper` object.
- initialize = function(obj, assay = NA, cell_embeddings = NA, cell_embedding_names = NA, cell_embedding_dims = NA, cell_set_metas = NA, cell_set_meta_names = NA, cell_set_meta_scores = NA, ...) {
- super$initialize(...)
- self$obj <- obj
- if(is.na(assay)) {
- self$assay <- "RNA"
- } else {
- self$assay <- assay
- }
- self$cell_embeddings <- cell_embeddings
- self$cell_embedding_names <- cell_embedding_names
- self$cell_embedding_dims <- cell_embedding_dims
- self$cell_set_metas <- cell_set_metas
- self$cell_set_meta_names <- cell_set_meta_names
- self$cell_set_meta_scores <- cell_set_meta_scores
-
- self$zarr_folder <- "seurat.zarr"
-
- self$check_obj()
- },
- #' @description
- #' Check that the object is valid
- #' @keywords internal
- #' @return Success or failure.
- check_obj = function() {
- success <- TRUE
- if(is.null(self$obj)) {
- warning("Object is NULL.")
- return(FALSE)
- }
- if(!methods::is(self$obj, "Seurat")) {
- warning("Object is not of type Seurat.")
- success <- FALSE
- }
- if(!(self$assay %in% names(self$obj@assays))) {
- warning("Specified assay not present in Seurat object assays slot.")
- success <- FALSE
- }
- if(!is_na(self$cell_embeddings) && !all(self$cell_embeddings %in% names(self$obj@reductions))) {
- warning("Specified cell_embeddings not all present in Seurat object reductions slot.")
- success <- FALSE
- }
- if(!is_na(self$cell_set_metas) && !all(self$cell_set_metas %in% colnames(self$obj@meta.data))) {
- warning("Specified cell_set_metas not all present in columns of the Seurat object meta.data data frame.")
- success <- FALSE
- }
- return(success)
- },
- #' @description
- #' Get the path to the zarr store, relative to the current directory.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A path as a string.
- get_zarr_path = function(dataset_uid, obj_i) {
- out_dir <- super$get_out_dir(dataset_uid, obj_i)
- zarr_filepath <- file.path(out_dir, self$zarr_folder)
- return(zarr_filepath)
- },
- #' @description
- #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
- #' @param base_url The base URL, on which the route will be served.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A URL as a string.
- get_zarr_url = function(base_url, dataset_uid, obj_i) {
- return(super$get_url(base_url, dataset_uid, obj_i, self$zarr_folder))
- },
- #' @description
- #' Create the JSON output files, web server routes, and file definition creators.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- convert_and_save = function(dataset_uid, obj_i) {
- super$convert_and_save(dataset_uid, obj_i)
-
- zarr_filepath <- self$get_zarr_path(dataset_uid, obj_i)
- if(!file.exists(zarr_filepath) || !self$use_cache) {
- seurat_to_anndata_zarr(self$obj, out_path = zarr_filepath, assay = self$assay)
- }
-
- # Get the file definition creator functions.
- cells_file_creator <- self$make_cells_file_def_creator(dataset_uid, obj_i)
- cell_sets_file_creator <- self$make_cell_sets_file_def_creator(dataset_uid, obj_i)
- expression_matrix_file_creator <- self$make_expression_matrix_file_def_creator(dataset_uid, obj_i)
-
- # Append the new file definition creators functions to the main list.
- self$file_def_creators <- append(self$file_def_creators, cells_file_creator)
- self$file_def_creators <- append(self$file_def_creators, cell_sets_file_creator)
- self$file_def_creators <- append(self$file_def_creators, expression_matrix_file_creator)
-
- # Create a web server route object for the directory of JSON files.
- self$routes <- append(self$routes, self$get_out_dir_route(dataset_uid, obj_i))
- },
- #' @description
- #' Make the file definition creator function for the cells data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cells_file_def_creator = function(dataset_uid, obj_i) {
- get_cells <- function(base_url) {
- options <- obj_list()
- if(!is_na(self$cell_embeddings)) {
- options[['mappings']] <- obj_list()
- for(i in seq_len(length(self$cell_embeddings))) {
- embedding_key <- self$cell_embeddings[i]
- if(!is_na(self$cell_embedding_names)) {
- embedding_name <- self$cell_embedding_names[i]
- } else {
- embedding_name <- embedding_key
- }
- if(!is_na(self$cell_embedding_dims)) {
- embedding_dims <- self$cell_embedding_dims[i]
- } else {
- embedding_dims <- c(0, 1)
- }
- options[['mappings']][[embedding_name]] <- obj_list(
- key = paste0("obsm/X_", embedding_key),
- dims = embedding_dims
- )
- }
- }
- file_def <- list(
- type = DataType$CELLS,
- fileType = FileType$ANNDATA_CELLS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cells)
- },
- #' @description
- #' Make the file definition creator function for the cell sets data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cell_sets_file_def_creator = function(dataset_uid, obj_i) {
- get_cell_sets <- function(base_url) {
- options <- list()
- if(!is_na(self$cell_set_metas)) {
- for(i in seq_len(length(self$cell_set_metas))) {
- cell_set_key <- self$cell_set_metas[i]
- if(!is_na(self$cell_set_meta_names)) {
- group_name <- self$cell_set_meta_names[i]
- } else {
- group_name <- cell_set_key
- }
-
- cell_set_def <- obj_list(
- groupName = group_name,
- setName = paste0("obs/", cell_set_key)
- )
- if(!is_na(self$cell_set_meta_scores)) {
- score_name <- self$cell_set_meta_scores[i]
- # TODO: uncomment
- #cell_set_def[['scoreName']] <- score_name
- }
- options <- append(options, list(cell_set_def))
- }
- }
- file_def <- list(
- type = DataType$CELL_SETS,
- fileType = FileType$ANNDATA_CELL_SETS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cell_sets)
- },
- #' @description
- #' Make the file definition creator function for the expression matrix data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_expression_matrix_file_def_creator = function(dataset_uid, obj_i) {
- get_expression_matrix <- function(base_url) {
- options = obj_list(
- matrix = "X"
- )
- file_def <- list(
- type = DataType$EXPRESSION_MATRIX,
- fileType = FileType$ANNDATA_EXPRESSION_MATRIX_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_expression_matrix)
- }
- ),
-)
diff --git a/R/wrappers_spe.R b/R/wrappers_spe.R
deleted file mode 100644
index d23270a..0000000
--- a/R/wrappers_spe.R
+++ /dev/null
@@ -1,319 +0,0 @@
-#' SpatialExperiment object wrapper class
-#' @title SPEWrapper Class
-#' @docType class
-#' @description
-#' Class representing a local SpatialExperiment object in a Vitessce dataset.
-#'
-#' @rdname SPEWrapper
-#' @export
-#' @examples
-#' obj <- get_spe_obj()
-#' w <- SPEWrapper$new(
-#' obj,
-#' sample_id = "sample1",
-#' image_id = "image1"
-#' )
-SPEWrapper <- R6::R6Class("SPEWrapper",
- inherit = AbstractWrapper,
- public = list(
- #' @field obj The object to wrap.
- #' @keywords internal
- obj = NULL,
- #' @field img_sample_id The sample_id for the image of interest.
- #' @keywords internal
- img_sample_id = NULL,
- #' @field img_image_id The image_id for the image of interest.
- #' @keywords internal
- img_image_id = NULL,
- #' @field cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embeddings = NULL,
- #' @field cell_embedding_names Names
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_names = NULL,
- #' @field cell_embedding_dims The dimension indices
- #' to use for creating dimensionality reduction mappings.
- #' @keywords internal
- cell_embedding_dims = NULL,
- #' @field cell_set_metas The keys in the Seurat object's meta.data
- #' to use for creating cell sets.
- #' @keywords internal
- cell_set_metas = NULL,
- #' @field cell_set_meta_names The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to new names.
- #' @keywords internal
- cell_set_meta_names = NULL,
- #' @field cell_set_meta_scores The keys in the Seurat object's meta.data
- #' to use for cell set names mapped to keys for scores.
- #' @keywords internal
- cell_set_meta_scores = NULL,
- #' @field zarr_folder The name for the folder at the root of the zarr store.
- #' @keywords internal
- zarr_folder = NULL,
- #' @field img_filename The name for the folder at the root of the zarr store for the image.
- #' @keywords internal
- img_filename = NULL,
- #' @description
- #' Create a wrapper around a Seurat object.
- #' @param obj The object to wrap.
- #' @param sample_id The sample_id for the image of interest.
- #' @param image_id The image_id for the image of interest.
- #' @param cell_embeddings The keys in the Seurat object's reductions/cell.embeddings
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_names Names
- #' to use for creating dimensionality reduction plots.
- #' @param cell_embedding_dims An array of dimension indices to use for each cell_embedding.
- #' @param cell_set_metas An optional list of keys in the object's meta.data
- #' list to use for creating cell sets.
- #' @param cell_set_meta_names If cell_set_metas is provided, this list can
- #' also be provided to set new names to replace
- #' the keys in the interface.
- #' @param cell_set_meta_scores If cell_set_metas is provided, this list can
- #' also be provided to map between meta.data keys for set annotations
- #' and keys for annotation scores.
- #' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `SPEWrapper` object.
- initialize = function(obj, sample_id = NA, image_id = NA, cell_embeddings = NA, cell_embedding_names = NA, cell_embedding_dims = NA, cell_set_metas = NA, cell_set_meta_names = NA, cell_set_meta_scores = NA, ...) {
- super$initialize(...)
- self$obj <- obj
- if(is_na(sample_id) && is_na(image_id)) {
- img_df <- SpatialExperiment::imgData(obj)
- if(nrow(img_df) >= 1) {
- warning("sample_id and image_id not provided, using first image in imgData")
- self$img_sample_id <- img_df[1, "sample_id"]
- self$img_image_id <- img_df[1, "image_id"]
- }
- } else {
- self$img_sample_id <- sample_id
- self$img_image_id <- image_id
- }
-
- self$cell_embeddings <- cell_embeddings
- self$cell_embedding_names <- cell_embedding_names
- self$cell_embedding_dims <- cell_embedding_dims
- self$cell_set_metas <- cell_set_metas
- self$cell_set_meta_names <- cell_set_meta_names
- self$cell_set_meta_scores <- cell_set_meta_scores
-
- self$zarr_folder <- "spe.zarr"
- self$img_filename <- paste0(self$img_sample_id, "__", self$img_image_id, ".zarr")
-
- self$check_obj()
- },
- #' @description
- #' Check that the object is valid
- #' @keywords internal
- #' @return Success or failure.
- check_obj = function() {
- success <- TRUE
- if(!methods::is(self$obj, "SpatialExperiment")) {
- warning("Object is not of type SpatialExperiment.")
- success <- FALSE
- }
- if(!is_na(self$cell_embeddings) && !all(self$cell_embeddings %in% SingleCellExperiment::reducedDimNames(self$obj))) {
- warning("Specified cell_embeddings not all present in SPE object reducedDims.")
- success <- FALSE
- }
- if(!is_na(self$cell_set_metas) && !all(self$cell_set_metas %in% colnames(SingleCellExperiment::colData(self$obj)))) {
- warning("Specified cell_set_metas not all present in SPE object colData.")
- success <- FALSE
- }
- img_df <- SpatialExperiment::imgData(self$obj)
- if(!is_na(self$img_sample_id) && !is_na(self$img_image_id) && !(self$img_sample_id %in% img_df$sample_id && self$img_image_id %in% img_df$image_id)) {
- warning("Specified sample_id and/or image_id not present in SPE object imgData.")
- success <- FALSE
- }
- return(success)
- },
- #' @description
- #' Get the path to the zarr store, relative to the current directory.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A path as a string.
- get_zarr_path = function(dataset_uid, obj_i) {
- out_dir <- super$get_out_dir(dataset_uid, obj_i)
- zarr_filepath <- file.path(out_dir, self$zarr_folder)
- return(zarr_filepath)
- },
- #' @description
- #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
- #' @param base_url The base URL, on which the route will be served.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A URL as a string.
- get_zarr_url = function(base_url, dataset_uid, obj_i) {
- return(super$get_url(base_url, dataset_uid, obj_i, self$zarr_folder))
- },
- #' @description
- #' Get the path to the image Zarr store, relative to the current directory.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A path as a string.
- get_img_path = function(dataset_uid, obj_i) {
- out_dir <- super$get_out_dir(dataset_uid, obj_i)
- zarr_filepath <- file.path(out_dir, self$img_filename)
- return(zarr_filepath)
- },
- #' @description
- #' Get the URL to the image Zarr store, to fill in the file URL in the file definitions.
- #' @param base_url The base URL, on which the route will be served.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @keywords internal
- #' @return A URL as a string.
- get_img_url = function(base_url, dataset_uid, obj_i) {
- return(super$get_url(base_url, dataset_uid, obj_i, self$img_filename))
- },
- #' @description
- #' Create the JSON output files, web server routes, and file definition creators.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- convert_and_save = function(dataset_uid, obj_i) {
- super$convert_and_save(dataset_uid, obj_i)
-
- zarr_filepath <- self$get_zarr_path(dataset_uid, obj_i)
- img_filepath <- self$get_img_path(dataset_uid, obj_i)
- if(!file.exists(zarr_filepath) || !file.exists(img_filepath) || !self$use_cache) {
- spe_to_anndata_zarr(self$obj, out_path = zarr_filepath)
- spe_to_ome_zarr(self$obj, sample_id = self$img_sample_id, image_id = self$img_image_id, out_path = img_filepath)
- }
-
- # Get the file definition creator functions.
- cells_file_creator <- self$make_cells_file_def_creator(dataset_uid, obj_i)
- cell_sets_file_creator <- self$make_cell_sets_file_def_creator(dataset_uid, obj_i)
- expression_matrix_file_creator <- self$make_expression_matrix_file_def_creator(dataset_uid, obj_i)
- raster_file_creator <- self$make_raster_file_def_creator(dataset_uid, obj_i)
-
- # Append the new file definition creators functions to the main list.
- if(!is_na(self$cell_embeddings)) {
- self$file_def_creators <- append(self$file_def_creators, cells_file_creator)
- }
- if(!is_na(self$cell_set_metas)) {
- self$file_def_creators <- append(self$file_def_creators, cell_sets_file_creator)
- }
- self$file_def_creators <- append(self$file_def_creators, expression_matrix_file_creator)
- self$file_def_creators <- append(self$file_def_creators, raster_file_creator)
-
- # Create a web server route object for the directory of JSON files.
- self$routes <- append(self$routes, self$get_out_dir_route(dataset_uid, obj_i))
- },
- #' @description
- #' Make the file definition creator function for the cells data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cells_file_def_creator = function(dataset_uid, obj_i) {
- get_cells <- function(base_url) {
- options <- obj_list()
- if(!is_na(self$cell_embeddings)) {
- options[['mappings']] <- obj_list()
- for(i in seq_len(length(self$cell_embeddings))) {
- embedding_key <- self$cell_embeddings[i]
- if(!is_na(self$cell_embedding_names)) {
- embedding_name <- self$cell_embedding_names[i]
- } else {
- embedding_name <- embedding_key
- }
- if(!is_na(self$cell_embedding_dims)) {
- embedding_dims <- self$cell_embedding_dims[i]
- } else {
- embedding_dims <- c(0, 1)
- }
- options[['mappings']][[embedding_name]] <- obj_list(
- key = paste0("obsm/", embedding_key),
- dims = embedding_dims
- )
- }
- }
- file_def <- list(
- type = DataType$CELLS,
- fileType = FileType$ANNDATA_CELLS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cells)
- },
- #' @description
- #' Make the file definition creator function for the cell sets data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_cell_sets_file_def_creator = function(dataset_uid, obj_i) {
- get_cell_sets <- function(base_url) {
- options <- list()
- if(!is_na(self$cell_set_metas)) {
- for(i in seq_len(length(self$cell_set_metas))) {
- cell_set_key <- self$cell_set_metas[i]
- if(!is_na(self$cell_set_meta_names)) {
- group_name <- self$cell_set_meta_names[i]
- } else {
- group_name <- cell_set_key
- }
-
- cell_set_def <- obj_list(
- groupName = group_name,
- setName = paste0("obs/", cell_set_key)
- )
- if(!is_na(self$cell_set_meta_scores)) {
- score_name <- self$cell_set_meta_scores[i]
- # TODO: uncomment
- #cell_set_def[['scoreName']] <- score_name
- }
- options <- append(options, list(cell_set_def))
- }
- }
- file_def <- list(
- type = DataType$CELL_SETS,
- fileType = FileType$ANNDATA_CELL_SETS_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_cell_sets)
- },
- #' @description
- #' Make the file definition creator function for the expression matrix data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_expression_matrix_file_def_creator = function(dataset_uid, obj_i) {
- get_expression_matrix <- function(base_url) {
- options = obj_list(
- matrix = "X"
- )
- file_def <- list(
- type = DataType$EXPRESSION_MATRIX,
- fileType = FileType$ANNDATA_EXPRESSION_MATRIX_ZARR,
- url = self$get_zarr_url(base_url, dataset_uid, obj_i),
- options = options
- )
- return(file_def)
- }
- return(get_expression_matrix)
- },
- #' @description
- #' Make the file definition creator function for the raster data type.
- #' @param dataset_uid The ID for this dataset.
- #' @param obj_i The index of this data object within the dataset.
- #' @return A file definition creator function which takes a `base_url` parameter.
- make_raster_file_def_creator = function(dataset_uid, obj_i) {
- get_raster <- function(base_url) {
- file_def <- list(
- type = DataType$RASTER,
- fileType = FileType$RASTER_OME_ZARR,
- url = self$get_img_url(base_url, dataset_uid, obj_i)
- )
- return(file_def)
- }
- return(get_raster)
- }
- ),
-)
diff --git a/man/AbstractWrapper.Rd b/man/AbstractWrapper.Rd
index 143708e..6f57f3e 100644
--- a/man/AbstractWrapper.Rd
+++ b/man/AbstractWrapper.Rd
@@ -23,6 +23,8 @@ Abstract dataset object wrapper class
\item{\code{routes}}{A list of \code{VitessceConfigServerRoute} objects.}
\item{\code{file_def_creators}}{A list of file definition creator functions.}
+
+\item{\code{base_dir}}{The base directory for local data.}
}
\if{html}{\out{}}
}
@@ -34,7 +36,10 @@ Abstract dataset object wrapper class
\item \href{#method-AbstractWrapper-get_routes}{\code{AbstractWrapper$get_routes()}}
\item \href{#method-AbstractWrapper-get_file_defs}{\code{AbstractWrapper$get_file_defs()}}
\item \href{#method-AbstractWrapper-get_out_dir_route}{\code{AbstractWrapper$get_out_dir_route()}}
+\item \href{#method-AbstractWrapper-get_local_dir_url}{\code{AbstractWrapper$get_local_dir_url()}}
+\item \href{#method-AbstractWrapper-get_local_dir_route}{\code{AbstractWrapper$get_local_dir_route()}}
\item \href{#method-AbstractWrapper-get_url}{\code{AbstractWrapper$get_url()}}
+\item \href{#method-AbstractWrapper-get_url_simple}{\code{AbstractWrapper$get_url_simple()}}
\item \href{#method-AbstractWrapper-get_route_str}{\code{AbstractWrapper$get_route_str()}}
\item \href{#method-AbstractWrapper-get_out_dir}{\code{AbstractWrapper$get_out_dir()}}
\item \href{#method-AbstractWrapper-auto_view_config}{\code{AbstractWrapper$auto_view_config()}}
@@ -72,7 +77,7 @@ Each function added to this list should take in a base URL and generate a Vitess
If this wrapper is wrapping local data, then create routes and fill in the routes array.
This method is void, should not return anything.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{AbstractWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{}}\preformatted{AbstractWrapper$convert_and_save(dataset_uid, obj_i, base_dir = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -81,6 +86,8 @@ This method is void, should not return anything.
\item{\code{dataset_uid}}{A unique identifier for this dataset.}
\item{\code{obj_i}}{Within the dataset, the index of this data wrapper object.}
+
+\item{\code{base_dir}}{Path to a base directory.}
}
\if{html}{\out{}}
}
@@ -139,6 +146,35 @@ Create a web server route for this object.
\subsection{Returns}{
A new \code{VitessceConfigServerStaticRoute} instance.
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_dir_url}{}}}
+\subsection{Method \code{get_local_dir_url()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_dir_url(
+ base_url,
+ dataset_uid,
+ obj_i,
+ local_dir_path,
+ local_dir_uid
+)}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_dir_route}{}}}
+\subsection{Method \code{get_local_dir_route()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_dir_route(
+ dataset_uid,
+ obj_i,
+ local_dir_path,
+ local_dir_uid
+)}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{}}
@@ -165,6 +201,15 @@ Create a local web server URL for a dataset object.
\subsection{Returns}{
A URL as a string.
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_url_simple}{}}}
+\subsection{Method \code{get_url_simple()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{AbstractWrapper$get_url_simple(base_url, suffix)}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{}}
diff --git a/man/CoordinationType.Rd b/man/CoordinationType.Rd
index 9c87d9a..9619756 100644
--- a/man/CoordinationType.Rd
+++ b/man/CoordinationType.Rd
@@ -5,7 +5,7 @@
\alias{CoordinationType}
\title{Enumeration of Coordination Type values}
\format{
-An object of class \code{list} of length 32.
+An object of class \code{list} of length 34.
}
\usage{
CoordinationType
diff --git a/man/FileType.Rd b/man/FileType.Rd
index 54a0641..c5810d3 100644
--- a/man/FileType.Rd
+++ b/man/FileType.Rd
@@ -5,7 +5,7 @@
\alias{FileType}
\title{Enumeration of File Type values}
\format{
-An object of class \code{list} of length 11.
+An object of class \code{list} of length 12.
}
\usage{
FileType
diff --git a/man/GiottoWrapper.Rd b/man/GiottoWrapper.Rd
deleted file mode 100644
index 126c0b7..0000000
--- a/man/GiottoWrapper.Rd
+++ /dev/null
@@ -1,290 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/wrappers_giotto.R
-\docType{class}
-\name{GiottoWrapper}
-\alias{GiottoWrapper}
-\title{GiottoWrapper Class}
-\description{
-Class representing a local Giotto object in a Vitessce dataset.
-}
-\details{
-Giotto object wrapper class
-}
-\examples{
-obj <- get_giotto_obj()
-w <- GiottoWrapper$new(
- obj,
- cell_embeddings = c("pca"),
- cell_embedding_names = c("PCA")
-)
-}
-\keyword{internal}
-\section{Super class}{
-\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{GiottoWrapper}
-}
-\section{Public fields}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_dims}}{The dimension indices
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_set_metas}}{The keys in the Seurat object's meta.data
-to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to new names.}
-
-\item{\code{cell_set_meta_scores}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to keys for scores.}
-
-\item{\code{zarr_folder}}{The name for the folder at the root of the zarr store.}
-}
-\if{html}{\out{
}}
-}
-\section{Methods}{
-\subsection{Public methods}{
-\itemize{
-\item \href{#method-GiottoWrapper-new}{\code{GiottoWrapper$new()}}
-\item \href{#method-GiottoWrapper-check_obj}{\code{GiottoWrapper$check_obj()}}
-\item \href{#method-GiottoWrapper-get_zarr_path}{\code{GiottoWrapper$get_zarr_path()}}
-\item \href{#method-GiottoWrapper-get_zarr_url}{\code{GiottoWrapper$get_zarr_url()}}
-\item \href{#method-GiottoWrapper-convert_and_save}{\code{GiottoWrapper$convert_and_save()}}
-\item \href{#method-GiottoWrapper-make_cells_file_def_creator}{\code{GiottoWrapper$make_cells_file_def_creator()}}
-\item \href{#method-GiottoWrapper-make_cell_sets_file_def_creator}{\code{GiottoWrapper$make_cell_sets_file_def_creator()}}
-\item \href{#method-GiottoWrapper-make_expression_matrix_file_def_creator}{\code{GiottoWrapper$make_expression_matrix_file_def_creator()}}
-\item \href{#method-GiottoWrapper-clone}{\code{GiottoWrapper$clone()}}
-}
-}
-\if{html}{\out{
-Inherited methods
-
-
-}}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-new}{}}}
-\subsection{Method \code{new()}}{
-Create a wrapper around a Seurat object.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$new(
- obj,
- cell_embeddings = NA,
- cell_embedding_names = NA,
- cell_embedding_dims = NA,
- cell_set_metas = NA,
- cell_set_meta_names = NA,
- cell_set_meta_scores = NA,
- ...
-)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_dims}}{An array of dimension indices to use for each cell_embedding.}
-
-\item{\code{cell_set_metas}}{An optional list of keys in the object's meta.data
-list to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{If cell_set_metas is provided, this list can
-also be provided to set new names to replace
-the keys in the interface.}
-
-\item{\code{cell_set_meta_scores}}{If cell_set_metas is provided, this list can
-also be provided to map between meta.data keys for set annotations
-and keys for annotation scores.}
-
-\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A new \code{GiottoWrapper} object.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-check_obj}{}}}
-\subsection{Method \code{check_obj()}}{
-Check that the object is valid
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$check_obj()}\if{html}{\out{
}}
-}
-
-\subsection{Returns}{
-Success or failure.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-get_zarr_path}{}}}
-\subsection{Method \code{get_zarr_path()}}{
-Get the path to the zarr store, relative to the current directory.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$get_zarr_path(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A path as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-get_zarr_url}{}}}
-\subsection{Method \code{get_zarr_url()}}{
-Get the URL to the Zarr store, to fill in the file URL in the file definitions.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$get_zarr_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{base_url}}{The base URL, on which the route will be served.}
-
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A URL as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-convert_and_save}{}}}
-\subsection{Method \code{convert_and_save()}}{
-Create the JSON output files, web server routes, and file definition creators.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-make_cells_file_def_creator}{}}}
-\subsection{Method \code{make_cells_file_def_creator()}}{
-Make the file definition creator function for the cells data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$make_cells_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-make_cell_sets_file_def_creator}{}}}
-\subsection{Method \code{make_cell_sets_file_def_creator()}}{
-Make the file definition creator function for the cell sets data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$make_cell_sets_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-make_expression_matrix_file_def_creator}{}}}
-\subsection{Method \code{make_expression_matrix_file_def_creator()}}{
-Make the file definition creator function for the expression matrix data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$make_expression_matrix_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-GiottoWrapper-clone}{}}}
-\subsection{Method \code{clone()}}{
-The objects of this class are cloneable with this method.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{GiottoWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{deep}}{Whether to make a deep clone.}
-}
-\if{html}{\out{
}}
-}
-}
-}
diff --git a/man/MultiImageWrapper.Rd b/man/MultiImageWrapper.Rd
index da656a0..64a65f0 100644
--- a/man/MultiImageWrapper.Rd
+++ b/man/MultiImageWrapper.Rd
@@ -38,11 +38,14 @@ Image wrapper class
}}
diff --git a/man/OmeTiffWrapper.Rd b/man/OmeTiffWrapper.Rd
index dbd410f..3a8bf3e 100644
--- a/man/OmeTiffWrapper.Rd
+++ b/man/OmeTiffWrapper.Rd
@@ -40,6 +40,8 @@ this image (see http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-ma
\item \href{#method-OmeTiffWrapper-make_raster_routes}{\code{OmeTiffWrapper$make_raster_routes()}}
\item \href{#method-OmeTiffWrapper-make_image_def}{\code{OmeTiffWrapper$make_image_def()}}
\item \href{#method-OmeTiffWrapper-make_raster_file_def_creator}{\code{OmeTiffWrapper$make_raster_file_def_creator()}}
+\item \href{#method-OmeTiffWrapper-create_image_json}{\code{OmeTiffWrapper$create_image_json()}}
+\item \href{#method-OmeTiffWrapper-get_img_url}{\code{OmeTiffWrapper$get_img_url()}}
\item \href{#method-OmeTiffWrapper-clone}{\code{OmeTiffWrapper$clone()}}
}
}
@@ -48,11 +50,14 @@ this image (see http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-ma
}}
@@ -102,7 +107,7 @@ A new \code{OmeTiffWrapper} object.
\subsection{Method \code{convert_and_save()}}{
Create the web server routes and file definition creators.
\subsection{Usage}{
-\if{html}{\out{}}\preformatted{OmeTiffWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{}}\preformatted{OmeTiffWrapper$convert_and_save(dataset_uid, obj_i, base_dir = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -182,6 +187,24 @@ Make the file definition creator function for the raster data type.
\subsection{Returns}{
A file definition creator function which takes a \code{base_url} parameter.
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-OmeTiffWrapper-create_image_json}{}}}
+\subsection{Method \code{create_image_json()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{OmeTiffWrapper$create_image_json(img_url, offsets_url = NA)}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-OmeTiffWrapper-get_img_url}{}}}
+\subsection{Method \code{get_img_url()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{OmeTiffWrapper$get_img_url(base_url = "", dataset_uid = "", obj_i = "")}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{}}
diff --git a/man/SCEWrapper.Rd b/man/SCEWrapper.Rd
deleted file mode 100644
index 51d607a..0000000
--- a/man/SCEWrapper.Rd
+++ /dev/null
@@ -1,290 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/wrappers_sce.R
-\docType{class}
-\name{SCEWrapper}
-\alias{SCEWrapper}
-\title{SCEWrapper Class}
-\description{
-Class representing a local SingleCellExperiment object in a Vitessce dataset.
-}
-\details{
-SingleCellExperiment object wrapper class
-}
-\examples{
-obj <- get_sce_obj()
-w <- SCEWrapper$new(
- obj,
- cell_embeddings = c("pca"),
- cell_embedding_names = c("PCA")
-)
-}
-\keyword{internal}
-\section{Super class}{
-\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{SCEWrapper}
-}
-\section{Public fields}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_dims}}{The dimension indices
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_set_metas}}{The keys in the Seurat object's meta.data
-to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to new names.}
-
-\item{\code{cell_set_meta_scores}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to keys for scores.}
-
-\item{\code{zarr_folder}}{The name for the folder at the root of the zarr store.}
-}
-\if{html}{\out{
}}
-}
-\section{Methods}{
-\subsection{Public methods}{
-\itemize{
-\item \href{#method-SCEWrapper-new}{\code{SCEWrapper$new()}}
-\item \href{#method-SCEWrapper-check_obj}{\code{SCEWrapper$check_obj()}}
-\item \href{#method-SCEWrapper-get_zarr_path}{\code{SCEWrapper$get_zarr_path()}}
-\item \href{#method-SCEWrapper-get_zarr_url}{\code{SCEWrapper$get_zarr_url()}}
-\item \href{#method-SCEWrapper-convert_and_save}{\code{SCEWrapper$convert_and_save()}}
-\item \href{#method-SCEWrapper-make_cells_file_def_creator}{\code{SCEWrapper$make_cells_file_def_creator()}}
-\item \href{#method-SCEWrapper-make_cell_sets_file_def_creator}{\code{SCEWrapper$make_cell_sets_file_def_creator()}}
-\item \href{#method-SCEWrapper-make_expression_matrix_file_def_creator}{\code{SCEWrapper$make_expression_matrix_file_def_creator()}}
-\item \href{#method-SCEWrapper-clone}{\code{SCEWrapper$clone()}}
-}
-}
-\if{html}{\out{
-Inherited methods
-
-
-}}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-new}{}}}
-\subsection{Method \code{new()}}{
-Create a wrapper around a Seurat object.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$new(
- obj,
- cell_embeddings = NA,
- cell_embedding_names = NA,
- cell_embedding_dims = NA,
- cell_set_metas = NA,
- cell_set_meta_names = NA,
- cell_set_meta_scores = NA,
- ...
-)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_dims}}{An array of dimension indices to use for each cell_embedding.}
-
-\item{\code{cell_set_metas}}{An optional list of keys in the object's meta.data
-list to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{If cell_set_metas is provided, this list can
-also be provided to set new names to replace
-the keys in the interface.}
-
-\item{\code{cell_set_meta_scores}}{If cell_set_metas is provided, this list can
-also be provided to map between meta.data keys for set annotations
-and keys for annotation scores.}
-
-\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A new \code{SCEWrapper} object.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-check_obj}{}}}
-\subsection{Method \code{check_obj()}}{
-Check that the object is valid
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$check_obj()}\if{html}{\out{
}}
-}
-
-\subsection{Returns}{
-Success or failure.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-get_zarr_path}{}}}
-\subsection{Method \code{get_zarr_path()}}{
-Get the path to the zarr store, relative to the current directory.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$get_zarr_path(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A path as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-get_zarr_url}{}}}
-\subsection{Method \code{get_zarr_url()}}{
-Get the URL to the Zarr store, to fill in the file URL in the file definitions.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$get_zarr_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{base_url}}{The base URL, on which the route will be served.}
-
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A URL as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-convert_and_save}{}}}
-\subsection{Method \code{convert_and_save()}}{
-Create the JSON output files, web server routes, and file definition creators.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-make_cells_file_def_creator}{}}}
-\subsection{Method \code{make_cells_file_def_creator()}}{
-Make the file definition creator function for the cells data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$make_cells_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-make_cell_sets_file_def_creator}{}}}
-\subsection{Method \code{make_cell_sets_file_def_creator()}}{
-Make the file definition creator function for the cell sets data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$make_cell_sets_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-make_expression_matrix_file_def_creator}{}}}
-\subsection{Method \code{make_expression_matrix_file_def_creator()}}{
-Make the file definition creator function for the expression matrix data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$make_expression_matrix_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SCEWrapper-clone}{}}}
-\subsection{Method \code{clone()}}{
-The objects of this class are cloneable with this method.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SCEWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{deep}}{Whether to make a deep clone.}
-}
-\if{html}{\out{
}}
-}
-}
-}
diff --git a/man/SPEWrapper.Rd b/man/SPEWrapper.Rd
deleted file mode 100644
index cdd97d1..0000000
--- a/man/SPEWrapper.Rd
+++ /dev/null
@@ -1,373 +0,0 @@
-% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/wrappers_spe.R
-\docType{class}
-\name{SPEWrapper}
-\alias{SPEWrapper}
-\title{SPEWrapper Class}
-\description{
-Class representing a local SpatialExperiment object in a Vitessce dataset.
-}
-\details{
-SpatialExperiment object wrapper class
-}
-\examples{
-obj <- get_spe_obj()
-w <- SPEWrapper$new(
- obj,
- sample_id = "sample1",
- image_id = "image1"
-)
-}
-\keyword{internal}
-\section{Super class}{
-\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{SPEWrapper}
-}
-\section{Public fields}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{img_sample_id}}{The sample_id for the image of interest.}
-
-\item{\code{img_image_id}}{The image_id for the image of interest.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_dims}}{The dimension indices
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_set_metas}}{The keys in the Seurat object's meta.data
-to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to new names.}
-
-\item{\code{cell_set_meta_scores}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to keys for scores.}
-
-\item{\code{zarr_folder}}{The name for the folder at the root of the zarr store.}
-
-\item{\code{img_filename}}{The name for the folder at the root of the zarr store for the image.}
-}
-\if{html}{\out{
}}
-}
-\section{Methods}{
-\subsection{Public methods}{
-\itemize{
-\item \href{#method-SPEWrapper-new}{\code{SPEWrapper$new()}}
-\item \href{#method-SPEWrapper-check_obj}{\code{SPEWrapper$check_obj()}}
-\item \href{#method-SPEWrapper-get_zarr_path}{\code{SPEWrapper$get_zarr_path()}}
-\item \href{#method-SPEWrapper-get_zarr_url}{\code{SPEWrapper$get_zarr_url()}}
-\item \href{#method-SPEWrapper-get_img_path}{\code{SPEWrapper$get_img_path()}}
-\item \href{#method-SPEWrapper-get_img_url}{\code{SPEWrapper$get_img_url()}}
-\item \href{#method-SPEWrapper-convert_and_save}{\code{SPEWrapper$convert_and_save()}}
-\item \href{#method-SPEWrapper-make_cells_file_def_creator}{\code{SPEWrapper$make_cells_file_def_creator()}}
-\item \href{#method-SPEWrapper-make_cell_sets_file_def_creator}{\code{SPEWrapper$make_cell_sets_file_def_creator()}}
-\item \href{#method-SPEWrapper-make_expression_matrix_file_def_creator}{\code{SPEWrapper$make_expression_matrix_file_def_creator()}}
-\item \href{#method-SPEWrapper-make_raster_file_def_creator}{\code{SPEWrapper$make_raster_file_def_creator()}}
-\item \href{#method-SPEWrapper-clone}{\code{SPEWrapper$clone()}}
-}
-}
-\if{html}{\out{
-Inherited methods
-
-
-}}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-new}{}}}
-\subsection{Method \code{new()}}{
-Create a wrapper around a Seurat object.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$new(
- obj,
- sample_id = NA,
- image_id = NA,
- cell_embeddings = NA,
- cell_embedding_names = NA,
- cell_embedding_dims = NA,
- cell_set_metas = NA,
- cell_set_meta_names = NA,
- cell_set_meta_scores = NA,
- ...
-)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{sample_id}}{The sample_id for the image of interest.}
-
-\item{\code{image_id}}{The image_id for the image of interest.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_dims}}{An array of dimension indices to use for each cell_embedding.}
-
-\item{\code{cell_set_metas}}{An optional list of keys in the object's meta.data
-list to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{If cell_set_metas is provided, this list can
-also be provided to set new names to replace
-the keys in the interface.}
-
-\item{\code{cell_set_meta_scores}}{If cell_set_metas is provided, this list can
-also be provided to map between meta.data keys for set annotations
-and keys for annotation scores.}
-
-\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A new \code{SPEWrapper} object.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-check_obj}{}}}
-\subsection{Method \code{check_obj()}}{
-Check that the object is valid
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$check_obj()}\if{html}{\out{
}}
-}
-
-\subsection{Returns}{
-Success or failure.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-get_zarr_path}{}}}
-\subsection{Method \code{get_zarr_path()}}{
-Get the path to the zarr store, relative to the current directory.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$get_zarr_path(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A path as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-get_zarr_url}{}}}
-\subsection{Method \code{get_zarr_url()}}{
-Get the URL to the Zarr store, to fill in the file URL in the file definitions.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$get_zarr_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{base_url}}{The base URL, on which the route will be served.}
-
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A URL as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-get_img_path}{}}}
-\subsection{Method \code{get_img_path()}}{
-Get the path to the image Zarr store, relative to the current directory.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$get_img_path(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A path as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-get_img_url}{}}}
-\subsection{Method \code{get_img_url()}}{
-Get the URL to the image Zarr store, to fill in the file URL in the file definitions.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$get_img_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{base_url}}{The base URL, on which the route will be served.}
-
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A URL as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-convert_and_save}{}}}
-\subsection{Method \code{convert_and_save()}}{
-Create the JSON output files, web server routes, and file definition creators.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-make_cells_file_def_creator}{}}}
-\subsection{Method \code{make_cells_file_def_creator()}}{
-Make the file definition creator function for the cells data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$make_cells_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-make_cell_sets_file_def_creator}{}}}
-\subsection{Method \code{make_cell_sets_file_def_creator()}}{
-Make the file definition creator function for the cell sets data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$make_cell_sets_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-make_expression_matrix_file_def_creator}{}}}
-\subsection{Method \code{make_expression_matrix_file_def_creator()}}{
-Make the file definition creator function for the expression matrix data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$make_expression_matrix_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-make_raster_file_def_creator}{}}}
-\subsection{Method \code{make_raster_file_def_creator()}}{
-Make the file definition creator function for the raster data type.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$make_raster_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SPEWrapper-clone}{}}}
-\subsection{Method \code{clone()}}{
-The objects of this class are cloneable with this method.
-\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SPEWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{}}
-\describe{
-\item{\code{deep}}{Whether to make a deep clone.}
-}
-\if{html}{\out{
}}
-}
-}
-}
diff --git a/man/SeuratWrapper.Rd b/man/SeuratWrapper.Rd
index 5b928ad..139b693 100644
--- a/man/SeuratWrapper.Rd
+++ b/man/SeuratWrapper.Rd
@@ -1,8 +1,8 @@
% Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/wrappers_seurat.R
+% Please edit documentation in R/wrappers_anndata.R
\docType{class}
-\name{SeuratWrapper}
-\alias{SeuratWrapper}
+\name{AnnDataWrapper}
+\alias{AnnDataWrapper}
\title{SeuratWrapper Class}
\description{
Class representing a local Seurat object in a Vitessce dataset.
@@ -20,49 +20,28 @@ w <- SeuratWrapper$new(
}
\keyword{internal}
\section{Super class}{
-\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{SeuratWrapper}
+\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{AnnDataWrapper}
}
\section{Public fields}{
\if{html}{\out{}}
\describe{
-\item{\code{obj}}{The object to wrap.}
+\item{\code{adata_path}}{The object to wrap.}
-\item{\code{assay}}{The assay name in the Seurat object.}
+\item{\code{adata_url}}{The object to wrap.}
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_embedding_dims}}{The dimension indices
-to use for creating dimensionality reduction mappings.}
-
-\item{\code{cell_set_metas}}{The keys in the Seurat object's meta.data
-to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to new names.}
-
-\item{\code{cell_set_meta_scores}}{The keys in the Seurat object's meta.data
-to use for cell set names mapped to keys for scores.}
-
-\item{\code{zarr_folder}}{The name for the folder at the root of the zarr store.}
+\item{\code{local_dir_uid}}{The path to the local zarr store.}
}
\if{html}{\out{
}}
}
\section{Methods}{
\subsection{Public methods}{
\itemize{
-\item \href{#method-SeuratWrapper-new}{\code{SeuratWrapper$new()}}
-\item \href{#method-SeuratWrapper-check_obj}{\code{SeuratWrapper$check_obj()}}
-\item \href{#method-SeuratWrapper-get_zarr_path}{\code{SeuratWrapper$get_zarr_path()}}
-\item \href{#method-SeuratWrapper-get_zarr_url}{\code{SeuratWrapper$get_zarr_url()}}
-\item \href{#method-SeuratWrapper-convert_and_save}{\code{SeuratWrapper$convert_and_save()}}
-\item \href{#method-SeuratWrapper-make_cells_file_def_creator}{\code{SeuratWrapper$make_cells_file_def_creator()}}
-\item \href{#method-SeuratWrapper-make_cell_sets_file_def_creator}{\code{SeuratWrapper$make_cell_sets_file_def_creator()}}
-\item \href{#method-SeuratWrapper-make_expression_matrix_file_def_creator}{\code{SeuratWrapper$make_expression_matrix_file_def_creator()}}
-\item \href{#method-SeuratWrapper-clone}{\code{SeuratWrapper$clone()}}
+\item \href{#method-AnnDataWrapper-new}{\code{AnnDataWrapper$new()}}
+\item \href{#method-AnnDataWrapper-convert_and_save}{\code{AnnDataWrapper$convert_and_save()}}
+\item \href{#method-AnnDataWrapper-make_routes}{\code{AnnDataWrapper$make_routes()}}
+\item \href{#method-AnnDataWrapper-get_zarr_url}{\code{AnnDataWrapper$get_zarr_url()}}
+\item \href{#method-AnnDataWrapper-make_file_def_creator}{\code{AnnDataWrapper$make_file_def_creator()}}
+\item \href{#method-AnnDataWrapper-clone}{\code{AnnDataWrapper$clone()}}
}
}
\if{html}{\out{
@@ -70,29 +49,42 @@ to use for cell set names mapped to keys for scores.}
}}
\if{html}{\out{
}}
-\if{html}{\out{}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-new}{}}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-new}{}}}
\subsection{Method \code{new()}}{
-Create a wrapper around a Seurat object.
+Create a wrapper around an AnnData object saved to a Zarr store.
\subsection{Usage}{
-\if{html}{\out{}}\preformatted{SeuratWrapper$new(
- obj,
- assay = NA,
- cell_embeddings = NA,
- cell_embedding_names = NA,
- cell_embedding_dims = NA,
- cell_set_metas = NA,
- cell_set_meta_names = NA,
- cell_set_meta_scores = NA,
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$new(
+ adata_path = NA,
+ adata_url = NA,
+ obs_feature_matrix_path = NA,
+ feature_filter_path = NA,
+ initial_feature_filter_path = NA,
+ obs_set_paths = NA,
+ obs_set_names = NA,
+ obs_locations_path = NA,
+ obs_segmentations_path = NA,
+ obs_embedding_paths = NA,
+ obs_embedding_names = NA,
+ obs_embedding_dims = NA,
+ request_init = NA,
+ feature_labels_path = NA,
+ obs_labels_path = NA,
+ coordination_values = NA,
+ obs_labels_paths = NA,
+ obs_labels_names = NA,
...
)}\if{html}{\out{
}}
}
@@ -100,28 +92,7 @@ Create a wrapper around a Seurat object.
\subsection{Arguments}{
\if{html}{\out{
}}
\describe{
-\item{\code{obj}}{The object to wrap.}
-
-\item{\code{assay}}{The assay name under the assays part of the Seurat object.}
-
-\item{\code{cell_embeddings}}{The keys in the Seurat object's reductions/cell.embeddings
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_names}}{Names
-to use for creating dimensionality reduction plots.}
-
-\item{\code{cell_embedding_dims}}{An array of dimension indices to use for each cell_embedding.}
-
-\item{\code{cell_set_metas}}{An optional list of keys in the object's meta.data
-list to use for creating cell sets.}
-
-\item{\code{cell_set_meta_names}}{If cell_set_metas is provided, this list can
-also be provided to set new names to replace
-the keys in the interface.}
-
-\item{\code{cell_set_meta_scores}}{If cell_set_metas is provided, this list can
-also be provided to map between meta.data keys for set annotations
-and keys for annotation scores.}
+\item{\code{adata_path}}{The path to a local Zarr store.}
\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
}
@@ -132,71 +103,12 @@ A new \code{SeuratWrapper} object.
}
}
\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-check_obj}{}}}
-\subsection{Method \code{check_obj()}}{
-Check that the object is valid
-\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$check_obj()}\if{html}{\out{
}}
-}
-
-\subsection{Returns}{
-Success or failure.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-get_zarr_path}{}}}
-\subsection{Method \code{get_zarr_path()}}{
-Get the path to the zarr store, relative to the current directory.
-\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$get_zarr_path(dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{
}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A path as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-get_zarr_url}{}}}
-\subsection{Method \code{get_zarr_url()}}{
-Get the URL to the Zarr store, to fill in the file URL in the file definitions.
-\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$get_zarr_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
-}
-
-\subsection{Arguments}{
-\if{html}{\out{
}}
-\describe{
-\item{\code{base_url}}{The base URL, on which the route will be served.}
-
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A URL as a string.
-}
-}
-\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-convert_and_save}{}}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-convert_and_save}{}}}
\subsection{Method \code{convert_and_save()}}{
Create the JSON output files, web server routes, and file definition creators.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$convert_and_save(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$convert_and_save(dataset_uid, obj_i, base_dir = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -210,39 +122,28 @@ Create the JSON output files, web server routes, and file definition creators.
}
}
\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-make_cells_file_def_creator}{}}}
-\subsection{Method \code{make_cells_file_def_creator()}}{
-Make the file definition creator function for the cells data type.
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-make_routes}{}}}
+\subsection{Method \code{make_routes()}}{
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$make_cells_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$make_routes(dataset_uid, obj_i)}\if{html}{\out{
}}
}
-\subsection{Arguments}{
-\if{html}{\out{
}}
-\describe{
-\item{\code{dataset_uid}}{The ID for this dataset.}
-
-\item{\code{obj_i}}{The index of this data object within the dataset.}
-}
-\if{html}{\out{
}}
-}
-\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
-}
}
\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-make_cell_sets_file_def_creator}{}}}
-\subsection{Method \code{make_cell_sets_file_def_creator()}}{
-Make the file definition creator function for the cell sets data type.
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-get_zarr_url}{}}}
+\subsection{Method \code{get_zarr_url()}}{
+Get the URL to the Zarr store, to fill in the file URL in the file definitions.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$make_cell_sets_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$get_zarr_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
}
\subsection{Arguments}{
\if{html}{\out{
}}
\describe{
+\item{\code{base_url}}{The base URL, on which the route will be served.}
+
\item{\code{dataset_uid}}{The ID for this dataset.}
\item{\code{obj_i}}{The index of this data object within the dataset.}
@@ -250,16 +151,16 @@ Make the file definition creator function for the cell sets data type.
\if{html}{\out{
}}
}
\subsection{Returns}{
-A file definition creator function which takes a \code{base_url} parameter.
+A URL as a string.
}
}
\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-make_expression_matrix_file_def_creator}{}}}
-\subsection{Method \code{make_expression_matrix_file_def_creator()}}{
-Make the file definition creator function for the expression matrix data type.
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-make_file_def_creator}{}}}
+\subsection{Method \code{make_file_def_creator()}}{
+Make the file definition creator function for the cells data type.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$make_expression_matrix_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$make_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -276,12 +177,12 @@ A file definition creator function which takes a \code{base_url} parameter.
}
}
\if{html}{\out{
}}
-\if{html}{\out{
}}
-\if{latex}{\out{\hypertarget{method-SeuratWrapper-clone}{}}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-AnnDataWrapper-clone}{}}}
\subsection{Method \code{clone()}}{
The objects of this class are cloneable with this method.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{SeuratWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{AnnDataWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
}
\subsection{Arguments}{
diff --git a/man/VitessceConfig.Rd b/man/VitessceConfig.Rd
index c0b8f3b..6642e5c 100644
--- a/man/VitessceConfig.Rd
+++ b/man/VitessceConfig.Rd
@@ -93,6 +93,8 @@ vc$export(with_config = TRUE, base_url = "http://localhost:3000", out_dir = "./d
\if{html}{\out{
}}
\describe{
\item{\code{config}}{The internal representation of the view config.}
+
+\item{\code{base_dir}}{The base directory for the config.}
}
\if{html}{\out{
}}
}
@@ -103,6 +105,9 @@ vc$export(with_config = TRUE, base_url = "http://localhost:3000", out_dir = "./d
\item \href{#method-VitessceConfig-add_dataset}{\code{VitessceConfig$add_dataset()}}
\item \href{#method-VitessceConfig-add_view}{\code{VitessceConfig$add_view()}}
\item \href{#method-VitessceConfig-add_coordination}{\code{VitessceConfig$add_coordination()}}
+\item \href{#method-VitessceConfig-add_meta_coordination}{\code{VitessceConfig$add_meta_coordination()}}
+\item \href{#method-VitessceConfig-add_coordination_by_dict}{\code{VitessceConfig$add_coordination_by_dict()}}
+\item \href{#method-VitessceConfig-link_views_by_dict}{\code{VitessceConfig$link_views_by_dict()}}
\item \href{#method-VitessceConfig-layout}{\code{VitessceConfig$layout()}}
\item \href{#method-VitessceConfig-link_views}{\code{VitessceConfig$link_views()}}
\item \href{#method-VitessceConfig-to_list}{\code{VitessceConfig$to_list()}}
@@ -118,7 +123,7 @@ vc$export(with_config = TRUE, base_url = "http://localhost:3000", out_dir = "./d
\subsection{Method \code{new()}}{
Create a new config object.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{VitessceConfig$new(name = NA, description = NA)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{VitessceConfig$new(schema_version, name = NA, description = NA, base_dir = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -246,6 +251,33 @@ spatial$use_coordination(c_scopes)
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfig-add_meta_coordination}{}}}
+\subsection{Method \code{add_meta_coordination()}}{
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfig$add_meta_coordination()}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfig-add_coordination_by_dict}{}}}
+\subsection{Method \code{add_coordination_by_dict()}}{
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfig$add_coordination_by_dict(input_val)}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfig-link_views_by_dict}{}}}
+\subsection{Method \code{link_views_by_dict()}}{
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfig$link_views_by_dict(views, input_val, meta = TRUE)}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{
}}
diff --git a/man/VitessceConfigCoordinationScope.Rd b/man/VitessceConfigCoordinationScope.Rd
index d0529f4..00def26 100644
--- a/man/VitessceConfigCoordinationScope.Rd
+++ b/man/VitessceConfigCoordinationScope.Rd
@@ -36,7 +36,7 @@ Coordination scope in a VitessceConfig
\subsection{Method \code{new()}}{
Create a new coordination scope object.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{VitessceConfigCoordinationScope$new(c_type, c_scope)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{VitessceConfigCoordinationScope$new(c_type, c_scope, c_value = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
diff --git a/man/VitessceConfigDataset.Rd b/man/VitessceConfigDataset.Rd
index 0080764..884a4d0 100644
--- a/man/VitessceConfigDataset.Rd
+++ b/man/VitessceConfigDataset.Rd
@@ -28,6 +28,8 @@ dataset <- vc$add_dataset("My dataset")$add_file(
\if{html}{\out{
}}
\describe{
\item{\code{dataset}}{The dataset as a list.}
+
+\item{\code{base_dir}}{The base directory for the config.}
}
\if{html}{\out{
}}
}
@@ -35,6 +37,8 @@ dataset <- vc$add_dataset("My dataset")$add_file(
\subsection{Public methods}{
\itemize{
\item \href{#method-VitessceConfigDataset-new}{\code{VitessceConfigDataset$new()}}
+\item \href{#method-VitessceConfigDataset-get_name}{\code{VitessceConfigDataset$get_name()}}
+\item \href{#method-VitessceConfigDataset-get_uid}{\code{VitessceConfigDataset$get_uid()}}
\item \href{#method-VitessceConfigDataset-add_file}{\code{VitessceConfigDataset$add_file()}}
\item \href{#method-VitessceConfigDataset-add_object}{\code{VitessceConfigDataset$add_object()}}
\item \href{#method-VitessceConfigDataset-get_routes}{\code{VitessceConfigDataset$get_routes()}}
@@ -48,7 +52,7 @@ dataset <- vc$add_dataset("My dataset")$add_file(
\subsection{Method \code{new()}}{
Create a new dataset object.
\subsection{Usage}{
-\if{html}{\out{
}}\preformatted{VitessceConfigDataset$new(uid, name)}\if{html}{\out{
}}
+\if{html}{\out{
}}\preformatted{VitessceConfigDataset$new(uid, name, base_dir = NA)}\if{html}{\out{
}}
}
\subsection{Arguments}{
@@ -63,6 +67,24 @@ Create a new dataset object.
\subsection{Returns}{
A new \code{VitessceConfigDataset} object.
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigDataset-get_name}{}}}
+\subsection{Method \code{get_name()}}{
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfigDataset$get_name()}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigDataset-get_uid}{}}}
+\subsection{Method \code{get_uid()}}{
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfigDataset$get_uid()}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{
}}
@@ -72,9 +94,10 @@ Add a file to this dataset.
\subsection{Usage}{
\if{html}{\out{
}}\preformatted{VitessceConfigDataset$add_file(
url = NA,
- data_type = NA,
file_type = NA,
- options = NA
+ options = NA,
+ coordination_values = NA,
+ data_type = NA
)}\if{html}{\out{
}}
}
@@ -83,11 +106,11 @@ Add a file to this dataset.
\describe{
\item{\code{url}}{The URL to the file.}
-\item{\code{data_type}}{The data type for the file.}
-
\item{\code{file_type}}{The file type for the file.}
\item{\code{options}}{Optional. An options list for the file.}
+
+\item{\code{data_type}}{The data type for the file.}
}
\if{html}{\out{
}}
}
diff --git a/man/VitessceConfigDatasetFile.Rd b/man/VitessceConfigDatasetFile.Rd
index e1083ac..ab42ed0 100644
--- a/man/VitessceConfigDatasetFile.Rd
+++ b/man/VitessceConfigDatasetFile.Rd
@@ -26,9 +26,10 @@ Create a new dataset file object.
\subsection{Usage}{
\if{html}{\out{
}}\preformatted{VitessceConfigDatasetFile$new(
url = NA,
- data_type = NA,
file_type = NA,
- options = NA
+ options = NA,
+ coordination_values = NA,
+ data_type = NA
)}\if{html}{\out{
}}
}
@@ -37,11 +38,11 @@ Create a new dataset file object.
\describe{
\item{\code{url}}{A URL for the file.}
-\item{\code{data_type}}{A data type for the file.}
-
\item{\code{file_type}}{A file type for the file.}
\item{\code{options}}{A list of options to include for the file.}
+
+\item{\code{data_type}}{A data type for the file.}
}
\if{html}{\out{
}}
}
diff --git a/man/VitessceConfigView.Rd b/man/VitessceConfigView.Rd
index ee42801..9beac48 100644
--- a/man/VitessceConfigView.Rd
+++ b/man/VitessceConfigView.Rd
@@ -15,6 +15,8 @@ View in a VitessceConfig
\itemize{
\item \href{#method-VitessceConfigView-new}{\code{VitessceConfigView$new()}}
\item \href{#method-VitessceConfigView-use_coordination}{\code{VitessceConfigView$use_coordination()}}
+\item \href{#method-VitessceConfigView-use_coordination_by_dict}{\code{VitessceConfigView$use_coordination_by_dict()}}
+\item \href{#method-VitessceConfigView-use_meta_coordination}{\code{VitessceConfigView$use_meta_coordination()}}
\item \href{#method-VitessceConfigView-set_xywh}{\code{VitessceConfigView$set_xywh()}}
\item \href{#method-VitessceConfigView-set_props}{\code{VitessceConfigView$set_props()}}
\item \href{#method-VitessceConfigView-to_list}{\code{VitessceConfigView$to_list()}}
@@ -70,6 +72,24 @@ Link this view to existing coordination scope(s).
\subsection{Returns}{
Invisible self, to allow chaining.
}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigView-use_coordination_by_dict}{}}}
+\subsection{Method \code{use_coordination_by_dict()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{VitessceConfigView$use_coordination_by_dict(scopes)}\if{html}{\out{
}}
+}
+
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigView-use_meta_coordination}{}}}
+\subsection{Method \code{use_meta_coordination()}}{
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{VitessceConfigView$use_meta_coordination(meta_scope)}\if{html}{\out{
}}
+}
+
}
\if{html}{\out{
}}
\if{html}{\out{}}
diff --git a/tests/testthat/setup-wrappers-seurat.R b/tests/testthat/setup-wrappers-seurat.R
deleted file mode 100644
index ca14064..0000000
--- a/tests/testthat/setup-wrappers-seurat.R
+++ /dev/null
@@ -1,10 +0,0 @@
-setup({
- url <- "https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz"
- dir.create("seurat", showWarnings = FALSE)
- dir.create(file.path("seurat", "out"), showWarnings = FALSE)
- download.file(url, destfile = file.path("seurat", "filtered_gene_bc_matrices.tar.gz"))
- untar(file.path("seurat", "filtered_gene_bc_matrices.tar.gz"), exdir = "seurat")
-})
-teardown({
- unlink(file.path("seurat", "filtered_gene_bc_matrices.tar.gz"))
-})
diff --git a/tests/testthat/test-config.R b/tests/testthat/test-config.R
index 78915bf..c0c3e3c 100644
--- a/tests/testthat/test-config.R
+++ b/tests/testthat/test-config.R
@@ -1,7 +1,7 @@
library(vitessceR)
test_that("VitessceConfig new", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
vc_list <- vc$to_list(base_url = "http://localhost:8000")
expect_equal(vc_list, list(
@@ -16,12 +16,11 @@ test_that("VitessceConfig new", {
})
test_that("VitessceConfig add_dataset", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
vc$add_dataset("My dataset")
vc_list <- vc$to_list(base_url = "http://localhost:8000")
-
expect_equal(vc_list, list(
version = "1.0.9",
name = "My config",
@@ -44,11 +43,12 @@ test_that("VitessceConfig add_dataset", {
})
test_that("VitessceConfigDataset add_file", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
- ds$add_file("http://example.com/cells", "cells", "cells.json")
+ ds$add_file(url = "http://example.com/cells", file_type = "cells.json")
vc_list <- vc$to_list(base_url = "http://localhost:8000")
+
expect_equal(vc_list, list(
version = "1.0.9",
name = "My config",
@@ -59,9 +59,8 @@ test_that("VitessceConfigDataset add_file", {
name = "My dataset",
files = list(
list(
- url = "http://example.com/cells",
- type = "cells",
- fileType = "cells.json"
+ fileType = "cells.json",
+ url = "http://example.com/cells"
)
)
)
@@ -77,9 +76,13 @@ test_that("VitessceConfigDataset add_file", {
})
test_that("VitessceConfigDataset add_file twice", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
- ds$add_file("http://example.com/cells", "cells", "cells.json")$add_file("http://example.com/molecules", "molecules", "molecules.json")
+ ds$add_file(
+ url = "http://example.com/cells", file_type = "cells.json"
+ )$add_file(
+ url = "http://example.com/molecules", file_type = "molecules.json"
+ )
vc_list <- vc$to_list(base_url = "http://localhost:8000")
expect_equal(vc_list, list(
@@ -92,14 +95,12 @@ test_that("VitessceConfigDataset add_file twice", {
name = "My dataset",
files = list(
list(
- url = "http://example.com/cells",
- type = "cells",
- fileType = "cells.json"
+ fileType = "cells.json",
+ url = "http://example.com/cells"
),
list(
- url = "http://example.com/molecules",
- type = "molecules",
- fileType = "molecules.json"
+ fileType = "molecules.json",
+ url = "http://example.com/molecules"
)
)
)
@@ -115,7 +116,7 @@ test_that("VitessceConfigDataset add_file twice", {
})
test_that("VitessceConfigDataset add_file with options", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
file_options = obj_list(
@@ -131,7 +132,7 @@ test_that("VitessceConfigDataset add_file with options", {
"Image"
)
)
- ds$add_file(data_type = "cells", file_type = "cells.json", options = file_options)
+ ds$add_file(file_type = "cells.json", options = file_options)
vc_list <- vc$to_list(base_url = "http://localhost:8000")
expect_equal(vc_list, list(
@@ -144,7 +145,6 @@ test_that("VitessceConfigDataset add_file with options", {
name = "My dataset",
files = list(
list(
- type = "cells",
fileType = "cells.json",
options = file_options
)
@@ -162,17 +162,16 @@ test_that("VitessceConfigDataset add_file with options", {
})
test_that("VitessceConfigDataset add_object", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
MockWrapper <- R6::R6Class("SeuratWrapper",
inherit = AbstractWrapper,
public = list(
- convert_and_save = function(dataset_uid, obj_i) {
+ convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
get_cells <- function(base_url) {
return(list(
url = "http://localhost:8000/cells",
- type = "cells",
fileType = "cells.json"
))
}
@@ -196,7 +195,6 @@ test_that("VitessceConfigDataset add_object", {
files = list(
list(
url = "http://localhost:8000/cells",
- type = "cells",
fileType = "cells.json"
)
)
@@ -213,7 +211,7 @@ test_that("VitessceConfigDataset add_object", {
})
test_that("VitessceConfig add_view", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
v1 <- vc$add_view(ds, "spatial")
v2 <- vc$add_view(ds, "scatterplot", mapping = "UMAP")
@@ -260,7 +258,7 @@ test_that("VitessceConfig add_view", {
})
test_that("VitessceConfig add_coordination", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
v1 <- vc$add_view(ds, "spatial")
v2 <- vc$add_view(ds, "spatial")
@@ -319,7 +317,7 @@ test_that("VitessceConfig add_coordination", {
})
test_that("VitessceConfig layout", {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.9", name = "My config")
ds <- vc$add_dataset("My dataset")
v1 <- vc$add_view(ds, "spatial")
v2 <- vc$add_view(ds, "description")
diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R
new file mode 100644
index 0000000..01643a6
--- /dev/null
+++ b/tests/testthat/test-utils.R
@@ -0,0 +1,19 @@
+library(vitessceR)
+
+test_that("file_path_to_url_path", {
+ posix_with_slash <- file_path_to_url_path("tests/data/test.snap.mtx")
+ expect_equal(posix_with_slash, "/tests/data/test.snap.mtx")
+
+ posix_without_slash <- file_path_to_url_path("tests/data/test.snap.mtx", prepend_slash = FALSE)
+ expect_equal(posix_without_slash, "tests/data/test.snap.mtx")
+
+ windows_with_slash <- file_path_to_url_path("tests\\data\\test.snap.mtx")
+ expect_equal(windows_with_slash, "/tests/data/test.snap.mtx")
+
+ # TODO: do we need to support this?
+ # posix_with_dot_and_slash <- file_path_to_url_path("./tests/data/test.snap.mtx")
+ # expect_equal(posix_with_dot_and_slash, "/tests/data/test.snap.mtx")
+
+ # posix_with_dot_without_slash <- file_path_to_url_path("./tests/data/test.snap.mtx", prepend_slash = FALSE)
+ # expect_equal(posix_with_dot_without_slash, "tests/data/test.snap.mtx")
+})
diff --git a/tests/testthat/test-wrappers-anndata.R b/tests/testthat/test-wrappers-anndata.R
index d3edc68..a59b115 100644
--- a/tests/testthat/test-wrappers-anndata.R
+++ b/tests/testthat/test-wrappers-anndata.R
@@ -15,8 +15,6 @@ test_that("AnnDataWrapper", {
file_def_creator <- w$make_file_def_creator("A", "0")
file_def <- file_def_creator("http://localhost:8000")
- print(file_def)
-
expect_equal(file_def, list(
fileType = "anndata.zarr",
url = "http://localhost:8000/A/0/some_uuid.h5ad.zarr",
@@ -43,3 +41,38 @@ test_that("AnnDataWrapper", {
)
))
})
+
+test_that("AnnDataWrapper with base dir", {
+ w <- AnnDataWrapper$new(
+ adata_path = "test.h5ad.zarr",
+ obs_set_paths=c('obs/CellType'),
+ obs_set_names=c('Cell Type'),
+ obs_embedding_paths=c('obsm/X_umap'),
+ obs_embedding_names=c('UMAP')
+ )
+ w$local_dir_uid <- "some_uuid.h5ad.zarr"
+ w$base_dir <- "tests/data"
+
+ file_def_creator <- w$make_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ expect_equal(file_def, list(
+ fileType = "anndata.zarr",
+ url = "http://localhost:8000/test.h5ad.zarr",
+ options = list(
+ obsEmbedding = list(
+ obj_list(
+ path = "obsm/X_umap",
+ embeddingType = "UMAP",
+ dims = c(0, 1)
+ )
+ ),
+ obsSets = list(
+ obj_list(
+ path = "obs/CellType",
+ name = "Cell Type"
+ )
+ )
+ )
+ ))
+})
diff --git a/tests/testthat/test-wrappers-images.R b/tests/testthat/test-wrappers-images.R
new file mode 100644
index 0000000..20da432
--- /dev/null
+++ b/tests/testthat/test-wrappers-images.R
@@ -0,0 +1,26 @@
+library(vitessceR)
+
+test_that("OmeTiffWrapper", {
+ w <- OmeTiffWrapper$new(img_path = "tests/data/test.ome.tiff", name = "Test")
+ w$local_img_uid <- "test.ome.tiff"
+
+ file_def_creator <- w$make_raster_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ expect_equal(file_def, list(
+ fileType = "raster.json",
+ options = list(
+ schemaVersion = "0.0.2",
+ images = list(
+ obj_list(
+ name = "Test",
+ type = "ome-tiff",
+ url = "http://localhost:8000/A/0/test.ome.tiff",
+ metadata = list(
+ isBitmask = FALSE
+ )
+ )
+ )
+ )
+ ))
+})
diff --git a/tests/testthat/test-wrappers-seurat.R b/tests/testthat/test-wrappers-seurat.R
deleted file mode 100644
index 76d078b..0000000
--- a/tests/testthat/test-wrappers-seurat.R
+++ /dev/null
@@ -1,64 +0,0 @@
-library(vitessceR)
-library(Seurat)
-
-test_that("SeuratWrapper create_cells_list", {
- pbmc.data <- Read10X(data.dir = "seurat/filtered_gene_bc_matrices/hg19")
-
- pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
- pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
- pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
- pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
- pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
- all.genes <- rownames(pbmc)
- pbmc <- ScaleData(pbmc, features = all.genes)
- pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
- pbmc <- FindNeighbors(pbmc, dims = 1:10)
- pbmc <- FindClusters(pbmc, resolution = 0.5)
-
- w <- SeuratWrapper$new(
- pbmc,
- cell_embeddings = c("pca"),
- cell_embedding_names = c("PCA"),
- cell_set_metas = c("seurat_clusters"),
- cell_set_meta_names = c("Clusters"),
- out_dir = file.path("seurat", "out")
- )
-
- cells_file_def <- w$make_cells_file_def_creator("A", "1")("http://localhost")
- cell_sets_file_def <- w$make_cell_sets_file_def_creator("A", "1")("http://localhost")
- expr_mtx_file_def <- w$make_expression_matrix_file_def_creator("A", "1")("http://localhost")
-
- expect_equal(cells_file_def, list(
- type = "cells",
- fileType = "anndata-cells.zarr",
- url = "http://localhost/A/1/seurat.zarr",
- options = list(
- mappings = list(
- PCA = list(
- key = "obsm/X_pca",
- dims = c(0, 1)
- )
- )
- )
- ))
- expect_equal(cell_sets_file_def, list(
- type = "cell-sets",
- fileType = "anndata-cell-sets.zarr",
- url = "http://localhost/A/1/seurat.zarr",
- options = list(
- list(
- groupName = "Clusters",
- setName = "obs/seurat_clusters"
- )
- )
- ))
- expect_equal(expr_mtx_file_def, list(
- type = "expression-matrix",
- fileType = "anndata-expression-matrix.zarr",
- url = "http://localhost/A/1/seurat.zarr",
- options = list(
- matrix = "X"
- )
- ))
-
-})
diff --git a/tests/testthat/test-wrappers.R b/tests/testthat/test-wrappers.R
index 1531aae..49b4216 100644
--- a/tests/testthat/test-wrappers.R
+++ b/tests/testthat/test-wrappers.R
@@ -28,46 +28,3 @@ test_that("AbstractWrapper get_out_dir", {
out_dir <- w$get_out_dir("A", 1, "cells")
expect_equal(out_dir, "test/A/1/cells")
})
-
-test_that("file_path_to_url_path", {
- posix_with_slash <- file_path_to_url_path("tests/data/test.snap.mtx")
- expect_equal(posix_with_slash, "/tests/data/test.snap.mtx")
-
- posix_without_slash <- file_path_to_url_path("tests/data/test.snap.mtx", prepend_slash = FALSE)
- expect_equal(posix_without_slash, "tests/data/test.snap.mtx")
-
- windows_with_slash <- file_path_to_url_path("tests\\data\\test.snap.mtx")
- expect_equal(windows_with_slash, "/tests/data/test.snap.mtx")
-
- # TODO: do we need to support this?
- # posix_with_dot_and_slash <- file_path_to_url_path("./tests/data/test.snap.mtx")
- # expect_equal(posix_with_dot_and_slash, "/tests/data/test.snap.mtx")
-
- # posix_with_dot_without_slash <- file_path_to_url_path("./tests/data/test.snap.mtx", prepend_slash = FALSE)
- # expect_equal(posix_with_dot_without_slash, "tests/data/test.snap.mtx")
-})
-
-test_that("OmeTiffWrapper", {
- w <- OmeTiffWrapper$new(img_path = "tests/data/test.ome.tiff", name = "Test")
- w$local_img_uid <- "test.ome.tiff"
-
- file_def_creator <- w$make_raster_file_def_creator("A", "0")
- file_def <- file_def_creator("http://localhost:8000")
-
- expect_equal(file_def, list(
- fileType = "raster.json",
- options = list(
- schemaVersion = "0.0.2",
- images = list(
- obj_list(
- name = "Test",
- type = "ome-tiff",
- url = "http://localhost:8000/A/0/test.ome.tiff",
- metadata = list(
- isBitmask = FALSE
- )
- )
- )
- )
- ))
-})
\ No newline at end of file
From 68098e3c55a7299c122160d3210cfe2af045b8ce Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Fri, 29 Sep 2023 11:24:23 -0400
Subject: [PATCH 10/22] CsvWrapper
---
R/content-types.R | 66 ++++++++++++++
R/server.R | 56 ++++++++++++
R/wrappers.R | 22 +++++
R/wrappers_csv.R | 133 +++++++++++++++++++++++++++++
tests/testthat/test-wrappers-csv.R | 62 ++++++++++++++
tests/testthat/test-wrappers.R | 48 +++++++++++
6 files changed, 387 insertions(+)
create mode 100644 R/content-types.R
create mode 100644 R/wrappers_csv.R
create mode 100644 tests/testthat/test-wrappers-csv.R
diff --git a/R/content-types.R b/R/content-types.R
new file mode 100644
index 0000000..ef1aa1f
--- /dev/null
+++ b/R/content-types.R
@@ -0,0 +1,66 @@
+# Reference: https://github.com/rstudio/plumber/blob/e829af6a94380cb897441c1c56129504afb9564f/R/content-types.R#L55
+
+# FROM Shiny
+# @author Shiny package authors
+knownContentTypes <- c(
+ html = "text/html; charset=UTF-8",
+ htm = "text/html; charset=UTF-8",
+ js = "text/javascript",
+ css = "text/css",
+ png = "image/png",
+ jpg = "image/jpeg",
+ jpeg = "image/jpeg",
+ gif = "image/gif",
+ svg = "image/svg+xml",
+ txt = "text/plain",
+ pdf = "application/pdf",
+ ps = "application/postscript",
+ xml = "application/xml",
+ m3u = "audio/x-mpegurl",
+ m4a = "audio/mp4a-latm",
+ m4b = "audio/mp4a-latm",
+ m4p = "audio/mp4a-latm",
+ mp3 = "audio/mpeg",
+ wav = "audio/x-wav",
+ m4u = "video/vnd.mpegurl",
+ m4v = "video/x-m4v",
+ mp4 = "video/mp4",
+ mpeg = "video/mpeg",
+ mpg = "video/mpeg",
+ avi = "video/x-msvideo",
+ mov = "video/quicktime",
+ ogg = "application/ogg",
+ swf = "application/x-shockwave-flash",
+ doc = "application/msword",
+ xls = "application/vnd.ms-excel",
+ ppt = "application/vnd.ms-powerpoint",
+ xlsx = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ xltx = "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
+ potx = "application/vnd.openxmlformats-officedocument.presentationml.template",
+ ppsx = "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
+ pptx = "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+ sldx = "application/vnd.openxmlformats-officedocument.presentationml.slide",
+ docx = "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ dotx = "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
+ xlam = "application/vnd.ms-excel.addin.macroEnabled.12",
+ xlsb = "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
+ feather = "application/vnd.apache.arrow.file",
+ parquet = "application/vnd.apache.parquet",
+ rds = "application/rds",
+ tsv = "application/tab-separated-values",
+ csv = "application/csv",
+ json = "application/json",
+ yml = "application/yaml",
+ yaml = "application/yaml"
+)
+
+getContentType <- function(ext, defaultType = 'application/octet-stream') {
+ ext <- tolower(ext)
+
+ ret <-
+ knownContentTypes[ext] %|%
+ mime::mimemap[ext] %|%
+ defaultType
+
+ ret[[1]]
+}
diff --git a/R/server.R b/R/server.R
index d361c9c..cfbb807 100644
--- a/R/server.R
+++ b/R/server.R
@@ -42,6 +42,62 @@ VitessceConfigServerStaticRoute <- R6::R6Class("VitessceConfigServerStaticRoute"
)
)
+#' Class representing a local web server route for a file which needs to support range requests.
+#' @keywords internal
+#' @rdname VitessceConfigServerRangeRoute
+VitessceConfigServerFileRoute <- R6::R6Class("VitessceConfigServerFileRoute",
+ public = list(
+ #' @field path The path on which the web server should respond to requests using this callback.
+ path = NULL,
+ #' @field file_path The file to serve.
+ file_path = NULL,
+ #' @description
+ #' Create a new server route wrapper object.
+ #' @param path The route path.
+ #' @param file_path The file to serve on this route.
+ #' @return A new `VitessceConfigServerRangeRoute` object.
+ initialize = function(path, file_path) {
+ self$path <- path
+ self$file_path <- file_path
+ },
+ #' @description
+ #' Add handler functions to the Plumber server object to respond on this route.
+ #' @param pr_server The server instance.
+ #' @return The modified server instance.
+ create_handlers = function(pr_server) {
+ # Add the handler for range requests.
+ new_server <- plumber::pr_handle(pr_server, c("GET", "HEAD"), self$path, handler = function(req, res) {
+ if(req$REQUEST_METHOD %in% c("HEAD", "GET")) {
+ file_path <- self$file_path
+
+ res$headers <- obj_list()
+
+ # Adapted from https://github.com/rstudio/plumber/blob/e829af6a94380cb897441c1c56129504afb9564f/R/plumber-static.R#L70C9-L85C12
+ ext <- tools::file_ext(self$file_path)
+ info <- file.info(self$file_path)
+ contentType <- getContentType(ext)
+ res$headers[["Content-Type"]] <- contentType
+ res$headers[["Content-Length"]] <- info$size
+ res$headers[["Last-Modified"]] <- http_date_string(info$mtime)
+ res$body <- NULL # For HEAD request.
+ if (req$REQUEST_METHOD == 'GET') {
+ readBin(self$file_path, 'raw', n = info$size)
+ }
+
+ # Set other headers.
+ res$headers[["Accept-Ranges"]] <- "bytes"
+ res$headers[["Access-Control-Allow-Origin"]] <- "*"
+ res$headers[["Access-Control-Expose-Headers"]] <- "Access-Control-Allow-Origin, Content-Length, Content-Range, Content-Type, Date, Server, Transfer-Encoding, range"
+ res$status <- 200
+ }
+ # Return the response object.
+ res
+ })
+ return(new_server)
+ }
+ )
+)
+
#' Class representing a local web server route for a file which needs to support range requests.
#' @keywords internal
#' @rdname VitessceConfigServerRangeRoute
diff --git a/R/wrappers.R b/R/wrappers.R
index 9ba190e..cda0d2d 100644
--- a/R/wrappers.R
+++ b/R/wrappers.R
@@ -117,6 +117,10 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
}
return(self$get_url(base_url, dataset_uid, obj_i, local_dir_uid))
},
+ get_local_file_url = function(base_url, dataset_uid, obj_i, local_file_path, local_file_uid) {
+ # Same logic as get_local_dir_url
+ return(self$get_local_dir_url(base_url, dataset_uid, obj_i, local_file_path, local_file_uid))
+ },
get_local_dir_route = function(dataset_uid, obj_i, local_dir_path, local_dir_uid) {
if(!self$is_remote) {
if(is.na(self$base_dir)) {
@@ -133,6 +137,24 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
}
return(list())
},
+ get_local_file_route = function(dataset_uid, obj_i, local_file_path, local_file_uid) {
+ if(!self$is_remote) {
+ if(is.na(self$base_dir)) {
+ route_path <- self$get_route_str(dataset_uid, obj_i, local_file_uid)
+ local_file_path <- local_file_path
+ } else {
+ # Has base_dir
+ route_path <- file_path_to_url_path(local_file_path)
+ local_file_path <- file.path(self$base_dir, local_file_path)
+ }
+ route <- VitessceConfigServerFileRoute$new(
+ route_path,
+ local_file_path
+ )
+ return(list(route))
+ }
+ return(list())
+ },
#' @description
#' Create a local web server URL for a dataset object.
#' @param base_url The base URL on which the web server is serving.
diff --git a/R/wrappers_csv.R b/R/wrappers_csv.R
new file mode 100644
index 0000000..67d8bbd
--- /dev/null
+++ b/R/wrappers_csv.R
@@ -0,0 +1,133 @@
+#' Seurat object wrapper class
+#' @title SeuratWrapper Class
+#' @docType class
+#' @description
+#' Class representing a local Seurat object in a Vitessce dataset.
+#'
+#' @rdname SeuratWrapper
+#' @export
+#' @examples
+#' obj <- get_seurat_obj()
+#' w <- SeuratWrapper$new(
+#' obj,
+#' cell_embeddings = c("pca"),
+#' cell_embedding_names = c("PCA")
+#' )
+CsvWrapper <- R6::R6Class("CsvWrapper",
+ inherit = AbstractWrapper,
+ public = list(
+ #' @field adata_path The object to wrap.
+ #' @keywords internal
+ csv_path = NULL,
+ #' @field adata_url The object to wrap.
+ #' @keywords internal
+ csv_url = NULL,
+ #' @field local_dir_uid The path to the local zarr store.
+ #' @keywords internal
+ local_csv_uid = NULL,
+
+
+ data_type = NULL,
+ options=NULL,
+ coordination_values=NULL,
+ request_init = NULL,
+
+ #' @description
+ #' Create a wrapper around an AnnData object saved to a Zarr store.
+ #' @param adata_path The path to a local Zarr store.
+ #' @param ... Parameters inherited from `AbstractWrapper`.
+ #' @return A new `SeuratWrapper` object.
+ initialize = function(csv_path = NA, csv_url = NA, data_type = NA, options = NA, coordination_values = NA, request_init = NA, ...) {
+ super$initialize(...)
+ self$csv_path <- csv_path
+ self$csv_url <- csv_url
+
+ if(is_na(data_type)) {
+ stop("Expected data_type to be provided.")
+ }
+
+ if(!is.na(csv_url) && !is.na(csv_path)) {
+ stop("Did not expect csv_url to be provided with csv_path.")
+ }
+
+ if(is.na(csv_url) && is.na(csv_path)) {
+ stop("Expected either csv_url or csv_path to be provided.")
+ }
+
+ if(!is.na(csv_path)) {
+ self$is_remote <- FALSE
+ } else {
+ self$is_remote <- TRUE
+ }
+
+ self$local_csv_uid <- make_unique_filename(".csv")
+
+ self$data_type <- data_type
+ self$options <- options
+ self$coordination_values <- coordination_values
+ self$request_init <- request_init
+ },
+ #' @description
+ #' Create the JSON output files, web server routes, and file definition creators.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
+ if(self$is_remote) {
+ super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
+ }
+
+ # Get the file definition creator functions.
+ file_def_creator <- self$make_file_def_creator(dataset_uid, obj_i)
+
+ # Append the new file definition creators functions to the main list.
+ self$file_def_creators <- append(self$file_def_creators, file_def_creator)
+
+ # Create a web server route object for the directory of JSON files.
+ new_routes <- self$make_routes(dataset_uid, obj_i)
+ for(route in new_routes) {
+ self$routes <- append(self$routes, route)
+ }
+ },
+ make_routes = function(dataset_uid, obj_i) {
+ return(self$get_local_file_route(dataset_uid, obj_i, self$csv_path, self$local_csv_uid))
+ },
+ #' @description
+ #' Get the URL to the Zarr store, to fill in the file URL in the file definitions.
+ #' @param base_url The base URL, on which the route will be served.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @keywords internal
+ #' @return A URL as a string.
+ get_csv_url = function(base_url, dataset_uid, obj_i) {
+ if(self$is_remote) {
+ return(self$csv_url)
+ } else {
+ return(self$get_local_file_url(base_url, dataset_uid, obj_i, self$csv_path, self$local_csv_uid))
+ }
+ },
+ #' @description
+ #' Make the file definition creator function for the cells data type.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @return A file definition creator function which takes a `base_url` parameter.
+ make_file_def_creator = function(dataset_uid, obj_i) {
+ get_csv <- function(base_url) {
+ file_def <- list(
+ fileType = paste0(self$data_type, ".csv"),
+ url = self$get_csv_url(base_url, dataset_uid, obj_i)
+ )
+ if(!is_na(self$options)) {
+ file_def[['options']] <- self$options
+ }
+ if(!is_na(self$request_init)) {
+ file_def[['requestInit']] <- self$request_init
+ }
+ if(!is_na(self$coordination_values)) {
+ file_def[['coordinationValues']] <- self$coordination_values
+ }
+ return(file_def)
+ }
+ return(get_csv)
+ }
+ ),
+)
diff --git a/tests/testthat/test-wrappers-csv.R b/tests/testthat/test-wrappers-csv.R
new file mode 100644
index 0000000..785ed8d
--- /dev/null
+++ b/tests/testthat/test-wrappers-csv.R
@@ -0,0 +1,62 @@
+library(vitessceR)
+
+test_that("CsvWrapper", {
+ w <- CsvWrapper$new(
+ csv_path = "tests/data/test.csv",
+ data_type = "obsEmbedding",
+ options = obj_list(
+ obsIndex = "index",
+ obsEmbedding = c("UMAP_1", "UMAP_2")
+ ),
+ coordination_values = obj_list(
+ embeddingType = "UMAP"
+ )
+ )
+ w$local_csv_uid <- "some_uuid.csv"
+
+ file_def_creator <- w$make_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ expect_equal(file_def, list(
+ fileType = "obsEmbedding.csv",
+ url = "http://localhost:8000/A/0/some_uuid.csv",
+ options = obj_list(
+ obsIndex = "index",
+ obsEmbedding = c("UMAP_1", "UMAP_2")
+ ),
+ coordinationValues = obj_list(
+ embeddingType = "UMAP"
+ )
+ ))
+})
+
+test_that("CsvWrapper with base_dir", {
+ w <- CsvWrapper$new(
+ csv_path = "test.csv",
+ data_type = "obsEmbedding",
+ options = obj_list(
+ obsIndex = "index",
+ obsEmbedding = c("UMAP_1", "UMAP_2")
+ ),
+ coordination_values = obj_list(
+ embeddingType = "UMAP"
+ )
+ )
+ w$base_dir <- "tests/data"
+ w$local_csv_uid <- "some_uuid.csv"
+
+ file_def_creator <- w$make_file_def_creator("A", "0")
+ file_def <- file_def_creator("http://localhost:8000")
+
+ expect_equal(file_def, list(
+ fileType = "obsEmbedding.csv",
+ url = "http://localhost:8000/test.csv",
+ options = obj_list(
+ obsIndex = "index",
+ obsEmbedding = c("UMAP_1", "UMAP_2")
+ ),
+ coordinationValues = obj_list(
+ embeddingType = "UMAP"
+ )
+ ))
+})
diff --git a/tests/testthat/test-wrappers.R b/tests/testthat/test-wrappers.R
index 49b4216..38fee0f 100644
--- a/tests/testthat/test-wrappers.R
+++ b/tests/testthat/test-wrappers.R
@@ -28,3 +28,51 @@ test_that("AbstractWrapper get_out_dir", {
out_dir <- w$get_out_dir("A", 1, "cells")
expect_equal(out_dir, "test/A/1/cells")
})
+
+
+test_that("AbstractWrapper get_local_dir_route without base_dir", {
+ w <- AbstractWrapper$new(out_dir = "test")
+
+ adata_path <- "data/test.h5ad.zarr"
+ local_dir_uid <- "some_uuid.h5ad.zarr"
+
+ routes <- w$get_local_dir_route("A", 1, adata_path, local_dir_uid)
+ expect_equal(routes[[1]]$path, "/A/1/some_uuid.h5ad.zarr")
+ expect_equal(routes[[1]]$directory, "data/test.h5ad.zarr")
+})
+
+test_that("AbstractWrapper get_local_dir_route with base_dir", {
+ w <- AbstractWrapper$new(out_dir = "test")
+ w$base_dir <- "data_base"
+
+ adata_path <- "test.h5ad.zarr"
+ local_dir_uid <- "some_uuid.h5ad.zarr"
+
+ routes <- w$get_local_dir_route("A", 1, adata_path, local_dir_uid)
+ expect_equal(routes[[1]]$path, "/test.h5ad.zarr")
+ expect_equal(routes[[1]]$directory, "data_base/test.h5ad.zarr")
+})
+
+test_that("AbstractWrapper get_local_file_route without base_dir", {
+ w <- AbstractWrapper$new(out_dir = "test")
+
+ adata_path <- "data/test.csv"
+ local_dir_uid <- "some_uuid.csv"
+
+ routes <- w$get_local_file_route("A", 1, adata_path, local_dir_uid)
+ expect_equal(routes[[1]]$path, "/A/1/some_uuid.csv")
+ expect_equal(routes[[1]]$file_path, "data/test.csv")
+})
+
+test_that("AbstractWrapper get_local_file_route with base_dir", {
+ w <- AbstractWrapper$new(out_dir = "test")
+ w$base_dir <- "data_base"
+
+ adata_path <- "test.csv"
+ local_dir_uid <- "some_uuid.csv"
+
+ routes <- w$get_local_file_route("A", 1, adata_path, local_dir_uid)
+ expect_equal(routes[[1]]$path, "/test.csv")
+ expect_equal(routes[[1]]$file_path, "data_base/test.csv")
+})
+
From a0bcc1313081e6cf9b7d57a4f0b40ddfc98accac Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Fri, 29 Sep 2023 11:36:12 -0400
Subject: [PATCH 11/22] Replace uuid package with stringi
---
DESCRIPTION | 4 ++--
R/wrappers.R | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 9230152..11299a5 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -39,12 +39,12 @@ Imports:
future,
httpuv,
stringr,
+ stringi,
tools,
stats,
methods,
S4Vectors,
- grDevices,
- uuid
+ grDevices
Suggests:
testthat,
knitr,
diff --git a/R/wrappers.R b/R/wrappers.R
index cda0d2d..2da7232 100644
--- a/R/wrappers.R
+++ b/R/wrappers.R
@@ -1,7 +1,7 @@
make_unique_filename <- function(file_ext) {
- return(paste0(uuid::UUIDgenerate(output = "string"), file_ext))
+ return(paste0(stringi::stri_rand_strings(1, 8), file_ext))
}
From 5ab79f37364006fda7ae20fd7b7ee50b1631dfc5 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Fri, 29 Sep 2023 11:48:15 -0400
Subject: [PATCH 12/22] Update
---
DESCRIPTION | 1 +
R/content-types.R | 13 ++++++++-----
R/server.R | 4 ++--
3 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 11299a5..af7aab4 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -36,6 +36,7 @@ Imports:
jsonlite,
R6,
plumber,
+ mime,
future,
httpuv,
stringr,
diff --git a/R/content-types.R b/R/content-types.R
index ef1aa1f..00a637d 100644
--- a/R/content-types.R
+++ b/R/content-types.R
@@ -54,13 +54,16 @@ knownContentTypes <- c(
yaml = "application/yaml"
)
-getContentType <- function(ext, defaultType = 'application/octet-stream') {
+get_content_type <- function(ext, defaultType = 'application/octet-stream') {
ext <- tolower(ext)
- ret <-
- knownContentTypes[ext] %|%
- mime::mimemap[ext] %|%
- defaultType
+ if(!is.null(knownContentTypes[ext])) {
+ ret <- knownContentTypes[ext]
+ } else if(!is.null(mime::mimemap[ext])) {
+ ret <- mime::mimemap[ext]
+ } else {
+ ret <- defaultType
+ }
ret[[1]]
}
diff --git a/R/server.R b/R/server.R
index cfbb807..7d3fef4 100644
--- a/R/server.R
+++ b/R/server.R
@@ -75,8 +75,8 @@ VitessceConfigServerFileRoute <- R6::R6Class("VitessceConfigServerFileRoute",
# Adapted from https://github.com/rstudio/plumber/blob/e829af6a94380cb897441c1c56129504afb9564f/R/plumber-static.R#L70C9-L85C12
ext <- tools::file_ext(self$file_path)
info <- file.info(self$file_path)
- contentType <- getContentType(ext)
- res$headers[["Content-Type"]] <- contentType
+ content_type <- get_content_type(ext)
+ res$headers[["Content-Type"]] <- content_type
res$headers[["Content-Length"]] <- info$size
res$headers[["Last-Modified"]] <- http_date_string(info$mtime)
res$body <- NULL # For HEAD request.
From 4d6cf3b87fa667f445377cfbd73c79de5da6b71c Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 11:36:03 -0400
Subject: [PATCH 13/22] Update vignette
---
R/constants.R | 5 ++++-
vignettes/seurat_basic.Rmd | 24 +++++++++++++++---------
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/R/constants.R b/R/constants.R
index 0cd8011..3522406 100644
--- a/R/constants.R
+++ b/R/constants.R
@@ -79,6 +79,7 @@ CoordinationType <- list(
GENE_SELECTION = "geneSelection",
GENE_EXPRESSION_COLORMAP = "geneExpressionColormap",
GENE_EXPRESSION_COLORMAP_RANGE = "geneExpressionColormapRange",
+ FEATURE_VALUE_COLORMAP_RANGE = "featureValueColormapRange",
CELL_COLOR_ENCODING = "cellColorEncoding",
SPATIAL_LAYERS = "spatialLayers",
GENOMIC_ZOOM = "genomicZoom",
@@ -188,9 +189,11 @@ Component <- list(
DESCRIPTION = "description",
STATUS = "status",
CELL_SETS = "cellSets",
+ OBS_SETS = "obsSets",
HEATMAP = "heatmap",
LAYER_CONTROLLER = "layerController",
HIGLASS = "higlass",
CELL_SET_SIZES = "cellSetSizes",
- GENES = "genes"
+ GENES = "genes",
+ FEATURE_LIST = "featureList"
)
diff --git a/vignettes/seurat_basic.Rmd b/vignettes/seurat_basic.Rmd
index be6794b..44cd5f6 100644
--- a/vignettes/seurat_basic.Rmd
+++ b/vignettes/seurat_basic.Rmd
@@ -16,6 +16,7 @@ First, install the R dependencies:
install.packages("seurat")
install.packages("devtools")
devtools::install_github("mojaveazure/seurat-disk")
+devtools::install_github("vitessce/vitessceAnalysisR")
```
@@ -23,6 +24,7 @@ Download the dataset, load and preprocess the Seurat object, and configure the V
```r
library(vitessceR)
+library(vitessceAnalysisR)
library(Seurat)
# Download example dataset
@@ -49,24 +51,28 @@ pbmc <- FindClusters(pbmc, resolution = 0.5)
pbmc <- ScaleData(pbmc, features = all.genes, do.center = FALSE)
+adata_path <- file.path("data", "seurat", "pbmc3k.h5ad.zarr")
+
+vitessceAnalysisR::seurat_to_anndata_zarr(pbmc, adata_path)
+
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
-dataset <- vc$add_dataset("My dataset")$add_object(SeuratWrapper$new(
- pbmc,
- cell_set_metas = c("seurat_clusters"),
- cell_embeddings = c("pca"),
- cell_embedding_names = c("PCA"),
- out_dir = file.path("data", "seurat_basic"), use_cache = TRUE
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
+dataset <- vc$add_dataset("My dataset")$add_object(AnnDataWrapper$new(
+ adata_path=adata_path,
+ obs_set_paths = c("obs/seurat_clusters"),
+ obs_embedding_paths = c("obsm/X_pca"),
+ obs_embedding_names = c("PCA"),
+ obs_feature_matrix_path = "X"
))
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
status <- vc$add_view(dataset, Component$STATUS)
desc <- vc$add_view(dataset, Component$DESCRIPTION)
desc <- desc$set_props(description = "Visualization of a Seurat object containing the PBMC 3K dataset.")
-genes <- vc$add_view(dataset, Component$GENES)
+genes <- vc$add_view(dataset, Component$FEATURE_LIST)
heatmap <- vc$add_view(dataset, Component$HEATMAP)
vc$link_views(
list(scatterplot, heatmap),
- list(CoordinationType$GENE_EXPRESSION_COLORMAP_RANGE),
+ list(CoordinationType$FEATURE_VALUE_COLORMAP_RANGE),
list(c(0.0, 0.05))
)
vc$layout(hconcat(
From d3400507c38b3323d5391db9e04d431c6467d959 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 11:38:26 -0400
Subject: [PATCH 14/22] Update pkgdown
---
pkgdown/_pkgdown.yml | 12 +++---------
vignettes/debugging.Rmd | 13 +------------
2 files changed, 4 insertions(+), 21 deletions(-)
diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml
index fa407d9..3eed078 100644
--- a/pkgdown/_pkgdown.yml
+++ b/pkgdown/_pkgdown.yml
@@ -86,19 +86,13 @@ reference:
desc: "Wrapper classes for automating the data conversion process for Vitessce."
- contents:
- AbstractWrapper
- - SeuratWrapper
- - SCEWrapper
- - SPEWrapper
- - GiottoWrapper
+ - AnnDataWrapper
+ - CsvWrapper
- MultiImageWrapper
- OmeTiffWrapper
+ - OmeZarrWrapper
articles:
- - title: Articles
- navbar: Developer guides
- contents:
- - dev_wrapper_class
- - dev_wrapper_subclass
- title: Articles
navbar: Troubleshooting
contents:
diff --git a/vignettes/debugging.Rmd b/vignettes/debugging.Rmd
index 817e347..1af9ec3 100644
--- a/vignettes/debugging.Rmd
+++ b/vignettes/debugging.Rmd
@@ -16,20 +16,9 @@ The following code snippets assume that `vitessceR` has been loaded via `library
```r
library(vitessceR)
-vc <- VitessceConfig$new("My single-cell data visualization")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My single-cell data visualization")
```
-## Use the `out_dir` parameter for data object wrapper classes
-
-Rather than using a temporary directory, this will write converted files to the specified directory.
-This way, you can open and explore the converted output files.
-
-```r
-dir.create("./debug")
-
-dataset <- vc$add_dataset("My dataset")
-dataset <- dataset$add_object(SeuratWrapper$new(pbmc3k.final, out_dir = "./debug"))
-```
## Use the `port` parameter
From 16b310bfb8eb9d1080a5f0679b9894a807cd1484 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 11:51:44 -0400
Subject: [PATCH 15/22] Fix file export
---
.gitignore | 3 ++-
R/export.R | 20 +++++++++++++++-----
vignettes/export_files.Rmd | 19 ++++++++++++-------
3 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1a0b733..36bd750 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,5 @@ data/
check/
vignettes/data/
*.Rproj
-.RData
\ No newline at end of file
+.RData
+my_vitessce_files/
\ No newline at end of file
diff --git a/R/export.R b/R/export.R
index 15b4f1c..df89b38 100644
--- a/R/export.R
+++ b/R/export.R
@@ -17,17 +17,27 @@
#' vc$export(to = "files", out_dir = "./data")
export_to_files <- function(config, with_config, base_url, out_dir) {
routes <- config$get_routes()
+
for(route in routes) {
# Get the intended web server route, removing the initial "/"
route_path <- substr(route$path, 2, stringr::str_length(route$path))
out_path <- file.path(out_dir, route_path)
- dir.create(out_path, showWarnings = FALSE, recursive = TRUE)
- # Copy the converted files from their original directory to the `out_dir`.
- static_dir <- route$directory
- files_to_copy = list.files(static_dir, full.names = TRUE)
- file.copy(files_to_copy, out_path, recursive = TRUE)
+ if(class(route)[1] == "VitessceConfigServerStaticRoute") {
+ # This is a directory.
+ dir.create(out_path, showWarnings = FALSE, recursive = TRUE)
+ # Copy the converted files from their original directory to the `out_dir`.
+ static_dir <- route$directory
+ files_to_copy <- list.files(static_dir, full.names = TRUE)
+ file.copy(files_to_copy, out_path, recursive = TRUE)
+ } else {
+ # This is a single file.
+ dir.create(dirname(out_path), showWarnings = FALSE, recursive = TRUE)
+ # Copy the converted files from their original directory to the `out_dir`.
+ file_to_copy <- route$file_path
+ file.copy(file_to_copy, out_path, recursive = TRUE)
+ }
}
if(with_config) {
diff --git a/vignettes/export_files.Rmd b/vignettes/export_files.Rmd
index 53c8bfe..b8e8d02 100644
--- a/vignettes/export_files.Rmd
+++ b/vignettes/export_files.Rmd
@@ -15,27 +15,32 @@ First, install the dependencies:
```r
install.packages("devtools")
devtools::install_github("satijalab/seurat-data")
+devtools::install_github("vitessce/vitessceAnalysisR")
```
Create the Vitessce configuration:
```r
library(vitessceR)
+library(vitessceAnalysisR)
library(SeuratData)
SeuratData::InstallData("pbmc3k")
data("pbmc3k.final")
force(pbmc3k.final)
-vc <- VitessceConfig$new("My config")
+adata_path <- file.path("data", "seurat", "pbmc3k.final.h5ad.zarr")
+
+vitessceAnalysisR::seurat_to_anndata_zarr(pbmc3k.final, adata_path)
+
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(
- SeuratWrapper$new(
- pbmc3k.final,
- cell_embeddings = c("pca", "umap"),
- cell_embedding_names = c("PCA", "UMAP"),
- cell_set_meta_names = c("seurat_annotations", "seurat_clusters"),
- out_dir = file.path("data", "seuratdata")
+ AnnDataWrapper$new(
+ adata_path=adata_path,
+ obs_embedding_paths = c("obsm/X_pca", "obsm/X_umap"),
+ obs_embedding_names = c("PCA", "UMAP"),
+ obs_set_paths = c("obs/seurat_annotations", "obs/seurat_clusters")
)
)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
From 9dfd1fc6855c9f1e2cbbdfbea3dda55056e2f299 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 12:01:07 -0400
Subject: [PATCH 16/22] Update remote vignettes
---
vignettes/web_only/json_remote.Rmd | 16 +++++++---------
vignettes/web_only/ome_tiff_remote.Rmd | 2 +-
2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/vignettes/web_only/json_remote.Rmd b/vignettes/web_only/json_remote.Rmd
index d294a81..8060264 100644
--- a/vignettes/web_only/json_remote.Rmd
+++ b/vignettes/web_only/json_remote.Rmd
@@ -27,26 +27,24 @@ library(vitessceR)
base_url <- "https://s3.amazonaws.com/vitessce-data/0.0.31/master_release/linnarsson/"
# Create Vitessce view config
-vc <- VitessceConfig$new("Codeluppi et al., Nature Methods 2018")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "Codeluppi et al., Nature Methods 2018")
dataset <- vc$add_dataset("Codeluppi")$add_file(
url = paste0(base_url, "linnarsson.cells.json"),
- data_type = DataType$CELLS,
- file_type = FileType$CELLS_JSON
+ file_type = FileType$CELLS_JSON,
+ options = obj_list(
+ embeddingTypes = c("PCA", "t-SNE")
+ )
)$add_file(
url = paste0(base_url, "linnarsson.cell-sets.json"),
- data_type = DataType$CELL_SETS,
file_type = FileType$CELL_SETS_JSON
)$add_file(
url = paste0(base_url, "linnarsson.molecules.json"),
- data_type = DataType$MOLECULES,
file_type = FileType$MOLECULES_JSON
)$add_file(
url = paste0(base_url, "linnarsson.clusters.json"),
- data_type = DataType$EXPRESSION_MATRIX,
file_type = FileType$CLUSTERS_JSON
)$add_file(
url = paste0(base_url, "linnarsson.raster.json"),
- data_type = DataType$RASTER,
file_type = FileType$RASTER_JSON
)
@@ -60,8 +58,8 @@ scatterplot_pca <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
scatterplot_tsne <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "t-SNE")
status <- vc$add_view(dataset, Component$STATUS)
-cell_sets <- vc$add_view(dataset, Component$CELL_SETS)
-gene_list <- vc$add_view(dataset, Component$GENES)
+cell_sets <- vc$add_view(dataset, Component$OBS_SETS)
+gene_list <- vc$add_view(dataset, Component$FEATURE_LIST)
heatmap <- vc$add_view(dataset, Component$HEATMAP)$set_props(transpose = TRUE)
vc$layout(hconcat(
diff --git a/vignettes/web_only/ome_tiff_remote.Rmd b/vignettes/web_only/ome_tiff_remote.Rmd
index 2fc3c60..0ad4203 100644
--- a/vignettes/web_only/ome_tiff_remote.Rmd
+++ b/vignettes/web_only/ome_tiff_remote.Rmd
@@ -37,7 +37,7 @@ file_options = obj_list(
)
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_file(
data_type = DataType$RASTER,
file_type = FileType$RASTER_JSON,
From decad46cc30620c8400c611d6d0ab2fce584f699 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 12:15:29 -0400
Subject: [PATCH 17/22] Add schema_version parameter everywhere
---
R/config.R | 18 ++++++-------
R/constants.R | 9 +++----
R/export.R | 2 +-
R/helpers.R | 8 +++---
R/widget.R | 2 +-
index.md | 4 +--
vignettes/dev_wrapper_subclass.Rmd | 4 +--
vignettes/giotto.Rmd | 23 +++++++++-------
vignettes/json_local.Rmd | 16 +++++------
vignettes/local_data_overview.Rmd | 15 +----------
vignettes/ome_tiff_local.Rmd | 2 +-
vignettes/pkgdown.Rmd | 2 +-
vignettes/seurat_azimuth.Rmd | 40 +++++++++++++++-------------
vignettes/seuratdata.Rmd | 2 +-
vignettes/shiny.Rmd | 6 ++---
vignettes/single_cell_experiment.Rmd | 2 +-
vignettes/spatial_experiment.Rmd | 2 +-
17 files changed, 74 insertions(+), 83 deletions(-)
diff --git a/R/config.R b/R/config.R
index 94db46a..f43ebd9 100644
--- a/R/config.R
+++ b/R/config.R
@@ -128,7 +128,7 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
#' @return Invisible self, to allow chaining.
#' @examples
#' base_url <- "http://localhost:8000/"
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")$add_file(
#' url = paste0(base_url, "cells.json"),
#' data_type = DataType$CELLS,
@@ -450,7 +450,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param uid A unique ID for the dataset. Optional. Created automatically if not provided.
#' @return A new `VitessceConfigDataset` object.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
add_dataset = function(name, uid = NA) {
prev_dataset_uids <- c()
@@ -476,7 +476,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param mapping An optional convenience parameter for setting the `CoordinationType$EMBEDDING_TYPE` coordination value if the component is`Component$SCATTERPLOT`.
#' @return A new `VitessceConfigView` object.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' spatial <- vc$add_view(ds, "spatial")
add_view = function(dataset, component, x = NA, y = NA, w = NA, h = NA, mapping = NA) {
@@ -511,7 +511,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param c_types The coordination types for which to create new coordination scopes.
#' @return A list of new `VitessceConfigCoordinationScope` objects.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' spatial <- vc$add_view(ds, "spatial")
#' c_scopes <- vc$add_coordination(c("spatialZoom", "spatialTargetX"))
@@ -560,7 +560,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param view_concat A concatenation of views.
#' @return Self, to allow chaining.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' spatial <- vc$add_view(ds, "spatial")
#' scatterplot <- vc$add_view(ds, "scatterplot")
@@ -619,7 +619,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' when setting lists or similar more complex values.
#' @return Self, to allow chaining.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ref_dataset <- vc$add_dataset("Reference")
#' qry_dataset <- vc$add_dataset("Query")
#' ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "umap")
@@ -653,7 +653,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param base_url An base URL to prepend to file paths.
#' @return A `list` that can be serialized to JSON.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' vc_list <- vc$to_list(base_url = "http://localhost:8000")
to_list = function(base_url = NA) {
@@ -713,7 +713,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param ... Passes extra keyword arguments to the `vitessce_widget` function.
#' @return The Vitessce htmlwidget.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")
#' description <- vc$add_view(dataset, Component$DESCRIPTION)
#' vc$layout(description)
@@ -729,7 +729,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
#' @param ... Extra parameters to pass through to the export function.
#' @return The Vitessce configuration as a list, with the `base_url` filled in.
#' @examples
- #' vc <- VitessceConfig$new("My config")
+ #' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")
#' description <- vc$add_view(dataset, Component$DESCRIPTION)
#' vc$layout(description)
diff --git a/R/constants.R b/R/constants.R
index 3522406..6e2229a 100644
--- a/R/constants.R
+++ b/R/constants.R
@@ -40,7 +40,7 @@
#'
#' @export
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ref_dataset <- vc$add_dataset("Reference")
#' qry_dataset <- vc$add_dataset("Query")
#' ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "umap")
@@ -105,7 +105,7 @@ CoordinationType <- list(
#' @export
#' @examples
#' base_url <- "http://localhost:8000/"
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")$add_file(
#' url = paste0(base_url, "cells.json"),
#' data_type = DataType$CELLS,
@@ -138,10 +138,9 @@ DataType <- list(
#' @export
#' @examples
#' base_url <- "http://localhost:8000/"
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")$add_file(
#' url = paste0(base_url, "cells.json"),
-#' data_type = DataType$CELLS,
#' file_type = FileType$CELLS_JSON
#' )
FileType <- list(
@@ -178,7 +177,7 @@ FileType <- list(
#'
#' @export
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")
#' description <- vc$add_view(dataset, Component$DESCRIPTION)
#' vc$layout(description)
diff --git a/R/export.R b/R/export.R
index df89b38..3306881 100644
--- a/R/export.R
+++ b/R/export.R
@@ -10,7 +10,7 @@
#' @param out_dir The directory for storing exported files.
#' @returns If `with_config = TRUE`, returns the config after calling `to_list` with the specified `base_url`.
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' dataset <- vc$add_dataset("My dataset")
#' description <- vc$add_view(dataset, Component$DESCRIPTION)
#' vc$layout(description)
diff --git a/R/helpers.R b/R/helpers.R
index d5958a7..9e5a2eb 100644
--- a/R/helpers.R
+++ b/R/helpers.R
@@ -7,10 +7,10 @@
#'
#' @export
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' spatial <- vc$add_view(ds, Component$SPATIAL)
-#' gene_list <- vc$add_view(ds, Component$GENES)
+#' gene_list <- vc$add_view(ds, Component$FEATURE_LIST)
#' vc$layout(hconcat(spatial, gene_list))
#' vc$widget()
hconcat <- function(...) {
@@ -27,10 +27,10 @@ hconcat <- function(...) {
#'
#' @export
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' ds <- vc$add_dataset("My dataset")
#' spatial <- vc$add_view(ds, Component$SPATIAL)
-#' gene_list <- vc$add_view(ds, Component$GENES)
+#' gene_list <- vc$add_view(ds, Component$FEATURE_LIST)
#' vc$layout(vconcat(spatial, gene_list))
#' vc$widget()
vconcat <- function(...) {
diff --git a/R/widget.R b/R/widget.R
index cfbb1d1..20751cc 100644
--- a/R/widget.R
+++ b/R/widget.R
@@ -24,7 +24,7 @@
#' @export
#'
#' @examples
-#' vc <- VitessceConfig$new("My config")
+#' vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
#' vc$widget()
vitessce_widget <- function(config, theme = "dark", width = NULL, height = NULL, port = NA, base_url = NA, serve = TRUE, element_id = NULL) {
diff --git a/index.md b/index.md
index ad3aa92..c5780ce 100644
--- a/index.md
+++ b/index.md
@@ -35,11 +35,11 @@ The simplest way to instantiate a Vitessce widget is to create a view config bas
library(vitessceR)
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "pca")
status <- vc$add_view(dataset, Component$STATUS)
-cell_sets <- vc$add_view(dataset, Component$CELL_SETS)
+cell_sets <- vc$add_view(dataset, Component$OBS_SETS)
vc$layout(hconcat(scatterplot, vconcat(status, cell_sets)))
# Render the Vitessce widget
diff --git a/vignettes/dev_wrapper_subclass.Rmd b/vignettes/dev_wrapper_subclass.Rmd
index fd40cb3..316b010 100644
--- a/vignettes/dev_wrapper_subclass.Rmd
+++ b/vignettes/dev_wrapper_subclass.Rmd
@@ -128,13 +128,13 @@ my_wrapped_object <- MyCustomSeuratWrapper$new(pbmc, cell_sets = cell_sets_list,
Now, we create the Vitessce config as usual:
```r
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_object(my_wrapped_object)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "pca")
status <- vc$add_view(dataset, Component$STATUS)
desc <- vc$add_view(dataset, Component$DESCRIPTION)
desc <- desc$set_props(description = "Visualization of a Seurat object containing the PBMC 3K dataset.")
-cell_sets <- vc$add_view(dataset, Component$CELL_SETS)
+cell_sets <- vc$add_view(dataset, Component$OBS_SETS)
vc$layout(hconcat(
vconcat(scatterplot),
vconcat(cell_sets, vconcat(desc, status))
diff --git a/vignettes/giotto.Rmd b/vignettes/giotto.Rmd
index be60e8b..ad60755 100644
--- a/vignettes/giotto.Rmd
+++ b/vignettes/giotto.Rmd
@@ -14,6 +14,7 @@ First, install the R dependencies:
```r
install.packages("devtools")
devtools::install_github("RubD/Giotto")
+devtools::install_github("vitessce/vitessceAnalysisR")
```
@@ -122,21 +123,25 @@ Set up the Vitessce widget:
```r
library(vitessceR)
+library(vitessceAnalysisR)
-w <- GiottoWrapper$new(
- SS_seqfish,
- cell_set_metas = c("cell_types"),
- cell_set_meta_names = c("Cell Types"),
- cell_embeddings = c("pca", "tsne"),
- cell_embedding_names = c("PCA", "t-SNE"),
- out_dir = file.path("data", "giotto")
+adata_path <- file.path("data", "giotto_seqfish.h5ad.zarr")
+
+vitessceAnalysisR::giotto_to_anndata_zarr(SS_seqfish, adata_path)
+
+w <- AnnDataWrapper$new(
+ adata_path = adata_path,
+ obs_set_paths = c("obs/cell_types"),
+ obs_set_names = c("Cell Types"),
+ obs_embedding_paths = c("obsm/pca", "obsm/tsne"),
+ obs_embedding_names = c("PCA", "t-SNE")
)
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_object(w)
spatial <- vc$add_view(dataset, Component$SPATIAL)
scatterplot_tsne <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "t-SNE")
-cell_sets <- vc$add_view(dataset, Component$CELL_SETS)
+cell_sets <- vc$add_view(dataset, Component$OBS_SETS)
status <- vc$add_view(dataset, Component$STATUS)
desc <- vc$add_view(dataset, Component$DESCRIPTION)
desc <- desc$set_props(description = "Visualization of a Giotto object.")
diff --git a/vignettes/json_local.Rmd b/vignettes/json_local.Rmd
index 4f1c217..0fd95e4 100644
--- a/vignettes/json_local.Rmd
+++ b/vignettes/json_local.Rmd
@@ -50,26 +50,24 @@ library(vitessceR)
base_url <- "http://localhost:8000/"
# Create Vitessce view config
-vc <- VitessceConfig$new("Codeluppi et al., Nature Methods 2018")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "Codeluppi et al., Nature Methods 2018")
dataset <- vc$add_dataset("Codeluppi")$add_file(
url = paste0(base_url, "linnarsson.cells.json"),
- data_type = DataType$CELLS,
- file_type = FileType$CELLS_JSON
+ file_type = FileType$CELLS_JSON,
+ options = obj_list(
+ embeddingTypes = c("PCA", "t-SNE")
+ )
)$add_file(
url = paste0(base_url, "linnarsson.cell-sets.json"),
- data_type = DataType$CELL_SETS,
file_type = FileType$CELL_SETS_JSON
)$add_file(
url = paste0(base_url, "linnarsson.molecules.json"),
- data_type = DataType$MOLECULES,
file_type = FileType$MOLECULES_JSON
)$add_file(
url = paste0(base_url, "linnarsson.clusters.json"),
- data_type = DataType$EXPRESSION_MATRIX,
file_type = FileType$CLUSTERS_JSON
)$add_file(
url = paste0(base_url, "linnarsson.raster.json"),
- data_type = DataType$RASTER,
file_type = FileType$RASTER_JSON
)
@@ -83,8 +81,8 @@ scatterplot_pca <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
scatterplot_tsne <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "t-SNE")
status <- vc$add_view(dataset, Component$STATUS)
-cell_sets <- vc$add_view(dataset, Component$CELL_SETS)
-gene_list <- vc$add_view(dataset, Component$GENES)
+cell_sets <- vc$add_view(dataset, Component$OBS_SETS)
+gene_list <- vc$add_view(dataset, Component$FEATURE_LIST)
heatmap <- vc$add_view(dataset, Component$HEATMAP)$set_props(transpose = TRUE)
vc$layout(hconcat(
diff --git a/vignettes/local_data_overview.Rmd b/vignettes/local_data_overview.Rmd
index 2b44508..62da7d7 100644
--- a/vignettes/local_data_overview.Rmd
+++ b/vignettes/local_data_overview.Rmd
@@ -9,19 +9,6 @@ vignette: >
The main goal of this R package is to enable configuring Vitessce visualizations using R syntax.
-We also aim to simplify the data conversion process by providing [dataset wrapper classes](../reference/index.html#dataset-wrapper-classes) that automatically convert common single-cell data structures to [file formats supported by Vitessce](http://vitessce.io/docs/data-types-file-types/).
-
-Our effort to develop converters for R formats remains ongoing. However, we provide a guide for R developers to [write data conversion functions](./dev_wrapper_class.html) to support any type of R single-cell data structure (or to improve conversion for already-supported data structures).
+We provide functions in the companion vitessceAnalysisR package for conversion of common single-cell data structures to [file formats supported by Vitessce](http://vitessce.io/docs/data-types-file-types/).
The following vignettes in the "Examples with Local Data" section demonstrate how the dataset wrapper classes can be used with single-cell datasets stored on your local machine.
-
-## Zarr via Reticulate via Basilisk
-
-Due to a lack of native R support for Zarr, the R dataset conversion functions currently depend on a Python environment.
-
-We currently use [basilisk](https://github.com/LTLA/basilisk) and [reticulate](https://rstudio.github.io/reticulate/) to write to Zarr stores via the ``zarr`` Python package.
-
-
-## Zarr natively
-
-Subscribe to the [Zarr in R issue](https://github.com/vitessce/vitessce-r/issues/7) for future updates about native Zarr support that would avoid the need for the Python environment.
diff --git a/vignettes/ome_tiff_local.Rmd b/vignettes/ome_tiff_local.Rmd
index 5a3de6a..c5a111c 100644
--- a/vignettes/ome_tiff_local.Rmd
+++ b/vignettes/ome_tiff_local.Rmd
@@ -15,7 +15,7 @@ Configure the Vitessce widget:
library(vitessceR)
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_object(
MultiImageWrapper$new(
image_wrappers = list(
diff --git a/vignettes/pkgdown.Rmd b/vignettes/pkgdown.Rmd
index 5ec139f..add0458 100644
--- a/vignettes/pkgdown.Rmd
+++ b/vignettes/pkgdown.Rmd
@@ -21,7 +21,7 @@ To render a Vitessce widget into a pkgdown article, set the [chunk options](http
`r chunk`{r echo = TRUE}
library(vitessceR)
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
# configure vitessce here
diff --git a/vignettes/seurat_azimuth.Rmd b/vignettes/seurat_azimuth.Rmd
index 826679e..df4655c 100644
--- a/vignettes/seurat_azimuth.Rmd
+++ b/vignettes/seurat_azimuth.Rmd
@@ -198,35 +198,37 @@ ref_obj@reductions$refUMAP@assay.used <- "RNA"
#### Use Vitessce for visualization ####
+ref_adata_path <- file.path(data_dir, "ref.h5ad.zarr")
+qry_adata_path <- file.path(data_dir, "qry.h5ad.zarr")
+
+vitessceAnalysisR::seurat_to_anndata_zarr(ref_obj, ref_adata_path, assay = Seurat::DefaultAssay(ref_obj))
+vitessceAnalysisR::seurat_to_anndata_zarr(qry_obj, qry_adata_path, assay = Seurat::DefaultAssay(qry_obj))
+
# Create Vitessce view config
-vc <- VitessceConfig$new("Azimuth")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "Azimuth")
ref_dataset <- vc$add_dataset("Reference")$add_object(
- SeuratWrapper$new(
- ref_obj,
- assay = Seurat::DefaultAssay(ref_obj),
- cell_embeddings = c("refUMAP"),
- cell_embedding_names = c("UMAP"),
- cell_set_metas = c("celltype.l2"),
- out_dir = file.path(data_dir, "reference"), overwrite = TRUE
+ AnnDataWrapper$new(
+ adata_path = ref_adata_path,
+ obs_embedding_paths = c("obsm/X_refUMAP"),
+ obs_embedding_names = c("UMAP"),
+ obs_set_paths = c("obs/celltype.l2")
)
)
qry_dataset <- vc$add_dataset("Query")$add_object(
- SeuratWrapper$new(
- qry_obj,
- assay = Seurat::DefaultAssay(qry_obj),
- cell_embeddings = c("umap.proj"),
- cell_embedding_names = c("UMAP"),
- cell_set_metas = c("predicted.celltype.l2"),
- cell_set_meta_names = c("celltype.l2"),
- cell_set_meta_scores = c("predicted.celltype.l2.score"),
- out_dir = file.path(data_dir, "query"), overwrite = TRUE
+ AnnDataWrapper$new(
+ adata_path = qry_adata_path,
+ obs_embedding_paths = c("obsm/X_umap.proj"),
+ obs_embedding_names = c("UMAP"),
+ obs_set_paths = c("obs/predicted.celltype.l2"),
+ obs_set_names = c("celltype.l2"),
+ obs_set_score_paths = c("obs/predicted.celltype.l2.score")
)
)
ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "UMAP")
qry_plot <- vc$add_view(qry_dataset, Component$SCATTERPLOT, mapping = "UMAP")
-cell_sets <- vc$add_view(ref_dataset, Component$CELL_SETS)
-cell_sets_2 <- vc$add_view(qry_dataset, Component$CELL_SETS)
+cell_sets <- vc$add_view(ref_dataset, Component$OBS_SETS)
+cell_sets_2 <- vc$add_view(qry_dataset, Component$OBS_SETS)
vc$link_views(
c(ref_plot, qry_plot),
diff --git a/vignettes/seuratdata.Rmd b/vignettes/seuratdata.Rmd
index cb7b0cd..87a875a 100644
--- a/vignettes/seuratdata.Rmd
+++ b/vignettes/seuratdata.Rmd
@@ -33,7 +33,7 @@ force(pbmc3k.final)
all.genes <- rownames(pbmc3k.final)
pbmc3k.final <- ScaleData(pbmc3k.final, features = all.genes, do.center = FALSE)
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(SeuratWrapper$new(
pbmc3k.final,
diff --git a/vignettes/shiny.Rmd b/vignettes/shiny.Rmd
index a3fc550..3b3bbc9 100644
--- a/vignettes/shiny.Rmd
+++ b/vignettes/shiny.Rmd
@@ -43,7 +43,7 @@ ui <- fluidPage(
server <- function(input, output, session) {
output$vitessce_visualization <- render_vitessce(expr = {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
@@ -98,7 +98,7 @@ ui <- fluidPage(
server <- function(input, output, session) {
addResourcePath("vitessce", OUT_DIR)
output$vitessce_visualization <- render_vitessce(expr = {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
@@ -157,7 +157,7 @@ ui <- fluidPage(
server <- function(input, output, session) {
output$vitessce_visualization <- render_vitessce(expr = {
- vc <- VitessceConfig$new("My config")
+ vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
diff --git a/vignettes/single_cell_experiment.Rmd b/vignettes/single_cell_experiment.Rmd
index 4c2554c..4c79743 100644
--- a/vignettes/single_cell_experiment.Rmd
+++ b/vignettes/single_cell_experiment.Rmd
@@ -32,7 +32,7 @@ sce_zeisel <- runPCA(sce_zeisel)
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_object(SCEWrapper$new(
sce_zeisel,
cell_set_metas = c("tissue", "level1class", "level2class"),
diff --git a/vignettes/spatial_experiment.Rmd b/vignettes/spatial_experiment.Rmd
index 5c817d9..dc13b76 100644
--- a/vignettes/spatial_experiment.Rmd
+++ b/vignettes/spatial_experiment.Rmd
@@ -32,7 +32,7 @@ w <- SPEWrapper$new(
)
# Create Vitessce view config
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_object(w)
spatial <- vc$add_view(dataset, Component$SPATIAL)
status <- vc$add_view(dataset, Component$STATUS)
From fcd6b610caffe0d92386347d70ea24ac7443c33f Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 13:44:29 -0400
Subject: [PATCH 18/22] Python path
---
vignettes/giotto.Rmd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vignettes/giotto.Rmd b/vignettes/giotto.Rmd
index ad60755..67e8188 100644
--- a/vignettes/giotto.Rmd
+++ b/vignettes/giotto.Rmd
@@ -31,7 +31,7 @@ instrs <- createGiottoInstructions(
save_plot = TRUE,
show_plot = FALSE,
save_dir = save_dir,
- python_path = "~/miniconda3/envs/vitessce-r-env/bin/python"
+ python_path = "~/software/miniconda3/envs/vitessce-r-env/bin/python"
)
getSpatialDataset(dataset = "seqfish_SS_cortex", directory = save_dir, method = "wget")
From 13be60b8b4d8abeb597d4ccee01982d5d5167ee2 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 14:09:59 -0400
Subject: [PATCH 19/22] Update docs
---
NAMESPACE | 1 +
R/config.R | 11 ++
R/wrappers.R | 39 ++++
R/wrappers_anndata.R | 77 ++++++--
R/wrappers_csv.R | 47 +++--
man/AbstractWrapper.Rd | 116 +++++++++++
man/{SeuratWrapper.Rd => AnnDataWrapper.Rd} | 96 +++++++--
man/Component.Rd | 4 +-
man/CoordinationType.Rd | 4 +-
man/CsvWrapper.Rd | 208 ++++++++++++++++++++
man/DataType.Rd | 2 +-
man/FileType.Rd | 3 +-
man/MultiImageWrapper.Rd | 2 +
man/OmeTiffWrapper.Rd | 2 +
man/VitessceConfig.Rd | 34 ++--
man/VitessceConfigCoordinationScope.Rd | 2 +
man/VitessceConfigDataset.Rd | 14 +-
man/VitessceConfigDatasetFile.Rd | 2 +
man/VitessceConfigServerRangeRoute.Rd | 84 +++++++-
man/export_to_files.Rd | 2 +-
man/hconcat.Rd | 4 +-
man/vconcat.Rd | 4 +-
man/vitessce_widget.Rd | 2 +-
vignettes/shiny.Rmd | 17 +-
24 files changed, 692 insertions(+), 85 deletions(-)
rename man/{SeuratWrapper.Rd => AnnDataWrapper.Rd} (65%)
create mode 100644 man/CsvWrapper.Rd
diff --git a/NAMESPACE b/NAMESPACE
index 8988f2e..52db099 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -4,6 +4,7 @@ export(AbstractWrapper)
export(AnnDataWrapper)
export(Component)
export(CoordinationType)
+export(CsvWrapper)
export(DataType)
export(FileType)
export(MultiImageWrapper)
diff --git a/R/config.R b/R/config.R
index f43ebd9..03aa68c 100644
--- a/R/config.R
+++ b/R/config.R
@@ -60,6 +60,7 @@ VitessceConfigDatasetFile <- R6::R6Class("VitessceConfigDatasetFile",
#' @param data_type A data type for the file.
#' @param file_type A file type for the file.
#' @param options A list of options to include for the file.
+ #' @param coordination_values A list of coordination values to include in the file definition.
#' @return A new `VitessceConfigDatasetFile` object.
initialize = function(url = NA, file_type = NA, options = NA, coordination_values = NA, data_type = NA) {
private$file <- obj_list()
@@ -103,6 +104,7 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
#' Create a new dataset object.
#' @param uid A unique identifier string for the dataset.
#' @param name A name for the dataset
+ #' @param base_dir A directory which local files are configured relative to.
#' @return A new `VitessceConfigDataset` object.
initialize = function(uid, name, base_dir = NA) {
self$dataset <- list(
@@ -113,9 +115,15 @@ VitessceConfigDataset <- R6::R6Class("VitessceConfigDataset",
private$objs <- list()
self$base_dir <- base_dir
},
+ #' @description
+ #' Get the dataset name.
+ #' @return The name as a string.
get_name = function() {
return(self$dataset[['name']])
},
+ #' @description
+ #' Get the dataset UID.
+ #' @return The uid as a string.
get_uid = function() {
return(self$dataset[['uid']])
},
@@ -231,6 +239,7 @@ VitessceConfigCoordinationScope <- R6::R6Class("VitessceConfigCoordinationScope"
#' Create a new coordination scope object.
#' @param c_type A coordination type name.
#' @param c_scope A coordination scope name.
+ #' @param c_value An initial value for the coordination scope.
#' @return A new `VitessceConfigCoordinationScope` object.
initialize = function(c_type, c_scope, c_value = NA) {
self$c_type <- c_type
@@ -374,6 +383,7 @@ VitessceConfigView <- R6::R6Class("VitessceConfigView",
}
invisible(self)
},
+ #' @description
use_coordination_by_dict = function(scopes) {
# TODO
invisible(self)
@@ -429,6 +439,7 @@ VitessceConfig <- R6::R6Class("VitessceConfig",
base_dir = NULL,
#' @description
#' Create a new config object.
+ #' @param schema_version The Vitessce config schema version to use.
#' @param name A name for the config.
#' @param description A description for the config.
#' @return A new `VitessceConfig` object.
diff --git a/R/wrappers.R b/R/wrappers.R
index 2da7232..34681aa 100644
--- a/R/wrappers.R
+++ b/R/wrappers.R
@@ -111,16 +111,42 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
)
return(route)
},
+ #' @description
+ #' Construct a URL to a local directory.
+ #'
+ #' @param base_url The base URL on which the web server is serving.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @param local_dir_path The path to the local directory.
+ #' @param local_dir_uid A unique identifier for this local directory in this dataset.
+ #' @return A string for the URL.
get_local_dir_url = function(base_url, dataset_uid, obj_i, local_dir_path, local_dir_uid) {
if(!self$is_remote && !is.na(self$base_dir)) {
return(self$get_url_simple(base_url, file_path_to_url_path(local_dir_path, prepend_slash = FALSE)))
}
return(self$get_url(base_url, dataset_uid, obj_i, local_dir_uid))
},
+ #' @description
+ #' Construct a URL to a local file.
+ #'
+ #' @param base_url The base URL on which the web server is serving.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @param local_file_path The path to the local file.
+ #' @param local_file_uid A unique identifier for this local file in this dataset.
+ #' @return A string for the URL.
get_local_file_url = function(base_url, dataset_uid, obj_i, local_file_path, local_file_uid) {
# Same logic as get_local_dir_url
return(self$get_local_dir_url(base_url, dataset_uid, obj_i, local_file_path, local_file_uid))
},
+ #' @description
+ #' Create a web server route for this object.
+ #'
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @param local_dir_path The path to the local directory.
+ #' @param local_dir_uid A unique identifier for this local directory in this dataset.
+ #' @return A new `VitessceConfigServerStaticRoute` instance.
get_local_dir_route = function(dataset_uid, obj_i, local_dir_path, local_dir_uid) {
if(!self$is_remote) {
if(is.na(self$base_dir)) {
@@ -137,6 +163,14 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
}
return(list())
},
+ #' @description
+ #' Create a web server route for this object.
+ #'
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
+ #' @param local_file_path The path to the local file.
+ #' @param local_file_uid A unique identifier for this local file in this dataset.
+ #' @return A new `VitessceConfigServerFileRoute` instance.
get_local_file_route = function(dataset_uid, obj_i, local_file_path, local_file_uid) {
if(!self$is_remote) {
if(is.na(self$base_dir)) {
@@ -166,6 +200,11 @@ AbstractWrapper <- R6::R6Class("AbstractWrapper",
retval <- paste0(base_url, self$get_route_str(dataset_uid, obj_i, ...))
return(retval)
},
+ #' @description
+ #' Construct a URL.
+ #' @param base_url The base URL on which the web server is serving.
+ #' @param suffix The suffix to append to the base URL.
+ #' @return A URL as a string like {base_url}/{suffix}
get_url_simple = function(base_url, suffix) {
return(paste0(base_url, "/", suffix))
},
diff --git a/R/wrappers_anndata.R b/R/wrappers_anndata.R
index a455c37..62bb58c 100644
--- a/R/wrappers_anndata.R
+++ b/R/wrappers_anndata.R
@@ -1,18 +1,11 @@
-#' Seurat object wrapper class
-#' @title SeuratWrapper Class
+#' AnnData object wrapper class
+#' @title AnnDataWrapper Class
#' @docType class
#' @description
-#' Class representing a local Seurat object in a Vitessce dataset.
+#' Class representing an AnnData object (saved to a Zarr store) in a Vitessce dataset.
#'
-#' @rdname SeuratWrapper
+#' @rdname AnnDataWrapper
#' @export
-#' @examples
-#' obj <- get_seurat_obj()
-#' w <- SeuratWrapper$new(
-#' obj,
-#' cell_embeddings = c("pca"),
-#' cell_embedding_names = c("PCA")
-#' )
AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
inherit = AbstractWrapper,
public = list(
@@ -25,30 +18,77 @@ AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
#' @field local_dir_uid The path to the local zarr store.
#' @keywords internal
local_dir_uid = NULL,
-
-
+ #' @field obs_feature_matrix_path The path to the observation-by-feature matrix within the Zarr store.
+ #' @keywords internal
obs_feature_matrix_path=NULL,
+ #' @field feature_filter_path The path to the a column of adata.var within the Zarr store.
+ #' Use this if obs_feature_matrix_path points to a subset of adata.X (relative to the full adata.var).
+ #' @keywords internal
feature_filter_path=NULL,
+ #' @field initial_feature_filter_path The path to the a column of adata.var within the Zarr store.
+ #' Use this to load a subset of the matrix at obs_feature_matrix_path initially.
+ #' @keywords internal
initial_feature_filter_path=NULL,
+ #' @field obs_set_paths A list of paths to the observation sets within the Zarr store.
+ #' @keywords internal
obs_set_paths=NULL,
+ #' @field obs_set_names A list of names for the observation sets.
+ #' @keywords internal
obs_set_names=NULL,
+ #' @field obs_locations_path The path to the observation locations within the Zarr store.
+ #' @keywords internal
obs_locations_path=NULL,
+ #' @field obs_segmentations_path The path to the observation segmentations within the Zarr store.
+ #' @keywords internal
obs_segmentations_path=NULL,
+ #' @field obs_embedding_paths A list of paths to the observation embeddings within the Zarr store.
+ #' @keywords internal
obs_embedding_paths=NULL,
+ #' @field obs_embedding_names A list of names for the observation embeddings.
+ #' @keywords internal
obs_embedding_names=NULL,
+ #' @field obs_embedding_dims A list of dimensions for the observation embeddings.
+ #' @keywords internal
obs_embedding_dims=NULL,
- request_init=NULL,
+ #' @field feature_labels_path The path to the feature labels within the Zarr store.
+ #' @keywords internal
feature_labels_path=NULL,
+ #' @field obs_labels_path The path to the observation labels within the Zarr store.
+ #' @keywords internal
obs_labels_path=NULL,
+ #' @field obs_labels_paths A list of paths to the observation labels within the Zarr store.
+ #' @keywords internal
obs_labels_paths=NULL,
+ #' @field obs_labels_names A list of names for the observation labels.
+ #' @keywords internal
obs_labels_names=NULL,
+ #' @field coordination_values A list of coordination values for the file definition.
+ #' @keywords internal
coordination_values=NULL,
-
+ #' @field request_init A list of requestInit options for the Zarr store.
+ #' @keywords internal
+ request_init=NULL,
#' @description
#' Create a wrapper around an AnnData object saved to a Zarr store.
#' @param adata_path The path to a local Zarr store.
+ #' @param adata_url The URL to a remote Zarr store.
+ #' @param obs_feature_matrix_path The path to the observation-by-feature matrix within the Zarr store.
+ #' @param feature_filter_path The path to the a column of adata.var within the Zarr store. Use this if obs_feature_matrix_path points to a subset of adata.X (relative to the full adata.var).
+ #' @param initial_feature_filter_path The path to the a column of adata.var within the Zarr store. Use this to load a subset of the matrix at obs_feature_matrix_path initially.
+ #' @param obs_set_paths A list of paths to the observation sets within the Zarr store.
+ #' @param obs_set_names A list of names for the observation sets.
+ #' @param obs_locations_path The path to the observation locations within the Zarr store.
+ #' @param obs_segmentations_path The path to the observation segmentations within the Zarr store.
+ #' @param obs_embedding_paths A list of paths to the observation embeddings within the Zarr store.
+ #' @param obs_embedding_names A list of names for the observation embeddings.
+ #' @param obs_embedding_dims A list of dimensions for the observation embeddings.
+ #' @param request_init A list of requestInit options for the Zarr store.
+ #' @param feature_labels_path The path to the feature labels within the Zarr store.
+ #' @param obs_labels_paths A list of paths to the observation labels within the Zarr store.
+ #' @param obs_labels_names A list of names for the observation labels.
+ #' @param coordination_values A list of coordination values for the file definition.
#' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `SeuratWrapper` object.
+ #' @return A new `AnnDataWrapper` object.
initialize = function(adata_path = NA, adata_url = NA, obs_feature_matrix_path = NA, feature_filter_path = NA, initial_feature_filter_path = NA, obs_set_paths = NA, obs_set_names = NA, obs_locations_path = NA, obs_segmentations_path = NA, obs_embedding_paths = NA, obs_embedding_names = NA, obs_embedding_dims = NA, request_init = NA, feature_labels_path = NA, obs_labels_path = NA, coordination_values = NA, obs_labels_paths = NA, obs_labels_names = NA, ...) {
super$initialize(...)
self$adata_path <- adata_path
@@ -91,6 +131,7 @@ AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
#' Create the JSON output files, web server routes, and file definition creators.
#' @param dataset_uid The ID for this dataset.
#' @param obj_i The index of this data object within the dataset.
+ #' @param base_dir A base directory for local data.
convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
if(self$is_remote) {
super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
@@ -108,6 +149,10 @@ AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
self$routes <- append(self$routes, route)
}
},
+ #' @description
+ #' Get a list of server route objects.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
make_routes = function(dataset_uid, obj_i) {
return(self$get_local_dir_route(dataset_uid, obj_i, self$adata_path, self$local_dir_uid))
},
diff --git a/R/wrappers_csv.R b/R/wrappers_csv.R
index 67d8bbd..40ab324 100644
--- a/R/wrappers_csv.R
+++ b/R/wrappers_csv.R
@@ -1,42 +1,46 @@
-#' Seurat object wrapper class
-#' @title SeuratWrapper Class
+#' CSV file wrapper class
+#' @title CsvWrapper Class
#' @docType class
#' @description
-#' Class representing a local Seurat object in a Vitessce dataset.
+#' Class representing a CSV file in a Vitessce dataset.
#'
-#' @rdname SeuratWrapper
+#' @rdname CsvWrapper
#' @export
-#' @examples
-#' obj <- get_seurat_obj()
-#' w <- SeuratWrapper$new(
-#' obj,
-#' cell_embeddings = c("pca"),
-#' cell_embedding_names = c("PCA")
-#' )
CsvWrapper <- R6::R6Class("CsvWrapper",
inherit = AbstractWrapper,
public = list(
- #' @field adata_path The object to wrap.
+ #' @field csv_path The object to wrap.
#' @keywords internal
csv_path = NULL,
- #' @field adata_url The object to wrap.
+ #' @field csv_url The object to wrap.
#' @keywords internal
csv_url = NULL,
- #' @field local_dir_uid The path to the local zarr store.
+ #' @field local_csv_uid The path to the local zarr store.
#' @keywords internal
local_csv_uid = NULL,
-
+ #' @field data_type The Vitessce data type for this file.
+ #' @keywords internal
data_type = NULL,
+ #' @field options A list of options to pass to the Vitessce file definition.
+ #' @keywords internal
options=NULL,
+ #' @field coordination_values A list of coordination values to pass to the Vitessce file definition.
+ #' @keywords internal
coordination_values=NULL,
+ #' @field request_init A list of requestInit values to pass to fetch when loading the CSV over HTTP.
+ #' @keywords internal
request_init = NULL,
-
#' @description
- #' Create a wrapper around an AnnData object saved to a Zarr store.
- #' @param adata_path The path to a local Zarr store.
+ #' Create a wrapper around a CSV file.
+ #' @param csv_path The path to a local CSV file.
+ #' @param csv_url The URL to a remote CSV file.
+ #' @param data_type The Vitessce data type for this file.
+ #' @param options A list of options to pass to the Vitessce file definition.
+ #' @param coordination_values A list of coordination values to pass to the Vitessce file definition.
+ #' @param request_init A list of requestInit values to pass to fetch when loading the CSV over HTTP.
#' @param ... Parameters inherited from `AbstractWrapper`.
- #' @return A new `SeuratWrapper` object.
+ #' @return A new `CsvWrapper` object.
initialize = function(csv_path = NA, csv_url = NA, data_type = NA, options = NA, coordination_values = NA, request_init = NA, ...) {
super$initialize(...)
self$csv_path <- csv_path
@@ -71,6 +75,7 @@ CsvWrapper <- R6::R6Class("CsvWrapper",
#' Create the JSON output files, web server routes, and file definition creators.
#' @param dataset_uid The ID for this dataset.
#' @param obj_i The index of this data object within the dataset.
+ #' @param base_dir A base directory for local data.
convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
if(self$is_remote) {
super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
@@ -88,6 +93,10 @@ CsvWrapper <- R6::R6Class("CsvWrapper",
self$routes <- append(self$routes, route)
}
},
+ #' @description
+ #' Get a list of server route objects.
+ #' @param dataset_uid The ID for this dataset.
+ #' @param obj_i The index of this data object within the dataset.
make_routes = function(dataset_uid, obj_i) {
return(self$get_local_file_route(dataset_uid, obj_i, self$csv_path, self$local_csv_uid))
},
diff --git a/man/AbstractWrapper.Rd b/man/AbstractWrapper.Rd
index 6f57f3e..b4d561a 100644
--- a/man/AbstractWrapper.Rd
+++ b/man/AbstractWrapper.Rd
@@ -37,7 +37,9 @@ Abstract dataset object wrapper class
\item \href{#method-AbstractWrapper-get_file_defs}{\code{AbstractWrapper$get_file_defs()}}
\item \href{#method-AbstractWrapper-get_out_dir_route}{\code{AbstractWrapper$get_out_dir_route()}}
\item \href{#method-AbstractWrapper-get_local_dir_url}{\code{AbstractWrapper$get_local_dir_url()}}
+\item \href{#method-AbstractWrapper-get_local_file_url}{\code{AbstractWrapper$get_local_file_url()}}
\item \href{#method-AbstractWrapper-get_local_dir_route}{\code{AbstractWrapper$get_local_dir_route()}}
+\item \href{#method-AbstractWrapper-get_local_file_route}{\code{AbstractWrapper$get_local_file_route()}}
\item \href{#method-AbstractWrapper-get_url}{\code{AbstractWrapper$get_url()}}
\item \href{#method-AbstractWrapper-get_url_simple}{\code{AbstractWrapper$get_url_simple()}}
\item \href{#method-AbstractWrapper-get_route_str}{\code{AbstractWrapper$get_route_str()}}
@@ -151,6 +153,7 @@ A new \code{VitessceConfigServerStaticRoute} instance.
\if{html}{\out{}}
\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_dir_url}{}}}
\subsection{Method \code{get_local_dir_url()}}{
+Construct a URL to a local directory.
\subsection{Usage}{
\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_dir_url(
base_url,
@@ -161,11 +164,64 @@ A new \code{VitessceConfigServerStaticRoute} instance.
)}\if{html}{\out{
}}
}
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{base_url}}{The base URL on which the web server is serving.}
+
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{local_dir_path}}{The path to the local directory.}
+
+\item{\code{local_dir_uid}}{A unique identifier for this local directory in this dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A string for the URL.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_file_url}{}}}
+\subsection{Method \code{get_local_file_url()}}{
+Construct a URL to a local file.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_file_url(
+ base_url,
+ dataset_uid,
+ obj_i,
+ local_file_path,
+ local_file_uid
+)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{base_url}}{The base URL on which the web server is serving.}
+
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{local_file_path}}{The path to the local file.}
+
+\item{\code{local_file_uid}}{A unique identifier for this local file in this dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A string for the URL.
+}
}
\if{html}{\out{
}}
\if{html}{\out{}}
\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_dir_route}{}}}
\subsection{Method \code{get_local_dir_route()}}{
+Create a web server route for this object.
\subsection{Usage}{
\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_dir_route(
dataset_uid,
@@ -175,6 +231,53 @@ A new \code{VitessceConfigServerStaticRoute} instance.
)}\if{html}{\out{
}}
}
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{local_dir_path}}{The path to the local directory.}
+
+\item{\code{local_dir_uid}}{A unique identifier for this local directory in this dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A new \code{VitessceConfigServerStaticRoute} instance.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_local_file_route}{}}}
+\subsection{Method \code{get_local_file_route()}}{
+Create a web server route for this object.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{AbstractWrapper$get_local_file_route(
+ dataset_uid,
+ obj_i,
+ local_file_path,
+ local_file_uid
+)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{local_file_path}}{The path to the local file.}
+
+\item{\code{local_file_uid}}{A unique identifier for this local file in this dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A new \code{VitessceConfigServerFileRoute} instance.
+}
}
\if{html}{\out{
}}
\if{html}{\out{}}
@@ -206,10 +309,23 @@ A URL as a string.
\if{html}{\out{}}
\if{latex}{\out{\hypertarget{method-AbstractWrapper-get_url_simple}{}}}
\subsection{Method \code{get_url_simple()}}{
+Construct a URL.
\subsection{Usage}{
\if{html}{\out{}}\preformatted{AbstractWrapper$get_url_simple(base_url, suffix)}\if{html}{\out{
}}
}
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{base_url}}{The base URL on which the web server is serving.}
+
+\item{\code{suffix}}{The suffix to append to the base URL.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A URL as a string like {base_url}/{suffix}
+}
}
\if{html}{\out{
}}
\if{html}{\out{}}
diff --git a/man/SeuratWrapper.Rd b/man/AnnDataWrapper.Rd
similarity index 65%
rename from man/SeuratWrapper.Rd
rename to man/AnnDataWrapper.Rd
index 139b693..886ffbe 100644
--- a/man/SeuratWrapper.Rd
+++ b/man/AnnDataWrapper.Rd
@@ -3,20 +3,12 @@
\docType{class}
\name{AnnDataWrapper}
\alias{AnnDataWrapper}
-\title{SeuratWrapper Class}
+\title{AnnDataWrapper Class}
\description{
-Class representing a local Seurat object in a Vitessce dataset.
+Class representing an AnnData object (saved to a Zarr store) in a Vitessce dataset.
}
\details{
-Seurat object wrapper class
-}
-\examples{
-obj <- get_seurat_obj()
-w <- SeuratWrapper$new(
- obj,
- cell_embeddings = c("pca"),
- cell_embedding_names = c("PCA")
-)
+AnnData object wrapper class
}
\keyword{internal}
\section{Super class}{
@@ -30,6 +22,40 @@ w <- SeuratWrapper$new(
\item{\code{adata_url}}{The object to wrap.}
\item{\code{local_dir_uid}}{The path to the local zarr store.}
+
+\item{\code{obs_feature_matrix_path}}{The path to the observation-by-feature matrix within the Zarr store.}
+
+\item{\code{feature_filter_path}}{The path to the a column of adata.var within the Zarr store.
+Use this if obs_feature_matrix_path points to a subset of adata.X (relative to the full adata.var).}
+
+\item{\code{initial_feature_filter_path}}{The path to the a column of adata.var within the Zarr store.
+Use this to load a subset of the matrix at obs_feature_matrix_path initially.}
+
+\item{\code{obs_set_paths}}{A list of paths to the observation sets within the Zarr store.}
+
+\item{\code{obs_set_names}}{A list of names for the observation sets.}
+
+\item{\code{obs_locations_path}}{The path to the observation locations within the Zarr store.}
+
+\item{\code{obs_segmentations_path}}{The path to the observation segmentations within the Zarr store.}
+
+\item{\code{obs_embedding_paths}}{A list of paths to the observation embeddings within the Zarr store.}
+
+\item{\code{obs_embedding_names}}{A list of names for the observation embeddings.}
+
+\item{\code{obs_embedding_dims}}{A list of dimensions for the observation embeddings.}
+
+\item{\code{feature_labels_path}}{The path to the feature labels within the Zarr store.}
+
+\item{\code{obs_labels_path}}{The path to the observation labels within the Zarr store.}
+
+\item{\code{obs_labels_paths}}{A list of paths to the observation labels within the Zarr store.}
+
+\item{\code{obs_labels_names}}{A list of names for the observation labels.}
+
+\item{\code{coordination_values}}{A list of coordination values for the file definition.}
+
+\item{\code{request_init}}{A list of requestInit options for the Zarr store.}
}
\if{html}{\out{}}
}
@@ -51,6 +77,8 @@ w <- SeuratWrapper$new(
vitessceR::AbstractWrapper$get_file_defs()
vitessceR::AbstractWrapper$get_local_dir_route()
vitessceR::AbstractWrapper$get_local_dir_url()
+vitessceR::AbstractWrapper$get_local_file_route()
+vitessceR::AbstractWrapper$get_local_file_url()
vitessceR::AbstractWrapper$get_out_dir()
vitessceR::AbstractWrapper$get_out_dir_route()
vitessceR::AbstractWrapper$get_route_str()
@@ -94,12 +122,44 @@ Create a wrapper around an AnnData object saved to a Zarr store.
\describe{
\item{\code{adata_path}}{The path to a local Zarr store.}
+\item{\code{adata_url}}{The URL to a remote Zarr store.}
+
+\item{\code{obs_feature_matrix_path}}{The path to the observation-by-feature matrix within the Zarr store.}
+
+\item{\code{feature_filter_path}}{The path to the a column of adata.var within the Zarr store. Use this if obs_feature_matrix_path points to a subset of adata.X (relative to the full adata.var).}
+
+\item{\code{initial_feature_filter_path}}{The path to the a column of adata.var within the Zarr store. Use this to load a subset of the matrix at obs_feature_matrix_path initially.}
+
+\item{\code{obs_set_paths}}{A list of paths to the observation sets within the Zarr store.}
+
+\item{\code{obs_set_names}}{A list of names for the observation sets.}
+
+\item{\code{obs_locations_path}}{The path to the observation locations within the Zarr store.}
+
+\item{\code{obs_segmentations_path}}{The path to the observation segmentations within the Zarr store.}
+
+\item{\code{obs_embedding_paths}}{A list of paths to the observation embeddings within the Zarr store.}
+
+\item{\code{obs_embedding_names}}{A list of names for the observation embeddings.}
+
+\item{\code{obs_embedding_dims}}{A list of dimensions for the observation embeddings.}
+
+\item{\code{request_init}}{A list of requestInit options for the Zarr store.}
+
+\item{\code{feature_labels_path}}{The path to the feature labels within the Zarr store.}
+
+\item{\code{coordination_values}}{A list of coordination values for the file definition.}
+
+\item{\code{obs_labels_paths}}{A list of paths to the observation labels within the Zarr store.}
+
+\item{\code{obs_labels_names}}{A list of names for the observation labels.}
+
\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
}
\if{html}{\out{}}
}
\subsection{Returns}{
-A new \code{SeuratWrapper} object.
+A new \code{AnnDataWrapper} object.
}
}
\if{html}{\out{
}}
@@ -117,6 +177,8 @@ Create the JSON output files, web server routes, and file definition creators.
\item{\code{dataset_uid}}{The ID for this dataset.}
\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{base_dir}}{A base directory for local data.}
}
\if{html}{\out{}}
}
@@ -125,10 +187,20 @@ Create the JSON output files, web server routes, and file definition creators.
\if{html}{\out{}}
\if{latex}{\out{\hypertarget{method-AnnDataWrapper-make_routes}{}}}
\subsection{Method \code{make_routes()}}{
+Get a list of server route objects.
\subsection{Usage}{
\if{html}{\out{}}\preformatted{AnnDataWrapper$make_routes(dataset_uid, obj_i)}\if{html}{\out{
}}
}
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+}
+\if{html}{\out{
}}
+}
}
\if{html}{\out{
}}
\if{html}{\out{}}
diff --git a/man/Component.Rd b/man/Component.Rd
index 36ce25e..2b6f396 100644
--- a/man/Component.Rd
+++ b/man/Component.Rd
@@ -5,7 +5,7 @@
\alias{Component}
\title{Enumeration of Component values}
\format{
-An object of class \code{list} of length 10.
+An object of class \code{list} of length 12.
}
\usage{
Component
@@ -26,7 +26,7 @@ valid string constant values representing components.
}
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
diff --git a/man/CoordinationType.Rd b/man/CoordinationType.Rd
index 9619756..bc6716b 100644
--- a/man/CoordinationType.Rd
+++ b/man/CoordinationType.Rd
@@ -5,7 +5,7 @@
\alias{CoordinationType}
\title{Enumeration of Coordination Type values}
\format{
-An object of class \code{list} of length 34.
+An object of class \code{list} of length 35.
}
\usage{
CoordinationType
@@ -50,7 +50,7 @@ in the coordination space.
}
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ref_dataset <- vc$add_dataset("Reference")
qry_dataset <- vc$add_dataset("Query")
ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "umap")
diff --git a/man/CsvWrapper.Rd b/man/CsvWrapper.Rd
new file mode 100644
index 0000000..d28c90f
--- /dev/null
+++ b/man/CsvWrapper.Rd
@@ -0,0 +1,208 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/wrappers_csv.R
+\docType{class}
+\name{CsvWrapper}
+\alias{CsvWrapper}
+\title{CsvWrapper Class}
+\description{
+Class representing a CSV file in a Vitessce dataset.
+}
+\details{
+CSV file wrapper class
+}
+\keyword{internal}
+\section{Super class}{
+\code{\link[vitessceR:AbstractWrapper]{vitessceR::AbstractWrapper}} -> \code{CsvWrapper}
+}
+\section{Public fields}{
+\if{html}{\out{}}
+\describe{
+\item{\code{csv_path}}{The object to wrap.}
+
+\item{\code{csv_url}}{The object to wrap.}
+
+\item{\code{local_csv_uid}}{The path to the local zarr store.}
+
+\item{\code{data_type}}{The Vitessce data type for this file.}
+
+\item{\code{options}}{A list of options to pass to the Vitessce file definition.}
+
+\item{\code{coordination_values}}{A list of coordination values to pass to the Vitessce file definition.}
+
+\item{\code{request_init}}{A list of requestInit values to pass to fetch when loading the CSV over HTTP.}
+}
+\if{html}{\out{
}}
+}
+\section{Methods}{
+\subsection{Public methods}{
+\itemize{
+\item \href{#method-CsvWrapper-new}{\code{CsvWrapper$new()}}
+\item \href{#method-CsvWrapper-convert_and_save}{\code{CsvWrapper$convert_and_save()}}
+\item \href{#method-CsvWrapper-make_routes}{\code{CsvWrapper$make_routes()}}
+\item \href{#method-CsvWrapper-get_csv_url}{\code{CsvWrapper$get_csv_url()}}
+\item \href{#method-CsvWrapper-make_file_def_creator}{\code{CsvWrapper$make_file_def_creator()}}
+\item \href{#method-CsvWrapper-clone}{\code{CsvWrapper$clone()}}
+}
+}
+\if{html}{\out{
+Inherited methods
+
+
+}}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-new}{}}}
+\subsection{Method \code{new()}}{
+Create a wrapper around a CSV file.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$new(
+ csv_path = NA,
+ csv_url = NA,
+ data_type = NA,
+ options = NA,
+ coordination_values = NA,
+ request_init = NA,
+ ...
+)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{csv_path}}{The path to a local CSV file.}
+
+\item{\code{csv_url}}{The URL to a remote CSV file.}
+
+\item{\code{data_type}}{The Vitessce data type for this file.}
+
+\item{\code{options}}{A list of options to pass to the Vitessce file definition.}
+
+\item{\code{coordination_values}}{A list of coordination values to pass to the Vitessce file definition.}
+
+\item{\code{request_init}}{A list of requestInit values to pass to fetch when loading the CSV over HTTP.}
+
+\item{\code{...}}{Parameters inherited from \code{AbstractWrapper}.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A new \code{CsvWrapper} object.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-convert_and_save}{}}}
+\subsection{Method \code{convert_and_save()}}{
+Create the JSON output files, web server routes, and file definition creators.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$convert_and_save(dataset_uid, obj_i, base_dir = NA)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+
+\item{\code{base_dir}}{A base directory for local data.}
+}
+\if{html}{\out{
}}
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-make_routes}{}}}
+\subsection{Method \code{make_routes()}}{
+Get a list of server route objects.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$make_routes(dataset_uid, obj_i)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+}
+\if{html}{\out{
}}
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-get_csv_url}{}}}
+\subsection{Method \code{get_csv_url()}}{
+Get the URL to the Zarr store, to fill in the file URL in the file definitions.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$get_csv_url(base_url, dataset_uid, obj_i)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{base_url}}{The base URL, on which the route will be served.}
+
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A URL as a string.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-make_file_def_creator}{}}}
+\subsection{Method \code{make_file_def_creator()}}{
+Make the file definition creator function for the cells data type.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$make_file_def_creator(dataset_uid, obj_i)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{dataset_uid}}{The ID for this dataset.}
+
+\item{\code{obj_i}}{The index of this data object within the dataset.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A file definition creator function which takes a \code{base_url} parameter.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{}}
+\if{latex}{\out{\hypertarget{method-CsvWrapper-clone}{}}}
+\subsection{Method \code{clone()}}{
+The objects of this class are cloneable with this method.
+\subsection{Usage}{
+\if{html}{\out{}}\preformatted{CsvWrapper$clone(deep = FALSE)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{}}
+\describe{
+\item{\code{deep}}{Whether to make a deep clone.}
+}
+\if{html}{\out{
}}
+}
+}
+}
diff --git a/man/DataType.Rd b/man/DataType.Rd
index a5be5e9..0e94a6b 100644
--- a/man/DataType.Rd
+++ b/man/DataType.Rd
@@ -25,7 +25,7 @@ for dataset files.
}
\examples{
base_url <- "http://localhost:8000/"
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_file(
url = paste0(base_url, "cells.json"),
data_type = DataType$CELLS,
diff --git a/man/FileType.Rd b/man/FileType.Rd
index c5810d3..1989981 100644
--- a/man/FileType.Rd
+++ b/man/FileType.Rd
@@ -26,10 +26,9 @@ for dataset files.
}
\examples{
base_url <- "http://localhost:8000/"
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_file(
url = paste0(base_url, "cells.json"),
- data_type = DataType$CELLS,
file_type = FileType$CELLS_JSON
)
}
diff --git a/man/MultiImageWrapper.Rd b/man/MultiImageWrapper.Rd
index 64a65f0..c39b129 100644
--- a/man/MultiImageWrapper.Rd
+++ b/man/MultiImageWrapper.Rd
@@ -40,6 +40,8 @@ Image wrapper class
vitessceR::AbstractWrapper$get_file_defs()
vitessceR::AbstractWrapper$get_local_dir_route()
vitessceR::AbstractWrapper$get_local_dir_url()
+vitessceR::AbstractWrapper$get_local_file_route()
+vitessceR::AbstractWrapper$get_local_file_url()
vitessceR::AbstractWrapper$get_out_dir()
vitessceR::AbstractWrapper$get_out_dir_route()
vitessceR::AbstractWrapper$get_route_str()
diff --git a/man/OmeTiffWrapper.Rd b/man/OmeTiffWrapper.Rd
index 3a8bf3e..fbf71ce 100644
--- a/man/OmeTiffWrapper.Rd
+++ b/man/OmeTiffWrapper.Rd
@@ -52,6 +52,8 @@ this image (see http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-ma
vitessceR::AbstractWrapper$get_file_defs()
vitessceR::AbstractWrapper$get_local_dir_route()
vitessceR::AbstractWrapper$get_local_dir_url()
+vitessceR::AbstractWrapper$get_local_file_route()
+vitessceR::AbstractWrapper$get_local_file_url()
vitessceR::AbstractWrapper$get_out_dir()
vitessceR::AbstractWrapper$get_out_dir_route()
vitessceR::AbstractWrapper$get_route_str()
diff --git a/man/VitessceConfig.Rd b/man/VitessceConfig.Rd
index 6642e5c..9dbcaf0 100644
--- a/man/VitessceConfig.Rd
+++ b/man/VitessceConfig.Rd
@@ -16,14 +16,14 @@ VitessceConfig
## Method `VitessceConfig$add_dataset`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
## ------------------------------------------------
## Method `VitessceConfig$add_view`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
@@ -31,7 +31,7 @@ spatial <- vc$add_view(ds, "spatial")
## Method `VitessceConfig$add_coordination`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
c_scopes <- vc$add_coordination(c("spatialZoom", "spatialTargetX"))
@@ -41,7 +41,7 @@ spatial$use_coordination(c_scopes)
## Method `VitessceConfig$layout`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
scatterplot <- vc$add_view(ds, "scatterplot")
@@ -50,7 +50,7 @@ scatterplot <- vc$add_view(ds, "scatterplot")
## Method `VitessceConfig$link_views`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ref_dataset <- vc$add_dataset("Reference")
qry_dataset <- vc$add_dataset("Query")
ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "umap")
@@ -65,7 +65,7 @@ vc$link_views(
## Method `VitessceConfig$to_list`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
vc_list <- vc$to_list(base_url = "http://localhost:8000")
@@ -73,7 +73,7 @@ vc_list <- vc$to_list(base_url = "http://localhost:8000")
## Method `VitessceConfig$widget`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
@@ -83,7 +83,7 @@ vc$widget()
## Method `VitessceConfig$export`
## ------------------------------------------------
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
@@ -129,6 +129,8 @@ Create a new config object.
\subsection{Arguments}{
\if{html}{\out{}}
\describe{
+\item{\code{schema_version}}{The Vitessce config schema version to use.}
+
\item{\code{name}}{A name for the config.}
\item{\code{description}}{A description for the config.}
@@ -162,7 +164,7 @@ A new \code{VitessceConfigDataset} object.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
}
\if{html}{\out{
}}
@@ -211,7 +213,7 @@ A new \code{VitessceConfigView} object.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
}
@@ -241,7 +243,7 @@ A list of new \code{VitessceConfigCoordinationScope} objects.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
c_scopes <- vc$add_coordination(c("spatialZoom", "spatialTargetX"))
@@ -300,7 +302,7 @@ Self, to allow chaining.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, "spatial")
scatterplot <- vc$add_view(ds, "scatterplot")
@@ -341,7 +343,7 @@ Self, to allow chaining.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ref_dataset <- vc$add_dataset("Reference")
qry_dataset <- vc$add_dataset("Query")
ref_plot <- vc$add_view(ref_dataset, Component$SCATTERPLOT, mapping = "umap")
@@ -378,7 +380,7 @@ A \code{list} that can be serialized to JSON.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
vc_list <- vc$to_list(base_url = "http://localhost:8000")
}
@@ -437,7 +439,7 @@ The Vitessce htmlwidget.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
@@ -475,7 +477,7 @@ The Vitessce configuration as a list, with the \code{base_url} filled in.
}
\subsection{Examples}{
\if{html}{\out{
}}
-\preformatted{vc <- VitessceConfig$new("My config")
+\preformatted{vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
diff --git a/man/VitessceConfigCoordinationScope.Rd b/man/VitessceConfigCoordinationScope.Rd
index 00def26..cb7d30a 100644
--- a/man/VitessceConfigCoordinationScope.Rd
+++ b/man/VitessceConfigCoordinationScope.Rd
@@ -45,6 +45,8 @@ Create a new coordination scope object.
\item{\code{c_type}}{A coordination type name.}
\item{\code{c_scope}}{A coordination scope name.}
+
+\item{\code{c_value}}{An initial value for the coordination scope.}
}
\if{html}{\out{
}}
}
diff --git a/man/VitessceConfigDataset.Rd b/man/VitessceConfigDataset.Rd
index 884a4d0..5a44219 100644
--- a/man/VitessceConfigDataset.Rd
+++ b/man/VitessceConfigDataset.Rd
@@ -17,7 +17,7 @@ Dataset in a VitessceConfig
## ------------------------------------------------
base_url <- "http://localhost:8000/"
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_file(
url = paste0(base_url, "cells.json"),
data_type = DataType$CELLS,
@@ -61,6 +61,8 @@ Create a new dataset object.
\item{\code{uid}}{A unique identifier string for the dataset.}
\item{\code{name}}{A name for the dataset}
+
+\item{\code{base_dir}}{A directory which local files are configured relative to.}
}
\if{html}{\out{
}}
}
@@ -72,19 +74,27 @@ A new \code{VitessceConfigDataset} object.
\if{html}{\out{
}}
\if{latex}{\out{\hypertarget{method-VitessceConfigDataset-get_name}{}}}
\subsection{Method \code{get_name()}}{
+Get the dataset name.
\subsection{Usage}{
\if{html}{\out{
}}\preformatted{VitessceConfigDataset$get_name()}\if{html}{\out{
}}
}
+\subsection{Returns}{
+The name as a string.
+}
}
\if{html}{\out{
}}
\if{html}{\out{
}}
\if{latex}{\out{\hypertarget{method-VitessceConfigDataset-get_uid}{}}}
\subsection{Method \code{get_uid()}}{
+Get the dataset UID.
\subsection{Usage}{
\if{html}{\out{
}}\preformatted{VitessceConfigDataset$get_uid()}\if{html}{\out{
}}
}
+\subsection{Returns}{
+The uid as a string.
+}
}
\if{html}{\out{
}}
\if{html}{\out{
}}
@@ -120,7 +130,7 @@ Invisible self, to allow chaining.
\subsection{Examples}{
\if{html}{\out{
}}
\preformatted{base_url <- "http://localhost:8000/"
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")$add_file(
url = paste0(base_url, "cells.json"),
data_type = DataType$CELLS,
diff --git a/man/VitessceConfigDatasetFile.Rd b/man/VitessceConfigDatasetFile.Rd
index ab42ed0..7c28c50 100644
--- a/man/VitessceConfigDatasetFile.Rd
+++ b/man/VitessceConfigDatasetFile.Rd
@@ -42,6 +42,8 @@ Create a new dataset file object.
\item{\code{options}}{A list of options to include for the file.}
+\item{\code{coordination_values}}{A list of coordination values to include in the file definition.}
+
\item{\code{data_type}}{A data type for the file.}
}
\if{html}{\out{
}}
diff --git a/man/VitessceConfigServerRangeRoute.Rd b/man/VitessceConfigServerRangeRoute.Rd
index 1a68d77..b023a08 100644
--- a/man/VitessceConfigServerRangeRoute.Rd
+++ b/man/VitessceConfigServerRangeRoute.Rd
@@ -1,11 +1,16 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/server.R
-\name{VitessceConfigServerRangeRoute}
+\name{VitessceConfigServerFileRoute}
+\alias{VitessceConfigServerFileRoute}
\alias{VitessceConfigServerRangeRoute}
\title{Class representing a local web server route for a file which needs to support range requests.}
\description{
Class representing a local web server route for a file which needs to support range requests.
+Class representing a local web server route for a file which needs to support range requests.
+
+Class representing a local web server route for a file which needs to support range requests.
+
Class representing a local web server route for a file which needs to support range requests.
}
\keyword{internal}
@@ -14,6 +19,83 @@ Class representing a local web server route for a file which needs to support ra
\describe{
\item{\code{path}}{The path on which the web server should respond to requests using this callback.}
+\item{\code{file_path}}{The file to serve.}
+}
+\if{html}{\out{
}}
+}
+\section{Methods}{
+\subsection{Public methods}{
+\itemize{
+\item \href{#method-VitessceConfigServerFileRoute-new}{\code{VitessceConfigServerFileRoute$new()}}
+\item \href{#method-VitessceConfigServerFileRoute-create_handlers}{\code{VitessceConfigServerFileRoute$create_handlers()}}
+\item \href{#method-VitessceConfigServerFileRoute-clone}{\code{VitessceConfigServerFileRoute$clone()}}
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigServerFileRoute-new}{}}}
+\subsection{Method \code{new()}}{
+Create a new server route wrapper object.
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfigServerFileRoute$new(path, file_path)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{
}}
+\describe{
+\item{\code{path}}{The route path.}
+
+\item{\code{file_path}}{The file to serve on this route.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+A new \code{VitessceConfigServerRangeRoute} object.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigServerFileRoute-create_handlers}{}}}
+\subsection{Method \code{create_handlers()}}{
+Add handler functions to the Plumber server object to respond on this route.
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfigServerFileRoute$create_handlers(pr_server)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{
}}
+\describe{
+\item{\code{pr_server}}{The server instance.}
+}
+\if{html}{\out{
}}
+}
+\subsection{Returns}{
+The modified server instance.
+}
+}
+\if{html}{\out{
}}
+\if{html}{\out{
}}
+\if{latex}{\out{\hypertarget{method-VitessceConfigServerFileRoute-clone}{}}}
+\subsection{Method \code{clone()}}{
+The objects of this class are cloneable with this method.
+\subsection{Usage}{
+\if{html}{\out{
}}\preformatted{VitessceConfigServerFileRoute$clone(deep = FALSE)}\if{html}{\out{
}}
+}
+
+\subsection{Arguments}{
+\if{html}{\out{
}}
+\describe{
+\item{\code{deep}}{Whether to make a deep clone.}
+}
+\if{html}{\out{
}}
+}
+}
+}
+\section{Public fields}{
+\if{html}{\out{
}}
+\describe{
+\item{\code{path}}{The path on which the web server should respond to requests using this callback.}
+
\item{\code{file_path}}{The file to serve.}
}
\if{html}{\out{
}}
diff --git a/man/export_to_files.Rd b/man/export_to_files.Rd
index 2f157fb..99adbfa 100644
--- a/man/export_to_files.Rd
+++ b/man/export_to_files.Rd
@@ -23,7 +23,7 @@ A helper function to export files associated with a particular Vitessce configur
We do not recommend calling this function directly. Instead, use the \code{export()} function on a \code{VitessceConfig} instance.
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
dataset <- vc$add_dataset("My dataset")
description <- vc$add_view(dataset, Component$DESCRIPTION)
vc$layout(description)
diff --git a/man/hconcat.Rd b/man/hconcat.Rd
index b3011e8..e1e3ede 100644
--- a/man/hconcat.Rd
+++ b/man/hconcat.Rd
@@ -16,10 +16,10 @@ A \code{VitessceConfigViewHConcat} object.
A helper function to construct a new \code{VitessceConfigViewHConcat} object based on multiple views.
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, Component$SPATIAL)
-gene_list <- vc$add_view(ds, Component$GENES)
+gene_list <- vc$add_view(ds, Component$FEATURE_LIST)
vc$layout(hconcat(spatial, gene_list))
vc$widget()
}
diff --git a/man/vconcat.Rd b/man/vconcat.Rd
index fede6f8..609438c 100644
--- a/man/vconcat.Rd
+++ b/man/vconcat.Rd
@@ -16,10 +16,10 @@ A \code{VitessceConfigViewVConcat} object.
A helper function to construct a new \code{VitessceConfigViewVConcat} object based on multiple views.
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
ds <- vc$add_dataset("My dataset")
spatial <- vc$add_view(ds, Component$SPATIAL)
-gene_list <- vc$add_view(ds, Component$GENES)
+gene_list <- vc$add_view(ds, Component$FEATURE_LIST)
vc$layout(vconcat(spatial, gene_list))
vc$widget()
}
diff --git a/man/vitessce_widget.Rd b/man/vitessce_widget.Rd
index 7a61965..0ec9ac0 100644
--- a/man/vitessce_widget.Rd
+++ b/man/vitessce_widget.Rd
@@ -49,6 +49,6 @@ recommend calling the \code{widget()} method on the \code{VitessceConfig}
instance.
}
\examples{
-vc <- VitessceConfig$new("My config")
+vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
vc$widget()
}
diff --git a/vignettes/shiny.Rmd b/vignettes/shiny.Rmd
index 3b3bbc9..f536662 100644
--- a/vignettes/shiny.Rmd
+++ b/vignettes/shiny.Rmd
@@ -14,6 +14,7 @@ First, install the dependencies:
install.packages("shiny")
install.packages("devtools")
devtools::install_github("satijalab/seurat-data")
+devtools::install_github("vitessce/vitessceAnalysisR")
```
Next, create an output element in the UI with `vitessce_output` and a corresponding server response with `render_vitessce`.
@@ -23,17 +24,21 @@ The value for the `output_id` parameter in the `vitessce_output` function should
```r
library(shiny)
library(vitessceR)
+library(vitessceAnalysisR)
library(SeuratData)
SeuratData::InstallData("pbmc3k")
data("pbmc3k.final")
force(pbmc3k.final)
-w <- SeuratWrapper$new(
- pbmc3k.final,
- cell_embeddings = c("pca", "umap"),
- cell_embedding_names = c("PCA", "UMAP"),
- cell_set_metas = c("seurat_annotations", "seurat_clusters")
+adata_path <- file.path("data", "seurat", "pbmc3k.final.h5ad.zarr")
+vitessceAnalysisR::seurat_to_anndata_zarr(pbmc3k.final, adata_path)
+
+w <- AnnDataWrapper$new(
+ adata_path=adata_path,
+ obs_embedding_paths = c("obsm/X_pca", "obsm/X_umap"),
+ obs_embedding_names = c("PCA", "UMAP"),
+ obs_set_paths = c("obs/seurat_annotations", "obs/seurat_clusters")
)
ui <- fluidPage(
@@ -48,7 +53,7 @@ server <- function(input, output, session) {
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
vc$layout(scatterplot)
- vc$widget()
+ vc$widget(theme="light")
})
}
From 77fb318cf9540a4f22f85a984e0e8bed5dece593 Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 14:41:18 -0400
Subject: [PATCH 20/22] Shiny vignette
---
R/wrappers_anndata.R | 2 +-
R/wrappers_csv.R | 2 +-
inst/htmlwidgets/vitessceR.js | 2 +-
vignettes/shiny.Rmd | 71 ++++++++++++++++++++---------------
4 files changed, 44 insertions(+), 33 deletions(-)
diff --git a/R/wrappers_anndata.R b/R/wrappers_anndata.R
index 62bb58c..395be20 100644
--- a/R/wrappers_anndata.R
+++ b/R/wrappers_anndata.R
@@ -133,7 +133,7 @@ AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
#' @param obj_i The index of this data object within the dataset.
#' @param base_dir A base directory for local data.
convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
- if(self$is_remote) {
+ if(!self$is_remote) {
super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
}
diff --git a/R/wrappers_csv.R b/R/wrappers_csv.R
index 40ab324..6a4aca1 100644
--- a/R/wrappers_csv.R
+++ b/R/wrappers_csv.R
@@ -77,7 +77,7 @@ CsvWrapper <- R6::R6Class("CsvWrapper",
#' @param obj_i The index of this data object within the dataset.
#' @param base_dir A base directory for local data.
convert_and_save = function(dataset_uid, obj_i, base_dir = NA) {
- if(self$is_remote) {
+ if(!self$is_remote) {
super$convert_and_save(dataset_uid, obj_i, base_dir = base_dir)
}
diff --git a/inst/htmlwidgets/vitessceR.js b/inst/htmlwidgets/vitessceR.js
index c374431..0aedb40 100644
--- a/inst/htmlwidgets/vitessceR.js
+++ b/inst/htmlwidgets/vitessceR.js
@@ -48,7 +48,7 @@ HTMLWidgets.widget({
const onConfigChange = React.useCallback((newConfig) => {
if(window && window.Shiny && window.Shiny.setInputValue) {
- Shiny.setInputValue("on_config_change", newConfig);
+ Shiny.setInputValue("vitessce_on_config_change", newConfig);
}
}, [window.Shiny]);
diff --git a/vignettes/shiny.Rmd b/vignettes/shiny.Rmd
index f536662..918473e 100644
--- a/vignettes/shiny.Rmd
+++ b/vignettes/shiny.Rmd
@@ -85,14 +85,15 @@ SeuratData::InstallData("pbmc3k")
data("pbmc3k.final")
force(pbmc3k.final)
-OUT_DIR <- file.path("data", "shiny")
-
-w <- SeuratWrapper$new(
- pbmc3k.final,
- cell_embeddings = c("pca", "umap"),
- cell_embedding_names = c("PCA", "UMAP"),
- cell_set_metas = c("seurat_annotations", "seurat_clusters"),
- out_dir = OUT_DIR
+BASE_DIR <- file.path("data", "seurat")
+adata_filename <- "pbmc3k.final.h5ad.zarr"
+vitessceAnalysisR::seurat_to_anndata_zarr(pbmc3k.final, file.path(BASE_DIR, adata_filename))
+
+w <- AnnDataWrapper$new(
+ adata_path=adata_filename,
+ obs_embedding_paths = c("obsm/X_pca", "obsm/X_umap"),
+ obs_embedding_names = c("PCA", "UMAP"),
+ obs_set_paths = c("obs/seurat_annotations", "obs/seurat_clusters")
)
ui <- fluidPage(
@@ -101,14 +102,20 @@ ui <- fluidPage(
)
server <- function(input, output, session) {
- addResourcePath("vitessce", OUT_DIR)
+ # Ask Shiny to also serve our data files in our local ./data/seurat folder from "/vitessce"
+ addResourcePath("vitessce", BASE_DIR)
+
+ # Render the Vitessce widget into the UI output.
output$vitessce_visualization <- render_vitessce(expr = {
- vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config")
+
+ # Tell Vitessce that file paths (in AnnDataWrapper) are relative to the BASE_DIR folder.
+ vc <- VitessceConfig$new(schema_version = "1.0.16", name = "My config", base_dir = BASE_DIR)
dataset <- vc$add_dataset("My dataset")
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
vc$layout(scatterplot)
+ # Construct a base_url value dynamically based on the Shiny session info.
BASE_URL <- paste0(
session$clientData$url_protocol,
"//",
@@ -118,46 +125,41 @@ server <- function(input, output, session) {
"/vitessce"
)
- vc$widget(serve = FALSE, base_url = BASE_URL)
+ vc$widget(theme = "light", serve = FALSE, base_url = BASE_URL)
})
}
shinyApp(ui, server)
```
-## Style issues
-
-By default, Shiny includes CSS from bootstrap in all apps.
-The bootstrap styles (font sizes in particular) can interfere with the styles for the Vitessce widget.
+## Bidirectional communication example
-One solution is add CSS to reset the font sizes for the root element of the Shiny app:
+Listen for `input$vitessce_on_config_change` events emitted by the Vitessce widget in order to observe user interactions and update the Shiny app in response.
```r
library(shiny)
library(vitessceR)
+library(vitessceAnalysisR)
library(SeuratData)
SeuratData::InstallData("pbmc3k")
data("pbmc3k.final")
force(pbmc3k.final)
-w <- SeuratWrapper$new(
- pbmc3k.final,
- cell_embeddings = c("pca", "umap"),
- cell_embedding_names = c("PCA", "UMAP"),
- cell_set_metas = c("seurat_annotations", "seurat_clusters")
+adata_path <- file.path("data", "seurat", "pbmc3k.final.h5ad.zarr")
+vitessceAnalysisR::seurat_to_anndata_zarr(pbmc3k.final, adata_path)
+
+w <- AnnDataWrapper$new(
+ adata_path=adata_path,
+ obs_embedding_paths = c("obsm/X_pca", "obsm/X_umap"),
+ obs_embedding_names = c("PCA", "UMAP"),
+ obs_set_paths = c("obs/seurat_annotations", "obs/seurat_clusters")
)
ui <- fluidPage(
- tags$head(
- tags$style(HTML("
- html, body {
- font-size: inherit;
- }
- "))
- ),
"Vitessce in a Shiny app",
vitessce_output(output_id = "vitessce_visualization", height = "600px"),
+ verbatimTextOutput("vitessce_config")
)
server <- function(input, output, session) {
@@ -167,11 +169,20 @@ server <- function(input, output, session) {
dataset <- dataset$add_object(w)
scatterplot <- vc$add_view(dataset, Component$SCATTERPLOT, mapping = "PCA")
vc$layout(scatterplot)
- vc$widget()
+ vc$widget(theme="light")
})
+
+ rv <- reactiveValues(current=NULL)
+
+ observeEvent(input$vitessce_on_config_change, {
+ # We can access any values from the coordination space here.
+ # In this example, we access the ID of the currently-hovered cell.
+ rv$current <- input$vitessce_on_config_change[['coordinationSpace']][['obsHighlight']]
+ })
+
+ output$vitessce_config <- renderPrint({ rv$current })
}
shinyApp(ui, server)
```
-
From 22e9244a21a3942de1c672f5f0d0b0842be0ac6a Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 14:53:53 -0400
Subject: [PATCH 21/22] Docs
---
R/config.R | 1 -
R/wrappers_anndata.R | 2 +-
man/AnnDataWrapper.Rd | 1 -
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/R/config.R b/R/config.R
index 03aa68c..5d43046 100644
--- a/R/config.R
+++ b/R/config.R
@@ -383,7 +383,6 @@ VitessceConfigView <- R6::R6Class("VitessceConfigView",
}
invisible(self)
},
- #' @description
use_coordination_by_dict = function(scopes) {
# TODO
invisible(self)
diff --git a/R/wrappers_anndata.R b/R/wrappers_anndata.R
index 395be20..2e2856f 100644
--- a/R/wrappers_anndata.R
+++ b/R/wrappers_anndata.R
@@ -89,7 +89,7 @@ AnnDataWrapper <- R6::R6Class("AnnDataWrapper",
#' @param coordination_values A list of coordination values for the file definition.
#' @param ... Parameters inherited from `AbstractWrapper`.
#' @return A new `AnnDataWrapper` object.
- initialize = function(adata_path = NA, adata_url = NA, obs_feature_matrix_path = NA, feature_filter_path = NA, initial_feature_filter_path = NA, obs_set_paths = NA, obs_set_names = NA, obs_locations_path = NA, obs_segmentations_path = NA, obs_embedding_paths = NA, obs_embedding_names = NA, obs_embedding_dims = NA, request_init = NA, feature_labels_path = NA, obs_labels_path = NA, coordination_values = NA, obs_labels_paths = NA, obs_labels_names = NA, ...) {
+ initialize = function(adata_path = NA, adata_url = NA, obs_feature_matrix_path = NA, feature_filter_path = NA, initial_feature_filter_path = NA, obs_set_paths = NA, obs_set_names = NA, obs_locations_path = NA, obs_segmentations_path = NA, obs_embedding_paths = NA, obs_embedding_names = NA, obs_embedding_dims = NA, request_init = NA, feature_labels_path = NA, coordination_values = NA, obs_labels_paths = NA, obs_labels_names = NA, ...) {
super$initialize(...)
self$adata_path <- adata_path
self$adata_url <- adata_url
diff --git a/man/AnnDataWrapper.Rd b/man/AnnDataWrapper.Rd
index 886ffbe..184e28f 100644
--- a/man/AnnDataWrapper.Rd
+++ b/man/AnnDataWrapper.Rd
@@ -109,7 +109,6 @@ Create a wrapper around an AnnData object saved to a Zarr store.
obs_embedding_dims = NA,
request_init = NA,
feature_labels_path = NA,
- obs_labels_path = NA,
coordination_values = NA,
obs_labels_paths = NA,
obs_labels_names = NA,
From e2589835db7d3bf9d56a79c59922acf270bb92dc Mon Sep 17 00:00:00 2001
From: Mark Keller <7525285+keller-mark@users.noreply.github.com>
Date: Mon, 2 Oct 2023 14:58:13 -0400
Subject: [PATCH 22/22] Update lab name
---
LICENSE | 2 +-
LICENSE.md | 2 +-
pkgdown/_pkgdown.yml | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/LICENSE b/LICENSE
index fe7fcba..7de4da0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,2 +1,2 @@
YEAR: 2020
-COPYRIGHT HOLDER: Gehlenborg Lab
+COPYRIGHT HOLDER: HIDIVE Lab
diff --git a/LICENSE.md b/LICENSE.md
index 43627c9..e149ba7 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
# MIT License
-Copyright (c) 2020 Gehlenborg Lab
+Copyright (c) 2020 HIDIVE Lab
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml
index 3eed078..26ecced 100644
--- a/pkgdown/_pkgdown.yml
+++ b/pkgdown/_pkgdown.yml
@@ -6,8 +6,8 @@ template:
base_font: {google: "Inter"}
authors:
- Gehlenborg Lab:
- href: http://gehlenborglab.org/
+ HIDIVE Lab:
+ href: http://hidivelab.org/
Mark Keller:
href: https://github.com/keller-mark
@@ -59,7 +59,7 @@ footer:
left: [authors]
right: built_with
components:
- authors: Developed by the Gehlenborg Lab
+ authors: Developed by the HIDIVE Lab
reference:
- title: "Working with view configs"