Introduction
---
title: Workflow
---
flowchart TD
SP[(synthesize plasmids)] --> FP[(functional plasmids)] --> E[editing] --> SR[(sample reads)] --> A[alignment]
FP --> A --> OEO[(observed editing outcomes)] --> C[correction] --> CEO[(corrected editing outcomes)]
SP --> NP[(nonfunctional plasmids)] --> SR
NP[(nonfunctional plasmids)] --> NCR[(negative control reads)] --> A2[alignment]
FP --> A2 --> NCEO[(negative control editing outcomes)] --> C
We design the workflow naapam to decouple the CRISPR/Cas9 editing outcomes from the synthesis error of reference plasmids. We first give an overview of the workflow and left the techniqal details in Discriminate functional and nonfunctional plasmids, Sequence alignment and Correction observed editing outcomes by negative control.
As shown in the above diagram, we apply the hard classification on the synthesized plasmids to get functional and nonfunctional plasmids. We assume that only functional plasmids can be edited by the CRISPR/Cas9 system. Nonfunctional plasmids are transferred into the cell lines, but are not edited. Based on our assumption that only functional plasmids can be edited, we use functional plasmids as references to analyze editing outcomes.
For cell lines express Cas9, both nonfunctional plasmids and edited functional plasmids contribute to the editing outcomes in NGS reads. For the negative control (cell lines without Cas9), only nonfunctional plasmids contributes to the editing outcomes. The synthesis of plasmids is error-prone. A naive analysis often attributes these synthesis errors to the CRISPR/Cas9 system, and therefore overesitimates the editing efficiency and distorts the overall editing profile. A reasonable assumption is that the abundance of non-functional plasmids is similar in cell lines with and without Cas9. Therefore, we may correct the editing profiles for the cell lines with Cas9 based on those of the negative controls.
Discriminate functional and nonfunctional plasmids
block
block:ID
R1B["R1 barcode"]
R1P["R1 primer"]
TSS["G"]
SG["sgRNA"]
SC["scaffold"]
TES["G"]
T["target"]
SEP["CAG"]
B["barcode"]
RCR2P["R2 primer'"]
RCR2B["R2 barcode'"]
end
We parse the components for each read in control samples. We discriminate functional and nonfunction plasmids based on the integrity and conservation of:
- primer;
- sgRNA;
- scaffold;
- barcode;
- protospacer;
- PAM;
- transcription start and end sites markded by G;
We also require that barcode, sgRNA, protospacer are consistent (comes from the same plasmid design).
Sequence alignment
We use the bioconda package rearr (version 1.0.11) to align the NGS reads to the functional plasmids for discriminating their editing types. We package rearr together with naapam so you need not download it separately. Rearr use an efficient and accurate chimeric alignment engine to call editing outcome from raw reads. It is especially good at extracting predictable templated insertions resulted from stagger cleavage of CRISPR/Cas9 system (Precise and Predictable CRISPR Chromosomal Rearrangements Reveal Principles of Cas9-Mediated Nucleotide Insertion). See the documentation for more details about rearr.
Correction observed editing outcomes by negative control
Let $w_0$ be the observed wild type frequency of a functional plasmid in control sample. Let $e_0^{(i)}$ be the observed frequency of editing outcome $i$ (actually nonfunctional plasmids) in control sample. Then $w_0 + \sum_i e_0^{(i)} = 1$. Similarly, let $w$ be observed the wild type frequency of a functional plasmid in the sample with Cas9. Let $e^{(i)}$ be the observed frequency of editing outcome $i$ in the sample with Cas9. Then $w + \sum_i e^{(i)} = 1$. By the assumption that the abundance of non-functional plasmids is similar in cell lines with and without Cas9, the expected frequency of functional plasmids (wild type + edited) is $w_0$. For the editing outcome $i$, among its observed frequency $e^{(i)}$ in the cell line with Cas9, we expect that $e_0^{(i)}$ comes from nonfunctional plasmids. In summary, the corrected frequency of the editing outcome $i$ is $$ \frac{e^{(i)} - e_0^{(i)}}{w_0} $$ if wild type is included, and $$ \frac{e^{(i)} - e_0^{(i)}}{\sum_i (e^{(i)} - e_0^{(i)})} $$ if wild type is excluded. This method has been used in previous works High-throughput analysis of the activities of xCas9, SpCas9-NG and SpCas9 at matched and mismatched target sequences in human cells and Prediction of the sequence-specific cleavage activity of Cas9 variants.
Install
$ pip install naapam
Dependencies
- bowtie2
- gawk
Usage
Follow the notebooks in order:
align.ipynbanalysis.ipynb
Copy them out of the package by
from importlib import resources
import shutil
for file in ["align.ipynb", "analyze.ipynb"]:
shutil.copyfile(src=resources.files("naapam.notebooks") / file, dst=file)
You need to config the directory and the plasmid file in the first block of the notebooks.
data_dir: contains the raw NGS reads.root_dir: root directory for outputs.plasmid_file: the design file of plasmids.config_dir: directory for config files.correct_dir: output directory of the corrected alignment results.
Copy examples of plasmid files out of the package for reference.
from importlib import resources
import shutil
for file in [
"final_hgsgrna_libb_all_0811-NGG.csv",
"final_hgsgrna_libb_all_0811_NAA_scaffold_nbt.csv",
]:
shutil.copyfile(src=resources.files("naapam.plasmids") / file, dst=file)
Copy examples of config directory out of the package for reference.
from importlib import resources
import shutil
shutil.copytree(src=resources.files("naapam.filter_configs"), dst="filter_configs")
Metadata
Release files for naapam 0.1.20
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| naapam-0.1.20.tar.gz | 5.2 MB | With provenance | Details for naapam-0.1.20.tar.gz |
Built distributions (wheels)
Total release size: 41.2 MB
Release files / naapam-0.1.20.tar.gz
| Download URL | naapam-0.1.20.tar.gz |
|---|---|
| Size | 5.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d10e944c5e0a32e53161efc923b5d2290155ce6ac9cd262892f066d353a72b9e
|
|
BLAKE2b-256 checksum How to use checksums |
f6c28c75cd756d722fe71183e0f39ed254d5c2ee8e559eebeefb50afdcf67ccb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp314-cp314t-musllinux_1_2_x86_64.whl
| Download URL | naapam-0.1.20-cp314-cp314t-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
a0e8f5ae4f0418cbd3bcb8d415fd005c1643954e95b1178ef2194bffd4bad8a0
|
|
BLAKE2b-256 checksum How to use checksums |
f9d0dae132e27c10d4b0b3af0bd47db2379baf7c08950889c0396b798b36ee23
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | naapam-0.1.20-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ffc5e428d2d6d33c426ef96537884960e52c89093f897d31237fa90c4902dd89
|
|
BLAKE2b-256 checksum How to use checksums |
7d81ad34179ad4b4fcbbb1d0684090b60c774e6bc968a004528b0bcb1019d4a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp314-cp314-musllinux_1_2_x86_64.whl
| Download URL | naapam-0.1.20-cp314-cp314-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | CPython 3.14 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
78894822db1283ba994d5687be5f38e7fd9fa796d0d239f011e9840432a9f298
|
|
BLAKE2b-256 checksum How to use checksums |
2c28a559aea5c1ff9a738f92d2e9c6bb5e76fdd5ebed3d19a035d65682d48172
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | naapam-0.1.20-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
4ded8df1859507470c716f8df20cb336dd1a3de2ab3af9e9cac8b45c456fc44a
|
|
BLAKE2b-256 checksum How to use checksums |
4b29e10d9282632c3785e6df897796a263fcdd8c1b98799a042a6873aed32d6d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp313-cp313-musllinux_1_2_x86_64.whl
| Download URL | naapam-0.1.20-cp313-cp313-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | CPython 3.13 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
be42a356d9147e4365ddd51fec280aa281c57c0e88808f8a4f6e50a15d5b9876
|
|
BLAKE2b-256 checksum How to use checksums |
cdafb05ecfbf0698f02448e91341bf5995c2b30cc89b6539669be19c19f5c5c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / naapam-0.1.20-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | naapam-0.1.20-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ae6630c2f136af57e2e8240f5e043ca3c62a1004c235f8c7a841b0855789243c
|
|
BLAKE2b-256 checksum How to use checksums |
4dbce5fb676bdac163c0b9a5d4f66ca202df60ecb0ede598b3b42602de55f7a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logSecurity for naapam 0.1.20
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 7 files in this release have been uploaded with provenance metadata.
Attestation for naapam-0.1.20.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.