From 9c0dd19a3bc30bb188be432c4ce926a2eb992f64 Mon Sep 17 00:00:00 2001 From: ktpolanski Date: Tue, 7 Nov 2023 15:51:05 +0000 Subject: [PATCH] scautoqc plus logo --- README.md | 4 +- docs/api.rst | 4 +- docs/notebooks/automatic_qc.ipynb | 62 +++++++++++++++++------------- docs/notebooks/scautoqc_logo.png | Bin 0 -> 15583 bytes 4 files changed, 40 insertions(+), 30 deletions(-) create mode 100644 docs/notebooks/scautoqc_logo.png diff --git a/README.md b/README.md index 4d29fa5..be1219e 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,6 @@ pip install --upgrade pip ## Usage and Documentation -SCTK's documentation is available [here](https://teichlab.github.io/sctk/), and features a tutorial and API reference for the automated QC workflow. +SCTK's documentation is available [here](https://teichlab.github.io/sctk/), and features a tutorial and API reference for scAutoQC (an automated QC workflow). + +scautoqc_logo \ No newline at end of file diff --git a/docs/api.rst b/docs/api.rst index d7eb2e5..3be4e08 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1,8 +1,8 @@ API Reference ============= -QC pipeline ------------ +scAutoQC +-------- .. module:: sctk .. autosummary:: :toctree: modules diff --git a/docs/notebooks/automatic_qc.ipynb b/docs/notebooks/automatic_qc.ipynb index f01e918..fdcb084 100644 --- a/docs/notebooks/automatic_qc.ipynb +++ b/docs/notebooks/automatic_qc.ipynb @@ -2,16 +2,24 @@ "cells": [ { "cell_type": "markdown", - "id": "mexican-skill", + "id": "previous-province", "metadata": {}, "source": [ - "# Automatic QC workflow tutorial" + "# scAutoQC workflow tutorial" + ] + }, + { + "cell_type": "markdown", + "id": "peripheral-feeling", + "metadata": {}, + "source": [ + "\"scautoqc_logo\"" ] }, { "cell_type": "code", "execution_count": 1, - "id": "hindu-treaty", + "id": "entitled-cargo", "metadata": {}, "outputs": [], "source": [ @@ -23,10 +31,10 @@ }, { "cell_type": "markdown", - "id": "increasing-commercial", + "id": "foster-exhibit", "metadata": {}, "source": [ - "This notebook will show how to apply SCTK's automatic QC workflow. The process has four steps:\n", + "This notebook will show how to apply SCTK's automatic QC workflow, scAutoQC. The process has four steps:\n", "\n", " - `sctk.calculate_qc()` computes QC measures\n", " - `sctk.generate_qc_clusters()` creates QC-space clusters of cells\n", @@ -39,7 +47,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "identified-costume", + "id": "economic-punishment", "metadata": {}, "outputs": [ { @@ -61,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "electrical-fighter", + "id": "streaming-facial", "metadata": {}, "source": [ "This object features raw counts for some PBMC data, and nothing else for now. We can use `sctk.calculate_qc()` to automatically flag some common technical features (the defaults are human mitochondrial, ribosomal and hemoglobin genes) and subsequently use `sc.pp.calculate_qc_metrics()` to compute their percentages in each cell, along with standard measures like the number of genes and counts." @@ -70,7 +78,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "responsible-valentine", + "id": "hybrid-riverside", "metadata": {}, "outputs": [ { @@ -93,7 +101,7 @@ }, { "cell_type": "markdown", - "id": "smoking-forum", + "id": "natural-rebound", "metadata": {}, "source": [ "You can see the `.obs` of the object populated with the QC measures we just generated.\n", @@ -104,7 +112,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "internal-tissue", + "id": "trained-account", "metadata": {}, "outputs": [ { @@ -138,7 +146,7 @@ }, { "cell_type": "markdown", - "id": "average-proceeding", + "id": "driven-consumption", "metadata": {}, "source": [ "There's now an `.obs` column called `qc_cluster`, and an embedding called `X_umap_qc`. Let's take a look!" @@ -147,7 +155,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "separated-domain", + "id": "frozen-learning", "metadata": {}, "outputs": [ { @@ -180,16 +188,16 @@ }, { "cell_type": "markdown", - "id": "alpine-friend", + "id": "educational-riding", "metadata": {}, "source": [ - "The next step of the workflow involves determining which of the cells pass QC individually." + "The next step of the scAutoQC workflow involves determining which of the cells pass QC individually." ] }, { "cell_type": "code", "execution_count": 6, - "id": "cutting-pressure", + "id": "behind-adjustment", "metadata": {}, "outputs": [ { @@ -227,7 +235,7 @@ }, { "cell_type": "markdown", - "id": "dominican-thousand", + "id": "endless-cooperative", "metadata": {}, "source": [ "There's now a `cell_passed_qc` column in `.obs` which features per-cell QC calls." @@ -236,7 +244,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "capable-gauge", + "id": "ceramic-attention", "metadata": {}, "outputs": [ { @@ -256,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "ranging-knitting", + "id": "enhanced-server", "metadata": {}, "source": [ "Controlling the desired QC thresholds requires a bit of explanation.\n", @@ -292,7 +300,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "incredible-parks", + "id": "mechanical-sympathy", "metadata": {}, "outputs": [ { @@ -323,12 +331,12 @@ }, { "cell_type": "markdown", - "id": "basic-johnson", + "id": "square-technique", "metadata": {}, "source": [ "The gene count filtering is different now, as expected.\n", "\n", - "The final step of the workflow determines computes a fraction of passing cells for each cluster. If a cluster has a high enough fraction of passing cells (controlled via the `threshold` parameter, default 0.5), it's deemed to be a good QC cluster.\n", + "The final step of the scAutoQC workflow determines computes a fraction of passing cells for each cluster. If a cluster has a high enough fraction of passing cells (controlled via the `threshold` parameter, default 0.5), it's deemed to be a good QC cluster.\n", "\n", "You can use your own per-cell QC calls here rather than the ones provided by `sctk.cellwise_qc()` if desired, just specify which `.obs` column to take via the `cell_qc_key` argument." ] @@ -336,7 +344,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "lovely-webcam", + "id": "southern-highway", "metadata": {}, "outputs": [ { @@ -361,7 +369,7 @@ }, { "cell_type": "markdown", - "id": "smoking-reaction", + "id": "rural-margin", "metadata": {}, "source": [ "There's now a `cluster_passed_qc` column. Let's take a look how it compares to the cell level QC." @@ -370,7 +378,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "dedicated-hungarian", + "id": "norwegian-difficulty", "metadata": {}, "outputs": [ { @@ -398,7 +406,7 @@ }, { "cell_type": "markdown", - "id": "eligible-episode", + "id": "economic-satisfaction", "metadata": {}, "source": [ "We seem to get a nontrivial number of cells individually flagged as poor quality colocating in the top left of the plot, but only a small subset of them remain after cluster membership is leveraged. Let's generate a new set of QC clusters by increasing the resolution parameter value, creating a higher number of smaller clusters as a result." @@ -407,7 +415,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "optimum-cathedral", + "id": "assumed-westminster", "metadata": {}, "outputs": [ { @@ -438,7 +446,7 @@ }, { "cell_type": "markdown", - "id": "pleased-superintendent", + "id": "expensive-check", "metadata": {}, "source": [ "The plots align better now.\n", diff --git a/docs/notebooks/scautoqc_logo.png b/docs/notebooks/scautoqc_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8018d6d6cbb722ed3bf751085e61688ffae3ba44 GIT binary patch literal 15583 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 literal 0 HcmV?d00001