diff --git a/.codecov.yaml b/.codecov.yaml
new file mode 100644
index 0000000..d0c0e29
--- /dev/null
+++ b/.codecov.yaml
@@ -0,0 +1,17 @@
+# Based on pydata/xarray
+codecov:
+ require_ci_to_pass: no
+
+coverage:
+ status:
+ project:
+ default:
+ # Require 1% coverage, i.e., always succeed
+ target: 1
+ patch: false
+ changes: false
+
+comment:
+ layout: diff, flags, files
+ behavior: once
+ require_base: no
diff --git a/.cruft.json b/.cruft.json
new file mode 100644
index 0000000..09ddcda
--- /dev/null
+++ b/.cruft.json
@@ -0,0 +1,29 @@
+{
+ "template": "https://github.com/scverse/cookiecutter-scverse",
+ "commit": "87a407a65408d75a949c0b54b19fd287475a56f8",
+ "checkout": null,
+ "context": {
+ "cookiecutter": {
+ "project_name": "pytometry",
+ "package_name": "pytometry",
+ "project_description": "Flow & mass cytometry analytics in scverse",
+ "author_full_name": "Maren BΓΌttner",
+ "author_email": "maren.buettner@tum.de",
+ "github_user": "scverse",
+ "project_repo": "https://github.com/scverse/pytometry",
+ "license": "Apache License Version 2.0",
+ "_copy_without_render": [
+ ".github/workflows/build.yaml",
+ ".github/workflows/test.yaml",
+ "docs/_templates/autosummary/**.rst"
+ ],
+ "_render_devdocs": false,
+ "_jinja2_env_vars": {
+ "lstrip_blocks": true,
+ "trim_blocks": true
+ },
+ "_template": "https://github.com/scverse/cookiecutter-scverse"
+ }
+ },
+ "directory": null
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..050f911
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[.cruft.json]
+indent_size = 2
+
+[Makefile]
+indent_style = tab
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..a5a20e6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,89 @@
+name: Bug report
+description: Report something that is broken or incorrect
+labels: bug
+body:
+ - type: markdown
+ attributes:
+ value: |
+ **Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports)
+ detailing how to provide the necessary information for us to reproduce your bug. In brief:
+ * Please provide exact steps how to reproduce the bug in a clean Python environment.
+ * In case it's not clear what's causing this bug, please provide the data or the data generation procedure.
+ * Sometimes it is not possible to share the data, but usually it is possible to replicate problems on publicly
+ available datasets or to share a subset of your data.
+
+ - type: textarea
+ id: report
+ attributes:
+ label: Report
+ description: A clear and concise description of what the bug is.
+ validations:
+ required: true
+
+ - type: textarea
+ id: versions
+ attributes:
+ label: Version information
+ description: |
+ Please paste below the output of
+
+ ```python
+ import session_info
+ session_info.show(html=False, dependencies=True)
+ ```
+ placeholder: |
+ -----
+ anndata 0.8.0rc2.dev27+ge524389
+ session_info 1.0.0
+ -----
+ asttokens NA
+ awkward 1.8.0
+ backcall 0.2.0
+ cython_runtime NA
+ dateutil 2.8.2
+ debugpy 1.6.0
+ decorator 5.1.1
+ entrypoints 0.4
+ executing 0.8.3
+ h5py 3.7.0
+ ipykernel 6.15.0
+ jedi 0.18.1
+ mpl_toolkits NA
+ natsort 8.1.0
+ numpy 1.22.4
+ packaging 21.3
+ pandas 1.4.2
+ parso 0.8.3
+ pexpect 4.8.0
+ pickleshare 0.7.5
+ pkg_resources NA
+ prompt_toolkit 3.0.29
+ psutil 5.9.1
+ ptyprocess 0.7.0
+ pure_eval 0.2.2
+ pydev_ipython NA
+ pydevconsole NA
+ pydevd 2.8.0
+ pydevd_file_utils NA
+ pydevd_plugins NA
+ pydevd_tracing NA
+ pygments 2.12.0
+ pytz 2022.1
+ scipy 1.8.1
+ setuptools 62.5.0
+ setuptools_scm NA
+ six 1.16.0
+ stack_data 0.3.0
+ tornado 6.1
+ traitlets 5.3.0
+ wcwidth 0.2.5
+ zmq 23.1.0
+ -----
+ IPython 8.4.0
+ jupyter_client 7.3.4
+ jupyter_core 4.10.0
+ -----
+ Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:58:50) [GCC 10.3.0]
+ Linux-5.18.6-arch1-1-x86_64-with-glibc2.35
+ -----
+ Session information updated at 2022-07-07 17:55
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..5b62547
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Scverse Community Forum
+ url: https://discourse.scverse.org/
+ about: If you have questions about βHow to do Xβ, please ask them here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..989dee9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,11 @@
+name: Feature request
+description: Propose a new feature for pytometry
+labels: enhancement
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Description of feature
+ description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered.
+ validations:
+ required: true
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 0000000..265a95e
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,29 @@
+name: Check Build
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ package:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python 3.10
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.10"
+ cache: "pip"
+ cache-dependency-path: "**/pyproject.toml"
+ - name: Install build dependencies
+ run: python -m pip install --upgrade pip wheel twine build
+ - name: Build package
+ run: python -m build
+ - name: Check package
+ run: twine check --strict dist/*.whl
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 5ccb236..0000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-name: build
-
-on:
- push:
- branches: [main]
- pull_request:
- branches: [main]
-
-jobs:
- build:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- python-version: ["3.9"]
-
- steps:
- - name: Checkout main
- uses: actions/checkout@v3
- with:
- fetch-depth: 0
- - name: Setup Python
- uses: actions/setup-python@v3
- with:
- python-version: ${{ matrix.python-version }}
- - name: Cache
- uses: actions/cache@v3
- env:
- cache-name: cache-all
- with:
- path: |
- .nox
- ~/.cache/pre-commit
- key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('.pre-commit-config.yaml') }}-${{ hashFiles('pyproject.yaml') }}
- - name: Install pip and nox
- run: |
- python -m pip install --upgrade pip
- pip install nox
- - name: Lint
- run: |
- nox -s lint
- - name: Build
- run: |
- nox -s build --python ${{ matrix.python-version }}
- - name: Codecov
- uses: codecov/codecov-action@v2
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
- - name: Read lamin-project.yaml
- id: lamin-project
- uses: CumulusDS/get-yaml-paths-action@v0.1.0
- with:
- file: lamin-project.yaml
- project_slug: project_slug
- - name: Deploy docs
- id: netlify
- uses: nwtgck/actions-netlify@v1.2
- with:
- publish-dir: "_build/html"
- production-deploy: ${{ github.event_name == 'push' }}
- github-token: ${{ secrets.GITHUB_TOKEN }}
- enable-commit-comment: false
- env:
- NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
- NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
diff --git a/.github/workflows/latest-changes.jinja2 b/.github/workflows/latest-changes.jinja2
deleted file mode 100644
index dd5ed40..0000000
--- a/.github/workflows/latest-changes.jinja2
+++ /dev/null
@@ -1,2 +0,0 @@
-{{pr.title}} | [{{pr.number}}]({{pr.html_url}}) | [{{pr.user.login}}]({{pr.user.html_url}}) | {{pr.closed_at.date().isoformat()}} |
-
diff --git a/.github/workflows/latest-changes.yml b/.github/workflows/latest-changes.yml
deleted file mode 100644
index 0f4691c..0000000
--- a/.github/workflows/latest-changes.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: latest-changes
-
-on:
- pull_request_target:
- branches:
- - main
- types:
- - closed
- workflow_dispatch:
- inputs:
- number:
- description: PR number
- required: true
-
-jobs:
- latest-changes:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: docker://tiangolo/latest-changes:0.0.3
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- latest_changes_file: docs/changelog.md
- latest_changes_header: '--- \| --- \| --- \| --- \| ---\n'
- template_file: ./.github/workflows/latest-changes.jinja2
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
new file mode 100644
index 0000000..ebe6f65
--- /dev/null
+++ b/.github/workflows/release.yaml
@@ -0,0 +1,29 @@
+name: Release
+
+on:
+ release:
+ types: [published]
+
+# Use "trusted publishing", see https://docs.pypi.org/trusted-publishers/
+jobs:
+ release:
+ name: Upload release to PyPI
+ runs-on: ubuntu-latest
+ environment:
+ name: pypi
+ url: https://pypi.org/p/pytometry
+ permissions:
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ filter: blob:none
+ fetch-depth: 0
+ - uses: actions/setup-python@v4
+ with:
+ python-version: "3.x"
+ cache: "pip"
+ - run: pip install build
+ - run: python -m build
+ - name: Publish package distributions to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
new file mode 100644
index 0000000..2bfe232
--- /dev/null
+++ b/.github/workflows/test.yaml
@@ -0,0 +1,67 @@
+name: Test
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: "0 5 1,15 * *"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ test:
+ runs-on: ${{ matrix.os }}
+ defaults:
+ run:
+ shell: bash -e {0} # -e to fail on error
+
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - os: ubuntu-latest
+ python: "3.10"
+ - os: ubuntu-latest
+ python: "3.12"
+ - os: ubuntu-latest
+ python: "3.12"
+ pip-flags: "--pre"
+ name: PRE-RELEASE DEPENDENCIES
+
+ name: ${{ matrix.name }} Python ${{ matrix.python }}
+
+ env:
+ OS: ${{ matrix.os }}
+ PYTHON: ${{ matrix.python }}
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python ${{ matrix.python }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python }}
+ cache: "pip"
+ cache-dependency-path: "**/pyproject.toml"
+
+ - name: Install test dependencies
+ run: |
+ python -m pip install --upgrade pip wheel
+ - name: Install dependencies
+ run: |
+ pip install ${{ matrix.pip-flags }} ".[dev,test]"
+ - name: Test
+ env:
+ MPLBACKEND: agg
+ PLATFORM: ${{ matrix.os }}
+ DISPLAY: :42
+ run: |
+ coverage run -m pytest -v --color=yes
+ - name: Report coverage
+ run: |
+ coverage report
+ - name: Upload coverage
+ uses: codecov/codecov-action@v3
diff --git a/.gitignore b/.gitignore
index ca7cf1f..edc84de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,114 +1,33 @@
-_docs_tmp*
-
-# macOS
+# Temp files
.DS_Store
-.AppleDouble
-.LSOverride
+*~
+buck-out/
-# Byte-compiled / optimized / DLL files
+# Compiled files
+.venv/
__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-.hypothesis/
-.pytest_cache/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# pyenv
-.python-version
-
-# celery beat schedule file
-celerybeat-schedule
-
-# SageMath parsed files
-*.sage.py
-
-# dotenv
-.env
-
-# virtualenv
-.venv
-venv/
-ENV/
-
-# mypy
.mypy_cache/
+.ruff_cache/
-# IDE settings
-.vscode/
-.idea/
-
-# Lamin
-_build
-docs/pytometry.*
-lamin_sphinx
-docs/conf.py
-docs/_static/logo.svg
-
-# data
-docs/tutorials/*.fcs
-docs/tutorials/*.h5ad
+# Distribution / packaging
+/build/
+/dist/
+/*.egg-info/
+
+# Tests and coverage
+/.pytest_cache/
+/.cache/
+/data/
+/node_modules/
+
+# docs
+/docs/generated/
+/docs/_build/
+
+# IDEs
+/.idea/
+/.vscode/
+
+# Data files from tutorials
+/docs/notebooks/*.fcs
+/docs/notebooks/*.h5ad
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 470d542..a83ecf4 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,71 +1,47 @@
+fail_fast: false
+default_language_version:
+ python: python3
+default_stages:
+ - commit
+ - push
+minimum_pre_commit_version: 2.16.0
repos:
- - repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v3.2.0
- hooks:
- - id: trailing-whitespace
- - id: end-of-file-fixer
- exclude: |
- (?x)(
- .github/workflows/latest-changes.jinja2
- )
- - id: check-yaml
- - id: check-added-large-files
- exclude: (?x)(
- docs/examples/
- )
- - repo: https://github.com/psf/black
- rev: 22.6.0
- hooks:
- - id: black-jupyter
- - repo: https://github.com/pycqa/flake8
- rev: 4.0.1
- hooks:
- - id: flake8
- additional_dependencies:
- - flake8-black==0.3.3
- - flake8-typing-imports==1.10.0
- language_version: python3
- args:
- - --max-line-length=88
- - --ignore=E203,TYP001
- exclude: |
- (?x)(
- __init__.py
- )
- repo: https://github.com/pre-commit/mirrors-prettier
- rev: v2.6.2
+ rev: v4.0.0-alpha.8
hooks:
- id: prettier
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.4.4
+ hooks:
+ - id: ruff
+ types_or: [python, pyi, jupyter]
+ args: [--fix, --exit-non-zero-on-fix]
+ - id: ruff-format
+ types_or: [python, pyi, jupyter]
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.6.0
+ hooks:
+ - id: detect-private-key
+ - id: check-ast
+ - id: end-of-file-fixer
+ - id: mixed-line-ending
+ args: [--fix=lf]
+ - id: trailing-whitespace
+ - id: check-case-conflict
+ # Check that there are no merge conflicts (could be generated by template sync)
+ - id: check-merge-conflict
+ args: [--assume-in-merge]
- repo: https://github.com/kynan/nbstripout
- rev: 0.3.9
+ rev: "0.7.1"
hooks:
- id: nbstripout
- exclude: |
- (?x)(
- docs/examples/
- )
- - repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.1.9
- hooks:
- - id: forbid-crlf
- - id: remove-crlf
- - repo: https://github.com/pre-commit/mirrors-isort
- rev: v5.8.0
- hooks:
- - id: isort
- args: ["--profile", "black"]
- additional_dependencies: [toml]
- - repo: https://github.com/pre-commit/mirrors-mypy
- rev: v0.940
- hooks:
- - id: mypy
- - repo: https://github.com/pycqa/pydocstyle
- rev: 6.1.1
- hooks:
- - id: pydocstyle
- args: # google style + __init__, see http://www.pydocstyle.org/en/stable/error_codes.html
- - --ignore=D100,D101,D102,D103,D106,D107,D203,D204,D213,D215,D400,D401,D403,D404,D406,D407,D408,D409,D413
- exclude: |
- (?x)(
- __init__.py
- )
+ files: 'docs/notebooks/.*\.ipynb$'
+ - repo: local
+ hooks:
+ - id: forbid-to-commit
+ name: Don't commit rej files
+ entry: |
+ Cannot commit .rej files. These indicate merge conflicts that arise during automated template updates.
+ Fix the merge conflicts manually and remove the .rej files.
+ language: fail
+ files: '.*\.rej$'
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000..69897c3
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,16 @@
+# https://docs.readthedocs.io/en/stable/config-file/v2.html
+version: 2
+build:
+ os: ubuntu-20.04
+ tools:
+ python: "3.10"
+sphinx:
+ configuration: docs/conf.py
+ # disable this for more lenient docs builds
+ fail_on_warning: true
+python:
+ install:
+ - method: pip
+ path: .
+ extra_requirements:
+ - doc
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e390348
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,3 @@
+# Changelog
+
+See [GitHub releases](https://github.com/scverse/pytometry/releases).
diff --git a/README.md b/README.md
index 3edf0e4..7f0d315 100644
--- a/README.md
+++ b/README.md
@@ -1,43 +1,60 @@
-[![pypi](https://img.shields.io/pypi/v/pytometry?color=blue&label=pypi%20package)](https://pypi.org/project/pytometry)
-[![codecov](https://codecov.io/gh/buettnerlab/pytometry/branch/main/graph/badge.svg?token=AEG5ra92HV)](https://codecov.io/gh/buettnerlab/pytometry)
-[![Stars](https://img.shields.io/github/stars/buettnerlab/pytometry?logo=GitHub&color=yellow)](https://github.com/buettnerlab/pytometry/stargazers)
-
-
-
+# pytometry: Flow & mass cytometry analytics
-# Pytometry: Flow & mass cytometry analytics
+[![Tests][badge-tests]][link-tests]
+[![Documentation][badge-docs]][link-docs]
+
+[badge-tests]: https://img.shields.io/github/actions/workflow/status/scverse/pytometry/test.yaml?branch=main
+[link-tests]: https://github.com/scverse/pytometry/actions/workflows/test.yml
+[badge-docs]: https://img.shields.io/readthedocs/pytometry
This package provides efficient and scalable handling of flow and mass cytometry data analysis. It provides
-- the functionality to read in flow data in the fcs file format as [anndata](https://anndata.readthedocs.io/en/latest/) objects
-- flow and mass cytometry specific preprocessing tools
-- access to the entire [scanpy](https://scanpy.readthedocs.io/en/stable/) workflow functionality
-- GPU support through [rapids](https://github.com/clara-parabricks/rapids-single-cell-examples)
+- the functionality to read in flow data in the fcs file format as [anndata](https://anndata.readthedocs.io/en/latest/) objects
+- flow and mass cytometry specific preprocessing tools
+- access to the entire [scanpy](https://scanpy.readthedocs.io/en/stable/) workflow functionality
+- GPU support through [rapids-singlecell](https://rapids-singlecell.readthedocs.io/)
+
+## Getting started
-Follow [https://twitter.com/marenbuettner](https://twitter.com/marenbuettner) for updates.
+Please refer to the [documentation][link-docs]. In particular, the
-For the code enthusiasts: Find our code base on [Github](https://github.com/buettnerlab/pytometry).
+- [API documentation][link-api].
## Installation
-You can install `pytometry` via [pip](https://pip.pypa.io/) from [PyPI](https://pypi.org/):
+You need to have Python 3.10 or newer installed on your system. If you don't have
+Python installed, we recommend installing [Mambaforge](https://github.com/conda-forge/miniforge#mambaforge).
-```
+There are several alternative options to install pytometry:
+
+1. Install the latest release of `pytometry` from [PyPI][link-pypi].
+
+```bash
pip install pytometry
```
-or from GitHub:
+2. Install the latest development version:
+```bash
+pip install git+https://github.com/scverse/pytometry.git@main
```
-pip install git+https://github.com/buettnerlab/pytometry.git
-```
-## Updates
+## Release notes
+
+See [GitHub releases][changelog].
-- May 3rd 2023: New release 0.1.5 with FlowSOM clustering and autologicle normalization.
-- August 28th 2023: New release with various fixes and improvements.
-- October 12th 2022: First public release announcement on [Twitter](https://twitter.com/marenbuettner/status/1580160765201244161?s=20&t=mTBLcUaqKs9eMzEpOWnG0g)
+## Contact
+
+For questions and help requests, you can reach out in the [scverse discourse][scverse-discourse].
+If you found a bug, please use the [issue tracker][issue-tracker].
## Citation
Pytometry is currently a pre-print on [bioRxiv](https://www.biorxiv.org/content/10.1101/2022.10.10.511546v1).
+
+[scverse-discourse]: https://discourse.scverse.org/
+[issue-tracker]: https://github.com/scverse/pytometry/issues
+[changelog]: https://github.com/scverse/pytometry/releases
+[link-docs]: https://pytometry.readthedocs.io
+[link-api]: https://pytometry.readthedocs.io/latest/api.html
+[link-pypi]: https://pypi.org/project/pytometry
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..d4bb2cb
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = .
+BUILDDIR = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_static/.gitkeep b/docs/_static/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css
new file mode 100644
index 0000000..b8c8d47
--- /dev/null
+++ b/docs/_static/css/custom.css
@@ -0,0 +1,4 @@
+/* Reduce the font size in data frames - See https://github.com/scverse/cookiecutter-scverse/issues/193 */
+div.cell_output table.dataframe {
+ font-size: 0.8em;
+}
diff --git a/docs/_templates/.gitkeep b/docs/_templates/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst
new file mode 100644
index 0000000..e4665df
--- /dev/null
+++ b/docs/_templates/autosummary/class.rst
@@ -0,0 +1,61 @@
+{{ fullname | escape | underline}}
+
+.. currentmodule:: {{ module }}
+
+.. add toctree option to make autodoc generate the pages
+
+.. autoclass:: {{ objname }}
+
+{% block attributes %}
+{% if attributes %}
+Attributes table
+~~~~~~~~~~~~~~~~~~
+
+.. autosummary::
+{% for item in attributes %}
+ ~{{ fullname }}.{{ item }}
+{%- endfor %}
+{% endif %}
+{% endblock %}
+
+{% block methods %}
+{% if methods %}
+Methods table
+~~~~~~~~~~~~~
+
+.. autosummary::
+{% for item in methods %}
+ {%- if item != '__init__' %}
+ ~{{ fullname }}.{{ item }}
+ {%- endif -%}
+{%- endfor %}
+{% endif %}
+{% endblock %}
+
+{% block attributes_documentation %}
+{% if attributes %}
+Attributes
+~~~~~~~~~~~
+
+{% for item in attributes %}
+
+.. autoattribute:: {{ [objname, item] | join(".") }}
+{%- endfor %}
+
+{% endif %}
+{% endblock %}
+
+{% block methods_documentation %}
+{% if methods %}
+Methods
+~~~~~~~
+
+{% for item in methods %}
+{%- if item != '__init__' %}
+
+.. automethod:: {{ [objname, item] | join(".") }}
+{%- endif -%}
+{%- endfor %}
+
+{% endif %}
+{% endblock %}
diff --git a/docs/_templates/footer.html b/docs/_templates/footer.html
deleted file mode 100644
index e46cf51..0000000
--- a/docs/_templates/footer.html
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
diff --git a/docs/api.md b/docs/api.md
index 7582e52..bedfd5e 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -1,5 +1,63 @@
# API
+Import pytometry as
+
+```python
+import pytometry as pt
+```
+
+## Read/write (`io`)
+
+```{eval-rst}
+.. module:: pytometry.io
+.. currentmodule:: pytometry
+
+.. autosummary::
+ :toctree: generated
+
+ io.read_fcs
+ io.read_and_merge
+```
+
+## Preprocessing (`pp`)
+
+```{eval-rst}
+.. module:: pytometry.pp
+.. currentmodule:: pytometry
+
+.. autosummary::
+ :toctree: generated
+
+ pp.split_signal
+ pp.compensate
+ pp.create_comp_mat
+ pp.find_indexes
+```
+
+## Tools
+
+```{eval-rst}
+.. module:: pytometry.tl
+.. currentmodule:: pytometry
+
+.. autosummary::
+ :toctree: generated
+
+ tl.normalize_arcsinh
+ tl.normalize_logicle
+ tl.normalize_biexp
+ tl.normalize_autologicle
+```
+
+## Plotting
+
```{eval-rst}
-.. automodule:: pytometry
+.. module:: pytometry.pl
+.. currentmodule:: pytometry
+
+.. autosummary::
+ :toctree: generated
+
+ pl.plotdata
+ pl.scatter_density
```
diff --git a/docs/changelog.md b/docs/changelog.md
index a934aa8..d9e79ba 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -1,50 +1,3 @@
-# Changelog
+```{include} ../CHANGELOG.md
-
-Name | PR | Developer | Date | Patch
---- | --- | --- | --- | ---
-β¬οΈ add pandas 2 support | [72](https://github.com/scverse/pytometry/pull/72) | [mbuttner](https://github.com/mbuttner) | 2024-05-22 |
-Use numpy histogram in scatter_density | [70](https://github.com/scverse/pytometry/pull/70) | [quentinblampey](https://github.com/quentinblampey) | 2024-05-20 |
-π update readme | [63](https://github.com/buettnerlab/pytometry/pull/63) | [mbuttner](https://github.com/mbuttner) | 2024-05-03 |
-π add auxiliary files around autologicle normalization | [62](https://github.com/buettnerlab/pytometry/pull/62) | [mbuttner](https://github.com/mbuttner) | 2024-05-03 |
-β¨ Add autologicle normalization function | [61](https://github.com/buettnerlab/pytometry/pull/61) | [KarolaM](https://github.com/KarolaM) | 2024-05-03 |
-β¨ FlowSOM | [59](https://github.com/buettnerlab/pytometry/pull/59) | [burtonrj](https://github.com/burtonrj) | 2023-11-07 |
-π update example data | [57](https://github.com/buettnerlab/pytometry/pull/57) | [mbuttner](https://github.com/mbuttner) | 2023-10-04 |
-β¨ several cofactors for arcsinh | [55](https://github.com/buettnerlab/pytometry/pull/55) | [mbuttner](https://github.com/mbuttner) | 2023-09-20 |
-π Update version | [45](https://github.com/buettnerlab/pytometry/pull/45) | [mbuttner](https://github.com/mbuttner) | 2023-08-28 |
-:wrench: update maintainer mail | [44](https://github.com/buettnerlab/pytometry/pull/44) | [mbuttner](https://github.com/mbuttner) | 2023-08-28 |
-β‘ Various improvements to scatter_density | [43](https://github.com/buettnerlab/pytometry/pull/43) | [grst](https://github.com/grst) | 2023-06-27 |
-βοΈ Update API docs | [42](https://github.com/buettnerlab/pytometry/pull/42) | [grst](https://github.com/grst) | 2023-06-27 |
-Copy original data in `compensate` | [41](https://github.com/buettnerlab/pytometry/pull/41) | [grst](https://github.com/grst) | 2023-06-26 |
-π Small fix for bug in compensation function. | [39](https://github.com/buettnerlab/pytometry/pull/39) | [ricomnl](https://github.com/ricomnl) | 2023-06-08 |
-π· Update nbproject test | [40](https://github.com/buettnerlab/pytometry/pull/40) | [mbuttner](https://github.com/mbuttner) | 2023-06-08 |
-:arrow_up: Update readfcs dependency | [35](https://github.com/buettnerlab/pytometry/pull/35) | [mbuttner](https://github.com/mbuttner) | 2023-01-20 |
-:memo: add annotation nb | [34](https://github.com/buettnerlab/pytometry/pull/34) | [mbuttner](https://github.com/mbuttner) | 2022-11-25 |
-π Added parameter type hints | [33](https://github.com/buettnerlab/pytometry/pull/33) | [Ma-Fi-94](https://github.com/Ma-Fi-94) | 2022-10-14 |
-π add map channels | [32](https://github.com/buettnerlab/pytometry/pull/32) | [mbuttner](https://github.com/mbuttner) | 2022-10-14 |
-:memo: clean up docs | [31](https://github.com/buettnerlab/pytometry/pull/31) | [mbuttner](https://github.com/mbuttner) | 2022-10-12 |
-π update readme links | [30](https://github.com/buettnerlab/pytometry/pull/30) | [mbuttner](https://github.com/mbuttner) | 2022-10-12 |
-βοΈ Update README.md | [29](https://github.com/buettnerlab/pytometry/pull/29) | [mbuttner](https://github.com/mbuttner) | 2022-10-12 |
-π fix compensation formula | [26](https://github.com/buettnerlab/pytometry/pull/26) | [mbuttner](https://github.com/mbuttner) | 2022-08-16 |
-β¨ Add `density_scatter` plotting function | [22](https://github.com/buettnerlab/pytometry/pull/22) | [KarolaM](https://github.com/KarolaM) | 2022-08-16 |
-π· Install `lndocs` from PyPI | [25](https://github.com/buettnerlab/pytometry/pull/25) | [falexwolf](https://github.com/falexwolf) | 2022-08-16 |
-π update readme and examples | [24](https://github.com/buettnerlab/pytometry/pull/24) | [mbuttner](https://github.com/mbuttner) | 2022-08-16 |
-:fire: cleanup | [23](https://github.com/buettnerlab/pytometry/pull/23) | [mbuttner](https://github.com/mbuttner) | 2022-08-15 |
-β
add tests | [21](https://github.com/buettnerlab/pytometry/pull/21) | [mbuttner](https://github.com/mbuttner) | 2022-08-15 |
-π· Style docs correctly | [20](https://github.com/buettnerlab/pytometry/pull/20) | [falexwolf](https://github.com/falexwolf) | 2022-08-11 |
-β¨ add plotting module | [19](https://github.com/buettnerlab/pytometry/pull/19) | [mbuttner](https://github.com/mbuttner) | 2022-08-09 |
-π¨ improved split_signal | [18](https://github.com/buettnerlab/pytometry/pull/18) | [mbuttner](https://github.com/mbuttner) | 2022-08-08 |
-β¨ match columns in compensate | [17](https://github.com/buettnerlab/pytometry/pull/17) | [mbuttner](https://github.com/mbuttner) | 2022-08-08 |
-π¨ replace copy by inplace | [16](https://github.com/buettnerlab/pytometry/pull/16) | [mbuttner](https://github.com/mbuttner) | 2022-08-08 |
-π¨ Simplify read function and datasets calls | [15](https://github.com/buettnerlab/pytometry/pull/15) | [sunnyosun](https://github.com/sunnyosun) | 2022-08-08 |
-π add icons | [13](https://github.com/buettnerlab/pytometry/pull/13) | [mbuttner](https://github.com/mbuttner) | 2022-08-05 |
-βοΈ fix logo path | [12](https://github.com/buettnerlab/pytometry/pull/12) | [mbuttner](https://github.com/mbuttner) | 2022-08-04 |
-π update docs | [11](https://github.com/buettnerlab/pytometry/pull/11) | [mbuttner](https://github.com/mbuttner) | 2022-08-04 |
-π Fix footer | [10](https://github.com/buettnerlab/pytometry/pull/10) | [falexwolf](https://github.com/falexwolf) | 2022-08-02 |
-π· Prettify docs | [9](https://github.com/buettnerlab/pytometry/pull/9) | [falexwolf](https://github.com/falexwolf) | 2022-08-02 |
-π add preprocessing notebook | [8](https://github.com/buettnerlab/pytometry/pull/8) | [mbuttner](https://github.com/mbuttner) | 2022-08-02 |
-β¨ add inplace operations | [7](https://github.com/buettnerlab/pytometry/pull/7) | [mbuttner](https://github.com/mbuttner) | 2022-08-02 |
-π¨ integrate readfcs package | [6](https://github.com/buettnerlab/pytometry/pull/6) | [mbuttner](https://github.com/mbuttner) | 2022-08-01 |
-π Migrate pytometry from legacy | [2](https://github.com/buettnerlab/pytometry/pull/2) | [mbuttner](https://github.com/mbuttner) | 2022-07-27 |
-π add toml to fix CI | [3](https://github.com/buettnerlab/pytometry/pull/3) | [mbuttner](https://github.com/mbuttner) | 2022-07-26 |
-π Fix CI | [1](https://github.com/laminlabs/pytometry/pull/1) | [falexwolf](https://github.com/falexwolf) | 2022-07-07 |
+```
diff --git a/docs/conf.py b/docs/conf.py
index 18cb24a..8429b10 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,53 +1,132 @@
-# isort: skip_file
+# Configuration file for the Sphinx documentation builder.
+
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
import sys
from datetime import datetime
+from importlib.metadata import metadata
from pathlib import Path
-from sphinx.application import Sphinx
-import pytometry
HERE = Path(__file__).parent
-sys.path[:0] = [str(HERE), str(HERE.parent)]
-from lamin_sphinx import * # noqa
-from lamin_sphinx import html_context, html_theme_options, extensions # noqa
+sys.path.insert(0, str(HERE / "extensions"))
+
+
+# -- Project information -----------------------------------------------------
-project = "Pytometry"
-html_title = "Pytometry"
-release = pytometry.__version__
-html_context["github_repo"] = "pytometry" # noqa
-# We're actually using this for the link behind the brand of the page!
-html_theme_options["logo"] = {"link": "pytometry"} # noqa
-extensions += ["sphinx.ext.intersphinx"]
+# NOTE: If you installed your project in editable mode, this might be stale.
+# If this is the case, reinstall it to refresh the metadata
+info = metadata("pytometry")
+project_name = info["Name"]
+author = info["Author"]
+copyright = f"{datetime.now():%Y}, {author}."
+version = info["Version"]
+urls = dict(pu.split(", ") for pu in info.get_all("Project-URL"))
+repository_url = urls["Source"]
-ogp_site_url = "https://pytometry.netlify.app"
+# The full version, including alpha/beta/rc tags
+release = info["Version"]
-author = "pytometry developers"
-copyright = f"{datetime.now():%Y}, {author}"
+bibtex_bibfiles = ["references.bib"]
+templates_path = ["_templates"]
+nitpicky = True # Warn about broken links
+needs_sphinx = "4.0"
html_context = {
- "default_mode": "auto",
- "github_user": "buettnerlab",
+ "display_github": True, # Integrate GitHub
+ "github_user": "scverse",
+ "github_repo": "https://github.com/scverse/pytometry",
"github_version": "main",
+ "conf_py_path": "/docs/",
+}
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings.
+# They can be extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+ "myst_nb",
+ "sphinx_copybutton",
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.autosummary",
+ "sphinx.ext.napoleon",
+ "sphinxcontrib.bibtex",
+ "sphinx_autodoc_typehints",
+ "sphinx.ext.mathjax",
+ "IPython.sphinxext.ipython_console_highlighting",
+ "sphinxext.opengraph",
+ *[p.stem for p in (HERE / "extensions").glob("*.py")],
+]
+
+autosummary_generate = True
+autodoc_member_order = "groupwise"
+default_role = "literal"
+napoleon_google_docstring = False
+napoleon_numpy_docstring = True
+napoleon_include_init_with_doc = False
+napoleon_use_rtype = True # having a separate entry generally helps readability
+napoleon_use_param = True
+myst_heading_anchors = 6 # create anchors for h1-h6
+myst_enable_extensions = [
+ "amsmath",
+ "colon_fence",
+ "deflist",
+ "dollarmath",
+ "html_image",
+ "html_admonition",
+]
+myst_url_schemes = ("http", "https", "mailto")
+nb_output_stderr = "remove"
+nb_execution_mode = "off"
+nb_execution_timeout = 600
+nb_merge_streams = True
+typehints_defaults = "braces"
+
+source_suffix = {
+ ".rst": "restructuredtext",
+ ".ipynb": "myst-nb",
+ ".myst": "myst-nb",
}
-html_logo = (
- "https://raw.githubusercontent.com/buettnerlab/pytometry/main/docs/_static/logo.svg"
-)
-html_favicon = (
- "https://raw.githubusercontent.com/buettnerlab/pytometry/main/docs/_static/logo.ico"
-)
-templates_path = ["_templates", "../lamin_sphinx/_templates"]
-html_static_path = ["_static", "../lamin_sphinx/_static"]
-ogp_image = (
- "https://raw.githubusercontent.com/buettnerlab/pytometry/main/docs/_static/logo.svg"
-)
intersphinx_mapping = {
+ "python": ("https://docs.python.org/3", None),
+ "anndata": ("https://anndata.readthedocs.io/en/stable/", None),
+ "numpy": ("https://numpy.org/doc/stable/", None),
"matplotlib": ("https://matplotlib.org/stable", None),
+ "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
}
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"]
+
+
+# -- Options for HTML output -------------------------------------------------
-def setup_replacement(app: Sphinx):
- app.warningiserror = False
- app.add_css_file("custom.css")
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = "sphinx_book_theme"
+html_static_path = ["_static"]
+html_css_files = ["css/custom.css"]
+
+html_title = project_name
+
+html_theme_options = {
+ "repository_url": repository_url,
+ "use_repository_button": True,
+ "path_to_docs": "docs/",
+ "navigation_with_keys": False,
+}
+pygments_style = "default"
-setup = setup_replacement
+nitpick_ignore = [
+ # If building the documentation fails because of a missing link that is outside your control,
+ # you can add an exception to this list.
+ # ("py:class", "igraph.Graph"),
+]
diff --git a/docs/contributing.md b/docs/contributing.md
new file mode 100644
index 0000000..7d1cfe2
--- /dev/null
+++ b/docs/contributing.md
@@ -0,0 +1,160 @@
+# Contributing guide
+
+Scanpy provides extensive [developer documentation][scanpy developer guide], most of which applies to this project, too.
+This document will not reproduce the entire content from there. Instead, it aims at summarizing the most important
+information to get you started on contributing.
+
+We assume that you are already familiar with git and with making pull requests on GitHub. If not, please refer
+to the [scanpy developer guide][].
+
+## Installing dev dependencies
+
+In addition to the packages needed to _use_ this package, you need additional python packages to _run tests_ and _build
+the documentation_. It's easy to install them using `pip`:
+
+```bash
+cd pytometry
+pip install -e ".[dev,test,doc]"
+```
+
+## Code-style
+
+This package uses [pre-commit][] to enforce consistent code-styles.
+On every commit, pre-commit checks will either automatically fix issues with the code, or raise an error message.
+
+To enable pre-commit locally, simply run
+
+```bash
+pre-commit install
+```
+
+in the root of the repository. Pre-commit will automatically download all dependencies when it is run for the first time.
+
+Alternatively, you can rely on the [pre-commit.ci][] service enabled on GitHub. If you didn't run `pre-commit` before
+pushing changes to GitHub it will automatically commit fixes to your pull request, or show an error message.
+
+If pre-commit.ci added a commit on a branch you still have been working on locally, simply use
+
+```bash
+git pull --rebase
+```
+
+to integrate the changes into yours.
+While the [pre-commit.ci][] is useful, we strongly encourage installing and running pre-commit locally first to understand its usage.
+
+Finally, most editors have an _autoformat on save_ feature. Consider enabling this option for [ruff][ruff-editors]
+and [prettier][prettier-editors].
+
+[ruff-editors]: https://docs.astral.sh/ruff/integrations/
+[prettier-editors]: https://prettier.io/docs/en/editors.html
+
+## Writing tests
+
+```{note}
+Remember to first install the package with `pip install -e '.[dev,test]'`
+```
+
+This package uses the [pytest][] for automated testing. Please [write tests][scanpy-test-docs] for every function added
+to the package.
+
+Most IDEs integrate with pytest and provide a GUI to run tests. Alternatively, you can run all tests from the
+command line by executing
+
+```bash
+pytest
+```
+
+in the root of the repository.
+
+### Continuous integration
+
+Continuous integration will automatically run the tests on all pull requests and test
+against the minimum and maximum supported Python version.
+
+Additionally, there's a CI job that tests against pre-releases of all dependencies
+(if there are any). The purpose of this check is to detect incompatibilities
+of new package versions early on and gives you time to fix the issue or reach
+out to the developers of the dependency before the package is released to a wider audience.
+
+[scanpy-test-docs]: https://scanpy.readthedocs.io/en/latest/dev/testing.html#writing-tests
+
+## Publishing a release
+
+### Updating the version number
+
+Before making a release, you need to update the version number in the `pyproject.toml` file. Please adhere to [Semantic Versioning][semver], in brief
+
+> Given a version number MAJOR.MINOR.PATCH, increment the:
+>
+> 1. MAJOR version when you make incompatible API changes,
+> 2. MINOR version when you add functionality in a backwards compatible manner, and
+> 3. PATCH version when you make backwards compatible bug fixes.
+>
+> Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.
+
+Once you are done, commit and push your changes and navigate to the "Releases" page of this project on GitHub.
+Specify `vX.X.X` as a tag name and create a release. For more information, see [managing GitHub releases][]. This will automatically create a git tag and trigger a Github workflow that creates a release on PyPI.
+
+## Writing documentation
+
+Please write documentation for new or changed features and use-cases. This project uses [sphinx][] with the following features:
+
+- the [myst][] extension allows to write documentation in markdown/Markedly Structured Text
+- [Numpy-style docstrings][numpydoc] (through the [napoloen][numpydoc-napoleon] extension).
+- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
+- [Sphinx autodoc typehints][], to automatically reference annotated input and output types
+- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)
+
+See the [scanpy developer docs](https://scanpy.readthedocs.io/en/latest/dev/documentation.html) for more information
+on how to write documentation.
+
+### Tutorials with myst-nb and jupyter notebooks
+
+The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
+Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
+It is your responsibility to update and re-run the notebook whenever necessary.
+
+If you are interested in automatically running notebooks as part of the continuous integration, please check
+out [this feature request](https://github.com/scverse/cookiecutter-scverse/issues/40) in the `cookiecutter-scverse`
+repository.
+
+#### Hints
+
+- If you refer to objects from other packages, please add an entry to `intersphinx_mapping` in `docs/conf.py`. Only
+ if you do so can sphinx automatically create a link to the external documentation.
+- If building the documentation fails because of a missing link that is outside your control, you can add an entry to
+ the `nitpick_ignore` list in `docs/conf.py`
+
+#### Building the docs locally
+
+```bash
+cd docs
+make html
+open _build/html/index.html
+```
+
+
+
+[scanpy developer guide]: https://scanpy.readthedocs.io/en/latest/dev/index.html
+[cookiecutter-scverse-instance]: https://cookiecutter-scverse-instance.readthedocs.io/en/latest/template_usage.html
+[github quickstart guide]: https://docs.github.com/en/get-started/quickstart/create-a-repo?tool=webui
+[codecov]: https://about.codecov.io/sign-up/
+[codecov docs]: https://docs.codecov.com/docs
+[codecov bot]: https://docs.codecov.com/docs/team-bot
+[codecov app]: https://github.com/apps/codecov
+[pre-commit.ci]: https://pre-commit.ci/
+[readthedocs.org]: https://readthedocs.org/
+[myst-nb]: https://myst-nb.readthedocs.io/en/latest/
+[jupytext]: https://jupytext.readthedocs.io/en/latest/
+[pre-commit]: https://pre-commit.com/
+[anndata]: https://github.com/scverse/anndata
+[mudata]: https://github.com/scverse/mudata
+[pytest]: https://docs.pytest.org/
+[semver]: https://semver.org/
+[sphinx]: https://www.sphinx-doc.org/en/master/
+[myst]: https://myst-parser.readthedocs.io/en/latest/intro.html
+[numpydoc-napoleon]: https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html
+[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
+[sphinx autodoc typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints
+[pypi]: https://pypi.org/
+[managing GitHub releases]: https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository
diff --git a/docs/examples/01_preprocess_cytof_Oetjen.ipynb b/docs/examples/01_preprocess_cytof_Oetjen.ipynb
index 7dc4da0..f10f78e 100644
--- a/docs/examples/01_preprocess_cytof_Oetjen.ipynb
+++ b/docs/examples/01_preprocess_cytof_Oetjen.ipynb
@@ -159,12 +159,10 @@
"import scanpy as sc\n",
"import anndata as ann\n",
"import numpy as np\n",
- "import scipy as sp\n",
"import pandas as pd\n",
"import matplotlib.pyplot as pl\n",
"from matplotlib import rcParams\n",
"from matplotlib import colors\n",
- "import seaborn as sb\n",
"import datetime\n",
"import pytometry as pm\n",
"\n",
@@ -414,11 +412,7 @@
"metadata": {},
"outputs": [],
"source": [
- "marker_keep = [\n",
- " marker\n",
- " for marker in adata_all.var[\"AB\"]\n",
- " if marker not in [\"unused\", \"Environ\", \"beads\"]\n",
- "]"
+ "marker_keep = [marker for marker in adata_all.var[\"AB\"] if marker not in [\"unused\", \"Environ\", \"beads\"]]"
]
},
{
diff --git a/docs/examples/02_annotate_cytof_Oetjen.ipynb b/docs/examples/02_annotate_cytof_Oetjen.ipynb
index 3a56fea..33d0ed0 100644
--- a/docs/examples/02_annotate_cytof_Oetjen.ipynb
+++ b/docs/examples/02_annotate_cytof_Oetjen.ipynb
@@ -155,16 +155,13 @@
],
"source": [
"import scanpy as sc\n",
- "import anndata as ann\n",
"import numpy as np\n",
- "import scipy as sp\n",
"import pandas as pd\n",
"import matplotlib.pyplot as pl\n",
"from matplotlib import rcParams\n",
"from matplotlib import colors\n",
"import seaborn as sb\n",
"import datetime\n",
- "import pytometry as pm\n",
"\n",
"\n",
"sc.logging.print_versions()\n",
@@ -227,9 +224,7 @@
"id": "9c28bd9b-d031-48c2-b391-bac89ffc99d0",
"metadata": {},
"outputs": [],
- "source": [
- "import os"
- ]
+ "source": []
},
{
"cell_type": "code",
@@ -550,9 +545,7 @@
"metadata": {},
"outputs": [],
"source": [
- "adata_all.obs[\"cell_type_lvl0\"] = adata_all.obs[\"cell_type_lvl0\"].map(\n",
- " {True: \"CD45+\", False: \"CD45-\"}\n",
- ")"
+ "adata_all.obs[\"cell_type_lvl0\"] = adata_all.obs[\"cell_type_lvl0\"].map({True: \"CD45+\", False: \"CD45-\"})"
]
},
{
@@ -1050,9 +1043,7 @@
"metadata": {},
"outputs": [],
"source": [
- "df = pd.crosstab(\n",
- " adata_cd45.obs[\"sample\"], adata_cd45.obs[\"cell_type_lvl2\"], normalize=0\n",
- ")"
+ "df = pd.crosstab(adata_cd45.obs[\"sample\"], adata_cd45.obs[\"cell_type_lvl2\"], normalize=0)"
]
},
{
@@ -1199,9 +1190,7 @@
],
"source": [
"ax = sb.boxplot(data=df[[\"NK cell\", \"T cell\"]], orient=\"v\")\n",
- "ax = sb.swarmplot(\n",
- " data=df[[\"NK cell\", \"T cell\"]], orient=\"v\", color=\".25\", size=10, alpha=0.8\n",
- ")\n",
+ "ax = sb.swarmplot(data=df[[\"NK cell\", \"T cell\"]], orient=\"v\", color=\".25\", size=10, alpha=0.8)\n",
"ax.set_ylim([0, 1])"
]
},
@@ -1336,9 +1325,7 @@
"metadata": {},
"outputs": [],
"source": [
- "obs_tmp = adata_cd45.obs.loc[\n",
- " adata_cd45.obs[\"cell_type_lvl3\"].isin([\"CD4+ T cell\", \"CD8+ T cell\"])\n",
- "]"
+ "obs_tmp = adata_cd45.obs.loc[adata_cd45.obs[\"cell_type_lvl3\"].isin([\"CD4+ T cell\", \"CD8+ T cell\"])]"
]
},
{
@@ -1650,9 +1637,7 @@
"metadata": {},
"outputs": [],
"source": [
- "obs_tmp = adata_cd45.obs.loc[\n",
- " adata_cd45.obs[\"cell_type_lvl3\"].isin([\"CD4+ T cell\", \"CD8+ T cell\"])\n",
- "]"
+ "obs_tmp = adata_cd45.obs.loc[adata_cd45.obs[\"cell_type_lvl3\"].isin([\"CD4+ T cell\", \"CD8+ T cell\"])]"
]
},
{
@@ -1923,9 +1908,7 @@
" \"34\": \"not annotated\",\n",
" \"35\": \"CD4+ CM T cell\", #\n",
"}\n",
- "adata_cd45.obs[\"cell_type_lvl5\"] = pd.Categorical(\n",
- " adata_cd45.obs[\"leiden\"].map(cluster2cell).copy()\n",
- ")"
+ "adata_cd45.obs[\"cell_type_lvl5\"] = pd.Categorical(adata_cd45.obs[\"leiden\"].map(cluster2cell).copy())"
]
},
{
@@ -2124,12 +2107,8 @@
"metadata": {},
"outputs": [],
"source": [
- "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.add_categories(\n",
- " [\"CD4+ TRM T cell\"]\n",
- ")\n",
- "adata_cd45.obs[\"cell_type_lvl5\"][\n",
- " adata_cd45.obs[\"leiden_R\"].isin([\"13,6\", \"13,8\"])\n",
- "] = \"CD4+ TRM T cell\""
+ "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.add_categories([\"CD4+ TRM T cell\"])\n",
+ "adata_cd45.obs[\"cell_type_lvl5\"][adata_cd45.obs[\"leiden_R\"].isin([\"13,6\", \"13,8\"])] = \"CD4+ TRM T cell\""
]
},
{
@@ -2147,18 +2126,10 @@
"metadata": {},
"outputs": [],
"source": [
- "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.add_categories(\n",
- " [\"CD8+ CM T cell\"]\n",
- ")\n",
- "adata_cd45.obs[\"cell_type_lvl5\"][\n",
- " adata_cd45.obs[\"leiden_R\"].isin([\"5,4\", \"5,9\"])\n",
- "] = \"CD8+ CM T cell\"\n",
- "adata_cd45.obs[\"cell_type_lvl5\"][\n",
- " adata_cd45.obs[\"leiden_R\"].isin([\"5,10\"])\n",
- "] = \"Naive CD8+ T cell\"\n",
- "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\n",
- " \"cell_type_lvl5\"\n",
- "].cat.remove_unused_categories()"
+ "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.add_categories([\"CD8+ CM T cell\"])\n",
+ "adata_cd45.obs[\"cell_type_lvl5\"][adata_cd45.obs[\"leiden_R\"].isin([\"5,4\", \"5,9\"])] = \"CD8+ CM T cell\"\n",
+ "adata_cd45.obs[\"cell_type_lvl5\"][adata_cd45.obs[\"leiden_R\"].isin([\"5,10\"])] = \"Naive CD8+ T cell\"\n",
+ "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.remove_unused_categories()"
]
},
{
@@ -2220,9 +2191,7 @@
"metadata": {},
"outputs": [],
"source": [
- "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\n",
- " \"cell_type_lvl5\"\n",
- "].cat.reorder_categories(\n",
+ "adata_cd45.obs[\"cell_type_lvl5\"] = adata_cd45.obs[\"cell_type_lvl5\"].cat.reorder_categories(\n",
" [\n",
" \"Naive CD4+ T cell\",\n",
" \"CD4+ CM T cell\",\n",
@@ -2257,9 +2226,7 @@
"metadata": {},
"outputs": [],
"source": [
- "adata_cd45.uns[\"cell_type_lvl5_colors\"][:-1] = np.flip(\n",
- " adata_cd45.uns[\"cell_type_lvl5_colors\"][:-1]\n",
- ")\n",
+ "adata_cd45.uns[\"cell_type_lvl5_colors\"][:-1] = np.flip(adata_cd45.uns[\"cell_type_lvl5_colors\"][:-1])\n",
"adata_cd45.uns[\"cell_type_lvl5_colors\"][-1] = \"#bbbbbb\" # not annotated"
]
},
@@ -2453,9 +2420,7 @@
],
"source": [
"rcParams[\"figure.figsize\"] = (5, 5)\n",
- "sc.pl.umap(\n",
- " adata_cd45, color=\"cell_type_lvl5\", save=\"_\" + today + \"_cytof_cd45_lvl5.pdf\"\n",
- ")"
+ "sc.pl.umap(adata_cd45, color=\"cell_type_lvl5\", save=\"_\" + today + \"_cytof_cd45_lvl5.pdf\")"
]
},
{
@@ -2484,9 +2449,7 @@
],
"source": [
"rcParams[\"figure.figsize\"] = (5, 5)\n",
- "sc.pl.umap(\n",
- " adata_cd45, color=\"cell_type_lvl5\", save=\"_\" + today + \"_cytof_cd45_lvl5.png\"\n",
- ")"
+ "sc.pl.umap(adata_cd45, color=\"cell_type_lvl5\", save=\"_\" + today + \"_cytof_cd45_lvl5.png\")"
]
},
{
diff --git a/docs/examples/03_flowsom.ipynb b/docs/examples/03_flowsom.ipynb
index c12d93e..03905d9 100644
--- a/docs/examples/03_flowsom.ipynb
+++ b/docs/examples/03_flowsom.ipynb
@@ -166,15 +166,7 @@
],
"source": [
"import scanpy as sc\n",
- "import anndata as ann\n",
- "import numpy as np\n",
- "import scipy as sp\n",
- "import pandas as pd\n",
"import matplotlib.pyplot as pl\n",
- "from matplotlib import rcParams\n",
- "from matplotlib import colors\n",
- "import seaborn as sb\n",
- "import datetime\n",
"import pytometry as pm\n",
"\n",
"\n",
@@ -218,8 +210,8 @@
"outputs": [
{
"data": {
- "text/plain": " n channel marker $PnB $PnE $PnR\nTime 1 Time 32 0,0 1024\nCell_length 2 Cell_length 32 0,0 1024\nDNA1 3 DNA1 32 0,0 1024\nDNA2 4 DNA2 32 0,0 1024\nCD45RA 5 CD45RA 32 0,0 1024\nCD133 6 CD133 32 0,0 1024\nCD19 7 CD19 32 0,0 1024\nCD22 8 CD22 32 0,0 1024\nCD11b 9 CD11b 32 0,0 1024\nCD4 10 CD4 32 0,0 1024\nCD8 11 CD8 32 0,0 1024\nCD34 12 CD34 32 0,0 1024\nFlt3 13 Flt3 32 0,0 1024\nCD20 14 CD20 32 0,0 1024\nCXCR4 15 CXCR4 32 0,0 1024\nCD235ab 16 CD235ab 32 0,0 1024\nCD45 17 CD45 32 0,0 1024\nCD123 18 CD123 32 0,0 1024\nCD321 19 CD321 32 0,0 1024\nCD14 20 CD14 32 0,0 1024\nCD33 21 CD33 32 0,0 1024\nCD47 22 CD47 32 0,0 1024\nCD11c 23 CD11c 32 0,0 1024\nCD7 24 CD7 32 0,0 1024\nCD15 25 CD15 32 0,0 1024\nCD16 26 CD16 32 0,0 1024\nCD44 27 CD44 32 0,0 1024\nCD38 28 CD38 32 0,0 1024\nCD13 29 CD13 32 0,0 1024\nCD3 30 CD3 32 0,0 1024\nCD61 31 CD61 32 0,0 1024\nCD117 32 CD117 32 0,0 1024\nCD49d 33 CD49d 32 0,0 1024\nHLA-DR 34 HLA-DR 32 0,0 1024\nCD64 35 CD64 32 0,0 1024\nCD41 36 CD41 32 0,0 1024\nViability 37 Viability 32 0,0 1024\nfile_number 38 file_number 32 0,0 1024\nevent_number 39 event_number 32 0,0 1024\nlabel 40 label 32 0,0 1024\nindividual 41 individual 32 0,0 1024",
- "text/html": "
\n\n
\n \n \n | \n n | \n channel | \n marker | \n $PnB | \n $PnE | \n $PnR | \n
\n \n \n \n Time | \n 1 | \n Time | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Cell_length | \n 2 | \n Cell_length | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n DNA1 | \n 3 | \n DNA1 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n DNA2 | \n 4 | \n DNA2 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD45RA | \n 5 | \n CD45RA | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD133 | \n 6 | \n CD133 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD19 | \n 7 | \n CD19 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD22 | \n 8 | \n CD22 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD11b | \n 9 | \n CD11b | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD4 | \n 10 | \n CD4 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD8 | \n 11 | \n CD8 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD34 | \n 12 | \n CD34 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Flt3 | \n 13 | \n Flt3 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD20 | \n 14 | \n CD20 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CXCR4 | \n 15 | \n CXCR4 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD235ab | \n 16 | \n CD235ab | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD45 | \n 17 | \n CD45 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD123 | \n 18 | \n CD123 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD321 | \n 19 | \n CD321 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD14 | \n 20 | \n CD14 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD33 | \n 21 | \n CD33 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD47 | \n 22 | \n CD47 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD11c | \n 23 | \n CD11c | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD7 | \n 24 | \n CD7 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD15 | \n 25 | \n CD15 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD16 | \n 26 | \n CD16 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD44 | \n 27 | \n CD44 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD38 | \n 28 | \n CD38 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD13 | \n 29 | \n CD13 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD3 | \n 30 | \n CD3 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD61 | \n 31 | \n CD61 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD117 | \n 32 | \n CD117 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD49d | \n 33 | \n CD49d | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n HLA-DR | \n 34 | \n HLA-DR | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD64 | \n 35 | \n CD64 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD41 | \n 36 | \n CD41 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Viability | \n 37 | \n Viability | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n file_number | \n 38 | \n file_number | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n event_number | \n 39 | \n event_number | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n label | \n 40 | \n label | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n individual | \n 41 | \n individual | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n
\n
"
+ "text/html": "\n\n
\n \n \n | \n n | \n channel | \n marker | \n $PnB | \n $PnE | \n $PnR | \n
\n \n \n \n Time | \n 1 | \n Time | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Cell_length | \n 2 | \n Cell_length | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n DNA1 | \n 3 | \n DNA1 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n DNA2 | \n 4 | \n DNA2 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD45RA | \n 5 | \n CD45RA | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD133 | \n 6 | \n CD133 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD19 | \n 7 | \n CD19 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD22 | \n 8 | \n CD22 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD11b | \n 9 | \n CD11b | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD4 | \n 10 | \n CD4 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD8 | \n 11 | \n CD8 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD34 | \n 12 | \n CD34 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Flt3 | \n 13 | \n Flt3 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD20 | \n 14 | \n CD20 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CXCR4 | \n 15 | \n CXCR4 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD235ab | \n 16 | \n CD235ab | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD45 | \n 17 | \n CD45 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD123 | \n 18 | \n CD123 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD321 | \n 19 | \n CD321 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD14 | \n 20 | \n CD14 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD33 | \n 21 | \n CD33 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD47 | \n 22 | \n CD47 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD11c | \n 23 | \n CD11c | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD7 | \n 24 | \n CD7 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD15 | \n 25 | \n CD15 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD16 | \n 26 | \n CD16 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD44 | \n 27 | \n CD44 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD38 | \n 28 | \n CD38 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD13 | \n 29 | \n CD13 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD3 | \n 30 | \n CD3 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD61 | \n 31 | \n CD61 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD117 | \n 32 | \n CD117 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD49d | \n 33 | \n CD49d | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n HLA-DR | \n 34 | \n HLA-DR | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD64 | \n 35 | \n CD64 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n CD41 | \n 36 | \n CD41 | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n Viability | \n 37 | \n Viability | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n file_number | \n 38 | \n file_number | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n event_number | \n 39 | \n event_number | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n label | \n 40 | \n label | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n individual | \n 41 | \n individual | \n | \n 32 | \n 0,0 | \n 1024 | \n
\n \n
\n
",
+ "text/plain": " n channel marker $PnB $PnE $PnR\nTime 1 Time 32 0,0 1024\nCell_length 2 Cell_length 32 0,0 1024\nDNA1 3 DNA1 32 0,0 1024\nDNA2 4 DNA2 32 0,0 1024\nCD45RA 5 CD45RA 32 0,0 1024\nCD133 6 CD133 32 0,0 1024\nCD19 7 CD19 32 0,0 1024\nCD22 8 CD22 32 0,0 1024\nCD11b 9 CD11b 32 0,0 1024\nCD4 10 CD4 32 0,0 1024\nCD8 11 CD8 32 0,0 1024\nCD34 12 CD34 32 0,0 1024\nFlt3 13 Flt3 32 0,0 1024\nCD20 14 CD20 32 0,0 1024\nCXCR4 15 CXCR4 32 0,0 1024\nCD235ab 16 CD235ab 32 0,0 1024\nCD45 17 CD45 32 0,0 1024\nCD123 18 CD123 32 0,0 1024\nCD321 19 CD321 32 0,0 1024\nCD14 20 CD14 32 0,0 1024\nCD33 21 CD33 32 0,0 1024\nCD47 22 CD47 32 0,0 1024\nCD11c 23 CD11c 32 0,0 1024\nCD7 24 CD7 32 0,0 1024\nCD15 25 CD15 32 0,0 1024\nCD16 26 CD16 32 0,0 1024\nCD44 27 CD44 32 0,0 1024\nCD38 28 CD38 32 0,0 1024\nCD13 29 CD13 32 0,0 1024\nCD3 30 CD3 32 0,0 1024\nCD61 31 CD61 32 0,0 1024\nCD117 32 CD117 32 0,0 1024\nCD49d 33 CD49d 32 0,0 1024\nHLA-DR 34 HLA-DR 32 0,0 1024\nCD64 35 CD64 32 0,0 1024\nCD41 36 CD41 32 0,0 1024\nViability 37 Viability 32 0,0 1024\nfile_number 38 file_number 32 0,0 1024\nevent_number 39 event_number 32 0,0 1024\nlabel 40 label 32 0,0 1024\nindividual 41 individual 32 0,0 1024"
},
"execution_count": 4,
"metadata": {},
@@ -406,24 +398,24 @@
},
{
"data": {
- "text/plain": "Computing consensus matrices: 0%| | 0/11 [00:00, ?it/s]",
"application/vnd.jupyter.widget-view+json": {
+ "model_id": "9af288381ab4432c8a9e4c296d8a6e8d",
"version_major": 2,
- "version_minor": 0,
- "model_id": "9af288381ab4432c8a9e4c296d8a6e8d"
- }
+ "version_minor": 0
+ },
+ "text/plain": "Computing consensus matrices: 0%| | 0/11 [00:00, ?it/s]"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
- "text/plain": "Assigning cluster labels to cells: 0%| | 0/265627 [00:00, ?it/s]",
"application/vnd.jupyter.widget-view+json": {
+ "model_id": "a2a0fa3716554f0d92c20e0c31d40af3",
"version_major": 2,
- "version_minor": 0,
- "model_id": "a2a0fa3716554f0d92c20e0c31d40af3"
- }
+ "version_minor": 0
+ },
+ "text/plain": "Assigning cluster labels to cells: 0%| | 0/265627 [00:00, ?it/s]"
},
"metadata": {},
"output_type": "display_data"
@@ -509,24 +501,24 @@
},
{
"data": {
- "text/plain": "