Skip to content

QuantNado

quantnado.api.QuantNado

QuantNado(dataset: QuantNadoDataset)

Facade wrapping :class:QuantNadoDataset with analysis convenience methods.

Construction

qn = QuantNado.open("dataset/") # directory of per-sample zarrs qn = QuantNado.open("combined.zarr") # combined store

Basic access

qn.sample_names qn.assays qn.chromosomes region = qn.sel(chrom="chr1", start=1_000_000, end=1_001_000) tree = qn.to_datatree()

Source code in quantnado/api.py
def __init__(self, dataset: QuantNadoDataset) -> None:
    self._dataset = dataset

open classmethod

open(path: str | Path) -> 'QuantNado'

Open an existing QuantNado store (auto-detects layout).

Parameters:

Name Type Description Default
path str | Path

Directory of per-sample .zarr stores, a combined .zarr, or a .tar.gz/.tgz archive containing either layout.

required
Source code in quantnado/api.py
@classmethod
def open(cls, path: str | Path) -> "QuantNado":
    """Open an existing QuantNado store (auto-detects layout).

    Parameters
    ----------
    path:
        Directory of per-sample ``.zarr`` stores, a combined ``.zarr``, or a
        ``.tar.gz``/``.tgz`` archive containing either layout.
    """
    return cls(QuantNadoDataset(path))

subset

subset(
    assay: "str | Sequence[str] | None" = None,
    samples: "str | Sequence[str] | None" = None,
    ip: "str | Sequence[str] | None" = None,
    group: "str | Sequence[str] | dict[str, str | Sequence[str]] | None" = None,
) -> "QuantNado"

Return a filtered QuantNado view. See :meth:QuantNadoDataset.subset.

Source code in quantnado/api.py
def subset(
    self,
    assay: "str | Sequence[str] | None" = None,
    samples: "str | Sequence[str] | None" = None,
    ip: "str | Sequence[str] | None" = None,
    group: "str | Sequence[str] | dict[str, str | Sequence[str]] | None" = None,
) -> "QuantNado":
    """Return a filtered QuantNado view. See :meth:`QuantNadoDataset.subset`."""
    return QuantNado(self._dataset.subset(assay=assay, samples=samples, ip=ip, group=group))

info_of

info_of(obj)

Return a compact summary for xarray / pandas objects.

Source code in quantnado/api.py
def info_of(self, obj):
    """Return a compact summary for xarray / pandas objects."""
    return self._dataset.info_of(obj)

sel

sel(
    chrom: str,
    start: int | None = None,
    end: int | None = None,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
) -> xr.Dataset

Extract a genomic region as an xr.Dataset.

Parameters:

Name Type Description Default
chrom str

Chromosome name (e.g. "chr1").

required
start int | None

1-based start position (inclusive). Defaults to 1.

None
end int | None

1-based end position (inclusive). Defaults to chromosome length.

None
assay str | Sequence[str] | None

Restrict to samples of this assay type.

None
samples str | Sequence[str] | None

Explicit sample names (overrides assay).

None

Returns:

Type Description
Dataset

dims: sample × position; one data_var per assay.

Source code in quantnado/api.py
def sel(
    self,
    chrom: str,
    start: int | None = None,
    end: int | None = None,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
) -> xr.Dataset:
    """Extract a genomic region as an xr.Dataset.

    Parameters
    ----------
    chrom:
        Chromosome name (e.g. ``"chr1"``).
    start:
        1-based start position (inclusive). Defaults to 1.
    end:
        1-based end position (inclusive). Defaults to chromosome length.
    assay:
        Restrict to samples of this assay type.
    samples:
        Explicit sample names (overrides *assay*).

    Returns
    -------
    xr.Dataset
        dims: sample × position; one data_var per assay.
    """
    return self._dataset.sel(chrom=chrom, start=start, end=end, assay=assay, samples=samples)

to_datatree

to_datatree(
    chromosomes: list[str] | None = None,
) -> xr.DataTree

Return the full dataset as an xr.DataTree (one node per chromosome).

Source code in quantnado/api.py
def to_datatree(self, chromosomes: list[str] | None = None) -> xr.DataTree:
    """Return the full dataset as an xr.DataTree (one node per chromosome)."""
    return self._dataset.to_datatree(chromosomes=chromosomes)

combine classmethod

combine(
    src: Path | str,
    output: Path | str,
    overwrite: bool = True,
    n_workers: int = 1,
) -> "QuantNado"

Combine a directory of per-sample zarrs into a single combined zarr.

Source code in quantnado/api.py
@classmethod
def combine(
    cls,
    src: Path | str,
    output: Path | str,
    overwrite: bool = True,
    n_workers: int = 1,
) -> "QuantNado":
    """Combine a directory of per-sample zarrs into a single combined zarr."""
    return cls(
        QuantNadoDataset.combine(
            src,
            output,
            overwrite=overwrite,
            n_workers=n_workers,
        )
    )

normalise

normalise(
    data: "xr.Dataset | xr.DataArray | pd.DataFrame | None" = None,
    *,
    method: str = "cpm",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    library_sizes: "pd.Series | dict | None" = None,
    feature_lengths: "pd.Series | Any | None" = None,
) -> "xr.Dataset | xr.DataArray | pd.DataFrame | Any"

Normalise coverage signal or feature counts. See :meth:QuantNadoDataset.normalise.

Source code in quantnado/api.py
def normalise(
    self,
    data: "xr.Dataset | xr.DataArray | pd.DataFrame | None" = None,
    *,
    method: str = "cpm",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    library_sizes: "pd.Series | dict | None" = None,
    feature_lengths: "pd.Series | Any | None" = None,
) -> "xr.Dataset | xr.DataArray | pd.DataFrame | Any":
    """Normalise coverage signal or feature counts. See :meth:`QuantNadoDataset.normalise`."""
    return self._dataset.normalise(
        data, method=method, assay=assay, samples=samples,
        library_sizes=library_sizes, feature_lengths=feature_lengths,
    )

pca

pca(
    data_or_query=None,
    n_components: int = 5,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    chromosome: str | None = None,
    nan_handling_strategy: str = "drop",
    standardize: bool = False,
    random_state: int | None = None,
    subset_size: int | None = None,
    subset_strategy: str = "random",
) -> tuple[Any, xr.DataArray]

Run PCA on reduced genomic signal. See :meth:QuantNadoDataset.pca.

Source code in quantnado/api.py
def pca(
    self,
    data_or_query=None,
    n_components: int = 5,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    chromosome: str | None = None,
    nan_handling_strategy: str = "drop",
    standardize: bool = False,
    random_state: int | None = None,
    subset_size: int | None = None,
    subset_strategy: str = "random",
) -> tuple[Any, xr.DataArray]:
    """Run PCA on reduced genomic signal. See :meth:`QuantNadoDataset.pca`."""
    return self._dataset.pca(
        data_or_query, n_components=n_components, assay=assay, samples=samples,
        modality=modality,
        chromosome=chromosome, nan_handling_strategy=nan_handling_strategy,
        standardize=standardize, random_state=random_state,
        subset_size=subset_size, subset_strategy=subset_strategy,
    )

metaplot

metaplot(
    data: DataArray,
    data_rev: DataArray | None = None,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    groups: dict[str, list[str]] | None = None,
    flip_minus_strand: bool = True,
    error_stat: str | None = "sem",
    palette=None,
    reference_point: float | None = 0,
    reference_label: str = "TSS",
    xlabel: str = "Relative position",
    ylabel: str | None = None,
    title: str = "Metagene profile",
    figsize: tuple[float, float] = (8, 4),
    ax: Any = None,
    filepath: str | Path | None = None,
) -> Any

Plot a metagene profile. See :meth:QuantNadoDataset.metaplot.

Source code in quantnado/api.py
def metaplot(
    self,
    data: xr.DataArray,
    data_rev: xr.DataArray | None = None,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    groups: dict[str, list[str]] | None = None,
    flip_minus_strand: bool = True,
    error_stat: str | None = "sem",
    palette=None,
    reference_point: float | None = 0,
    reference_label: str = "TSS",
    xlabel: str = "Relative position",
    ylabel: str | None = None,
    title: str = "Metagene profile",
    figsize: tuple[float, float] = (8, 4),
    ax: Any = None,
    filepath: str | Path | None = None,
) -> Any:
    """Plot a metagene profile. See :meth:`QuantNadoDataset.metaplot`."""
    return self._dataset.metaplot(
        data, data_rev,
        assay=assay, samples=samples, modality=modality,
        groups=groups, flip_minus_strand=flip_minus_strand,
        error_stat=error_stat, palette=palette,
        reference_point=reference_point, reference_label=reference_label,
        xlabel=xlabel, ylabel=ylabel, title=title, figsize=figsize,
        ax=ax, filepath=filepath,
    )

tornadoplot

tornadoplot(
    data: DataArray,
    data_rev: DataArray | None = None,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    sample_names: list[str] | None = None,
    groups: dict[str, list[str]] | None = None,
    flip_minus_strand: bool = True,
    sort_by: str | None = "mean",
    vmin: float | None = None,
    vmax: float | None = None,
    scale_each: bool = False,
    cmap: str | None = None,
    reference_point: float | None = 0,
    reference_label: str = "TSS",
    xlabel: str = "Relative position",
    ylabel: str | None = None,
    title: str = "Signal heatmap",
    figsize: tuple[float, float] | None = None,
    filepath: str | Path | None = None,
) -> list

Tornado / heatmap plot. See :meth:QuantNadoDataset.tornadoplot.

Source code in quantnado/api.py
def tornadoplot(
    self,
    data: xr.DataArray,
    data_rev: xr.DataArray | None = None,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    sample_names: list[str] | None = None,
    groups: dict[str, list[str]] | None = None,
    flip_minus_strand: bool = True,
    sort_by: str | None = "mean",
    vmin: float | None = None,
    vmax: float | None = None,
    scale_each: bool = False,
    cmap: str | None = None,
    reference_point: float | None = 0,
    reference_label: str = "TSS",
    xlabel: str = "Relative position",
    ylabel: str | None = None,
    title: str = "Signal heatmap",
    figsize: tuple[float, float] | None = None,
    filepath: str | Path | None = None,
) -> list:
    """Tornado / heatmap plot. See :meth:`QuantNadoDataset.tornadoplot`."""
    return self._dataset.tornadoplot(
        data, data_rev,
        assay=assay, samples=samples, modality=modality,
        sample_names=sample_names, groups=groups,
        flip_minus_strand=flip_minus_strand, sort_by=sort_by,
        vmin=vmin, vmax=vmax, scale_each=scale_each, cmap=cmap,
        reference_point=reference_point, reference_label=reference_label,
        xlabel=xlabel, ylabel=ylabel, title=title, figsize=figsize,
        filepath=filepath,
    )

heatmap

heatmap(
    data: Dataset,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    variable: str = "mean",
    title: str = "Signal heatmap",
    cmap: str = "viridis",
    figsize: tuple[float, float] = (10, 8),
    filepath: str | Path | None = None,
    **kwargs,
) -> Any

Heatmap of reduced signal. See :meth:QuantNadoDataset.heatmap.

Source code in quantnado/api.py
def heatmap(
    self,
    data: xr.Dataset,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    variable: str = "mean",
    title: str = "Signal heatmap",
    cmap: str = "viridis",
    figsize: tuple[float, float] = (10, 8),
    filepath: str | Path | None = None,
    **kwargs,
) -> Any:
    """Heatmap of reduced signal. See :meth:`QuantNadoDataset.heatmap`."""
    return self._dataset.heatmap(
        data,
        assay=assay, samples=samples, variable=variable,
        title=title, cmap=cmap, figsize=figsize, filepath=filepath,
        **kwargs,
    )

correlate

correlate(
    data: Dataset,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    variable: str = "mean",
    method: str = "pearson",
    title: str = "Sample correlation",
    figsize: tuple[float, float] = (8, 7),
    filepath: str | Path | None = None,
    **kwargs,
) -> tuple[pd.DataFrame, Any]

Compute and plot sample correlation. See :meth:QuantNadoDataset.correlate.

Source code in quantnado/api.py
def correlate(
    self,
    data: xr.Dataset,
    *,
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    variable: str = "mean",
    method: str = "pearson",
    title: str = "Sample correlation",
    figsize: tuple[float, float] = (8, 7),
    filepath: str | Path | None = None,
    **kwargs,
) -> tuple[pd.DataFrame, Any]:
    """Compute and plot sample correlation. See :meth:`QuantNadoDataset.correlate`."""
    return self._dataset.correlate(
        data,
        assay=assay, samples=samples, variable=variable,
        method=method, title=title, figsize=figsize, filepath=filepath,
        **kwargs,
    )

locus_plot

locus_plot(*args, **kwargs) -> Any

Plot a genomic locus. See :meth:QuantNadoDataset.locus_plot.

Source code in quantnado/api.py
def locus_plot(self, *args, **kwargs) -> Any:
    """Plot a genomic locus. See :meth:`QuantNadoDataset.locus_plot`."""
    return self._dataset.locus_plot(*args, **kwargs)

reduce

reduce(
    intervals_path: str | None = None,
    ranges_df=None,
    gtf_path: str | None = None,
    feature_type: str | None = None,
    reduction: str = "mean",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    **kwargs,
)

Reduce signal over genomic intervals. See :meth:QuantNadoDataset.reduce.

Source code in quantnado/api.py
def reduce(
    self,
    intervals_path: str | None = None,
    ranges_df=None,
    gtf_path: str | None = None,
    feature_type: str | None = None,
    reduction: str = "mean",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    **kwargs,
):
    """Reduce signal over genomic intervals. See :meth:`QuantNadoDataset.reduce`."""
    return self._dataset.reduce(
        intervals_path=intervals_path,
        ranges_df=ranges_df,
        gtf_path=gtf_path,
        feature_type=feature_type,
        reduction=reduction,
        assay=assay,
        samples=samples,
        modality=modality,
        **kwargs,
    )

count_features

count_features(
    gtf_file: str | None = None,
    bed_file: str | None = None,
    ranges_df=None,
    feature_type: str = "gene",
    engine: str = "signal",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    **kwargs,
)

Count reads over features. See :meth:QuantNadoDataset.count_features.

Source code in quantnado/api.py
def count_features(
    self,
    gtf_file: str | None = None,
    bed_file: str | None = None,
    ranges_df=None,
    feature_type: str = "gene",
    engine: str = "signal",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    **kwargs,
):
    """Count reads over features. See :meth:`QuantNadoDataset.count_features`."""
    return self._dataset.count_features(
        gtf_file=gtf_file,
        bed_file=bed_file,
        ranges_df=ranges_df,
        feature_type=feature_type,
        engine=engine,
        assay=assay,
        samples=samples,
        modality=modality,
        **kwargs,
    )

quantify_signal

quantify_signal(
    gtf_file: str | None = None,
    bed_file: str | None = None,
    ranges_df=None,
    feature_type: str = "gene",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    return_metadata: bool = True,
    **kwargs,
)

Quantify stored signal over features. See :meth:QuantNadoDataset.quantify_signal.

Source code in quantnado/api.py
def quantify_signal(
    self,
    gtf_file: str | None = None,
    bed_file: str | None = None,
    ranges_df=None,
    feature_type: str = "gene",
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
    modality: str | Sequence[str] | None = None,
    return_metadata: bool = True,
    **kwargs,
):
    """Quantify stored signal over features. See :meth:`QuantNadoDataset.quantify_signal`."""
    return self._dataset.quantify_signal(
        gtf_file=gtf_file,
        bed_file=bed_file,
        ranges_df=ranges_df,
        feature_type=feature_type,
        assay=assay,
        samples=samples,
        modality=modality,
        return_metadata=return_metadata,
        **kwargs,
    )

extract

extract(*args, **kwargs)

Extract signal into bins. See :meth:QuantNadoDataset.extract.

Source code in quantnado/api.py
def extract(self, *args, **kwargs):
    """Extract signal into bins. See :meth:`QuantNadoDataset.extract`."""
    return self._dataset.extract(*args, **kwargs)

library_sizes

library_sizes(
    assay: str | Sequence[str] | None = None,
    samples: str | Sequence[str] | None = None,
)

Return total mapped reads per sample. See :meth:QuantNadoDataset.library_sizes.

Source code in quantnado/api.py
def library_sizes(self, assay: str | Sequence[str] | None = None, samples: str | Sequence[str] | None = None):
    """Return total mapped reads per sample. See :meth:`QuantNadoDataset.library_sizes`."""
    return self._dataset.library_sizes(assay=assay, samples=samples)

pca_scree

pca_scree(pca_obj, **kwargs) -> Any

Plot PCA scree. See :meth:QuantNadoDataset.pca_scree.

Source code in quantnado/api.py
def pca_scree(self, pca_obj, **kwargs) -> Any:
    """Plot PCA scree. See :meth:`QuantNadoDataset.pca_scree`."""
    return self._dataset.pca_scree(pca_obj, **kwargs)

pca_scatter

pca_scatter(
    pca_obj,
    pca_result,
    colour_by=None,
    shape_by=None,
    **kwargs,
) -> Any

Scatter plot of PCA-transformed samples. See :meth:QuantNadoDataset.pca_scatter.

Source code in quantnado/api.py
def pca_scatter(self, pca_obj, pca_result, colour_by=None, shape_by=None, **kwargs) -> Any:
    """Scatter plot of PCA-transformed samples. See :meth:`QuantNadoDataset.pca_scatter`."""
    return self._dataset.pca_scatter(pca_obj, pca_result, colour_by=colour_by, shape_by=shape_by, **kwargs)