|
diff --git a/docs/searchindex.js b/docs/searchindex.js
index 04c2f871..922a3d7c 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["about/authors","about/dms","about/dreem","about/index","about/license","algos/compress","algos/index","api/seismicrna","api/seismicrna.align","api/seismicrna.align.tests","api/seismicrna.cleanfa","api/seismicrna.cluster","api/seismicrna.core","api/seismicrna.core.arg","api/seismicrna.core.batch","api/seismicrna.core.extern","api/seismicrna.core.io","api/seismicrna.core.io.tests","api/seismicrna.core.mu","api/seismicrna.core.mu.tests","api/seismicrna.core.mu.unbias","api/seismicrna.core.mu.unbias.tests","api/seismicrna.core.ngs","api/seismicrna.core.ngs.tests","api/seismicrna.core.parallel","api/seismicrna.core.parallel.tests","api/seismicrna.core.rel","api/seismicrna.core.rel.tests","api/seismicrna.core.rna","api/seismicrna.core.seq","api/seismicrna.core.seq.tests","api/seismicrna.core.tests","api/seismicrna.demult","api/seismicrna.export","api/seismicrna.fold","api/seismicrna.graph","api/seismicrna.join","api/seismicrna.lists","api/seismicrna.mask","api/seismicrna.pool","api/seismicrna.relate","api/seismicrna.relate.aux","api/seismicrna.relate.aux.tests","api/seismicrna.relate.c","api/seismicrna.relate.py","api/seismicrna.relate.py.tests","api/seismicrna.renumct","api/seismicrna.sim","api/seismicrna.sim.tests","api/seismicrna.table","api/seismicrna.test","api/seismicrna.wf","cli","data/index","data/relate/codes","data/relate/index","data/relate/qnames","data/relate/refseq","data/relate/relate","formats/data/brickle","formats/data/ct","formats/data/db","formats/data/fasta","formats/data/fastq","formats/data/index","formats/data/sample","formats/data/varna-color","formats/data/xam","formats/index","formats/list/index","formats/list/listpos","formats/meta/index","formats/meta/joined","formats/meta/refs","formats/meta/samples","formats/meta/sections","formats/report/align","formats/report/cluster","formats/report/fold","formats/report/index","formats/report/join","formats/report/mask","formats/report/pool","formats/report/relate","howto/adjclust","howto/cleanfa","howto/graph/index","howto/graph/params","howto/graph/profile","howto/index","howto/inputs","howto/lists","howto/logging","howto/normalize","howto/parallel","howto/run/align","howto/run/cluster","howto/run/demult","howto/run/export","howto/run/fold","howto/run/graph","howto/run/index","howto/run/join","howto/run/mask","howto/run/pool","howto/run/relate","howto/run/table","howto/run/wf","howto/sections","index","install/conda","install/index","install/prereqs","install/venv","issues","steps/amplicon","steps/example","steps/index","whatdoes/index","writeme"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about/authors.rst","about/dms.rst","about/dreem.rst","about/index.rst","about/license.rst","algos/compress.rst","algos/index.rst","api/seismicrna.rst","api/seismicrna.align.rst","api/seismicrna.align.tests.rst","api/seismicrna.cleanfa.rst","api/seismicrna.cluster.rst","api/seismicrna.core.rst","api/seismicrna.core.arg.rst","api/seismicrna.core.batch.rst","api/seismicrna.core.extern.rst","api/seismicrna.core.io.rst","api/seismicrna.core.io.tests.rst","api/seismicrna.core.mu.rst","api/seismicrna.core.mu.tests.rst","api/seismicrna.core.mu.unbias.rst","api/seismicrna.core.mu.unbias.tests.rst","api/seismicrna.core.ngs.rst","api/seismicrna.core.ngs.tests.rst","api/seismicrna.core.parallel.rst","api/seismicrna.core.parallel.tests.rst","api/seismicrna.core.rel.rst","api/seismicrna.core.rel.tests.rst","api/seismicrna.core.rna.rst","api/seismicrna.core.seq.rst","api/seismicrna.core.seq.tests.rst","api/seismicrna.core.tests.rst","api/seismicrna.demult.rst","api/seismicrna.export.rst","api/seismicrna.fold.rst","api/seismicrna.graph.rst","api/seismicrna.join.rst","api/seismicrna.lists.rst","api/seismicrna.mask.rst","api/seismicrna.pool.rst","api/seismicrna.relate.rst","api/seismicrna.relate.aux.rst","api/seismicrna.relate.aux.tests.rst","api/seismicrna.relate.c.rst","api/seismicrna.relate.py.rst","api/seismicrna.relate.py.tests.rst","api/seismicrna.renumct.rst","api/seismicrna.sim.rst","api/seismicrna.sim.tests.rst","api/seismicrna.table.rst","api/seismicrna.test.rst","api/seismicrna.wf.rst","cli.rst","data/index.rst","data/relate/codes.rst","data/relate/index.rst","data/relate/qnames.rst","data/relate/refseq.rst","data/relate/relate.rst","formats/data/brickle.rst","formats/data/ct.rst","formats/data/db.rst","formats/data/fasta.rst","formats/data/fastq.rst","formats/data/index.rst","formats/data/sample.rst","formats/data/varna-color.rst","formats/data/xam.rst","formats/index.rst","formats/list/index.rst","formats/list/listpos.rst","formats/meta/index.rst","formats/meta/joined.rst","formats/meta/refs.rst","formats/meta/samples.rst","formats/meta/sections.rst","formats/report/align.rst","formats/report/cluster.rst","formats/report/fold.rst","formats/report/index.rst","formats/report/join.rst","formats/report/mask.rst","formats/report/pool.rst","formats/report/relate.rst","howto/adjclust.rst","howto/cleanfa.rst","howto/graph/index.rst","howto/graph/params.rst","howto/graph/profile.rst","howto/index.rst","howto/inputs.rst","howto/lists.rst","howto/logging.rst","howto/normalize.rst","howto/parallel.rst","howto/run/align.rst","howto/run/cluster.rst","howto/run/demult.rst","howto/run/export.rst","howto/run/fold.rst","howto/run/graph.rst","howto/run/index.rst","howto/run/join.rst","howto/run/mask.rst","howto/run/pool.rst","howto/run/relate.rst","howto/run/table.rst","howto/run/wf.rst","howto/sections.rst","index.rst","install/conda.rst","install/index.rst","install/prereqs.rst","install/venv.rst","issues.rst","steps/amplicon.rst","steps/example.rst","steps/index.rst","whatdoes/index.rst","writeme.rst"],objects:{"":[[7,0,0,"-","seismicrna"]],"seismic-+addclust":[[52,7,1,"cmdoption-seismic-addclust-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-addclust-k","--max-clusters"],[52,7,1,"cmdoption-seismic-addclust-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-addclust-parallel","--parallel"],[52,7,1,"cmdoption-seismic-addclust-parallel","--serial"],[52,7,1,"cmdoption-seismic-addclust-k","-k"],[52,7,1,"cmdoption-seismic-addclust-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+cleanfa":[[52,7,1,"cmdoption-seismic-cleanfa-force","--force"],[52,7,1,"cmdoption-seismic-cleanfa-inplace","--inplace"],[52,7,1,"cmdoption-seismic-cleanfa-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-cleanfa-inplace","--newfile"],[52,7,1,"cmdoption-seismic-cleanfa-force","--no-force"],[52,7,1,"cmdoption-seismic-cleanfa-o","--out-dir"],[52,7,1,"cmdoption-seismic-cleanfa-parallel","--parallel"],[52,7,1,"cmdoption-seismic-cleanfa-parallel","--serial"],[52,7,1,"cmdoption-seismic-cleanfa-o","-o"],[52,7,1,"cmdoption-seismic-cleanfa-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+delclust":[[52,7,1,"cmdoption-seismic-delclust-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-delclust-k","--max-clusters"],[52,7,1,"cmdoption-seismic-delclust-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-delclust-parallel","--parallel"],[52,7,1,"cmdoption-seismic-delclust-parallel","--serial"],[52,7,1,"cmdoption-seismic-delclust-k","-k"],[52,7,1,"cmdoption-seismic-delclust-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+listpos":[[52,7,1,"cmdoption-seismic-listpos-complement","--complement"],[52,7,1,"cmdoption-seismic-listpos-force","--force"],[52,7,1,"cmdoption-seismic-listpos-max-fmut-pos","--max-fmut-pos"],[52,7,1,"cmdoption-seismic-listpos-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-listpos-complement","--no-complement"],[52,7,1,"cmdoption-seismic-listpos-force","--no-force"],[52,7,1,"cmdoption-seismic-listpos-parallel","--parallel"],[52,7,1,"cmdoption-seismic-listpos-parallel","--serial"],[52,7,1,"cmdoption-seismic-listpos-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+renumct":[[52,7,1,"cmdoption-seismic-renumct-c","--ct-pos-5"],[52,7,1,"cmdoption-seismic-renumct-force","--force"],[52,7,1,"cmdoption-seismic-renumct-inplace","--inplace"],[52,7,1,"cmdoption-seismic-renumct-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-renumct-inplace","--newfile"],[52,7,1,"cmdoption-seismic-renumct-force","--no-force"],[52,7,1,"cmdoption-seismic-renumct-o","--out-dir"],[52,7,1,"cmdoption-seismic-renumct-parallel","--parallel"],[52,7,1,"cmdoption-seismic-renumct-parallel","--serial"],[52,7,1,"cmdoption-seismic-renumct-c","-c"],[52,7,1,"cmdoption-seismic-renumct-o","-o"]],"seismic-+test":[[52,7,1,"cmdoption-seismic-test-v","--verbose"],[52,7,1,"cmdoption-seismic-test-v","-v"]],"seismic-align":[[52,7,1,"cmdoption-seismic-align-cram","--bam"],[52,7,1,"cmdoption-seismic-align-bt2-D","--bt2-D"],[52,7,1,"cmdoption-seismic-align-bt2-I","--bt2-I"],[52,7,1,"cmdoption-seismic-align-bt2-L","--bt2-L"],[52,7,1,"cmdoption-seismic-align-bt2-R","--bt2-R"],[52,7,1,"cmdoption-seismic-align-bt2-X","--bt2-X"],[52,7,1,"cmdoption-seismic-align-bt2-contain","--bt2-contain"],[52,7,1,"cmdoption-seismic-align-bt2-discordant","--bt2-discordant"],[52,7,1,"cmdoption-seismic-align-bt2-dovetail","--bt2-dovetail"],[52,7,1,"cmdoption-seismic-align-bt2-dpad","--bt2-dpad"],[52,7,1,"cmdoption-seismic-align-bt2-local","--bt2-end-to-end"],[52,7,1,"cmdoption-seismic-align-bt2-gbar","--bt2-gbar"],[52,7,1,"cmdoption-seismic-align-0","--bt2-i"],[52,7,1,"cmdoption-seismic-align-bt2-local","--bt2-local"],[52,7,1,"cmdoption-seismic-align-bt2-mixed","--bt2-mixed"],[52,7,1,"cmdoption-seismic-align-bt2-contain","--bt2-no-contain"],[52,7,1,"cmdoption-seismic-align-bt2-discordant","--bt2-no-discordant"],[52,7,1,"cmdoption-seismic-align-bt2-dovetail","--bt2-no-dovetail"],[52,7,1,"cmdoption-seismic-align-bt2-mixed","--bt2-no-mixed"],[52,7,1,"cmdoption-seismic-align-bt2-un","--bt2-no-un"],[52,7,1,"cmdoption-seismic-align-bt2-orient","--bt2-orient"],[52,7,1,"cmdoption-seismic-align-bt2-score-min-e2e","--bt2-score-min-e2e"],[52,7,1,"cmdoption-seismic-align-bt2-score-min-loc","--bt2-score-min-loc"],[52,7,1,"cmdoption-seismic-align-bt2-un","--bt2-un"],[52,7,1,"cmdoption-seismic-align-cram","--cram"],[52,7,1,"cmdoption-seismic-align-cut","--cut"],[52,7,1,"cmdoption-seismic-align-cut-O","--cut-O"],[52,7,1,"cmdoption-seismic-align-cut-a1","--cut-a1"],[52,7,1,"cmdoption-seismic-align-cut-a2","--cut-a2"],[52,7,1,"cmdoption-seismic-align-cut-discard-trimmed","--cut-discard-trimmed"],[52,7,1,"cmdoption-seismic-align-cut-discard-untrimmed","--cut-discard-untrimmed"],[52,7,1,"cmdoption-seismic-align-cut-e","--cut-e"],[52,7,1,"cmdoption-seismic-align-cut-g1","--cut-g1"],[52,7,1,"cmdoption-seismic-align-cut-g2","--cut-g2"],[52,7,1,"cmdoption-seismic-align-cut-indels","--cut-indels"],[52,7,1,"cmdoption-seismic-align-cut-discard-trimmed","--cut-keep-trimmed"],[52,7,1,"cmdoption-seismic-align-cut-discard-untrimmed","--cut-keep-untrimmed"],[52,7,1,"cmdoption-seismic-align-cut-m","--cut-m"],[52,7,1,"cmdoption-seismic-align-cut-nextseq","--cut-nextseq"],[52,7,1,"cmdoption-seismic-align-cut-indels","--cut-no-indels"],[52,7,1,"cmdoption-seismic-align-cut-nextseq","--cut-no-nextseq"],[52,7,1,"cmdoption-seismic-align-cut-q1","--cut-q1"],[52,7,1,"cmdoption-seismic-align-cut-q2","--cut-q2"],[52,7,1,"cmdoption-seismic-align-X","--dmfastqx"],[52,7,1,"cmdoption-seismic-align-Y","--dmfastqy"],[52,7,1,"cmdoption-seismic-align-Z","--dmfastqz"],[52,7,1,"cmdoption-seismic-align-keep-temp","--erase-temp"],[52,7,1,"cmdoption-seismic-align-fastqc","--fastqc"],[52,7,1,"cmdoption-seismic-align-x","--fastqx"],[52,7,1,"cmdoption-seismic-align-y","--fastqy"],[52,7,1,"cmdoption-seismic-align-z","--fastqz"],[52,7,1,"cmdoption-seismic-align-force","--force"],[52,7,1,"cmdoption-seismic-align-keep-temp","--keep-temp"],[52,7,1,"cmdoption-seismic-align-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-align-min-mapq","--min-mapq"],[52,7,1,"cmdoption-seismic-align-N","--min-reads"],[52,7,1,"cmdoption-seismic-align-cut","--no-cut"],[52,7,1,"cmdoption-seismic-align-fastqc","--no-fastqc"],[52,7,1,"cmdoption-seismic-align-force","--no-force"],[52,7,1,"cmdoption-seismic-align-o","--out-dir"],[52,7,1,"cmdoption-seismic-align-parallel","--parallel"],[52,7,1,"cmdoption-seismic-align-phred-enc","--phred-enc"],[52,7,1,"cmdoption-seismic-align-qc-extract","--qc-extract"],[52,7,1,"cmdoption-seismic-align-qc-extract","--qc-no-extract"],[52,7,1,"cmdoption-seismic-align-parallel","--serial"],[52,7,1,"cmdoption-seismic-align-t","--temp-dir"],[52,7,1,"cmdoption-seismic-align-N","-N"],[52,7,1,"cmdoption-seismic-align-X","-X"],[52,7,1,"cmdoption-seismic-align-Y","-Y"],[52,7,1,"cmdoption-seismic-align-Z","-Z"],[52,7,1,"cmdoption-seismic-align-o","-o"],[52,7,1,"cmdoption-seismic-align-t","-t"],[52,7,1,"cmdoption-seismic-align-x","-x"],[52,7,1,"cmdoption-seismic-align-y","-y"],[52,7,1,"cmdoption-seismic-align-z","-z"],[52,7,1,"cmdoption-seismic-align-arg-FASTA","FASTA"]],"seismic-cluster":[[52,7,1,"cmdoption-seismic-cluster-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-cluster-e","--em-runs"],[52,7,1,"cmdoption-seismic-cluster-em-thresh","--em-thresh"],[52,7,1,"cmdoption-seismic-cluster-force","--force"],[52,7,1,"cmdoption-seismic-cluster-k","--max-clusters"],[52,7,1,"cmdoption-seismic-cluster-max-em-iter","--max-em-iter"],[52,7,1,"cmdoption-seismic-cluster-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-cluster-min-em-iter","--min-em-iter"],[52,7,1,"cmdoption-seismic-cluster-force","--no-force"],[52,7,1,"cmdoption-seismic-cluster-parallel","--parallel"],[52,7,1,"cmdoption-seismic-cluster-parallel","--serial"],[52,7,1,"cmdoption-seismic-cluster-e","-e"],[52,7,1,"cmdoption-seismic-cluster-k","-k"],[52,7,1,"cmdoption-seismic-cluster-arg-INPUT_PATH","INPUT_PATH"]],"seismic-demult":[[52,7,1,"cmdoption-seismic-demult-barcode-end","--barcode-end"],[52,7,1,"cmdoption-seismic-demult-barcode-start","--barcode-start"],[52,7,1,"cmdoption-seismic-demult-clipped","--clipped"],[52,7,1,"cmdoption-seismic-demult-demulti-overwrite","--demulti-overwrite"],[52,7,1,"cmdoption-seismic-demult-keep-temp","--erase-temp"],[52,7,1,"cmdoption-seismic-demult-x","--fastqx"],[52,7,1,"cmdoption-seismic-demult-index-tolerance","--index-tolerance"],[52,7,1,"cmdoption-seismic-demult-keep-temp","--keep-temp"],[52,7,1,"cmdoption-seismic-demult-mismatch-tolerence","--mismatch-tolerence"],[52,7,1,"cmdoption-seismic-demult-o","--out-dir"],[52,7,1,"cmdoption-seismic-demult-parallel-demultiplexing","--parallel-demultiplexing"],[52,7,1,"cmdoption-seismic-demult-phred-enc","--phred-enc"],[52,7,1,"cmdoption-seismic-demult-R","--refs-meta"],[52,7,1,"cmdoption-seismic-demult-t","--temp-dir"],[52,7,1,"cmdoption-seismic-demult-R","-R"],[52,7,1,"cmdoption-seismic-demult-o","-o"],[52,7,1,"cmdoption-seismic-demult-t","-t"],[52,7,1,"cmdoption-seismic-demult-x","-x"],[52,7,1,"cmdoption-seismic-demult-arg-FASTA","FASTA"]],"seismic-fold":[[52,7,1,"cmdoption-seismic-fold-c","--coords"],[52,7,1,"cmdoption-seismic-fold-keep-temp","--erase-temp"],[52,7,1,"cmdoption-seismic-fold-fold-constraint","--fold-constraint"],[52,7,1,"cmdoption-seismic-fold-fold-max","--fold-max"],[52,7,1,"cmdoption-seismic-fold-fold-md","--fold-md"],[52,7,1,"cmdoption-seismic-fold-fold-mfe","--fold-mfe"],[52,7,1,"cmdoption-seismic-fold-fold-percent","--fold-percent"],[52,7,1,"cmdoption-seismic-fold-fold-mfe","--fold-sub"],[52,7,1,"cmdoption-seismic-fold-fold-temp","--fold-temp"],[52,7,1,"cmdoption-seismic-fold-force","--force"],[52,7,1,"cmdoption-seismic-fold-keep-temp","--keep-temp"],[52,7,1,"cmdoption-seismic-fold-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-fold-force","--no-force"],[52,7,1,"cmdoption-seismic-fold-parallel","--parallel"],[52,7,1,"cmdoption-seismic-fold-primer-gap","--primer-gap"],[52,7,1,"cmdoption-seismic-fold-p","--primers"],[52,7,1,"cmdoption-seismic-fold-q","--quantile"],[52,7,1,"cmdoption-seismic-fold-s","--sections-file"],[52,7,1,"cmdoption-seismic-fold-parallel","--serial"],[52,7,1,"cmdoption-seismic-fold-t","--temp-dir"],[52,7,1,"cmdoption-seismic-fold-c","-c"],[52,7,1,"cmdoption-seismic-fold-p","-p"],[52,7,1,"cmdoption-seismic-fold-q","-q"],[52,7,1,"cmdoption-seismic-fold-s","-s"],[52,7,1,"cmdoption-seismic-fold-t","-t"],[52,7,1,"cmdoption-seismic-fold-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-aucroll":[[52,7,1,"cmdoption-seismic-graph-aucroll-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-aucroll-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-aucroll-force","--force"],[52,7,1,"cmdoption-seismic-graph-aucroll-html","--html"],[52,7,1,"cmdoption-seismic-graph-aucroll-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-aucroll-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-aucroll-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-aucroll-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-aucroll-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-aucroll-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-aucroll-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-aucroll-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-aucroll-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-aucroll-r","--rels"],[52,7,1,"cmdoption-seismic-graph-aucroll-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-aucroll-struct-file","--struct-file"],[52,7,1,"cmdoption-seismic-graph-aucroll-struct-sect","--struct-sect"],[52,7,1,"cmdoption-seismic-graph-aucroll-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-aucroll-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-aucroll-w","--window"],[52,7,1,"cmdoption-seismic-graph-aucroll-n","--winmin"],[52,7,1,"cmdoption-seismic-graph-aucroll-n","-n"],[52,7,1,"cmdoption-seismic-graph-aucroll-o","-o"],[52,7,1,"cmdoption-seismic-graph-aucroll-q","-q"],[52,7,1,"cmdoption-seismic-graph-aucroll-r","-r"],[52,7,1,"cmdoption-seismic-graph-aucroll-w","-w"],[52,7,1,"cmdoption-seismic-graph-aucroll-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-corroll":[[52,7,1,"cmdoption-seismic-graph-corroll-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-corroll-comppair","--comppair"],[52,7,1,"cmdoption-seismic-graph-corroll-compself","--compself"],[52,7,1,"cmdoption-seismic-graph-corroll-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-corroll-force","--force"],[52,7,1,"cmdoption-seismic-graph-corroll-html","--html"],[52,7,1,"cmdoption-seismic-graph-corroll-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-corroll-m","--metric"],[52,7,1,"cmdoption-seismic-graph-corroll-comppair","--no-comppair"],[52,7,1,"cmdoption-seismic-graph-corroll-compself","--no-compself"],[52,7,1,"cmdoption-seismic-graph-corroll-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-corroll-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-corroll-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-corroll-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-corroll-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-corroll-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-corroll-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-corroll-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-corroll-r","--rels"],[52,7,1,"cmdoption-seismic-graph-corroll-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-corroll-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-corroll-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-corroll-w","--window"],[52,7,1,"cmdoption-seismic-graph-corroll-n","--winmin"],[52,7,1,"cmdoption-seismic-graph-corroll-m","-m"],[52,7,1,"cmdoption-seismic-graph-corroll-n","-n"],[52,7,1,"cmdoption-seismic-graph-corroll-o","-o"],[52,7,1,"cmdoption-seismic-graph-corroll-q","-q"],[52,7,1,"cmdoption-seismic-graph-corroll-r","-r"],[52,7,1,"cmdoption-seismic-graph-corroll-w","-w"],[52,7,1,"cmdoption-seismic-graph-corroll-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-delprof":[[52,7,1,"cmdoption-seismic-graph-delprof-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-delprof-comppair","--comppair"],[52,7,1,"cmdoption-seismic-graph-delprof-compself","--compself"],[52,7,1,"cmdoption-seismic-graph-delprof-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-delprof-force","--force"],[52,7,1,"cmdoption-seismic-graph-delprof-html","--html"],[52,7,1,"cmdoption-seismic-graph-delprof-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-delprof-comppair","--no-comppair"],[52,7,1,"cmdoption-seismic-graph-delprof-compself","--no-compself"],[52,7,1,"cmdoption-seismic-graph-delprof-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-delprof-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-delprof-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-delprof-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-delprof-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-delprof-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-delprof-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-delprof-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-delprof-r","--rels"],[52,7,1,"cmdoption-seismic-graph-delprof-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-delprof-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-delprof-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-delprof-o","-o"],[52,7,1,"cmdoption-seismic-graph-delprof-q","-q"],[52,7,1,"cmdoption-seismic-graph-delprof-r","-r"],[52,7,1,"cmdoption-seismic-graph-delprof-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-histpos":[[52,7,1,"cmdoption-seismic-graph-histpos-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-histpos-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-histpos-force","--force"],[52,7,1,"cmdoption-seismic-graph-histpos-hist-bins","--hist-bins"],[52,7,1,"cmdoption-seismic-graph-histpos-hist-margin","--hist-margin"],[52,7,1,"cmdoption-seismic-graph-histpos-html","--html"],[52,7,1,"cmdoption-seismic-graph-histpos-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-histpos-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-histpos-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-histpos-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-histpos-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-histpos-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-histpos-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-histpos-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-histpos-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-histpos-r","--rels"],[52,7,1,"cmdoption-seismic-graph-histpos-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-histpos-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-histpos-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-histpos-o","-o"],[52,7,1,"cmdoption-seismic-graph-histpos-q","-q"],[52,7,1,"cmdoption-seismic-graph-histpos-r","-r"],[52,7,1,"cmdoption-seismic-graph-histpos-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-histread":[[52,7,1,"cmdoption-seismic-graph-histread-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-histread-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-histread-force","--force"],[52,7,1,"cmdoption-seismic-graph-histread-hist-bins","--hist-bins"],[52,7,1,"cmdoption-seismic-graph-histread-hist-margin","--hist-margin"],[52,7,1,"cmdoption-seismic-graph-histread-html","--html"],[52,7,1,"cmdoption-seismic-graph-histread-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-histread-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-histread-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-histread-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-histread-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-histread-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-histread-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-histread-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-histread-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-histread-r","--rels"],[52,7,1,"cmdoption-seismic-graph-histread-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-histread-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-histread-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-histread-o","-o"],[52,7,1,"cmdoption-seismic-graph-histread-q","-q"],[52,7,1,"cmdoption-seismic-graph-histread-r","-r"],[52,7,1,"cmdoption-seismic-graph-histread-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-profile":[[52,7,1,"cmdoption-seismic-graph-profile-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-profile-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-profile-force","--force"],[52,7,1,"cmdoption-seismic-graph-profile-html","--html"],[52,7,1,"cmdoption-seismic-graph-profile-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-profile-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-profile-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-profile-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-profile-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-profile-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-profile-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-profile-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-profile-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-profile-r","--rels"],[52,7,1,"cmdoption-seismic-graph-profile-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-profile-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-profile-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-profile-o","-o"],[52,7,1,"cmdoption-seismic-graph-profile-q","-q"],[52,7,1,"cmdoption-seismic-graph-profile-r","-r"],[52,7,1,"cmdoption-seismic-graph-profile-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-roc":[[52,7,1,"cmdoption-seismic-graph-roc-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-roc-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-roc-force","--force"],[52,7,1,"cmdoption-seismic-graph-roc-html","--html"],[52,7,1,"cmdoption-seismic-graph-roc-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-roc-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-roc-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-roc-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-roc-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-roc-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-roc-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-roc-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-roc-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-roc-r","--rels"],[52,7,1,"cmdoption-seismic-graph-roc-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-roc-struct-file","--struct-file"],[52,7,1,"cmdoption-seismic-graph-roc-struct-sect","--struct-sect"],[52,7,1,"cmdoption-seismic-graph-roc-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-roc-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-roc-o","-o"],[52,7,1,"cmdoption-seismic-graph-roc-q","-q"],[52,7,1,"cmdoption-seismic-graph-roc-r","-r"],[52,7,1,"cmdoption-seismic-graph-roc-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-scatter":[[52,7,1,"cmdoption-seismic-graph-scatter-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-graph-scatter-comppair","--comppair"],[52,7,1,"cmdoption-seismic-graph-scatter-compself","--compself"],[52,7,1,"cmdoption-seismic-graph-scatter-csv","--csv"],[52,7,1,"cmdoption-seismic-graph-scatter-force","--force"],[52,7,1,"cmdoption-seismic-graph-scatter-html","--html"],[52,7,1,"cmdoption-seismic-graph-scatter-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-graph-scatter-comppair","--no-comppair"],[52,7,1,"cmdoption-seismic-graph-scatter-compself","--no-compself"],[52,7,1,"cmdoption-seismic-graph-scatter-csv","--no-csv"],[52,7,1,"cmdoption-seismic-graph-scatter-force","--no-force"],[52,7,1,"cmdoption-seismic-graph-scatter-html","--no-html"],[52,7,1,"cmdoption-seismic-graph-scatter-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-graph-scatter-o","--out-dir"],[52,7,1,"cmdoption-seismic-graph-scatter-parallel","--parallel"],[52,7,1,"cmdoption-seismic-graph-scatter-pdf","--pdf"],[52,7,1,"cmdoption-seismic-graph-scatter-q","--quantile"],[52,7,1,"cmdoption-seismic-graph-scatter-r","--rels"],[52,7,1,"cmdoption-seismic-graph-scatter-parallel","--serial"],[52,7,1,"cmdoption-seismic-graph-scatter-use-ratio","--use-count"],[52,7,1,"cmdoption-seismic-graph-scatter-use-ratio","--use-ratio"],[52,7,1,"cmdoption-seismic-graph-scatter-o","-o"],[52,7,1,"cmdoption-seismic-graph-scatter-q","-q"],[52,7,1,"cmdoption-seismic-graph-scatter-r","-r"],[52,7,1,"cmdoption-seismic-graph-scatter-arg-INPUT_PATH","INPUT_PATH"]],"seismic-mask":[[52,7,1,"cmdoption-seismic-mask-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-mask-c","--coords"],[52,7,1,"cmdoption-seismic-mask-count-del","--count-del"],[52,7,1,"cmdoption-seismic-mask-count-ins","--count-ins"],[52,7,1,"cmdoption-seismic-mask-count-del","--discount-del"],[52,7,1,"cmdoption-seismic-mask-count-ins","--discount-ins"],[52,7,1,"cmdoption-seismic-mask-discount-mut","--discount-mut"],[52,7,1,"cmdoption-seismic-mask-exclude-file","--exclude-file"],[52,7,1,"cmdoption-seismic-mask-exclude-gu","--exclude-gu"],[52,7,1,"cmdoption-seismic-mask-exclude-polya","--exclude-polya"],[52,7,1,"cmdoption-seismic-mask-force","--force"],[52,7,1,"cmdoption-seismic-mask-exclude-gu","--include-gu"],[52,7,1,"cmdoption-seismic-mask-max-fmut-pos","--max-fmut-pos"],[52,7,1,"cmdoption-seismic-mask-max-fmut-read","--max-fmut-read"],[52,7,1,"cmdoption-seismic-mask-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-mask-min-finfo-read","--min-finfo-read"],[52,7,1,"cmdoption-seismic-mask-min-mut-gap","--min-mut-gap"],[52,7,1,"cmdoption-seismic-mask-min-ninfo-pos","--min-ninfo-pos"],[52,7,1,"cmdoption-seismic-mask-force","--no-force"],[52,7,1,"cmdoption-seismic-mask-parallel","--parallel"],[52,7,1,"cmdoption-seismic-mask-primer-gap","--primer-gap"],[52,7,1,"cmdoption-seismic-mask-p","--primers"],[52,7,1,"cmdoption-seismic-mask-s","--sections-file"],[52,7,1,"cmdoption-seismic-mask-parallel","--serial"],[52,7,1,"cmdoption-seismic-mask-c","-c"],[52,7,1,"cmdoption-seismic-mask-p","-p"],[52,7,1,"cmdoption-seismic-mask-s","-s"],[52,7,1,"cmdoption-seismic-mask-arg-INPUT_PATH","INPUT_PATH"]],"seismic-relate":[[52,7,1,"cmdoption-seismic-relate-ambrel","--ambrel"],[52,7,1,"cmdoption-seismic-relate-batch-size","--batch-size"],[52,7,1,"cmdoption-seismic-relate-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-relate-keep-temp","--erase-temp"],[52,7,1,"cmdoption-seismic-relate-force","--force"],[52,7,1,"cmdoption-seismic-relate-keep-temp","--keep-temp"],[52,7,1,"cmdoption-seismic-relate-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-relate-min-mapq","--min-mapq"],[52,7,1,"cmdoption-seismic-relate-min-phred","--min-phred"],[52,7,1,"cmdoption-seismic-relate-N","--min-reads"],[52,7,1,"cmdoption-seismic-relate-ambrel","--no-ambrel"],[52,7,1,"cmdoption-seismic-relate-force","--no-force"],[52,7,1,"cmdoption-seismic-relate-o","--out-dir"],[52,7,1,"cmdoption-seismic-relate-parallel","--parallel"],[52,7,1,"cmdoption-seismic-relate-phred-enc","--phred-enc"],[52,7,1,"cmdoption-seismic-relate-parallel","--serial"],[52,7,1,"cmdoption-seismic-relate-t","--temp-dir"],[52,7,1,"cmdoption-seismic-relate-N","-N"],[52,7,1,"cmdoption-seismic-relate-o","-o"],[52,7,1,"cmdoption-seismic-relate-t","-t"],[52,7,1,"cmdoption-seismic-relate-arg-FASTA","FASTA"],[52,7,1,"cmdoption-seismic-relate-arg-INPUT_PATH","INPUT_PATH"]],"seismic-table":[[52,7,1,"cmdoption-seismic-table-force","--force"],[52,7,1,"cmdoption-seismic-table-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-table-force","--no-force"],[52,7,1,"cmdoption-seismic-table-table-clust","--no-table-clust"],[52,7,1,"cmdoption-seismic-table-table-pos","--no-table-pos"],[52,7,1,"cmdoption-seismic-table-table-read","--no-table-read"],[52,7,1,"cmdoption-seismic-table-parallel","--parallel"],[52,7,1,"cmdoption-seismic-table-parallel","--serial"],[52,7,1,"cmdoption-seismic-table-table-clust","--table-clust"],[52,7,1,"cmdoption-seismic-table-table-pos","--table-pos"],[52,7,1,"cmdoption-seismic-table-table-read","--table-read"],[52,7,1,"cmdoption-seismic-table-arg-INPUT_PATH","INPUT_PATH"]],"seismic-wf":[[52,7,1,"cmdoption-seismic-wf-all-pos","--all-pos"],[52,7,1,"cmdoption-seismic-wf-ambrel","--ambrel"],[52,7,1,"cmdoption-seismic-wf-cram","--bam"],[52,7,1,"cmdoption-seismic-wf-barcode-end","--barcode-end"],[52,7,1,"cmdoption-seismic-wf-barcode-start","--barcode-start"],[52,7,1,"cmdoption-seismic-wf-batch-size","--batch-size"],[52,7,1,"cmdoption-seismic-wf-brotli-level","--brotli-level"],[52,7,1,"cmdoption-seismic-wf-bt2-D","--bt2-D"],[52,7,1,"cmdoption-seismic-wf-bt2-I","--bt2-I"],[52,7,1,"cmdoption-seismic-wf-bt2-L","--bt2-L"],[52,7,1,"cmdoption-seismic-wf-bt2-R","--bt2-R"],[52,7,1,"cmdoption-seismic-wf-bt2-X","--bt2-X"],[52,7,1,"cmdoption-seismic-wf-bt2-contain","--bt2-contain"],[52,7,1,"cmdoption-seismic-wf-bt2-discordant","--bt2-discordant"],[52,7,1,"cmdoption-seismic-wf-bt2-dovetail","--bt2-dovetail"],[52,7,1,"cmdoption-seismic-wf-bt2-dpad","--bt2-dpad"],[52,7,1,"cmdoption-seismic-wf-bt2-local","--bt2-end-to-end"],[52,7,1,"cmdoption-seismic-wf-bt2-gbar","--bt2-gbar"],[52,7,1,"cmdoption-seismic-wf-0","--bt2-i"],[52,7,1,"cmdoption-seismic-wf-bt2-local","--bt2-local"],[52,7,1,"cmdoption-seismic-wf-bt2-mixed","--bt2-mixed"],[52,7,1,"cmdoption-seismic-wf-bt2-contain","--bt2-no-contain"],[52,7,1,"cmdoption-seismic-wf-bt2-discordant","--bt2-no-discordant"],[52,7,1,"cmdoption-seismic-wf-bt2-dovetail","--bt2-no-dovetail"],[52,7,1,"cmdoption-seismic-wf-bt2-mixed","--bt2-no-mixed"],[52,7,1,"cmdoption-seismic-wf-bt2-un","--bt2-no-un"],[52,7,1,"cmdoption-seismic-wf-bt2-orient","--bt2-orient"],[52,7,1,"cmdoption-seismic-wf-bt2-score-min-e2e","--bt2-score-min-e2e"],[52,7,1,"cmdoption-seismic-wf-bt2-score-min-loc","--bt2-score-min-loc"],[52,7,1,"cmdoption-seismic-wf-bt2-un","--bt2-un"],[52,7,1,"cmdoption-seismic-wf-cgroup","--cgroup"],[52,7,1,"cmdoption-seismic-wf-clipped","--clipped"],[52,7,1,"cmdoption-seismic-wf-c","--coords"],[52,7,1,"cmdoption-seismic-wf-count-del","--count-del"],[52,7,1,"cmdoption-seismic-wf-count-ins","--count-ins"],[52,7,1,"cmdoption-seismic-wf-cram","--cram"],[52,7,1,"cmdoption-seismic-wf-csv","--csv"],[52,7,1,"cmdoption-seismic-wf-cut","--cut"],[52,7,1,"cmdoption-seismic-wf-cut-O","--cut-O"],[52,7,1,"cmdoption-seismic-wf-cut-a1","--cut-a1"],[52,7,1,"cmdoption-seismic-wf-cut-a2","--cut-a2"],[52,7,1,"cmdoption-seismic-wf-cut-discard-trimmed","--cut-discard-trimmed"],[52,7,1,"cmdoption-seismic-wf-cut-discard-untrimmed","--cut-discard-untrimmed"],[52,7,1,"cmdoption-seismic-wf-cut-e","--cut-e"],[52,7,1,"cmdoption-seismic-wf-cut-g1","--cut-g1"],[52,7,1,"cmdoption-seismic-wf-cut-g2","--cut-g2"],[52,7,1,"cmdoption-seismic-wf-cut-indels","--cut-indels"],[52,7,1,"cmdoption-seismic-wf-cut-discard-trimmed","--cut-keep-trimmed"],[52,7,1,"cmdoption-seismic-wf-cut-discard-untrimmed","--cut-keep-untrimmed"],[52,7,1,"cmdoption-seismic-wf-cut-m","--cut-m"],[52,7,1,"cmdoption-seismic-wf-cut-nextseq","--cut-nextseq"],[52,7,1,"cmdoption-seismic-wf-cut-indels","--cut-no-indels"],[52,7,1,"cmdoption-seismic-wf-cut-nextseq","--cut-no-nextseq"],[52,7,1,"cmdoption-seismic-wf-cut-q1","--cut-q1"],[52,7,1,"cmdoption-seismic-wf-cut-q2","--cut-q2"],[52,7,1,"cmdoption-seismic-wf-demult-on","--demult-off"],[52,7,1,"cmdoption-seismic-wf-demult-on","--demult-on"],[52,7,1,"cmdoption-seismic-wf-demulti-overwrite","--demulti-overwrite"],[52,7,1,"cmdoption-seismic-wf-count-del","--discount-del"],[52,7,1,"cmdoption-seismic-wf-count-ins","--discount-ins"],[52,7,1,"cmdoption-seismic-wf-discount-mut","--discount-mut"],[52,7,1,"cmdoption-seismic-wf-X","--dmfastqx"],[52,7,1,"cmdoption-seismic-wf-Y","--dmfastqy"],[52,7,1,"cmdoption-seismic-wf-Z","--dmfastqz"],[52,7,1,"cmdoption-seismic-wf-e","--em-runs"],[52,7,1,"cmdoption-seismic-wf-em-thresh","--em-thresh"],[52,7,1,"cmdoption-seismic-wf-keep-temp","--erase-temp"],[52,7,1,"cmdoption-seismic-wf-exclude-file","--exclude-file"],[52,7,1,"cmdoption-seismic-wf-exclude-gu","--exclude-gu"],[52,7,1,"cmdoption-seismic-wf-exclude-polya","--exclude-polya"],[52,7,1,"cmdoption-seismic-wf-export","--export"],[52,7,1,"cmdoption-seismic-wf-fastqc","--fastqc"],[52,7,1,"cmdoption-seismic-wf-x","--fastqx"],[52,7,1,"cmdoption-seismic-wf-y","--fastqy"],[52,7,1,"cmdoption-seismic-wf-z","--fastqz"],[52,7,1,"cmdoption-seismic-wf-fold","--fold"],[52,7,1,"cmdoption-seismic-wf-fold-constraint","--fold-constraint"],[52,7,1,"cmdoption-seismic-wf-fold-max","--fold-max"],[52,7,1,"cmdoption-seismic-wf-fold-md","--fold-md"],[52,7,1,"cmdoption-seismic-wf-fold-mfe","--fold-mfe"],[52,7,1,"cmdoption-seismic-wf-fold-percent","--fold-percent"],[52,7,1,"cmdoption-seismic-wf-fold-mfe","--fold-sub"],[52,7,1,"cmdoption-seismic-wf-fold-temp","--fold-temp"],[52,7,1,"cmdoption-seismic-wf-force","--force"],[52,7,1,"cmdoption-seismic-wf-hist-bins","--hist-bins"],[52,7,1,"cmdoption-seismic-wf-hist-margin","--hist-margin"],[52,7,1,"cmdoption-seismic-wf-html","--html"],[52,7,1,"cmdoption-seismic-wf-exclude-gu","--include-gu"],[52,7,1,"cmdoption-seismic-wf-index-tolerance","--index-tolerance"],[52,7,1,"cmdoption-seismic-wf-2","--join-clusts"],[52,7,1,"cmdoption-seismic-wf-J","--joined"],[52,7,1,"cmdoption-seismic-wf-keep-temp","--keep-temp"],[52,7,1,"cmdoption-seismic-wf-k","--max-clusters"],[52,7,1,"cmdoption-seismic-wf-max-em-iter","--max-em-iter"],[52,7,1,"cmdoption-seismic-wf-max-fmut-pos","--max-fmut-pos"],[52,7,1,"cmdoption-seismic-wf-max-fmut-read","--max-fmut-read"],[52,7,1,"cmdoption-seismic-wf-max-procs","--max-procs"],[52,7,1,"cmdoption-seismic-wf-min-em-iter","--min-em-iter"],[52,7,1,"cmdoption-seismic-wf-min-finfo-read","--min-finfo-read"],[52,7,1,"cmdoption-seismic-wf-min-mapq","--min-mapq"],[52,7,1,"cmdoption-seismic-wf-min-mut-gap","--min-mut-gap"],[52,7,1,"cmdoption-seismic-wf-min-ninfo-pos","--min-ninfo-pos"],[52,7,1,"cmdoption-seismic-wf-min-phred","--min-phred"],[52,7,1,"cmdoption-seismic-wf-N","--min-reads"],[52,7,1,"cmdoption-seismic-wf-mismatch-tolerence","--mismatch-tolerence"],[52,7,1,"cmdoption-seismic-wf-ambrel","--no-ambrel"],[52,7,1,"cmdoption-seismic-wf-csv","--no-csv"],[52,7,1,"cmdoption-seismic-wf-cut","--no-cut"],[52,7,1,"cmdoption-seismic-wf-export","--no-export"],[52,7,1,"cmdoption-seismic-wf-fastqc","--no-fastqc"],[52,7,1,"cmdoption-seismic-wf-fold","--no-fold"],[52,7,1,"cmdoption-seismic-wf-force","--no-force"],[52,7,1,"cmdoption-seismic-wf-html","--no-html"],[52,7,1,"cmdoption-seismic-wf-pdf","--no-pdf"],[52,7,1,"cmdoption-seismic-wf-table-clust","--no-table-clust"],[52,7,1,"cmdoption-seismic-wf-table-pos","--no-table-pos"],[52,7,1,"cmdoption-seismic-wf-table-read","--no-table-read"],[52,7,1,"cmdoption-seismic-wf-o","--out-dir"],[52,7,1,"cmdoption-seismic-wf-parallel","--parallel"],[52,7,1,"cmdoption-seismic-wf-parallel-demultiplexing","--parallel-demultiplexing"],[52,7,1,"cmdoption-seismic-wf-pdf","--pdf"],[52,7,1,"cmdoption-seismic-wf-phred-enc","--phred-enc"],[52,7,1,"cmdoption-seismic-wf-P","--pool"],[52,7,1,"cmdoption-seismic-wf-primer-gap","--primer-gap"],[52,7,1,"cmdoption-seismic-wf-1","--primers"],[52,7,1,"cmdoption-seismic-wf-qc-extract","--qc-extract"],[52,7,1,"cmdoption-seismic-wf-qc-extract","--qc-no-extract"],[52,7,1,"cmdoption-seismic-wf-q","--quantile"],[52,7,1,"cmdoption-seismic-wf-R","--refs-meta"],[52,7,1,"cmdoption-seismic-wf-S","--samples-meta"],[52,7,1,"cmdoption-seismic-wf-s","--sections-file"],[52,7,1,"cmdoption-seismic-wf-parallel","--serial"],[52,7,1,"cmdoption-seismic-wf-struct-file","--struct-file"],[52,7,1,"cmdoption-seismic-wf-struct-sect","--struct-sect"],[52,7,1,"cmdoption-seismic-wf-table-clust","--table-clust"],[52,7,1,"cmdoption-seismic-wf-table-pos","--table-pos"],[52,7,1,"cmdoption-seismic-wf-table-read","--table-read"],[52,7,1,"cmdoption-seismic-wf-t","--temp-dir"],[52,7,1,"cmdoption-seismic-wf-all-pos","--unmasked-pos"],[52,7,1,"cmdoption-seismic-wf-w","--window"],[52,7,1,"cmdoption-seismic-wf-3","--winmin"],[52,7,1,"cmdoption-seismic-wf-J","-J"],[52,7,1,"cmdoption-seismic-wf-N","-N"],[52,7,1,"cmdoption-seismic-wf-P","-P"],[52,7,1,"cmdoption-seismic-wf-R","-R"],[52,7,1,"cmdoption-seismic-wf-S","-S"],[52,7,1,"cmdoption-seismic-wf-X","-X"],[52,7,1,"cmdoption-seismic-wf-Y","-Y"],[52,7,1,"cmdoption-seismic-wf-Z","-Z"],[52,7,1,"cmdoption-seismic-wf-c","-c"],[52,7,1,"cmdoption-seismic-wf-e","-e"],[52,7,1,"cmdoption-seismic-wf-2","-j"],[52,7,1,"cmdoption-seismic-wf-k","-k"],[52,7,1,"cmdoption-seismic-wf-3","-n"],[52,7,1,"cmdoption-seismic-wf-o","-o"],[52,7,1,"cmdoption-seismic-wf-1","-p"],[52,7,1,"cmdoption-seismic-wf-q","-q"],[52,7,1,"cmdoption-seismic-wf-s","-s"],[52,7,1,"cmdoption-seismic-wf-t","-t"],[52,7,1,"cmdoption-seismic-wf-w","-w"],[52,7,1,"cmdoption-seismic-wf-x","-x"],[52,7,1,"cmdoption-seismic-wf-y","-y"],[52,7,1,"cmdoption-seismic-wf-z","-z"],[52,7,1,"cmdoption-seismic-wf-arg-FASTA","FASTA"],[52,7,1,"cmdoption-seismic-wf-arg-INPUT_PATH","INPUT_PATH"]],"seismicrna.align":[[8,0,0,"-","fqops"],[8,0,0,"-","fqunit"],[8,0,0,"-","main"],[8,0,0,"-","report"],[8,0,0,"-","sim"],[9,0,0,"-","tests"],[8,0,0,"-","write"],[8,0,0,"-","xamops"]],"seismicrna.align.fqops":[[8,1,1,"","cutadapt_cmd"],[8,1,1,"","fastqc_cmd"],[8,1,1,"","run_fastqc"]],"seismicrna.align.fqunit":[[8,2,1,"","FastqUnit"],[8,1,1,"","count_fastq_reads"],[8,1,1,"","fastq_gz"],[8,1,1,"","get_args_count_fastq_reads"],[8,1,1,"","parse_stdout_count_fastq_reads"]],"seismicrna.align.fqunit.FastqUnit":[[8,3,1,"","BOWTIE2_FLAGS"],[8,3,1,"","KEY_DINTER"],[8,3,1,"","KEY_DMATED"],[8,3,1,"","KEY_DSINGLE"],[8,3,1,"","KEY_INTER"],[8,3,1,"","KEY_MATE1"],[8,3,1,"","KEY_MATE2"],[8,3,1,"","KEY_MATED"],[8,3,1,"","KEY_SINGLE"],[8,3,1,"","MAX_PHRED_ENC"],[8,4,1,"","bowtie2_inputs"],[8,4,1,"","cutadapt_input_args"],[8,5,1,"","fields"],[8,5,1,"","from_paths"],[8,5,1,"","get_sample_ref_exts"],[8,4,1,"","kind"],[8,4,1,"","n_reads"],[8,4,1,"","parent"],[8,4,1,"","phred_arg"],[8,4,1,"","seg_types"],[8,5,1,"","to_new"]],"seismicrna.align.main":[[8,1,1,"","run"]],"seismicrna.align.report":[[8,2,1,"","AlignRefReport"],[8,2,1,"","AlignReport"],[8,2,1,"","AlignSampleReport"]],"seismicrna.align.report.AlignRefReport":[[8,5,1,"","fields"],[8,5,1,"","file_seg_type"]],"seismicrna.align.report.AlignReport":[[8,5,1,"","auto_fields"],[8,5,1,"","dir_seg_types"],[8,5,1,"","fields"]],"seismicrna.align.report.AlignSampleReport":[[8,5,1,"","fields"],[8,5,1,"","file_seg_type"]],"seismicrna.align.sim":[[8,1,1,"","as_sam"],[8,1,1,"","relvecs_to_sam_file"],[8,1,1,"","relvecs_to_sam_lines"],[8,1,1,"","sam_header"]],"seismicrna.align.tests":[[9,0,0,"-","fqutil_test"],[9,0,0,"-","sim_test"],[9,0,0,"-","xamgen_test"]],"seismicrna.align.tests.fqutil_test":[[9,2,1,"","TestRunFASTQC"]],"seismicrna.align.tests.fqutil_test.TestRunFASTQC":[[9,5,1,"","setUp"],[9,5,1,"","tearDown"],[9,3,1,"","temp_fq"],[9,3,1,"","temp_fq1"],[9,3,1,"","temp_fq2"]],"seismicrna.align.tests.sim_test":[[9,2,1,"","TestAsSam"],[9,2,1,"","TestFindBlankRange"]],"seismicrna.align.tests.sim_test.TestAsSam":[[9,5,1,"","test_line_in_sam_format"]],"seismicrna.align.tests.sim_test.TestFindBlankRange":[[9,5,1,"","test_side3_equal_length"],[9,5,1,"","test_side3_neg_length"],[9,5,1,"","test_side3_over_length"],[9,5,1,"","test_side3_under_length"],[9,5,1,"","test_side3_zero_length"],[9,5,1,"","test_side5_equal_length"],[9,5,1,"","test_side5_neg_length"],[9,5,1,"","test_side5_over_length"],[9,5,1,"","test_side5_under_length"],[9,5,1,"","test_side5_zero_length"]],"seismicrna.align.tests.xamgen_test":[[9,2,1,"","TestAlignmentScoreParams"]],"seismicrna.align.tests.xamgen_test.TestAlignmentScoreParams":[[9,5,1,"","parse_all_scores"],[9,5,1,"","parse_scores"],[9,5,1,"","test_inequality_min_num_edits"],[9,5,1,"","test_inequality_subst_vs_indel"],[9,5,1,"","test_score_consistency"]],"seismicrna.align.write":[[8,1,1,"","align_samples"],[8,1,1,"","check_fqs_xams"],[8,1,1,"","figure_alignments"],[8,1,1,"","fq_pipeline"],[8,1,1,"","fqs_pipeline"],[8,1,1,"","list_fqs_xams"],[8,1,1,"","merge_nondemult_fqs"],[8,1,1,"","write_temp_ref_files"]],"seismicrna.align.xamops":[[8,1,1,"","bowtie2_build_cmd"],[8,1,1,"","bowtie2_cmd"],[8,1,1,"","export_cmd"],[8,1,1,"","get_bowtie2_index_paths"],[8,1,1,"","parse_bowtie2"],[8,1,1,"","xamgen_cmd"]],"seismicrna.cleanfa":[[10,0,0,"-","cleanfa"],[10,0,0,"-","main"]],"seismicrna.cleanfa.cleanfa":[[10,2,1,"","FastaCleaner"],[10,1,1,"","clean_fasta"],[10,1,1,"","get_non_seq_regex"]],"seismicrna.cleanfa.cleanfa.FastaCleaner":[[10,5,1,"","run"]],"seismicrna.cleanfa.main":[[10,1,1,"","run"]],"seismicrna.cluster":[[11,0,0,"-","addclust"],[11,0,0,"-","batch"],[11,0,0,"-","compare"],[11,0,0,"-","csv"],[11,0,0,"-","data"],[11,0,0,"-","delclust"],[11,0,0,"-","em"],[11,0,0,"-","io"],[11,0,0,"-","main"],[11,0,0,"-","names"],[11,0,0,"-","report"],[11,0,0,"-","save"],[11,0,0,"-","uniq"],[11,0,0,"-","write"]],"seismicrna.cluster.addclust":[[11,1,1,"","add_orders"],[11,1,1,"","run"],[11,1,1,"","update_batches"],[11,1,1,"","update_field"],[11,1,1,"","update_log_counts"],[11,1,1,"","update_report"]],"seismicrna.cluster.batch":[[11,2,1,"","ClusterMutsBatch"],[11,2,1,"","ClusterReadBatch"]],"seismicrna.cluster.batch.ClusterMutsBatch":[[11,4,1,"","read_weights"]],"seismicrna.cluster.batch.ClusterReadBatch":[[11,4,1,"","num_reads"],[11,4,1,"","read_nums"]],"seismicrna.cluster.compare":[[11,2,1,"","RunOrderResults"],[11,1,1,"","assign_clusterings"],[11,1,1,"","calc_mean_pearson"],[11,1,1,"","calc_nrmsd_groups"],[11,1,1,"","calc_pearson_groups"],[11,1,1,"","calc_rms_nrmsd"],[11,1,1,"","calc_rmsd_groups"],[11,1,1,"","find_best_order"],[11,1,1,"","format_exp_count_col"],[11,1,1,"","get_common_best_run_attr"],[11,1,1,"","get_common_order"],[11,1,1,"","get_log_exp_obs_counts"],[11,1,1,"","parse_exp_count_col"],[11,1,1,"","sort_replicate_runs"]],"seismicrna.cluster.compare.RunOrderResults":[[11,4,1,"","bic"]],"seismicrna.cluster.csv":[[11,1,1,"","get_count_path"],[11,1,1,"","get_table_path"],[11,1,1,"","write_log_counts"],[11,1,1,"","write_mus"],[11,1,1,"","write_props"],[11,1,1,"","write_single_run_table"]],"seismicrna.cluster.data":[[11,2,1,"","ClusterMutsDataset"],[11,2,1,"","ClusterReadDataset"]],"seismicrna.cluster.data.ClusterMutsDataset":[[11,4,1,"","clusters"],[11,5,1,"","get_dataset1_load_func"],[11,5,1,"","get_dataset2_type"],[11,4,1,"","max_order"],[11,4,1,"","min_mut_gap"],[11,4,1,"","pattern"],[11,4,1,"","section"]],"seismicrna.cluster.data.ClusterReadDataset":[[11,5,1,"","get_batch_type"],[11,5,1,"","get_report_type"],[11,4,1,"","max_order"],[11,4,1,"","pattern"]],"seismicrna.cluster.delclust":[[11,1,1,"","del_orders"],[11,1,1,"","run"],[11,1,1,"","update_batches"],[11,1,1,"","update_field"],[11,1,1,"","update_log_counts"],[11,1,1,"","update_report"]],"seismicrna.cluster.em":[[11,2,1,"","EmClustering"],[11,1,1,"","calc_bic"]],"seismicrna.cluster.em.EmClustering":[[11,4,1,"","bic"],[11,4,1,"","clusters"],[11,4,1,"","delta_log_like"],[11,5,1,"","get_mus"],[11,5,1,"","get_props"],[11,5,1,"","get_resps"],[11,4,1,"","log_like"],[11,4,1,"","log_like_prev"],[11,4,1,"","logn_exp"],[11,4,1,"","nreads_total"],[11,4,1,"","prop_adj"],[11,4,1,"","prop_obs"],[11,5,1,"","run"],[11,4,1,"","sparse_mus"]],"seismicrna.cluster.io":[[11,2,1,"","ClusterBatchIO"],[11,2,1,"","ClusterIO"]],"seismicrna.cluster.io.ClusterBatchIO":[[11,5,1,"","file_seg_type"]],"seismicrna.cluster.io.ClusterIO":[[11,5,1,"","auto_fields"]],"seismicrna.cluster.main":[[11,1,1,"","run"]],"seismicrna.cluster.report":[[11,2,1,"","ClusterReport"]],"seismicrna.cluster.report.ClusterReport":[[11,5,1,"","auto_fields"],[11,5,1,"","fields"],[11,5,1,"","file_seg_type"],[11,5,1,"","from_clusters"]],"seismicrna.cluster.save":[[11,1,1,"","write_batches"]],"seismicrna.cluster.uniq":[[11,2,1,"","UniqReads"],[11,1,1,"","batch_to_uniq_read_num"],[11,1,1,"","count_uniq_reads"],[11,1,1,"","get_uniq_reads"],[11,1,1,"","uniq_reads_to_mutations"]],"seismicrna.cluster.uniq.UniqReads":[[11,5,1,"","from_dataset"],[11,5,1,"","get_matrix"],[11,5,1,"","get_uniq_names"],[11,4,1,"","num_batches"],[11,4,1,"","num_pos"],[11,4,1,"","num_reads"],[11,4,1,"","num_uniq"],[11,4,1,"","pos_nums"],[11,4,1,"","ref"]],"seismicrna.cluster.write":[[11,1,1,"","cluster"],[11,1,1,"","run_max_order"],[11,1,1,"","run_order"],[11,1,1,"","run_orders"]],"seismicrna.core":[[13,0,0,"-","arg"],[14,0,0,"-","batch"],[12,0,0,"-","data"],[15,0,0,"-","extern"],[12,0,0,"-","header"],[16,0,0,"-","io"],[12,0,0,"-","logs"],[18,0,0,"-","mu"],[22,0,0,"-","ngs"],[24,0,0,"-","parallel"],[12,0,0,"-","path"],[26,0,0,"-","rel"],[12,0,0,"-","report"],[28,0,0,"-","rna"],[29,0,0,"-","seq"],[31,0,0,"-","tests"],[12,0,0,"-","types"],[12,0,0,"-","version"],[12,0,0,"-","write"]],"seismicrna.core.arg":[[13,0,0,"-","cli"],[13,0,0,"-","cmd"],[13,0,0,"-","default"],[13,0,0,"-","docdef"]],"seismicrna.core.arg.cli":[[13,1,1,"","merge_params"]],"seismicrna.core.arg.docdef":[[13,1,1,"","auto"],[13,1,1,"","auto_defaults"],[13,1,1,"","auto_docstrs"],[13,1,1,"","get_docstr_lines"],[13,1,1,"","get_param_default"],[13,1,1,"","get_param_lines"],[13,1,1,"","param_defaults"],[13,1,1,"","param_docstrs"]],"seismicrna.core.batch":[[14,0,0,"-","accum"],[14,0,0,"-","count"],[14,0,0,"-","index"],[14,0,0,"-","muts"],[14,0,0,"-","read"]],"seismicrna.core.batch.accum":[[14,1,1,"","accum_fits"],[14,1,1,"","accum_per_pos"],[14,1,1,"","accumulate"]],"seismicrna.core.batch.count":[[14,1,1,"","get_count_per_pos"],[14,1,1,"","get_count_per_read"],[14,1,1,"","get_cover_per_pos"],[14,1,1,"","get_cover_per_read"],[14,1,1,"","get_coverage_matrix"],[14,1,1,"","get_half_coverage_matrix"],[14,1,1,"","get_reads_per_pos"],[14,1,1,"","get_rels_per_pos"],[14,1,1,"","get_rels_per_read"]],"seismicrna.core.batch.index":[[14,1,1,"","contiguous_mates"],[14,1,1,"","count_base_types"],[14,1,1,"","ensure_order"],[14,1,1,"","ensure_same_length"],[14,1,1,"","get_inverse"],[14,1,1,"","get_length"],[14,1,1,"","iter_base_types"],[14,1,1,"","iter_windows"],[14,1,1,"","list_batch_nums"],[14,1,1,"","sanitize_ends"],[14,1,1,"","sanitize_pos"],[14,1,1,"","sanitize_values"]],"seismicrna.core.batch.muts":[[14,2,1,"","MutsBatch"],[14,2,1,"","PartialMutsBatch"],[14,2,1,"","ReflenMutsBatch"],[14,2,1,"","RefseqMutsBatch"]],"seismicrna.core.batch.muts.MutsBatch":[[14,4,1,"","max_pos"],[14,4,1,"","mid3s"],[14,4,1,"","mid5s"],[14,4,1,"","num_pos"],[14,4,1,"","pos_dtype"],[14,4,1,"","pos_nums"],[14,4,1,"","read_weights"]],"seismicrna.core.batch.muts.PartialMutsBatch":[[14,4,1,"","pos_nums"]],"seismicrna.core.batch.muts.ReflenMutsBatch":[[14,4,1,"","max_pos"]],"seismicrna.core.batch.muts.RefseqMutsBatch":[[14,4,1,"","count_base_types"],[14,5,1,"","count_per_pos"],[14,5,1,"","count_per_read"],[14,4,1,"","cover_per_pos"],[14,4,1,"","cover_per_read"],[14,4,1,"","coverage_matrix"],[14,5,1,"","iter_reads"],[14,5,1,"","iter_windows"],[14,4,1,"","max_pos"],[14,5,1,"","nonprox_muts"],[14,4,1,"","pos_index"],[14,5,1,"","reads_per_pos"],[14,4,1,"","rels_per_pos"],[14,4,1,"","rels_per_read"]],"seismicrna.core.batch.read":[[14,2,1,"","AllReadBatch"],[14,2,1,"","PartialReadBatch"],[14,2,1,"","ReadBatch"]],"seismicrna.core.batch.read.AllReadBatch":[[14,4,1,"","max_read"],[14,4,1,"","read_indexes"],[14,4,1,"","read_nums"]],"seismicrna.core.batch.read.PartialReadBatch":[[14,4,1,"","max_read"],[14,4,1,"","num_reads"],[14,4,1,"","read_indexes"]],"seismicrna.core.batch.read.ReadBatch":[[14,4,1,"","batch_read_index"],[14,4,1,"","max_read"],[14,4,1,"","num_reads"],[14,4,1,"","read_dtype"],[14,4,1,"","read_indexes"],[14,4,1,"","read_nums"]],"seismicrna.core.data":[[12,2,1,"","ChainedDataset"],[12,2,1,"","ChainedMutsDataset"],[12,2,1,"","Dataset"],[12,2,1,"","JoinedDataset"],[12,2,1,"","LoadFunction"],[12,2,1,"","LoadedDataset"],[12,2,1,"","LoadedMutsDataset"],[12,2,1,"","MergedDataset"],[12,2,1,"","MergedMutsDataset"],[12,2,1,"","MutsDataset"],[12,2,1,"","PooledDataset"],[12,2,1,"","PooledMutsDataset"],[12,1,1,"","load_datasets"]],"seismicrna.core.data.ChainedDataset":[[12,5,1,"","get_batch"],[12,5,1,"","get_dataset1_load_func"],[12,5,1,"","get_dataset1_report_file"],[12,5,1,"","get_dataset2_load_func"],[12,5,1,"","get_dataset2_type"],[12,5,1,"","get_report_type"],[12,5,1,"","load"],[12,5,1,"","load_dataset1"],[12,5,1,"","load_dataset2"],[12,4,1,"","num_batches"],[12,4,1,"","ref"],[12,4,1,"","refseq"],[12,4,1,"","sample"],[12,4,1,"","top"]],"seismicrna.core.data.ChainedMutsDataset":[[12,4,1,"","end3"],[12,4,1,"","end5"],[12,4,1,"","sect"]],"seismicrna.core.data.Dataset":[[12,4,1,"","batch_nums"],[12,4,1,"","end3"],[12,4,1,"","end5"],[12,5,1,"","get_batch"],[12,5,1,"","get_report_type"],[12,5,1,"","iter_batches"],[12,5,1,"","load"],[12,5,1,"","load_report"],[12,4,1,"","num_batches"],[12,4,1,"","num_reads"],[12,4,1,"","pattern"],[12,4,1,"","ref"],[12,4,1,"","sample"],[12,4,1,"","sect"],[12,4,1,"","top"]],"seismicrna.core.data.JoinedDataset":[[12,4,1,"","end3"],[12,4,1,"","end5"],[12,5,1,"","get_batch"],[12,5,1,"","load"],[12,4,1,"","num_batches"],[12,4,1,"","sample"],[12,4,1,"","samples"],[12,4,1,"","sect"],[12,4,1,"","sects"]],"seismicrna.core.data.LoadFunction":[[12,5,1,"","__call__"],[12,4,1,"","report_path_auto_fields"],[12,4,1,"","report_path_seg_types"]],"seismicrna.core.data.LoadedDataset":[[12,4,1,"","end3"],[12,4,1,"","end5"],[12,5,1,"","get_batch"],[12,5,1,"","get_batch_checksum"],[12,5,1,"","get_batch_path"],[12,5,1,"","get_batch_type"],[12,5,1,"","get_btype_name"],[12,5,1,"","get_report_type"],[12,5,1,"","load"],[12,4,1,"","num_batches"],[12,4,1,"","ref"],[12,4,1,"","sample"],[12,4,1,"","sect"],[12,4,1,"","top"]],"seismicrna.core.data.LoadedMutsDataset":[[12,4,1,"","end3"],[12,4,1,"","end5"],[12,4,1,"","refseq"],[12,4,1,"","sect"]],"seismicrna.core.data.MergedDataset":[[12,5,1,"","get_dataset_load_func"],[12,4,1,"","pattern"],[12,4,1,"","ref"],[12,4,1,"","top"]],"seismicrna.core.data.MergedMutsDataset":[[12,4,1,"","refseq"]],"seismicrna.core.data.MutsDataset":[[12,5,1,"","load"],[12,4,1,"","reflen"],[12,4,1,"","refseq"],[12,4,1,"","section"]],"seismicrna.core.data.PooledDataset":[[12,4,1,"","end3"],[12,4,1,"","end5"],[12,5,1,"","get_batch"],[12,5,1,"","load"],[12,4,1,"","num_batches"],[12,4,1,"","nums_batches"],[12,4,1,"","sample"],[12,4,1,"","samples"],[12,4,1,"","sect"]],"seismicrna.core.extern":[[15,0,0,"-","depend"],[15,0,0,"-","shell"]],"seismicrna.core.extern.depend":[[15,1,1,"","dependency_exists"],[15,1,1,"","require_dependency"]],"seismicrna.core.extern.shell":[[15,2,1,"","ShellCommand"],[15,1,1,"","args_to_cmd"],[15,1,1,"","cmds_to_pipe"],[15,1,1,"","cmds_to_series"],[15,1,1,"","cmds_to_subshell"],[15,1,1,"","iopaths"],[15,1,1,"","run_cmd"]],"seismicrna.core.header":[[12,2,1,"","ClustHeader"],[12,2,1,"","Header"],[12,2,1,"","RelClustHeader"],[12,2,1,"","RelHeader"],[12,1,1,"","format_clust_name"],[12,1,1,"","format_clust_names"],[12,1,1,"","index_clusts"],[12,1,1,"","index_order_clusts"],[12,1,1,"","index_orders"],[12,1,1,"","index_orders_clusts"],[12,1,1,"","list_clusts"],[12,1,1,"","list_order_clusts"],[12,1,1,"","list_orders"],[12,1,1,"","list_orders_clusts"],[12,1,1,"","make_header"],[12,1,1,"","parse_header"],[12,1,1,"","validate_order_clust"]],"seismicrna.core.header.ClustHeader":[[12,5,1,"","clustered"],[12,4,1,"","index"],[12,5,1,"","levels"],[12,4,1,"","max_order"],[12,4,1,"","min_order"]],"seismicrna.core.header.Header":[[12,5,1,"","clustered"],[12,4,1,"","clusts"],[12,4,1,"","index"],[12,5,1,"","iter_clust_indexes"],[12,5,1,"","level_keys"],[12,5,1,"","level_names"],[12,5,1,"","levels"],[12,4,1,"","max_order"],[12,4,1,"","min_order"],[12,5,1,"","modified"],[12,4,1,"","names"],[12,5,1,"","num_levels"],[12,4,1,"","orders"],[12,5,1,"","select"],[12,4,1,"","signature"],[12,4,1,"","size"]],"seismicrna.core.header.RelClustHeader":[[12,4,1,"","index"]],"seismicrna.core.header.RelHeader":[[12,5,1,"","clustered"],[12,4,1,"","index"],[12,5,1,"","levels"],[12,4,1,"","max_order"],[12,4,1,"","min_order"],[12,4,1,"","rels"],[12,4,1,"","signature"]],"seismicrna.core.io":[[16,0,0,"-","batch"],[16,0,0,"-","brickle"],[16,0,0,"-","file"],[16,0,0,"-","seq"],[17,0,0,"-","tests"]],"seismicrna.core.io.batch":[[16,2,1,"","MutsBatchIO"],[16,2,1,"","ReadBatchIO"]],"seismicrna.core.io.batch.ReadBatchIO":[[16,5,1,"","btype"]],"seismicrna.core.io.brickle":[[16,1,1,"","digest_data"],[16,1,1,"","load_brickle"],[16,1,1,"","save_brickle"]],"seismicrna.core.io.file":[[16,2,1,"","BrickleIO"],[16,2,1,"","FileIO"],[16,2,1,"","RefIO"],[16,2,1,"","SectIO"],[16,1,1,"","make_temp_backup"],[16,1,1,"","recast_file_path"],[16,1,1,"","restore_temp_backup"]],"seismicrna.core.io.file.BrickleIO":[[16,5,1,"","load"],[16,5,1,"","save"]],"seismicrna.core.io.file.FileIO":[[16,5,1,"","auto_fields"],[16,5,1,"","build_path"],[16,5,1,"","dir_seg_types"],[16,5,1,"","file_seg_type"],[16,5,1,"","get_path"],[16,5,1,"","load"],[16,5,1,"","parse_path"],[16,5,1,"","path_field_values"],[16,5,1,"","path_fields"],[16,5,1,"","save"],[16,5,1,"","seg_types"]],"seismicrna.core.io.file.RefIO":[[16,5,1,"","dir_seg_types"]],"seismicrna.core.io.file.SectIO":[[16,5,1,"","dir_seg_types"]],"seismicrna.core.io.seq":[[16,2,1,"","RefseqIO"]],"seismicrna.core.io.seq.RefseqIO":[[16,5,1,"","auto_fields"],[16,5,1,"","file_seg_type"],[16,4,1,"","refseq"]],"seismicrna.core.io.tests":[[17,0,0,"-","file_test"]],"seismicrna.core.io.tests.file_test":[[17,2,1,"","SourceBackupDirs"],[17,2,1,"","TestMakeTempBackup"]],"seismicrna.core.io.tests.file_test.SourceBackupDirs":[[17,4,1,"","backup_dir"],[17,4,1,"","source_dir"]],"seismicrna.core.io.tests.file_test.TestMakeTempBackup":[[17,5,1,"","make_dir"],[17,5,1,"","make_file"],[17,5,1,"","test_backup_dir"],[17,5,1,"","test_backup_file"],[17,5,1,"","test_restore_dir"],[17,5,1,"","test_restore_file"]],"seismicrna.core.logs":[[12,2,1,"","AnsiCode"],[12,2,1,"","ColorFormatter"],[12,1,1,"","config"],[12,1,1,"","get_top_logger"],[12,1,1,"","get_verbosity"]],"seismicrna.core.logs.AnsiCode":[[12,3,1,"","BLUE"],[12,3,1,"","BOLD"],[12,3,1,"","CODES"],[12,3,1,"","CYAN"],[12,3,1,"","END"],[12,3,1,"","GREEN"],[12,3,1,"","PURPLE"],[12,3,1,"","RED"],[12,3,1,"","ULINE"],[12,3,1,"","YELLOW"],[12,5,1,"","end"],[12,5,1,"","fmt"],[12,5,1,"","wrap"]],"seismicrna.core.logs.ColorFormatter":[[12,3,1,"","ansi_codes"],[12,5,1,"","format"]],"seismicrna.core.mu":[[18,0,0,"-","compare"],[18,0,0,"-","dim"],[18,0,0,"-","frame"],[18,0,0,"-","nan"],[18,0,0,"-","scale"],[19,0,0,"-","tests"],[20,0,0,"-","unbias"]],"seismicrna.core.mu.compare":[[18,1,1,"","calc_coeff_determ"],[18,1,1,"","calc_nrmsd"],[18,1,1,"","calc_pearson"],[18,1,1,"","calc_rmsd"],[18,1,1,"","calc_spearman"],[18,1,1,"","compare_windows"],[18,1,1,"","get_comp_func"],[18,1,1,"","get_comp_name"]],"seismicrna.core.mu.dim":[[18,1,1,"","count_pos"],[18,1,1,"","counts_pos"],[18,1,1,"","counts_pos_consensus"]],"seismicrna.core.mu.frame":[[18,1,1,"","auto_reframe"],[18,1,1,"","reframe"],[18,1,1,"","reframe_like"]],"seismicrna.core.mu.nan":[[18,1,1,"","any_nan"],[18,1,1,"","auto_remove_nan"],[18,1,1,"","auto_removes_nan"],[18,1,1,"","no_nan"],[18,1,1,"","remove_nan"],[18,1,1,"","removes_nan"]],"seismicrna.core.mu.scale":[[18,1,1,"","calc_quantile"],[18,1,1,"","calc_ranks"],[18,1,1,"","calc_rms"],[18,1,1,"","normalize"],[18,1,1,"","standardize"],[18,1,1,"","winsorize"]],"seismicrna.core.mu.tests":[[19,0,0,"-","compare_test"],[19,0,0,"-","dim_test"],[19,0,0,"-","frame_test"],[19,0,0,"-","nan_test"],[19,0,0,"-","scale_test"]],"seismicrna.core.mu.tests.compare_test":[[19,2,1,"","TestCalcCoeffDeterm"],[19,2,1,"","TestCalcNRMSD"],[19,2,1,"","TestCalcPearson"],[19,2,1,"","TestCalcSpearman"],[19,2,1,"","TestCompareWindows"],[19,2,1,"","TestGetComp"]],"seismicrna.core.mu.tests.compare_test.TestCalcCoeffDeterm":[[19,5,1,"","calc_true"],[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_dataframe"]],"seismicrna.core.mu.tests.compare_test.TestCalcNRMSD":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d_allzero"],[19,5,1,"","test_array1d_examples"],[19,5,1,"","test_array1d_extremes"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCalcPearson":[[19,5,1,"","calc_true"],[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCalcSpearman":[[19,5,1,"","calc_true"],[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array1d_nan"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCompareWindows":[[19,5,1,"","test_contiguous"]],"seismicrna.core.mu.tests.compare_test.TestGetComp":[[19,5,1,"","test_comps"]],"seismicrna.core.mu.tests.dim_test":[[19,2,1,"","TestCountPos"],[19,2,1,"","TestCountsPos"],[19,2,1,"","TestCountsPosConsensus"]],"seismicrna.core.mu.tests.dim_test.TestCountPos":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.dim_test.TestCountsPos":[[19,5,1,"","test_array1d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.dim_test.TestCountsPosConsensus":[[19,5,1,"","test_empty"],[19,5,1,"","test_equal"],[19,5,1,"","test_unequal"]],"seismicrna.core.mu.tests.frame_test":[[19,2,1,"","TestAutoReframe"],[19,2,1,"","TestReframe"],[19,2,1,"","TestReframeLike"],[19,1,1,"","broadcast_regex"],[19,1,1,"","broadcastable"]],"seismicrna.core.mu.tests.frame_test.TestAutoReframe":[[19,5,1,"","test_reduce_0"],[19,5,1,"","test_reduce_0_and_1"],[19,5,1,"","test_reduce_none"]],"seismicrna.core.mu.tests.frame_test.TestReframe":[[19,5,1,"","test_array_index"],[19,5,1,"","test_array_index_index"],[19,5,1,"","test_array_ints"],[19,5,1,"","test_array_none"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_float_index"],[19,5,1,"","test_float_index_index"],[19,5,1,"","test_float_index_index_index"],[19,5,1,"","test_float_index_index_int"],[19,5,1,"","test_float_index_int"],[19,5,1,"","test_float_int_index"],[19,5,1,"","test_float_ints"],[19,5,1,"","test_float_none"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.frame_test.TestReframeLike":[[19,5,1,"","test_array_array"],[19,5,1,"","test_array_dataframe"],[19,5,1,"","test_array_series"],[19,5,1,"","test_dataframe_array"],[19,5,1,"","test_dataframe_dataframe"],[19,5,1,"","test_drop_array"],[19,5,1,"","test_drop_dataframe"],[19,5,1,"","test_drop_series"],[19,5,1,"","test_float_array"],[19,5,1,"","test_float_dataframe"],[19,5,1,"","test_float_float"],[19,5,1,"","test_float_series"],[19,5,1,"","test_series_array"],[19,5,1,"","test_series_series"]],"seismicrna.core.mu.tests.nan_test":[[19,2,1,"","TestAnyNaN"],[19,2,1,"","TestAutoRemoveNaN"],[19,2,1,"","TestAutoRemovesNaN"],[19,2,1,"","TestNoNaN"],[19,2,1,"","TestRemoveNaNs"],[19,2,1,"","TestRemovesNaNs"]],"seismicrna.core.mu.tests.nan_test.TestAnyNaN":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_array3d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestAutoRemoveNaN":[[19,5,1,"","test_array"]],"seismicrna.core.mu.tests.nan_test.TestAutoRemovesNaN":[[19,5,1,"","test_array"]],"seismicrna.core.mu.tests.nan_test.TestNoNaN":[[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestRemoveNaNs":[[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestRemovesNaNs":[[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_array_series_dataframe"],[19,5,1,"","test_array_series_dataframe_mismatched"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_empty"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test":[[19,2,1,"","TestCalcQuantile"],[19,2,1,"","TestCalcRMS"],[19,2,1,"","TestCalcRanks"],[19,2,1,"","TestNormalize"],[19,2,1,"","TestStandardize"],[19,2,1,"","TestWinsorize"]],"seismicrna.core.mu.tests.scale_test.TestCalcQuantile":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array1d_all_nan"],[19,5,1,"","test_array1d_empty"],[19,5,1,"","test_array1d_some_nan"],[19,5,1,"","test_array2d"],[19,5,1,"","test_array2d_one_col_nan"],[19,5,1,"","test_array2d_one_row_nan"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_invalid_quantiles"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestCalcRMS":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array1d_nan"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestCalcRanks":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_array3d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_nan"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestNormalize":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array1d_nan"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestStandardize":[[19,5,1,"","test_array0d"],[19,5,1,"","test_array1d"],[19,5,1,"","test_array2d"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestWinsorize":[[19,5,1,"","test_arrays"],[19,5,1,"","test_dataframe"],[19,5,1,"","test_series"]],"seismicrna.core.mu.unbias":[[20,0,0,"-","algo"],[20,0,0,"-","frame"],[21,0,0,"-","tests"]],"seismicrna.core.mu.unbias.algo":[[20,1,1,"","calc_f_obs_numpy"],[20,1,1,"","calc_mu_adj_numpy"],[20,1,1,"","calc_prop_adj_numpy"],[20,1,1,"","clip"]],"seismicrna.core.mu.unbias.frame":[[20,1,1,"","calc_f_obs_frame"],[20,1,1,"","calc_mu_adj_frame"],[20,1,1,"","calc_prop_adj_frame"]],"seismicrna.core.mu.unbias.tests":[[21,0,0,"-","algo_test"],[21,0,0,"-","frame_test"]],"seismicrna.core.mu.unbias.tests.algo_test":[[21,2,1,"","TestCalcFObsNumpy"],[21,2,1,"","TestCalcMuAdjNumpy"],[21,2,1,"","TestCalcMuObs"],[21,2,1,"","TestClip"],[21,2,1,"","TestHasCloseMuts"],[21,1,1,"","drop_close_muts"],[21,1,1,"","has_close_muts"],[21,1,1,"","label_close_muts"]],"seismicrna.core.mu.unbias.tests.algo_test.TestCalcFObsNumpy":[[21,5,1,"","test_1_dim"],[21,5,1,"","test_2_dim"],[21,5,1,"","test_f_multiplex"],[21,5,1,"","test_invalid_dim"],[21,5,1,"","test_obs_empirical"]],"seismicrna.core.mu.unbias.tests.algo_test.TestCalcMuAdjNumpy":[[21,5,1,"","test_inv_calc_mu_obs"],[21,5,1,"","test_mu_multiplex"]],"seismicrna.core.mu.unbias.tests.algo_test.TestCalcMuObs":[[21,5,1,"","test_inv_calc_mu_adj"],[21,5,1,"","test_mu_multiplex"],[21,5,1,"","test_obs_empirical"]],"seismicrna.core.mu.unbias.tests.algo_test.TestClip":[[21,5,1,"","test_with_clip"],[21,5,1,"","test_without_clip"]],"seismicrna.core.mu.unbias.tests.algo_test.TestHasCloseMuts":[[21,5,1,"","test_more_muts"],[21,5,1,"","test_no_muts"],[21,5,1,"","test_one_mut"]],"seismicrna.core.mu.unbias.tests.frame_test":[[21,2,1,"","TestCalcDataFrame"],[21,2,1,"","TestCalcSeries"]],"seismicrna.core.mu.unbias.tests.frame_test.TestCalcDataFrame":[[21,5,1,"","test_equals_numpy"]],"seismicrna.core.mu.unbias.tests.frame_test.TestCalcSeries":[[21,5,1,"","test_equals_numpy"]],"seismicrna.core.ngs":[[22,0,0,"-","phred"],[23,0,0,"-","tests"],[22,0,0,"-","xam"]],"seismicrna.core.ngs.phred":[[22,1,1,"","decode_phred"],[22,1,1,"","encode_phred"]],"seismicrna.core.ngs.tests":[[23,0,0,"-","phred_test"]],"seismicrna.core.ngs.tests.phred_test":[[23,2,1,"","TestConstants"],[23,2,1,"","TestDecode"],[23,2,1,"","TestEncode"]],"seismicrna.core.ngs.tests.phred_test.TestConstants":[[23,5,1,"","test_phreds"],[23,5,1,"","test_quals"]],"seismicrna.core.ngs.tests.phred_test.TestDecode":[[23,5,1,"","test_decode"]],"seismicrna.core.ngs.tests.phred_test.TestEncode":[[23,5,1,"","test_encode"]],"seismicrna.core.ngs.xam":[[22,1,1,"","count_single_paired"],[22,1,1,"","count_total_reads"],[22,1,1,"","flagstat_cmd"],[22,1,1,"","idxstats_cmd"],[22,1,1,"","index_fasta_cmd"],[22,1,1,"","index_xam_cmd"],[22,1,1,"","parse_flagstat"],[22,1,1,"","parse_idxstats"],[22,1,1,"","parse_ref_header"],[22,1,1,"","ref_header_cmd"],[22,1,1,"","sort_xam_cmd"],[22,1,1,"","view_xam_cmd"],[22,1,1,"","xam_paired"],[22,1,1,"","xam_to_fq_cmd"]],"seismicrna.core.parallel":[[24,0,0,"-","pool"],[24,0,0,"-","temp"],[25,0,0,"-","tests"]],"seismicrna.core.parallel.pool":[[24,2,1,"","Task"],[24,1,1,"","as_list_of_tuples"],[24,1,1,"","dispatch"],[24,1,1,"","fmt_func_args"],[24,1,1,"","get_num_parallel"]],"seismicrna.core.parallel.pool.Task":[[24,5,1,"","__call__"]],"seismicrna.core.parallel.temp":[[24,1,1,"","lock_temp_dir"]],"seismicrna.core.parallel.tests":[[25,0,0,"-","temp_test"]],"seismicrna.core.parallel.tests.temp_test":[[25,2,1,"","TestLockTempDir"],[25,1,1,"","get_lock"],[25,1,1,"","lock"],[25,1,1,"","make_lock_temp"],[25,1,1,"","make_temp"],[25,1,1,"","name_lock_temp"],[25,1,1,"","name_temp"],[25,1,1,"","rm_temp"],[25,1,1,"","run_func"],[25,1,1,"","unlock"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir":[[25,2,1,"","LockErrFilter"],[25,2,1,"","TempErrFilter"],[25,5,1,"","test_exists_erase_temp"],[25,5,1,"","test_exists_keep_temp"],[25,5,1,"","test_locked"],[25,5,1,"","test_new_erase_temp"],[25,5,1,"","test_new_keep_temp"],[25,5,1,"","test_wraps"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir.LockErrFilter":[[25,5,1,"","filter"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir.TempErrFilter":[[25,5,1,"","filter"]],"seismicrna.core.path":[[12,2,1,"","Field"],[12,2,1,"","Path"],[12,6,1,"","PathError"],[12,6,1,"","PathTypeError"],[12,6,1,"","PathValueError"],[12,2,1,"","Segment"],[12,1,1,"","build"],[12,1,1,"","builddir"],[12,1,1,"","buildpar"],[12,1,1,"","cast_path"],[12,1,1,"","create_path_type"],[12,1,1,"","deduplicated"],[12,1,1,"","fill_whitespace"],[12,1,1,"","find_files"],[12,1,1,"","find_files_chain"],[12,1,1,"","get_fields_in_seg_types"],[12,1,1,"","parse"],[12,1,1,"","parse_top_separate"],[12,1,1,"","path_matches"],[12,1,1,"","sanitize"],[12,1,1,"","transpath"],[12,1,1,"","transpaths"],[12,1,1,"","validate_int"],[12,1,1,"","validate_str"],[12,1,1,"","validate_top"]],"seismicrna.core.path.Field":[[12,5,1,"","build"],[12,5,1,"","parse"],[12,5,1,"","validate"]],"seismicrna.core.path.Path":[[12,5,1,"","build"],[12,5,1,"","parse"]],"seismicrna.core.path.Segment":[[12,5,1,"","build"],[12,4,1,"","ext_type"],[12,4,1,"","exts"],[12,5,1,"","match_longest_ext"],[12,5,1,"","parse"]],"seismicrna.core.rel":[[26,0,0,"-","code"],[26,0,0,"-","pattern"],[27,0,0,"-","tests"]],"seismicrna.core.rel.pattern":[[26,2,1,"","HalfRelPattern"],[26,2,1,"","RelPattern"]],"seismicrna.core.rel.pattern.HalfRelPattern":[[26,3,1,"","a"],[26,5,1,"","allc"],[26,5,1,"","as_fancy"],[26,5,1,"","as_match"],[26,5,1,"","as_plain"],[26,3,1,"","c"],[26,4,1,"","codes"],[26,5,1,"","compile"],[26,5,1,"","decompile"],[26,5,1,"","fits"],[26,3,1,"","fmt_fancy"],[26,3,1,"","fmt_plain"],[26,5,1,"","from_counts"],[26,5,1,"","from_report_format"],[26,3,1,"","g"],[26,5,1,"","intersect"],[26,3,1,"","mut_bits"],[26,5,1,"","muts"],[26,5,1,"","none"],[26,4,1,"","patterns"],[26,3,1,"","ptrn_fancy"],[26,3,1,"","ptrn_plain"],[26,3,1,"","read_bases"],[26,3,1,"","ref_bases"],[26,5,1,"","refs"],[26,3,1,"","t"],[26,5,1,"","to_report_format"]],"seismicrna.core.rel.pattern.RelPattern":[[26,5,1,"","allc"],[26,5,1,"","fits"],[26,5,1,"","from_counts"],[26,5,1,"","intersect"],[26,5,1,"","muts"],[26,3,1,"","nos"],[26,3,1,"","yes"]],"seismicrna.core.rel.tests":[[27,0,0,"-","code_test"]],"seismicrna.core.rel.tests.code_test":[[27,2,1,"","TestConstants"]],"seismicrna.core.rel.tests.code_test.TestConstants":[[27,5,1,"","test_derived_codes"],[27,5,1,"","test_np_type"],[27,5,1,"","test_primary_codes"]],"seismicrna.core.report":[[12,2,1,"","BatchedRefseqReport"],[12,2,1,"","BatchedReport"],[12,2,1,"","Field"],[12,2,1,"","OptionField"],[12,2,1,"","RefseqReport"],[12,2,1,"","Report"],[12,1,1,"","calc_dt_minutes"],[12,1,1,"","calc_taken"],[12,1,1,"","default_key"],[12,1,1,"","field_keys"],[12,1,1,"","field_titles"],[12,1,1,"","fields"],[12,1,1,"","get_oconv_array_float"],[12,1,1,"","get_oconv_dict_float"],[12,1,1,"","get_oconv_dict_list_float"],[12,1,1,"","get_oconv_float"],[12,1,1,"","get_oconv_list_float"],[12,1,1,"","iconv_array_float"],[12,1,1,"","iconv_array_int"],[12,1,1,"","iconv_datetime"],[12,1,1,"","iconv_dict_str_dict_int_dict_int_int"],[12,1,1,"","iconv_dict_str_int"],[12,1,1,"","iconv_int_keys"],[12,1,1,"","key_to_title"],[12,1,1,"","lookup_key"],[12,1,1,"","lookup_title"],[12,1,1,"","oconv_array_int"],[12,1,1,"","oconv_datetime"]],"seismicrna.core.report.BatchedReport":[[12,5,1,"","batch_types"],[12,5,1,"","fields"],[12,5,1,"","get_batch_type"]],"seismicrna.core.report.Field":[[12,3,1,"","default"],[12,3,1,"","dtype"],[12,3,1,"","iconv"],[12,3,1,"","key"],[12,3,1,"","oconv"],[12,3,1,"","title"]],"seismicrna.core.report.OptionField":[[12,3,1,"","default"],[12,3,1,"","dtype"],[12,3,1,"","iconv"],[12,3,1,"","key"],[12,3,1,"","oconv"],[12,3,1,"","title"]],"seismicrna.core.report.RefseqReport":[[12,5,1,"","fields"]],"seismicrna.core.report.Report":[[12,5,1,"","__setattr__"],[12,5,1,"","field_keys"],[12,5,1,"","fields"],[12,5,1,"","from_dict"],[12,5,1,"","get_field"],[12,5,1,"","load"],[12,5,1,"","save"],[12,5,1,"","to_dict"]],"seismicrna.core.rna":[[28,0,0,"-","base"],[28,0,0,"-","ct"],[28,0,0,"-","ctio"],[28,0,0,"-","db"],[28,0,0,"-","pair"],[28,0,0,"-","profile"],[28,0,0,"-","roc"],[28,0,0,"-","state"],[28,0,0,"-","struct"]],"seismicrna.core.rna.base":[[28,2,1,"","RNASection"]],"seismicrna.core.rna.base.RNASection":[[28,4,1,"","end3"],[28,4,1,"","end5"],[28,4,1,"","init_args"],[28,4,1,"","ref"],[28,5,1,"","renumber_from"],[28,4,1,"","sect"],[28,4,1,"","seq"],[28,4,1,"","seq_record"],[28,5,1,"","subsection"]],"seismicrna.core.rna.ct":[[28,1,1,"","parse_ct"]],"seismicrna.core.rna.ctio":[[28,1,1,"","from_ct"],[28,1,1,"","renumber_ct"],[28,1,1,"","to_ct"]],"seismicrna.core.rna.db":[[28,1,1,"","parse_db_strings"]],"seismicrna.core.rna.pair":[[28,1,1,"","dict_to_pairs"],[28,1,1,"","find_root_pairs"],[28,1,1,"","map_nested"],[28,1,1,"","pairs_to_dict"],[28,1,1,"","pairs_to_table"],[28,1,1,"","renumber_pairs"],[28,1,1,"","table_to_dict"],[28,1,1,"","table_to_pairs"]],"seismicrna.core.rna.profile":[[28,2,1,"","RNAProfile"]],"seismicrna.core.rna.profile.RNAProfile":[[28,5,1,"","get_ct_file"],[28,5,1,"","get_db_file"],[28,5,1,"","get_dms_file"],[28,5,1,"","get_fasta"],[28,5,1,"","get_varna_color_file"],[28,4,1,"","init_args"],[28,4,1,"","profile"],[28,5,1,"","to_dms"],[28,5,1,"","to_fasta"],[28,5,1,"","to_varna_color_file"]],"seismicrna.core.rna.roc":[[28,1,1,"","compute_auc"],[28,1,1,"","compute_auc_roc"],[28,1,1,"","compute_roc_curve"],[28,1,1,"","compute_rolling_auc"]],"seismicrna.core.rna.state":[[28,2,1,"","RNAState"]],"seismicrna.core.rna.state.RNAState":[[28,4,1,"","auc"],[28,5,1,"","from_struct_profile"],[28,4,1,"","roc"],[28,5,1,"","rolling_auc"]],"seismicrna.core.rna.struct":[[28,2,1,"","RNAStructure"],[28,2,1,"","Rna2dPart"],[28,2,1,"","Rna2dStem"],[28,2,1,"","Rna2dStemLoop"],[28,2,1,"","RnaJunction"]],"seismicrna.core.rna.struct.RNAStructure":[[28,4,1,"","ct_data"],[28,4,1,"","ct_text"],[28,4,1,"","ct_title"],[28,4,1,"","dict"],[28,4,1,"","init_args"],[28,4,1,"","is_paired"],[28,5,1,"","iter_root_modules"],[28,4,1,"","pairs"],[28,4,1,"","roots"]],"seismicrna.core.rna.struct.Rna2dStem":[[28,4,1,"","section3"],[28,4,1,"","section5"]],"seismicrna.core.rna.struct.Rna2dStemLoop":[[28,4,1,"","section"]],"seismicrna.core.seq":[[29,0,0,"-","fasta"],[29,0,0,"-","refs"],[29,0,0,"-","section"],[30,0,0,"-","tests"],[29,0,0,"-","xna"]],"seismicrna.core.seq.fasta":[[29,1,1,"","extract_fasta_seqname"],[29,1,1,"","format_fasta_name_line"],[29,1,1,"","format_fasta_record"],[29,1,1,"","format_fasta_seq_lines"],[29,1,1,"","get_fasta_seq"],[29,1,1,"","parse_fasta"],[29,1,1,"","valid_fasta_seqname"],[29,1,1,"","write_fasta"]],"seismicrna.core.seq.refs":[[29,2,1,"","RefSeqs"]],"seismicrna.core.seq.refs.RefSeqs":[[29,5,1,"","add"],[29,5,1,"","get"],[29,5,1,"","iter"]],"seismicrna.core.seq.section":[[29,2,1,"","RefSections"],[29,2,1,"","Section"],[29,2,1,"","SectionFinder"],[29,3,1,"","SectionTuple"],[29,1,1,"","get_coords_by_ref"],[29,1,1,"","get_sect_coords_primers"],[29,1,1,"","get_shared_index"],[29,1,1,"","hyphenate_ends"],[29,1,1,"","index_to_pos"],[29,1,1,"","index_to_seq"],[29,1,1,"","intersect"],[29,1,1,"","iter_windows"],[29,1,1,"","seq_pos_to_index"],[29,1,1,"","unite"],[29,1,1,"","verify_index_names"],[29,1,1,"","window_to_margins"]],"seismicrna.core.seq.section.RefSections":[[29,4,1,"","count"],[29,5,1,"","list"]],"seismicrna.core.seq.section.Section":[[29,3,1,"","MASK_GU"],[29,3,1,"","MASK_POLYA"],[29,3,1,"","MASK_POS"],[29,5,1,"","add_mask"],[29,4,1,"","coord"],[29,5,1,"","copy"],[29,5,1,"","get_mask"],[29,4,1,"","hyphen"],[29,4,1,"","length"],[29,5,1,"","mask_gu"],[29,4,1,"","mask_names"],[29,5,1,"","mask_polya"],[29,5,1,"","mask_pos"],[29,4,1,"","masked_bool"],[29,4,1,"","masked_int"],[29,4,1,"","range"],[29,4,1,"","range_int"],[29,4,1,"","range_one"],[29,4,1,"","ref_sect"],[29,5,1,"","renumber_from"],[29,4,1,"","size"],[29,5,1,"","subsection"],[29,5,1,"","to_dict"],[29,4,1,"","unmasked"],[29,4,1,"","unmasked_bool"],[29,4,1,"","unmasked_int"]],"seismicrna.core.seq.section.SectionFinder":[[29,5,1,"","locate"]],"seismicrna.core.seq.tests":[[30,0,0,"-","fasta_test"],[30,0,0,"-","section_test"],[30,0,0,"-","xna_test"]],"seismicrna.core.seq.tests.fasta_test":[[30,2,1,"","TestFormat"],[30,2,1,"","TestParseFasta"],[30,2,1,"","TestValidFastaSeqname"],[30,2,1,"","TestWriteFasta"]],"seismicrna.core.seq.tests.fasta_test.TestFormat":[[30,5,1,"","test_format_fasta_name_line"],[30,5,1,"","test_format_fasta_record"],[30,5,1,"","test_format_fasta_seq_lines"]],"seismicrna.core.seq.tests.fasta_test.TestParseFasta":[[30,5,1,"","test_duplicate_name"],[30,5,1,"","test_invalid_name"],[30,5,1,"","test_invalid_seq"],[30,5,1,"","test_valid_blank_line"],[30,5,1,"","test_valid_dna"],[30,5,1,"","test_valid_empty"],[30,5,1,"","test_valid_names"],[30,5,1,"","test_valid_rna"]],"seismicrna.core.seq.tests.fasta_test.TestValidFastaSeqname":[[30,5,1,"","test_blank"],[30,5,1,"","test_illegal_prefix"],[30,5,1,"","test_illegal_suffix"],[30,5,1,"","test_misformatted"],[30,5,1,"","test_name_mark"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.fasta_test.TestWriteFasta":[[30,5,1,"","test_invalid_name"],[30,5,1,"","test_no_overwrite"],[30,5,1,"","test_overwrite"],[30,5,1,"","test_valid_names"]],"seismicrna.core.seq.tests.section_test":[[30,2,1,"","TestConstants"],[30,2,1,"","TestGetSharedIndex"],[30,2,1,"","TestGetWindows"],[30,2,1,"","TestHyphenateEnds"],[30,2,1,"","TestIndexToPos"],[30,2,1,"","TestIndexToSeq"],[30,2,1,"","TestIntersect"],[30,2,1,"","TestSectionAddMask"],[30,2,1,"","TestSectionCopy"],[30,2,1,"","TestSectionEqual"],[30,2,1,"","TestSectionInit"],[30,2,1,"","TestSectionLength"],[30,2,1,"","TestSectionMaskGU"],[30,2,1,"","TestSectionMaskNames"],[30,2,1,"","TestSectionMaskPolyA"],[30,2,1,"","TestSectionMaskPos"],[30,2,1,"","TestSectionMasked"],[30,2,1,"","TestSectionRange"],[30,2,1,"","TestSectionUnmasked"],[30,2,1,"","TestSeqPosToIndex"],[30,2,1,"","TestSubsection"],[30,2,1,"","TestUnite"],[30,2,1,"","TestWindowToMargins"]],"seismicrna.core.seq.tests.section_test.TestConstants":[[30,5,1,"","test_base_name"],[30,5,1,"","test_full_name"],[30,5,1,"","test_pos_index"],[30,5,1,"","test_pos_name"],[30,5,1,"","test_seq_index_names"]],"seismicrna.core.seq.tests.section_test.TestGetSharedIndex":[[30,5,1,"","test_one_invalid"],[30,5,1,"","test_one_valid"],[30,5,1,"","test_two_invalid"],[30,5,1,"","test_two_valid"],[30,5,1,"","test_zero_invalid"],[30,5,1,"","test_zero_valid"]],"seismicrna.core.seq.tests.section_test.TestGetWindows":[[30,5,1,"","compare"],[30,5,1,"","test_1_series_size_1_min_0_excl_nan"],[30,5,1,"","test_1_series_size_1_min_0_incl_nan"],[30,5,1,"","test_1_series_size_1_min_1_excl_nan"],[30,5,1,"","test_1_series_size_1_min_1_incl_nan"],[30,5,1,"","test_1_series_size_2_min_1_excl_nan"],[30,5,1,"","test_1_series_size_2_min_1_incl_nan"],[30,5,1,"","test_1_series_size_2_min_2_excl_nan"],[30,5,1,"","test_1_series_size_2_min_2_incl_nan"],[30,5,1,"","test_2_series_size_1_min_0_excl_nan"],[30,5,1,"","test_2_series_size_1_min_0_incl_nan"],[30,5,1,"","test_2_series_size_1_min_1_excl_nan"],[30,5,1,"","test_2_series_size_1_min_1_incl_nan"],[30,5,1,"","test_2_series_size_2_min_0_excl_nan"],[30,5,1,"","test_2_series_size_2_min_0_incl_nan"],[30,5,1,"","test_2_series_size_2_min_1_excl_nan"],[30,5,1,"","test_2_series_size_2_min_1_incl_nan"],[30,5,1,"","test_2_series_size_2_min_2_excl_nan"],[30,5,1,"","test_2_series_size_2_min_2_incl_nan"],[30,5,1,"","test_empty"]],"seismicrna.core.seq.tests.section_test.TestHyphenateEnds":[[30,5,1,"","test_hyphenate"]],"seismicrna.core.seq.tests.section_test.TestIndexToPos":[[30,5,1,"","test_valid_full"],[30,5,1,"","test_valid_noncontig"],[30,5,1,"","test_valid_slice"]],"seismicrna.core.seq.tests.section_test.TestIndexToSeq":[[30,5,1,"","test_invalid_noncontig"],[30,5,1,"","test_valid_empty_seq"],[30,5,1,"","test_valid_full"],[30,5,1,"","test_valid_no_pos"],[30,5,1,"","test_valid_noncontig"],[30,5,1,"","test_valid_slice"]],"seismicrna.core.seq.tests.section_test.TestIntersect":[[30,5,1,"","test_diff_refs"],[30,5,1,"","test_diff_seqs"],[30,5,1,"","test_empty_invalid"],[30,5,1,"","test_one_full"],[30,5,1,"","test_one_full_named"],[30,5,1,"","test_one_masked"],[30,5,1,"","test_one_slice"],[30,5,1,"","test_three_overlapping"],[30,5,1,"","test_two_disjoint"],[30,5,1,"","test_two_full"],[30,5,1,"","test_two_masked"],[30,5,1,"","test_two_overlapping"]],"seismicrna.core.seq.tests.section_test.TestSectionAddMask":[[30,5,1,"","test_add_mask"],[30,5,1,"","test_add_mask_invalid"],[30,5,1,"","test_add_mask_invert"],[30,5,1,"","test_add_overlapping_masks"],[30,5,1,"","test_add_unordered_mask"]],"seismicrna.core.seq.tests.section_test.TestSectionCopy":[[30,5,1,"","test_copy"]],"seismicrna.core.seq.tests.section_test.TestSectionEqual":[[30,5,1,"","test_diff_end3"],[30,5,1,"","test_diff_end5"],[30,5,1,"","test_diff_full"],[30,5,1,"","test_diff_mask_name"],[30,5,1,"","test_diff_mask_pos"],[30,5,1,"","test_diff_name"],[30,5,1,"","test_diff_ref"],[30,5,1,"","test_diff_seq"],[30,5,1,"","test_diff_seq5"],[30,5,1,"","test_equal_full"],[30,5,1,"","test_equal_mask"],[30,5,1,"","test_equal_part"]],"seismicrna.core.seq.tests.section_test.TestSectionInit":[[30,5,1,"","test_full"],[30,5,1,"","test_full_blank_name"],[30,5,1,"","test_full_end3"],[30,5,1,"","test_full_end5"],[30,5,1,"","test_full_given_name"],[30,5,1,"","test_partial_reflen_equal"],[30,5,1,"","test_partial_reflen_greater"],[30,5,1,"","test_partial_reflen_less"],[30,5,1,"","test_partial_seq5_equal"],[30,5,1,"","test_partial_seq5_greater"],[30,5,1,"","test_partial_seq5_less"],[30,5,1,"","test_partial_seq5_reflen"],[30,5,1,"","test_partial_slice"],[30,5,1,"","test_partial_slice_invalid_end3"],[30,5,1,"","test_partial_slice_invalid_end5"],[30,5,1,"","test_partial_slice_invalid_reflen"],[30,5,1,"","test_partial_slice_invalid_seq5"],[30,5,1,"","test_slice_end3_equal"],[30,5,1,"","test_slice_end3_greater"],[30,5,1,"","test_slice_end3_less"],[30,5,1,"","test_slice_end5_end3"],[30,5,1,"","test_slice_end5_end3_invalid"],[30,5,1,"","test_slice_end5_equal"],[30,5,1,"","test_slice_end5_greater"],[30,5,1,"","test_slice_end5_less"]],"seismicrna.core.seq.tests.section_test.TestSectionLength":[[30,5,1,"","test_full_lengths"],[30,5,1,"","test_partial_lengths"],[30,5,1,"","test_slice_lengths"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskGU":[[30,5,1,"","test_find_gu"],[30,5,1,"","test_mask_gu"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskNames":[[30,5,1,"","test_get_mask"],[30,5,1,"","test_mask_names"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskPolyA":[[30,5,1,"","test_find_polya"],[30,5,1,"","test_mask_polya"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskPos":[[30,5,1,"","test_mask_pos"]],"seismicrna.core.seq.tests.section_test.TestSectionMasked":[[30,5,1,"","test_masked_bool"],[30,5,1,"","test_masked_int"]],"seismicrna.core.seq.tests.section_test.TestSectionRange":[[30,5,1,"","test_range"],[30,5,1,"","test_range_int"],[30,5,1,"","test_range_one"]],"seismicrna.core.seq.tests.section_test.TestSectionUnmasked":[[30,5,1,"","test_size"],[30,5,1,"","test_unmasked"],[30,5,1,"","test_unmasked_bool"],[30,5,1,"","test_unmasked_int"]],"seismicrna.core.seq.tests.section_test.TestSeqPosToIndex":[[30,5,1,"","test_invalid_dup_1"],[30,5,1,"","test_invalid_empty_seq_1"],[30,5,1,"","test_invalid_empty_seq_2"],[30,5,1,"","test_invalid_empty_seq_3"],[30,5,1,"","test_invalid_full_0"],[30,5,1,"","test_invalid_greater_end_9"],[30,5,1,"","test_invalid_less_start_2"],[30,5,1,"","test_invalid_unsort_1"],[30,5,1,"","test_valid_empty_1"],[30,5,1,"","test_valid_empty_seq"],[30,5,1,"","test_valid_full_1"],[30,5,1,"","test_valid_full_9"],[30,5,1,"","test_valid_noncontig_2"],[30,5,1,"","test_valid_slice_6"]],"seismicrna.core.seq.tests.section_test.TestSubsection":[[30,5,1,"","test_full_section_full_length_sub"],[30,5,1,"","test_full_section_full_sub"],[30,5,1,"","test_full_section_full_sub_end3"],[30,5,1,"","test_full_section_full_sub_end5"],[30,5,1,"","test_full_section_full_sub_name"],[30,5,1,"","test_partial_trunc_section_trunc_sub"],[30,5,1,"","test_trunc_section_full_sub"],[30,5,1,"","test_trunc_section_trunc_sub"]],"seismicrna.core.seq.tests.section_test.TestUnite":[[30,5,1,"","test_diff_refs"],[30,5,1,"","test_diff_seqs"],[30,5,1,"","test_empty_invalid"],[30,5,1,"","test_one_full"],[30,5,1,"","test_one_full_named"],[30,5,1,"","test_one_masked"],[30,5,1,"","test_one_slice"],[30,5,1,"","test_two_disjoint"],[30,5,1,"","test_two_disjoint_refseq"],[30,5,1,"","test_two_disjoint_wrong_refseq"],[30,5,1,"","test_two_full"],[30,5,1,"","test_two_masked"],[30,5,1,"","test_two_overlapping"],[30,5,1,"","test_two_overlapping_refseq"]],"seismicrna.core.seq.tests.section_test.TestWindowToMargins":[[30,5,1,"","test_window_0"],[30,5,1,"","test_window_float"],[30,5,1,"","test_window_length"],[30,5,1,"","test_window_margins"]],"seismicrna.core.seq.tests.xna_test":[[30,2,1,"","TestDNA"],[30,2,1,"","TestExpandDegenerateSeq"],[30,2,1,"","TestRNA"],[30,2,1,"","TestXNA"]],"seismicrna.core.seq.tests.xna_test.TestDNA":[[30,5,1,"","test_alph"],[30,5,1,"","test_bool"],[30,5,1,"","test_get_alphaset"],[30,5,1,"","test_get_comp"],[30,5,1,"","test_get_comptrans"],[30,5,1,"","test_get_nonalphaset"],[30,5,1,"","test_invalid_bases"],[30,5,1,"","test_picto"],[30,5,1,"","test_random"],[30,5,1,"","test_reverse_complement"],[30,5,1,"","test_slice"],[30,5,1,"","test_to_array"],[30,5,1,"","test_transcribe"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.xna_test.TestExpandDegenerateSeq":[[30,5,1,"","test_one_degenerate"],[30,5,1,"","test_two_degenerate"],[30,5,1,"","test_zero_degenerate"]],"seismicrna.core.seq.tests.xna_test.TestRNA":[[30,5,1,"","test_alph"],[30,5,1,"","test_bool"],[30,5,1,"","test_get_alphaset"],[30,5,1,"","test_get_comp"],[30,5,1,"","test_get_comptrans"],[30,5,1,"","test_get_nonalphaset"],[30,5,1,"","test_invalid_bases"],[30,5,1,"","test_picto"],[30,5,1,"","test_random"],[30,5,1,"","test_reverse_complement"],[30,5,1,"","test_reverse_transcribe"],[30,5,1,"","test_slice"],[30,5,1,"","test_to_array"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.xna_test.TestXNA":[[30,5,1,"","test_abstract_base_class"],[30,5,1,"","test_dict_str_dna_rna"],[30,5,1,"","test_equal_dna_dna"],[30,5,1,"","test_equal_rna_rna"],[30,5,1,"","test_hashable_dna"],[30,5,1,"","test_hashable_rna"],[30,5,1,"","test_not_equal_dna_rna"],[30,5,1,"","test_not_equal_dna_str"],[30,5,1,"","test_not_equal_rna_str"],[30,5,1,"","test_set_str_dna_rna"]],"seismicrna.core.seq.xna":[[29,2,1,"","CompressedSeq"],[29,2,1,"","DNA"],[29,2,1,"","RNA"],[29,2,1,"","XNA"],[29,1,1,"","decompress"],[29,1,1,"","expand_degenerate_seq"]],"seismicrna.core.seq.xna.CompressedSeq":[[29,5,1,"","decompress"],[29,4,1,"","type"]],"seismicrna.core.seq.xna.DNA":[[29,5,1,"","alph"],[29,5,1,"","pict"],[29,5,1,"","tr"]],"seismicrna.core.seq.xna.RNA":[[29,5,1,"","alph"],[29,5,1,"","pict"],[29,5,1,"","rt"]],"seismicrna.core.seq.xna.XNA":[[29,5,1,"","__add__"],[29,5,1,"","__bool__"],[29,5,1,"","__eq__"],[29,5,1,"","__getitem__"],[29,5,1,"","__hash__"],[29,5,1,"","__mul__"],[29,5,1,"","__repr__"],[29,5,1,"","alph"],[29,4,1,"","array"],[29,5,1,"","compress"],[29,5,1,"","four"],[29,5,1,"","get_alphaset"],[29,5,1,"","get_comp"],[29,5,1,"","get_comptrans"],[29,5,1,"","get_nonalphaset"],[29,5,1,"","get_other_iupac"],[29,5,1,"","get_pictrans"],[29,5,1,"","pict"],[29,4,1,"","picto"],[29,5,1,"","random"],[29,4,1,"","rc"],[29,5,1,"","t_or_u"]],"seismicrna.core.tests":[[31,0,0,"-","header_test"]],"seismicrna.core.tests.header_test":[[31,2,1,"","TestClustHeader"],[31,2,1,"","TestConstants"],[31,2,1,"","TestEqualHeaders"],[31,2,1,"","TestFormatClustName"],[31,2,1,"","TestFormatClustNames"],[31,2,1,"","TestHeader"],[31,2,1,"","TestIndexClusts"],[31,2,1,"","TestIndexOrderClusts"],[31,2,1,"","TestIndexOrders"],[31,2,1,"","TestIndexOrdersClusts"],[31,2,1,"","TestListClusts"],[31,2,1,"","TestListOrderClusts"],[31,2,1,"","TestListOrders"],[31,2,1,"","TestListOrdersClusts"],[31,2,1,"","TestMakeHeader"],[31,2,1,"","TestParseHeader"],[31,2,1,"","TestRelClustHeader"],[31,2,1,"","TestRelHeader"],[31,2,1,"","TestValidateOrderClust"]],"seismicrna.core.tests.header_test.TestClustHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_clusts"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_min_order"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_names"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_orders"],[31,5,1,"","test_select_clust"],[31,5,1,"","test_select_clusts"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_invalid_clust"],[31,5,1,"","test_select_invalid_order"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_order"],[31,5,1,"","test_select_order_clust_empty"],[31,5,1,"","test_select_order_clust_exist"],[31,5,1,"","test_select_orders"],[31,5,1,"","test_select_orders_clusts_exist"],[31,5,1,"","test_signature"]],"seismicrna.core.tests.header_test.TestConstants":[[31,5,1,"","test_average_prefix"],[31,5,1,"","test_clust_name"],[31,5,1,"","test_cluster_prefix"],[31,5,1,"","test_order_name"],[31,5,1,"","test_rel_name"]],"seismicrna.core.tests.header_test.TestEqualHeaders":[[31,5,1,"","test_clustheaders"],[31,5,1,"","test_different_types"],[31,5,1,"","test_relclustheaders"],[31,5,1,"","test_relheaders"]],"seismicrna.core.tests.header_test.TestFormatClustName":[[31,5,1,"","test_positive"],[31,5,1,"","test_zero_zero_allowed"]],"seismicrna.core.tests.header_test.TestFormatClustNames":[[31,5,1,"","test_positive_invalid_dups"],[31,5,1,"","test_positive_no_dups"],[31,5,1,"","test_positive_valid_dups"],[31,5,1,"","test_zero_zero_allowed"]],"seismicrna.core.tests.header_test.TestHeader":[[31,5,1,"","test_abstract"]],"seismicrna.core.tests.header_test.TestIndexClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrderClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrders":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrdersClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestListClusts":[[31,5,1,"","test_negative"],[31,5,1,"","test_positive"],[31,5,1,"","test_zero"]],"seismicrna.core.tests.header_test.TestListOrderClusts":[[31,5,1,"","test_positive"],[31,5,1,"","test_zero"]],"seismicrna.core.tests.header_test.TestListOrders":[[31,5,1,"","test_negative_none"],[31,5,1,"","test_negative_positive"],[31,5,1,"","test_negative_zero"],[31,5,1,"","test_positive_none"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_positive_zero"],[31,5,1,"","test_zero_none"],[31,5,1,"","test_zero_one"],[31,5,1,"","test_zero_two"],[31,5,1,"","test_zero_zero"]],"seismicrna.core.tests.header_test.TestListOrdersClusts":[[31,5,1,"","test_positive_none"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_zero_none"],[31,5,1,"","test_zero_one"]],"seismicrna.core.tests.header_test.TestMakeHeader":[[31,5,1,"","test_all"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_none"],[31,5,1,"","test_rels"]],"seismicrna.core.tests.header_test.TestParseHeader":[[31,5,1,"","test_clust"],[31,5,1,"","test_extra_index_names"],[31,5,1,"","test_extra_values"],[31,5,1,"","test_invalid_numeric"],[31,5,1,"","test_missing_index_names"],[31,5,1,"","test_missing_values"],[31,5,1,"","test_none"],[31,5,1,"","test_nonnumeric"],[31,5,1,"","test_rel_index"],[31,5,1,"","test_rel_index_invalid_name"],[31,5,1,"","test_rel_index_repeated"],[31,5,1,"","test_rel_index_valid_name"],[31,5,1,"","test_rel_multiindex"],[31,5,1,"","test_relclust"]],"seismicrna.core.tests.header_test.TestRelClustHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_modified_all"],[31,5,1,"","test_modified_empty_rels"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_max_order_0"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_nullified"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_select_clust"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_extra_emptystr"],[31,5,1,"","test_select_extra_none"],[31,5,1,"","test_select_extra_zero"],[31,5,1,"","test_select_invalid_clust"],[31,5,1,"","test_select_invalid_order"],[31,5,1,"","test_select_invalid_rel"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_order"],[31,5,1,"","test_select_order_clust_empty"],[31,5,1,"","test_select_order_clust_exist"],[31,5,1,"","test_select_rel"],[31,5,1,"","test_signature"]],"seismicrna.core.tests.header_test.TestRelHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_clusts"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_modified_empty_rels"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_min_order"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_names"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_orders"],[31,5,1,"","test_rels_duplicated"],[31,5,1,"","test_rels_empty"],[31,5,1,"","test_rels_normal"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_extra_zero"],[31,5,1,"","test_select_invalid"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_one_rels"],[31,5,1,"","test_select_rel"],[31,5,1,"","test_select_two_rels"],[31,5,1,"","test_signature"],[31,5,1,"","test_size"]],"seismicrna.core.tests.header_test.TestValidateOrderClust":[[31,5,1,"","test_float_clust"],[31,5,1,"","test_float_order"],[31,5,1,"","test_negative_zero_allowed"],[31,5,1,"","test_one_zero_allowed"],[31,5,1,"","test_one_zero_unallowed"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_zero_negative_allowed"],[31,5,1,"","test_zero_one_allowed"],[31,5,1,"","test_zero_one_unallowed"],[31,5,1,"","test_zero_zero_allowed"],[31,5,1,"","test_zero_zero_unallowed"]],"seismicrna.core.types":[[12,1,1,"","fit_uint_size"],[12,1,1,"","fit_uint_type"],[12,1,1,"","get_byte_dtype"],[12,1,1,"","get_dtype"],[12,1,1,"","get_max_uint"],[12,1,1,"","get_max_value"],[12,1,1,"","get_uint_dtype"],[12,1,1,"","get_uint_size"],[12,1,1,"","get_uint_type"]],"seismicrna.core.version":[[12,1,1,"","format_version"],[12,1,1,"","parse_version"]],"seismicrna.core.write":[[12,1,1,"","need_write"],[12,1,1,"","write_mode"]],"seismicrna.demult":[[32,0,0,"-","demultiplex"],[32,0,0,"-","main"]],"seismicrna.demult.demultiplex":[[32,2,1,"","Sequence_Obj"],[32,1,1,"","append_files"],[32,1,1,"","check_all_done"],[32,1,1,"","check_done"],[32,1,1,"","create_report"],[32,1,1,"","demultiplex_run"],[32,1,1,"","finds_multigrepped_reads"],[32,1,1,"","grep_both_fastq"],[32,1,1,"","make_dict_from_fasta"],[32,1,1,"","make_sequence_objects_from_csv"],[32,1,1,"","makes_dict_from_fastq"],[32,1,1,"","parallel_grepping"],[32,1,1,"","regular_grepping"],[32,1,1,"","resolve_or_analyze_multigrepped_reads"],[32,1,1,"","reverse_compliment"],[32,1,1,"","run_multi_greps"],[32,1,1,"","run_seqkit_grep"],[32,1,1,"","run_seqkit_grep_function"],[32,2,1,"","super_fastq"]],"seismicrna.demult.demultiplex.super_fastq":[[32,5,1,"","check_exists"],[32,5,1,"","check_set"],[32,5,1,"","destroy_temp_data"],[32,5,1,"","fastq_to_dict"],[32,5,1,"","split_fastq"],[32,5,1,"","super_write_fastqs"]],"seismicrna.demult.main":[[32,1,1,"","run"]],"seismicrna.export":[[33,0,0,"-","main"],[33,0,0,"-","meta"],[33,0,0,"-","web"]],"seismicrna.export.main":[[33,1,1,"","run"]],"seismicrna.export.meta":[[33,1,1,"","combine_metadata"],[33,1,1,"","parse_refs_metadata"],[33,1,1,"","parse_samples_metadata"]],"seismicrna.export.web":[[33,1,1,"","conform_series"],[33,1,1,"","export_sample"],[33,1,1,"","format_metadata"],[33,1,1,"","get_db_structs"],[33,1,1,"","get_ref_metadata"],[33,1,1,"","get_sample_data"],[33,1,1,"","get_sample_metadata"],[33,1,1,"","get_sect_metadata"],[33,1,1,"","get_table_data"],[33,1,1,"","iter_clust_table_data"],[33,1,1,"","iter_pos_table_data"],[33,1,1,"","iter_pos_table_series"],[33,1,1,"","iter_pos_table_struct"],[33,1,1,"","iter_read_table_data"],[33,1,1,"","iter_table_data"]],"seismicrna.fold":[[34,0,0,"-","load"],[34,0,0,"-","main"],[34,0,0,"-","report"],[34,0,0,"-","rnastructure"]],"seismicrna.fold.load":[[34,1,1,"","find_ct_files"],[34,1,1,"","load_ct_structs"]],"seismicrna.fold.main":[[34,1,1,"","fold_profile"],[34,1,1,"","fold_section"],[34,1,1,"","run"]],"seismicrna.fold.report":[[34,2,1,"","FoldReport"]],"seismicrna.fold.report.FoldReport":[[34,5,1,"","auto_fields"],[34,5,1,"","dir_seg_types"],[34,5,1,"","fields"],[34,5,1,"","file_seg_type"]],"seismicrna.fold.rnastructure":[[34,1,1,"","ct2dot"],[34,1,1,"","dot2ct"],[34,1,1,"","fold"],[34,1,1,"","format_retitled_ct_line"],[34,1,1,"","parse_energy"],[34,1,1,"","parse_rnastructure_ct_title"],[34,1,1,"","retitle_ct_structures"]],"seismicrna.graph":[[35,0,0,"-","aucroll"],[35,0,0,"-","base"],[35,0,0,"-","color"],[35,0,0,"-","corroll"],[35,0,0,"-","delprof"],[35,0,0,"-","hist"],[35,0,0,"-","histpos"],[35,0,0,"-","histread"],[35,0,0,"-","histrel"],[35,0,0,"-","main"],[35,0,0,"-","onestruct"],[35,0,0,"-","onetable"],[35,0,0,"-","profile"],[35,0,0,"-","rel"],[35,0,0,"-","roc"],[35,0,0,"-","roll"],[35,0,0,"-","scatter"],[35,0,0,"-","trace"],[35,0,0,"-","twotable"]],"seismicrna.graph.aucroll":[[35,2,1,"","RollingAUCGraph"],[35,2,1,"","RollingAUCRunner"],[35,2,1,"","RollingAUCWriter"]],"seismicrna.graph.aucroll.RollingAUCGraph":[[35,4,1,"","data"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,4,1,"","profile_names"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.aucroll.RollingAUCRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","var_params"]],"seismicrna.graph.aucroll.RollingAUCWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.base":[[35,2,1,"","GraphBase"],[35,2,1,"","GraphRunner"],[35,2,1,"","GraphWriter"],[35,2,1,"","PosGraphRunner"],[35,2,1,"","PosGraphWriter"],[35,2,1,"","ReadGraphRunner"],[35,2,1,"","ReadGraphWriter"],[35,1,1,"","cgroup_table"],[35,1,1,"","get_action_name"],[35,1,1,"","make_index"],[35,1,1,"","make_path_subject"],[35,1,1,"","make_title_action_sample"]],"seismicrna.graph.base.GraphBase":[[35,4,1,"","codestring"],[35,4,1,"","col_index"],[35,4,1,"","col_titles"],[35,4,1,"","data"],[35,4,1,"","data_kind"],[35,4,1,"","details"],[35,4,1,"","figure"],[35,5,1,"","get_path"],[35,5,1,"","get_path_fields"],[35,5,1,"","get_path_segs"],[35,5,1,"","get_traces"],[35,4,1,"","graph_filename"],[35,5,1,"","graph_kind"],[35,4,1,"","ncols"],[35,4,1,"","nrows"],[35,4,1,"","path_subject"],[35,4,1,"","predicate"],[35,4,1,"","ref"],[35,4,1,"","rel_names"],[35,4,1,"","relationships"],[35,4,1,"","row_index"],[35,4,1,"","row_titles"],[35,4,1,"","sample"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title"],[35,4,1,"","title_action_sample"],[35,5,1,"","what"],[35,5,1,"","write"],[35,5,1,"","write_csv"],[35,5,1,"","write_html"],[35,5,1,"","write_pdf"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.base.GraphRunner":[[35,5,1,"","get_table_finder"],[35,5,1,"","get_writer_type"],[35,5,1,"","list_table_files"],[35,5,1,"","params"],[35,5,1,"","run"],[35,5,1,"","universal_input_params"],[35,5,1,"","universal_output_params"],[35,5,1,"","var_params"]],"seismicrna.graph.base.GraphWriter":[[35,5,1,"","get_table_loader"],[35,5,1,"","iter_graphs"],[35,5,1,"","load_table_file"],[35,5,1,"","write"]],"seismicrna.graph.base.PosGraphRunner":[[35,5,1,"","get_table_finder"]],"seismicrna.graph.base.PosGraphWriter":[[35,5,1,"","get_table_loader"]],"seismicrna.graph.base.ReadGraphRunner":[[35,5,1,"","get_table_finder"]],"seismicrna.graph.base.ReadGraphWriter":[[35,5,1,"","get_table_loader"]],"seismicrna.graph.color":[[35,2,1,"","ColorMap"],[35,2,1,"","ColorMapGraph"],[35,2,1,"","RelColorMap"],[35,2,1,"","SeqColorMap"],[35,1,1,"","get_cmap"],[35,1,1,"","get_colormaps"]],"seismicrna.graph.color.ColorMap":[[35,5,1,"","get"]],"seismicrna.graph.color.ColorMapGraph":[[35,4,1,"","cmap"],[35,5,1,"","get_cmap_type"]],"seismicrna.graph.corroll":[[35,2,1,"","RollingCorrelationGraph"],[35,2,1,"","RollingCorrelationRunner"],[35,2,1,"","RollingCorrelationWriter"]],"seismicrna.graph.corroll.RollingCorrelationGraph":[[35,4,1,"","details"],[35,5,1,"","graph_kind"],[35,4,1,"","predicate"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.corroll.RollingCorrelationRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","var_params"]],"seismicrna.graph.corroll.RollingCorrelationWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.delprof":[[35,2,1,"","DeltaProfileGraph"],[35,2,1,"","DeltaProfileRunner"],[35,2,1,"","DeltaProfileWriter"]],"seismicrna.graph.delprof.DeltaProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.delprof.DeltaProfileRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.delprof.DeltaProfileWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.hist":[[35,2,1,"","HistogramGraph"],[35,2,1,"","HistogramRunner"],[35,1,1,"","get_edges_index"]],"seismicrna.graph.hist.HistogramGraph":[[35,5,1,"","get_bounds"],[35,5,1,"","get_edges"]],"seismicrna.graph.hist.HistogramRunner":[[35,5,1,"","var_params"]],"seismicrna.graph.histpos":[[35,2,1,"","PosHistogramGraph"],[35,2,1,"","PosHistogramRunner"],[35,2,1,"","PosHistogramWriter"]],"seismicrna.graph.histpos.PosHistogramGraph":[[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.histpos.PosHistogramRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.histpos.PosHistogramWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.histread":[[35,2,1,"","ReadHistogramGraph"],[35,2,1,"","ReadHistogramRunner"],[35,2,1,"","ReadHistogramWriter"]],"seismicrna.graph.histread.ReadHistogramGraph":[[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.histread.ReadHistogramRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.histread.ReadHistogramWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.histrel":[[35,2,1,"","RelHistogramGraph"],[35,2,1,"","RelHistogramRunner"],[35,2,1,"","RelHistogramWriter"]],"seismicrna.graph.histrel.RelHistogramGraph":[[35,4,1,"","data"],[35,4,1,"","data_header"],[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,4,1,"","x_title"]],"seismicrna.graph.histrel.RelHistogramWriter":[[35,5,1,"","get_graph"],[35,5,1,"","get_graph_type"]],"seismicrna.graph.onestruct":[[35,2,1,"","StructOneTableGraph"],[35,2,1,"","StructOneTableRunner"]],"seismicrna.graph.onestruct.StructOneTableGraph":[[35,5,1,"","get_path_fields"],[35,5,1,"","iter_profiles"],[35,5,1,"","iter_states"],[35,4,1,"","path_subject"]],"seismicrna.graph.onestruct.StructOneTableRunner":[[35,5,1,"","var_params"]],"seismicrna.graph.onetable":[[35,2,1,"","OneTableGraph"],[35,2,1,"","OneTableRunner"],[35,2,1,"","OneTableWriter"]],"seismicrna.graph.onetable.OneTableGraph":[[35,4,1,"","action"],[35,4,1,"","col_index"],[35,4,1,"","path_subject"],[35,4,1,"","ref"],[35,4,1,"","row_index"],[35,4,1,"","sample"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title_action_sample"]],"seismicrna.graph.onetable.OneTableRunner":[[35,5,1,"","run"]],"seismicrna.graph.onetable.OneTableWriter":[[35,5,1,"","get_graph"],[35,5,1,"","iter_graphs"],[35,4,1,"","table"]],"seismicrna.graph.profile":[[35,2,1,"","MultiRelsProfileGraph"],[35,2,1,"","OneRelProfileGraph"],[35,2,1,"","ProfileGraph"],[35,2,1,"","ProfileRunner"],[35,2,1,"","ProfileWriter"]],"seismicrna.graph.profile.MultiRelsProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","what"]],"seismicrna.graph.profile.OneRelProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","what"]],"seismicrna.graph.profile.ProfileGraph":[[35,4,1,"","data"],[35,4,1,"","data_header"],[35,5,1,"","graph_kind"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.profile.ProfileRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.profile.ProfileWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.rel":[[35,2,1,"","MultiRelsGraph"],[35,2,1,"","OneRelGraph"]],"seismicrna.graph.rel.MultiRelsGraph":[[35,4,1,"","codestring"],[35,4,1,"","rel_names"]],"seismicrna.graph.rel.OneRelGraph":[[35,4,1,"","codestring"],[35,4,1,"","rel_name"],[35,4,1,"","rel_names"]],"seismicrna.graph.roc":[[35,2,1,"","ROCGraph"],[35,2,1,"","ROCRunner"],[35,2,1,"","ROCWriter"],[35,1,1,"","rename_columns"]],"seismicrna.graph.roc.ROCGraph":[[35,4,1,"","data"],[35,4,1,"","fpr"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,4,1,"","profile_names"],[35,4,1,"","tpr"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.roc.ROCRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.roc.ROCWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.roll":[[35,2,1,"","RollingGraph"]],"seismicrna.graph.roll.RollingGraph":[[35,4,1,"","details"],[35,4,1,"","predicate"],[35,4,1,"","x_title"]],"seismicrna.graph.scatter":[[35,2,1,"","ScatterPlotGraph"],[35,2,1,"","ScatterPlotRunner"],[35,2,1,"","ScatterPlotWriter"]],"seismicrna.graph.scatter.ScatterPlotGraph":[[35,4,1,"","data"],[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.scatter.ScatterPlotRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.scatter.ScatterPlotWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.trace":[[35,1,1,"","get_hist_trace"],[35,1,1,"","get_roc_trace"],[35,1,1,"","get_rolling_auc_trace"],[35,1,1,"","get_seq_base_bar_trace"],[35,1,1,"","get_seq_base_scatter_trace"],[35,1,1,"","get_seq_line_trace"],[35,1,1,"","get_seq_stack_bar_trace"],[35,1,1,"","iter_hist_traces"],[35,1,1,"","iter_roc_traces"],[35,1,1,"","iter_rolling_auc_traces"],[35,1,1,"","iter_seq_base_bar_traces"],[35,1,1,"","iter_seq_base_scatter_traces"],[35,1,1,"","iter_seq_line_traces"],[35,1,1,"","iter_seqbar_stack_traces"]],"seismicrna.graph.twotable":[[35,2,1,"","TwoTableGraph"],[35,2,1,"","TwoTableMergedGraph"],[35,2,1,"","TwoTableRunner"],[35,2,1,"","TwoTableWriter"],[35,1,1,"","iter_pos_table_pairs"],[35,1,1,"","iter_read_table_pairs"]],"seismicrna.graph.twotable.TwoTableGraph":[[35,4,1,"","action1"],[35,4,1,"","action2"],[35,4,1,"","action_sample1"],[35,4,1,"","action_sample2"],[35,4,1,"","col_index"],[35,4,1,"","data1"],[35,4,1,"","data2"],[35,4,1,"","path_subject"],[35,4,1,"","path_subject1"],[35,4,1,"","path_subject2"],[35,4,1,"","ref"],[35,4,1,"","row_index"],[35,4,1,"","sample"],[35,4,1,"","sample1"],[35,4,1,"","sample2"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title_action_sample"]],"seismicrna.graph.twotable.TwoTableMergedGraph":[[35,4,1,"","data"],[35,5,1,"","get_traces"]],"seismicrna.graph.twotable.TwoTableRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","run"],[35,5,1,"","var_params"]],"seismicrna.graph.twotable.TwoTableWriter":[[35,5,1,"","get_graph_type"],[35,5,1,"","iter_graphs"],[35,4,1,"","table1"],[35,4,1,"","table2"]],"seismicrna.join":[[36,0,0,"-","clusts"],[36,0,0,"-","data"],[36,0,0,"-","main"],[36,0,0,"-","report"]],"seismicrna.join.clusts":[[36,1,1,"","parse_join_clusts_file"]],"seismicrna.join.data":[[36,2,1,"","JoinClusterMutsDataset"],[36,2,1,"","JoinClusterReadDataset"],[36,2,1,"","JoinMaskMutsDataset"],[36,2,1,"","JoinMaskReadDataset"],[36,2,1,"","JoinMutsDataset"]],"seismicrna.join.data.JoinClusterMutsDataset":[[36,5,1,"","get_dataset1_load_func"],[36,5,1,"","get_dataset2_type"]],"seismicrna.join.data.JoinClusterReadDataset":[[36,4,1,"","clusts"],[36,5,1,"","get_dataset_load_func"],[36,5,1,"","get_report_type"],[36,4,1,"","max_order"]],"seismicrna.join.data.JoinMaskMutsDataset":[[36,5,1,"","get_dataset2_type"]],"seismicrna.join.data.JoinMaskReadDataset":[[36,5,1,"","get_dataset_load_func"],[36,5,1,"","get_report_type"],[36,4,1,"","min_mut_gap"],[36,4,1,"","pos_kept"]],"seismicrna.join.data.JoinMutsDataset":[[36,4,1,"","sects"]],"seismicrna.join.main":[[36,1,1,"","join_sections"],[36,1,1,"","run"]],"seismicrna.join.report":[[36,2,1,"","JoinClusterReport"],[36,2,1,"","JoinMaskReport"]],"seismicrna.join.report.JoinClusterReport":[[36,5,1,"","auto_fields"],[36,5,1,"","fields"],[36,5,1,"","file_seg_type"]],"seismicrna.join.report.JoinMaskReport":[[36,5,1,"","auto_fields"],[36,5,1,"","fields"],[36,5,1,"","file_seg_type"]],"seismicrna.lists":[[37,0,0,"-","listpos"],[37,0,0,"-","lists"]],"seismicrna.lists.listpos":[[37,1,1,"","find_pos"],[37,1,1,"","list_pos"],[37,1,1,"","run"]],"seismicrna.lists.lists":[[37,1,1,"","get_list_path"]],"seismicrna.mask":[[38,0,0,"-","batch"],[38,0,0,"-","data"],[38,0,0,"-","io"],[38,0,0,"-","main"],[38,0,0,"-","report"],[38,0,0,"-","write"]],"seismicrna.mask.batch":[[38,2,1,"","MaskMutsBatch"],[38,2,1,"","MaskReadBatch"],[38,1,1,"","apply_mask"]],"seismicrna.mask.batch.MaskReadBatch":[[38,4,1,"","read_nums"]],"seismicrna.mask.data":[[38,2,1,"","MaskMutsDataset"],[38,2,1,"","MaskReadDataset"]],"seismicrna.mask.data.MaskMutsDataset":[[38,3,1,"","MASK_NAME"],[38,5,1,"","get_dataset1_load_func"],[38,5,1,"","get_dataset2_type"],[38,4,1,"","min_mut_gap"],[38,4,1,"","pattern"],[38,4,1,"","section"]],"seismicrna.mask.data.MaskReadDataset":[[38,5,1,"","get_batch_type"],[38,5,1,"","get_report_type"],[38,4,1,"","min_mut_gap"],[38,4,1,"","pattern"],[38,4,1,"","pos_kept"]],"seismicrna.mask.io":[[38,2,1,"","MaskBatchIO"],[38,2,1,"","MaskIO"]],"seismicrna.mask.io.MaskBatchIO":[[38,5,1,"","file_seg_type"]],"seismicrna.mask.io.MaskIO":[[38,5,1,"","auto_fields"]],"seismicrna.mask.main":[[38,1,1,"","load_sections"],[38,1,1,"","run"]],"seismicrna.mask.report":[[38,2,1,"","MaskReport"]],"seismicrna.mask.report.MaskReport":[[38,5,1,"","auto_fields"],[38,5,1,"","fields"],[38,5,1,"","file_seg_type"]],"seismicrna.mask.write":[[38,2,1,"","RelMasker"],[38,1,1,"","mask_section"]],"seismicrna.mask.write.RelMasker":[[38,3,1,"","CHECKSUM_KEY"],[38,3,1,"","MASK_POS_FMUT"],[38,3,1,"","MASK_POS_NINFO"],[38,3,1,"","MASK_READ_FINFO"],[38,3,1,"","MASK_READ_FMUT"],[38,3,1,"","MASK_READ_GAP"],[38,3,1,"","MASK_READ_INIT"],[38,3,1,"","MASK_READ_KEPT"],[38,3,1,"","PATTERN_KEY"],[38,5,1,"","create_report"],[38,5,1,"","mask"],[38,4,1,"","n_batches"],[38,4,1,"","n_reads_init"],[38,4,1,"","n_reads_kept"],[38,4,1,"","n_reads_max_fmut"],[38,4,1,"","n_reads_min_finfo"],[38,4,1,"","n_reads_min_gap"],[38,4,1,"","pos_gu"],[38,4,1,"","pos_kept"],[38,4,1,"","pos_max_fmut"],[38,4,1,"","pos_min_ninfo"],[38,4,1,"","pos_polya"],[38,4,1,"","pos_user"]],"seismicrna.pool":[[39,0,0,"-","data"],[39,0,0,"-","main"],[39,0,0,"-","report"]],"seismicrna.pool.data":[[39,2,1,"","PoolDataset"]],"seismicrna.pool.data.PoolDataset":[[39,5,1,"","get_dataset_load_func"],[39,5,1,"","get_report_type"]],"seismicrna.pool.main":[[39,1,1,"","pool_samples"],[39,1,1,"","run"]],"seismicrna.pool.report":[[39,2,1,"","PoolReport"]],"seismicrna.pool.report.PoolReport":[[39,5,1,"","auto_fields"],[39,5,1,"","fields"],[39,5,1,"","file_seg_type"],[39,5,1,"","path_segs"]],"seismicrna.relate":[[41,0,0,"-","aux"],[40,0,0,"-","batch"],[43,0,0,"-","c"],[40,0,0,"-","data"],[40,0,0,"-","io"],[40,0,0,"-","main"],[44,0,0,"-","py"],[40,0,0,"-","report"],[40,0,0,"-","sam"],[40,0,0,"-","write"]],"seismicrna.relate.aux":[[41,0,0,"-","cigarop"],[41,0,0,"-","human"],[41,0,0,"-","infer"],[41,0,0,"-","iterread"],[41,0,0,"-","iterrel"],[42,0,0,"-","tests"]],"seismicrna.relate.aux.cigarop":[[41,2,1,"","CigarOp"],[41,1,1,"","count_cigar_muts"],[41,1,1,"","count_cigar_read"],[41,1,1,"","count_cigar_ref"],[41,1,1,"","find_cigar_op_pos"],[41,1,1,"","op_is_mutation"]],"seismicrna.relate.aux.cigarop.CigarOp":[[41,5,1,"","__str__"],[41,5,1,"","lengthen"],[41,4,1,"","op"]],"seismicrna.relate.aux.human":[[41,1,1,"","humanize_relvec"]],"seismicrna.relate.aux.infer":[[41,1,1,"","infer_read"]],"seismicrna.relate.aux.iterread":[[41,1,1,"","iter_alignments"],[41,1,1,"","ref_to_alignments"]],"seismicrna.relate.aux.iterrel":[[41,1,1,"","iter_relvecs_all"],[41,1,1,"","iter_relvecs_q53"]],"seismicrna.relate.aux.tests":[[42,0,0,"-","cigarop_test"],[42,0,0,"-","infer_test"],[42,0,0,"-","iterrel_test"]],"seismicrna.relate.aux.tests.cigarop_test":[[42,2,1,"","TestCigarOp"],[42,2,1,"","TestCountCigarMuts"],[42,2,1,"","TestFindCigarOpPos"]],"seismicrna.relate.aux.tests.cigarop_test.TestCigarOp":[[42,3,1,"","ops"],[42,5,1,"","test_cigar_init_invalid"],[42,5,1,"","test_cigar_init_valid"],[42,5,1,"","test_cigar_lengthen"],[42,5,1,"","test_cigar_str"]],"seismicrna.relate.aux.tests.cigarop_test.TestCountCigarMuts":[[42,5,1,"","test_cigar_match_subst_valid"]],"seismicrna.relate.aux.tests.cigarop_test.TestFindCigarOpPos":[[42,5,1,"","test_cigar_m_aln_valid"],[42,5,1,"","test_cigar_m_del_valid"],[42,5,1,"","test_cigar_m_ins_valid"],[42,5,1,"","test_cigar_m_mat_valid"],[42,5,1,"","test_cigar_m_scl_valid"],[42,5,1,"","test_cigar_m_sub_valid"],[42,5,1,"","test_cigar_xeq_aln_valid"],[42,5,1,"","test_cigar_xeq_del_valid"],[42,5,1,"","test_cigar_xeq_ins_valid"],[42,5,1,"","test_cigar_xeq_mat_valid"],[42,5,1,"","test_cigar_xeq_scl_valid"],[42,5,1,"","test_cigar_xeq_sub_valid"]],"seismicrna.relate.aux.tests.infer_test":[[42,2,1,"","TestInferRead"]],"seismicrna.relate.aux.tests.infer_test.TestInferRead":[[42,5,1,"","assert_equal"],[42,5,1,"","assert_raise"],[42,5,1,"","test_all_match"],[42,5,1,"","test_all_match_n"],[42,5,1,"","test_delete_invalid"],[42,5,1,"","test_delete_valid"],[42,5,1,"","test_insert_bare_invalid"],[42,5,1,"","test_insert_dangling_3_invalid"],[42,5,1,"","test_insert_dangling_5_invalid"],[42,5,1,"","test_insert_deletion_invalid"],[42,5,1,"","test_insert_end3_invalid"],[42,5,1,"","test_insert_end5_invalid"],[42,5,1,"","test_insert_non_match_valid"],[42,5,1,"","test_insert_valid"],[42,5,1,"","test_low_qual_valid"],[42,5,1,"","test_nocov_valid"],[42,5,1,"","test_subst_invalid"],[42,5,1,"","test_subst_valid"]],"seismicrna.relate.aux.tests.iterrel_test":[[42,2,1,"","TestIterRelvecsAll"],[42,2,1,"","TestIterRelvecsQ53"]],"seismicrna.relate.aux.tests.iterrel_test.TestIterRelvecsAll":[[42,5,1,"","assert_equal"],[42,5,1,"","test_length_1"],[42,5,1,"","test_length_2"],[42,5,1,"","test_length_3"]],"seismicrna.relate.aux.tests.iterrel_test.TestIterRelvecsQ53":[[42,5,1,"","list_rels"],[42,5,1,"","test_a"],[42,5,1,"","test_aa"],[42,5,1,"","test_agg"],[42,5,1,"","test_c"],[42,5,1,"","test_g"],[42,5,1,"","test_low_qual"],[42,5,1,"","test_low_qual_invalid"],[42,5,1,"","test_n"],[42,5,1,"","test_t"],[42,5,1,"","test_type"],[42,5,1,"","test_xaax"]],"seismicrna.relate.batch":[[40,2,1,"","QnamesBatch"],[40,2,1,"","RelateBatch"],[40,2,1,"","RelateReflenBatch"],[40,2,1,"","RelateRefseqBatch"]],"seismicrna.relate.batch.QnamesBatch":[[40,4,1,"","num_reads"]],"seismicrna.relate.batch.RelateBatch":[[40,4,1,"","num_reads"],[40,4,1,"","pos_nums"]],"seismicrna.relate.data":[[40,2,1,"","RelateDataset"]],"seismicrna.relate.data.RelateDataset":[[40,5,1,"","get_batch"],[40,5,1,"","get_batch_type"],[40,5,1,"","get_report_type"],[40,4,1,"","pattern"]],"seismicrna.relate.io":[[40,2,1,"","QnamesBatchIO"],[40,2,1,"","RelateBatchIO"],[40,2,1,"","RelateIO"],[40,1,1,"","from_reads"]],"seismicrna.relate.io.QnamesBatchIO":[[40,5,1,"","file_seg_type"]],"seismicrna.relate.io.RelateBatchIO":[[40,5,1,"","file_seg_type"]],"seismicrna.relate.io.RelateIO":[[40,5,1,"","auto_fields"]],"seismicrna.relate.main":[[40,1,1,"","run"]],"seismicrna.relate.py":[[44,0,0,"-","ambrel"],[44,0,0,"-","cigar"],[44,0,0,"-","encode"],[44,0,0,"-","error"],[44,0,0,"-","relate"],[45,0,0,"-","tests"]],"seismicrna.relate.py.ambrel":[[44,2,1,"","Deletion"],[44,2,1,"","Indel"],[44,2,1,"","Insertion"],[44,1,1,"","find_ambrels"],[44,1,1,"","sweep_indels"]],"seismicrna.relate.py.ambrel.Deletion":[[44,4,1,"","rank"]],"seismicrna.relate.py.ambrel.Indel":[[44,4,1,"","del_pos3"],[44,4,1,"","del_pos5"],[44,4,1,"","ins_pos"],[44,4,1,"","rank"],[44,5,1,"","reset"],[44,5,1,"","step_del_pos"],[44,5,1,"","sweep"],[44,4,1,"","tunneled"]],"seismicrna.relate.py.ambrel.Insertion":[[44,4,1,"","rank"],[44,5,1,"","stamp"]],"seismicrna.relate.py.cigar":[[44,1,1,"","op_consumes_read"],[44,1,1,"","op_consumes_ref"],[44,1,1,"","parse_cigar"]],"seismicrna.relate.py.encode":[[44,1,1,"","encode_match"],[44,1,1,"","encode_relate"]],"seismicrna.relate.py.error":[[44,6,1,"","RelateError"],[44,6,1,"","RelateNotImplementedError"],[44,6,1,"","RelateValueError"]],"seismicrna.relate.py.relate":[[44,2,1,"","SamFlag"],[44,2,1,"","SamRead"],[44,1,1,"","find_rels_line"],[44,1,1,"","find_rels_read"],[44,1,1,"","merge_ends"],[44,1,1,"","merge_rels"],[44,1,1,"","validate_pair"],[44,1,1,"","validate_read"]],"seismicrna.relate.py.relate.SamFlag":[[44,3,1,"","first"],[44,3,1,"","flag"],[44,3,1,"","paired"],[44,3,1,"","rev"],[44,3,1,"","second"]],"seismicrna.relate.py.relate.SamRead":[[44,3,1,"","MIN_FIELDS"],[44,3,1,"","cigar"],[44,3,1,"","flag"],[44,3,1,"","mapq"],[44,3,1,"","pos"],[44,3,1,"","qname"],[44,3,1,"","qual"],[44,3,1,"","rname"],[44,3,1,"","seq"]],"seismicrna.relate.py.tests":[[45,0,0,"-","ambrel_test"],[45,0,0,"-","cigar_test"],[45,0,0,"-","encode_test"],[45,0,0,"-","relate_test"]],"seismicrna.relate.py.tests.cigar_test":[[45,2,1,"","TestParseCigar"]],"seismicrna.relate.py.tests.cigar_test.TestParseCigar":[[45,5,1,"","test_cigar_align_valid"],[45,5,1,"","test_cigar_match_subst_valid"]],"seismicrna.relate.py.tests.encode_test":[[45,2,1,"","TestEncodeMatch"],[45,2,1,"","TestEncodeRelate"]],"seismicrna.relate.py.tests.encode_test.TestEncodeMatch":[[45,5,1,"","test_encode_match_hi_qual"],[45,5,1,"","test_encode_match_lo_qual"]],"seismicrna.relate.py.tests.encode_test.TestEncodeRelate":[[45,5,1,"","test_encode_relate_hi_qual"],[45,5,1,"","test_encode_relate_lo_qual"]],"seismicrna.relate.py.tests.relate_test":[[45,2,1,"","TestRelateRelateLineAmbrel"]],"seismicrna.relate.py.tests.relate_test.TestRelateRelateLineAmbrel":[[45,3,1,"","MAPQ"],[45,5,1,"","iter_cases"],[45,5,1,"","relate"],[45,5,1,"","test_aaaa_0ins"],[45,5,1,"","test_aaaaaa_0ins"],[45,5,1,"","test_aacc_1ins"],[45,5,1,"","test_acgt_1ins"]],"seismicrna.relate.report":[[40,2,1,"","RelateReport"],[40,1,1,"","refseq_file_auto_fields"],[40,1,1,"","refseq_file_path"],[40,1,1,"","refseq_file_seg_types"]],"seismicrna.relate.report.RelateReport":[[40,5,1,"","fields"],[40,5,1,"","file_seg_type"],[40,5,1,"","refseq_file"]],"seismicrna.relate.sam":[[40,2,1,"","XamViewer"],[40,1,1,"","read_name"]],"seismicrna.relate.sam.XamViewer":[[40,5,1,"","create_temp_sam"],[40,5,1,"","delete_temp_sam"],[40,4,1,"","flagstats"],[40,4,1,"","indexes"],[40,5,1,"","iter_records"],[40,4,1,"","n_reads"],[40,5,1,"","open_temp_sam"],[40,4,1,"","paired"],[40,4,1,"","ref"],[40,4,1,"","sample"],[40,4,1,"","temp_sam_path"]],"seismicrna.relate.write":[[40,2,1,"","RelationWriter"],[40,1,1,"","generate_batch"],[40,1,1,"","get_reads_per_batch"],[40,1,1,"","mib_to_bytes"],[40,1,1,"","write_all"],[40,1,1,"","write_one"]],"seismicrna.relate.write.RelationWriter":[[40,4,1,"","ref"],[40,4,1,"","sample"],[40,5,1,"","write"]],"seismicrna.renumct":[[46,0,0,"-","main"]],"seismicrna.renumct.main":[[46,1,1,"","run"]],"seismicrna.sim":[[48,0,0,"-","tests"]],"seismicrna.table":[[49,0,0,"-","base"],[49,0,0,"-","calc"],[49,0,0,"-","load"],[49,0,0,"-","main"],[49,0,0,"-","write"]],"seismicrna.table.base":[[49,2,1,"","AvgTable"],[49,2,1,"","ClustFreqTable"],[49,2,1,"","ClustPosTable"],[49,2,1,"","ClustReadTable"],[49,2,1,"","ClustTable"],[49,2,1,"","FreqTable"],[49,2,1,"","MaskPosTable"],[49,2,1,"","MaskReadTable"],[49,2,1,"","MaskTable"],[49,2,1,"","PosTable"],[49,2,1,"","ProfilePosTable"],[49,2,1,"","ReadTable"],[49,2,1,"","RelPosTable"],[49,2,1,"","RelReadTable"],[49,2,1,"","RelTable"],[49,2,1,"","RelTypeTable"],[49,2,1,"","Table"],[49,1,1,"","get_rel_name"]],"seismicrna.table.base.AvgTable":[[49,5,1,"","header_type"]],"seismicrna.table.base.ClustFreqTable":[[49,5,1,"","header_type"],[49,5,1,"","index_depth"],[49,5,1,"","kind"]],"seismicrna.table.base.ClustTable":[[49,5,1,"","header_type"],[49,5,1,"","kind"]],"seismicrna.table.base.FreqTable":[[49,5,1,"","by_read"],[49,5,1,"","path_segs"],[49,5,1,"","transposed"]],"seismicrna.table.base.MaskTable":[[49,5,1,"","kind"]],"seismicrna.table.base.PosTable":[[49,3,1,"","MASK"],[49,5,1,"","by_read"],[49,5,1,"","ci_count"],[49,5,1,"","ci_ratio"],[49,4,1,"","end3"],[49,4,1,"","end5"],[49,5,1,"","index_depth"],[49,5,1,"","iter_profiles"],[49,4,1,"","masked_bool"],[49,5,1,"","path_segs"],[49,4,1,"","range"],[49,4,1,"","range_int"],[49,5,1,"","resample"],[49,4,1,"","section"],[49,4,1,"","seq"],[49,4,1,"","unmasked"],[49,4,1,"","unmasked_bool"],[49,4,1,"","unmasked_int"]],"seismicrna.table.base.ReadTable":[[49,5,1,"","by_read"],[49,5,1,"","index_depth"],[49,5,1,"","path_segs"],[49,4,1,"","reads"]],"seismicrna.table.base.RelTable":[[49,5,1,"","kind"]],"seismicrna.table.base.RelTypeTable":[[49,5,1,"","fetch_count"],[49,5,1,"","fetch_ratio"],[49,5,1,"","transposed"]],"seismicrna.table.base.Table":[[49,5,1,"","by_read"],[49,4,1,"","data"],[49,5,1,"","ext"],[49,5,1,"","gzipped"],[49,4,1,"","header"],[49,5,1,"","header_depth"],[49,5,1,"","header_rows"],[49,5,1,"","header_type"],[49,5,1,"","index_cols"],[49,5,1,"","index_depth"],[49,5,1,"","kind"],[49,4,1,"","path"],[49,4,1,"","path_fields"],[49,5,1,"","path_segs"],[49,4,1,"","ref"],[49,4,1,"","sample"],[49,4,1,"","sect"],[49,4,1,"","top"],[49,5,1,"","transposed"]],"seismicrna.table.calc":[[49,2,1,"","AvgTabulator"],[49,2,1,"","ClustTabulator"],[49,2,1,"","FullTabulator"],[49,2,1,"","MaskTabulator"],[49,2,1,"","PartialTabulator"],[49,2,1,"","RelateTabulator"],[49,2,1,"","Tabulator"],[49,1,1,"","adjust_counts"],[49,1,1,"","all_patterns"],[49,1,1,"","list_mut_patterns"],[49,1,1,"","tabulate_loader"]],"seismicrna.table.calc.AvgTabulator":[[49,4,1,"","max_order"]],"seismicrna.table.calc.ClustTabulator":[[49,4,1,"","clust_header"],[49,4,1,"","max_order"],[49,4,1,"","num_reads_adj"],[49,4,1,"","num_reads_obs"],[49,4,1,"","table_per_clust"]],"seismicrna.table.calc.FullTabulator":[[49,5,1,"","get_null_value"]],"seismicrna.table.calc.PartialTabulator":[[49,5,1,"","get_null_value"],[49,4,1,"","table_per_pos"]],"seismicrna.table.calc.Tabulator":[[49,5,1,"","get_null_value"],[49,4,1,"","max_order"],[49,4,1,"","pos_header"],[49,4,1,"","read_header"],[49,4,1,"","ref"],[49,4,1,"","refseq"],[49,4,1,"","sample"],[49,4,1,"","section"],[49,4,1,"","table_per_pos"],[49,4,1,"","table_per_read"],[49,4,1,"","top"]],"seismicrna.table.load":[[49,2,1,"","ClustFreqTableLoader"],[49,2,1,"","ClustPosTableLoader"],[49,2,1,"","ClustReadTableLoader"],[49,2,1,"","MaskPosTableLoader"],[49,2,1,"","MaskReadTableLoader"],[49,2,1,"","PosTableLoader"],[49,2,1,"","ReadTableLoader"],[49,2,1,"","RelPosTableLoader"],[49,2,1,"","RelReadTableLoader"],[49,2,1,"","RelTypeTableLoader"],[49,2,1,"","TableLoader"],[49,1,1,"","find_all_tables"],[49,1,1,"","find_pos_tables"],[49,1,1,"","find_read_tables"],[49,1,1,"","find_tables"],[49,1,1,"","load_all_tables"],[49,1,1,"","load_any_table"],[49,1,1,"","load_pos_table"],[49,1,1,"","load_pos_tables"],[49,1,1,"","load_read_table"],[49,1,1,"","load_read_tables"],[49,1,1,"","load_table"],[49,1,1,"","load_tables"]],"seismicrna.table.load.TableLoader":[[49,4,1,"","data"],[49,4,1,"","ref"],[49,4,1,"","sample"],[49,4,1,"","sect"],[49,4,1,"","top"]],"seismicrna.table.main":[[49,1,1,"","run"]],"seismicrna.table.write":[[49,2,1,"","ClustFreqTableWriter"],[49,2,1,"","ClustPosTableWriter"],[49,2,1,"","ClustReadTableWriter"],[49,2,1,"","MaskPosTableWriter"],[49,2,1,"","MaskReadTableWriter"],[49,2,1,"","PosTableWriter"],[49,2,1,"","ReadTableWriter"],[49,2,1,"","RelPosTableWriter"],[49,2,1,"","RelReadTableWriter"],[49,2,1,"","TableWriter"],[49,1,1,"","get_tabulator_writer_types"],[49,1,1,"","get_tabulator_writers"],[49,1,1,"","write"]],"seismicrna.table.write.ClustFreqTableWriter":[[49,4,1,"","data"]],"seismicrna.table.write.PosTableWriter":[[49,4,1,"","data"]],"seismicrna.table.write.ReadTableWriter":[[49,4,1,"","data"]],"seismicrna.table.write.TableWriter":[[49,4,1,"","columns"],[49,4,1,"","ref"],[49,4,1,"","sample"],[49,4,1,"","sect"],[49,4,1,"","top"],[49,5,1,"","write"]],"seismicrna.test":[[50,0,0,"-","main"]],"seismicrna.test.main":[[50,1,1,"","run"]],"seismicrna.wf":[[51,0,0,"-","main"],[51,0,0,"-","sim"]],"seismicrna.wf.main":[[51,1,1,"","as_tuple_str"],[51,1,1,"","run"]],"seismicrna.wf.sim":[[51,1,1,"","sim_whole"]],seismicrna:[[8,0,0,"-","align"],[10,0,0,"-","cleanfa"],[11,0,0,"-","cluster"],[12,0,0,"-","core"],[32,0,0,"-","demult"],[33,0,0,"-","export"],[34,0,0,"-","fold"],[35,0,0,"-","graph"],[36,0,0,"-","join"],[37,0,0,"-","lists"],[7,0,0,"-","main"],[38,0,0,"-","mask"],[39,0,0,"-","pool"],[40,0,0,"-","relate"],[46,0,0,"-","renumct"],[47,0,0,"-","sim"],[49,0,0,"-","table"],[50,0,0,"-","test"],[51,0,0,"-","wf"]]},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","property","Python property"],"5":["py","method","Python method"],"6":["py","exception","Python exception"],"7":["std","cmdoption","program option"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:property","5":"py:method","6":"py:exception","7":"std:cmdoption"},terms:{"0":[5,8,11,12,14,18,20,21,28,29,30,32,34,37,38,40,41,44,45,49,50,51,52,54,56,57,58,59,60,63,65,66,74,76,77,78,80,81,82,83,88,91,93,95,96,99,103,105,107,108,110],"00":[5,93],"000":96,"0000":0,"00000000":[5,54],"00000001":54,"00000010":54,"00000011":54,"00000100":54,"00001000":54,"0001":[0,20],"00010000":54,"00042715097170304697":88,"0005903400048243549":88,"001":[54,63],"00100000":54,"00100001":5,"0012500543750758389":88,"0016602828354697209":88,"0017164535218205134":88,"002":54,"002887023310345601":88,"003393658868599399":88,"004":54,"007293619411197718":88,"008":54,"01":[5,51,54,77,80,82,91,93],"01000000":54,"010770982726367673":88,"01110001":54,"011638240863466542":88,"016":54,"018827932574530207":88,"02":[54,83],"020":20,"026":77,"03":54,"032":54,"03212678813091909":88,"04":[54,82,92],"05":[82,93],"064":54,"08":[54,83,92,96],"08_15":92,"09":[74,81,92,96],"09c4d2b19c4c720bd24b2f432b908cb9":81,"0d8c7e53719d9ba28afab22881d4ce8a":83,"1":[5,8,11,12,14,18,20,21,22,24,29,30,32,34,35,36,38,40,41,42,44,45,49,51,52,54,56,58,60,65,66,72,73,74,75,76,77,78,80,81,83,84,87,90,92,93,95,96,99,102,103,104,105,108,110,112,113],"10":[5,11,12,16,20,32,38,40,51,54,57,63,73,74,76,77,78,81,93,95,103,105,108,110,113],"100":63,"1000":[8,38,40,51,81,95,103],"100000":107,"10000000":54,"10011111":5,"10110001":54,"103":[75,108],"1038":20,"104":75,"104850":77,"10903":56,"11":[5,11,38,40,44,51,52,70,76,82,83,96,108],"11010001":54,"11100001":54,"11111111":54,"113":54,"12":[5,44,77,78,81,83,103,110],"1206":56,"121":103,"123":90,"12605":56,"127":8,"128":[54,58],"13":[80,82,83],"130":108,"1323277603f89c04fcb665a34e2790b1":77,"133":103,"1343":119,"137":103,"14":[12,83],"141":103,"148":108,"15":[34,51,78,81,92,103],"15d30bd7b2075d51d7147fc5a454ea1a":83,"16":[8,10,11,33,34,36,37,38,39,40,46,49,51,58,70,76,77,80,81,83],"1680be76740c49f0c216574ca61f3ed4":81,"17":[73,76,77,81,96,110],"177":54,"18":[77,80,81],"19":74,"194824b402bced072049a46d8c7effb6":81,"196":88,"197":88,"198":88,"199":88,"1_r1":95,"1_r2":95,"1d":[20,21],"1e":20,"1f0277918d971ba2b4096b218ff91514793684a9bc60395c56c7cfcc837b45c4":116,"1s":[54,95],"1st":[26,67,95],"2":[5,8,9,11,12,18,21,26,28,30,35,36,38,40,41,42,44,45,49,51,52,54,56,58,62,72,74,76,77,80,83,84,87,88,90,92,96,102,103,104,105,108,110],"20":[8,12,32,34,40,51,54,70,76,78,92,93,95,96,105],"200":88,"2017":[1,103],"2020":[1,20,96,103],"2022":1,"2023":[1,74,76,77,78,81,83],"2024":[4,80,82,92],"209":54,"2106":56,"21b2f8c6cd976858476cc52297e276b3":77,"22":78,"225":54,"2253":20,"23":77,"2303":56,"2368":75,"2369":75,"240":74,"2411":56,"2468a801a2686bd198bd726cc90ff30f":77,"25":[8,29,40,45,51,54,63,76,80,93,95,105],"2506":56,"255":[54,58],"256":117,"26":[63,81,90],"2613":76,"2695":75,"26_r1":63,"26_r2":63,"272351":81,"277":92,"27eb008e907d48d932626098f4587178":81,"28":[83,96],"289974":81,"29":[76,78],"296":103,"2_use":92,"2d":21,"2nd":[26,67,95],"2s":95,"3":[4,5,8,9,12,14,28,29,34,38,41,42,44,51,52,54,56,57,65,72,75,76,80,81,83,84,90,92,95,96,102,103,105,107,108,110,113],"30":[12,63,81,96],"300":[74,77,96],"301334":88,"303045":88,"30496":56,"30558":56,"305746":88,"3073073":77,"3078650":77,"310":[34,51,74,78],"32":49,"33":[8,40,51,63,76,77,95],"34":108,"34554":56,"350":103,"36157068effbcc1ac6d13487b10b2d85":83,"36af6fb7b3e8ab41ac569c5f6547b039":77,"38":96,"38352":56,"39":[76,82,96],"397":81,"398":81,"399":81,"3efe0b5aea70954ff37ced0ce509fc40":77,"3utr":75,"4":[5,8,12,20,51,54,56,57,58,63,76,84,92,95,96,103,108],"40":[12,54,95,96],"400":81,"401":81,"402":81,"403":81,"404":81,"405":81,"406":81,"407":81,"408":81,"409":81,"410":81,"411":81,"412":81,"413":81,"414":81,"415":81,"416":81,"417":81,"4176c9379dfa59a73954469290c90740":77,"418":81,"41825":56,"419":81,"420":81,"421":81,"422":81,"423":81,"424":81,"425":81,"426":81,"4265f976d74f05d6a9bbacb4e4efe443":77,"4294967296":49,"42ae5619577059c555c7f7893aa87739":83,"42babd92a5ffdd13e29441f034a6b167":81,"45":51,"45871":83,"46":[70,78],"47":80,"4be0122fc2d700f7d75f236cf11dcca3":77,"5":[8,12,14,20,21,28,29,34,37,38,41,42,44,46,51,52,54,65,74,75,76,81,84,92,93,95,103,105,108,110],"50":[12,77,93],"51":[80,81],"512":[11,51,77],"52":[77,81],"52949":56,"53":[77,78,81],"54095":56,"55259":56,"555":77,"56":108,"562325":[76,81],"562448":76,"565068":76,"566520":76,"58":63,"58ff4df2fd5fb93e1407328a4dcd8f95":116,"5e":20,"5th":26,"5utr":75,"6":[8,11,26,30,51,54,58,73,76,90,96,108,110],"600":[8,51,76,96,103],"6148481":77,"6158468":77,"63":95,"63_r1":95,"63_r2":95,"64":[40,51,58,95,105],"66":56,"6931471805599453":[11,51],"699":77,"6a88a23437d10cdb68e29beebf70abb8":77,"6f2453c2da1733109a9df9c6a9110adbd6cac82fa6fb01f3589cf8720eb65514":116,"6th":26,"7":[58,76,77,88,90,95,96,108],"71":[54,108],"7402":0,"778d808c7d34aa3abf0cfcad1c5eb8a6":77,"8":[5,11,51,54,58,63,95,103,108],"80":54,"8182":0,"81f2ed98056df9611354e0aa3a219971":81,"83":[70,90],"86":108,"89":108,"9":[5,30,51,57,76,83,90,103,108,112],"900":96,"901b083617e6a66df5a68dc03323b791":81,"91":12,"92":12,"93":12,"94":[12,103],"94ba454827b5763892dd244fe897a406":116,"95":[12,20,78,96,103,107],"95th":20,"96":12,"97":103,"9f8d6ba42947fb1ee3b9a0b67879e99":81,"9fce126e9740004b832170a288e83be45d702667c62e9bf18712a76464a16b4d":116,"\u03c1":52,"abstract":[8,12,14,16,29,30,35,44,49],"boolean":[11,18,28,29,44],"break":[62,95],"byte":[5,11,12,16,26,40,44,54,57,105],"case":[5,9,17,19,21,23,25,26,27,30,31,34,42,45,59,72,73,74,75,84,85,87,95,105,108,112],"class":[8,9,10,11,12,14,15,16,17,19,21,23,24,25,26,27,28,29,30,31,32,34,35,36,38,39,40,41,42,44,45,49],"d\u00fclk":1,"default":[8,10,11,12,13,20,29,33,34,35,36,37,38,39,40,46,49,50,51,54,61,62,63,85,92,95,96,101,102,103,104,105,106,107,108,112],"do":[12,18,20,26,65,84,85,92,95,98,102,103,104,105,107,108,110,113,114],"export":[7,8,51,52,64,68,89,101,107],"final":[5,92,95],"float":[8,11,12,18,20,21,28,29,34,35,37,38,40,49,51,73,74,76,77,78,80,81,82,83],"function":[7,8,9,11,12,13,15,18,20,21,24,25,26,29,30,34,35,36,38,39,40,42,45,49,50,51,52],"import":[7,8,92,96,99,103],"int":[5,8,10,11,12,14,16,18,19,20,21,22,24,26,28,29,32,33,34,35,36,37,38,39,40,41,42,44,45,46,49,50,51,57,58,70,72,75,76,77,78,80,81,83],"long":[5,67,95,99,103,105,108,110],"new":[8,10,11,12,13,16,18,21,25,26,28,29,34,40,46,49,51,52,70,72,73,74,75,84,92,95,99,102,103,104,105,110,113,115,116],"null":49,"public":4,"r\u00b2":52,"return":[8,11,12,13,14,15,16,18,19,20,21,22,24,25,26,28,29,30,32,33,34,35,36,39,40,42,44,49,96,112],"short":[2,52,67,99,110,113],"static":[9,17,29,42,45],"switch":[95,103],"true":[5,8,10,11,12,14,15,16,19,21,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,46,49,51,57,76,81,96],"try":[19,24,95,102,104,110],"while":[18,44,54,65,87,93,95,99,102,104,113],A:[2,4,5,8,9,12,20,22,26,28,29,35,38,42,44,51,52,54,57,58,60,61,62,63,65,79,81,84,87,88,92,95,96,102,104,105,108,113],AND:54,AT:[54,108],And:[63,87],As:[5,59,87,92,95,105,116],At:54,Be:84,But:[5,8,9,54,113],By:[85,92,95,107,109],FOR:4,For:[5,8,12,14,20,26,36,41,44,51,52,54,57,58,61,63,66,67,72,75,85,87,90,92,93,95,96,99,102,103,104,105,106,107,108,113],If:[11,12,18,20,24,25,29,41,44,54,58,62,63,66,84,85,87,90,93,95,96,102,103,104,105,108,110,112,113,114,116],In:[5,8,9,11,20,54,58,60,61,62,63,72,85,94,95,96,103,105,108,116],Into:113,It:[5,12,20,44,54,59,63,84,92,95,102,104,113],Not:8,OR:54,On:[92,108,112,116],One:8,Or:110,The:[5,8,9,11,12,20,22,24,29,34,35,44,49,54,56,57,58,59,60,61,62,63,65,66,67,70,72,75,84,85,87,90,92,94,95,96,98,99,102,103,104,105,107,108,110,113],Their:[73,74],Then:[5,18,54,92,102,104,112],There:[8,63,95,99,105],These:[65,67,95,100,116],To:[5,54,85,92,95,96,98,99,100,102,103,104,105,106,107,108,109,110,113],With:[87,95,96],_1_sequenc:63,_1_sequence_001:63,_2_sequenc:63,_2_sequence_001:63,_:[12,25,35],__:[25,35,99],______cc:58,_____agc:58,____aac_:58,___ga:58,___gta__:58,__add__:29,__aga___:58,__bool__:29,__call__:[12,24],__conda_activ:112,__conda_ex:112,__conda_reactiv:112,__eq__:29,__getitem__:29,__hash__:29,__missing__:112,__mul__:29,__repr__:29,__setattr__:12,__str__:41,__unalign:95,__varna:66,__version__:7,__webapp:65,_ca_____:58,_cag____:58,_calc_mu_ob:21,_deprec:35,_fastqc:95,_find_blank_rang:9,_mate1:63,_mate1_001:63,_mate2:63,_mate2_001:63,_r1:63,_r1_001:63,_r2:63,_r2_001:63,_r:95,_s:57,a13183811fadb0a9906d71a729aee04d:81,a1:[52,95],a2:[52,95],aa:42,aaaa:[5,45],aaaaaa:45,aab:102,aac:108,aacc:45,aacyhm7m5:56,ab:102,abc:[8,11,12,14,16,29,35,36,38,40,44,49,96],abil:[90,96],abl:[84,96],abnorm:92,abort:92,about:[13,35,54,65,71,87,89,92,96,99,105,109,110],abov:[5,20,51,52,54,84,90,110],absolut:[12,20],ac:110,acccgtaactatcg:75,accept:[12,29,44,59,60,61,62,63,65,66,67,70,87,95],accompani:95,accomplish:[99,113],accord:[26,41,116],accum:14,accum_fit:14,accum_per_po:14,accumul:[14,40],accur:[20,21,95],accuraci:105,acgt:[8,9,26,45,87],acgtdi:[26,88],achiev:54,acid:[5,29,95],across:20,action1:35,action2:35,action:[15,35],action_sample1:35,action_sample2:35,activ:[92,95,103,105,111,112,115],actt:[8,9],actual:[11,12,14,20,21,34,38,40,42,44,51,52,54,95,96,103,105,112],ad:[12,63,89,96],adapt:[8,51,52,76],add:[11,20,29,52,54,89,95,96,98,103,109,114],add_mask:29,add_ord:11,addclust:[11,84,96],addit:[29,35,63,65,70,73,74,84,95,100,107],addition:[75,85,107],adenosin:1,adjac:9,adjust:[11,20,49,84,95,96,99,105],adjust_count:49,advantag:[69,71],advic:[95,107],advis:113,aff9a30f5949c7a8b8ae437922c39f90:116,affect:[92,95],aforement:113,after:[8,12,34,40,51,52,54,60,61,62,63,66,72,76,84,85,87,91,92,95,96,99,103,105,107,110,112,113],ag:[8,9,26,103],against:[51,52,95],agatcggaagagc:[8,51,76,95],agg:42,agre:[12,28,54],aim:105,al:[1,20,96,103],alber:0,albericdelajart:0,algebra:113,algo:[20,105],algo_test:21,algorithm:[2,11,20,44,54,57,96,105,109,113,116],alia:29,align:[7,12,22,32,40,42,45,51,54,58,62,63,64,65,68,79,89,101,103,107,110],align_sampl:8,alignrefreport:8,alignreport:8,alignsamplereport:8,all:[5,8,9,10,11,12,13,14,18,20,26,28,29,30,33,34,35,36,37,38,39,40,42,44,45,46,49,50,51,52,54,58,59,62,63,65,69,71,84,85,89,90,91,92,93,95,96,98,99,101,102,103,104,105,106,108,110,112,113],all_pattern:49,all_po:[33,51],allan:0,allc:26,allevi:113,allow:[8,12,14,24,29,30,44,51,52,62,76,96,99,108],allow_dupl:12,allow_gap:29,allow_zero:12,allreadbatch:[14,40],along:[4,52,59,87],alongsid:[62,95],alph:29,alphabet:[29,62],alphanumer:62,alreadi:[8,10,11,12,28,33,34,36,37,38,39,40,46,49,51,52,89,91,102,104,105,109,112,113,114],also:[12,13,34,54,62,63,67,87,90,92,95,96,99,102,103,104,105,110,113],altern:[8,9,11,44,52,63,75,89,99,101,103],although:[9,12,54,95,103],alwai:[11,24,63,84,95,96,116],ambigu:[5,40,41,42,44,51,52,55,87,103],ambrel:[40,44,51,52,105],amid:107,among:[12,20,29,35,49,95,103,113],amount:[51,52,67,105],amplicon:[29,75,99,108],an:[1,5,8,9,11,12,14,15,16,18,20,21,22,24,26,28,29,30,34,35,40,41,42,44,49,51,52,54,58,59,62,63,69,71,72,75,76,85,87,89,95,96,102,103,104,105,108,109,110,112,113,114],anaa:5,anaconda:113,analag:44,analys:103,analysi:[84,105],analyz:87,ani:[4,5,8,11,12,13,15,16,18,20,24,26,28,29,33,34,35,36,38,39,40,44,49,51,52,54,58,59,60,62,63,78,84,85,87,88,90,92,95,96,98,99,102,103,104,105,106,107,108,112,114,116],annot:13,anoth:[8,15,26,29,35,61,63,87,95,113],ansi:12,ansi_cod:12,ansicod:12,answer:112,any_nan:18,anyth:96,anywher:[99,105],apart:20,api:13,app:[33,51,52,65,89,101],appear:[20,35,92,95,102,103,104,116],append:84,append_bool:32,append_fil:32,appli:[35,51,52,108],applic:[93,99,103],apply_mask:38,approach:[20,84],appropri:[12,25,95],approxim:[11,18],ar:[5,8,9,11,12,14,18,20,21,22,24,26,28,29,30,34,35,38,40,41,42,44,49,51,52,54,56,58,59,60,62,63,65,67,69,71,72,73,74,75,84,85,87,88,90,94,95,96,99,100,102,104,105,106,107,108,110,112,113,114,116],arbitrari:[5,18,29,38,51,52,62,72,73,74,98,103],arbitrarili:[5,38],area:[28,100],aren:[102,104],arg:[7,8,12,15,16,24,25,33,35,36,41,50],argment:13,args_to_cmd:15,argument:[8,12,13,15,18,24,28,35,44,49,87,90,107,109],around:34,arr1:14,arr2:14,arrai:[5,14,18,20,21,29,30,44,56,58,107],array1:14,array2:14,arrow:26,artifact:[84,95,96,103,108],artifactu:95,aruda:0,as_fanc:26,as_list_of_tupl:24,as_match:26,as_plain:26,as_sam:[8,9],as_tuple_str:51,ascii:[5,8,22,44,63],ask:114,aso1:74,aso2:74,aso:74,assembl:12,assert:42,assert_equ:42,assert_rais:42,assign:[11,18,29,34,46,52,54,92,105,108],assign_clust:11,assist:79,associ:[12,59],assum:[8,9,20,35,85,88,90,105,110],assume_nest:28,assumpt:20,atat:[8,9],atc:54,atcctg:54,atcgtcatgtgt:63,atctg:54,attempt:[8,11,18,51,52,76,95,102,104],attr:11,attribut:[5,7,11,12,56,57,58,87,102,104],auc:[28,35,52,100],aucrol:[35,100],auth:[11,13,40],authent:116,author:[3,109],auto:13,auto_default:13,auto_docstr:13,auto_field:[8,11,16,34,36,38,39,40],auto_refram:18,auto_remove_nan:18,auto_removes_nan:18,autofil:[51,52],autom:113,automat:[8,11,12,13,16,18,34,36,38,39,40,84,85,95,101,103,112,116],aux:[7,40],auxiliari:40,av1:113,avail:[57,110,113],averag:[12,49,65,99],avgtabl:49,avgtabul:49,avoid:[8,54,62,95,108,114],ax:[18,28],axi:[18,35],azur:[63,105],b1:54,b723dc6f19f93bca0827155cca36965d:81,b8aafa415ba94b6d8d34e3433316a2a3:77,b:[5,26,57,102,104,105,113],babraham:110,background:[6,89,95],backup:16,backup_dir:17,bam:[8,12,22,40,51,52,64,68,76,95,105,107],bam_out:8,bar:[35,52,86,89,99,100,103],barcod:[32,51,52,73,89,95,101],barcode3:73,barcode5:73,barcode_end:[32,51,52],barcode_start:[32,51,52],bare:42,base:[1,5,8,9,10,11,12,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,45,49,51,52,58,60,61,63,66,75,78,81,84,88,99,105],base_pos_index:14,bash_profil:112,basic:[30,95],batch:[7,11,12,16,38,39,40,51,52,53,55,59,77,81,83,84,89],batch_num:[11,12],batch_read_index:14,batch_siz:[40,51,52],batch_to_uniq:11,batch_to_uniq_read_num:11,batch_typ:12,batchedrefseqreport:[12,40],batchedreport:[11,12,38,40],bayesian:[11,77,96],bc18c08eca71f48d57e0119392042cc3:81,bdhkmrsvwy:85,becaus:[5,9,10,20,44,46,52,54,62,63,69,71,84,85,87,92,95,96,102,103,104,105,108,112,113],becom:[5,113],beebe1e830d72da7296aeb62a29e057b:81,been:[20,49,59,95,96,103,107,110,113],befor:[8,12,51,52,61,63,76,84,95,96],began:[11,12,38,76,77,78,80,81,82,83,92],begin:[5,12,52,60,63,65,84,85,96,105,119],behavior:[12,103,108,114],behind:85,being:[24,35,36,63,75,84,91,105,112],belong:85,below:[9,54,96,99,103,114,116],benefit:[89,105],bernoulli:20,besid:85,best:[5,11,87,95,96],best_ord:11,beta:49,better:[8,9,95,96],between:[11,18,20,22,26,28,29,34,38,40,41,44,49,51,52,55,58,66,72,78,81,89,92,93,96,99,100,101],beyond:65,bia:[11,20,49,103],bias:103,bic:[11,84,96],bin:[35,51,52,110,112],binari:[5,12,41,54,67,103],bind:108,binomi:49,bio:110,bioconda:110,bioinformat:110,biolog:108,bit:[5,11,20,21,29,38,49,54,77,96,103],bitvec:21,bitwis:54,blank:[30,51,52,54,62,92],blast:95,block:24,blot:92,blue:12,bnum:59,bodi:85,bohn:1,bold:12,bonu:8,bonus:9,bool:[5,8,10,11,12,14,15,16,19,22,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,46,49,51,57,76,78,81],borrow:113,both:[9,12,15,24,29,42,54,63,69,71,76,87,90,95,102,104,105,107,108,113,116],bottom:92,bound:[35,49],bowti:[8,62,110],bowtie2:[8,9,51,52,76,95,110],bowtie2_build_cmd:8,bowtie2_cmd:8,bowtie2_flag:8,bowtie2_index:8,bowtie2_input:8,box:99,bracket:[28,34,64,68],branch:[76,77,78,80,81,82,83],brick:59,brickl:[16,64,68,96,103,105],brickleio:16,brief:[99,113],broadcast:[18,19],broadcast_regex:19,broken:114,brotli:[11,16,38,40,51,52,59],brotli_level:[11,16,38,40,51,52],browser:116,bt2:[52,63,95],bt2_:[8,51,52],bt2_contain:[8,51],bt2_d:[8,51,52],bt2_discord:[8,51],bt2_dovetail:[8,51],bt2_dpad:[8,51,52],bt2_gbar:[8,51,52],bt2_i:[8,51,52],bt2_l:[8,51,52],bt2_local:[8,51],bt2_mix:[8,51],bt2_orient:[8,51,52],bt2_r:[8,51,52],bt2_score_min_e2:[8,51,52],bt2_score_min_loc:[8,51,52],bt2_un:[8,51],bt2_x:[8,51,52],btype:[12,16,59],buffer:74,bug:[12,18,63,95,109],build:[8,11,12,16,22,29,62],build_path:16,builddir:12,buildpar:12,built:[92,95,113],builtin:12,button:116,bv1:113,bv2:113,by_read:49,bytes_per_batch:40,c2c0ee505c970d55d2e17e8a2d8ba48c:81,c2e57a06bcde2a3dd99f8ed9ce7c4947:77,c5cec619b953ff80609f172a04abf6ec:81,c76bc505a886475d93743202a6d61461:77,c:[5,7,8,9,26,29,35,40,42,52,54,60,61,62,63,65,81,87,88,92,103,105,108,110,113],c_:58,cacgagcgatag:63,cach:[12,57],cacodyl:74,caga:5,cagattcgaa:5,cagattcgaaaa:5,cagn:5,cagnttcgan:[5,57],cagnttcganaa:5,calc:49,calc_bic:11,calc_coeff_determ:18,calc_dt_minut:12,calc_f_obs_df:21,calc_f_obs_fram:20,calc_f_obs_numpi:[20,21],calc_f_obs_seri:21,calc_mean_pearson:11,calc_mu_adj:21,calc_mu_adj_df:21,calc_mu_adj_fram:20,calc_mu_adj_numpi:[20,21],calc_mu_adj_seri:21,calc_nrmsd:18,calc_nrmsd_group:11,calc_pearson:18,calc_pearson_group:11,calc_prop_adj_fram:20,calc_prop_adj_numpi:20,calc_quantil:18,calc_rank:18,calc_rm:18,calc_rms_nrmsd:11,calc_rmsd:18,calc_rmsd_group:11,calc_spearman:18,calc_taken:12,calc_tru:19,calcul:[11,12,18,19,20,54,96,103,105],call:[7,8,12,13,15,24,26,40,41,42,44,50,51,52,63,67,96,102,103,105,113],callabl:[8,11,12,13,15,18,24,34,35,36,38,39,40,49],came:[66,95,99,102,103],can:[4,7,8,12,15,18,19,20,24,29,30,34,35,42,52,58,59,60,61,62,63,66,69,70,71,72,73,74,75,84,85,86,87,88,90,91,92,93,94,96,98,99,100,101,102,103,104,105,106,107,108,110,113,116],cannot:[42,54,67,84,85,90,95,116],canva:99,cap:[20,93],capit:92,care:[84,87],carefulli:95,cast:[12,62],cast_path:12,caus:[9,12,18,34,54,62,92,95,103,105,113],caution:[51,52],cautious:[10,46,52],caveat:96,cd:[26,75,103],ceas:96,cell:[74,103],central:12,certain:[69,87,91],cgroup:[35,51,52],cgroup_tabl:35,chage:28,chain:[12,38],chaineddataset:12,chainedmutsdataset:[11,12,36,38],chanc:96,chang:[11,12,51,52,85,95,96,99,112,113],charact:[5,12,22,26,29,30,41,44,60,62,85,92,95,105],characterist:[28,35,100],chartreus:67,check:[8,12,15,19,20,21,42,96,102,103,104,105,110,111,114,116],check_all_don:32,check_don:32,check_exist:32,check_fqs_xam:8,check_set:32,check_typ:16,checksum:[11,12,16,40,77,81,83,117],checksum_kei:38,chemcial:103,chemic:[20,74,103],chicken:96,choic:[5,95,116],choos:[49,90,93,99,102,103,104,110],chose:93,chosen:[20,95,110],chunk:5,ci_count:49,ci_ratio:49,cigar:[8,41,42,44,45,95],cigar_str:[41,44],cigar_test:45,cigarop:[41,42],cigarop_test:42,circumst:95,citat:0,cl:26,classmethod:[8,11,12,16,19,26,28,29,34,35,36,38,39,40,49],clean:[7,52,89,95,105,109],clean_fasta:10,cleaner:[10,85],cleanfa:[7,85],clearli:54,cli:[7,8,13,50],click:[12,13,35,99,112,114,116],clip:[20,21,32,42,51,52],close:[9,20,21,67,81,103,112],closer:[20,103],clust1:35,clust2:35,clust:[12,33,35,36,49,52,65,77,88,98,99,102,106],clust_head:49,clustbatchio:96,cluster:[7,12,20,21,36,49,51,59,68,71,79,89,90,92,95,98,101,107,109],clusterbatchio:11,clusterio:11,clustermutsbatch:11,clustermutsdataset:[11,36,49],clusterreadbatch:11,clusterreaddataset:11,clusterreport:11,clustfreqt:[33,49],clustfreqtableload:49,clustfreqtablewrit:49,clusthead:12,clustpost:[34,49],clustpostableload:49,clustpostablewrit:49,clustreadt:49,clustreadtableload:49,clustreadtablewrit:49,clusttabl:49,clusttabul:49,clutter:95,cmap:35,cmap_class:35,cmd:[15,112],cmds_to_pip:15,cmds_to_seri:15,cmds_to_subshel:15,code:[5,12,22,26,27,29,35,42,44,45,49,58,63,64,68,85,87,99,103,112,113],code_test:27,codestr:35,coeffici:[18,19,52,103],coexist:111,col:11,col_index:35,col_titl:35,collect:[11,29,44,54,67,105,113],color:[12,28,35,64,68,92,95],colorformatt:12,colormap:35,colormapgraph:35,column:[12,18,20,28,29,35,49,54,72,87,108],com:[0,116,119],combin:[13,30,39,90,95,102,104],combine_metadata:33,come:[11,20,35,41,63,87,89,96],comma:[9,69,71],command:[7,12,15,16,35,40,50,59,60,61,62,63,69,70,75,87,88,90,92,95,96,98,99,101,102,103,104,105,106,107,108,109,110,112,113,114,116],comment:20,common:[12,99,103,105],commonli:[59,103],compar:[5,11,18,20,29,30,51,52,89,101,103,108],compare_test:19,compare_window:18,comparison:[7,18,52,95,100],compat:[8,44,85,113],compel:95,compens:54,compil:26,complement:[29,30,34,37,38,51,52,75,91,108],complementari:29,complet:[95,96],completedprocess:[8,15,22],complex:44,comppair:[35,52],compress:[6,8,11,16,29,38,40,49,51,52,57,63,64,67,68,95,96,103,105,109],compressedseq:[29,57],compris:[12,60,61,62,63,102],compself:[35,52],comput:[11,14,16,20,22,28,29,40,45,51,52,65,84,89,93,95,101,108,110,113,117],compute_auc:28,compute_auc_roc:28,compute_roc_curv:28,compute_rolling_auc:28,concaten:[5,29],concentr:74,concord:[8,51,52,76,95],concordantli:[76,95],conda:[109,111,113],condabin:112,condit:[74,103],conf:112,confid:[49,63],config:12,configur:12,confirm:[11,95,103,105,110,116],conflict:111,conform:96,conform_seri:33,connect:[28,34,46,52,64,68],consecut:[8,9,51,52,76,103],consequ:[95,108],consid:[8,9,44,51,52,54,95,96],consist:[9,62,63,92],constant:[5,27,49],constitu:[12,36,39],constrain:84,constraint:[34,51,52,99],construct:[18,32],consum:[41,44,95],contain:[5,8,12,18,24,28,29,34,49,51,52,56,58,59,60,61,62,63,65,67,72,85,87,95,96,98,99,102,103,104,105,108,113],contamin:95,content:[64,102,104,114],contigu:[14,28,30,60,108],contiguous_m:14,continu:[18,34,99],contrast:107,control:[35,95,107,110,113],conv_thresh:11,conveni:[12,29,42,44,75,90,107,108],convent:[12,108],converg:[11,51,52,77,84,96],convers:[95,102,113],convert:[8,9,12,18,22,26,29,34,44,63,67,85],coord:[29,34,38,51,52,108],coordin:[29,34,38,44,51,52,65,73,75,89],copi:[4,29,70,72,73,74,75,95,99],core:[7,8,10,11,33,34,35,36,38,39,40,41,42,44,45,49,51,92],corner:116,correct:[5,20,29,49,95,103,110],correctli:[63,110],correl:[11,18,52,96,100,103],correspond:[8,18,28,29,37,44,54,58,63,65,66,95,96,110],corrol:[35,100],corrupt:116,cost:[95,96,103,105],could:[12,29,41,54,62,63,72,84,87,90,95,98,99,105,107,113],count:[8,11,12,14,18,22,26,29,35,38,40,41,42,49,51,52,54,81,84,88,89,95,101,102,103,104],count_base_typ:14,count_cigar_mut:[41,42],count_cigar_read:41,count_cigar_ref:41,count_del:[26,38,51],count_fastq_read:8,count_in:[26,38,51],count_per_po:14,count_per_read:14,count_po:18,count_ref:26,count_single_pair:22,count_sub:26,count_total_read:22,count_uniq_read:11,counterpart:95,counts_ob:49,counts_per_uniq:11,counts_po:18,counts_pos_consensu:18,cours:113,cov:65,cover:[14,29,42,49,55,65,87,108],cover_per_po:14,cover_per_read:14,coverag:[26,42,49,87,95,100],coverage_matrix:14,cpu:114,cram:[8,22,40,51,52,62,64,68,76,95,105],crash:[24,99],creat:[11,12,18,24,30,40,42,63,95,96,99,100,102,104,107,108,111,114,116],create_path_typ:12,create_report:[32,38],create_temp_sam:40,creation:113,credit:119,criteria:[37,69,89,103,109],criterion:[11,77,96],critic:[12,92],csh:112,csv:[11,29,33,34,35,36,38,49,51,52,65,69,70,71,72,73,74,75,87,88,98,99,106,108],ct2dot:[34,110],ct:[7,28,34,51,52,64,68,99],ct_data:28,ct_file:34,ct_in:28,ct_input:34,ct_out:28,ct_output:34,ct_path:28,ct_pos_5:[46,52],ct_text:28,ct_titl:28,ctatgt:108,ctg:54,ctio:28,ctrl:92,curl:117,current:[11,20,40,44,95,110,113,114],curv:[28,34,35,52,100],custom:[99,103],cut:[5,8,51,52,63,81,95],cut_:[8,51,52],cut_a1:[8,51,52],cut_a2:[8,51,52],cut_discard_trim:[8,51],cut_discard_untrim:[8,51],cut_g1:[8,51,52],cut_g2:[8,51,52],cut_indel:[8,51],cut_m:[8,51,52],cut_nextseq:[8,51],cut_o:[8,51,52],cut_q1:[8,51,52],cut_q2:[8,51,52],cutadapt:[8,51,52,63,76],cutadapt_cmd:8,cutadapt_input_arg:8,cv1:113,cv2:113,cyan:[12,105],cytidin:1,d120b2d3a8f67458bac23e68aad745c:77,d1:54,d295b42cc757255ad29070f00fb6a51d:81,d4361a74f58bfcaab96d9448eb6d91dd:77,d:[26,35,42,52,87,103,112],data1:[11,12,35,36,38],data2:[11,12,35,36,38],data:[11,12,14,16,18,20,28,35,36,38,39,40,49,51,52,56,58,59,66,68,73,74,76,77,78,79,80,81,82,83,86,88,89,92,94,96,98,99,101,103,105,109],data_head:35,data_kind:35,data_nam:28,data_sect:28,databas:85,datafram:[8,11,14,18,20,28,33,35,49],dataset2_report_fil:12,dataset:[11,12,20,35,36,38,39,40,49,52,89,94,96,109,115,117],dataset_typ:12,date:[74,92],datefmt:12,datetim:[11,12,38],db:[28,34,64,68,99],db_file:34,db_path:28,dbn:61,dcm:92,dd:92,dd_hh:92,de:0,deactiv:[110,111,112],debug:[12,50,52,92,113],dec:54,decid:103,decim:[54,65,66],decod:[5,22],decode_phr:22,decompil:26,decompress:[6,29,57,95,109],decor:[18,25],decreas:[11,84,96],dedupl:12,deem:25,deepest:65,default_kei:12,defeat:95,defin:[7,11,12,13,29,38,40,44,50,52,54,58,72,73,74,75,81,89,101,109],definit:[29,95],degener:29,del:[44,52,65,103],del_ord:11,del_pos3:44,del_pos5:44,delclust:[11,84,96],delet:[8,9,11,26,38,40,42,44,51,52,65,85,87,88,89,95,99,102,103,104,109,113,116],delete_fastq:32,delete_fq:32,delete_temp_sam:40,delete_text_fastq:32,deliber:59,delimit:60,delprof:[35,87,100],delta_log_lik:11,deltaprofilegraph:35,deltaprofilerunn:35,deltaprofilewrit:35,demult:7,demult_on:51,demulti:52,demulti_overwrit:[32,51,52],demulti_workspac:32,demultiplex:[8,32,51,52,62,63,76,89,101],demultiplex_run:32,demultiplex_workspac:32,denomin:87,denot:[8,44,58],dens:59,depdend:110,depend:[12,15,16,24,94,95,102,108,111,112,113],dependency_exist:15,deprec:113,depth:[90,95,103],deriv:[27,29],describ:[9,20,65,112],descript:[13,58,70,72,73,74,75,95,100,105,114],desigin:[51,52],design:[51,52],desir:112,despit:95,destin:[8,10,34,40,46,51,52],destroy_temp_data:32,detail:[4,12,20,35,57,63,85,87,92,95,96,99,100,105,114],determin:[1,8,12,16,18,22,24,25,29,44,52,54,62,95,96,99,105],dev:77,develop:[0,1,92,113],deviat:[18,52,114],df:35,dfc527236af3a5888d3753b2c0041dc3:81,diagram:63,dict:[8,12,13,14,16,22,24,26,28,29,30,32,33,35,36,40,41,42,44,49,58,76,77,80,81,83],dict_to_pair:28,dictionari:[28,32],did:[87,95,103,114],differ:[20,34,35,51,52,54,58,63,78,87,92,93,95,96,99,100,103,105,110,113,115,116],difficult:54,difficulti:67,digest:16,digest_data:16,digit:54,dim:18,dim_test:19,dimension:[18,21,58],dimethyl:1,dir:[52,85,102,104,105,107],dir_seg_typ:[8,16,34],direct:[12,44],directli:[12,20,35,62,63,84],directori:[8,9,12,16,25,28,34,36,39,46,49,52,63,65,67,85,87,88,90,95,96,98,99,102,103,104,105,106,107,116],directoy_to_write_to:32,disabl:[11,51,52,92,95,96,103,105],discard:[8,51,52,76,95,103],discord:[8,51,52,76,95],discordantli:95,discount:[26,38,52,103],discount_mut:[38,51,52],discourag:[12,95,103],discrep:[95,105],discret:99,discuss:114,dispatch:24,displai:99,distanc:[8,34,51,52,76,78,99],distinct:95,distinguish:[95,96],distribut:[4,12,49,113],divid:[65,94,105,108],divis:5,dm:[3,20,28,74,95,103,109],dmfastqi:[8,51,52,95],dmfastqx:[8,51,52,95],dmfastqz:[8,51,52,95],dna:[5,8,12,14,16,29,30,34,35,38,40,41,42,44,45,51,57,62,65,85,95,103],doc:112,docdef:13,docstr:[9,13,24],document:[13,44,52,87,95,99,112,119],doe:[12,25,28,34,42,44,51,52,54,61,84,95,96,99,103,105,109,112,113,114,116],doesn:96,doi:20,don:[96,102,104],dot2ct:34,dot:[28,34,64,68],doubl:[28,54,92,95,102,103,104,110],dovetail:[8,51,52,76,95],downgrad:113,download:[112,113,117],downstream:[58,75,108],dozen:113,dpad:52,drag:99,draw:[66,99],dreem:[3,96,109],drop:[13,18,20,63,103],drop_close_mut:21,drop_fail:24,dtime:12,dtype:12,due:[44,95,103,105],duplic:[11,12,13,30,114],durat:74,dure:[8,44,51,52,59,63,74,76,84,92,95,103,105,108,110,116],e007d6017dae45004c11906a6bc073da:77,e1:54,e2:[52,95],e:[12,20,29,34,41,52,62,63,66,84,85,87,90,93,95,96,100,101,102,103,104,107,108,113],each:[5,8,9,11,12,13,14,18,20,21,22,24,26,28,29,30,32,33,34,35,36,37,38,40,41,42,44,46,49,51,52,54,56,57,58,59,60,61,62,63,65,66,67,69,70,71,72,75,84,87,89,91,92,96,99,100,101,102,103,104,105,107,108,110,113,116],easi:[8,20,79],easier:[92,108,112],easiest:[90,112],easili:[102,104],edg:[34,35,108],edit:[8,9,67,87,96],editor:99,edu:[34,110],effect:[108,112],effici:[5,44,57,84],effort:[67,95,111],egg:96,eight:[54,100],either:[4,26,29,35,42,49,54,63,65,87,95,102,103,112],element:[18,29,41,44,65,103],elimin:12,els:[12,29,95,96],elsewher:95,em:[11,52,77,96],em_clust:11,em_run:[11,51,52],em_thresh:[11,51,52],emclust:11,empti:[29,30],empty_ok:29,en:[0,112],enabl:[51,52,95,96,105],enc:[52,95,105],encapsul:29,encod:[5,8,12,22,40,44,51,52,55,57,58,60,61,62,76,85,103,105],encode_compar:44,encode_match:[44,45],encode_phr:22,encode_rel:[44,45],encode_test:45,encount:[105,110,112],end31:44,end32:44,end3:[12,14,16,22,28,29,40,41,42,49,58],end51:44,end52:44,end5:[8,12,14,16,22,28,29,40,41,42,45,49,58],end:[5,8,11,12,13,14,22,28,29,30,34,38,41,42,51,52,55,60,65,66,67,75,76,77,78,80,81,82,83,96,103,105,107,108,119],endogen:103,energi:[34,51,52,78,99],ensembl:[49,65,99],ensur:[8,12,34,44,62,95,102,103,104,105],ensure_ord:14,ensure_same_length:14,entail:114,enter:[29,107,110,113],entir:[29,35,51,54,63,65,92,94,95,96,100,107,108,109],entri:[7,22,50],env:[110,112],environ:[109,111],equal:[8,18,21,30,34,41,54,96,108],equival:62,eras:[10,44,46,52],erron:[95,103,105],error:[8,12,15,19,21,29,42,44,51,52,62,76,92,95,102,103,104,105,110,112,114],es:12,esac:112,escap:12,especi:[8,95,103,110,112,114],essenti:8,estim:[11,20,103],et:[1,20,96,103],etc:112,even:[4,8,10,11,12,26,33,34,36,37,38,39,40,46,49,51,52,54,102,104,105],event:92,ever:108,everi:[5,8,11,12,18,21,24,26,28,29,30,35,40,41,44,45,49,52,54,58,60,61,62,66,72,79,85,87,90,95,96,103,105,107,110,113],evid:[96,119],exact:[54,114],exactli:[29,35,75,76,95,105,108,110],examin:[95,96],exampl:[8,9,12,26,52,54,55,63,67,69,71,79,86,87,90,91,92,93,95,96,99,102,103,104,105,107,108,109,112,113,114,115,117],exce:[96,103],excel:[69,71,113],except:[12,24,26,30,42,44,79,85,91,92,95,96,103],exception:20,excess:[95,103],exclud:[16,20,38,49,51,52,70,81],exclude_def:13,exclude_default:13,exclude_fil:[38,51,52],exclude_gu:[38,51],exclude_mask:49,exclude_polya:[38,51,52],exclus:103,execut:[40,112],exist:[8,10,11,12,15,20,25,28,33,34,36,37,38,39,40,44,46,49,51,52,62,84,85,95,96,102,104,113,114],exit:[8,34,40,51,52],exogen:87,expand_degenerate_seq:[29,30],expect:[8,11,20,29,30,42,98,103,114],expedit:113,explan:[52,95,99,105],explicit:[12,35],explicitli:[29,44,58,59,90],export_cmd:8,export_sampl:33,expos:[7,8,99],express:[19,49],ext:[12,35,49],ext_typ:12,extant:[8,44],extend:[29,85],extens:[8,12,35,49,51,52,76,95,105],extern:[7,12,95,105],extra:[13,54,109,110],extra_default:13,extra_docstr:13,extract:[5,8,22,29,52,95],extract_fasta_seqnam:29,extran:95,extrem:[96,105],f9874e5c37b56316d47bacc0a7cc604:83,f:[63,92,95,103],f_ob:20,f_rtol:20,f_tol:20,fa:[62,85,95,105,107,116],factor:18,factori:[51,52],faidx:[22,95],fail:[8,24,30,34,51,52,76,84,92,95,105,110],failur:[24,92],fairli:96,fall:20,fals:[5,8,10,11,12,14,16,21,22,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,46,49,51,57,76,78,95],falsi:30,familiar:[110,113],fanci:26,fashion:35,fast:99,fasta:[7,8,22,28,29,32,40,51,52,64,68,89,95,103,105,107,109,116],fasta_in:10,fasta_out:10,fasta_path:32,fasta_test:30,fastaclean:10,faster:95,fastq1:8,fastq1_path:32,fastq2:8,fastq2_path:32,fastq:[8,9,22,32,40,51,52,62,64,67,68,76,89,90,101,107,110,116],fastq_arg:8,fastq_fil:8,fastq_gz:8,fastq_id:32,fastq_nam:32,fastq_to_dict:32,fastq_to_search:32,fastq_to_writ:32,fastqc:[8,9,51,52,76,103,110],fastqc_cmd:8,fastqi:[8,51,52,95],fastqunit:[8,32],fastqx:[8,32,51,52,90,95],fastqz:[8,51,52,95],fatal:92,favor:[8,9],feat:113,featur:90,feedback:109,fetch:49,fetch_count:49,fetch_ratio:49,few:[5,20,38,81,95],fewer:[20,21,96,103,105],ff:[52,54,63,95],ffff:63,fffff:63,fffffff:63,fffffffff:63,field:[8,11,12,16,34,35,36,38,39,40,44,49,60,65,69,71,79,95,96,105],field_kei:12,field_titl:12,field_typ:12,field_valu:12,figur:[35,54,87],figure_align:8,file:[7,9,10,11,12,16,22,28,29,32,33,34,35,36,37,38,39,40,44,46,49,51,52,56,64,69,71,72,73,74,75,76,79,83,84,86,89,91,101,109,114,117],file_seg_typ:[8,11,16,34,36,38,39,40],file_test:17,fileexistserror:12,fileio:[12,16],fill:[12,20,29,54],fill_whitespac:12,filter:[21,22,25,32,35,38,52,67,76,87,89,91,101],find:[8,11,12,14,18,20,35,41,42,44,51,52,54,91,96,102,103,104,105],find_all_t:49,find_ambrel:44,find_best_ord:11,find_cigar_op_po:[41,42],find_ct_fil:34,find_fil:12,find_files_chain:12,find_op:41,find_po:37,find_pos_t:49,find_read_t:49,find_rels_lin:44,find_rels_read:44,find_root_pair:28,find_tabl:49,finder:49,finds_multigrepped_read:32,finfo:[38,52,103,107],finish:[95,110,113],first:[5,11,12,15,18,20,29,35,44,54,58,59,60,61,62,65,72,73,74,75,84,85,93,95,96,103,107,108,110],fish:112,fit:[4,12,14,16,26,62],fit_uint_s:12,fit_uint_typ:12,five:[56,58,89],fix:[95,105,114],fl:59,flag:[8,12,22,44,92,103,105],flags_exc:22,flags_req:22,flagstat:[22,40],flagstat_cmd:22,flank:[9,44,108],fmt:12,fmt_fanci:26,fmt_func_arg:24,fmt_plain:26,fmut:[38,52,91,103],fna:62,focu:113,fold:[7,51,60,61,62,66,68,79,89,100,101,107],fold_constraint:[34,51,52],fold_max:[34,51,52],fold_md:[34,51,52],fold_mf:[34,51],fold_perc:[34,51,52],fold_profil:34,fold_sect:34,fold_temp:[34,51,52],foldreport:34,follow:[0,5,8,18,26,29,34,41,49,54,57,58,59,60,61,62,63,65,66,67,81,85,95,96,98,102,103,105,107,108,110,112,113,114,116],forbid:30,forc:[8,10,11,12,16,18,28,29,33,34,35,36,37,38,39,40,46,49,51,52,84,85,92,102,104,107],foreign:95,forg:110,form:[12,14,20,26,54,96],format:[8,12,22,24,26,29,34,44,51,52,85,87,99,103,105,109],format_clust_nam:12,format_exp_count_col:11,format_fasta_name_lin:[29,30],format_fasta_record:[29,30],format_fasta_seq_lin:29,format_metadata:33,format_retitled_ct_lin:34,format_vers:12,formatt:12,fortun:113,forward:[29,34,38,51,52,75,95,108],found:[8,11,20,51,52,76,96,103,110,112,114],foundat:4,four:[5,29,42,54,63,65,85,110],fpath:32,fpr:[28,35],fq1:32,fq2:32,fq:[9,63,95,107,116],fq_inp:8,fq_name:95,fq_out:[8,22],fq_pipelin:8,fq_unal:8,fq_unit:[8,32],fqop:8,fqs_pipelin:8,fqunit:[8,32],fqutil:9,fqutil_test:9,fr:[8,51,52,76,95],fraction:[20,21,37,38,49,51,52,65,81,87,100],fragil:95,fragment:[8,51,52,76],frame:[8,11,14,18,20,33,35,49],frame_test:[19,21],framework:92,free:[4,12,34,51,52,78,99,105],freq:[65,98,106],freqtabl:49,frequenc:49,frmt:12,from3to5:44,from:[5,7,8,9,11,12,13,16,18,19,20,22,24,28,29,30,34,35,36,37,39,40,41,42,44,45,49,51,52,54,60,62,63,64,66,68,72,76,85,87,89,92,96,98,99,101,103,105,106,107,108,109,113,114,117,119],from_clust:11,from_count:26,from_ct:28,from_dataset:11,from_dict:12,from_dir:12,from_path:8,from_read:40,from_report_format:26,from_struct_profil:28,front:32,frustrat:113,fse:[77,81,92],fse__averag:78,fse_r1:116,fse_r2:116,full:[11,12,29,30,44,90,95,96,99,103],fulli:[44,54,95],fulltabul:49,func:[13,18,24],further:[1,87],futur:[63,113,119],fwd:29,fwd_clip:32,fwd_primer:32,g1:[52,95],g2:[52,95],g:[5,8,9,26,29,34,35,38,42,51,52,54,60,61,62,63,65,81,84,87,88,93,95,100,101,102,104,105,107,108,113],gap:[8,20,29,30,34,38,51,52,58,72,75,81,95,103,108],gap_extend:[8,9],gap_open:[8,9],gave:103,gb:63,gbar:52,gcatgctagcca:63,gctcttccgatct:[8,51,76,95],gencod:85,gener:[4,5,8,9,11,12,20,26,28,29,30,34,35,45,49,67,86,88,89,90,95,96,103],generate_batch:40,genom:103,get:[8,9,11,12,13,18,19,22,25,28,29,35,37,40,41,49,95,102,104,105,108,112],get_action_nam:35,get_alphaset:29,get_args_count_fastq_read:8,get_batch:[12,40],get_batch_checksum:12,get_batch_path:12,get_batch_typ:[11,12,38,40],get_bound:35,get_bowtie2_index_path:8,get_btype_nam:12,get_byte_dtyp:12,get_cmap:35,get_cmap_typ:35,get_colormap:35,get_common_best_run_attr:11,get_common_ord:11,get_comp:29,get_comp_func:18,get_comp_nam:18,get_comptran:29,get_coords_by_ref:29,get_count_path:11,get_count_per_po:14,get_count_per_read:14,get_cover_per_po:14,get_cover_per_read:14,get_coverage_matrix:14,get_ct_fil:28,get_dataset1_load_func:[11,12,36,38],get_dataset1_report_fil:12,get_dataset2_load_func:12,get_dataset2_typ:[11,12,36,38],get_dataset_load_func:[12,36,39],get_db_fil:28,get_db_struct:33,get_dms_fil:28,get_docstr_lin:13,get_dtyp:12,get_edg:35,get_edges_index:35,get_fasta:28,get_fasta_seq:29,get_field:12,get_fields_in_seg_typ:12,get_flagstat:22,get_graph:35,get_graph_typ:35,get_half_coverage_matrix:14,get_hist_trac:35,get_info:14,get_invers:14,get_length:14,get_list_path:37,get_lock:25,get_log_exp_obs_count:11,get_mask:29,get_matrix:11,get_max_uint:12,get_max_valu:12,get_mu:11,get_non_seq_regex:10,get_nonalphaset:29,get_null_valu:49,get_num_parallel:24,get_oconv_array_float:12,get_oconv_dict_float:12,get_oconv_dict_list_float:12,get_oconv_float:12,get_oconv_list_float:12,get_other_iupac:29,get_param_default:13,get_param_lin:13,get_path:[16,35],get_path_field:35,get_path_seg:35,get_pictran:29,get_prop:11,get_reads_per_batch:40,get_reads_per_po:14,get_ref_metadata:33,get_rel_nam:49,get_rels_per_po:14,get_rels_per_read:14,get_report_typ:[11,12,36,38,39,40],get_resp:11,get_roc_trac:35,get_rolling_auc_trac:35,get_sample_data:33,get_sample_metadata:33,get_sample_ref_ext:8,get_sect_coords_prim:29,get_sect_metadata:33,get_seq_base_bar_trac:35,get_seq_base_scatter_trac:35,get_seq_line_trac:35,get_seq_stack_bar_trac:35,get_shared_index:[29,30],get_table_data:33,get_table_find:35,get_table_load:35,get_table_path:11,get_tabulator_writ:49,get_tabulator_writer_typ:49,get_top_logg:12,get_trac:35,get_uint_dtyp:12,get_uint_s:12,get_uint_typ:12,get_uniq_nam:11,get_uniq_read:11,get_varna_color_fil:28,get_verbos:12,get_window:30,get_writer_typ:35,github:[0,44,114,117],give:[12,13,21,28,65,75,84,87,88,90,95,96,98,99,102,103,104,105,106,107,109,110,113],given:[5,8,11,12,13,15,16,18,20,22,24,26,28,29,30,34,35,40,41,44,45,46,49,52,54,58,69,71,72,73,74,81,90,92,102,103,104,108,116],glob:90,global:[92,96],gnu:4,go:[51,52,72,87,95,96,99,102,103,104,105,106,107],goe:[41,98,113],good:[54,116],googl:0,gpu:114,grai:[99,107],graph:[7,33,34,51,60,64,68,84,89,101,107,109],graph_filenam:35,graph_kind:35,graph_obj:35,graphbas:35,graphic:87,graphrunn:35,graphwrit:35,greater:[8,9,18,20,30,84,91,93,95,96,103,108],green:12,grep:[32,51,52],grep_both_fastq:32,grote:0,group:[11,18,29,95,96],gs:[8,51,52,76,95],gt_eq:14,gu:[29,52,103],guarante:96,guess:[20,96],guid:[63,95,99,112],guidanc:110,guidelin:119,gz:[49,63,65,95,98,99,106,107,116],gzip:[8,49,63],ha:[5,9,12,18,20,21,29,41,42,44,54,57,59,62,63,66,86,87,92,95,103,105,108,110,113,114],had:[20,84,95,96,103,110,114],half:18,halfrefpattern:26,halfrelpattern:26,halt:[92,96],handl:[34,85,105,108],handler:12,happen:[18,59,92,103,105],hard:95,harder:44,harvard:0,has_close_mut:21,has_ipath:15,has_opath:15,hash:29,hashabl:[30,35],have:[4,5,9,18,20,29,34,38,44,49,54,58,63,72,84,85,90,91,95,96,99,102,103,104,105,107,108,110,112,113,114],head:95,header:[8,12,22,28,35,49,54,63,85,95],header_depth:49,header_row:49,header_test:31,header_typ:49,helix:28,help:[20,52,95],helper:49,henc:[5,54,95],here:[12,58,108],hewhosshouldersblockthesun:0,hex:54,hexadecim:[16,54],hh:92,hi_qual:41,hide:113,high:[8,20,41,51,52,54,76,95],higher:[84,92,103],highest:54,highli:113,hist:[35,52],hist_bin:[35,51,52],hist_margin:[35,51,52],histogram:[35,51,52,65,100],histogramgraph:35,histogramrunn:35,histori:44,histpo:[35,100],histread:[35,100],histrel:35,hl:0,home:[110,112],hook:112,hope:4,hopefulli:119,horizont:[36,89,101,110],hour:95,hover:87,how:[24,28,54,96,103,105,111,112],howev:[54,58,72,90,95,96,103],ht:44,html:[34,35,51,52,87,88,95,110,112],htslib:110,http:[0,4,20,34,44,110,112,116,119],hui:74,human:[41,69,71],humanize_relvec:41,hundr:95,hybrid:24,hyphen:[29,30,108],hyphenate_end:[29,30],hypothet:12,i4d4aceaaaaj:0,i:[12,20,24,26,29,35,41,42,52,56,58,62,63,66,67,72,84,85,87,90,93,95,96,99,102,103,104,108],iconv:12,iconv_array_float:12,iconv_array_int:12,iconv_datetim:12,iconv_dict_str_dict_int_dict_int_int:12,iconv_dict_str_int:12,iconv_int_kei:12,idea:[96,113,116],ideal:[12,54,95,96],ident:[11,12,29,30,34,54,96,99,102,104],identifi:[34,44,95,105],idxstats_cmd:22,ifasta:10,ignor:[18,29,30,36,38,51,52,62,70,84,87,92,98,99,103,105,108],ii:103,iii:[95,103],illeg:[30,62,85],illumina:63,illustr:[54,63,87],imag:119,immedi:[54,92],immobil:103,implement:113,impli:[4,95],implicitli:[44,90],impos:62,imposs:[54,105],improperli:95,improv:[12,95,96,114],in_dir:17,inadvert:116,includ:[11,20,29,34,38,51,52,62,69,71,75,95,98,103,108,110,114],include_nan:29,inclus:[66,75],incompat:[95,105,113],inconsist:[12,62],incorpor:62,incorrect:[63,95,105],incorrectli:63,increas:[51,52,72,84,95,96],increment:58,incur:95,indel:[8,9,40,44,51,52,54,76,95,103,105],independ:[11,20,49,51,52,77,96],index:[5,8,11,12,14,18,20,22,28,29,30,32,34,35,36,38,40,41,44,49,51,52,56,57,58,60,62,75,105,110],index_clust:12,index_col:49,index_depth:49,index_fasta_cmd:22,index_ord:12,index_order_clust:12,index_orders_clust:12,index_pfx:8,index_to_po:[29,30],index_to_seq:[29,30],index_toler:[32,51,52],index_xam_cmd:22,indic:[24,28,44,54,61,63,72,85,105],indir:12,indiv:[52,87],individu:[0,8,51,72,76,87,90,95,96,101,103,107,109,110],inequ:[8,9],infer:[11,13,41,52,73,74,89,101,103],infer_read:[41,42],infer_test:42,info:[50,52,65,92],inform:[11,12,34,38,44,45,51,52,54,56,58,59,60,61,62,63,65,67,71,77,81,84,87,90,95,96,98,99,100,102,104,105,107,108,114],infrequ:44,init:[38,112],init_arg:28,initi:[8,20,28,44,50,51,52,62,76,81,85,95,96,111],inkscap:87,inn:44,inner:18,inplac:[10,46,52],input:[8,12,15,16,18,28,35,52,84,85,86,89,101,109,114],input_csv:32,input_path:[10,11,12,16,33,34,35,36,37,38,39,40,49,51,52],input_seg:12,input_typ:16,ins:[52,65,103],ins_len:41,ins_po:44,insensit:26,insert:[8,9,26,38,41,42,44,45,51,52,65,87,88,103],insid:[21,105],inspect:13,instal:[99,109,113],instanc:[11,12,26,28,29,30,35,42,93],instanti:[12,30],instead:[10,12,46,52,93,95,105,110,113],instruct:[95,100,110,112],insuffici:[44,95,103],integ:[9,12,14,18,22,29,34,40,41,44,58,60,63,72,73,74,105,108],integr:116,intend:96,interact:[87,99],interchang:[102,104],interest:[49,59,92],interfac:[7,8,12,40,50],interleav:[8,22,51,52,67],interpret:[92,95],interrupt:92,intersect:[26,29],interv:[8,49,51,52,76,99],introduc:[8,105],introduct:[2,8],invalid:[12,30,42,85],invent:[1,113],invers:[8,26],invert:[21,26],investig:103,involv:12,io:[7,11,12,36,38,39,40,44,112],iopath:15,ipath:15,ir:103,irrelev:67,is_ext:12,is_pair:28,iseq:95,issu:[11,63,113,114,116],item:[11,12,16,18,24,29,33,35,51],iter:[8,11,12,14,16,20,24,26,28,29,32,34,35,36,38,39,40,42,45,49,51,52,77],iter_align:41,iter_base_typ:14,iter_batch:12,iter_cas:45,iter_clust_index:12,iter_clust_table_data:33,iter_graph:35,iter_hist_trac:35,iter_pos_table_data:33,iter_pos_table_pair:35,iter_pos_table_seri:33,iter_pos_table_struct:33,iter_profil:[35,49],iter_read:14,iter_read_table_data:33,iter_read_table_pair:35,iter_record:40,iter_relvecs_al:[41,42],iter_relvecs_q53:[41,42],iter_roc_trac:35,iter_rolling_auc_trac:35,iter_root_modul:28,iter_seq_base_bar_trac:35,iter_seq_base_scatter_trac:35,iter_seq_line_trac:35,iter_seqbar_stack_trac:35,iter_st:35,iter_table_data:33,iter_window:[14,29],iterread:41,iterrel:41,iterrel_test:42,ith:41,its:[1,5,11,12,14,15,18,22,24,26,29,34,35,38,40,41,44,49,51,52,54,60,61,62,63,66,72,87,92,95,99,101,102,104,105,108,111,112,113,114],itself:[44,52,59,86,90,92,96,105,108],iupac:[29,85],j:[52,102],join:[7,12,15,51,52,68,71,79,89,101],join_clust:[36,51,52],join_sect:36,joinclustermutsdataset:36,joinclusterreaddataset:36,joinclusterreport:36,joineddataset:[12,36],joinmaskmutsdataset:36,joinmaskreaddataset:36,joinmaskreport:36,joinmutsdataset:36,json:[12,65,79,90,95,96,99,102,103,104,105,107],junction:28,just:[18,24,33,51,52,66,96,98,102,104,105,110,113],justin:0,justinaruda:0,k:[11,18,32,52,72,84,92,96,99,107],keep:[8,34,38,40,44,51,52,76,95,96,103,108,113],keep_temp:[8,25,32,34,40,51],kei:[8,11,12,13,18,28,29,30,33,41,49,58,65,92],kelvin:[34,51,52,78],kept:[38,81,95,103],key_dint:8,key_dmat:8,key_dsingl:8,key_int:8,key_mat:8,key_mate1:8,key_mate2:8,key_singl:8,key_to_titl:12,keyword:[8,10,11,12,13,15,24,33,34,36,37,38,39,40,46,49,50,51,107],kind:[8,35,49,54],kit:95,kladwang:103,know:[20,95,96,114],knowledg:[44,54],known:[14,44,95],kwarg:[8,11,12,14,16,24,25,28,29,30,33,34,35,36,37,38,39,40,41,49],l:[8,51,52,76,105,116],lab:[0,4,20,34],label:[29,44,58,92,116],label_close_mut:21,lack:[54,95],lajart:0,larg:[8,63,90,95,103],larger:[11,84,96,103,105],largest:11,last:[8,11,16,28,29,34,36,38,39,40,58,60,105,108],later:[4,95],latest:[110,112],latter:103,launch:99,lavend:63,lavender_r1:63,layout:99,ldi:[76,77,78,80,81],lead:95,learn:54,least:[18,29,45,81,96,103,105,114],leftov:105,length:[5,8,12,14,18,24,29,30,34,38,41,42,44,51,52,57,58,60,62,63,75,76,81,95,103,105],lengthen:[41,42],less:[11,18,20,30,45,54,91,92,93,95,96,103,108],lesser:18,let:[111,114],letter:[87,92,103],level:[7,8,11,12,28,29,35,38,40,49,51,52,89,98,102,104,107],level_kei:12,level_nam:12,lib:112,librari:95,licens:[3,109],light:[95,99],like:[12,18,29,63,72,86,87,95,96,103,105,112,113],likelihood:[11,20,51,52,77,96],likewis:54,lilac:63,limit:[29,34,41,51,52,62,78,84,90,95,96,103,105],line1:44,line2:44,line:[7,8,12,22,28,29,30,34,35,40,44,45,50,52,59,63,66,72,73,74,75,92,96,108,112],linear:113,linearli:[5,20,93],link:[12,62,95,112,116],linux:[95,103,105,112],list:[7,8,11,12,13,14,15,16,24,26,28,29,30,32,33,34,35,36,38,39,40,41,42,44,49,52,56,58,65,68,76,77,78,80,81,82,83,84,87,89,95,96,98,99,102,103,104,105,106,107,109,113],list_batch_num:14,list_clust:12,list_fqs_xam:8,list_mut_pattern:49,list_ord:12,list_order_clust:12,list_orders_clust:12,list_po:37,list_rel:42,list_table_fil:35,listdir:8,listpo:[37,70,91],littl:5,ll:114,ln:105,lo_qual:41,load:[11,12,16,34,35,36,38,39,49,79,99],load_all_t:49,load_any_t:49,load_brickl:16,load_ct_struct:34,load_dataset1:12,load_dataset2:12,load_dataset:12,load_func:12,load_pos_t:49,load_read_t:49,load_report:12,load_sect:38,load_tabl:49,load_table_fil:35,loadeddataset:[11,12,38],loadedmutsdataset:[12,40],loader:49,loadfunct:12,loc:[52,95],local:[8,51,52,76,96,112],locat:[20,29,54,73,75,85,95,99,105,107,116],lock:25,lock_temp_dir:[24,25],lockerrfilt:25,log:[5,11,12,15,25,51,52,77,89,96,98,102,104,109,114],log_color:12,log_fil:12,log_lik:11,log_like_prev:11,logarithm:11,logger:12,logmsg:92,logn_exp:11,logrecord:[12,25],longer:[18,20,99,103,114],longest:12,look:[96,110,112],lookup_kei:12,lookup_titl:12,loop:[12,28],lose:103,lost:[95,103],lot:113,low:[41,42,103,105],low_qual:[41,42],lower:[35,49,92,96,103,105],lower_limit:14,lowercas:[8,9,26,62,85,103],ly:38,m1:110,m2:110,m:[35,42,52,87],macbook:110,maco:[95,103,105,112],made:[12,16,36,39,51,52,65,102,104,113],mai:[13,20,24,25,49,58,62,63,72,84,85,91,95,102,103,105,108,110,112,115],main:[8,10,11,12,20,32,33,34,36,38,39,46,49,50,52,63,65,107,116],main_fasta:8,maintain:[12,44],major:[12,34,103],make:[9,12,16,25,28,34,35,44,54,86,87,92,95,96,100,102,104,107,108,110,112,114],make_dict_from_fasta:32,make_dir:17,make_fil:17,make_head:12,make_index:35,make_lock_temp:25,make_path_subject:35,make_sequence_objects_from_csv:32,make_temp:25,make_temp_backup:16,make_title_action_sampl:35,makes_dict_from_fastq:32,malwar:116,mammalian:95,manag:[12,95,103,105,111],mani:[8,9,38,63,75,81,87,95,108,113,114],manner:[8,67],manual:[85,95,109,113],map:[8,11,12,14,22,26,28,29,32,35,40,41,51,52,64,68,76,99,103,107],map_nest:28,mapq:[8,44,45,52,95,105],mapseq:[3,20,109],margin:[29,51,52],mark:[8,40,42,51,52],martin:0,mask:[5,7,11,12,29,36,49,59,66,68,70,79,84,88,89,90,98,101,104,106,107],mask_gu:29,mask_nam:[29,38],mask_po:29,mask_polya:29,mask_pos_fmut:38,mask_pos_ninfo:38,mask_read_finfo:38,mask_read_fmut:38,mask_read_gap:38,mask_read_init:38,mask_read_kept:38,mask_report_fil:11,mask_sect:38,maskbatchio:[38,103],masked_bool:[29,49],masked_int:29,maskio:38,maskmutsbatch:38,maskmutsdataset:[11,36,38,49],maskpost:[34,49],maskpostableload:49,maskpostablewrit:49,maskreadbatch:38,maskreaddataset:38,maskreadt:49,maskreadtableload:49,maskreadtablewrit:49,maskreport:38,masktabl:49,masktabul:49,match:[8,9,12,14,19,26,29,35,42,44,45,54,61,62,75,81,87,89,90,95,99,103,105,109],match_longest_ext:12,mate:[8,14,44,51,52,54,58,67,76,95,105],mathew:34,matrix:[8,11,51,52,58,76,113],matthewfallan:0,matti:[0,11,13,40],max:[14,52,84,91,95,96,99,103,105,107],max_clust:[11,51,52],max_em_it:[11,51,52],max_flag:8,max_fmut_po:[37,38,51,52],max_fmut_read:[38,51,52],max_in:[41,42,45],max_ins_bas:41,max_ins_len:41,max_it:11,max_mu:21,max_ord:[11,12,14,36,49],max_phred_enc:8,max_po:14,max_proc:[8,10,11,24,33,34,35,36,37,38,39,40,46,49,51,52],max_qual:41,max_read:14,max_se:49,maxdist:99,maxim:[11,20],maximum:[8,10,11,12,14,20,24,33,34,36,37,38,39,40,41,46,49,51,52,62,76,77,78,81,84,93,99,103,105,107],maxmimum:96,mb:63,md5:[16,40,77,81,83,117],md:[52,99],me:97,mean:[8,9,11,12,18,26,52,77,85,92,95,96,102,104,105],measur:95,mebibyt:40,median:93,medic:0,meet:[37,69,91],megabas:[40,51,52],membership:11,memor:110,memori:[62,94,95,103,105,114],merchant:4,mere:[84,102,104],merg:[8,11,12,13,35,36,39,54,89,101],merge_end:44,merge_nondemult_fq:8,merge_param:13,merge_rel:44,mergeddataset:12,mergedmutsdataset:12,messag:[12,19,50,52,85,89,105,109,110,112,114],meta:[33,52,98],metadata:[33,51,52,62,68,85,102,108,109],method:[1,18,19,20,49,90,95],methodnam:[9,17,19,21,23,25,27,30,31,42,45],methyl:[20,103],meticul:92,metric:[35,52],mfe:[34,51,52,78,99],miami:59,mib:40,mib_to_byt:40,microsoft:[69,71],mid3:[14,16,40,58],mid5:[14,16,40,58],middl:[14,95],million:105,min:[52,95,96,103,105,107],min_count:[18,29],min_data:28,min_data_param_ratio:11,min_em_it:[11,51,52],min_field:44,min_finfo_read:[38,51,52],min_gap:[14,20,21],min_it:11,min_length:29,min_mapq:[8,22,40,44,51,52],min_mut_gap:[11,36,38,49,51,52],min_ninfo_po:[38,51,52],min_ord:[11,12],min_phr:[40,51,52],min_qual:[40,41,44],min_read:[8,40,51,52],mind:108,miniconda3:[110,112],miniconda:112,minim:[8,9,20,95,103],minimum:[8,11,12,20,28,34,38,40,44,45,49,51,52,76,77,78,81,95,96,103],minor:[12,92],minu:[20,60,95,105,108],minut:[12,76,77,78,80,81,82,83,95],misalign:[95,103],misformat:30,mismatch:[32,51,52,108],mismatch_threshhold:32,mismatch_toler:[32,51,52],mismatches_allow:32,miss:[95,99,110],missing_ok:12,misspel:59,mistak:103,mistyp:110,mix:[18,52,95,105,107,113],mixtur:20,mkcmd:15,mkdir:95,mm:[74,92],mode:[8,12,51,52,63,76,95,105],model:[11,20,99,107],modern:95,modif:103,modifi:[4,10,12,20,25,46,52,85,102,103,104,105],modifif:103,modul:[9,12,13,15,20,21,23,26,27,29,30,34,38,44,50,92],molecul:[1,20,34,63,95],monitor:[92,95,103,105],more:[4,8,9,11,12,24,26,29,35,36,39,40,44,49,52,54,56,58,59,60,61,62,63,67,75,84,87,88,90,92,95,96,99,102,103,104,105,107,108,113,114],more_typ:12,most:[5,8,12,29,41,44,54,58,59,65,84,87,92,95,103,105],move:[12,44,95],mu:[7,12,84],mu_adj:20,mu_ob:20,much:[11,95,99,103,112,113,114],multi:[12,29],multidimension:18,multiindex:[11,12,14,29,35],multipl:[5,11,12,14,18,24,29,32,35,49,84,87,89,94,96,98,99,102,103,104,105,106,113],multiplex:[32,52,89,95,101],multipli:[29,96],multirelsgraph:35,multirelsprofilegraph:35,multithread:[51,52],munro:119,mus1:[11,18],mus2:[11,18],mus_adj:20,mus_guess:20,mus_ob:20,must:[5,8,9,11,12,18,20,24,29,34,41,44,49,51,52,54,60,62,63,67,72,73,74,75,78,92,94,95,96,103,105,107,108,110],mut:[11,12,14,16,26,38,40,41,44,52,58,103],mut_bit:26,mut_cod:26,mutat:[1,8,9,11,12,14,16,18,20,21,26,28,34,35,37,38,40,41,42,44,49,51,52,54,60,61,66,81,87,89,91,95,100,101,108,109],mutation:99,muts_per_po:11,mutsbatch:[12,14,16,40],mutsbatchio:[12,16,40],mutsdataset:[11,12,36,38],mv:95,mycoplasma:95,myfavrna:[73,75],myfil:95,myfile1:95,myfile2:95,mynam:112,mypool:82,mysect:[72,80],n:[5,12,29,35,42,52,57,60,61,62,63,70,72,73,74,85,87,88,95,96,99,105,108,110,113],n_batch:38,n_data:11,n_param:11,n_proc:[8,11,22,24,34],n_read:[8,40],n_reads_init:38,n_reads_kept:38,n_reads_max_fmut:38,n_reads_min_finfo:38,n_reads_min_gap:38,n_run:11,n_task:24,name:[7,8,10,12,13,16,18,20,22,24,25,28,29,30,32,34,35,36,38,39,40,49,51,52,53,54,55,59,60,61,62,63,65,66,67,70,72,73,74,75,76,77,78,80,81,82,83,85,87,89,90,92,95,99,106,110,112,113,115],name_lock_temp:25,name_r1:63,name_r2:63,name_temp:25,nan:[18,20,28,34,49,51,52],nan_test:19,natur:11,navig:[99,114,116],nbyte:12,ncbi:85,nchar:12,ncol:35,ndarrai:[11,12,14,16,18,20,21,28,29,35,38,40,41,56,58],nearbi:20,nearest:40,necessarili:[12,62,96],need:[5,8,9,12,13,28,44,67,84,87,95,96,99,105,110,112,113],need_writ:12,neg:[34,58,63,95],neighborhood:59,neither:[15,29,54,103],nest:[8,28,51,52,65,76],net:110,never:[90,96,105],new_field:8,new_file_nam:32,new_ord:11,new_seg:8,newfil:52,newlin:62,newton:20,next:[42,49,60,65,92],nextseq:[52,95],ng:[7,12],ninfo:[38,52,103,107],no_nan:18,noaso:74,nois:96,non:[5,8,12,14,20,21,30,34,49,51,52,58,60,62,63,92,95,96,102,103,104,111],none:[8,11,12,13,14,15,16,18,20,22,24,26,28,29,32,33,34,35,36,38,41,42,49,51,92,102,104],nonneg:105,nonprox_mut:14,nor:[29,108],normal:[12,18,20,34,51,52,66,78,89,92,109],nos:26,note:[5,18,44,56,58,90,95,108,110,113],noth:[12,26,92],notic:92,notimplementederror:44,novaseq:95,novic:112,now:[72,99],np:18,nreads_tot:11,nrmsd:[11,18,52,96],nrow:35,ns:5,nt:[5,20,29,34,38,51,52,58,81,95,103,108],nucleic:[5,29,95],nucleotid:[1,29,51,52,57,62,85,95],num:[12,96,103,105],num_align:65,num_batch:[11,12,14],num_level:12,num_po:[11,14],num_read:[11,12,14,40],num_reads_adj:49,num_reads_ob:49,num_run:11,num_uniq:11,number:[5,8,9,10,11,12,14,16,18,20,22,24,28,29,33,34,35,36,37,38,39,40,41,44,46,49,51,52,54,56,57,59,62,63,65,66,72,76,77,78,81,83,84,87,90,98,99,100,102,104,105,106,107,108],numer:[22,29,75,84,87],numpi:[11,12,14,16,18,20,21,28,29,30,35,38,40,41,56,58,113],nums_batch:12,ny:92,o:[52,67,85,102,104],obei:[60,62],object:[5,8,10,11,12,15,16,17,18,24,26,28,29,32,35,38,40,41,44,56,57,58,64,68,96,103,105],observ:[11,20,21,49,103,105],obtain:[63,105,116],occupi:[5,29],occur:[12,13,20,29,44,54,92,105,108,114],occurr:11,ochr:63,oconv:12,oconv_array_int:12,oconv_datetim:12,odata:12,odd:96,ofasta:10,off:[20,52],offici:113,offset:[8,22,28],often:[20,29,54,85],oh:54,ok:99,oligonucleotid:108,omit:[20,29,102,104],onc:[8,12,24,29,54,95,96,102,104,108,110],one:[5,8,9,11,12,18,20,21,22,24,26,28,29,30,34,35,36,39,40,41,42,44,49,51,52,54,58,61,63,65,66,67,69,72,75,76,84,87,91,92,94,96,103,105,113,114],one_ref:8,onerelgraph:35,onerelprofilegraph:35,ones:[11,26,95],onestruct:35,onet:35,onetablegraph:35,onetablerunn:35,onetablewrit:35,onli:[5,8,11,12,14,26,29,30,33,34,36,37,38,39,40,44,49,51,52,54,61,62,63,65,67,78,84,85,87,90,92,94,95,96,98,99,102,104,105,107,110,113],only_head:22,op:[41,42,44],op_consumes_read:44,op_consumes_ref:44,op_is_mut:41,opath:15,open:[8,12,38,40,92,99,105,114,115,116],open_temp_sam:40,oper:[18,28,35,41,42,44,54,100,112,114],opposit:44,optim:[11,20,44,77,99,101,113],optimum:96,option:[4,7,8,11,12,13,14,15,16,20,22,24,26,29,32,33,35,38,41,42,49,50,62,63,67,75,85,87,88,90,91,92,99,102,104,105,107,108,109,110,112],optionfield:12,orcid:0,order1:35,order2:35,order:[5,8,9,11,12,13,20,28,33,35,36,49,51,52,63,72,77,89,95,102,103,108,109],org:[0,4,20,110],organ:32,orient:[8,51,52,76,95],origin:[5,8,10,11,15,16,18,20,29,30,35,36,46,49,52,57,84,90,95,96,102,104],original_report:11,os:8,other:[11,12,15,18,20,21,24,26,28,29,36,39,49,51,52,54,62,63,69,72,84,85,87,93,95,96,99,102,103,104,108,113],otherref:[73,75],otherwis:[12,21,24,25,26,28,29,44,51,52,58,65,85,87,95,105],our:[20,96,103],out:[8,10,20,40,46,51,52,67,84,85,88,90,91,92,95,96,98,99,102,104,105,106,107],out_dir:[8,10,16,32,34,35,36,39,40,46,51,52],out_prefix:8,outdir:12,output:[8,10,11,15,21,22,28,33,34,35,36,37,38,39,40,42,46,49,51,52,76,79,85,86,89,90,91,101,114],output_func:11,output_path:12,output_seg:12,output_typ:16,outright:95,outsid:[21,54,95,105],over:[9,14,18,20,35,49,87,96,103],overal:1,overlap:[5,8,51,52,54,76,95,108],overlook:95,overrid:[12,16],overriden:12,overwrit:[8,28,32,34,51,52,85],own:[11,51,52,72,87,92,95,110,113,115],p:[52,63,104,108],packag:[109,110,112,113],pad:[5,8,51,52,76],page:[114,116],pain:113,pair:[1,8,11,12,20,22,28,29,32,34,35,40,44,51,52,55,58,60,61,67,76,78,99,103,104,105,108],pair_dict:28,pairs_to_dict:28,pairs_to_t:28,pairwis:18,panda:[8,11,12,14,18,20,28,29,30,33,35,49,51],paper:87,parallel:[7,8,10,11,12,32,33,34,35,36,37,38,39,40,46,49,51,52,89,109],parallel_demultiplex:[32,51,52],parallel_grep:32,paralleliz:24,param:[8,13,35],param_default:13,param_doc:13,param_docstr:13,param_lin:13,param_list:13,paramdef:13,paramet:[8,10,11,12,13,16,18,19,20,22,24,26,28,29,33,34,35,36,37,38,39,40,41,44,46,49,50,51,79,86,88,89,95],parent:[8,12],pars:[8,9,12,15,16,29,33,34,36,45],parse_all_scor:9,parse_bowtie2:8,parse_cigar:[44,45],parse_ct:28,parse_db_str:28,parse_energi:34,parse_exp_count_col:11,parse_fasta:[29,30],parse_flagstat:22,parse_head:12,parse_idxstat:22,parse_join_clusts_fil:36,parse_path:16,parse_ref_head:22,parse_refs_metadata:33,parse_rnastructure_ct_titl:34,parse_samples_metadata:33,parse_scor:9,parse_stdout_count_fastq_read:8,parse_top_separ:12,parse_vers:12,parsed_metadata:33,part:[12,28,29,30,52,60,61,62,75,92,95,99],parti:99,partial:95,partialmutsbatch:[11,14,38],partialreadbatch:[11,12,14,38],partialtabul:49,particular:[4,41],particularli:90,partner:[60,80],pass:[12,24,49,59,90,95,104],pass_n_proc:24,past:99,patch:12,path:[8,10,11,12,15,16,17,22,25,28,29,33,34,35,36,37,38,39,40,49,51,64,85,90,91,95,96,99,102,103,104,105,107,112],path_field:[16,49],path_field_valu:16,path_match:12,path_seg:[39,49],path_subject1:35,path_subject2:35,path_subject:35,patherror:12,pathlib:[8,10,11,12,16,17,22,25,28,29,33,34,35,36,37,38,39,40,49,51],pathtypeerror:12,pathvalueerror:12,pattern:[11,12,14,26,32,38,40,49,51,52,90],pattern_end:32,pattern_kei:38,pattern_start:32,pattern_typ:32,pcc:52,pcr:[29,108],pd:[12,18,20,29],pdf:[35,51,52,87],pearson:[11,18,52,103],penal:95,penalti:[8,9],penultim:11,per:[11,12,22,28,29,32,35,40,49,51,52,63,77,81,86,87,89,95,96,98,99,100,105],per_read:14,percent:[52,99],percentil:20,perfectli:105,perform:[20,95,113],permit:[11,20,49,75,108],phenomena:54,phred:[8,22,40,44,51,52,54,67,76,95],phred_arg:8,phred_enc:[8,32,40,51,52],phred_encod:22,phred_scor:22,phred_test:23,physic:54,physiolog:103,pickl:[16,32,59],pict:29,picto:29,pictogram:[29,30],piec:[63,113],pip:[109,110,111,113],pipelin:[7,8,15],place:[10,12,18,25,46,49,52,75,84],placehold:25,plain:[26,29],plan:113,platform:95,pleas:[63,114,116],ploq:51,plot:[52,89,101],plotli:35,plu:[7,60,66,85,90,95,108,112],pmut:51,pnext:8,po:[29,38,44,49,52,54,65,87,88,91,98,99,103,106,107],point:[5,7,11,44,50,95,96,107],poli:[29,38,51,52,81],polya:[29,52,103],pool:[7,11,12,24,36,38,49,51,52,68,79,89,101,102],pool_sampl:39,pooldataset:[38,39,49],pooleddataset:12,pooledmutsdataset:[12,39],poolreport:39,popul:20,popular:113,portabl:95,portmanteau:59,pos3:14,pos5:14,pos_dtyp:14,pos_gu:38,pos_head:49,pos_index:14,pos_kept:[36,38],pos_max_fmut:38,pos_min_ninfo:38,pos_num:[11,14,40],pos_polya:38,pos_us:38,posgraphrunn:35,posgraphwrit:35,poshistogramgraph:35,poshistogramrunn:35,poshistogramwrit:35,posit:[5,8,10,11,14,15,18,20,24,28,29,30,33,34,35,37,38,40,41,42,44,46,49,50,51,52,55,57,60,66,68,69,81,86,87,89,90,95,100,101,107,108,109],possibl:[5,12,13,14,29,41,45,49,54,95,96,103,105,106,108,114],post:[8,95],postabl:[33,35,37,49],postableload:49,postablewrit:49,potenti:[15,62],power:63,practic:108,pre:[103,113],preced:44,precis:[12,49],predic:35,predict:[20,21,34,51,52,60,61,66,78,89,93,100,101,107,110],prefer:[9,11,116],prefix:[8,33,87,106],prep:95,prepar:[95,108],prerequisit:[109,110,111],preserv:[63,95,105],prespecifi:96,press:92,presum:103,prev_bic:11,prevent:[8,54,95,102,104],previou:[11,60,84,103],primari:[27,55,92,99],primarili:8,primer:[29,34,38,51,52,75,89,110,113],primer_gap:[29,34,38,51,52],primertupl:29,print:[50,52,92,110,112],print_multi_grep_dict:32,printabl:29,prior:44,prioriti:95,privat:57,probabl:[20,63,95,96,105],probe:[20,74,103],problem:[34,62,92,95,96,103,105,113],problemat:103,proc:[52,95,103,105],procedur:[20,85],process:[8,10,11,22,24,33,34,36,37,38,39,40,44,46,49,51,52,59,67,90,94,95,103,105,107,110,116],processor:[95,103,105,110,114],produc:[12,18,21,34,54,62,79,84,87,102,104,116],product:20,profil:[1,9,20,28,34,35,49,51,60,61,66,78,86,87,89,93,95,99,100,103,108,112],profile_masked_acgtdi:88,profile_masked_m:88,profile_masked_n:88,profile_nam:35,profilegraph:35,profilepost:49,profilerunn:35,profilewrit:35,program:[8,34,40,44,51,52,62,87,92,95,99,103,105,110,114],progress:[92,96],proj1:95,proj2:95,project:[63,67,95,110,112,113],prone:[20,110],prop:84,prop_adj:11,prop_ob:[11,20],proper:35,properli:[110,112],properti:[8,11,12,14,16,17,26,28,29,30,35,36,38,40,41,44,49,57],proport:[11,20,29,65],proportion:93,props_se:11,provid:[20,35,54,65,69,92,95,96,105,108],proxim:14,ps1:112,psm1:112,ptrn_fanci:26,ptrn_plain:26,publish:[4,87,96],purpl:12,purpos:[4,7,20,60,62,79,96,99,105,114],put:[41,72,105,107],py:[7,9,40],python3:112,python:[64,68,69,71,92,96,103,105,109,111,113],q0:88,q1:52,q2:52,q:[12,52,92,93],qc:[52,95],qc_extract:[8,51],qmin:44,qname:[44,83,105],qnamesbatch:40,qnamesbatchio:[40,56,105],qq:[12,92],qual:[8,42,44,45],qualiti:[8,22,23,40,41,42,44,45,51,52,76,103,110],quality_cod:22,quantifi:95,quantil:[18,20,34,35,49,51,52,78,89],queri:95,quiet:[12,92],quit:92,quotient:63,r2:52,r:[18,29,35,52,57,88,98],rais:[11,12,15,18,21,26,29,30,42,51,52,62,63,85,92],ram:114,ran:[102,104,105],randal:119,random:[11,25,29,30,49],randomli:[20,95,96],rang:[29,49,92,108],range_int:[29,49],range_on:29,rangeindex:18,rank:[11,18,44,67],rare:[20,54,103,108],rate:[11,18,20,21,28,34,35,51,52,66,87,89,91,95,100,101,103,109],rather:[16,24,35,44,59,113,119],ratio:[11,34,35,49,51,52,78,88],rational:85,raw:[12,87,116],rc:29,re:[8,26,51,52,76,110,113,114],reach:96,reactiv:[20,28,34],read1:44,read2:44,read:[8,9,11,12,14,16,20,22,26,29,32,35,38,40,42,44,45,49,51,52,53,55,59,62,64,67,68,69,76,79,81,83,87,89,98,99,100,101,107,110,113,119],read_1_id:63,read_2_id:63,read_bas:[26,44],read_dtyp:14,read_head:49,read_id_dict:32,read_index:14,read_nam:40,read_num:[11,14,38],read_nums_per_batch:11,read_qual:44,read_weight:[11,14],readabl:[12,41,69,71],readbatch:[12,14,16],readbatchio:[11,12,16,38,40],readgraphrunn:35,readgraphwrit:35,readhistogramgraph:35,readhistogramrunn:35,readhistogramwrit:35,reads_per_po:14,readtabl:[33,49],readtableload:49,readtablewrit:49,reagent:103,real:[11,20,95,96],realiz:[84,96],realli:[56,58],reason:[12,20,95,99,103],reassembl:5,recal:54,recast:16,recast_file_path:16,receiv:[4,24,28,35,54,95,100],recommend:[63,95,99,103,112,113],record:[5,12,22,25,40,44,60,61,62,63,79,92,95,96,99,103,104,105],records_per_batch:40,recurs:[12,90,95],red:12,redistribut:4,reduc:[12,18,94,105,116],redund:[11,12],ref:[8,9,11,12,16,22,26,28,29,33,34,35,36,39,40,42,44,45,49,51,52,54,58,65,84,85,87,88,90,91,95,96,98,99,102,103,104,105,106,107],ref_bas:[26,44],ref_fil:8,ref_header_cmd:22,ref_sect:29,ref_seq:29,ref_to_align:41,refa:[70,107,108],refb:[70,107,108],refc:108,refer:[5,8,9,11,12,14,16,22,26,28,29,30,33,34,35,36,38,39,40,41,42,44,49,51,52,53,55,58,60,63,64,67,68,70,71,75,76,77,78,80,81,82,83,85,87,89,90,96,98,99,101,102,103,104,106,107,112],refio:[12,16,39,40],reflen:[12,14,29,40,44],reflenmutsbatch:[14,40],refram:18,reframe_lik:18,refs_fil:22,refs_file_csv:32,refs_meta:[32,33,51,52],refs_metadata:33,refsect:29,refseq:[12,14,16,29,40,41,42,44,45,49,51,57,105],refseq_fil:40,refseq_file_auto_field:40,refseq_file_path:40,refseq_file_seg_typ:40,refseqio:[16,57,105],refseqmutsbatch:[11,14,38,40],refseqreport:12,refset_path:8,refus:[102,104],regardless:[5,20,92],regener:84,regex:[19,42],region:105,regular:[19,112],regular_grep:32,regularli:113,reinstal:113,rel:[7,8,11,12,14,20,35,38,42,44,49,52,95],rel_cod:49,rel_del_po:44,rel_ins_po:44,rel_nam:35,relat:[7,12,27,38,39,49,53,56,59,62,67,68,79,88,89,90,95,96,98,99,101,106,107,109],relate_lin:45,relate_test:45,relatebatch:40,relatebatchio:[40,58,105],relatedataset:[38,40,49],relateerror:44,relateio:40,relatenotimplementederror:44,relatereflenbatch:40,relaterefseqbatch:40,relatereport:40,relatetabul:49,relatevalueerror:44,relationship:[12,14,26,35,40,42,44,49,52,55,58,65,86,89,95,100,101,103],relationwrit:40,relclusthead:12,relcolormap:35,relev:[29,114],relhead:12,relhistogramgraph:35,relhistogramrunn:35,relhistogramwrit:35,relmask:38,relpattern:[11,12,14,26,38,49],relpost:49,relpostableload:49,relpostablewrit:49,relreadt:49,relreadtableload:49,relreadtablewrit:49,rels1:44,rels2:44,rels_group:35,rels_per_po:14,rels_per_read:14,reltabl:49,reltypet:49,reltypetableload:49,relvec:[8,41,42],relvecs_to_sam_fil:8,relvecs_to_sam_lin:8,remain:[11,60,62,85,103],rememb:112,remov:[18,21,24,25,29,32,85,103,105,112],remove_nan:18,removes_nan:18,renam:[35,105],rename_column:35,renumb:[7,28,29,52,60],renumber_ct:28,renumber_from:[28,29],renumber_pair:28,renumct:[7,60],reopen:112,repeat:[9,34,54,63,72,84,95],repetit:[54,105],replac:[5,12,18,85,90,91,95,112],repli:114,replic:103,report:[8,11,12,34,36,38,39,40,49,51,52,59,68,84,90,107,109],report_fil:[11,12,49],report_fold:32,report_path_auto_field:12,report_path_seg_typ:12,repres:[5,8,22,35,41,44,54,63,102,104],represent:[5,42],reproduc:[75,96,108],request:[63,109],requir:[5,12,34,52,62,67,70,72,73,74,75,84,93,94,95,96,99,103,107,110,112,113],require_depend:15,reran:104,rerun:[84,85,95,96,103,105],resampl:49,reset:44,residu:[20,103],resiz:87,resolv:[32,96],resolve_or_analyze_multigrepped_read:32,resort:95,resourc:84,resp:11,respect:[28,41,44,58,62,63,92,93,95,96,99,103,106,107,108,113],respond:114,respons:11,resps_se:11,rest:[110,112],restart:112,restor:[5,16,29,84],restore_temp_backup:16,restrict:[62,95],result:[5,11,19,21,24,40,42,51,52,54,64,68,79,84,87,89,95,96,99,100,103,105,106,107,109,115,116],retitl:34,retitle_ct_structur:34,retriev:18,return_docstr:13,rev:[29,44,95],rev_barcod:32,rev_barcode_end:32,rev_barcode_start:32,rev_clip:32,rev_prim:32,rev_secondary_signatur:32,rev_secondary_signature_end:32,rev_secondary_signature_start:32,revers:[5,20,29,30,34,38,51,52,75,95,103,108],reverse_compli:32,reward:95,rf:[52,95],ribosom:95,right:[15,85,99,116],risk:[12,95,116],riski:[12,113],rm_temp:25,rmsd:[11,18],rna2dpart:28,rna2dstem:28,rna2dstemloop:28,rna:[0,1,4,5,12,16,20,29,30,34,35,49,51,52,54,57,59,62,63,64,66,67,68,74,76,77,78,80,81,82,83,85,87,89,90,92,94,95,96,98,100,102,103,104,105,106,107,108,111,112,113,114,116],rna_2024:92,rna_yyyi:92,rnajunct:28,rname:44,rnaprofil:[28,34,35],rnasect:28,rnastat:[28,35],rnastructur:[28,34,51,52,110],rnext:8,roc:[28,34,35,60,100],rocgraph:35,rochest:[34,92,110],rocrunn:35,rocwrit:35,roll:[35,52,100],rolling_auc:28,rollingaucgraph:35,rollingaucrunn:35,rollingaucwrit:35,rollingcorrelationgraph:35,rollingcorrelationrunn:35,rollingcorrelationwrit:35,rollinggraph:35,root:[11,18,20,28,52],round:49,rouskin:[0,1,4],rouskinlab:116,routin:[92,113],row:[11,21,35,49,54,72],row_index:35,row_titl:35,rt:[29,103,108],rule:[60,62,84],run1:11,run2:11,run:[8,9,10,11,15,18,21,24,25,32,33,34,35,36,37,38,39,40,42,46,49,50,51,63,76,77,79,84,89,91,92,95,99,100,102,103,104,105,109,110,112,113,114],run_cmd:15,run_fastqc:[8,9],run_func:25,run_max_ord:11,run_multi_grep:32,run_ord:11,run_seqkit_grep:32,run_seqkit_grep_funct:32,runorderresult:11,runtest:[9,17,19,21,23,25,27,30,31,42,45],s41586:20,s:[8,9,11,12,18,20,24,35,41,42,44,49,52,54,57,59,62,63,65,72,73,74,75,84,85,86,89,92,95,98,100,102,104,105,108,110,113],safeguard:95,sai:[95,112],salient:92,sam:[7,22,40,44,45,51,52,64,68,76,95,105],sam_head:8,sam_out:8,same:[11,12,18,20,21,24,28,29,30,35,44,51,52,54,58,62,63,67,84,85,87,91,95,96,99,102,104,105],samflag:44,sampl:[8,9,11,12,16,20,28,29,33,35,36,39,40,49,51,52,63,64,67,68,71,75,76,77,78,80,81,82,83,84,87,88,89,90,91,96,99,101,102,103,105,106,107,108],sample1:[35,82,107],sample1_r1:95,sample1_r2:95,sample2:[35,82,95],sample3:95,sample4:[95,107],sample5:107,sample6:107,sample_nam:32,sample_r1:[9,95],sample_r2:[9,95],samples_meta:[33,51,52],samples_metadata:33,samread:44,samtool:[22,44,67,95,110],sanit:[12,14,16,40],sanitize_end:14,sanitize_po:14,sanitize_valu:14,sars2:[92,116],sars2_1799:[76,77,78,80,81,82],satisfi:9,save:[11,12,16,49,57,79,92,96,103,105,113,116],save_brickl:16,scalar:5,scale:[5,18,20,93,99],scale_test:19,scatter:[35,100],scatterplotgraph:35,scatterplotrunn:35,scatterplotwrit:35,scc:52,scenario:99,scheme:[22,95],scholar:0,school:0,score:[8,9,22,40,44,51,52,54,76,96],scott:0,screen:92,script:7,scroll:110,sdi:87,search:[12,51,52,90,95],search_end_index:32,search_start_ind:32,second:[12,18,29,35,44,54,63,65,95,102,103,104],secondari:[1,20,28,34,51,52,64,68,89,101,107],secondary_signatur:32,secondary_signature_end:32,secondary_signature_start:32,sect:[11,12,16,28,33,35,36,38,49,52,65,84,87,88,91,96,99,102,103,106],sectio:[11,16,36,38],section3:28,section5:28,section:[11,12,14,16,20,22,28,29,30,34,35,36,38,49,51,52,60,66,68,71,72,77,78,80,81,87,89,92,95,96,101,106,109,110,112],section_end:65,section_start:65,section_test:30,sectionfind:29,sections_fil:[34,38,51,52],sectiontupl:29,sects_fil:29,see:[4,24,54,56,57,58,59,60,61,62,63,65,67,84,85,87,88,90,95,96,98,99,100,101,102,103,104,105,106,107,108,110,112,113,114],seed:[8,11,49,51,52,76],seem:110,seg_typ:[8,12,16],segment:[5,8,11,12,16,34,35,36,38,39,40,49,95],segment_nam:12,segment_typ:12,seismic:[0,4,12,16,33,50,51,54,59,60,61,62,63,64,66,67,68,72,76,77,78,80,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,99,100,102,103,104,105,106,107,108,111,112,113,114,115,116],seismicrna:[92,109],select:[8,11,12,16,34,35,36,38,39,40,87,95,99,103],self:[9,14,95,119],semibitcal:26,sensit:[72,73,74,75],separ:[8,9,12,20,21,35,51,52,69,71,72,90,92,103,105,108,113],seq5:[28,29],seq:[7,8,10,11,12,14,16,20,28,34,35,38,40,41,42,44,45,49,51],seq_fold:32,seq_len:40,seq_length:14,seq_object:32,seq_pos_to_index:[29,30],seq_record:28,seq_typ:[10,29],seqcolormap:35,sequenc:[1,6,8,9,10,12,14,28,29,30,32,34,35,38,40,41,42,44,51,52,53,54,55,58,60,61,64,65,66,67,68,70,71,73,75,81,83,85,89,99,101,107,109],sequence_fold:32,sequence_obj:32,sequence_object:32,seri:[11,14,15,18,20,24,28,29,30,33,35,49,51,61,65,94],serial:52,serv:[20,79,105],session:115,set:[8,12,18,20,24,29,30,32,38,44,51,52,54,59,75,84,85,86,93,101,108,111,112,117],setup:9,sever:[12,49,86,87,92,95,96,99,103,112,116],sh:112,sha:117,shape:[18,19,20,103],share:[29,54,58,63,87,102,104],shasum:116,shell:[15,90,92,112],shellcommand:15,shift:92,shlex:15,shorten:105,shorter:[54,95],should:[4,9,18,19,25,26,51,52,54,72,85,87,92,95,96,102,104,105,116],show:[54,92],shown:[5,54,56,58],shtml:110,side1:28,side2:28,side:[5,85,95],sienna:63,signatur:12,silent:18,silvi:0,sim:[7,8,51],sim_test:9,sim_whol:51,similar:[63,67,90,95,96,103,105,110,112,114],similarli:54,simpl:20,simpler:[8,9],simplest:8,simpli:[30,62,72,84,87,108,113],simplic:[56,58],simplif:49,simplifi:[8,9],simul:[7,21,29],simultan:[8,10,11,21,33,34,36,37,38,39,40,46,49,51,52,89,94,113],sinc:[20,44,72,84,95,96,105,108],singl:[8,22,24,51,52,62,67,105],site:[29,103,112],situat:54,six:[54,60,95,100],size:[5,11,12,14,18,28,29,40,51,52,67,95,96,103],skew:103,skip:105,slash:35,slice:[29,30],slide:[18,28,51,52],slightli:[44,96,116],slower:[95,103,105],small:[5,8,84,90,95,99,103],smaller:[84,95,103,105],smallest:[8,9,11,12],smoothli:108,so:[7,8,11,12,18,20,24,29,34,44,54,63,65,84,85,90,92,95,96,98,102,103,104,105,108,110,112,113,114],sodium:74,soft:42,softwar:[4,29,63,66,69,71,79,92,99,111,114],softwarea:113,sofwar:111,sole:54,solut:[8,20,96,105],solv:[1,20,96,105,113],some:[34,35,54,84,85,87,93,95,103,105,110],someon:114,someth:[92,114],soon:114,sort:[8,11,14,22],sort_replicate_run:11,sort_xam_cmd:22,sourc:[35,44,51,52,87,105],source_dir:17,source_path:16,sourcebackupdir:17,sourceforg:110,space:[5,57,84,90,95,110],span:[54,103,108],spare:113,sparse_mu:11,spearman:[18,52,103],spec:44,special:[62,90],special_metadata:33,specif:[8,9,11,12,20,22,29,37,40,44,54,67,91,95,99,102,103,108,110,113,114],specifi:[11,12,18,25,26,41,54,72,75,81,84,87,92,96,102,103,105,107,108],spectrum:99,speed:[44,51,52,94,95,105],spell:110,split:[5,32,40,52,67,89,95,101],split_count:32,split_fastq:32,spot:92,spuriou:95,squar:[11,18,52,99],squeez:49,ss:92,stack:[35,87],stall:20,stamp:44,standard:[18,29,85,89,95],start:[18,28,29,30,34,51,52,60,62,63,72,84,96,108,112],state:[28,35,87,96],statement:11,statis:95,statist:22,statu:[1,12,92,103],std:77,stdout:[50,52],stem:28,step:[5,8,12,20,36,39,40,56,66,67,79,84,89,92,95,96,99,101,103,105,106,109],step_del_po:44,still:[11,18,51,52,84,95,96,98,103,110],stop:[12,84,92,96],storag:[5,67,95],store:[29,57,59,94,95],str:[8,9,10,11,12,13,14,15,16,18,19,22,24,26,28,29,30,32,33,34,35,36,37,38,39,40,41,42,44,45,46,49,51,56,70,73,74,75,76,77,78,80,81,82,83],straightforward:54,strategi:12,stretch:[29,103],strict:[12,103],string:[5,8,9,11,12,24,26,29,35,41,42,44,45,51,52,63,73,74,95],struct:[28,34,35,51,52],struct_fil:[35,51,52],struct_sect:[35,51,52],structonetablegraph:35,structonetablerunn:35,structur:[1,11,20,28,34,35,49,51,52,59,64,66,68,78,87,89,93,101,103,105,107,110],struggl:103,studi:96,style:[12,99],sub:[7,8,12,52,87,88,92],sub_a:65,sub_c:65,sub_g:65,sub_hist:65,sub_n:65,sub_rat:65,sub_t:65,subclass:[29,49],subcommand:[52,86,87],subdirectori:12,subject:[35,96],submit:[51,52,87,114],submodul:109,suboptim:[34,51,52,78],subpackag:109,subplot:[35,87],subprocess:[8,15,22],subsect:[28,29],subsequ:[1,58,84],subshel:15,subsitit:87,subsitut:[87,105],subst:45,substep:103,substitit:65,substitut:[8,9,26,42,44,54,65,87,95,103,110,115],subtl:96,subtract:20,succe:24,success:[84,96],successfulli:110,suffic:95,suffici:[44,96,119],suggest:[59,114],suit:95,sulfat:1,sum:22,summar:[40,79,95,96,103,105],summari:95,sun:92,super_dir:32,super_fastq:32,super_write_fastq:32,superscript:103,supplement:12,support:[29,62,63,69,71,79,110],suppos:[5,54,56,57,58,59,72,84,91,95,102,104,108,113],suppress:12,sure:[95,99,110,112],surpris:103,suspect:20,swap_po:44,sweep:44,sweep_indel:44,symbol:[12,33],symlink:12,system:[12,28,29,62,74,84,92,95,103,105,110,112,113,114,117],t:[5,8,9,26,29,35,42,52,54,62,63,65,81,85,87,88,96,102,103,104,105],t_or_u:29,taagt___:58,tab:92,tabl:[5,7,11,12,28,29,33,34,35,37,46,54,59,64,65,68,84,87,88,89,101,102,104,107,116],table1:35,table1_fil:35,table2:35,table2_fil:35,table_clust:[49,51],table_fil:[35,37,49],table_per_clust:49,table_per_po:49,table_per_read:49,table_po:[49,51],table_read:[49,51],table_to_dict:28,table_to_pair:28,tableload:49,tablewrit:49,tabul:[49,51,52,106],tabulate_load:49,tacaggtccgcatg:75,tacgtcgtcgtc:63,take:[12,15,16,54,90,95,103,112,113,114],taken:[12,63,76,77,78,80,81,82,83,108],target:[14,18,19,40,51,52],task:[8,10,11,24,33,34,36,37,38,39,40,46,49,51,52,89,95,103,105,109,113,119],tatg:108,tcagaacc:58,tcg:108,tct_____:58,teal:63,teal_r2:63,teardown:9,technic:59,tediou:[12,113],tell:[95,96],temp:[8,24,34,40,51,52,99],temp_delete_idsets_to_pickle_dict:32,temp_dir:[8,16,25,32,34,40,51,52],temp_fq1:9,temp_fq2:9,temp_fq:9,temp_sam_path:40,temp_test:25,temperatur:[34,51,52,74,78,99],temperrfilt:25,templat:[8,103],temporari:[8,9,16,25,34,40,51,52,95],tend:103,term:[4,67,95],termin:[95,103,105,115,116],tertiari:1,test:[7,8,12,16,18,20,22,24,26,29,40,41,44,47,84,92,113],test_1_dim:21,test_1_series_size_1_min_0_excl_nan:30,test_1_series_size_1_min_0_incl_nan:30,test_1_series_size_1_min_1_excl_nan:30,test_1_series_size_1_min_1_incl_nan:30,test_1_series_size_2_min_1_excl_nan:30,test_1_series_size_2_min_1_incl_nan:30,test_1_series_size_2_min_2_excl_nan:30,test_1_series_size_2_min_2_incl_nan:30,test_2_dim:21,test_2_series_size_1_min_0_excl_nan:30,test_2_series_size_1_min_0_incl_nan:30,test_2_series_size_1_min_1_excl_nan:30,test_2_series_size_1_min_1_incl_nan:30,test_2_series_size_2_min_0_excl_nan:30,test_2_series_size_2_min_0_incl_nan:30,test_2_series_size_2_min_1_excl_nan:30,test_2_series_size_2_min_1_incl_nan:30,test_2_series_size_2_min_2_excl_nan:30,test_2_series_size_2_min_2_incl_nan:30,test_a:42,test_aa:42,test_aaaa_0in:45,test_aaaaaa_0in:45,test_aacc_1in:45,test_abstract:31,test_abstract_base_class:30,test_acgt_1in:45,test_add_mask:30,test_add_mask_invalid:30,test_add_mask_invert:30,test_add_overlapping_mask:30,test_add_unordered_mask:30,test_agg:42,test_al:31,test_all_match:42,test_all_match_n:42,test_alph:30,test_arrai:19,test_array0d:19,test_array1d:19,test_array1d_all_nan:19,test_array1d_allzero:19,test_array1d_empti:19,test_array1d_exampl:19,test_array1d_extrem:19,test_array1d_nan:19,test_array1d_some_nan:19,test_array2d:19,test_array2d_one_col_nan:19,test_array2d_one_row_nan:19,test_array3d:19,test_array_arrai:19,test_array_datafram:19,test_array_index:19,test_array_index_index:19,test_array_int:19,test_array_non:19,test_array_seri:19,test_array_series_datafram:19,test_array_series_dataframe_mismatch:19,test_average_prefix:31,test_backup_dir:17,test_backup_fil:17,test_base_nam:30,test_blank:30,test_bool:30,test_c:42,test_cigar_align_valid:45,test_cigar_init_invalid:42,test_cigar_init_valid:42,test_cigar_lengthen:42,test_cigar_m_aln_valid:42,test_cigar_m_del_valid:42,test_cigar_m_ins_valid:42,test_cigar_m_mat_valid:42,test_cigar_m_scl_valid:42,test_cigar_m_sub_valid:42,test_cigar_match_subst_valid:[42,45],test_cigar_str:42,test_cigar_xeq_aln_valid:42,test_cigar_xeq_del_valid:42,test_cigar_xeq_ins_valid:42,test_cigar_xeq_mat_valid:42,test_cigar_xeq_scl_valid:42,test_cigar_xeq_sub_valid:42,test_clust:31,test_clust_nam:31,test_cluster_prefix:31,test_clusthead:31,test_comp:19,test_contigu:19,test_copi:30,test_datafram:19,test_dataframe_arrai:19,test_dataframe_datafram:19,test_decod:23,test_delete_invalid:42,test_delete_valid:42,test_derived_cod:27,test_dict_str_dna_rna:30,test_diff_end3:30,test_diff_end5:30,test_diff_ful:30,test_diff_mask_nam:30,test_diff_mask_po:30,test_diff_nam:30,test_diff_ref:30,test_diff_seq5:30,test_diff_seq:30,test_different_typ:31,test_drop_arrai:19,test_drop_datafram:19,test_drop_seri:19,test_duplicate_nam:30,test_empti:[19,30],test_empty_invalid:30,test_encod:23,test_encode_match_hi_qu:45,test_encode_match_lo_qu:45,test_encode_relate_hi_qu:45,test_encode_relate_lo_qu:45,test_equ:19,test_equal_dna_dna:30,test_equal_ful:30,test_equal_mask:30,test_equal_part:30,test_equal_rna_rna:30,test_equals_numpi:21,test_exists_erase_temp:25,test_exists_keep_temp:25,test_extra_index_nam:31,test_extra_valu:31,test_f_multiplex:21,test_find_gu:30,test_find_polya:30,test_float_arrai:19,test_float_clust:31,test_float_datafram:19,test_float_float:19,test_float_index:19,test_float_index_index:19,test_float_index_index_index:19,test_float_index_index_int:19,test_float_index_int:19,test_float_int:19,test_float_int_index:19,test_float_non:19,test_float_ord:31,test_float_seri:19,test_format_fasta_name_lin:30,test_format_fasta_record:30,test_format_fasta_seq_lin:30,test_ful:30,test_full_blank_nam:30,test_full_end3:30,test_full_end5:30,test_full_given_nam:30,test_full_length:30,test_full_nam:30,test_full_section_full_length_sub:30,test_full_section_full_sub:30,test_full_section_full_sub_end3:30,test_full_section_full_sub_end5:30,test_full_section_full_sub_nam:30,test_g:42,test_get_alphaset:30,test_get_comp:30,test_get_comptran:30,test_get_mask:30,test_get_nonalphaset:30,test_hashable_dna:30,test_hashable_rna:30,test_hyphen:30,test_illegal_prefix:30,test_illegal_suffix:30,test_index:31,test_inequality_min_num_edit:9,test_inequality_subst_vs_indel:9,test_insert_bare_invalid:42,test_insert_dangling_3_invalid:42,test_insert_dangling_5_invalid:42,test_insert_deletion_invalid:42,test_insert_end3_invalid:42,test_insert_end5_invalid:42,test_insert_non_match_valid:42,test_insert_valid:42,test_inv_calc_mu_adj:21,test_inv_calc_mu_ob:21,test_invalid_bas:30,test_invalid_dim:21,test_invalid_dup_1:30,test_invalid_empty_seq_1:30,test_invalid_empty_seq_2:30,test_invalid_empty_seq_3:30,test_invalid_full_0:30,test_invalid_greater_end_9:30,test_invalid_less_start_2:30,test_invalid_nam:30,test_invalid_noncontig:30,test_invalid_numer:31,test_invalid_quantil:19,test_invalid_seq:30,test_invalid_unsort_1:30,test_iter_clust_index:31,test_length_1:42,test_length_2:42,test_length_3:42,test_level:31,test_level_kei:31,test_level_nam:31,test_line_in_sam_format:9,test_lock:25,test_low_qu:42,test_low_qual_invalid:42,test_low_qual_valid:42,test_mask_gu:30,test_mask_nam:30,test_mask_po:30,test_mask_polya:30,test_masked_bool:30,test_masked_int:30,test_max_ord:31,test_min_ord:31,test_misformat:30,test_missing_index_nam:31,test_missing_valu:31,test_modified_al:31,test_modified_empty_rel:31,test_modified_max_ord:31,test_modified_max_order_0:31,test_modified_min_ord:31,test_modified_non:31,test_modified_nullifi:31,test_modified_rel:31,test_more_mut:21,test_mu_multiplex:21,test_n:42,test_nam:31,test_name_mark:30,test_nan:19,test_neg:31,test_negative_non:31,test_negative_posit:31,test_negative_zero:31,test_negative_zero_allow:31,test_new_erase_temp:25,test_new_keep_temp:25,test_no_mut:21,test_no_overwrit:30,test_nocov_valid:42,test_non:31,test_nonnumer:31,test_not_equal_dna_rna:30,test_not_equal_dna_str:30,test_not_equal_rna_str:30,test_np_typ:27,test_num_level:31,test_obs_empir:21,test_one_degener:30,test_one_ful:30,test_one_full_nam:30,test_one_invalid:30,test_one_mask:30,test_one_mut:21,test_one_slic:30,test_one_valid:30,test_one_zero_allow:31,test_one_zero_unallow:31,test_ord:31,test_order_nam:31,test_overwrit:30,test_partial_length:30,test_partial_reflen_equ:30,test_partial_reflen_great:30,test_partial_reflen_less:30,test_partial_seq5_equ:30,test_partial_seq5_great:30,test_partial_seq5_less:30,test_partial_seq5_reflen:30,test_partial_slic:30,test_partial_slice_invalid_end3:30,test_partial_slice_invalid_end5:30,test_partial_slice_invalid_reflen:30,test_partial_slice_invalid_seq5:30,test_partial_trunc_section_trunc_sub:30,test_phr:23,test_picto:30,test_pos_index:30,test_pos_nam:30,test_posit:31,test_positive_invalid_dup:31,test_positive_no_dup:31,test_positive_non:31,test_positive_posit:31,test_positive_valid_dup:31,test_positive_zero:31,test_primary_cod:27,test_qual:23,test_random:30,test_rang:30,test_range_int:30,test_range_on:30,test_reduce_0:19,test_reduce_0_and_1:19,test_reduce_non:19,test_rel:31,test_rel_index:31,test_rel_index_invalid_nam:31,test_rel_index_rep:31,test_rel_index_valid_nam:31,test_rel_multiindex:31,test_rel_nam:31,test_relclust:31,test_relclusthead:31,test_relhead:31,test_rels_dupl:31,test_rels_empti:31,test_rels_norm:31,test_restore_dir:17,test_restore_fil:17,test_reverse_compl:30,test_reverse_transcrib:30,test_score_consist:9,test_select_clust:31,test_select_extra:31,test_select_extra_emptystr:31,test_select_extra_non:31,test_select_extra_zero:31,test_select_invalid:31,test_select_invalid_clust:31,test_select_invalid_ord:31,test_select_invalid_rel:31,test_select_non:31,test_select_one_rel:31,test_select_ord:31,test_select_order_clust_empti:31,test_select_order_clust_exist:31,test_select_orders_clusts_exist:31,test_select_rel:31,test_select_two_rel:31,test_seq_index_nam:30,test_seri:19,test_series_arrai:19,test_series_seri:19,test_set_str_dna_rna:30,test_side3_equal_length:9,test_side3_neg_length:9,test_side3_over_length:9,test_side3_under_length:9,test_side3_zero_length:9,test_side5_equal_length:9,test_side5_neg_length:9,test_side5_over_length:9,test_side5_under_length:9,test_side5_zero_length:9,test_signatur:31,test_siz:[30,31],test_slic:30,test_slice_end3_equ:30,test_slice_end3_great:30,test_slice_end3_less:30,test_slice_end5_end3:30,test_slice_end5_end3_invalid:30,test_slice_end5_equ:30,test_slice_end5_great:30,test_slice_end5_less:30,test_slice_length:30,test_subst_invalid:42,test_subst_valid:42,test_t:42,test_three_overlap:30,test_to_arrai:30,test_transcrib:30,test_trunc_section_full_sub:30,test_trunc_section_trunc_sub:30,test_two_degener:30,test_two_disjoint:30,test_two_disjoint_refseq:30,test_two_disjoint_wrong_refseq:30,test_two_ful:30,test_two_invalid:30,test_two_mask:30,test_two_overlap:30,test_two_overlapping_refseq:30,test_two_valid:30,test_typ:42,test_unequ:19,test_unmask:30,test_unmasked_bool:30,test_unmasked_int:30,test_valid:[30,31],test_valid_blank_lin:30,test_valid_dna:30,test_valid_empti:30,test_valid_empty_1:30,test_valid_empty_seq:30,test_valid_ful:30,test_valid_full_1:30,test_valid_full_9:30,test_valid_nam:30,test_valid_no_po:30,test_valid_noncontig:30,test_valid_noncontig_2:30,test_valid_rna:30,test_valid_slic:30,test_valid_slice_6:30,test_window_0:30,test_window_float:30,test_window_length:30,test_window_margin:30,test_with_clip:21,test_without_clip:21,test_wrap:25,test_xaax:42,test_zero:31,test_zero_degener:30,test_zero_invalid:30,test_zero_negative_allow:31,test_zero_non:31,test_zero_on:31,test_zero_one_allow:31,test_zero_one_unallow:31,test_zero_two:31,test_zero_valid:30,test_zero_zero:31,test_zero_zero_allow:31,test_zero_zero_unallow:31,testalignmentscoreparam:9,testanynan:19,testassam:9,testautorefram:19,testautoremovenan:19,testautoremovesnan:19,testcalccoeffdeterm:19,testcalcdatafram:21,testcalcfobsnumpi:21,testcalcmuadjnumpi:21,testcalcmuob:21,testcalcnrmsd:19,testcalcpearson:19,testcalcquantil:19,testcalcrank:19,testcalcrm:19,testcalcseri:21,testcalcspearman:19,testcas:[9,17,19,21,23,25,27,30,31,42,45],testcigarop:42,testclip:21,testclusthead:31,testcomparewindow:19,testconst:[23,27,30,31],testcountcigarmut:42,testcountpo:19,testcountspo:19,testcountsposconsensu:19,testdecod:23,testdna:30,testencod:23,testencodematch:45,testencoderel:45,testequalhead:31,testexpanddegenerateseq:30,testfindblankrang:9,testfindcigaroppo:42,testformat:30,testformatclustnam:31,testgetcomp:19,testgetsharedindex:30,testgetwindow:30,testhasclosemut:21,testhead:31,testhyphenateend:30,testindexclust:31,testindexord:31,testindexorderclust:31,testindexordersclust:31,testindextopo:30,testindextoseq:30,testinferread:42,testintersect:30,testiterrelvecsal:42,testiterrelvecsq53:42,testlistclust:31,testlistord:31,testlistorderclust:31,testlistordersclust:31,testlocktempdir:25,testmakehead:31,testmaketempbackup:17,testnonan:19,testnorm:19,testparsecigar:45,testparsefasta:30,testparsehead:31,testrefram:19,testreframelik:19,testrelaterelatelineambrel:45,testrelclusthead:31,testrelhead:31,testremovenan:19,testremovesnan:19,testrna:30,testrunfastqc:9,testsectionaddmask:30,testsectioncopi:30,testsectionequ:30,testsectioninit:30,testsectionlength:30,testsectionmask:30,testsectionmaskgu:30,testsectionmasknam:30,testsectionmaskpo:30,testsectionmaskpolya:30,testsectionrang:30,testsectionunmask:30,testseqpostoindex:30,teststandard:19,testsubsect:30,testunit:30,testvalidateorderclust:31,testvalidfastaseqnam:30,testwindowtomargin:30,testwinsor:19,testwritefasta:30,testxna:30,text:[12,13,15,28,41,63,67,92,99],tg:54,tgirt:103,th:58,than:[8,9,11,12,16,18,20,21,24,30,35,45,54,59,75,84,85,87,91,93,96,99,102,103,104,105,108,113,116,119],thank:114,thefs:80,thei:[7,8,20,26,32,35,54,58,59,84,85,92,95,102,104,105,108,110,112,113],them:[8,14,20,29,52,69,84,85,87,89,90,99,101,102,107,108,110,112,113,116],themselv:[54,87,102,104],thereaft:60,therefor:[20,103,108],thereof:[54,90,95],thi:[5,7,8,9,11,12,18,20,21,24,26,29,34,44,50,54,57,59,62,63,65,70,72,73,74,75,79,81,84,85,87,90,91,92,95,96,98,99,102,103,104,105,107,108,109,110,112,113,114,115,116],thing1:75,third:[12,78,99,103],those:[8,10,11,18,29,33,34,36,37,38,39,40,46,49,51,52,54,62,65,72,90,99,102,104,105,114,116],though:54,thousand:95,thread:[32,114],three:[20,67,79,87,90,95,102,103,108],thresh:[52,96],threshold:[54,77,84,91,92,95,96],through:[40,45,63,103],throughout:59,thu:[5,8,9,20,34,54,62,63,90,95,96,103,108,113],time:[11,12,24,29,51,52,67,76,77,78,80,81,82,83,84,87,94,96,102,104,105,108,113],titl:[12,28,34,35,60,114],title_action_sampl:35,tlen:8,to_ct:28,to_dict:[12,29],to_dir:12,to_dm:28,to_fasta:28,to_new:8,to_report_format:26,to_varna_color_fil:28,togeth:[30,81,103],toler:[8,20,32,51,52,76],tomezsko:[1,20,96,103],too:[8,20,21,38,81],tool:[62,92,95,96,105],top:[7,11,12,16,28,33,38,40,49,65,95,98,102,103,104,105,107],top_sampl:33,total:[11,22,29,41,54,65,103,105],toward:[1,54,103],tpr:[28,35],tr:29,trace:35,traceabl:75,track:44,trail:30,trajectori:[11,96],transcrib:[29,30,103],transcripas:103,transcript:[99,103],transcriptas:[20,103],transcriptom:95,transform:5,translat:[29,41],transpath:12,transpos:49,treat:[8,51,52,54,76,95,96],tree:116,trim:[5,8,51,52,63,76,85,89,101,103,105],trivial:96,troubleshoot:[89,92,101,111],truncat:12,trust:19,tshape:19,ttcg:5,tttcgctatgtgttac:108,tunnel:44,tupl:[5,8,9,10,11,12,13,14,16,18,19,24,28,29,32,33,34,35,36,37,38,39,40,42,44,46,49,51,57],turn:[54,107],tutori:[110,115],twice:[95,99],two:[8,9,11,12,14,15,18,20,21,29,30,34,35,38,41,44,51,52,54,58,60,61,62,63,72,78,87,96,100,101,103,104,105,108,113],twotabl:35,twotablegraph:35,twotablemergedgraph:35,twotablerunn:35,twotablewrit:35,txt:[12,66],type:[5,8,10,11,12,13,14,16,18,19,20,22,24,26,28,29,33,34,35,36,38,39,40,41,42,44,49,51,52,54,56,58,59,63,67,69,70,71,72,73,74,75,76,77,78,80,81,82,83,85,95,96,99,101,103,108,110,112,113,116],typeerror:[12,30],typic:[11,63],u:[5,8,29,34,38,51,52,60,61,62,81,85],ubiquit:113,uint:12,uint_typ:12,uk:110,ulin:12,ultim:[81,114],umber:67,un:[52,63,95],unalign:[8,51,52,63,76],unambigu:41,unbia:[12,18],uncertainti:103,unchang:85,unclear:85,uncompress:63,under:[4,28,29,49,95,100,103,112],underli:[20,42],underrepres:103,underw:103,unicod:29,unifi:8,uninstal:[112,113],union:[8,11,12,16,18,24,29,34,36,38,39,40,41],union_dict:32,union_set:32,unioned_set:32,uniq:11,uniq_read:11,uniq_read_num:11,uniq_reads_to_mut:11,uniqid:34,uniqread:11,uniqu:[11,34,58,77,95,96,108],unit:[8,29,50,51,52,54,87],unittest:[9,17,19,21,23,25,27,30,31,42,45,92],univers:35,universal_input_param:35,universal_output_param:35,unjoin:102,unknown:[54,96],unless:[12,103,104,105],unlik:[67,87],unlock:25,unmap:76,unmask:[29,33,49,51,52,65],unmasked_bool:[29,49],unmasked_int:[29,49],unmatch:42,unmodifi:105,unnecessari:95,unobserv:20,unpair:[28,60],unpickl:16,unpool:104,unsign:12,unsort:30,unsur:113,until:[5,77,85,96,107,112,113],untrim:[52,95],unus:[11,95,102,104],unwant:[84,95],unzip:[8,51,52,95],up:[41,62,72,90,93,94,95,96,102,103,105,108,111,112,117],updat:[8,11,12,84,92,110,112,113],update_batch:11,update_field:11,update_log_count:11,update_report:11,upgrad:[110,112,113],upon:[41,95,96],upper:[35,49,116],upper_limit:14,uppercas:[26,62,85],upstream:[58,75,108],upward:[18,34],url:117,urmc:[34,110],us:[4,5,8,10,11,12,14,16,18,19,20,22,24,28,29,30,34,35,36,37,38,40,44,45,46,49,51,52,54,64,69,71,75,76,78,84,85,88,89,90,91,92,93,95,96,98,101,102,103,104,105,106,107,110,112,113,114,115,117],usabl:95,usag:[95,103,105],use_ratio:35,user:[0,29,38,54,74,81,95,112],usual:[20,95,108],ut:74,util:[9,29,65,109],v1:110,v2:[8,110],v6:110,v:[12,35,52,87,92],val:12,valid:[8,11,12,14,22,29,30,42,44,45,51,52,62,76,85,95,99,102,104],valid_fasta_seqnam:[29,30],validate_int:12,validate_order_clust:12,validate_pair:44,validate_read:44,validate_str:12,validate_top:12,valu:[5,8,11,12,13,14,16,18,19,20,21,22,24,28,34,36,38,39,40,44,49,58,66,69,71,84,93,99,103,105],valueerror:[11,12,18,26,29,30,42,44],var_param:35,vari:[20,35],variabl:96,variant:85,variat:[20,77],varieti:[59,86],varna:[28,64,68,101],vast:103,vector:[7,11,12,20,21,38,39,41,42,44,45,49,53,55,56,58,67,77,87,96,103],vectorize_read:44,venv1:113,venv2:113,venv:113,verbatim:95,verbos:[12,50,52,92],veri:[5,63,95,99,103],verifi:[29,95,101,112,117],verify_index_nam:29,version:[4,12,44,63,76,77,78,80,81,82,83,95,96,110,111,114,119],versu:95,vertic:[39,89,101],via:[15,18,29,54,57,59,70,75,90,108],view:22,view_xam_cmd:22,viewer:92,violat:20,viral:103,virtual:[109,111],visit:112,visual:[56,58,101],vitro:[74,103],vl00355:56,vshape:19,vv:[12,92],w:52,wa:[0,1,8,9,11,28,51,52,54,63,66,67,74,76,79,84,95,103,110,112],wai:[72,75,84,87,90,95,96,98,99,101,102,103,104,105,106,107,116],wait:92,walkthrough:[109,117],want:[8,9,72,84,90,91,95,96,99,102,104,105,110,113,116],warn:[11,12,92,98,102,104,114],warranti:4,wast:84,we:[8,9,20,63,95,99,103,112,113,114],weather:32,web:[33,51,52,65,89,101,116],webpag:112,websit:[67,110],weight:[11,14],welcom:114,well:[28,40,54,63,69,90,95,108,113],were:[11,20,28,54,62,76,93,95,96,102,103,104,105,108,112,114,116],wf:[7,62,96,100,101,102,104,105,107],wget:117,what1:14,what2:14,what:[12,14,33,35,54,92,95,103,105,109,114],wheel:113,when:[5,11,14,20,21,34,42,44,45,54,59,72,87,95,100,102,103,104,105,107,113,114],whenev:[67,110],where:[8,9,13,18,20,24,28,29,34,44,54,59,65,87,92,95,96,99,102,103,104,105,106,107,108,112,114],wherein:[12,58,103],whether:[5,8,12,14,15,19,24,26,30,36,41,44,49,51,52,54,94,95,96,102,103,107,112,116],which:[8,9,11,12,16,18,19,20,26,28,29,30,32,34,35,44,51,52,54,58,59,60,61,62,63,65,66,67,69,71,72,73,74,75,76,78,79,84,85,86,87,90,91,94,95,96,99,102,103,105,107,108,110,112,113,114,116],white:99,whitespac:[12,30,60,62,85],whole:[7,8,63],whose:[8,10,11,12,18,22,29,33,34,35,36,37,38,39,40,44,46,49,51,52,63,72,75,105,108],why:[111,114],wide:[69,71,79,95],width:[8,51,52,76],window:[14,18,28,29,35,51,52,95,103,105],window_to_margin:[29,30],winmin:[35,51,52],winsor:[18,20],wish:84,with_head:22,within:[8,29,54,58,66,90,92,95,103,105],without:[4,11,18,21,34,35,51,52,63,66,78,98,103,113],won:96,word:[8,110],work:[1,30,54,87,90,95,99,105,110,112,113,114],workflow:[51,63,89,96,100,101,105,109],working_directori:32,workspac:32,wors:18,worsen:96,worst:5,worth:111,would:[9,12,18,19,20,26,34,44,54,56,57,58,62,63,67,84,87,91,93,95,96,103,105,107,108,112,113,114],wrap:[8,12,24,29],wrapper:34,write:[7,8,10,11,12,28,29,34,35,38,46,49,52,56,60,62,63,67,92,95,96,97,99,102,103,104,105,109],write_al:40,write_batch:11,write_csv:35,write_fasta:[29,30],write_html:35,write_log_count:11,write_mod:12,write_mu:11,write_on:40,write_pdf:35,write_prop:11,write_single_run_t:11,write_temp_ref_fil:8,written:[12,28,36,39,87,92,95,108,113],wrong:[12,95],wrote:114,www:[4,110],x00:[5,57],x02:26,x0c:26,x10:26,x80:26,x9f:[5,57],x:[7,19,20,35,42,52,63,87,90,95,99,107],x_rtol:20,x_titl:35,x_tol:20,xam:[8,9,22,40,56,64,95,105],xam_fil:40,xam_in:8,xam_inp:22,xam_input:40,xam_out:[8,22],xam_pair:22,xam_to_fq_cmd:22,xam_view:40,xamgen_cmd:8,xamgen_test:9,xamop:8,xamview:40,xdata:35,xkcd:119,xna:[8,10,12,14,16,29,30,34,35,38,40,41,42,44,45,51],xna_test:30,xontrib:112,xsh:112,y:[7,19,35,52,63,90,95,107,110],y_titl:35,ydata:35,ye:[26,70,72,73,74,75,112],yellow:12,yield:[8,12,14,20,26,28,29,34,35,41,42,44,49,95,96,103,107],you:[4,51,52,63,65,66,72,84,86,87,88,90,91,93,96,98,99,100,101,102,103,104,105,106,107,108,110,112,113,114,115,116],your:[4,62,84,88,90,95,96,99,102,103,104,105,107,111,113,114,116,117],yourbigcooldiscoveri:83,yourfavoriterna:83,yoursect:[72,80],yourself:95,yve:[0,13],yvesmartindestaillad:0,yyyi:92,z:[7,52,63,90,95,107],zero:[11,12,20,30,54,62,108],zip:95,zubradt:[1,103]},titles:["Authors","DMS-MaPseq","DREEM","About","License","Algorithm for Sequence Compression/Decompression","Algorithms","seismicrna package","seismicrna.align package","seismicrna.align.tests package","seismicrna.cleanfa package","seismicrna.cluster package","seismicrna.core package","seismicrna.core.arg package","seismicrna.core.batch package","seismicrna.core.extern package","seismicrna.core.io package","seismicrna.core.io.tests package","seismicrna.core.mu package","seismicrna.core.mu.tests package","seismicrna.core.mu.unbias package","seismicrna.core.mu.unbias.tests package","seismicrna.core.ngs package","seismicrna.core.ngs.tests package","seismicrna.core.parallel package","seismicrna.core.parallel.tests package","seismicrna.core.rel package","seismicrna.core.rel.tests package","seismicrna.core.rna package","seismicrna.core.seq package","seismicrna.core.seq.tests package","seismicrna.core.tests package","seismicrna.demult package","seismicrna.export package","seismicrna.fold package","seismicrna.graph package","seismicrna.join package","seismicrna.lists package","seismicrna.mask package","seismicrna.pool package","seismicrna.relate package","seismicrna.relate.aux package","seismicrna.relate.aux.tests package","seismicrna.relate.c package","seismicrna.relate.py package","seismicrna.relate.py.tests package","seismicrna.renumct package","seismicrna.sim package","seismicrna.sim.tests package","seismicrna.table package","seismicrna.test package","seismicrna.wf package","Commands, Arguments, Options","Data Structures","Relation Vectors","Relate Data Structures","Read Names Batch","Reference Sequence","Relate Batch","Brickle: Compressed Python Objects","Connectivity Table (CT): RNA secondary structures","Dot-bracket (DB): RNA secondary structures","FASTA: Reference sequences","FASTQ: Sequencing Reads","Data Formats","Sample results: Export data from SEISMIC-RNA to SEISMIC-GRAPH","VARNA Color: Color codes for VARNA","SAM, BAM, and CRAM: Alignment Maps","File Formats","List Formats","List of Positions","Metadata Formats","Metadata for Joined Clusters","Metadata for References","Metadata for Samples","Metadata for Sections","Align Report","Cluster Report","Fold Report","Report Formats","Join Report","Mask Report","Pool Report","Relate Report","Add/Delete Orders to/from an Already-Clustered Dataset","Clean FASTA Files","Graph Results","General parameters for graphing","Profile: Bar graph of relationships(s) per position","How To","List Input Files","List Positions Matching Criteria","Log Messages","Normalize Mutation Rates","Parallelize Tasks","Align: Trim FASTQ files and align them to reference sequences","Cluster: Infer alternative structures by clustering reads\u2019 mutations","Demultiplex: Split multiplexed FASTQ files by their barcodes","Export: Export a file of each sample for the seismic-graph web app","Fold: Predict RNA secondary structures using mutation rates","Graph: Plot data from tables and/or structures and compare samples","Run SEISMIC-RNA","Join: Merge sections (horizontally) from the Mask or Cluster step","Mask: Define mutations and sections to filter reads and positions","Pool: Merge samples (vertically) from the Relate step","Relate: Compute relationships between references and aligned reads","Table: Count mutations for each read and position","Workflow: Run all steps","Define Sections","How to Research RNA Structures with SEISMIC-RNA","Installing with Conda","Install","Prerequisites: Python, pip, and Conda","Virtual Environments","Bugs and Requests","Step-by-step walkthrough","Example dataset","Step-By-Step","What it Does","How to Write this Manual"],titleterms:{"1":63,"1st":63,"2":[63,95],"256":116,"2nd":63,"3":58,"5":58,"default":100,"export":[33,65,98],"long":96,"new":[87,114],"while":[85,103,105],A:103,By:117,To:89,about:[3,72,73,74,75,84,85,91],activ:[110,113],ad:84,adapt:95,add:84,addclust:52,algorithm:[5,6,85],align:[8,9,52,67,76,95,105],all:[87,107],alphabet:63,alreadi:[84,96],altern:96,ambigu:[54,105],an:84,app:98,ar:[92,103],arbitari:103,arg:13,argument:52,assess:95,aucrol:52,author:0,automat:108,aux:[41,42],auxiliari:41,background:[5,84,85,91],bam:67,bar:88,barcod:97,base:[54,95,103],batch:[14,56,58,94,96,103,105],benefit:94,between:[54,95,103,105],bodi:[60,61,62],bowti:95,bracket:[61,99],brickl:59,bug:114,build:95,c:43,call:[54,95,118],can:95,caus:[102,104],cgroup:87,channel:95,charact:63,check:[95,112],checksum:116,chemistri:95,choos:95,clean:[10,85],cleanfa:[10,52],cluster:[11,52,65,72,77,80,84,87,96,99,102,106],code:66,coexist:113,color:[66,99],come:[92,95],command:[13,52,84,85,91],compar:100,comparison:[11,67],compress:[5,59],comput:[105,116],conda:[110,112],conflict:113,connect:[60,99],consensu:54,content:[59,60,61,62,63,65,66,67],control:92,coordin:108,core:[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],corrol:52,count:[87,106,118],cover:54,cram:67,crash:[95,103,105],creat:[110,113],criteria:91,ct:[46,60],curl:116,custom:95,cutadapt:95,cycl:95,dark:95,data:[53,55,64,65,87,100,102,104],dataset:[84,116],db:61,deactiv:113,decompress:5,defin:[99,103,108,118],delclust:52,delet:[54,84,96,105],delprof:52,demult:[32,52],demultiplex:[95,97],depend:110,destin:87,dir:87,dm:1,dna:63,doe:118,done:96,dot:[61,99],download:116,dreem:2,duplic:[102,104],each:[88,95,98,106,118],effort:113,encod:[54,63,67,95],end:[54,58,63,95],ended:[63,67,95],enhanc:114,entir:52,environ:[110,113],error:85,exampl:[5,56,57,58,70,72,73,74,75,76,77,78,80,81,82,83,88,116],exclud:103,expect:[95,96],extens:[59,60,61,62,63,65,66,67],extern:15,extra:[52,95],fasta:[10,62,85],fastq:[63,95,97],fastqc:95,featur:114,feedback:114,few:[103,105],fewer:95,field:[70,72,73,74,75,76,77,78,80,81,82,83],file:[8,59,60,61,62,63,65,66,67,68,70,85,87,88,90,92,95,96,97,98,99,102,103,104,105,106,107,108,115,116],filter:[95,103,118],finish:96,five:92,fold:[34,52,78,99],format:[59,60,61,62,63,64,65,66,67,68,69,71,79,92,95],fraction:[88,103],from:[65,84,91,95,100,102,104,116],full:108,further:95,g:103,gener:87,github:116,give:114,got:[102,104],graph:[35,52,65,86,87,88,98,100],group:87,guidelin:114,hang:[95,103,105],header:[60,61,62],higher:96,histpo:52,histread:52,horizont:102,how:[84,85,89,90,91,92,93,95,108,109,113,114,119],illumina:95,index:95,individu:52,infer:96,inform:[88,103],initi:112,input:[59,60,62,63,65,67,70,87,88,90,95,96,98,99,102,103,104,105,106,107],insert:[54,105],instal:[110,111,112],insuffici:105,interfac:13,interleav:[63,95],io:[16,17],irreconcil:54,iter:[41,96],its:110,join:[36,72,80,102],label:63,layer:65,length:108,let:113,level:92,licens:4,line:[13,60,61,62,84,85,91],list:[37,69,70,90,91],listpo:52,local:95,log:92,loss:[102,104],low:[54,95],main:[7,40,51],manag:113,mani:103,manual:119,map:[67,95,105],mapseq:1,mask:[38,52,80,81,96,99,102,103,118],match:91,mate:63,maxim:96,maximum:96,md5:116,membership:96,merg:[102,104],messag:92,metadata:[65,71,72,73,74,75,98],minimum:105,modul:[7,8,10,11,40,41,46,51],mu:[18,19,20,21],multipl:[95,108],multiplex:97,mutat:[58,88,93,96,99,103,106,118],name:[11,56,102,104,105,108],ng:[22,23],non:110,normal:[87,93,99],note:[72,73,74,75],number:[58,88,95,96,103],o:87,object:59,one:[95,108],optim:[95,96,102,103,104,105,107],option:[52,95],order:[84,87,96],other:114,out:[87,103],output:[59,60,61,62,63,65,66,67,70,87,88,92,95,96,98,99,102,103,104,105,106,107],overal:95,overwrit:[102,104],packag:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],pair:[54,63,95],parallel:[24,25,94],paramet:[87,99],pars:[59,60,61,62,63,65,66,67],path:[59,60,61,62,63,65,66,67,92],per:[65,88,106],phred:[63,105],pip:112,pipelin:51,plain:[70,72,73,74,75],plot:100,poli:103,pool:[39,82,104],posit:[54,58,65,70,88,91,99,103,106,118],pre:95,predict:99,prerequisit:112,pretti:[70,72,73,74,75],primari:54,primer:108,problem:114,procedur:5,produc:[95,103,105],profil:[52,65,88],purpos:[12,72,73,74,75,84,85,91],py:[44,45],python:[59,110,112],q:87,qualiti:[54,63,67,95,105],quantil:[87,93,99],r:87,rate:[88,93,99],ratio:87,read:[41,54,56,58,63,65,88,95,96,103,105,106,118],real:92,refer:[54,57,62,65,73,95,105,108],rel:[26,27,87],relat:[40,41,42,43,44,45,52,54,55,58,83,103,104,105],relationship:[54,87,88,105,106,118],renumb:46,renumct:[46,52],repeat:96,report:[76,77,78,79,80,81,82,83,95,96,99,102,103,104,105,106,114],request:114,research:109,result:[65,86,98],rna:[7,28,60,61,65,99,101,109,110],rnastructur:99,roc:52,run:[52,96,101,107],s:[87,88],sam:[8,67],sampl:[65,74,95,98,100,104],scatter:52,score:[63,67,95,105],secondari:[60,61,99],section:[65,75,99,102,103,108,118],seismic:[7,52,65,98,101,109,110],seismicrna:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],separ:[63,95],seq:[29,30],sequenc:[5,57,62,63,95,103,105,108],set:[63,88,95,96,98,99,102,103,104,105,106,107,113,115],sha:116,share:105,sim:[47,48],simul:8,simultan:108,singl:[63,95],size:105,slowli:95,softwar:113,sofwar:113,sourc:95,space:103,specifi:95,split:97,standard:92,step:[52,102,104,107,115,117,118],structur:[53,55,56,57,58,60,61,96,99,100,109],submodul:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,45,46,49,50,51],subpackag:[7,8,12,16,18,20,22,24,26,29,40,41,44,47],suppress:106,system:115,tabl:[49,52,60,70,72,73,74,75,91,98,99,100,106,118],take:96,task:94,temporari:[59,60,62,63,67],test:[9,17,19,21,23,25,27,30,31,42,45,48,50,52],text:[70,72,73,74,75],than:95,them:95,thi:119,time:92,too:[95,96,103],trim:95,troubleshoot:[85,95,96,102,103,104,105,107,110,112],two:95,type:[87,88,100],u:103,unalign:95,unbia:[20,21],unnecessari:96,up:[113,115],url:116,us:[59,60,61,62,63,65,66,67,70,87,99,108,116],util:52,varna:[66,99],vector:[40,54,105],verifi:[96,110,116],version:113,vertic:104,view:92,virtual:[110,113],visual:99,walkthrough:115,web:98,wf:[51,52],wget:116,what:118,which:92,whole:[51,95],why:113,without:[95,96],work:96,workflow:[52,107,118],worth:113,would:[102,104],write:[40,119],xam:67,you:95,your:[110,112,115]}})
\ No newline at end of file
+Search.setIndex({docnames:["about/authors","about/dms","about/dreem","about/index","about/license","algos/compress","algos/index","api/seismicrna","api/seismicrna.align","api/seismicrna.align.tests","api/seismicrna.cleanfa","api/seismicrna.cluster","api/seismicrna.cluster.tests","api/seismicrna.core","api/seismicrna.core.arg","api/seismicrna.core.batch","api/seismicrna.core.batch.tests","api/seismicrna.core.extern","api/seismicrna.core.io","api/seismicrna.core.io.tests","api/seismicrna.core.mu","api/seismicrna.core.mu.tests","api/seismicrna.core.ngs","api/seismicrna.core.ngs.tests","api/seismicrna.core.parallel","api/seismicrna.core.parallel.tests","api/seismicrna.core.rel","api/seismicrna.core.rel.tests","api/seismicrna.core.rna","api/seismicrna.core.seq","api/seismicrna.core.seq.tests","api/seismicrna.core.tests","api/seismicrna.demult","api/seismicrna.export","api/seismicrna.fold","api/seismicrna.graph","api/seismicrna.join","api/seismicrna.lists","api/seismicrna.mask","api/seismicrna.pool","api/seismicrna.relate","api/seismicrna.relate.aux","api/seismicrna.relate.aux.tests","api/seismicrna.relate.c","api/seismicrna.relate.py","api/seismicrna.relate.py.tests","api/seismicrna.relate.tests","api/seismicrna.renumct","api/seismicrna.sim","api/seismicrna.sim.tests","api/seismicrna.table","api/seismicrna.test","api/seismicrna.wf","cli","data/index","data/relate/codes","data/relate/index","data/relate/qnames","data/relate/refseq","data/relate/relate","formats/data/brickle","formats/data/ct","formats/data/db","formats/data/fasta","formats/data/fastq","formats/data/index","formats/data/sample","formats/data/varna-color","formats/data/xam","formats/index","formats/list/index","formats/list/listpos","formats/meta/index","formats/meta/joined","formats/meta/refs","formats/meta/samples","formats/meta/sections","formats/report/align","formats/report/cluster","formats/report/fold","formats/report/index","formats/report/join","formats/report/mask","formats/report/pool","formats/report/relate","howto/adjclust","howto/cleanfa","howto/graph/index","howto/graph/params","howto/graph/profile","howto/index","howto/inputs","howto/lists","howto/logging","howto/normalize","howto/parallel","howto/run/align","howto/run/cluster","howto/run/demult","howto/run/export","howto/run/fold","howto/run/graph","howto/run/index","howto/run/join","howto/run/mask","howto/run/pool","howto/run/relate","howto/run/table","howto/run/wf","howto/sections","index","install/conda","install/index","install/prereqs","install/venv","issues","steps/amplicon","steps/example","steps/index","whatdoes/index","writeme"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["about/authors.rst","about/dms.rst","about/dreem.rst","about/index.rst","about/license.rst","algos/compress.rst","algos/index.rst","api/seismicrna.rst","api/seismicrna.align.rst","api/seismicrna.align.tests.rst","api/seismicrna.cleanfa.rst","api/seismicrna.cluster.rst","api/seismicrna.cluster.tests.rst","api/seismicrna.core.rst","api/seismicrna.core.arg.rst","api/seismicrna.core.batch.rst","api/seismicrna.core.batch.tests.rst","api/seismicrna.core.extern.rst","api/seismicrna.core.io.rst","api/seismicrna.core.io.tests.rst","api/seismicrna.core.mu.rst","api/seismicrna.core.mu.tests.rst","api/seismicrna.core.ngs.rst","api/seismicrna.core.ngs.tests.rst","api/seismicrna.core.parallel.rst","api/seismicrna.core.parallel.tests.rst","api/seismicrna.core.rel.rst","api/seismicrna.core.rel.tests.rst","api/seismicrna.core.rna.rst","api/seismicrna.core.seq.rst","api/seismicrna.core.seq.tests.rst","api/seismicrna.core.tests.rst","api/seismicrna.demult.rst","api/seismicrna.export.rst","api/seismicrna.fold.rst","api/seismicrna.graph.rst","api/seismicrna.join.rst","api/seismicrna.lists.rst","api/seismicrna.mask.rst","api/seismicrna.pool.rst","api/seismicrna.relate.rst","api/seismicrna.relate.aux.rst","api/seismicrna.relate.aux.tests.rst","api/seismicrna.relate.c.rst","api/seismicrna.relate.py.rst","api/seismicrna.relate.py.tests.rst","api/seismicrna.relate.tests.rst","api/seismicrna.renumct.rst","api/seismicrna.sim.rst","api/seismicrna.sim.tests.rst","api/seismicrna.table.rst","api/seismicrna.test.rst","api/seismicrna.wf.rst","cli.rst","data/index.rst","data/relate/codes.rst","data/relate/index.rst","data/relate/qnames.rst","data/relate/refseq.rst","data/relate/relate.rst","formats/data/brickle.rst","formats/data/ct.rst","formats/data/db.rst","formats/data/fasta.rst","formats/data/fastq.rst","formats/data/index.rst","formats/data/sample.rst","formats/data/varna-color.rst","formats/data/xam.rst","formats/index.rst","formats/list/index.rst","formats/list/listpos.rst","formats/meta/index.rst","formats/meta/joined.rst","formats/meta/refs.rst","formats/meta/samples.rst","formats/meta/sections.rst","formats/report/align.rst","formats/report/cluster.rst","formats/report/fold.rst","formats/report/index.rst","formats/report/join.rst","formats/report/mask.rst","formats/report/pool.rst","formats/report/relate.rst","howto/adjclust.rst","howto/cleanfa.rst","howto/graph/index.rst","howto/graph/params.rst","howto/graph/profile.rst","howto/index.rst","howto/inputs.rst","howto/lists.rst","howto/logging.rst","howto/normalize.rst","howto/parallel.rst","howto/run/align.rst","howto/run/cluster.rst","howto/run/demult.rst","howto/run/export.rst","howto/run/fold.rst","howto/run/graph.rst","howto/run/index.rst","howto/run/join.rst","howto/run/mask.rst","howto/run/pool.rst","howto/run/relate.rst","howto/run/table.rst","howto/run/wf.rst","howto/sections.rst","index.rst","install/conda.rst","install/index.rst","install/prereqs.rst","install/venv.rst","issues.rst","steps/amplicon.rst","steps/example.rst","steps/index.rst","whatdoes/index.rst","writeme.rst"],objects:{"":[[7,0,0,"-","seismicrna"]],"seismic-+addclust":[[53,7,1,"cmdoption-seismic-addclust-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-addclust-k","--max-clusters"],[53,7,1,"cmdoption-seismic-addclust-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-addclust-parallel","--parallel"],[53,7,1,"cmdoption-seismic-addclust-parallel","--serial"],[53,7,1,"cmdoption-seismic-addclust-k","-k"],[53,7,1,"cmdoption-seismic-addclust-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+cleanfa":[[53,7,1,"cmdoption-seismic-cleanfa-force","--force"],[53,7,1,"cmdoption-seismic-cleanfa-inplace","--inplace"],[53,7,1,"cmdoption-seismic-cleanfa-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-cleanfa-inplace","--newfile"],[53,7,1,"cmdoption-seismic-cleanfa-force","--no-force"],[53,7,1,"cmdoption-seismic-cleanfa-o","--out-dir"],[53,7,1,"cmdoption-seismic-cleanfa-parallel","--parallel"],[53,7,1,"cmdoption-seismic-cleanfa-parallel","--serial"],[53,7,1,"cmdoption-seismic-cleanfa-o","-o"],[53,7,1,"cmdoption-seismic-cleanfa-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+delclust":[[53,7,1,"cmdoption-seismic-delclust-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-delclust-k","--max-clusters"],[53,7,1,"cmdoption-seismic-delclust-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-delclust-parallel","--parallel"],[53,7,1,"cmdoption-seismic-delclust-parallel","--serial"],[53,7,1,"cmdoption-seismic-delclust-k","-k"],[53,7,1,"cmdoption-seismic-delclust-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+listpos":[[53,7,1,"cmdoption-seismic-listpos-complement","--complement"],[53,7,1,"cmdoption-seismic-listpos-force","--force"],[53,7,1,"cmdoption-seismic-listpos-max-fmut-pos","--max-fmut-pos"],[53,7,1,"cmdoption-seismic-listpos-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-listpos-complement","--no-complement"],[53,7,1,"cmdoption-seismic-listpos-force","--no-force"],[53,7,1,"cmdoption-seismic-listpos-parallel","--parallel"],[53,7,1,"cmdoption-seismic-listpos-parallel","--serial"],[53,7,1,"cmdoption-seismic-listpos-arg-INPUT_PATH","INPUT_PATH"]],"seismic-+renumct":[[53,7,1,"cmdoption-seismic-renumct-c","--ct-pos-5"],[53,7,1,"cmdoption-seismic-renumct-force","--force"],[53,7,1,"cmdoption-seismic-renumct-inplace","--inplace"],[53,7,1,"cmdoption-seismic-renumct-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-renumct-inplace","--newfile"],[53,7,1,"cmdoption-seismic-renumct-force","--no-force"],[53,7,1,"cmdoption-seismic-renumct-o","--out-dir"],[53,7,1,"cmdoption-seismic-renumct-parallel","--parallel"],[53,7,1,"cmdoption-seismic-renumct-parallel","--serial"],[53,7,1,"cmdoption-seismic-renumct-c","-c"],[53,7,1,"cmdoption-seismic-renumct-o","-o"]],"seismic-+test":[[53,7,1,"cmdoption-seismic-test-v","--verbose"],[53,7,1,"cmdoption-seismic-test-v","-v"]],"seismic-align":[[53,7,1,"cmdoption-seismic-align-cram","--bam"],[53,7,1,"cmdoption-seismic-align-bt2-D","--bt2-D"],[53,7,1,"cmdoption-seismic-align-bt2-I","--bt2-I"],[53,7,1,"cmdoption-seismic-align-bt2-L","--bt2-L"],[53,7,1,"cmdoption-seismic-align-bt2-R","--bt2-R"],[53,7,1,"cmdoption-seismic-align-bt2-X","--bt2-X"],[53,7,1,"cmdoption-seismic-align-bt2-contain","--bt2-contain"],[53,7,1,"cmdoption-seismic-align-bt2-discordant","--bt2-discordant"],[53,7,1,"cmdoption-seismic-align-bt2-dovetail","--bt2-dovetail"],[53,7,1,"cmdoption-seismic-align-bt2-dpad","--bt2-dpad"],[53,7,1,"cmdoption-seismic-align-bt2-local","--bt2-end-to-end"],[53,7,1,"cmdoption-seismic-align-bt2-gbar","--bt2-gbar"],[53,7,1,"cmdoption-seismic-align-0","--bt2-i"],[53,7,1,"cmdoption-seismic-align-bt2-local","--bt2-local"],[53,7,1,"cmdoption-seismic-align-bt2-mixed","--bt2-mixed"],[53,7,1,"cmdoption-seismic-align-bt2-contain","--bt2-no-contain"],[53,7,1,"cmdoption-seismic-align-bt2-discordant","--bt2-no-discordant"],[53,7,1,"cmdoption-seismic-align-bt2-dovetail","--bt2-no-dovetail"],[53,7,1,"cmdoption-seismic-align-bt2-mixed","--bt2-no-mixed"],[53,7,1,"cmdoption-seismic-align-bt2-un","--bt2-no-un"],[53,7,1,"cmdoption-seismic-align-bt2-orient","--bt2-orient"],[53,7,1,"cmdoption-seismic-align-bt2-score-min-e2e","--bt2-score-min-e2e"],[53,7,1,"cmdoption-seismic-align-bt2-score-min-loc","--bt2-score-min-loc"],[53,7,1,"cmdoption-seismic-align-bt2-un","--bt2-un"],[53,7,1,"cmdoption-seismic-align-cram","--cram"],[53,7,1,"cmdoption-seismic-align-cut","--cut"],[53,7,1,"cmdoption-seismic-align-cut-O","--cut-O"],[53,7,1,"cmdoption-seismic-align-cut-a1","--cut-a1"],[53,7,1,"cmdoption-seismic-align-cut-a2","--cut-a2"],[53,7,1,"cmdoption-seismic-align-cut-discard-trimmed","--cut-discard-trimmed"],[53,7,1,"cmdoption-seismic-align-cut-discard-untrimmed","--cut-discard-untrimmed"],[53,7,1,"cmdoption-seismic-align-cut-e","--cut-e"],[53,7,1,"cmdoption-seismic-align-cut-g1","--cut-g1"],[53,7,1,"cmdoption-seismic-align-cut-g2","--cut-g2"],[53,7,1,"cmdoption-seismic-align-cut-indels","--cut-indels"],[53,7,1,"cmdoption-seismic-align-cut-discard-trimmed","--cut-keep-trimmed"],[53,7,1,"cmdoption-seismic-align-cut-discard-untrimmed","--cut-keep-untrimmed"],[53,7,1,"cmdoption-seismic-align-cut-m","--cut-m"],[53,7,1,"cmdoption-seismic-align-cut-nextseq","--cut-nextseq"],[53,7,1,"cmdoption-seismic-align-cut-indels","--cut-no-indels"],[53,7,1,"cmdoption-seismic-align-cut-nextseq","--cut-no-nextseq"],[53,7,1,"cmdoption-seismic-align-cut-q1","--cut-q1"],[53,7,1,"cmdoption-seismic-align-cut-q2","--cut-q2"],[53,7,1,"cmdoption-seismic-align-X","--dmfastqx"],[53,7,1,"cmdoption-seismic-align-Y","--dmfastqy"],[53,7,1,"cmdoption-seismic-align-Z","--dmfastqz"],[53,7,1,"cmdoption-seismic-align-keep-temp","--erase-temp"],[53,7,1,"cmdoption-seismic-align-fastqc","--fastqc"],[53,7,1,"cmdoption-seismic-align-x","--fastqx"],[53,7,1,"cmdoption-seismic-align-y","--fastqy"],[53,7,1,"cmdoption-seismic-align-z","--fastqz"],[53,7,1,"cmdoption-seismic-align-force","--force"],[53,7,1,"cmdoption-seismic-align-keep-temp","--keep-temp"],[53,7,1,"cmdoption-seismic-align-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-align-min-mapq","--min-mapq"],[53,7,1,"cmdoption-seismic-align-N","--min-reads"],[53,7,1,"cmdoption-seismic-align-cut","--no-cut"],[53,7,1,"cmdoption-seismic-align-fastqc","--no-fastqc"],[53,7,1,"cmdoption-seismic-align-force","--no-force"],[53,7,1,"cmdoption-seismic-align-o","--out-dir"],[53,7,1,"cmdoption-seismic-align-parallel","--parallel"],[53,7,1,"cmdoption-seismic-align-phred-enc","--phred-enc"],[53,7,1,"cmdoption-seismic-align-qc-extract","--qc-extract"],[53,7,1,"cmdoption-seismic-align-qc-extract","--qc-no-extract"],[53,7,1,"cmdoption-seismic-align-parallel","--serial"],[53,7,1,"cmdoption-seismic-align-t","--temp-dir"],[53,7,1,"cmdoption-seismic-align-N","-N"],[53,7,1,"cmdoption-seismic-align-X","-X"],[53,7,1,"cmdoption-seismic-align-Y","-Y"],[53,7,1,"cmdoption-seismic-align-Z","-Z"],[53,7,1,"cmdoption-seismic-align-o","-o"],[53,7,1,"cmdoption-seismic-align-t","-t"],[53,7,1,"cmdoption-seismic-align-x","-x"],[53,7,1,"cmdoption-seismic-align-y","-y"],[53,7,1,"cmdoption-seismic-align-z","-z"],[53,7,1,"cmdoption-seismic-align-arg-FASTA","FASTA"]],"seismic-cluster":[[53,7,1,"cmdoption-seismic-cluster-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-cluster-e","--em-runs"],[53,7,1,"cmdoption-seismic-cluster-em-thresh","--em-thresh"],[53,7,1,"cmdoption-seismic-cluster-force","--force"],[53,7,1,"cmdoption-seismic-cluster-k","--max-clusters"],[53,7,1,"cmdoption-seismic-cluster-max-em-iter","--max-em-iter"],[53,7,1,"cmdoption-seismic-cluster-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-cluster-min-em-iter","--min-em-iter"],[53,7,1,"cmdoption-seismic-cluster-force","--no-force"],[53,7,1,"cmdoption-seismic-cluster-parallel","--parallel"],[53,7,1,"cmdoption-seismic-cluster-parallel","--serial"],[53,7,1,"cmdoption-seismic-cluster-e","-e"],[53,7,1,"cmdoption-seismic-cluster-k","-k"],[53,7,1,"cmdoption-seismic-cluster-arg-INPUT_PATH","INPUT_PATH"]],"seismic-demult":[[53,7,1,"cmdoption-seismic-demult-barcode-end","--barcode-end"],[53,7,1,"cmdoption-seismic-demult-barcode-start","--barcode-start"],[53,7,1,"cmdoption-seismic-demult-clipped","--clipped"],[53,7,1,"cmdoption-seismic-demult-demulti-overwrite","--demulti-overwrite"],[53,7,1,"cmdoption-seismic-demult-keep-temp","--erase-temp"],[53,7,1,"cmdoption-seismic-demult-x","--fastqx"],[53,7,1,"cmdoption-seismic-demult-index-tolerance","--index-tolerance"],[53,7,1,"cmdoption-seismic-demult-keep-temp","--keep-temp"],[53,7,1,"cmdoption-seismic-demult-mismatch-tolerence","--mismatch-tolerence"],[53,7,1,"cmdoption-seismic-demult-o","--out-dir"],[53,7,1,"cmdoption-seismic-demult-parallel-demultiplexing","--parallel-demultiplexing"],[53,7,1,"cmdoption-seismic-demult-phred-enc","--phred-enc"],[53,7,1,"cmdoption-seismic-demult-R","--refs-meta"],[53,7,1,"cmdoption-seismic-demult-t","--temp-dir"],[53,7,1,"cmdoption-seismic-demult-R","-R"],[53,7,1,"cmdoption-seismic-demult-o","-o"],[53,7,1,"cmdoption-seismic-demult-t","-t"],[53,7,1,"cmdoption-seismic-demult-x","-x"],[53,7,1,"cmdoption-seismic-demult-arg-FASTA","FASTA"]],"seismic-fold":[[53,7,1,"cmdoption-seismic-fold-c","--coords"],[53,7,1,"cmdoption-seismic-fold-keep-temp","--erase-temp"],[53,7,1,"cmdoption-seismic-fold-fold-constraint","--fold-constraint"],[53,7,1,"cmdoption-seismic-fold-fold-max","--fold-max"],[53,7,1,"cmdoption-seismic-fold-fold-md","--fold-md"],[53,7,1,"cmdoption-seismic-fold-fold-mfe","--fold-mfe"],[53,7,1,"cmdoption-seismic-fold-fold-percent","--fold-percent"],[53,7,1,"cmdoption-seismic-fold-fold-mfe","--fold-sub"],[53,7,1,"cmdoption-seismic-fold-fold-temp","--fold-temp"],[53,7,1,"cmdoption-seismic-fold-force","--force"],[53,7,1,"cmdoption-seismic-fold-keep-temp","--keep-temp"],[53,7,1,"cmdoption-seismic-fold-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-fold-force","--no-force"],[53,7,1,"cmdoption-seismic-fold-parallel","--parallel"],[53,7,1,"cmdoption-seismic-fold-primer-gap","--primer-gap"],[53,7,1,"cmdoption-seismic-fold-p","--primers"],[53,7,1,"cmdoption-seismic-fold-q","--quantile"],[53,7,1,"cmdoption-seismic-fold-s","--sections-file"],[53,7,1,"cmdoption-seismic-fold-parallel","--serial"],[53,7,1,"cmdoption-seismic-fold-t","--temp-dir"],[53,7,1,"cmdoption-seismic-fold-c","-c"],[53,7,1,"cmdoption-seismic-fold-p","-p"],[53,7,1,"cmdoption-seismic-fold-q","-q"],[53,7,1,"cmdoption-seismic-fold-s","-s"],[53,7,1,"cmdoption-seismic-fold-t","-t"],[53,7,1,"cmdoption-seismic-fold-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-aucroll":[[53,7,1,"cmdoption-seismic-graph-aucroll-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-aucroll-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-aucroll-force","--force"],[53,7,1,"cmdoption-seismic-graph-aucroll-html","--html"],[53,7,1,"cmdoption-seismic-graph-aucroll-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-aucroll-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-aucroll-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-aucroll-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-aucroll-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-aucroll-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-aucroll-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-aucroll-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-aucroll-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-aucroll-r","--rels"],[53,7,1,"cmdoption-seismic-graph-aucroll-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-aucroll-struct-file","--struct-file"],[53,7,1,"cmdoption-seismic-graph-aucroll-struct-sect","--struct-sect"],[53,7,1,"cmdoption-seismic-graph-aucroll-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-aucroll-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-aucroll-w","--window"],[53,7,1,"cmdoption-seismic-graph-aucroll-n","--winmin"],[53,7,1,"cmdoption-seismic-graph-aucroll-n","-n"],[53,7,1,"cmdoption-seismic-graph-aucroll-o","-o"],[53,7,1,"cmdoption-seismic-graph-aucroll-q","-q"],[53,7,1,"cmdoption-seismic-graph-aucroll-r","-r"],[53,7,1,"cmdoption-seismic-graph-aucroll-w","-w"],[53,7,1,"cmdoption-seismic-graph-aucroll-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-corroll":[[53,7,1,"cmdoption-seismic-graph-corroll-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-corroll-comppair","--comppair"],[53,7,1,"cmdoption-seismic-graph-corroll-compself","--compself"],[53,7,1,"cmdoption-seismic-graph-corroll-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-corroll-force","--force"],[53,7,1,"cmdoption-seismic-graph-corroll-html","--html"],[53,7,1,"cmdoption-seismic-graph-corroll-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-corroll-m","--metric"],[53,7,1,"cmdoption-seismic-graph-corroll-comppair","--no-comppair"],[53,7,1,"cmdoption-seismic-graph-corroll-compself","--no-compself"],[53,7,1,"cmdoption-seismic-graph-corroll-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-corroll-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-corroll-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-corroll-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-corroll-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-corroll-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-corroll-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-corroll-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-corroll-r","--rels"],[53,7,1,"cmdoption-seismic-graph-corroll-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-corroll-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-corroll-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-corroll-w","--window"],[53,7,1,"cmdoption-seismic-graph-corroll-n","--winmin"],[53,7,1,"cmdoption-seismic-graph-corroll-m","-m"],[53,7,1,"cmdoption-seismic-graph-corroll-n","-n"],[53,7,1,"cmdoption-seismic-graph-corroll-o","-o"],[53,7,1,"cmdoption-seismic-graph-corroll-q","-q"],[53,7,1,"cmdoption-seismic-graph-corroll-r","-r"],[53,7,1,"cmdoption-seismic-graph-corroll-w","-w"],[53,7,1,"cmdoption-seismic-graph-corroll-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-delprof":[[53,7,1,"cmdoption-seismic-graph-delprof-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-delprof-comppair","--comppair"],[53,7,1,"cmdoption-seismic-graph-delprof-compself","--compself"],[53,7,1,"cmdoption-seismic-graph-delprof-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-delprof-force","--force"],[53,7,1,"cmdoption-seismic-graph-delprof-html","--html"],[53,7,1,"cmdoption-seismic-graph-delprof-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-delprof-comppair","--no-comppair"],[53,7,1,"cmdoption-seismic-graph-delprof-compself","--no-compself"],[53,7,1,"cmdoption-seismic-graph-delprof-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-delprof-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-delprof-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-delprof-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-delprof-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-delprof-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-delprof-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-delprof-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-delprof-r","--rels"],[53,7,1,"cmdoption-seismic-graph-delprof-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-delprof-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-delprof-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-delprof-o","-o"],[53,7,1,"cmdoption-seismic-graph-delprof-q","-q"],[53,7,1,"cmdoption-seismic-graph-delprof-r","-r"],[53,7,1,"cmdoption-seismic-graph-delprof-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-histpos":[[53,7,1,"cmdoption-seismic-graph-histpos-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-histpos-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-histpos-force","--force"],[53,7,1,"cmdoption-seismic-graph-histpos-hist-bins","--hist-bins"],[53,7,1,"cmdoption-seismic-graph-histpos-hist-margin","--hist-margin"],[53,7,1,"cmdoption-seismic-graph-histpos-html","--html"],[53,7,1,"cmdoption-seismic-graph-histpos-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-histpos-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-histpos-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-histpos-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-histpos-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-histpos-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-histpos-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-histpos-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-histpos-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-histpos-r","--rels"],[53,7,1,"cmdoption-seismic-graph-histpos-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-histpos-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-histpos-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-histpos-o","-o"],[53,7,1,"cmdoption-seismic-graph-histpos-q","-q"],[53,7,1,"cmdoption-seismic-graph-histpos-r","-r"],[53,7,1,"cmdoption-seismic-graph-histpos-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-histread":[[53,7,1,"cmdoption-seismic-graph-histread-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-histread-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-histread-force","--force"],[53,7,1,"cmdoption-seismic-graph-histread-hist-bins","--hist-bins"],[53,7,1,"cmdoption-seismic-graph-histread-hist-margin","--hist-margin"],[53,7,1,"cmdoption-seismic-graph-histread-html","--html"],[53,7,1,"cmdoption-seismic-graph-histread-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-histread-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-histread-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-histread-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-histread-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-histread-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-histread-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-histread-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-histread-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-histread-r","--rels"],[53,7,1,"cmdoption-seismic-graph-histread-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-histread-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-histread-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-histread-o","-o"],[53,7,1,"cmdoption-seismic-graph-histread-q","-q"],[53,7,1,"cmdoption-seismic-graph-histread-r","-r"],[53,7,1,"cmdoption-seismic-graph-histread-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-profile":[[53,7,1,"cmdoption-seismic-graph-profile-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-profile-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-profile-force","--force"],[53,7,1,"cmdoption-seismic-graph-profile-html","--html"],[53,7,1,"cmdoption-seismic-graph-profile-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-profile-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-profile-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-profile-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-profile-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-profile-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-profile-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-profile-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-profile-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-profile-r","--rels"],[53,7,1,"cmdoption-seismic-graph-profile-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-profile-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-profile-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-profile-o","-o"],[53,7,1,"cmdoption-seismic-graph-profile-q","-q"],[53,7,1,"cmdoption-seismic-graph-profile-r","-r"],[53,7,1,"cmdoption-seismic-graph-profile-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-roc":[[53,7,1,"cmdoption-seismic-graph-roc-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-roc-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-roc-force","--force"],[53,7,1,"cmdoption-seismic-graph-roc-html","--html"],[53,7,1,"cmdoption-seismic-graph-roc-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-roc-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-roc-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-roc-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-roc-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-roc-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-roc-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-roc-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-roc-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-roc-r","--rels"],[53,7,1,"cmdoption-seismic-graph-roc-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-roc-struct-file","--struct-file"],[53,7,1,"cmdoption-seismic-graph-roc-struct-sect","--struct-sect"],[53,7,1,"cmdoption-seismic-graph-roc-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-roc-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-roc-o","-o"],[53,7,1,"cmdoption-seismic-graph-roc-q","-q"],[53,7,1,"cmdoption-seismic-graph-roc-r","-r"],[53,7,1,"cmdoption-seismic-graph-roc-arg-INPUT_PATH","INPUT_PATH"]],"seismic-graph-scatter":[[53,7,1,"cmdoption-seismic-graph-scatter-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-graph-scatter-comppair","--comppair"],[53,7,1,"cmdoption-seismic-graph-scatter-compself","--compself"],[53,7,1,"cmdoption-seismic-graph-scatter-csv","--csv"],[53,7,1,"cmdoption-seismic-graph-scatter-force","--force"],[53,7,1,"cmdoption-seismic-graph-scatter-html","--html"],[53,7,1,"cmdoption-seismic-graph-scatter-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-graph-scatter-comppair","--no-comppair"],[53,7,1,"cmdoption-seismic-graph-scatter-compself","--no-compself"],[53,7,1,"cmdoption-seismic-graph-scatter-csv","--no-csv"],[53,7,1,"cmdoption-seismic-graph-scatter-force","--no-force"],[53,7,1,"cmdoption-seismic-graph-scatter-html","--no-html"],[53,7,1,"cmdoption-seismic-graph-scatter-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-graph-scatter-o","--out-dir"],[53,7,1,"cmdoption-seismic-graph-scatter-parallel","--parallel"],[53,7,1,"cmdoption-seismic-graph-scatter-pdf","--pdf"],[53,7,1,"cmdoption-seismic-graph-scatter-q","--quantile"],[53,7,1,"cmdoption-seismic-graph-scatter-r","--rels"],[53,7,1,"cmdoption-seismic-graph-scatter-parallel","--serial"],[53,7,1,"cmdoption-seismic-graph-scatter-use-ratio","--use-count"],[53,7,1,"cmdoption-seismic-graph-scatter-use-ratio","--use-ratio"],[53,7,1,"cmdoption-seismic-graph-scatter-o","-o"],[53,7,1,"cmdoption-seismic-graph-scatter-q","-q"],[53,7,1,"cmdoption-seismic-graph-scatter-r","-r"],[53,7,1,"cmdoption-seismic-graph-scatter-arg-INPUT_PATH","INPUT_PATH"]],"seismic-mask":[[53,7,1,"cmdoption-seismic-mask-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-mask-c","--coords"],[53,7,1,"cmdoption-seismic-mask-count-del","--count-del"],[53,7,1,"cmdoption-seismic-mask-count-ins","--count-ins"],[53,7,1,"cmdoption-seismic-mask-count-del","--discount-del"],[53,7,1,"cmdoption-seismic-mask-count-ins","--discount-ins"],[53,7,1,"cmdoption-seismic-mask-discount-mut","--discount-mut"],[53,7,1,"cmdoption-seismic-mask-exclude-file","--exclude-file"],[53,7,1,"cmdoption-seismic-mask-exclude-gu","--exclude-gu"],[53,7,1,"cmdoption-seismic-mask-exclude-polya","--exclude-polya"],[53,7,1,"cmdoption-seismic-mask-force","--force"],[53,7,1,"cmdoption-seismic-mask-exclude-gu","--include-gu"],[53,7,1,"cmdoption-seismic-mask-max-fmut-pos","--max-fmut-pos"],[53,7,1,"cmdoption-seismic-mask-max-fmut-read","--max-fmut-read"],[53,7,1,"cmdoption-seismic-mask-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-mask-min-finfo-read","--min-finfo-read"],[53,7,1,"cmdoption-seismic-mask-min-mut-gap","--min-mut-gap"],[53,7,1,"cmdoption-seismic-mask-min-ncov-read","--min-ncov-read"],[53,7,1,"cmdoption-seismic-mask-min-ninfo-pos","--min-ninfo-pos"],[53,7,1,"cmdoption-seismic-mask-force","--no-force"],[53,7,1,"cmdoption-seismic-mask-parallel","--parallel"],[53,7,1,"cmdoption-seismic-mask-primer-gap","--primer-gap"],[53,7,1,"cmdoption-seismic-mask-p","--primers"],[53,7,1,"cmdoption-seismic-mask-s","--sections-file"],[53,7,1,"cmdoption-seismic-mask-parallel","--serial"],[53,7,1,"cmdoption-seismic-mask-c","-c"],[53,7,1,"cmdoption-seismic-mask-p","-p"],[53,7,1,"cmdoption-seismic-mask-s","-s"],[53,7,1,"cmdoption-seismic-mask-arg-INPUT_PATH","INPUT_PATH"]],"seismic-relate":[[53,7,1,"cmdoption-seismic-relate-ambrel","--ambrel"],[53,7,1,"cmdoption-seismic-relate-batch-size","--batch-size"],[53,7,1,"cmdoption-seismic-relate-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-relate-keep-temp","--erase-temp"],[53,7,1,"cmdoption-seismic-relate-force","--force"],[53,7,1,"cmdoption-seismic-relate-keep-temp","--keep-temp"],[53,7,1,"cmdoption-seismic-relate-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-relate-min-mapq","--min-mapq"],[53,7,1,"cmdoption-seismic-relate-min-phred","--min-phred"],[53,7,1,"cmdoption-seismic-relate-N","--min-reads"],[53,7,1,"cmdoption-seismic-relate-ambrel","--no-ambrel"],[53,7,1,"cmdoption-seismic-relate-force","--no-force"],[53,7,1,"cmdoption-seismic-relate-o","--out-dir"],[53,7,1,"cmdoption-seismic-relate-parallel","--parallel"],[53,7,1,"cmdoption-seismic-relate-phred-enc","--phred-enc"],[53,7,1,"cmdoption-seismic-relate-parallel","--serial"],[53,7,1,"cmdoption-seismic-relate-t","--temp-dir"],[53,7,1,"cmdoption-seismic-relate-N","-N"],[53,7,1,"cmdoption-seismic-relate-o","-o"],[53,7,1,"cmdoption-seismic-relate-t","-t"],[53,7,1,"cmdoption-seismic-relate-arg-FASTA","FASTA"],[53,7,1,"cmdoption-seismic-relate-arg-INPUT_PATH","INPUT_PATH"]],"seismic-table":[[53,7,1,"cmdoption-seismic-table-force","--force"],[53,7,1,"cmdoption-seismic-table-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-table-force","--no-force"],[53,7,1,"cmdoption-seismic-table-table-clust","--no-table-clust"],[53,7,1,"cmdoption-seismic-table-table-pos","--no-table-pos"],[53,7,1,"cmdoption-seismic-table-table-read","--no-table-read"],[53,7,1,"cmdoption-seismic-table-parallel","--parallel"],[53,7,1,"cmdoption-seismic-table-parallel","--serial"],[53,7,1,"cmdoption-seismic-table-table-clust","--table-clust"],[53,7,1,"cmdoption-seismic-table-table-pos","--table-pos"],[53,7,1,"cmdoption-seismic-table-table-read","--table-read"],[53,7,1,"cmdoption-seismic-table-arg-INPUT_PATH","INPUT_PATH"]],"seismic-wf":[[53,7,1,"cmdoption-seismic-wf-all-pos","--all-pos"],[53,7,1,"cmdoption-seismic-wf-ambrel","--ambrel"],[53,7,1,"cmdoption-seismic-wf-cram","--bam"],[53,7,1,"cmdoption-seismic-wf-barcode-end","--barcode-end"],[53,7,1,"cmdoption-seismic-wf-barcode-start","--barcode-start"],[53,7,1,"cmdoption-seismic-wf-batch-size","--batch-size"],[53,7,1,"cmdoption-seismic-wf-brotli-level","--brotli-level"],[53,7,1,"cmdoption-seismic-wf-bt2-D","--bt2-D"],[53,7,1,"cmdoption-seismic-wf-bt2-I","--bt2-I"],[53,7,1,"cmdoption-seismic-wf-bt2-L","--bt2-L"],[53,7,1,"cmdoption-seismic-wf-bt2-R","--bt2-R"],[53,7,1,"cmdoption-seismic-wf-bt2-X","--bt2-X"],[53,7,1,"cmdoption-seismic-wf-bt2-contain","--bt2-contain"],[53,7,1,"cmdoption-seismic-wf-bt2-discordant","--bt2-discordant"],[53,7,1,"cmdoption-seismic-wf-bt2-dovetail","--bt2-dovetail"],[53,7,1,"cmdoption-seismic-wf-bt2-dpad","--bt2-dpad"],[53,7,1,"cmdoption-seismic-wf-bt2-local","--bt2-end-to-end"],[53,7,1,"cmdoption-seismic-wf-bt2-gbar","--bt2-gbar"],[53,7,1,"cmdoption-seismic-wf-0","--bt2-i"],[53,7,1,"cmdoption-seismic-wf-bt2-local","--bt2-local"],[53,7,1,"cmdoption-seismic-wf-bt2-mixed","--bt2-mixed"],[53,7,1,"cmdoption-seismic-wf-bt2-contain","--bt2-no-contain"],[53,7,1,"cmdoption-seismic-wf-bt2-discordant","--bt2-no-discordant"],[53,7,1,"cmdoption-seismic-wf-bt2-dovetail","--bt2-no-dovetail"],[53,7,1,"cmdoption-seismic-wf-bt2-mixed","--bt2-no-mixed"],[53,7,1,"cmdoption-seismic-wf-bt2-un","--bt2-no-un"],[53,7,1,"cmdoption-seismic-wf-bt2-orient","--bt2-orient"],[53,7,1,"cmdoption-seismic-wf-bt2-score-min-e2e","--bt2-score-min-e2e"],[53,7,1,"cmdoption-seismic-wf-bt2-score-min-loc","--bt2-score-min-loc"],[53,7,1,"cmdoption-seismic-wf-bt2-un","--bt2-un"],[53,7,1,"cmdoption-seismic-wf-cgroup","--cgroup"],[53,7,1,"cmdoption-seismic-wf-clipped","--clipped"],[53,7,1,"cmdoption-seismic-wf-c","--coords"],[53,7,1,"cmdoption-seismic-wf-count-del","--count-del"],[53,7,1,"cmdoption-seismic-wf-count-ins","--count-ins"],[53,7,1,"cmdoption-seismic-wf-cram","--cram"],[53,7,1,"cmdoption-seismic-wf-csv","--csv"],[53,7,1,"cmdoption-seismic-wf-cut","--cut"],[53,7,1,"cmdoption-seismic-wf-cut-O","--cut-O"],[53,7,1,"cmdoption-seismic-wf-cut-a1","--cut-a1"],[53,7,1,"cmdoption-seismic-wf-cut-a2","--cut-a2"],[53,7,1,"cmdoption-seismic-wf-cut-discard-trimmed","--cut-discard-trimmed"],[53,7,1,"cmdoption-seismic-wf-cut-discard-untrimmed","--cut-discard-untrimmed"],[53,7,1,"cmdoption-seismic-wf-cut-e","--cut-e"],[53,7,1,"cmdoption-seismic-wf-cut-g1","--cut-g1"],[53,7,1,"cmdoption-seismic-wf-cut-g2","--cut-g2"],[53,7,1,"cmdoption-seismic-wf-cut-indels","--cut-indels"],[53,7,1,"cmdoption-seismic-wf-cut-discard-trimmed","--cut-keep-trimmed"],[53,7,1,"cmdoption-seismic-wf-cut-discard-untrimmed","--cut-keep-untrimmed"],[53,7,1,"cmdoption-seismic-wf-cut-m","--cut-m"],[53,7,1,"cmdoption-seismic-wf-cut-nextseq","--cut-nextseq"],[53,7,1,"cmdoption-seismic-wf-cut-indels","--cut-no-indels"],[53,7,1,"cmdoption-seismic-wf-cut-nextseq","--cut-no-nextseq"],[53,7,1,"cmdoption-seismic-wf-cut-q1","--cut-q1"],[53,7,1,"cmdoption-seismic-wf-cut-q2","--cut-q2"],[53,7,1,"cmdoption-seismic-wf-demult-on","--demult-off"],[53,7,1,"cmdoption-seismic-wf-demult-on","--demult-on"],[53,7,1,"cmdoption-seismic-wf-demulti-overwrite","--demulti-overwrite"],[53,7,1,"cmdoption-seismic-wf-count-del","--discount-del"],[53,7,1,"cmdoption-seismic-wf-count-ins","--discount-ins"],[53,7,1,"cmdoption-seismic-wf-discount-mut","--discount-mut"],[53,7,1,"cmdoption-seismic-wf-X","--dmfastqx"],[53,7,1,"cmdoption-seismic-wf-Y","--dmfastqy"],[53,7,1,"cmdoption-seismic-wf-Z","--dmfastqz"],[53,7,1,"cmdoption-seismic-wf-e","--em-runs"],[53,7,1,"cmdoption-seismic-wf-em-thresh","--em-thresh"],[53,7,1,"cmdoption-seismic-wf-keep-temp","--erase-temp"],[53,7,1,"cmdoption-seismic-wf-exclude-file","--exclude-file"],[53,7,1,"cmdoption-seismic-wf-exclude-gu","--exclude-gu"],[53,7,1,"cmdoption-seismic-wf-exclude-polya","--exclude-polya"],[53,7,1,"cmdoption-seismic-wf-export","--export"],[53,7,1,"cmdoption-seismic-wf-fastqc","--fastqc"],[53,7,1,"cmdoption-seismic-wf-x","--fastqx"],[53,7,1,"cmdoption-seismic-wf-y","--fastqy"],[53,7,1,"cmdoption-seismic-wf-z","--fastqz"],[53,7,1,"cmdoption-seismic-wf-fold","--fold"],[53,7,1,"cmdoption-seismic-wf-fold-constraint","--fold-constraint"],[53,7,1,"cmdoption-seismic-wf-fold-max","--fold-max"],[53,7,1,"cmdoption-seismic-wf-fold-md","--fold-md"],[53,7,1,"cmdoption-seismic-wf-fold-mfe","--fold-mfe"],[53,7,1,"cmdoption-seismic-wf-fold-percent","--fold-percent"],[53,7,1,"cmdoption-seismic-wf-fold-mfe","--fold-sub"],[53,7,1,"cmdoption-seismic-wf-fold-temp","--fold-temp"],[53,7,1,"cmdoption-seismic-wf-force","--force"],[53,7,1,"cmdoption-seismic-wf-hist-bins","--hist-bins"],[53,7,1,"cmdoption-seismic-wf-hist-margin","--hist-margin"],[53,7,1,"cmdoption-seismic-wf-html","--html"],[53,7,1,"cmdoption-seismic-wf-exclude-gu","--include-gu"],[53,7,1,"cmdoption-seismic-wf-index-tolerance","--index-tolerance"],[53,7,1,"cmdoption-seismic-wf-2","--join-clusts"],[53,7,1,"cmdoption-seismic-wf-J","--joined"],[53,7,1,"cmdoption-seismic-wf-keep-temp","--keep-temp"],[53,7,1,"cmdoption-seismic-wf-k","--max-clusters"],[53,7,1,"cmdoption-seismic-wf-max-em-iter","--max-em-iter"],[53,7,1,"cmdoption-seismic-wf-max-fmut-pos","--max-fmut-pos"],[53,7,1,"cmdoption-seismic-wf-max-fmut-read","--max-fmut-read"],[53,7,1,"cmdoption-seismic-wf-max-procs","--max-procs"],[53,7,1,"cmdoption-seismic-wf-min-em-iter","--min-em-iter"],[53,7,1,"cmdoption-seismic-wf-min-finfo-read","--min-finfo-read"],[53,7,1,"cmdoption-seismic-wf-min-mapq","--min-mapq"],[53,7,1,"cmdoption-seismic-wf-min-mut-gap","--min-mut-gap"],[53,7,1,"cmdoption-seismic-wf-min-ncov-read","--min-ncov-read"],[53,7,1,"cmdoption-seismic-wf-min-ninfo-pos","--min-ninfo-pos"],[53,7,1,"cmdoption-seismic-wf-min-phred","--min-phred"],[53,7,1,"cmdoption-seismic-wf-N","--min-reads"],[53,7,1,"cmdoption-seismic-wf-mismatch-tolerence","--mismatch-tolerence"],[53,7,1,"cmdoption-seismic-wf-ambrel","--no-ambrel"],[53,7,1,"cmdoption-seismic-wf-csv","--no-csv"],[53,7,1,"cmdoption-seismic-wf-cut","--no-cut"],[53,7,1,"cmdoption-seismic-wf-export","--no-export"],[53,7,1,"cmdoption-seismic-wf-fastqc","--no-fastqc"],[53,7,1,"cmdoption-seismic-wf-fold","--no-fold"],[53,7,1,"cmdoption-seismic-wf-force","--no-force"],[53,7,1,"cmdoption-seismic-wf-html","--no-html"],[53,7,1,"cmdoption-seismic-wf-pdf","--no-pdf"],[53,7,1,"cmdoption-seismic-wf-table-clust","--no-table-clust"],[53,7,1,"cmdoption-seismic-wf-table-pos","--no-table-pos"],[53,7,1,"cmdoption-seismic-wf-table-read","--no-table-read"],[53,7,1,"cmdoption-seismic-wf-o","--out-dir"],[53,7,1,"cmdoption-seismic-wf-parallel","--parallel"],[53,7,1,"cmdoption-seismic-wf-parallel-demultiplexing","--parallel-demultiplexing"],[53,7,1,"cmdoption-seismic-wf-pdf","--pdf"],[53,7,1,"cmdoption-seismic-wf-phred-enc","--phred-enc"],[53,7,1,"cmdoption-seismic-wf-P","--pool"],[53,7,1,"cmdoption-seismic-wf-primer-gap","--primer-gap"],[53,7,1,"cmdoption-seismic-wf-1","--primers"],[53,7,1,"cmdoption-seismic-wf-qc-extract","--qc-extract"],[53,7,1,"cmdoption-seismic-wf-qc-extract","--qc-no-extract"],[53,7,1,"cmdoption-seismic-wf-q","--quantile"],[53,7,1,"cmdoption-seismic-wf-R","--refs-meta"],[53,7,1,"cmdoption-seismic-wf-S","--samples-meta"],[53,7,1,"cmdoption-seismic-wf-s","--sections-file"],[53,7,1,"cmdoption-seismic-wf-parallel","--serial"],[53,7,1,"cmdoption-seismic-wf-struct-file","--struct-file"],[53,7,1,"cmdoption-seismic-wf-struct-sect","--struct-sect"],[53,7,1,"cmdoption-seismic-wf-table-clust","--table-clust"],[53,7,1,"cmdoption-seismic-wf-table-pos","--table-pos"],[53,7,1,"cmdoption-seismic-wf-table-read","--table-read"],[53,7,1,"cmdoption-seismic-wf-t","--temp-dir"],[53,7,1,"cmdoption-seismic-wf-all-pos","--unmasked-pos"],[53,7,1,"cmdoption-seismic-wf-w","--window"],[53,7,1,"cmdoption-seismic-wf-3","--winmin"],[53,7,1,"cmdoption-seismic-wf-J","-J"],[53,7,1,"cmdoption-seismic-wf-N","-N"],[53,7,1,"cmdoption-seismic-wf-P","-P"],[53,7,1,"cmdoption-seismic-wf-R","-R"],[53,7,1,"cmdoption-seismic-wf-S","-S"],[53,7,1,"cmdoption-seismic-wf-X","-X"],[53,7,1,"cmdoption-seismic-wf-Y","-Y"],[53,7,1,"cmdoption-seismic-wf-Z","-Z"],[53,7,1,"cmdoption-seismic-wf-c","-c"],[53,7,1,"cmdoption-seismic-wf-e","-e"],[53,7,1,"cmdoption-seismic-wf-2","-j"],[53,7,1,"cmdoption-seismic-wf-k","-k"],[53,7,1,"cmdoption-seismic-wf-3","-n"],[53,7,1,"cmdoption-seismic-wf-o","-o"],[53,7,1,"cmdoption-seismic-wf-1","-p"],[53,7,1,"cmdoption-seismic-wf-q","-q"],[53,7,1,"cmdoption-seismic-wf-s","-s"],[53,7,1,"cmdoption-seismic-wf-t","-t"],[53,7,1,"cmdoption-seismic-wf-w","-w"],[53,7,1,"cmdoption-seismic-wf-x","-x"],[53,7,1,"cmdoption-seismic-wf-y","-y"],[53,7,1,"cmdoption-seismic-wf-z","-z"],[53,7,1,"cmdoption-seismic-wf-arg-FASTA","FASTA"],[53,7,1,"cmdoption-seismic-wf-arg-INPUT_PATH","INPUT_PATH"]],"seismicrna.align":[[8,0,0,"-","fqops"],[8,0,0,"-","fqunit"],[8,0,0,"-","main"],[8,0,0,"-","report"],[8,0,0,"-","sim"],[9,0,0,"-","tests"],[8,0,0,"-","write"],[8,0,0,"-","xamops"]],"seismicrna.align.fqops":[[8,1,1,"","cutadapt_cmd"],[8,1,1,"","fastqc_cmd"],[8,1,1,"","run_fastqc"]],"seismicrna.align.fqunit":[[8,2,1,"","FastqUnit"],[8,1,1,"","count_fastq_reads"],[8,1,1,"","fastq_gz"],[8,1,1,"","get_args_count_fastq_reads"],[8,1,1,"","parse_stdout_count_fastq_reads"]],"seismicrna.align.fqunit.FastqUnit":[[8,3,1,"","BOWTIE2_FLAGS"],[8,3,1,"","KEY_DINTER"],[8,3,1,"","KEY_DMATED"],[8,3,1,"","KEY_DSINGLE"],[8,3,1,"","KEY_INTER"],[8,3,1,"","KEY_MATE1"],[8,3,1,"","KEY_MATE2"],[8,3,1,"","KEY_MATED"],[8,3,1,"","KEY_SINGLE"],[8,3,1,"","MAX_PHRED_ENC"],[8,4,1,"","bowtie2_inputs"],[8,4,1,"","cutadapt_input_args"],[8,5,1,"","fields"],[8,5,1,"","from_paths"],[8,5,1,"","get_sample_ref_exts"],[8,4,1,"","kind"],[8,4,1,"","n_reads"],[8,4,1,"","parent"],[8,4,1,"","phred_arg"],[8,4,1,"","seg_types"],[8,5,1,"","to_new"]],"seismicrna.align.main":[[8,1,1,"","run"]],"seismicrna.align.report":[[8,2,1,"","AlignRefReport"],[8,2,1,"","AlignReport"],[8,2,1,"","AlignSampleReport"]],"seismicrna.align.report.AlignRefReport":[[8,5,1,"","fields"],[8,5,1,"","file_seg_type"]],"seismicrna.align.report.AlignReport":[[8,5,1,"","auto_fields"],[8,5,1,"","dir_seg_types"],[8,5,1,"","fields"]],"seismicrna.align.report.AlignSampleReport":[[8,5,1,"","fields"],[8,5,1,"","file_seg_type"]],"seismicrna.align.sim":[[8,1,1,"","as_sam"],[8,1,1,"","relvecs_to_sam_file"],[8,1,1,"","relvecs_to_sam_lines"],[8,1,1,"","sam_header"]],"seismicrna.align.tests":[[9,0,0,"-","fqutil_test"],[9,0,0,"-","sim_test"],[9,0,0,"-","xamgen_test"]],"seismicrna.align.tests.fqutil_test":[[9,2,1,"","TestRunFASTQC"]],"seismicrna.align.tests.fqutil_test.TestRunFASTQC":[[9,5,1,"","setUp"],[9,5,1,"","tearDown"],[9,3,1,"","temp_fq"],[9,3,1,"","temp_fq1"],[9,3,1,"","temp_fq2"]],"seismicrna.align.tests.sim_test":[[9,2,1,"","TestAsSam"],[9,2,1,"","TestFindBlankRange"]],"seismicrna.align.tests.sim_test.TestAsSam":[[9,5,1,"","test_line_in_sam_format"]],"seismicrna.align.tests.sim_test.TestFindBlankRange":[[9,5,1,"","test_side3_equal_length"],[9,5,1,"","test_side3_neg_length"],[9,5,1,"","test_side3_over_length"],[9,5,1,"","test_side3_under_length"],[9,5,1,"","test_side3_zero_length"],[9,5,1,"","test_side5_equal_length"],[9,5,1,"","test_side5_neg_length"],[9,5,1,"","test_side5_over_length"],[9,5,1,"","test_side5_under_length"],[9,5,1,"","test_side5_zero_length"]],"seismicrna.align.tests.xamgen_test":[[9,2,1,"","TestAlignmentScoreParams"]],"seismicrna.align.tests.xamgen_test.TestAlignmentScoreParams":[[9,5,1,"","parse_all_scores"],[9,5,1,"","parse_scores"],[9,5,1,"","test_inequality_min_num_edits"],[9,5,1,"","test_inequality_subst_vs_indel"],[9,5,1,"","test_score_consistency"]],"seismicrna.align.write":[[8,1,1,"","align_samples"],[8,1,1,"","check_fqs_xams"],[8,1,1,"","figure_alignments"],[8,1,1,"","fq_pipeline"],[8,1,1,"","fqs_pipeline"],[8,1,1,"","list_fqs_xams"],[8,1,1,"","merge_nondemult_fqs"],[8,1,1,"","write_temp_ref_files"]],"seismicrna.align.xamops":[[8,1,1,"","bowtie2_build_cmd"],[8,1,1,"","bowtie2_cmd"],[8,1,1,"","export_cmd"],[8,1,1,"","get_bowtie2_index_paths"],[8,1,1,"","parse_bowtie2"],[8,1,1,"","xamgen_cmd"]],"seismicrna.cleanfa":[[10,0,0,"-","cleanfa"],[10,0,0,"-","main"]],"seismicrna.cleanfa.cleanfa":[[10,2,1,"","FastaCleaner"],[10,1,1,"","clean_fasta"],[10,1,1,"","get_non_seq_regex"]],"seismicrna.cleanfa.cleanfa.FastaCleaner":[[10,5,1,"","run"]],"seismicrna.cleanfa.main":[[10,1,1,"","run"]],"seismicrna.cluster":[[11,0,0,"-","addclust"],[11,0,0,"-","batch"],[11,0,0,"-","compare"],[11,0,0,"-","csv"],[11,0,0,"-","data"],[11,0,0,"-","delclust"],[11,0,0,"-","em"],[11,0,0,"-","io"],[11,0,0,"-","main"],[11,0,0,"-","names"],[11,0,0,"-","report"],[11,0,0,"-","save"],[12,0,0,"-","tests"],[11,0,0,"-","uniq"],[11,0,0,"-","write"]],"seismicrna.cluster.addclust":[[11,1,1,"","add_orders"],[11,1,1,"","run"],[11,1,1,"","update_batches"],[11,1,1,"","update_field"],[11,1,1,"","update_log_counts"],[11,1,1,"","update_report"]],"seismicrna.cluster.batch":[[11,2,1,"","ClusterMutsBatch"],[11,2,1,"","ClusterReadBatch"]],"seismicrna.cluster.batch.ClusterMutsBatch":[[11,4,1,"","read_weights"]],"seismicrna.cluster.batch.ClusterReadBatch":[[11,4,1,"","num_reads"],[11,4,1,"","read_nums"]],"seismicrna.cluster.compare":[[11,2,1,"","RunOrderResults"],[11,1,1,"","assign_clusterings"],[11,1,1,"","calc_mean_pearson"],[11,1,1,"","calc_nrmsd_groups"],[11,1,1,"","calc_pearson_groups"],[11,1,1,"","calc_rms_nrmsd"],[11,1,1,"","calc_rmsd_groups"],[11,1,1,"","find_best_order"],[11,1,1,"","format_exp_count_col"],[11,1,1,"","get_common_best_run_attr"],[11,1,1,"","get_common_order"],[11,1,1,"","get_log_exp_obs_counts"],[11,1,1,"","parse_exp_count_col"],[11,1,1,"","sort_replicate_runs"]],"seismicrna.cluster.compare.RunOrderResults":[[11,4,1,"","bic"]],"seismicrna.cluster.csv":[[11,1,1,"","get_count_path"],[11,1,1,"","get_table_path"],[11,1,1,"","write_log_counts"],[11,1,1,"","write_mus"],[11,1,1,"","write_props"],[11,1,1,"","write_single_run_table"]],"seismicrna.cluster.data":[[11,2,1,"","ClusterMutsDataset"],[11,2,1,"","ClusterReadDataset"]],"seismicrna.cluster.data.ClusterMutsDataset":[[11,4,1,"","clusters"],[11,5,1,"","get_dataset1_load_func"],[11,5,1,"","get_dataset2_type"],[11,4,1,"","max_order"],[11,4,1,"","min_mut_gap"],[11,4,1,"","pattern"],[11,4,1,"","section"]],"seismicrna.cluster.data.ClusterReadDataset":[[11,5,1,"","get_batch_type"],[11,5,1,"","get_report_type"],[11,4,1,"","max_order"],[11,4,1,"","pattern"]],"seismicrna.cluster.delclust":[[11,1,1,"","del_orders"],[11,1,1,"","run"],[11,1,1,"","update_batches"],[11,1,1,"","update_field"],[11,1,1,"","update_log_counts"],[11,1,1,"","update_report"]],"seismicrna.cluster.em":[[11,2,1,"","EmClustering"]],"seismicrna.cluster.em.EmClustering":[[11,4,1,"","bic"],[11,4,1,"","clusters"],[11,4,1,"","delta_log_like"],[11,4,1,"","end3s"],[11,4,1,"","end5s"],[11,5,1,"","get_members"],[11,5,1,"","get_mus"],[11,5,1,"","get_props"],[11,4,1,"","log_like"],[11,4,1,"","log_like_prev"],[11,4,1,"","logn_exp"],[11,4,1,"","masked"],[11,4,1,"","n_data"],[11,4,1,"","n_params"],[11,4,1,"","n_pos_total"],[11,4,1,"","n_pos_unmasked"],[11,5,1,"","run"],[11,4,1,"","section_end5"],[11,4,1,"","unmasked"]],"seismicrna.cluster.io":[[11,2,1,"","ClusterBatchIO"],[11,2,1,"","ClusterIO"]],"seismicrna.cluster.io.ClusterBatchIO":[[11,5,1,"","file_seg_type"]],"seismicrna.cluster.io.ClusterIO":[[11,5,1,"","auto_fields"]],"seismicrna.cluster.main":[[11,1,1,"","run"]],"seismicrna.cluster.report":[[11,2,1,"","ClusterReport"]],"seismicrna.cluster.report.ClusterReport":[[11,5,1,"","auto_fields"],[11,5,1,"","fields"],[11,5,1,"","file_seg_type"],[11,5,1,"","from_clusters"]],"seismicrna.cluster.save":[[11,1,1,"","write_batches"]],"seismicrna.cluster.tests":[[12,0,0,"-","em_test"]],"seismicrna.cluster.tests.em_test":[[12,2,1,"","TestExpectation"]],"seismicrna.cluster.tests.em_test.TestExpectation":[[12,5,1,"","compare"],[12,5,1,"","test_1pos"],[12,5,1,"","test_1pos_2clusters"],[12,5,1,"","test_2pos_gap0"],[12,5,1,"","test_2pos_gap0_2clusters"],[12,5,1,"","test_2pos_gap1"],[12,5,1,"","test_2pos_masked0"],[12,5,1,"","test_2pos_masked1"]],"seismicrna.cluster.uniq":[[11,2,1,"","UniqReads"],[11,1,1,"","get_uniq_reads"]],"seismicrna.cluster.uniq.UniqReads":[[11,4,1,"","end3s"],[11,4,1,"","end3s_zero"],[11,4,1,"","end5s"],[11,4,1,"","end5s_zero"],[11,5,1,"","from_dataset"],[11,5,1,"","get_cov_matrix"],[11,5,1,"","get_mut_matrix"],[11,5,1,"","get_uniq_names"],[11,4,1,"","num_batches"],[11,4,1,"","num_nonuniq"],[11,4,1,"","num_uniq"],[11,4,1,"","ref"]],"seismicrna.cluster.write":[[11,1,1,"","cluster"],[11,1,1,"","run_max_order"],[11,1,1,"","run_order"],[11,1,1,"","run_orders"]],"seismicrna.core":[[14,0,0,"-","arg"],[15,0,0,"-","batch"],[13,0,0,"-","data"],[13,0,0,"-","dims"],[17,0,0,"-","extern"],[13,0,0,"-","header"],[18,0,0,"-","io"],[13,0,0,"-","logs"],[20,0,0,"-","mu"],[22,0,0,"-","ngs"],[24,0,0,"-","parallel"],[13,0,0,"-","path"],[26,0,0,"-","rel"],[13,0,0,"-","report"],[28,0,0,"-","rna"],[29,0,0,"-","seq"],[31,0,0,"-","tests"],[13,0,0,"-","types"],[13,0,0,"-","version"],[13,0,0,"-","write"]],"seismicrna.core.arg":[[14,0,0,"-","cli"],[14,0,0,"-","cmd"],[14,0,0,"-","default"],[14,0,0,"-","docdef"]],"seismicrna.core.arg.cli":[[14,1,1,"","merge_params"]],"seismicrna.core.arg.docdef":[[14,1,1,"","auto"],[14,1,1,"","auto_defaults"],[14,1,1,"","auto_docstrs"],[14,1,1,"","get_docstr_lines"],[14,1,1,"","get_param_default"],[14,1,1,"","get_param_lines"],[14,1,1,"","param_defaults"],[14,1,1,"","param_docstrs"]],"seismicrna.core.batch":[[15,0,0,"-","accum"],[15,0,0,"-","count"],[15,0,0,"-","index"],[15,0,0,"-","muts"],[15,0,0,"-","read"],[16,0,0,"-","tests"]],"seismicrna.core.batch.accum":[[15,1,1,"","accum_fits"],[15,1,1,"","accum_per_pos"],[15,1,1,"","accumulate"]],"seismicrna.core.batch.count":[[15,1,1,"","count_end_coords"],[15,1,1,"","get_count_per_pos"],[15,1,1,"","get_count_per_read"],[15,1,1,"","get_cover_per_pos"],[15,1,1,"","get_cover_per_read"],[15,1,1,"","get_coverage_matrix"],[15,1,1,"","get_half_coverage_matrix"],[15,1,1,"","get_reads_per_pos"],[15,1,1,"","get_rels_per_pos"],[15,1,1,"","get_rels_per_read"]],"seismicrna.core.batch.index":[[15,1,1,"","contiguous_mates"],[15,1,1,"","count_base_types"],[15,1,1,"","ensure_order"],[15,1,1,"","ensure_same_length"],[15,1,1,"","get_inverse"],[15,1,1,"","get_length"],[15,1,1,"","has_mids"],[15,1,1,"","iter_base_types"],[15,1,1,"","iter_windows"],[15,1,1,"","list_batch_nums"],[15,1,1,"","sanitize_ends"],[15,1,1,"","sanitize_pos"],[15,1,1,"","sanitize_values"],[15,1,1,"","stack_end_coords"]],"seismicrna.core.batch.muts":[[15,2,1,"","MutsBatch"],[15,2,1,"","PartialMutsBatch"],[15,2,1,"","ReflenMutsBatch"],[15,2,1,"","RefseqMutsBatch"]],"seismicrna.core.batch.muts.MutsBatch":[[15,4,1,"","all_contiguous_reads"],[15,4,1,"","contiguous_reads"],[15,4,1,"","end_counts"],[15,4,1,"","max_pos"],[15,4,1,"","mid3s"],[15,4,1,"","mid5s"],[15,4,1,"","num_contiguous_reads"],[15,4,1,"","num_discontiguous_reads"],[15,4,1,"","num_pos"],[15,4,1,"","pos_dtype"],[15,4,1,"","pos_nums"],[15,4,1,"","read_weights"]],"seismicrna.core.batch.muts.PartialMutsBatch":[[15,4,1,"","pos_nums"]],"seismicrna.core.batch.muts.ReflenMutsBatch":[[15,4,1,"","max_pos"]],"seismicrna.core.batch.muts.RefseqMutsBatch":[[15,4,1,"","count_base_types"],[15,5,1,"","count_per_pos"],[15,5,1,"","count_per_read"],[15,4,1,"","cover_per_pos"],[15,4,1,"","cover_per_read"],[15,4,1,"","coverage_matrix"],[15,5,1,"","iter_reads"],[15,5,1,"","iter_windows"],[15,4,1,"","max_pos"],[15,4,1,"","pos_index"],[15,5,1,"","reads_noclose_muts"],[15,5,1,"","reads_per_pos"],[15,4,1,"","rels_per_pos"],[15,4,1,"","rels_per_read"]],"seismicrna.core.batch.read":[[15,2,1,"","AllReadBatch"],[15,2,1,"","PartialReadBatch"],[15,2,1,"","ReadBatch"]],"seismicrna.core.batch.read.AllReadBatch":[[15,4,1,"","max_read"],[15,4,1,"","read_indexes"],[15,4,1,"","read_nums"]],"seismicrna.core.batch.read.PartialReadBatch":[[15,4,1,"","max_read"],[15,4,1,"","num_reads"],[15,4,1,"","read_indexes"]],"seismicrna.core.batch.read.ReadBatch":[[15,4,1,"","batch_read_index"],[15,4,1,"","max_read"],[15,4,1,"","num_reads"],[15,4,1,"","read_dtype"],[15,4,1,"","read_indexes"],[15,4,1,"","read_nums"]],"seismicrna.core.batch.tests":[[16,0,0,"-","count_test"],[16,0,0,"-","index_test"]],"seismicrna.core.batch.tests.count_test":[[16,2,1,"","TestCountEndCoords"]],"seismicrna.core.batch.tests.count_test.TestCountEndCoords":[[16,5,1,"","test_length_0"],[16,5,1,"","test_length_1"],[16,5,1,"","test_length_2_diff"],[16,5,1,"","test_length_2_same"],[16,5,1,"","test_length_3_diff_weights"],[16,5,1,"","test_length_3_same_weights"]],"seismicrna.core.batch.tests.index_test":[[16,2,1,"","TestContiguousMates"],[16,2,1,"","TestEnsureSameLength"],[16,2,1,"","TestGetInverse"],[16,2,1,"","TestGetLength"],[16,2,1,"","TestStackEndCoords"]],"seismicrna.core.batch.tests.index_test.TestContiguousMates":[[16,5,1,"","test_contiguous"],[16,5,1,"","test_unequal_lengths"]],"seismicrna.core.batch.tests.index_test.TestEnsureSameLength":[[16,5,1,"","test_diff_lengths"],[16,5,1,"","test_other_dims"],[16,5,1,"","test_same_length"]],"seismicrna.core.batch.tests.index_test.TestGetInverse":[[16,5,1,"","test_get_inverse"],[16,5,1,"","test_is_inverse"],[16,5,1,"","test_negative"],[16,5,1,"","test_repeated"]],"seismicrna.core.batch.tests.index_test.TestGetLength":[[16,5,1,"","test_1d"],[16,5,1,"","test_other_dims"]],"seismicrna.core.batch.tests.index_test.TestStackEndCoords":[[16,5,1,"","test_stack"]],"seismicrna.core.data":[[13,2,1,"","ChainedDataset"],[13,2,1,"","ChainedMutsDataset"],[13,2,1,"","Dataset"],[13,2,1,"","JoinedDataset"],[13,2,1,"","LoadFunction"],[13,2,1,"","LoadedDataset"],[13,2,1,"","LoadedMutsDataset"],[13,2,1,"","MergedDataset"],[13,2,1,"","MergedMutsDataset"],[13,2,1,"","MutsDataset"],[13,2,1,"","PooledDataset"],[13,2,1,"","PooledMutsDataset"],[13,1,1,"","load_datasets"]],"seismicrna.core.data.ChainedDataset":[[13,5,1,"","get_batch"],[13,5,1,"","get_dataset1_load_func"],[13,5,1,"","get_dataset1_report_file"],[13,5,1,"","get_dataset2_load_func"],[13,5,1,"","get_dataset2_type"],[13,5,1,"","get_report_type"],[13,5,1,"","load"],[13,5,1,"","load_dataset1"],[13,5,1,"","load_dataset2"],[13,4,1,"","num_batches"],[13,4,1,"","ref"],[13,4,1,"","refseq"],[13,4,1,"","sample"],[13,4,1,"","top"]],"seismicrna.core.data.ChainedMutsDataset":[[13,4,1,"","end3"],[13,4,1,"","end5"],[13,4,1,"","sect"]],"seismicrna.core.data.Dataset":[[13,4,1,"","batch_nums"],[13,4,1,"","end3"],[13,4,1,"","end5"],[13,5,1,"","get_batch"],[13,5,1,"","get_report_type"],[13,5,1,"","iter_batches"],[13,5,1,"","load"],[13,5,1,"","load_report"],[13,4,1,"","num_batches"],[13,4,1,"","num_reads"],[13,4,1,"","pattern"],[13,4,1,"","ref"],[13,4,1,"","sample"],[13,4,1,"","sect"],[13,4,1,"","top"]],"seismicrna.core.data.JoinedDataset":[[13,4,1,"","end3"],[13,4,1,"","end5"],[13,5,1,"","get_batch"],[13,5,1,"","load"],[13,4,1,"","num_batches"],[13,4,1,"","sample"],[13,4,1,"","samples"],[13,4,1,"","sect"],[13,4,1,"","sects"]],"seismicrna.core.data.LoadFunction":[[13,5,1,"","__call__"],[13,4,1,"","report_path_auto_fields"],[13,4,1,"","report_path_seg_types"]],"seismicrna.core.data.LoadedDataset":[[13,4,1,"","end3"],[13,4,1,"","end5"],[13,5,1,"","get_batch"],[13,5,1,"","get_batch_checksum"],[13,5,1,"","get_batch_path"],[13,5,1,"","get_batch_type"],[13,5,1,"","get_btype_name"],[13,5,1,"","get_report_type"],[13,5,1,"","load"],[13,4,1,"","num_batches"],[13,4,1,"","ref"],[13,4,1,"","sample"],[13,4,1,"","sect"],[13,4,1,"","top"]],"seismicrna.core.data.LoadedMutsDataset":[[13,4,1,"","end3"],[13,4,1,"","end5"],[13,4,1,"","refseq"],[13,4,1,"","sect"]],"seismicrna.core.data.MergedDataset":[[13,5,1,"","get_dataset_load_func"],[13,4,1,"","pattern"],[13,4,1,"","ref"],[13,4,1,"","top"]],"seismicrna.core.data.MergedMutsDataset":[[13,4,1,"","refseq"]],"seismicrna.core.data.MutsDataset":[[13,5,1,"","load"],[13,4,1,"","reflen"],[13,4,1,"","refseq"],[13,4,1,"","section"]],"seismicrna.core.data.PooledDataset":[[13,4,1,"","end3"],[13,4,1,"","end5"],[13,5,1,"","get_batch"],[13,5,1,"","load"],[13,4,1,"","num_batches"],[13,4,1,"","nums_batches"],[13,4,1,"","sample"],[13,4,1,"","samples"],[13,4,1,"","sect"]],"seismicrna.core.dims":[[13,1,1,"","find_dims"],[13,1,1,"","triangular"]],"seismicrna.core.extern":[[17,0,0,"-","depend"],[17,0,0,"-","shell"]],"seismicrna.core.extern.depend":[[17,1,1,"","dependency_exists"],[17,1,1,"","require_dependency"]],"seismicrna.core.extern.shell":[[17,2,1,"","ShellCommand"],[17,1,1,"","args_to_cmd"],[17,1,1,"","cmds_to_pipe"],[17,1,1,"","cmds_to_series"],[17,1,1,"","cmds_to_subshell"],[17,1,1,"","iopaths"],[17,1,1,"","run_cmd"]],"seismicrna.core.header":[[13,2,1,"","ClustHeader"],[13,2,1,"","Header"],[13,2,1,"","RelClustHeader"],[13,2,1,"","RelHeader"],[13,1,1,"","format_clust_name"],[13,1,1,"","format_clust_names"],[13,1,1,"","index_clusts"],[13,1,1,"","index_order_clusts"],[13,1,1,"","index_orders"],[13,1,1,"","index_orders_clusts"],[13,1,1,"","list_clusts"],[13,1,1,"","list_order_clusts"],[13,1,1,"","list_orders"],[13,1,1,"","list_orders_clusts"],[13,1,1,"","make_header"],[13,1,1,"","parse_header"],[13,1,1,"","validate_order_clust"]],"seismicrna.core.header.ClustHeader":[[13,5,1,"","clustered"],[13,4,1,"","index"],[13,5,1,"","levels"],[13,4,1,"","max_order"],[13,4,1,"","min_order"]],"seismicrna.core.header.Header":[[13,5,1,"","clustered"],[13,4,1,"","clusts"],[13,4,1,"","index"],[13,5,1,"","iter_clust_indexes"],[13,5,1,"","level_keys"],[13,5,1,"","level_names"],[13,5,1,"","levels"],[13,4,1,"","max_order"],[13,4,1,"","min_order"],[13,5,1,"","modified"],[13,4,1,"","names"],[13,5,1,"","num_levels"],[13,4,1,"","orders"],[13,5,1,"","select"],[13,4,1,"","signature"],[13,4,1,"","size"]],"seismicrna.core.header.RelClustHeader":[[13,4,1,"","index"]],"seismicrna.core.header.RelHeader":[[13,5,1,"","clustered"],[13,4,1,"","index"],[13,5,1,"","levels"],[13,4,1,"","max_order"],[13,4,1,"","min_order"],[13,4,1,"","rels"],[13,4,1,"","signature"]],"seismicrna.core.io":[[18,0,0,"-","batch"],[18,0,0,"-","brickle"],[18,0,0,"-","file"],[18,0,0,"-","seq"],[19,0,0,"-","tests"]],"seismicrna.core.io.batch":[[18,2,1,"","MutsBatchIO"],[18,2,1,"","ReadBatchIO"]],"seismicrna.core.io.batch.ReadBatchIO":[[18,5,1,"","btype"]],"seismicrna.core.io.brickle":[[18,1,1,"","digest_data"],[18,1,1,"","load_brickle"],[18,1,1,"","save_brickle"]],"seismicrna.core.io.file":[[18,2,1,"","BrickleIO"],[18,2,1,"","FileIO"],[18,2,1,"","RefIO"],[18,2,1,"","SectIO"],[18,1,1,"","make_temp_backup"],[18,1,1,"","recast_file_path"],[18,1,1,"","restore_temp_backup"]],"seismicrna.core.io.file.BrickleIO":[[18,5,1,"","load"],[18,5,1,"","save"]],"seismicrna.core.io.file.FileIO":[[18,5,1,"","auto_fields"],[18,5,1,"","build_path"],[18,5,1,"","dir_seg_types"],[18,5,1,"","file_seg_type"],[18,5,1,"","get_path"],[18,5,1,"","load"],[18,5,1,"","parse_path"],[18,5,1,"","path_field_values"],[18,5,1,"","path_fields"],[18,5,1,"","save"],[18,5,1,"","seg_types"]],"seismicrna.core.io.file.RefIO":[[18,5,1,"","dir_seg_types"]],"seismicrna.core.io.file.SectIO":[[18,5,1,"","dir_seg_types"]],"seismicrna.core.io.seq":[[18,2,1,"","RefseqIO"]],"seismicrna.core.io.seq.RefseqIO":[[18,5,1,"","auto_fields"],[18,5,1,"","file_seg_type"],[18,4,1,"","refseq"]],"seismicrna.core.io.tests":[[19,0,0,"-","file_test"]],"seismicrna.core.io.tests.file_test":[[19,2,1,"","SourceBackupDirs"],[19,2,1,"","TestMakeTempBackup"]],"seismicrna.core.io.tests.file_test.SourceBackupDirs":[[19,4,1,"","backup_dir"],[19,4,1,"","source_dir"]],"seismicrna.core.io.tests.file_test.TestMakeTempBackup":[[19,5,1,"","make_dir"],[19,5,1,"","make_file"],[19,5,1,"","test_backup_dir"],[19,5,1,"","test_backup_file"],[19,5,1,"","test_restore_dir"],[19,5,1,"","test_restore_file"]],"seismicrna.core.logs":[[13,2,1,"","AnsiCode"],[13,2,1,"","ColorFormatter"],[13,1,1,"","config"],[13,1,1,"","get_top_logger"],[13,1,1,"","get_verbosity"]],"seismicrna.core.logs.AnsiCode":[[13,3,1,"","BLUE"],[13,3,1,"","BOLD"],[13,3,1,"","CODES"],[13,3,1,"","CYAN"],[13,3,1,"","END"],[13,3,1,"","GREEN"],[13,3,1,"","PURPLE"],[13,3,1,"","RED"],[13,3,1,"","ULINE"],[13,3,1,"","YELLOW"],[13,5,1,"","end"],[13,5,1,"","fmt"],[13,5,1,"","wrap"]],"seismicrna.core.logs.ColorFormatter":[[13,3,1,"","ansi_codes"],[13,5,1,"","format"]],"seismicrna.core.mu":[[20,0,0,"-","compare"],[20,0,0,"-","dim"],[20,0,0,"-","frame"],[20,0,0,"-","nan"],[20,0,0,"-","scale"],[21,0,0,"-","tests"],[20,0,0,"-","unbias"]],"seismicrna.core.mu.compare":[[20,1,1,"","calc_coeff_determ"],[20,1,1,"","calc_nrmsd"],[20,1,1,"","calc_pearson"],[20,1,1,"","calc_rmsd"],[20,1,1,"","calc_spearman"],[20,1,1,"","compare_windows"],[20,1,1,"","get_comp_func"],[20,1,1,"","get_comp_name"]],"seismicrna.core.mu.dim":[[20,1,1,"","count_pos"],[20,1,1,"","counts_pos"],[20,1,1,"","counts_pos_consensus"]],"seismicrna.core.mu.frame":[[20,1,1,"","auto_reframe"],[20,1,1,"","reframe"],[20,1,1,"","reframe_like"]],"seismicrna.core.mu.nan":[[20,1,1,"","any_nan"],[20,1,1,"","auto_remove_nan"],[20,1,1,"","auto_removes_nan"],[20,1,1,"","no_nan"],[20,1,1,"","remove_nan"],[20,1,1,"","removes_nan"]],"seismicrna.core.mu.scale":[[20,1,1,"","calc_quantile"],[20,1,1,"","calc_ranks"],[20,1,1,"","calc_rms"],[20,1,1,"","normalize"],[20,1,1,"","standardize"],[20,1,1,"","winsorize"]],"seismicrna.core.mu.tests":[[21,0,0,"-","compare_test"],[21,0,0,"-","dim_test"],[21,0,0,"-","frame_test"],[21,0,0,"-","nan_test"],[21,0,0,"-","scale_test"],[21,0,0,"-","unbias_test"]],"seismicrna.core.mu.tests.compare_test":[[21,2,1,"","TestCalcCoeffDeterm"],[21,2,1,"","TestCalcNRMSD"],[21,2,1,"","TestCalcPearson"],[21,2,1,"","TestCalcSpearman"],[21,2,1,"","TestCompareWindows"],[21,2,1,"","TestGetComp"]],"seismicrna.core.mu.tests.compare_test.TestCalcCoeffDeterm":[[21,5,1,"","calc_true"],[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_dataframe"]],"seismicrna.core.mu.tests.compare_test.TestCalcNRMSD":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d_allzero"],[21,5,1,"","test_array1d_examples"],[21,5,1,"","test_array1d_extremes"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCalcPearson":[[21,5,1,"","calc_true"],[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCalcSpearman":[[21,5,1,"","calc_true"],[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array1d_nan"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.compare_test.TestCompareWindows":[[21,5,1,"","test_contiguous"]],"seismicrna.core.mu.tests.compare_test.TestGetComp":[[21,5,1,"","test_comps"]],"seismicrna.core.mu.tests.dim_test":[[21,2,1,"","TestCountPos"],[21,2,1,"","TestCountsPos"],[21,2,1,"","TestCountsPosConsensus"]],"seismicrna.core.mu.tests.dim_test.TestCountPos":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.dim_test.TestCountsPos":[[21,5,1,"","test_array1d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.dim_test.TestCountsPosConsensus":[[21,5,1,"","test_empty"],[21,5,1,"","test_equal"],[21,5,1,"","test_unequal"]],"seismicrna.core.mu.tests.frame_test":[[21,2,1,"","TestAutoReframe"],[21,2,1,"","TestReframe"],[21,2,1,"","TestReframeLike"],[21,1,1,"","broadcast_regex"],[21,1,1,"","broadcastable"]],"seismicrna.core.mu.tests.frame_test.TestAutoReframe":[[21,5,1,"","test_reduce_0"],[21,5,1,"","test_reduce_0_and_1"],[21,5,1,"","test_reduce_none"]],"seismicrna.core.mu.tests.frame_test.TestReframe":[[21,5,1,"","test_array_index"],[21,5,1,"","test_array_index_index"],[21,5,1,"","test_array_ints"],[21,5,1,"","test_array_none"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_float_index"],[21,5,1,"","test_float_index_index"],[21,5,1,"","test_float_index_index_index"],[21,5,1,"","test_float_index_index_int"],[21,5,1,"","test_float_index_int"],[21,5,1,"","test_float_int_index"],[21,5,1,"","test_float_ints"],[21,5,1,"","test_float_none"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.frame_test.TestReframeLike":[[21,5,1,"","test_array_array"],[21,5,1,"","test_array_dataframe"],[21,5,1,"","test_array_series"],[21,5,1,"","test_dataframe_array"],[21,5,1,"","test_dataframe_dataframe"],[21,5,1,"","test_drop_array"],[21,5,1,"","test_drop_dataframe"],[21,5,1,"","test_drop_series"],[21,5,1,"","test_float_array"],[21,5,1,"","test_float_dataframe"],[21,5,1,"","test_float_float"],[21,5,1,"","test_float_series"],[21,5,1,"","test_series_array"],[21,5,1,"","test_series_series"]],"seismicrna.core.mu.tests.nan_test":[[21,2,1,"","TestAnyNaN"],[21,2,1,"","TestAutoRemoveNaN"],[21,2,1,"","TestAutoRemovesNaN"],[21,2,1,"","TestNoNaN"],[21,2,1,"","TestRemoveNaNs"],[21,2,1,"","TestRemovesNaNs"]],"seismicrna.core.mu.tests.nan_test.TestAnyNaN":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_array3d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestAutoRemoveNaN":[[21,5,1,"","test_array"]],"seismicrna.core.mu.tests.nan_test.TestAutoRemovesNaN":[[21,5,1,"","test_array"]],"seismicrna.core.mu.tests.nan_test.TestNoNaN":[[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestRemoveNaNs":[[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.nan_test.TestRemovesNaNs":[[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_array_series_dataframe"],[21,5,1,"","test_array_series_dataframe_mismatched"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_empty"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test":[[21,2,1,"","TestCalcQuantile"],[21,2,1,"","TestCalcRMS"],[21,2,1,"","TestCalcRanks"],[21,2,1,"","TestNormalize"],[21,2,1,"","TestStandardize"],[21,2,1,"","TestWinsorize"]],"seismicrna.core.mu.tests.scale_test.TestCalcQuantile":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array1d_all_nan"],[21,5,1,"","test_array1d_empty"],[21,5,1,"","test_array1d_some_nan"],[21,5,1,"","test_array2d"],[21,5,1,"","test_array2d_one_col_nan"],[21,5,1,"","test_array2d_one_row_nan"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_invalid_quantiles"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestCalcRMS":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array1d_nan"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestCalcRanks":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_array3d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_nan"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestNormalize":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array1d_nan"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestStandardize":[[21,5,1,"","test_array0d"],[21,5,1,"","test_array1d"],[21,5,1,"","test_array2d"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.scale_test.TestWinsorize":[[21,5,1,"","test_arrays"],[21,5,1,"","test_dataframe"],[21,5,1,"","test_series"]],"seismicrna.core.mu.tests.unbias_test":[[21,2,1,"","CalcRectangularSum"],[21,2,1,"","TestAdjustMinGap"],[21,2,1,"","TestCalcPClust"],[21,2,1,"","TestCalcPClustGivenNoClose"],[21,2,1,"","TestCalcPEnds"],[21,2,1,"","TestCalcPEndsGivenNoClose"],[21,2,1,"","TestCalcPEndsObserved"],[21,2,1,"","TestCalcPMutGivenSpan"],[21,2,1,"","TestCalcPMutGivenSpanNoClose"],[21,2,1,"","TestCalcPNoClose"],[21,2,1,"","TestCalcParams"],[21,2,1,"","TestClip"],[21,2,1,"","TestNoCloseMuts"],[21,2,1,"","TestNormalize"],[21,2,1,"","TestPrivateCalcPNoCloseGivenEnds"],[21,2,1,"","TestPublicCalcPNoCloseGivenEnds"],[21,2,1,"","TestTriuAllClose"],[21,2,1,"","TestTriuDiv"],[21,2,1,"","TestTriuDot"],[21,2,1,"","TestTriuLog"],[21,2,1,"","TestTriuNorm"],[21,2,1,"","TestTriuSum"],[21,1,1,"","label_no_close_muts"],[21,1,1,"","no_close_muts"],[21,1,1,"","simulate_params"],[21,1,1,"","simulate_reads"]],"seismicrna.core.mu.tests.unbias_test.CalcRectangularSum":[[21,5,1,"","calc_spanning_sum_slow"],[21,5,1,"","test_2d"],[21,5,1,"","test_3d"]],"seismicrna.core.mu.tests.unbias_test.TestAdjustMinGap":[[21,5,1,"","test_gap_le_zero_le_npos"],[21,5,1,"","test_npos_le_zero_le_gap"],[21,5,1,"","test_zero_le_gap_lt_npos"],[21,5,1,"","test_zero_lt_npos_le_gap"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPClust":[[21,5,1,"","test_p_clust"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPClustGivenNoClose":[[21,5,1,"","test_ncls1"],[21,5,1,"","test_ncls2"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPEnds":[[21,5,1,"","test_invert"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPEndsGivenNoClose":[[21,5,1,"","test_npos0_ncls1"],[21,5,1,"","test_npos1_ncls0"],[21,5,1,"","test_npos1_ncls1"],[21,5,1,"","test_npos2_ncls1"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPEndsObserved":[[21,5,1,"","test_calc_p_ends_given_observed"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPMutGivenSpan":[[21,5,1,"","test_invert"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPMutGivenSpanNoClose":[[21,5,1,"","test_clusters"],[21,5,1,"","test_simulated"]],"seismicrna.core.mu.tests.unbias_test.TestCalcPNoClose":[[21,5,1,"","test_p_noclose"]],"seismicrna.core.mu.tests.unbias_test.TestCalcParams":[[21,5,1,"","test_infer"]],"seismicrna.core.mu.tests.unbias_test.TestClip":[[21,5,1,"","test_with_clip"],[21,5,1,"","test_without_clip"]],"seismicrna.core.mu.tests.unbias_test.TestNoCloseMuts":[[21,5,1,"","test_more_muts"],[21,5,1,"","test_no_muts"],[21,5,1,"","test_one_mut"]],"seismicrna.core.mu.tests.unbias_test.TestNormalize":[[21,5,1,"","test_sum_positive"],[21,5,1,"","test_sum_zero"]],"seismicrna.core.mu.tests.unbias_test.TestPrivateCalcPNoCloseGivenEnds":[[21,5,1,"","test_clusters"],[21,5,1,"","test_length_0"],[21,5,1,"","test_length_1"],[21,5,1,"","test_length_2_min_gap_1"],[21,5,1,"","test_length_3_min_gap_1"],[21,5,1,"","test_length_3_min_gap_2"],[21,5,1,"","test_length_4_min_gap_1"],[21,5,1,"","test_length_4_min_gap_2"],[21,5,1,"","test_length_4_min_gap_3"],[21,5,1,"","test_min_gap_0"]],"seismicrna.core.mu.tests.unbias_test.TestPublicCalcPNoCloseGivenEnds":[[21,5,1,"","test_1_dim"],[21,5,1,"","test_2_dim"],[21,5,1,"","test_invalid_dim"]],"seismicrna.core.mu.tests.unbias_test.TestTriuAllClose":[[21,5,1,"","test_equal"],[21,5,1,"","test_tril"],[21,5,1,"","test_triu"]],"seismicrna.core.mu.tests.unbias_test.TestTriuDiv":[[21,5,1,"","test_1x1"],[21,5,1,"","test_1x1x1"],[21,5,1,"","test_2x2"],[21,5,1,"","test_2x2x2"]],"seismicrna.core.mu.tests.unbias_test.TestTriuDot":[[21,5,1,"","test_1x1"],[21,5,1,"","test_1x1x1"],[21,5,1,"","test_2x2"],[21,5,1,"","test_2x2x2"]],"seismicrna.core.mu.tests.unbias_test.TestTriuLog":[[21,5,1,"","compare"],[21,5,1,"","test_2d"],[21,5,1,"","test_3d"]],"seismicrna.core.mu.tests.unbias_test.TestTriuNorm":[[21,5,1,"","test_1x1"],[21,5,1,"","test_1x1x1"],[21,5,1,"","test_1x1x2"],[21,5,1,"","test_2x2"],[21,5,1,"","test_2x2x1"],[21,5,1,"","test_2x2x2"],[21,5,1,"","test_2x2x2x2"]],"seismicrna.core.mu.tests.unbias_test.TestTriuSum":[[21,5,1,"","test_1x1"],[21,5,1,"","test_1x1x1"],[21,5,1,"","test_1x1x2"],[21,5,1,"","test_2x2"],[21,5,1,"","test_2x2x1"],[21,5,1,"","test_2x2x2"],[21,5,1,"","test_2x2x2x2"],[21,5,1,"","test_all_zero"]],"seismicrna.core.mu.unbias":[[20,1,1,"","calc_p_clust"],[20,1,1,"","calc_p_clust_given_noclose"],[20,1,1,"","calc_p_ends_given_noclose"],[20,1,1,"","calc_p_ends_observed"],[20,1,1,"","calc_p_noclose"],[20,1,1,"","calc_p_noclose_given_ends"],[20,1,1,"","calc_params"],[20,1,1,"","calc_params_observed"],[20,1,1,"","calc_rectangluar_sum"],[20,1,1,"","triu_log"]],"seismicrna.core.ngs":[[22,0,0,"-","phred"],[23,0,0,"-","tests"],[22,0,0,"-","xam"]],"seismicrna.core.ngs.phred":[[22,1,1,"","decode_phred"],[22,1,1,"","encode_phred"]],"seismicrna.core.ngs.tests":[[23,0,0,"-","phred_test"]],"seismicrna.core.ngs.tests.phred_test":[[23,2,1,"","TestConstants"],[23,2,1,"","TestDecode"],[23,2,1,"","TestEncode"]],"seismicrna.core.ngs.tests.phred_test.TestConstants":[[23,5,1,"","test_phreds"],[23,5,1,"","test_quals"]],"seismicrna.core.ngs.tests.phred_test.TestDecode":[[23,5,1,"","test_decode"]],"seismicrna.core.ngs.tests.phred_test.TestEncode":[[23,5,1,"","test_encode"]],"seismicrna.core.ngs.xam":[[22,1,1,"","count_single_paired"],[22,1,1,"","count_total_reads"],[22,1,1,"","flagstat_cmd"],[22,1,1,"","idxstats_cmd"],[22,1,1,"","index_fasta_cmd"],[22,1,1,"","index_xam_cmd"],[22,1,1,"","parse_flagstat"],[22,1,1,"","parse_idxstats"],[22,1,1,"","parse_ref_header"],[22,1,1,"","ref_header_cmd"],[22,1,1,"","sort_xam_cmd"],[22,1,1,"","view_xam_cmd"],[22,1,1,"","xam_paired"],[22,1,1,"","xam_to_fq_cmd"]],"seismicrna.core.parallel":[[24,0,0,"-","pool"],[24,0,0,"-","temp"],[25,0,0,"-","tests"]],"seismicrna.core.parallel.pool":[[24,2,1,"","Task"],[24,1,1,"","as_list_of_tuples"],[24,1,1,"","dispatch"],[24,1,1,"","fmt_func_args"],[24,1,1,"","get_num_parallel"]],"seismicrna.core.parallel.pool.Task":[[24,5,1,"","__call__"]],"seismicrna.core.parallel.temp":[[24,1,1,"","lock_temp_dir"]],"seismicrna.core.parallel.tests":[[25,0,0,"-","temp_test"]],"seismicrna.core.parallel.tests.temp_test":[[25,2,1,"","TestLockTempDir"],[25,1,1,"","get_lock"],[25,1,1,"","lock"],[25,1,1,"","make_lock_temp"],[25,1,1,"","make_temp"],[25,1,1,"","name_lock_temp"],[25,1,1,"","name_temp"],[25,1,1,"","rm_temp"],[25,1,1,"","run_func"],[25,1,1,"","unlock"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir":[[25,2,1,"","LockErrFilter"],[25,2,1,"","TempErrFilter"],[25,5,1,"","test_exists_erase_temp"],[25,5,1,"","test_exists_keep_temp"],[25,5,1,"","test_locked"],[25,5,1,"","test_new_erase_temp"],[25,5,1,"","test_new_keep_temp"],[25,5,1,"","test_wraps"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir.LockErrFilter":[[25,5,1,"","filter"]],"seismicrna.core.parallel.tests.temp_test.TestLockTempDir.TempErrFilter":[[25,5,1,"","filter"]],"seismicrna.core.path":[[13,2,1,"","Field"],[13,2,1,"","Path"],[13,6,1,"","PathError"],[13,6,1,"","PathTypeError"],[13,6,1,"","PathValueError"],[13,2,1,"","Segment"],[13,1,1,"","build"],[13,1,1,"","builddir"],[13,1,1,"","buildpar"],[13,1,1,"","cast_path"],[13,1,1,"","create_path_type"],[13,1,1,"","deduplicated"],[13,1,1,"","fill_whitespace"],[13,1,1,"","find_files"],[13,1,1,"","find_files_chain"],[13,1,1,"","get_fields_in_seg_types"],[13,1,1,"","parse"],[13,1,1,"","parse_top_separate"],[13,1,1,"","path_matches"],[13,1,1,"","sanitize"],[13,1,1,"","transpath"],[13,1,1,"","transpaths"],[13,1,1,"","validate_int"],[13,1,1,"","validate_str"],[13,1,1,"","validate_top"]],"seismicrna.core.path.Field":[[13,5,1,"","build"],[13,5,1,"","parse"],[13,5,1,"","validate"]],"seismicrna.core.path.Path":[[13,5,1,"","build"],[13,5,1,"","parse"]],"seismicrna.core.path.Segment":[[13,5,1,"","build"],[13,4,1,"","ext_type"],[13,4,1,"","exts"],[13,5,1,"","match_longest_ext"],[13,5,1,"","parse"]],"seismicrna.core.rel":[[26,0,0,"-","code"],[26,0,0,"-","pattern"],[27,0,0,"-","tests"]],"seismicrna.core.rel.pattern":[[26,2,1,"","HalfRelPattern"],[26,2,1,"","RelPattern"]],"seismicrna.core.rel.pattern.HalfRelPattern":[[26,3,1,"","a"],[26,5,1,"","allc"],[26,5,1,"","as_fancy"],[26,5,1,"","as_match"],[26,5,1,"","as_plain"],[26,3,1,"","c"],[26,4,1,"","codes"],[26,5,1,"","compile"],[26,5,1,"","decompile"],[26,5,1,"","fits"],[26,3,1,"","fmt_fancy"],[26,3,1,"","fmt_plain"],[26,5,1,"","from_counts"],[26,5,1,"","from_report_format"],[26,3,1,"","g"],[26,5,1,"","intersect"],[26,3,1,"","mut_bits"],[26,5,1,"","muts"],[26,5,1,"","none"],[26,4,1,"","patterns"],[26,3,1,"","ptrn_fancy"],[26,3,1,"","ptrn_plain"],[26,3,1,"","read_bases"],[26,3,1,"","ref_bases"],[26,5,1,"","refs"],[26,3,1,"","t"],[26,5,1,"","to_report_format"]],"seismicrna.core.rel.pattern.RelPattern":[[26,5,1,"","allc"],[26,5,1,"","fits"],[26,5,1,"","from_counts"],[26,5,1,"","intersect"],[26,5,1,"","muts"],[26,3,1,"","nos"],[26,3,1,"","yes"]],"seismicrna.core.rel.tests":[[27,0,0,"-","code_test"]],"seismicrna.core.rel.tests.code_test":[[27,2,1,"","TestConstants"]],"seismicrna.core.rel.tests.code_test.TestConstants":[[27,5,1,"","test_derived_codes"],[27,5,1,"","test_np_type"],[27,5,1,"","test_primary_codes"]],"seismicrna.core.report":[[13,2,1,"","BatchedRefseqReport"],[13,2,1,"","BatchedReport"],[13,2,1,"","Field"],[13,2,1,"","OptionField"],[13,2,1,"","RefseqReport"],[13,2,1,"","Report"],[13,1,1,"","calc_dt_minutes"],[13,1,1,"","calc_taken"],[13,1,1,"","default_key"],[13,1,1,"","field_keys"],[13,1,1,"","field_titles"],[13,1,1,"","fields"],[13,1,1,"","get_oconv_array_float"],[13,1,1,"","get_oconv_dict_float"],[13,1,1,"","get_oconv_dict_list_float"],[13,1,1,"","get_oconv_float"],[13,1,1,"","get_oconv_list_float"],[13,1,1,"","iconv_array_float"],[13,1,1,"","iconv_array_int"],[13,1,1,"","iconv_datetime"],[13,1,1,"","iconv_dict_str_dict_int_dict_int_int"],[13,1,1,"","iconv_dict_str_int"],[13,1,1,"","iconv_int_keys"],[13,1,1,"","key_to_title"],[13,1,1,"","lookup_key"],[13,1,1,"","lookup_title"],[13,1,1,"","oconv_array_int"],[13,1,1,"","oconv_datetime"]],"seismicrna.core.report.BatchedReport":[[13,5,1,"","batch_types"],[13,5,1,"","fields"],[13,5,1,"","get_batch_type"]],"seismicrna.core.report.Field":[[13,3,1,"","default"],[13,3,1,"","dtype"],[13,3,1,"","iconv"],[13,3,1,"","key"],[13,3,1,"","oconv"],[13,3,1,"","title"]],"seismicrna.core.report.OptionField":[[13,3,1,"","default"],[13,3,1,"","dtype"],[13,3,1,"","iconv"],[13,3,1,"","key"],[13,3,1,"","oconv"],[13,3,1,"","title"]],"seismicrna.core.report.RefseqReport":[[13,5,1,"","fields"]],"seismicrna.core.report.Report":[[13,5,1,"","__setattr__"],[13,5,1,"","field_keys"],[13,5,1,"","fields"],[13,5,1,"","from_dict"],[13,5,1,"","get_field"],[13,5,1,"","load"],[13,5,1,"","save"],[13,5,1,"","to_dict"]],"seismicrna.core.rna":[[28,0,0,"-","base"],[28,0,0,"-","ct"],[28,0,0,"-","ctio"],[28,0,0,"-","db"],[28,0,0,"-","pair"],[28,0,0,"-","profile"],[28,0,0,"-","roc"],[28,0,0,"-","state"],[28,0,0,"-","struct"]],"seismicrna.core.rna.base":[[28,2,1,"","RNASection"]],"seismicrna.core.rna.base.RNASection":[[28,4,1,"","end3"],[28,4,1,"","end5"],[28,4,1,"","init_args"],[28,4,1,"","ref"],[28,5,1,"","renumber_from"],[28,4,1,"","sect"],[28,4,1,"","seq"],[28,4,1,"","seq_record"],[28,5,1,"","subsection"]],"seismicrna.core.rna.ct":[[28,1,1,"","parse_ct"]],"seismicrna.core.rna.ctio":[[28,1,1,"","from_ct"],[28,1,1,"","renumber_ct"],[28,1,1,"","to_ct"]],"seismicrna.core.rna.db":[[28,1,1,"","parse_db_strings"]],"seismicrna.core.rna.pair":[[28,1,1,"","dict_to_pairs"],[28,1,1,"","find_root_pairs"],[28,1,1,"","map_nested"],[28,1,1,"","pairs_to_dict"],[28,1,1,"","pairs_to_table"],[28,1,1,"","renumber_pairs"],[28,1,1,"","table_to_dict"],[28,1,1,"","table_to_pairs"]],"seismicrna.core.rna.profile":[[28,2,1,"","RNAProfile"]],"seismicrna.core.rna.profile.RNAProfile":[[28,5,1,"","get_ct_file"],[28,5,1,"","get_db_file"],[28,5,1,"","get_dms_file"],[28,5,1,"","get_fasta"],[28,5,1,"","get_varna_color_file"],[28,4,1,"","init_args"],[28,4,1,"","profile"],[28,5,1,"","to_dms"],[28,5,1,"","to_fasta"],[28,5,1,"","to_varna_color_file"]],"seismicrna.core.rna.roc":[[28,1,1,"","compute_auc"],[28,1,1,"","compute_auc_roc"],[28,1,1,"","compute_roc_curve"],[28,1,1,"","compute_rolling_auc"]],"seismicrna.core.rna.state":[[28,2,1,"","RNAState"]],"seismicrna.core.rna.state.RNAState":[[28,4,1,"","auc"],[28,5,1,"","from_struct_profile"],[28,4,1,"","roc"],[28,5,1,"","rolling_auc"]],"seismicrna.core.rna.struct":[[28,2,1,"","RNAStructure"],[28,2,1,"","Rna2dPart"],[28,2,1,"","Rna2dStem"],[28,2,1,"","Rna2dStemLoop"],[28,2,1,"","RnaJunction"]],"seismicrna.core.rna.struct.RNAStructure":[[28,4,1,"","ct_data"],[28,4,1,"","ct_text"],[28,4,1,"","ct_title"],[28,4,1,"","dict"],[28,4,1,"","init_args"],[28,4,1,"","is_paired"],[28,5,1,"","iter_root_modules"],[28,4,1,"","pairs"],[28,4,1,"","roots"]],"seismicrna.core.rna.struct.Rna2dStem":[[28,4,1,"","section3"],[28,4,1,"","section5"]],"seismicrna.core.rna.struct.Rna2dStemLoop":[[28,4,1,"","section"]],"seismicrna.core.seq":[[29,0,0,"-","fasta"],[29,0,0,"-","refs"],[29,0,0,"-","section"],[30,0,0,"-","tests"],[29,0,0,"-","xna"]],"seismicrna.core.seq.fasta":[[29,1,1,"","extract_fasta_seqname"],[29,1,1,"","format_fasta_name_line"],[29,1,1,"","format_fasta_record"],[29,1,1,"","format_fasta_seq_lines"],[29,1,1,"","get_fasta_seq"],[29,1,1,"","parse_fasta"],[29,1,1,"","valid_fasta_seqname"],[29,1,1,"","write_fasta"]],"seismicrna.core.seq.refs":[[29,2,1,"","RefSeqs"]],"seismicrna.core.seq.refs.RefSeqs":[[29,5,1,"","add"],[29,5,1,"","get"],[29,5,1,"","iter"]],"seismicrna.core.seq.section":[[29,2,1,"","RefSections"],[29,2,1,"","Section"],[29,2,1,"","SectionFinder"],[29,3,1,"","SectionTuple"],[29,1,1,"","get_coords_by_ref"],[29,1,1,"","get_sect_coords_primers"],[29,1,1,"","get_shared_index"],[29,1,1,"","hyphenate_ends"],[29,1,1,"","index_to_pos"],[29,1,1,"","index_to_seq"],[29,1,1,"","intersect"],[29,1,1,"","iter_windows"],[29,1,1,"","seq_pos_to_index"],[29,1,1,"","unite"],[29,1,1,"","verify_index_names"],[29,1,1,"","window_to_margins"]],"seismicrna.core.seq.section.RefSections":[[29,4,1,"","count"],[29,5,1,"","list"]],"seismicrna.core.seq.section.Section":[[29,3,1,"","MASK_GU"],[29,3,1,"","MASK_POLYA"],[29,3,1,"","MASK_POS"],[29,5,1,"","add_mask"],[29,4,1,"","coord"],[29,5,1,"","copy"],[29,5,1,"","get_mask"],[29,4,1,"","hyphen"],[29,4,1,"","length"],[29,5,1,"","mask_gu"],[29,4,1,"","mask_names"],[29,5,1,"","mask_polya"],[29,5,1,"","mask_pos"],[29,4,1,"","masked_bool"],[29,4,1,"","masked_int"],[29,4,1,"","masked_zero"],[29,4,1,"","range"],[29,4,1,"","range_int"],[29,4,1,"","range_one"],[29,4,1,"","ref_sect"],[29,5,1,"","renumber_from"],[29,4,1,"","size"],[29,5,1,"","subsection"],[29,5,1,"","to_dict"],[29,4,1,"","unmasked"],[29,4,1,"","unmasked_bool"],[29,4,1,"","unmasked_int"],[29,4,1,"","unmasked_zero"]],"seismicrna.core.seq.section.SectionFinder":[[29,5,1,"","locate"]],"seismicrna.core.seq.tests":[[30,0,0,"-","fasta_test"],[30,0,0,"-","section_test"],[30,0,0,"-","xna_test"]],"seismicrna.core.seq.tests.fasta_test":[[30,2,1,"","TestFormat"],[30,2,1,"","TestParseFasta"],[30,2,1,"","TestValidFastaSeqname"],[30,2,1,"","TestWriteFasta"]],"seismicrna.core.seq.tests.fasta_test.TestFormat":[[30,5,1,"","test_format_fasta_name_line"],[30,5,1,"","test_format_fasta_record"],[30,5,1,"","test_format_fasta_seq_lines"]],"seismicrna.core.seq.tests.fasta_test.TestParseFasta":[[30,5,1,"","test_duplicate_name"],[30,5,1,"","test_invalid_name"],[30,5,1,"","test_invalid_seq"],[30,5,1,"","test_valid_blank_line"],[30,5,1,"","test_valid_dna"],[30,5,1,"","test_valid_empty"],[30,5,1,"","test_valid_names"],[30,5,1,"","test_valid_rna"]],"seismicrna.core.seq.tests.fasta_test.TestValidFastaSeqname":[[30,5,1,"","test_blank"],[30,5,1,"","test_illegal_prefix"],[30,5,1,"","test_illegal_suffix"],[30,5,1,"","test_misformatted"],[30,5,1,"","test_name_mark"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.fasta_test.TestWriteFasta":[[30,5,1,"","test_invalid_name"],[30,5,1,"","test_no_overwrite"],[30,5,1,"","test_overwrite"],[30,5,1,"","test_valid_names"]],"seismicrna.core.seq.tests.section_test":[[30,2,1,"","TestConstants"],[30,2,1,"","TestGetSharedIndex"],[30,2,1,"","TestGetWindows"],[30,2,1,"","TestHyphenateEnds"],[30,2,1,"","TestIndexToPos"],[30,2,1,"","TestIndexToSeq"],[30,2,1,"","TestIntersect"],[30,2,1,"","TestSectionAddMask"],[30,2,1,"","TestSectionCopy"],[30,2,1,"","TestSectionEqual"],[30,2,1,"","TestSectionInit"],[30,2,1,"","TestSectionLength"],[30,2,1,"","TestSectionMaskGU"],[30,2,1,"","TestSectionMaskNames"],[30,2,1,"","TestSectionMaskPolyA"],[30,2,1,"","TestSectionMaskPos"],[30,2,1,"","TestSectionMasked"],[30,2,1,"","TestSectionRange"],[30,2,1,"","TestSectionUnmasked"],[30,2,1,"","TestSeqPosToIndex"],[30,2,1,"","TestSubsection"],[30,2,1,"","TestUnite"],[30,2,1,"","TestWindowToMargins"]],"seismicrna.core.seq.tests.section_test.TestConstants":[[30,5,1,"","test_base_name"],[30,5,1,"","test_full_name"],[30,5,1,"","test_pos_name"],[30,5,1,"","test_seq_index_names"]],"seismicrna.core.seq.tests.section_test.TestGetSharedIndex":[[30,5,1,"","test_one_invalid"],[30,5,1,"","test_one_valid"],[30,5,1,"","test_two_invalid"],[30,5,1,"","test_two_valid"],[30,5,1,"","test_zero_invalid"],[30,5,1,"","test_zero_valid"]],"seismicrna.core.seq.tests.section_test.TestGetWindows":[[30,5,1,"","compare"],[30,5,1,"","test_1_series_size_1_min_0_excl_nan"],[30,5,1,"","test_1_series_size_1_min_0_incl_nan"],[30,5,1,"","test_1_series_size_1_min_1_excl_nan"],[30,5,1,"","test_1_series_size_1_min_1_incl_nan"],[30,5,1,"","test_1_series_size_2_min_1_excl_nan"],[30,5,1,"","test_1_series_size_2_min_1_incl_nan"],[30,5,1,"","test_1_series_size_2_min_2_excl_nan"],[30,5,1,"","test_1_series_size_2_min_2_incl_nan"],[30,5,1,"","test_2_series_size_1_min_0_excl_nan"],[30,5,1,"","test_2_series_size_1_min_0_incl_nan"],[30,5,1,"","test_2_series_size_1_min_1_excl_nan"],[30,5,1,"","test_2_series_size_1_min_1_incl_nan"],[30,5,1,"","test_2_series_size_2_min_0_excl_nan"],[30,5,1,"","test_2_series_size_2_min_0_incl_nan"],[30,5,1,"","test_2_series_size_2_min_1_excl_nan"],[30,5,1,"","test_2_series_size_2_min_1_incl_nan"],[30,5,1,"","test_2_series_size_2_min_2_excl_nan"],[30,5,1,"","test_2_series_size_2_min_2_incl_nan"],[30,5,1,"","test_empty"]],"seismicrna.core.seq.tests.section_test.TestHyphenateEnds":[[30,5,1,"","test_hyphenate"]],"seismicrna.core.seq.tests.section_test.TestIndexToPos":[[30,5,1,"","test_valid_full"],[30,5,1,"","test_valid_noncontig"],[30,5,1,"","test_valid_slice"]],"seismicrna.core.seq.tests.section_test.TestIndexToSeq":[[30,5,1,"","test_invalid_noncontig"],[30,5,1,"","test_valid_empty_seq"],[30,5,1,"","test_valid_full"],[30,5,1,"","test_valid_no_pos"],[30,5,1,"","test_valid_noncontig"],[30,5,1,"","test_valid_slice"]],"seismicrna.core.seq.tests.section_test.TestIntersect":[[30,5,1,"","test_diff_refs"],[30,5,1,"","test_diff_seqs"],[30,5,1,"","test_empty_invalid"],[30,5,1,"","test_one_full"],[30,5,1,"","test_one_full_named"],[30,5,1,"","test_one_masked"],[30,5,1,"","test_one_slice"],[30,5,1,"","test_three_overlapping"],[30,5,1,"","test_two_disjoint"],[30,5,1,"","test_two_full"],[30,5,1,"","test_two_masked"],[30,5,1,"","test_two_overlapping"]],"seismicrna.core.seq.tests.section_test.TestSectionAddMask":[[30,5,1,"","test_add_mask"],[30,5,1,"","test_add_mask_invalid"],[30,5,1,"","test_add_mask_invert"],[30,5,1,"","test_add_overlapping_masks"],[30,5,1,"","test_add_unordered_mask"]],"seismicrna.core.seq.tests.section_test.TestSectionCopy":[[30,5,1,"","test_copy"]],"seismicrna.core.seq.tests.section_test.TestSectionEqual":[[30,5,1,"","test_diff_end3"],[30,5,1,"","test_diff_end5"],[30,5,1,"","test_diff_full"],[30,5,1,"","test_diff_mask_name"],[30,5,1,"","test_diff_mask_pos"],[30,5,1,"","test_diff_name"],[30,5,1,"","test_diff_ref"],[30,5,1,"","test_diff_seq"],[30,5,1,"","test_diff_seq5"],[30,5,1,"","test_equal_full"],[30,5,1,"","test_equal_mask"],[30,5,1,"","test_equal_part"]],"seismicrna.core.seq.tests.section_test.TestSectionInit":[[30,5,1,"","test_full"],[30,5,1,"","test_full_blank_name"],[30,5,1,"","test_full_end3"],[30,5,1,"","test_full_end5"],[30,5,1,"","test_full_given_name"],[30,5,1,"","test_partial_reflen_equal"],[30,5,1,"","test_partial_reflen_greater"],[30,5,1,"","test_partial_reflen_less"],[30,5,1,"","test_partial_seq5_equal"],[30,5,1,"","test_partial_seq5_greater"],[30,5,1,"","test_partial_seq5_less"],[30,5,1,"","test_partial_seq5_reflen"],[30,5,1,"","test_partial_slice"],[30,5,1,"","test_partial_slice_invalid_end3"],[30,5,1,"","test_partial_slice_invalid_end5"],[30,5,1,"","test_partial_slice_invalid_reflen"],[30,5,1,"","test_partial_slice_invalid_seq5"],[30,5,1,"","test_slice_end3_equal"],[30,5,1,"","test_slice_end3_greater"],[30,5,1,"","test_slice_end3_less"],[30,5,1,"","test_slice_end5_end3"],[30,5,1,"","test_slice_end5_end3_invalid"],[30,5,1,"","test_slice_end5_equal"],[30,5,1,"","test_slice_end5_greater"],[30,5,1,"","test_slice_end5_less"]],"seismicrna.core.seq.tests.section_test.TestSectionLength":[[30,5,1,"","test_full_lengths"],[30,5,1,"","test_partial_lengths"],[30,5,1,"","test_slice_lengths"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskGU":[[30,5,1,"","test_find_gu"],[30,5,1,"","test_mask_gu"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskNames":[[30,5,1,"","test_get_mask"],[30,5,1,"","test_mask_names"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskPolyA":[[30,5,1,"","test_find_polya"],[30,5,1,"","test_mask_polya"]],"seismicrna.core.seq.tests.section_test.TestSectionMaskPos":[[30,5,1,"","test_mask_pos"]],"seismicrna.core.seq.tests.section_test.TestSectionMasked":[[30,5,1,"","test_masked_bool"],[30,5,1,"","test_masked_int"],[30,5,1,"","test_masked_zero"]],"seismicrna.core.seq.tests.section_test.TestSectionRange":[[30,5,1,"","test_range"],[30,5,1,"","test_range_int"],[30,5,1,"","test_range_one"]],"seismicrna.core.seq.tests.section_test.TestSectionUnmasked":[[30,5,1,"","test_size"],[30,5,1,"","test_unmasked"],[30,5,1,"","test_unmasked_bool"],[30,5,1,"","test_unmasked_int"],[30,5,1,"","test_unmasked_zero"]],"seismicrna.core.seq.tests.section_test.TestSeqPosToIndex":[[30,5,1,"","test_invalid_dup_1"],[30,5,1,"","test_invalid_empty_seq_1"],[30,5,1,"","test_invalid_empty_seq_2"],[30,5,1,"","test_invalid_empty_seq_3"],[30,5,1,"","test_invalid_full_0"],[30,5,1,"","test_invalid_greater_end_9"],[30,5,1,"","test_invalid_less_start_2"],[30,5,1,"","test_invalid_unsort_1"],[30,5,1,"","test_valid_empty_1"],[30,5,1,"","test_valid_empty_seq"],[30,5,1,"","test_valid_full_1"],[30,5,1,"","test_valid_full_9"],[30,5,1,"","test_valid_noncontig_2"],[30,5,1,"","test_valid_slice_6"]],"seismicrna.core.seq.tests.section_test.TestSubsection":[[30,5,1,"","test_full_section_full_length_sub"],[30,5,1,"","test_full_section_full_sub"],[30,5,1,"","test_full_section_full_sub_end3"],[30,5,1,"","test_full_section_full_sub_end5"],[30,5,1,"","test_full_section_full_sub_name"],[30,5,1,"","test_partial_trunc_section_trunc_sub"],[30,5,1,"","test_trunc_section_full_sub"],[30,5,1,"","test_trunc_section_trunc_sub"]],"seismicrna.core.seq.tests.section_test.TestUnite":[[30,5,1,"","test_diff_refs"],[30,5,1,"","test_diff_seqs"],[30,5,1,"","test_empty_invalid"],[30,5,1,"","test_one_full"],[30,5,1,"","test_one_full_named"],[30,5,1,"","test_one_masked"],[30,5,1,"","test_one_slice"],[30,5,1,"","test_two_disjoint"],[30,5,1,"","test_two_disjoint_refseq"],[30,5,1,"","test_two_disjoint_wrong_refseq"],[30,5,1,"","test_two_full"],[30,5,1,"","test_two_masked"],[30,5,1,"","test_two_overlapping"],[30,5,1,"","test_two_overlapping_refseq"]],"seismicrna.core.seq.tests.section_test.TestWindowToMargins":[[30,5,1,"","test_window_0"],[30,5,1,"","test_window_float"],[30,5,1,"","test_window_length"],[30,5,1,"","test_window_margins"]],"seismicrna.core.seq.tests.xna_test":[[30,2,1,"","TestDNA"],[30,2,1,"","TestExpandDegenerateSeq"],[30,2,1,"","TestRNA"],[30,2,1,"","TestXNA"]],"seismicrna.core.seq.tests.xna_test.TestDNA":[[30,5,1,"","test_alph"],[30,5,1,"","test_bool"],[30,5,1,"","test_get_alphaset"],[30,5,1,"","test_get_comp"],[30,5,1,"","test_get_comptrans"],[30,5,1,"","test_get_nonalphaset"],[30,5,1,"","test_invalid_bases"],[30,5,1,"","test_picto"],[30,5,1,"","test_random"],[30,5,1,"","test_reverse_complement"],[30,5,1,"","test_slice"],[30,5,1,"","test_to_array"],[30,5,1,"","test_transcribe"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.xna_test.TestExpandDegenerateSeq":[[30,5,1,"","test_one_degenerate"],[30,5,1,"","test_two_degenerate"],[30,5,1,"","test_zero_degenerate"]],"seismicrna.core.seq.tests.xna_test.TestRNA":[[30,5,1,"","test_alph"],[30,5,1,"","test_bool"],[30,5,1,"","test_get_alphaset"],[30,5,1,"","test_get_comp"],[30,5,1,"","test_get_comptrans"],[30,5,1,"","test_get_nonalphaset"],[30,5,1,"","test_invalid_bases"],[30,5,1,"","test_picto"],[30,5,1,"","test_random"],[30,5,1,"","test_reverse_complement"],[30,5,1,"","test_reverse_transcribe"],[30,5,1,"","test_slice"],[30,5,1,"","test_to_array"],[30,5,1,"","test_valid"]],"seismicrna.core.seq.tests.xna_test.TestXNA":[[30,5,1,"","test_abstract_base_class"],[30,5,1,"","test_dict_str_dna_rna"],[30,5,1,"","test_equal_dna_dna"],[30,5,1,"","test_equal_rna_rna"],[30,5,1,"","test_hashable_dna"],[30,5,1,"","test_hashable_rna"],[30,5,1,"","test_not_equal_dna_rna"],[30,5,1,"","test_not_equal_dna_str"],[30,5,1,"","test_not_equal_rna_str"],[30,5,1,"","test_set_str_dna_rna"]],"seismicrna.core.seq.xna":[[29,2,1,"","CompressedSeq"],[29,2,1,"","DNA"],[29,2,1,"","RNA"],[29,2,1,"","XNA"],[29,1,1,"","decompress"],[29,1,1,"","expand_degenerate_seq"]],"seismicrna.core.seq.xna.CompressedSeq":[[29,5,1,"","decompress"],[29,4,1,"","type"]],"seismicrna.core.seq.xna.DNA":[[29,5,1,"","alph"],[29,5,1,"","pict"],[29,5,1,"","tr"]],"seismicrna.core.seq.xna.RNA":[[29,5,1,"","alph"],[29,5,1,"","pict"],[29,5,1,"","rt"]],"seismicrna.core.seq.xna.XNA":[[29,5,1,"","__add__"],[29,5,1,"","__bool__"],[29,5,1,"","__eq__"],[29,5,1,"","__getitem__"],[29,5,1,"","__hash__"],[29,5,1,"","__mul__"],[29,5,1,"","__repr__"],[29,5,1,"","alph"],[29,4,1,"","array"],[29,5,1,"","compress"],[29,5,1,"","four"],[29,5,1,"","get_alphaset"],[29,5,1,"","get_comp"],[29,5,1,"","get_comptrans"],[29,5,1,"","get_nonalphaset"],[29,5,1,"","get_other_iupac"],[29,5,1,"","get_pictrans"],[29,5,1,"","pict"],[29,4,1,"","picto"],[29,5,1,"","random"],[29,4,1,"","rc"],[29,5,1,"","t_or_u"]],"seismicrna.core.tests":[[31,0,0,"-","dims_test"],[31,0,0,"-","header_test"]],"seismicrna.core.tests.dims_test":[[31,2,1,"","TestFindDims"],[31,2,1,"","TestTriangular"]],"seismicrna.core.tests.dims_test.TestFindDims":[[31,5,1,"","test_0d"],[31,5,1,"","test_0d_1dim"],[31,5,1,"","test_0d_none"],[31,5,1,"","test_0d_nonzero"],[31,5,1,"","test_0d_nonzero_extra"],[31,5,1,"","test_1d"],[31,5,1,"","test_1d_0dim_none"],[31,5,1,"","test_1d_1d_crossed"],[31,5,1,"","test_1d_1d_separate"],[31,5,1,"","test_1d_1dim_none"],[31,5,1,"","test_1d_2d_congruent"],[31,5,1,"","test_1d_2d_crossed"],[31,5,1,"","test_1d_2dim"],[31,5,1,"","test_1d_2dim_none"],[31,5,1,"","test_1d_nonzero"],[31,5,1,"","test_2d"],[31,5,1,"","test_2d_1dim_none"],[31,5,1,"","test_2d_2d_congruent"],[31,5,1,"","test_2d_2d_crossed"],[31,5,1,"","test_2d_nonzero"],[31,5,1,"","test_empty"],[31,5,1,"","test_none_2d"]],"seismicrna.core.tests.dims_test.TestTriangular":[[31,5,1,"","test_float"],[31,5,1,"","test_negative"],[31,5,1,"","test_whole_numbers"]],"seismicrna.core.tests.header_test":[[31,2,1,"","TestClustHeader"],[31,2,1,"","TestConstants"],[31,2,1,"","TestEqualHeaders"],[31,2,1,"","TestFormatClustName"],[31,2,1,"","TestFormatClustNames"],[31,2,1,"","TestHeader"],[31,2,1,"","TestIndexClusts"],[31,2,1,"","TestIndexOrderClusts"],[31,2,1,"","TestIndexOrders"],[31,2,1,"","TestIndexOrdersClusts"],[31,2,1,"","TestListClusts"],[31,2,1,"","TestListOrderClusts"],[31,2,1,"","TestListOrders"],[31,2,1,"","TestListOrdersClusts"],[31,2,1,"","TestMakeHeader"],[31,2,1,"","TestParseHeader"],[31,2,1,"","TestRelClustHeader"],[31,2,1,"","TestRelHeader"],[31,2,1,"","TestValidateOrderClust"]],"seismicrna.core.tests.header_test.TestClustHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_clusts"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_min_order"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_names"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_orders"],[31,5,1,"","test_select_clust"],[31,5,1,"","test_select_clusts"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_invalid_clust"],[31,5,1,"","test_select_invalid_order"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_order"],[31,5,1,"","test_select_order_clust_empty"],[31,5,1,"","test_select_order_clust_exist"],[31,5,1,"","test_select_orders"],[31,5,1,"","test_select_orders_clusts_exist"],[31,5,1,"","test_signature"]],"seismicrna.core.tests.header_test.TestConstants":[[31,5,1,"","test_average_prefix"],[31,5,1,"","test_clust_name"],[31,5,1,"","test_cluster_prefix"],[31,5,1,"","test_order_name"],[31,5,1,"","test_rel_name"]],"seismicrna.core.tests.header_test.TestEqualHeaders":[[31,5,1,"","test_clustheaders"],[31,5,1,"","test_different_types"],[31,5,1,"","test_relclustheaders"],[31,5,1,"","test_relheaders"]],"seismicrna.core.tests.header_test.TestFormatClustName":[[31,5,1,"","test_positive"],[31,5,1,"","test_zero_zero_allowed"]],"seismicrna.core.tests.header_test.TestFormatClustNames":[[31,5,1,"","test_positive_invalid_dups"],[31,5,1,"","test_positive_no_dups"],[31,5,1,"","test_positive_valid_dups"],[31,5,1,"","test_zero_zero_allowed"]],"seismicrna.core.tests.header_test.TestHeader":[[31,5,1,"","test_abstract"]],"seismicrna.core.tests.header_test.TestIndexClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrderClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrders":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestIndexOrdersClusts":[[31,5,1,"","test_valid"]],"seismicrna.core.tests.header_test.TestListClusts":[[31,5,1,"","test_negative"],[31,5,1,"","test_positive"],[31,5,1,"","test_zero"]],"seismicrna.core.tests.header_test.TestListOrderClusts":[[31,5,1,"","test_positive"],[31,5,1,"","test_zero"]],"seismicrna.core.tests.header_test.TestListOrders":[[31,5,1,"","test_negative_none"],[31,5,1,"","test_negative_positive"],[31,5,1,"","test_negative_zero"],[31,5,1,"","test_positive_none"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_positive_zero"],[31,5,1,"","test_zero_none"],[31,5,1,"","test_zero_one"],[31,5,1,"","test_zero_two"],[31,5,1,"","test_zero_zero"]],"seismicrna.core.tests.header_test.TestListOrdersClusts":[[31,5,1,"","test_positive_none"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_zero_none"],[31,5,1,"","test_zero_one"]],"seismicrna.core.tests.header_test.TestMakeHeader":[[31,5,1,"","test_all"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_none"],[31,5,1,"","test_rels"]],"seismicrna.core.tests.header_test.TestParseHeader":[[31,5,1,"","test_clust"],[31,5,1,"","test_extra_index_names"],[31,5,1,"","test_extra_values"],[31,5,1,"","test_invalid_numeric"],[31,5,1,"","test_missing_index_names"],[31,5,1,"","test_missing_values"],[31,5,1,"","test_none"],[31,5,1,"","test_nonnumeric"],[31,5,1,"","test_rel_index"],[31,5,1,"","test_rel_index_invalid_name"],[31,5,1,"","test_rel_index_repeated"],[31,5,1,"","test_rel_index_valid_name"],[31,5,1,"","test_rel_multiindex"],[31,5,1,"","test_relclust"]],"seismicrna.core.tests.header_test.TestRelClustHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_modified_all"],[31,5,1,"","test_modified_empty_rels"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_max_order_0"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_nullified"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_select_clust"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_extra_emptystr"],[31,5,1,"","test_select_extra_none"],[31,5,1,"","test_select_extra_zero"],[31,5,1,"","test_select_invalid_clust"],[31,5,1,"","test_select_invalid_order"],[31,5,1,"","test_select_invalid_rel"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_order"],[31,5,1,"","test_select_order_clust_empty"],[31,5,1,"","test_select_order_clust_exist"],[31,5,1,"","test_select_rel"],[31,5,1,"","test_signature"]],"seismicrna.core.tests.header_test.TestRelHeader":[[31,5,1,"","test_clustered"],[31,5,1,"","test_clusts"],[31,5,1,"","test_index"],[31,5,1,"","test_iter_clust_indexes"],[31,5,1,"","test_level_keys"],[31,5,1,"","test_level_names"],[31,5,1,"","test_levels"],[31,5,1,"","test_max_order"],[31,5,1,"","test_min_order"],[31,5,1,"","test_modified_empty_rels"],[31,5,1,"","test_modified_max_order"],[31,5,1,"","test_modified_min_order"],[31,5,1,"","test_modified_none"],[31,5,1,"","test_modified_rels"],[31,5,1,"","test_names"],[31,5,1,"","test_num_levels"],[31,5,1,"","test_orders"],[31,5,1,"","test_rels_duplicated"],[31,5,1,"","test_rels_empty"],[31,5,1,"","test_rels_normal"],[31,5,1,"","test_select_extra"],[31,5,1,"","test_select_extra_zero"],[31,5,1,"","test_select_invalid"],[31,5,1,"","test_select_none"],[31,5,1,"","test_select_one_rels"],[31,5,1,"","test_select_rel"],[31,5,1,"","test_select_two_rels"],[31,5,1,"","test_signature"],[31,5,1,"","test_size"]],"seismicrna.core.tests.header_test.TestValidateOrderClust":[[31,5,1,"","test_float_clust"],[31,5,1,"","test_float_order"],[31,5,1,"","test_negative_zero_allowed"],[31,5,1,"","test_one_zero_allowed"],[31,5,1,"","test_one_zero_unallowed"],[31,5,1,"","test_positive_positive"],[31,5,1,"","test_zero_negative_allowed"],[31,5,1,"","test_zero_one_allowed"],[31,5,1,"","test_zero_one_unallowed"],[31,5,1,"","test_zero_zero_allowed"],[31,5,1,"","test_zero_zero_unallowed"]],"seismicrna.core.types":[[13,1,1,"","fit_uint_size"],[13,1,1,"","fit_uint_type"],[13,1,1,"","get_byte_dtype"],[13,1,1,"","get_dtype"],[13,1,1,"","get_max_uint"],[13,1,1,"","get_max_value"],[13,1,1,"","get_uint_dtype"],[13,1,1,"","get_uint_size"],[13,1,1,"","get_uint_type"]],"seismicrna.core.version":[[13,1,1,"","format_version"],[13,1,1,"","parse_version"]],"seismicrna.core.write":[[13,1,1,"","need_write"],[13,1,1,"","write_mode"]],"seismicrna.demult":[[32,0,0,"-","demultiplex"],[32,0,0,"-","main"]],"seismicrna.demult.demultiplex":[[32,2,1,"","Sequence_Obj"],[32,1,1,"","append_files"],[32,1,1,"","check_all_done"],[32,1,1,"","check_done"],[32,1,1,"","create_report"],[32,1,1,"","demultiplex_run"],[32,1,1,"","finds_multigrepped_reads"],[32,1,1,"","grep_both_fastq"],[32,1,1,"","make_dict_from_fasta"],[32,1,1,"","make_sequence_objects_from_csv"],[32,1,1,"","makes_dict_from_fastq"],[32,1,1,"","parallel_grepping"],[32,1,1,"","regular_grepping"],[32,1,1,"","resolve_or_analyze_multigrepped_reads"],[32,1,1,"","reverse_compliment"],[32,1,1,"","run_multi_greps"],[32,1,1,"","run_seqkit_grep"],[32,1,1,"","run_seqkit_grep_function"],[32,2,1,"","super_fastq"]],"seismicrna.demult.demultiplex.super_fastq":[[32,5,1,"","check_exists"],[32,5,1,"","check_set"],[32,5,1,"","destroy_temp_data"],[32,5,1,"","fastq_to_dict"],[32,5,1,"","split_fastq"],[32,5,1,"","super_write_fastqs"]],"seismicrna.demult.main":[[32,1,1,"","run"]],"seismicrna.export":[[33,0,0,"-","main"],[33,0,0,"-","meta"],[33,0,0,"-","web"]],"seismicrna.export.main":[[33,1,1,"","run"]],"seismicrna.export.meta":[[33,1,1,"","combine_metadata"],[33,1,1,"","parse_refs_metadata"],[33,1,1,"","parse_samples_metadata"]],"seismicrna.export.web":[[33,1,1,"","conform_series"],[33,1,1,"","export_sample"],[33,1,1,"","format_metadata"],[33,1,1,"","get_db_structs"],[33,1,1,"","get_ref_metadata"],[33,1,1,"","get_sample_data"],[33,1,1,"","get_sample_metadata"],[33,1,1,"","get_sect_metadata"],[33,1,1,"","get_table_data"],[33,1,1,"","iter_clust_table_data"],[33,1,1,"","iter_pos_table_data"],[33,1,1,"","iter_pos_table_series"],[33,1,1,"","iter_pos_table_struct"],[33,1,1,"","iter_read_table_data"],[33,1,1,"","iter_table_data"]],"seismicrna.fold":[[34,0,0,"-","load"],[34,0,0,"-","main"],[34,0,0,"-","report"],[34,0,0,"-","rnastructure"]],"seismicrna.fold.load":[[34,1,1,"","find_ct_files"],[34,1,1,"","load_ct_structs"]],"seismicrna.fold.main":[[34,1,1,"","fold_profile"],[34,1,1,"","fold_section"],[34,1,1,"","run"]],"seismicrna.fold.report":[[34,2,1,"","FoldReport"]],"seismicrna.fold.report.FoldReport":[[34,5,1,"","auto_fields"],[34,5,1,"","dir_seg_types"],[34,5,1,"","fields"],[34,5,1,"","file_seg_type"]],"seismicrna.fold.rnastructure":[[34,1,1,"","ct2dot"],[34,1,1,"","dot2ct"],[34,1,1,"","fold"],[34,1,1,"","format_retitled_ct_line"],[34,1,1,"","parse_energy"],[34,1,1,"","parse_rnastructure_ct_title"],[34,1,1,"","retitle_ct_structures"]],"seismicrna.graph":[[35,0,0,"-","aucroll"],[35,0,0,"-","base"],[35,0,0,"-","color"],[35,0,0,"-","corroll"],[35,0,0,"-","delprof"],[35,0,0,"-","hist"],[35,0,0,"-","histpos"],[35,0,0,"-","histread"],[35,0,0,"-","histrel"],[35,0,0,"-","main"],[35,0,0,"-","onestruct"],[35,0,0,"-","onetable"],[35,0,0,"-","profile"],[35,0,0,"-","rel"],[35,0,0,"-","roc"],[35,0,0,"-","roll"],[35,0,0,"-","scatter"],[35,0,0,"-","trace"],[35,0,0,"-","twotable"]],"seismicrna.graph.aucroll":[[35,2,1,"","RollingAUCGraph"],[35,2,1,"","RollingAUCRunner"],[35,2,1,"","RollingAUCWriter"]],"seismicrna.graph.aucroll.RollingAUCGraph":[[35,4,1,"","data"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,4,1,"","profile_names"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.aucroll.RollingAUCRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","var_params"]],"seismicrna.graph.aucroll.RollingAUCWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.base":[[35,2,1,"","GraphBase"],[35,2,1,"","GraphRunner"],[35,2,1,"","GraphWriter"],[35,2,1,"","PosGraphRunner"],[35,2,1,"","PosGraphWriter"],[35,2,1,"","ReadGraphRunner"],[35,2,1,"","ReadGraphWriter"],[35,1,1,"","cgroup_table"],[35,1,1,"","get_action_name"],[35,1,1,"","make_index"],[35,1,1,"","make_path_subject"],[35,1,1,"","make_title_action_sample"]],"seismicrna.graph.base.GraphBase":[[35,4,1,"","codestring"],[35,4,1,"","col_index"],[35,4,1,"","col_titles"],[35,4,1,"","data"],[35,4,1,"","data_kind"],[35,4,1,"","details"],[35,4,1,"","figure"],[35,5,1,"","get_path"],[35,5,1,"","get_path_fields"],[35,5,1,"","get_path_segs"],[35,5,1,"","get_traces"],[35,4,1,"","graph_filename"],[35,5,1,"","graph_kind"],[35,4,1,"","ncols"],[35,4,1,"","nrows"],[35,4,1,"","path_subject"],[35,4,1,"","predicate"],[35,4,1,"","ref"],[35,4,1,"","rel_names"],[35,4,1,"","relationships"],[35,4,1,"","row_index"],[35,4,1,"","row_titles"],[35,4,1,"","sample"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title"],[35,4,1,"","title_action_sample"],[35,5,1,"","what"],[35,5,1,"","write"],[35,5,1,"","write_csv"],[35,5,1,"","write_html"],[35,5,1,"","write_pdf"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.base.GraphRunner":[[35,5,1,"","get_table_finder"],[35,5,1,"","get_writer_type"],[35,5,1,"","list_table_files"],[35,5,1,"","params"],[35,5,1,"","run"],[35,5,1,"","universal_input_params"],[35,5,1,"","universal_output_params"],[35,5,1,"","var_params"]],"seismicrna.graph.base.GraphWriter":[[35,5,1,"","get_table_loader"],[35,5,1,"","iter_graphs"],[35,5,1,"","load_table_file"],[35,5,1,"","write"]],"seismicrna.graph.base.PosGraphRunner":[[35,5,1,"","get_table_finder"]],"seismicrna.graph.base.PosGraphWriter":[[35,5,1,"","get_table_loader"]],"seismicrna.graph.base.ReadGraphRunner":[[35,5,1,"","get_table_finder"]],"seismicrna.graph.base.ReadGraphWriter":[[35,5,1,"","get_table_loader"]],"seismicrna.graph.color":[[35,2,1,"","ColorMap"],[35,2,1,"","ColorMapGraph"],[35,2,1,"","RelColorMap"],[35,2,1,"","SeqColorMap"],[35,1,1,"","get_cmap"],[35,1,1,"","get_colormaps"]],"seismicrna.graph.color.ColorMap":[[35,5,1,"","get"]],"seismicrna.graph.color.ColorMapGraph":[[35,4,1,"","cmap"],[35,5,1,"","get_cmap_type"]],"seismicrna.graph.corroll":[[35,2,1,"","RollingCorrelationGraph"],[35,2,1,"","RollingCorrelationRunner"],[35,2,1,"","RollingCorrelationWriter"]],"seismicrna.graph.corroll.RollingCorrelationGraph":[[35,4,1,"","details"],[35,5,1,"","graph_kind"],[35,4,1,"","predicate"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.corroll.RollingCorrelationRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","var_params"]],"seismicrna.graph.corroll.RollingCorrelationWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.delprof":[[35,2,1,"","DeltaProfileGraph"],[35,2,1,"","DeltaProfileRunner"],[35,2,1,"","DeltaProfileWriter"]],"seismicrna.graph.delprof.DeltaProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.delprof.DeltaProfileRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.delprof.DeltaProfileWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.hist":[[35,2,1,"","HistogramGraph"],[35,2,1,"","HistogramRunner"],[35,1,1,"","get_edges_index"]],"seismicrna.graph.hist.HistogramGraph":[[35,5,1,"","get_bounds"],[35,5,1,"","get_edges"]],"seismicrna.graph.hist.HistogramRunner":[[35,5,1,"","var_params"]],"seismicrna.graph.histpos":[[35,2,1,"","PosHistogramGraph"],[35,2,1,"","PosHistogramRunner"],[35,2,1,"","PosHistogramWriter"]],"seismicrna.graph.histpos.PosHistogramGraph":[[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.histpos.PosHistogramRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.histpos.PosHistogramWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.histread":[[35,2,1,"","ReadHistogramGraph"],[35,2,1,"","ReadHistogramRunner"],[35,2,1,"","ReadHistogramWriter"]],"seismicrna.graph.histread.ReadHistogramGraph":[[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","y_title"]],"seismicrna.graph.histread.ReadHistogramRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.histread.ReadHistogramWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.histrel":[[35,2,1,"","RelHistogramGraph"],[35,2,1,"","RelHistogramRunner"],[35,2,1,"","RelHistogramWriter"]],"seismicrna.graph.histrel.RelHistogramGraph":[[35,4,1,"","data"],[35,4,1,"","data_header"],[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,4,1,"","x_title"]],"seismicrna.graph.histrel.RelHistogramWriter":[[35,5,1,"","get_graph"],[35,5,1,"","get_graph_type"]],"seismicrna.graph.onestruct":[[35,2,1,"","StructOneTableGraph"],[35,2,1,"","StructOneTableRunner"]],"seismicrna.graph.onestruct.StructOneTableGraph":[[35,5,1,"","get_path_fields"],[35,5,1,"","iter_profiles"],[35,5,1,"","iter_states"],[35,4,1,"","path_subject"]],"seismicrna.graph.onestruct.StructOneTableRunner":[[35,5,1,"","var_params"]],"seismicrna.graph.onetable":[[35,2,1,"","OneTableGraph"],[35,2,1,"","OneTableRunner"],[35,2,1,"","OneTableWriter"]],"seismicrna.graph.onetable.OneTableGraph":[[35,4,1,"","action"],[35,4,1,"","col_index"],[35,4,1,"","path_subject"],[35,4,1,"","ref"],[35,4,1,"","row_index"],[35,4,1,"","sample"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title_action_sample"]],"seismicrna.graph.onetable.OneTableRunner":[[35,5,1,"","run"]],"seismicrna.graph.onetable.OneTableWriter":[[35,5,1,"","get_graph"],[35,5,1,"","iter_graphs"],[35,4,1,"","table"]],"seismicrna.graph.profile":[[35,2,1,"","MultiRelsProfileGraph"],[35,2,1,"","OneRelProfileGraph"],[35,2,1,"","ProfileGraph"],[35,2,1,"","ProfileRunner"],[35,2,1,"","ProfileWriter"]],"seismicrna.graph.profile.MultiRelsProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","what"]],"seismicrna.graph.profile.OneRelProfileGraph":[[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","what"]],"seismicrna.graph.profile.ProfileGraph":[[35,4,1,"","data"],[35,4,1,"","data_header"],[35,5,1,"","graph_kind"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.profile.ProfileRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.profile.ProfileWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.rel":[[35,2,1,"","MultiRelsGraph"],[35,2,1,"","OneRelGraph"]],"seismicrna.graph.rel.MultiRelsGraph":[[35,4,1,"","codestring"],[35,4,1,"","rel_names"]],"seismicrna.graph.rel.OneRelGraph":[[35,4,1,"","codestring"],[35,4,1,"","rel_name"],[35,4,1,"","rel_names"]],"seismicrna.graph.roc":[[35,2,1,"","ROCGraph"],[35,2,1,"","ROCRunner"],[35,2,1,"","ROCWriter"],[35,1,1,"","rename_columns"]],"seismicrna.graph.roc.ROCGraph":[[35,4,1,"","data"],[35,4,1,"","fpr"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,4,1,"","profile_names"],[35,4,1,"","tpr"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.roc.ROCRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.roc.ROCWriter":[[35,5,1,"","get_graph"]],"seismicrna.graph.roll":[[35,2,1,"","RollingGraph"]],"seismicrna.graph.roll.RollingGraph":[[35,4,1,"","details"],[35,4,1,"","predicate"],[35,4,1,"","x_title"]],"seismicrna.graph.scatter":[[35,2,1,"","ScatterPlotGraph"],[35,2,1,"","ScatterPlotRunner"],[35,2,1,"","ScatterPlotWriter"]],"seismicrna.graph.scatter.ScatterPlotGraph":[[35,4,1,"","data"],[35,5,1,"","get_cmap_type"],[35,5,1,"","get_traces"],[35,5,1,"","graph_kind"],[35,5,1,"","what"],[35,4,1,"","x_title"],[35,4,1,"","y_title"]],"seismicrna.graph.scatter.ScatterPlotRunner":[[35,5,1,"","get_writer_type"]],"seismicrna.graph.scatter.ScatterPlotWriter":[[35,5,1,"","get_graph_type"]],"seismicrna.graph.trace":[[35,1,1,"","get_hist_trace"],[35,1,1,"","get_roc_trace"],[35,1,1,"","get_rolling_auc_trace"],[35,1,1,"","get_seq_base_bar_trace"],[35,1,1,"","get_seq_base_scatter_trace"],[35,1,1,"","get_seq_line_trace"],[35,1,1,"","get_seq_stack_bar_trace"],[35,1,1,"","iter_hist_traces"],[35,1,1,"","iter_roc_traces"],[35,1,1,"","iter_rolling_auc_traces"],[35,1,1,"","iter_seq_base_bar_traces"],[35,1,1,"","iter_seq_base_scatter_traces"],[35,1,1,"","iter_seq_line_traces"],[35,1,1,"","iter_seqbar_stack_traces"]],"seismicrna.graph.twotable":[[35,2,1,"","TwoTableGraph"],[35,2,1,"","TwoTableMergedGraph"],[35,2,1,"","TwoTableRunner"],[35,2,1,"","TwoTableWriter"],[35,1,1,"","iter_pos_table_pairs"],[35,1,1,"","iter_read_table_pairs"]],"seismicrna.graph.twotable.TwoTableGraph":[[35,4,1,"","action1"],[35,4,1,"","action2"],[35,4,1,"","action_sample1"],[35,4,1,"","action_sample2"],[35,4,1,"","col_index"],[35,4,1,"","data1"],[35,4,1,"","data2"],[35,4,1,"","path_subject"],[35,4,1,"","path_subject1"],[35,4,1,"","path_subject2"],[35,4,1,"","ref"],[35,4,1,"","row_index"],[35,4,1,"","sample"],[35,4,1,"","sample1"],[35,4,1,"","sample2"],[35,4,1,"","sect"],[35,4,1,"","seq"],[35,4,1,"","title_action_sample"]],"seismicrna.graph.twotable.TwoTableMergedGraph":[[35,4,1,"","data"],[35,5,1,"","get_traces"]],"seismicrna.graph.twotable.TwoTableRunner":[[35,5,1,"","get_writer_type"],[35,5,1,"","run"],[35,5,1,"","var_params"]],"seismicrna.graph.twotable.TwoTableWriter":[[35,5,1,"","get_graph_type"],[35,5,1,"","iter_graphs"],[35,4,1,"","table1"],[35,4,1,"","table2"]],"seismicrna.join":[[36,0,0,"-","clusts"],[36,0,0,"-","data"],[36,0,0,"-","main"],[36,0,0,"-","report"]],"seismicrna.join.clusts":[[36,1,1,"","parse_join_clusts_file"]],"seismicrna.join.data":[[36,2,1,"","JoinClusterMutsDataset"],[36,2,1,"","JoinClusterReadDataset"],[36,2,1,"","JoinMaskMutsDataset"],[36,2,1,"","JoinMaskReadDataset"],[36,2,1,"","JoinMutsDataset"]],"seismicrna.join.data.JoinClusterMutsDataset":[[36,5,1,"","get_dataset1_load_func"],[36,5,1,"","get_dataset2_type"]],"seismicrna.join.data.JoinClusterReadDataset":[[36,4,1,"","clusts"],[36,5,1,"","get_dataset_load_func"],[36,5,1,"","get_report_type"],[36,4,1,"","max_order"]],"seismicrna.join.data.JoinMaskMutsDataset":[[36,5,1,"","get_dataset2_type"]],"seismicrna.join.data.JoinMaskReadDataset":[[36,5,1,"","get_dataset_load_func"],[36,5,1,"","get_report_type"],[36,4,1,"","min_mut_gap"],[36,4,1,"","pos_kept"]],"seismicrna.join.data.JoinMutsDataset":[[36,4,1,"","sects"]],"seismicrna.join.main":[[36,1,1,"","join_sections"],[36,1,1,"","run"]],"seismicrna.join.report":[[36,2,1,"","JoinClusterReport"],[36,2,1,"","JoinMaskReport"]],"seismicrna.join.report.JoinClusterReport":[[36,5,1,"","auto_fields"],[36,5,1,"","fields"],[36,5,1,"","file_seg_type"]],"seismicrna.join.report.JoinMaskReport":[[36,5,1,"","auto_fields"],[36,5,1,"","fields"],[36,5,1,"","file_seg_type"]],"seismicrna.lists":[[37,0,0,"-","listpos"],[37,0,0,"-","lists"]],"seismicrna.lists.listpos":[[37,1,1,"","find_pos"],[37,1,1,"","list_pos"],[37,1,1,"","run"]],"seismicrna.lists.lists":[[37,1,1,"","get_list_path"]],"seismicrna.mask":[[38,0,0,"-","batch"],[38,0,0,"-","data"],[38,0,0,"-","io"],[38,0,0,"-","main"],[38,0,0,"-","report"],[38,0,0,"-","write"]],"seismicrna.mask.batch":[[38,2,1,"","MaskMutsBatch"],[38,2,1,"","MaskReadBatch"],[38,1,1,"","apply_mask"]],"seismicrna.mask.batch.MaskReadBatch":[[38,4,1,"","read_nums"]],"seismicrna.mask.data":[[38,2,1,"","MaskMutsDataset"],[38,2,1,"","MaskReadDataset"]],"seismicrna.mask.data.MaskMutsDataset":[[38,3,1,"","MASK_NAME"],[38,5,1,"","get_dataset1_load_func"],[38,5,1,"","get_dataset2_type"],[38,4,1,"","min_mut_gap"],[38,4,1,"","pattern"],[38,4,1,"","section"]],"seismicrna.mask.data.MaskReadDataset":[[38,5,1,"","get_batch_type"],[38,5,1,"","get_report_type"],[38,4,1,"","min_mut_gap"],[38,4,1,"","pattern"],[38,4,1,"","pos_kept"]],"seismicrna.mask.io":[[38,2,1,"","MaskBatchIO"],[38,2,1,"","MaskIO"]],"seismicrna.mask.io.MaskBatchIO":[[38,5,1,"","file_seg_type"]],"seismicrna.mask.io.MaskIO":[[38,5,1,"","auto_fields"]],"seismicrna.mask.main":[[38,1,1,"","load_sections"],[38,1,1,"","run"]],"seismicrna.mask.report":[[38,2,1,"","MaskReport"]],"seismicrna.mask.report.MaskReport":[[38,5,1,"","auto_fields"],[38,5,1,"","fields"],[38,5,1,"","file_seg_type"]],"seismicrna.mask.write":[[38,2,1,"","RelMasker"],[38,1,1,"","mask_section"]],"seismicrna.mask.write.RelMasker":[[38,3,1,"","CHECKSUM_KEY"],[38,3,1,"","MASK_POS_FMUT"],[38,3,1,"","MASK_POS_NINFO"],[38,3,1,"","MASK_READ_DISCONTIG"],[38,3,1,"","MASK_READ_FINFO"],[38,3,1,"","MASK_READ_FMUT"],[38,3,1,"","MASK_READ_GAP"],[38,3,1,"","MASK_READ_INIT"],[38,3,1,"","MASK_READ_KEPT"],[38,3,1,"","MASK_READ_NCOV"],[38,3,1,"","PATTERN_KEY"],[38,5,1,"","create_report"],[38,5,1,"","mask"],[38,4,1,"","n_batches"],[38,4,1,"","n_reads_discontig"],[38,4,1,"","n_reads_init"],[38,4,1,"","n_reads_kept"],[38,4,1,"","n_reads_max_fmut"],[38,4,1,"","n_reads_min_finfo"],[38,4,1,"","n_reads_min_gap"],[38,4,1,"","n_reads_min_ncov"],[38,4,1,"","pos_gu"],[38,4,1,"","pos_kept"],[38,4,1,"","pos_max_fmut"],[38,4,1,"","pos_min_ninfo"],[38,4,1,"","pos_polya"],[38,4,1,"","pos_user"]],"seismicrna.pool":[[39,0,0,"-","data"],[39,0,0,"-","main"],[39,0,0,"-","report"]],"seismicrna.pool.data":[[39,2,1,"","PoolDataset"]],"seismicrna.pool.data.PoolDataset":[[39,5,1,"","get_dataset_load_func"],[39,5,1,"","get_report_type"]],"seismicrna.pool.main":[[39,1,1,"","pool_samples"],[39,1,1,"","run"]],"seismicrna.pool.report":[[39,2,1,"","PoolReport"]],"seismicrna.pool.report.PoolReport":[[39,5,1,"","auto_fields"],[39,5,1,"","fields"],[39,5,1,"","file_seg_type"],[39,5,1,"","path_segs"]],"seismicrna.relate":[[41,0,0,"-","aux"],[40,0,0,"-","batch"],[43,0,0,"-","c"],[40,0,0,"-","data"],[40,0,0,"-","io"],[40,0,0,"-","main"],[44,0,0,"-","py"],[40,0,0,"-","report"],[40,0,0,"-","sam"],[40,0,0,"-","sim"],[46,0,0,"-","tests"],[40,0,0,"-","write"]],"seismicrna.relate.aux":[[41,0,0,"-","cigarop"],[41,0,0,"-","human"],[41,0,0,"-","infer"],[41,0,0,"-","iterread"],[41,0,0,"-","iterrel"],[42,0,0,"-","tests"]],"seismicrna.relate.aux.cigarop":[[41,2,1,"","CigarOp"],[41,1,1,"","count_cigar_muts"],[41,1,1,"","count_cigar_read"],[41,1,1,"","count_cigar_ref"],[41,1,1,"","find_cigar_op_pos"],[41,1,1,"","op_is_mutation"]],"seismicrna.relate.aux.cigarop.CigarOp":[[41,5,1,"","__str__"],[41,5,1,"","lengthen"],[41,4,1,"","op"]],"seismicrna.relate.aux.human":[[41,1,1,"","humanize_relvec"]],"seismicrna.relate.aux.infer":[[41,1,1,"","infer_read"]],"seismicrna.relate.aux.iterread":[[41,1,1,"","iter_alignments"],[41,1,1,"","ref_to_alignments"]],"seismicrna.relate.aux.iterrel":[[41,1,1,"","iter_relvecs_all"],[41,1,1,"","iter_relvecs_q53"]],"seismicrna.relate.aux.tests":[[42,0,0,"-","cigarop_test"],[42,0,0,"-","infer_test"],[42,0,0,"-","iterrel_test"]],"seismicrna.relate.aux.tests.cigarop_test":[[42,2,1,"","TestCigarOp"],[42,2,1,"","TestCountCigarMuts"],[42,2,1,"","TestFindCigarOpPos"]],"seismicrna.relate.aux.tests.cigarop_test.TestCigarOp":[[42,3,1,"","ops"],[42,5,1,"","test_cigar_init_invalid"],[42,5,1,"","test_cigar_init_valid"],[42,5,1,"","test_cigar_lengthen"],[42,5,1,"","test_cigar_str"]],"seismicrna.relate.aux.tests.cigarop_test.TestCountCigarMuts":[[42,5,1,"","test_cigar_match_subst_valid"]],"seismicrna.relate.aux.tests.cigarop_test.TestFindCigarOpPos":[[42,5,1,"","test_cigar_m_aln_valid"],[42,5,1,"","test_cigar_m_del_valid"],[42,5,1,"","test_cigar_m_ins_valid"],[42,5,1,"","test_cigar_m_mat_valid"],[42,5,1,"","test_cigar_m_scl_valid"],[42,5,1,"","test_cigar_m_sub_valid"],[42,5,1,"","test_cigar_xeq_aln_valid"],[42,5,1,"","test_cigar_xeq_del_valid"],[42,5,1,"","test_cigar_xeq_ins_valid"],[42,5,1,"","test_cigar_xeq_mat_valid"],[42,5,1,"","test_cigar_xeq_scl_valid"],[42,5,1,"","test_cigar_xeq_sub_valid"]],"seismicrna.relate.aux.tests.infer_test":[[42,2,1,"","TestInferRead"]],"seismicrna.relate.aux.tests.infer_test.TestInferRead":[[42,5,1,"","assert_equal"],[42,5,1,"","assert_raise"],[42,5,1,"","test_all_match"],[42,5,1,"","test_all_match_n"],[42,5,1,"","test_delete_invalid"],[42,5,1,"","test_delete_valid"],[42,5,1,"","test_insert_bare_invalid"],[42,5,1,"","test_insert_dangling_3_invalid"],[42,5,1,"","test_insert_dangling_5_invalid"],[42,5,1,"","test_insert_deletion_invalid"],[42,5,1,"","test_insert_end3_invalid"],[42,5,1,"","test_insert_end5_invalid"],[42,5,1,"","test_insert_non_match_valid"],[42,5,1,"","test_insert_valid"],[42,5,1,"","test_low_qual_valid"],[42,5,1,"","test_nocov_valid"],[42,5,1,"","test_subst_invalid"],[42,5,1,"","test_subst_valid"]],"seismicrna.relate.aux.tests.iterrel_test":[[42,2,1,"","TestIterRelvecsAll"],[42,2,1,"","TestIterRelvecsQ53"]],"seismicrna.relate.aux.tests.iterrel_test.TestIterRelvecsAll":[[42,5,1,"","assert_equal"],[42,5,1,"","test_length_1"],[42,5,1,"","test_length_2"],[42,5,1,"","test_length_3"]],"seismicrna.relate.aux.tests.iterrel_test.TestIterRelvecsQ53":[[42,5,1,"","list_rels"],[42,5,1,"","test_a"],[42,5,1,"","test_aa"],[42,5,1,"","test_agg"],[42,5,1,"","test_c"],[42,5,1,"","test_g"],[42,5,1,"","test_low_qual"],[42,5,1,"","test_low_qual_invalid"],[42,5,1,"","test_n"],[42,5,1,"","test_t"],[42,5,1,"","test_type"],[42,5,1,"","test_xaax"]],"seismicrna.relate.batch":[[40,2,1,"","QnamesBatch"],[40,2,1,"","RelateBatch"],[40,2,1,"","RelateReflenBatch"],[40,2,1,"","RelateRefseqBatch"]],"seismicrna.relate.batch.QnamesBatch":[[40,4,1,"","num_reads"]],"seismicrna.relate.batch.RelateBatch":[[40,4,1,"","num_reads"],[40,4,1,"","pos_nums"]],"seismicrna.relate.data":[[40,2,1,"","RelateDataset"]],"seismicrna.relate.data.RelateDataset":[[40,5,1,"","get_batch"],[40,5,1,"","get_batch_type"],[40,5,1,"","get_report_type"],[40,4,1,"","pattern"]],"seismicrna.relate.io":[[40,2,1,"","QnamesBatchIO"],[40,2,1,"","RelateBatchIO"],[40,2,1,"","RelateIO"],[40,1,1,"","from_reads"]],"seismicrna.relate.io.QnamesBatchIO":[[40,5,1,"","file_seg_type"]],"seismicrna.relate.io.RelateBatchIO":[[40,5,1,"","file_seg_type"]],"seismicrna.relate.io.RelateIO":[[40,5,1,"","auto_fields"]],"seismicrna.relate.main":[[40,1,1,"","run"]],"seismicrna.relate.py":[[44,0,0,"-","ambrel"],[44,0,0,"-","cigar"],[44,0,0,"-","encode"],[44,0,0,"-","error"],[44,0,0,"-","relate"],[45,0,0,"-","tests"]],"seismicrna.relate.py.ambrel":[[44,2,1,"","Deletion"],[44,2,1,"","Indel"],[44,2,1,"","Insertion"],[44,1,1,"","find_ambrels"],[44,1,1,"","sweep_indels"]],"seismicrna.relate.py.ambrel.Deletion":[[44,4,1,"","rank"]],"seismicrna.relate.py.ambrel.Indel":[[44,4,1,"","del_pos3"],[44,4,1,"","del_pos5"],[44,4,1,"","ins_pos"],[44,4,1,"","rank"],[44,5,1,"","reset"],[44,5,1,"","step_del_pos"],[44,5,1,"","sweep"],[44,4,1,"","tunneled"]],"seismicrna.relate.py.ambrel.Insertion":[[44,4,1,"","rank"],[44,5,1,"","stamp"]],"seismicrna.relate.py.cigar":[[44,1,1,"","op_consumes_read"],[44,1,1,"","op_consumes_ref"],[44,1,1,"","parse_cigar"]],"seismicrna.relate.py.encode":[[44,1,1,"","encode_match"],[44,1,1,"","encode_relate"]],"seismicrna.relate.py.error":[[44,6,1,"","RelateError"],[44,6,1,"","RelateNotImplementedError"],[44,6,1,"","RelateValueError"]],"seismicrna.relate.py.relate":[[44,2,1,"","SamFlag"],[44,2,1,"","SamRead"],[44,1,1,"","find_rels_line"]],"seismicrna.relate.py.relate.SamFlag":[[44,3,1,"","first"],[44,3,1,"","flag"],[44,3,1,"","paired"],[44,3,1,"","rev"],[44,3,1,"","second"]],"seismicrna.relate.py.relate.SamRead":[[44,3,1,"","MIN_FIELDS"],[44,3,1,"","cigar"],[44,3,1,"","flag"],[44,3,1,"","mapq"],[44,3,1,"","pos"],[44,3,1,"","qname"],[44,3,1,"","qual"],[44,3,1,"","rname"],[44,3,1,"","seq"]],"seismicrna.relate.py.tests":[[45,0,0,"-","ambrel_test"],[45,0,0,"-","cigar_test"],[45,0,0,"-","encode_test"],[45,0,0,"-","relate_test"]],"seismicrna.relate.py.tests.cigar_test":[[45,2,1,"","TestParseCigar"]],"seismicrna.relate.py.tests.cigar_test.TestParseCigar":[[45,5,1,"","test_cigar_align_valid"],[45,5,1,"","test_cigar_match_subst_valid"]],"seismicrna.relate.py.tests.encode_test":[[45,2,1,"","TestEncodeMatch"],[45,2,1,"","TestEncodeRelate"]],"seismicrna.relate.py.tests.encode_test.TestEncodeMatch":[[45,5,1,"","test_encode_match_hi_qual"],[45,5,1,"","test_encode_match_lo_qual"]],"seismicrna.relate.py.tests.encode_test.TestEncodeRelate":[[45,5,1,"","test_encode_relate_hi_qual"],[45,5,1,"","test_encode_relate_lo_qual"]],"seismicrna.relate.py.tests.relate_test":[[45,2,1,"","TestMergeRels"],[45,2,1,"","TestRelateRelateLineAmbrel"]],"seismicrna.relate.py.tests.relate_test.TestMergeRels":[[45,5,1,"","test_both_blank"],[45,5,1,"","test_both_reads"],[45,5,1,"","test_empty"],[45,5,1,"","test_read1"],[45,5,1,"","test_read2"]],"seismicrna.relate.py.tests.relate_test.TestRelateRelateLineAmbrel":[[45,3,1,"","MAPQ"],[45,5,1,"","iter_cases"],[45,5,1,"","relate"],[45,5,1,"","test_aaaa_0ins"],[45,5,1,"","test_aaaaaa_0ins"],[45,5,1,"","test_aacc_1ins"],[45,5,1,"","test_acgt_1ins"]],"seismicrna.relate.report":[[40,2,1,"","RelateReport"],[40,1,1,"","refseq_file_auto_fields"],[40,1,1,"","refseq_file_path"],[40,1,1,"","refseq_file_seg_types"]],"seismicrna.relate.report.RelateReport":[[40,5,1,"","fields"],[40,5,1,"","file_seg_type"],[40,5,1,"","refseq_file"]],"seismicrna.relate.sam":[[40,2,1,"","XamViewer"],[40,1,1,"","read_name"]],"seismicrna.relate.sam.XamViewer":[[40,5,1,"","create_temp_sam"],[40,5,1,"","delete_temp_sam"],[40,4,1,"","flagstats"],[40,4,1,"","indexes"],[40,5,1,"","iter_records"],[40,4,1,"","n_reads"],[40,5,1,"","open_temp_sam"],[40,4,1,"","paired"],[40,4,1,"","ref"],[40,4,1,"","sample"],[40,4,1,"","temp_sam_path"]],"seismicrna.relate.sim":[[40,1,1,"","choose_clusters"],[40,1,1,"","generate_batch"],[40,1,1,"","generate_batches"],[40,1,1,"","index_to_refseq_pos"],[40,1,1,"","simulate_batch"],[40,1,1,"","simulate_p_clust"],[40,1,1,"","simulate_p_ends"],[40,1,1,"","simulate_p_mut"],[40,1,1,"","simulate_qnames_batch"],[40,1,1,"","simulate_read_name"],[40,1,1,"","simulate_relate"],[40,1,1,"","simulate_relate_batch"],[40,1,1,"","sub_options"]],"seismicrna.relate.tests":[[46,0,0,"-","sim_test"]],"seismicrna.relate.tests.sim_test":[[46,2,1,"","TestChooseClusters"],[46,2,1,"","TestSimulateRelate"],[46,2,1,"","TestSimulateRelateBatch"],[46,2,1,"","TestSubOptions"]],"seismicrna.relate.tests.sim_test.TestChooseClusters":[[46,5,1,"","test_1_cluster"],[46,5,1,"","test_2_clusters"]],"seismicrna.relate.tests.sim_test.TestSimulateRelate":[[46,5,1,"","test_simulate"]],"seismicrna.relate.tests.sim_test.TestSimulateRelateBatch":[[46,5,1,"","test_nmut"]],"seismicrna.relate.tests.sim_test.TestSubOptions":[[46,5,1,"","test_bases"],[46,5,1,"","test_invalid"]],"seismicrna.relate.write":[[40,2,1,"","RelationWriter"],[40,1,1,"","generate_batch"],[40,1,1,"","get_reads_per_batch"],[40,1,1,"","mib_to_bytes"],[40,1,1,"","write_all"],[40,1,1,"","write_one"]],"seismicrna.relate.write.RelationWriter":[[40,4,1,"","ref"],[40,4,1,"","sample"],[40,5,1,"","write"]],"seismicrna.renumct":[[47,0,0,"-","main"]],"seismicrna.renumct.main":[[47,1,1,"","run"]],"seismicrna.sim":[[49,0,0,"-","tests"]],"seismicrna.table":[[50,0,0,"-","base"],[50,0,0,"-","calc"],[50,0,0,"-","load"],[50,0,0,"-","main"],[50,0,0,"-","write"]],"seismicrna.table.base":[[50,2,1,"","AvgTable"],[50,2,1,"","ClustFreqTable"],[50,2,1,"","ClustPosTable"],[50,2,1,"","ClustReadTable"],[50,2,1,"","ClustTable"],[50,2,1,"","FreqTable"],[50,2,1,"","MaskPosTable"],[50,2,1,"","MaskReadTable"],[50,2,1,"","MaskTable"],[50,2,1,"","PosTable"],[50,2,1,"","ProfilePosTable"],[50,2,1,"","ReadTable"],[50,2,1,"","RelPosTable"],[50,2,1,"","RelReadTable"],[50,2,1,"","RelTable"],[50,2,1,"","RelTypeTable"],[50,2,1,"","Table"],[50,1,1,"","get_rel_name"]],"seismicrna.table.base.AvgTable":[[50,5,1,"","header_type"]],"seismicrna.table.base.ClustFreqTable":[[50,5,1,"","header_type"],[50,5,1,"","index_depth"],[50,5,1,"","kind"]],"seismicrna.table.base.ClustTable":[[50,5,1,"","header_type"],[50,5,1,"","kind"]],"seismicrna.table.base.FreqTable":[[50,5,1,"","by_read"],[50,4,1,"","data"],[50,5,1,"","path_segs"],[50,5,1,"","series"]],"seismicrna.table.base.MaskTable":[[50,5,1,"","kind"]],"seismicrna.table.base.PosTable":[[50,3,1,"","MASK"],[50,5,1,"","by_read"],[50,5,1,"","ci_count"],[50,5,1,"","ci_ratio"],[50,4,1,"","end3"],[50,4,1,"","end5"],[50,5,1,"","index_depth"],[50,5,1,"","iter_profiles"],[50,4,1,"","masked_bool"],[50,5,1,"","path_segs"],[50,4,1,"","range"],[50,4,1,"","range_int"],[50,5,1,"","resample"],[50,4,1,"","section"],[50,4,1,"","seq"],[50,4,1,"","unmasked"],[50,4,1,"","unmasked_bool"],[50,4,1,"","unmasked_int"]],"seismicrna.table.base.ReadTable":[[50,5,1,"","by_read"],[50,5,1,"","index_depth"],[50,5,1,"","path_segs"],[50,4,1,"","reads"]],"seismicrna.table.base.RelTable":[[50,5,1,"","kind"]],"seismicrna.table.base.RelTypeTable":[[50,4,1,"","data"],[50,5,1,"","fetch_count"],[50,5,1,"","fetch_ratio"],[50,5,1,"","series"]],"seismicrna.table.base.Table":[[50,5,1,"","by_read"],[50,4,1,"","data"],[50,5,1,"","ext"],[50,5,1,"","gzipped"],[50,4,1,"","header"],[50,5,1,"","header_depth"],[50,5,1,"","header_rows"],[50,5,1,"","header_type"],[50,5,1,"","index_cols"],[50,5,1,"","index_depth"],[50,5,1,"","kind"],[50,4,1,"","path"],[50,4,1,"","path_fields"],[50,5,1,"","path_segs"],[50,4,1,"","ref"],[50,4,1,"","sample"],[50,4,1,"","sect"],[50,5,1,"","series"],[50,4,1,"","top"]],"seismicrna.table.calc":[[50,2,1,"","AvgTabulator"],[50,2,1,"","ClustTabulator"],[50,2,1,"","FullTabulator"],[50,2,1,"","MaskTabulator"],[50,2,1,"","PartialTabulator"],[50,2,1,"","RelateTabulator"],[50,2,1,"","Tabulator"],[50,1,1,"","adjust_counts"],[50,1,1,"","all_patterns"],[50,1,1,"","tabulate_loader"]],"seismicrna.table.calc.AvgTabulator":[[50,4,1,"","max_order"]],"seismicrna.table.calc.ClustTabulator":[[50,4,1,"","clust_header"],[50,4,1,"","max_order"],[50,4,1,"","table_per_clust"]],"seismicrna.table.calc.FullTabulator":[[50,5,1,"","get_null_value"]],"seismicrna.table.calc.PartialTabulator":[[50,5,1,"","get_null_value"],[50,4,1,"","table_per_pos"]],"seismicrna.table.calc.Tabulator":[[50,5,1,"","get_null_value"],[50,4,1,"","max_order"],[50,4,1,"","p_ends_given_noclose"],[50,4,1,"","pos_header"],[50,4,1,"","read_header"],[50,4,1,"","ref"],[50,4,1,"","refseq"],[50,4,1,"","sample"],[50,4,1,"","section"],[50,4,1,"","table_per_pos"],[50,4,1,"","table_per_read"],[50,4,1,"","top"]],"seismicrna.table.load":[[50,2,1,"","ClustFreqTableLoader"],[50,2,1,"","ClustPosTableLoader"],[50,2,1,"","ClustReadTableLoader"],[50,2,1,"","MaskPosTableLoader"],[50,2,1,"","MaskReadTableLoader"],[50,2,1,"","PosTableLoader"],[50,2,1,"","ReadTableLoader"],[50,2,1,"","RelPosTableLoader"],[50,2,1,"","RelReadTableLoader"],[50,2,1,"","RelTypeTableLoader"],[50,2,1,"","TableLoader"],[50,1,1,"","find_all_tables"],[50,1,1,"","find_pos_tables"],[50,1,1,"","find_read_tables"],[50,1,1,"","find_tables"],[50,1,1,"","load_all_tables"],[50,1,1,"","load_any_table"],[50,1,1,"","load_pos_table"],[50,1,1,"","load_pos_tables"],[50,1,1,"","load_read_table"],[50,1,1,"","load_read_tables"],[50,1,1,"","load_table"],[50,1,1,"","load_tables"]],"seismicrna.table.load.TableLoader":[[50,4,1,"","data"],[50,4,1,"","ref"],[50,4,1,"","sample"],[50,4,1,"","sect"],[50,4,1,"","top"]],"seismicrna.table.main":[[50,1,1,"","run"]],"seismicrna.table.write":[[50,2,1,"","ClustFreqTableWriter"],[50,2,1,"","ClustPosTableWriter"],[50,2,1,"","ClustReadTableWriter"],[50,2,1,"","MaskPosTableWriter"],[50,2,1,"","MaskReadTableWriter"],[50,2,1,"","PosTableWriter"],[50,2,1,"","ReadTableWriter"],[50,2,1,"","RelPosTableWriter"],[50,2,1,"","RelReadTableWriter"],[50,2,1,"","TableWriter"],[50,1,1,"","get_tabulator_writer_types"],[50,1,1,"","get_tabulator_writers"],[50,1,1,"","write"]],"seismicrna.table.write.ClustFreqTableWriter":[[50,4,1,"","data"]],"seismicrna.table.write.PosTableWriter":[[50,4,1,"","data"]],"seismicrna.table.write.ReadTableWriter":[[50,4,1,"","data"]],"seismicrna.table.write.TableWriter":[[50,4,1,"","columns"],[50,4,1,"","ref"],[50,4,1,"","sample"],[50,4,1,"","sect"],[50,4,1,"","top"],[50,5,1,"","write"]],"seismicrna.test":[[51,0,0,"-","main"]],"seismicrna.test.main":[[51,1,1,"","run"]],"seismicrna.wf":[[52,0,0,"-","main"],[52,0,0,"-","sim"]],"seismicrna.wf.main":[[52,1,1,"","as_tuple_str"],[52,1,1,"","run"]],"seismicrna.wf.sim":[[52,1,1,"","sim_whole"]],seismicrna:[[8,0,0,"-","align"],[10,0,0,"-","cleanfa"],[11,0,0,"-","cluster"],[13,0,0,"-","core"],[32,0,0,"-","demult"],[33,0,0,"-","export"],[34,0,0,"-","fold"],[35,0,0,"-","graph"],[36,0,0,"-","join"],[37,0,0,"-","lists"],[7,0,0,"-","main"],[38,0,0,"-","mask"],[39,0,0,"-","pool"],[40,0,0,"-","relate"],[47,0,0,"-","renumct"],[48,0,0,"-","sim"],[50,0,0,"-","table"],[51,0,0,"-","test"],[52,0,0,"-","wf"]]},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","property","Python property"],"5":["py","method","Python method"],"6":["py","exception","Python exception"],"7":["std","cmdoption","program option"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:property","5":"py:method","6":"py:exception","7":"std:cmdoption"},terms:{"0":[5,8,11,13,15,20,21,28,29,30,32,34,37,38,40,41,44,45,50,51,52,53,55,57,58,59,60,61,64,66,67,75,77,78,79,81,82,83,84,89,92,94,96,97,100,104,106,108,109,111],"00":[5,94],"000":97,"0000":0,"00000000":[5,55],"00000001":55,"00000010":55,"00000011":55,"00000100":55,"00001000":55,"0001":[0,20],"00010000":55,"00042715097170304697":89,"0005903400048243549":89,"001":[55,64],"00100000":55,"00100001":5,"0012500543750758389":89,"0016602828354697209":89,"0017164535218205134":89,"002":55,"002887023310345601":89,"003393658868599399":89,"004":55,"007293619411197718":89,"008":55,"01":[5,52,55,78,81,83,92,94],"01000000":55,"010770982726367673":89,"01110001":55,"011638240863466542":89,"016":55,"018827932574530207":89,"02":[55,84],"020":20,"026":78,"03":55,"032":55,"03212678813091909":89,"04":[55,83,93],"05":[83,94,97],"064":55,"08":[55,84,93,97],"08_15":93,"09":[75,82,93,97],"09c4d2b19c4c720bd24b2f432b908cb9":82,"0d8c7e53719d9ba28afab22881d4ce8a":84,"1":[5,8,11,13,15,20,21,22,24,29,30,32,34,35,36,38,40,41,42,44,45,46,50,52,53,55,57,59,61,66,67,73,74,75,76,77,78,79,81,82,84,85,88,91,93,94,96,97,100,103,104,105,106,109,111,113,114],"10":[5,11,13,18,20,32,38,40,52,55,58,64,74,75,77,78,79,82,94,96,104,106,109,111,114],"100":64,"1000":[8,38,40,52,82,96,104],"100000":108,"10000000":55,"10011111":5,"10110001":55,"103":[76,109],"1038":20,"104":76,"104850":78,"10903":57,"11":[5,11,38,40,44,52,53,71,77,83,84,97,109],"11010001":55,"11100001":55,"11111111":55,"113":55,"12":[5,44,78,79,82,84,104,111],"1206":57,"121":104,"123":91,"12605":57,"127":8,"128":[20,55,59],"13":[81,83,84],"130":109,"1323277603f89c04fcb665a34e2790b1":78,"1343":120,"14":84,"148":109,"15":[13,34,52,79,82,93,104],"15d30bd7b2075d51d7147fc5a454ea1a":84,"16":[8,10,11,33,34,36,37,38,39,40,47,50,52,59,71,77,78,81,82,84],"1680be76740c49f0c216574ca61f3ed4":82,"17":[74,77,78,82,97,111],"177":55,"18":[78,81,82],"19":75,"194824b402bced072049a46d8c7effb6":82,"196":89,"197":89,"198":89,"199":89,"1_r1":96,"1_r2":96,"1d":[16,20,21],"1f0277918d971ba2b4096b218ff91514793684a9bc60395c56c7cfcc837b45c4":117,"1s":[55,96],"1st":[26,68,96],"2":[5,8,9,11,13,15,20,26,28,30,35,36,38,40,41,42,45,46,50,52,53,55,57,59,63,73,75,77,78,81,84,85,88,89,91,93,97,103,104,105,106,109,111],"20":[8,13,32,34,40,52,55,71,77,79,93,94,96,97,106],"200":89,"2017":[1,104],"2020":[1,20,97,104],"2022":1,"2023":[1,75,77,78,79,82,84],"2024":[4,81,83,93],"209":55,"2106":57,"21b2f8c6cd976858476cc52297e276b3":78,"22":79,"225":55,"2253":20,"23":78,"2303":57,"2368":76,"2369":76,"240":75,"2411":57,"2468a801a2686bd198bd726cc90ff30f":78,"25":[8,29,40,45,52,55,64,77,81,94,96,106],"2506":57,"255":[55,59],"256":118,"26":[64,82,91],"2613":77,"2695":76,"26_r1":64,"26_r2":64,"272351":82,"277":93,"27eb008e907d48d932626098f4587178":82,"28":[84,97],"289974":82,"29":[77,79],"2_use":93,"2d":[15,20],"2nd":[26,68,96],"2s":96,"3":[4,5,8,9,11,13,15,20,28,29,34,38,41,42,44,52,53,55,57,58,66,73,76,77,81,82,84,85,91,93,96,97,103,104,106,108,109,111,114],"30":[13,64,82,97],"300":[75,78,97],"301334":89,"303045":89,"30496":57,"30558":57,"305746":89,"3073073":78,"3078650":78,"310":[34,52,75,79],"32":50,"33":[8,40,52,64,77,78,96],"34":109,"34554":57,"350":104,"36157068effbcc1ac6d13487b10b2d85":84,"36af6fb7b3e8ab41ac569c5f6547b039":78,"38":97,"38352":57,"39":[77,83,97],"397":82,"398":82,"399":82,"3d":20,"3efe0b5aea70954ff37ced0ce509fc40":78,"3utr":76,"4":[5,8,13,20,52,55,57,58,59,64,77,85,93,96,97,104,109],"40":[13,55,96,97],"400":82,"401":82,"402":82,"403":82,"404":82,"405":82,"406":82,"407":82,"408":82,"409":82,"410":82,"411":82,"412":82,"413":82,"414":82,"415":82,"416":82,"417":82,"4176c9379dfa59a73954469290c90740":78,"418":82,"41825":57,"419":82,"420":82,"421":82,"422":82,"423":82,"424":82,"425":82,"426":82,"4265f976d74f05d6a9bbacb4e4efe443":78,"4294967296":50,"42ae5619577059c555c7f7893aa87739":84,"42babd92a5ffdd13e29441f034a6b167":82,"45":52,"45871":84,"46":[71,79],"47":81,"4be0122fc2d700f7d75f236cf11dcca3":78,"5":[8,11,13,15,20,28,29,34,37,38,41,42,44,47,52,53,55,66,75,76,77,82,85,93,94,96,104,106,109,111],"50":[13,78,94],"51":[81,82],"512":[11,52,78],"52":[78,82],"52949":57,"53":[78,79,82],"54095":57,"55259":57,"555":78,"56":109,"562325":[77,82],"562448":77,"565068":77,"566520":77,"58":64,"58ff4df2fd5fb93e1407328a4dcd8f95":117,"5th":26,"5utr":76,"6":[8,11,26,30,52,55,59,74,77,91,97,109,111],"600":[8,52,77,97,104],"6148481":78,"6158468":78,"63":96,"63_r1":96,"63_r2":96,"64":[40,52,59,96,106],"66":57,"699":78,"6a88a23437d10cdb68e29beebf70abb8":78,"6f2453c2da1733109a9df9c6a9110adbd6cac82fa6fb01f3589cf8720eb65514":117,"6th":26,"7":[59,77,78,89,91,96,97,109],"71":[55,109],"7402":0,"778d808c7d34aa3abf0cfcad1c5eb8a6":78,"8":[5,11,52,55,59,64,96,104,109],"80":55,"8182":0,"81f2ed98056df9611354e0aa3a219971":82,"83":[71,91],"86":109,"89":109,"9":[5,30,52,58,77,84,91,104,109,113],"900":97,"901b083617e6a66df5a68dc03323b791":82,"91":13,"92":13,"93":13,"94":13,"94ba454827b5763892dd244fe897a406":117,"95":[13,20,38,52,79,104,108],"95th":20,"96":13,"98":97,"9f8d6ba42947fb1ee3b9a0b67879e99":82,"9fce126e9740004b832170a288e83be45d702667c62e9bf18712a76464a16b4d":117,"\u03c1":53,"abstract":[8,13,15,18,29,30,35,44,50],"boolean":[11,20,28,29,44],"break":[63,96],"byte":[5,11,13,18,26,40,44,55,58,106],"case":[5,9,12,16,19,21,23,25,26,27,30,31,34,42,45,46,60,73,74,75,76,85,86,88,96,106,109,113],"class":[8,9,10,11,12,13,15,16,17,18,19,21,23,24,25,26,27,28,29,30,31,32,34,35,36,38,39,40,41,42,44,45,46,50],"d\u00fclk":1,"default":[8,10,11,13,14,20,29,33,34,35,36,37,38,39,40,47,50,51,52,55,62,63,64,86,93,96,97,102,103,104,105,106,107,108,109,113],"do":[13,20,26,66,85,86,93,96,99,103,104,105,106,108,109,111,114,115],"export":[7,8,52,53,65,69,90,102,108],"final":[5,93,96],"float":[8,11,13,20,21,28,29,34,35,37,38,40,50,52,74,75,77,78,79,81,82,83,84],"function":[7,8,9,11,13,14,17,20,24,25,26,29,30,34,35,36,38,39,40,42,45,50,51,52,53],"import":[7,8,93,97,100,104],"int":[5,8,10,11,12,13,15,18,20,21,22,24,26,28,29,32,33,34,35,36,37,38,39,40,41,42,44,45,47,50,51,52,58,59,71,73,76,77,78,79,81,82,84],"long":[5,68,96,100,104,106,109,111],"new":[8,10,11,13,14,18,20,25,26,28,29,34,40,47,50,52,53,71,73,74,75,76,85,93,96,100,103,104,105,106,111,114,116,117],"null":50,"public":4,"r\u00b2":53,"return":[8,11,13,14,15,16,17,18,20,21,22,24,25,26,28,29,30,32,33,34,35,36,39,40,42,44,50,97,113],"short":[2,53,68,100,111,114],"static":[9,19,21,29,42,45],"switch":[96,104],"true":[5,8,10,11,13,15,17,18,20,21,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,47,50,52,58,77,82,97],"try":[21,24,96,103,105,111],"while":[20,44,55,66,88,94,96,100,103,105,114],A:[2,4,5,8,9,13,16,20,22,26,28,29,35,38,42,44,52,53,55,58,59,61,62,63,64,66,80,82,85,88,89,93,96,97,103,105,106,109,114],AND:55,AT:[55,109],And:[64,88],As:[5,60,88,93,96,106,117],At:55,Be:85,But:[5,8,9,55,114],By:[86,93,96,108,110],FOR:4,For:[5,8,13,15,20,26,36,41,44,52,53,55,58,59,62,64,67,68,73,76,86,88,91,93,94,96,97,100,103,104,105,106,107,108,109,114],If:[11,13,20,24,25,29,41,44,55,59,63,64,67,85,86,88,91,94,96,97,103,104,105,106,109,111,113,114,115,117],In:[5,8,9,20,55,59,61,62,63,64,73,86,95,96,97,104,106,109,117],Into:114,It:[5,13,20,44,55,60,64,85,93,96,103,105,114],Not:8,OR:55,On:[93,109,113,117],One:[8,44],Or:111,The:[5,8,9,13,16,20,22,24,29,34,35,44,50,55,57,58,59,60,61,62,63,64,66,67,68,71,73,76,85,86,88,91,93,95,96,97,99,100,103,104,105,106,108,109,111,114],Their:[74,75],Then:[5,20,55,93,103,105,113],There:[8,20,64,96,100,106],These:[66,68,96,101,117],To:[5,55,86,93,96,97,99,100,101,103,104,105,106,107,108,109,110,111,114],With:[46,88,96,97],_1_sequenc:64,_1_sequence_001:64,_2_sequenc:64,_2_sequence_001:64,_:[13,25,35],__:[25,35,100],______cc:59,_____agc:59,____aac_:59,___ga:59,___gta__:59,__add__:29,__aga___:59,__bool__:29,__call__:[13,24],__conda_activ:113,__conda_ex:113,__conda_reactiv:113,__eq__:29,__getitem__:29,__hash__:29,__missing__:113,__mul__:29,__repr__:29,__setattr__:13,__str__:41,__unalign:96,__varna:67,__version__:7,__webapp:66,_ca_____:59,_cag____:59,_calc_p_mut_given_span:20,_calc_p_mut_given_span_noclos:21,_calc_p_noclose_given_end:21,_calc_p_nomut_window:21,_deprec:35,_fastqc:96,_find_blank_rang:9,_mate1:64,_mate1_001:64,_mate2:64,_mate2_001:64,_r1:64,_r1_001:64,_r2:64,_r2_001:64,_r:96,_s:58,a13183811fadb0a9906d71a729aee04d:82,a1:[53,96],a2:[53,96],aa:42,aaaa:[5,45],aaaaaa:45,aab:103,aac:109,aacc:45,aacyhm7m5:57,ab:103,abc:[8,11,13,15,18,29,35,36,38,40,44,50,97],abil:[91,97],abl:[85,97],abnorm:93,abort:93,about:[14,35,55,66,72,88,90,93,97,100,106,110,111],abov:[5,20,52,53,55,85,91,111],absolut:13,ac:111,acccgtaactatcg:76,accept:[13,29,60,61,62,63,64,66,67,68,71,88,96],accompani:96,accomplish:[100,114],accord:[26,41,117],accum:15,accum_fit:15,accum_per_po:15,accumul:[15,40],accur:[20,96],accuraci:106,acgt:[8,9,26,45,88],acgtdi:[26,89],achiev:55,acid:[5,29,96],across:20,action1:35,action2:35,action:[17,35],action_sample1:35,action_sample2:35,activ:[93,96,104,106,112,113,116],actt:[8,9],actual:[11,13,15,20,34,38,40,42,44,52,53,55,96,97,104,106,113],ad:[13,64,90,97],adapt:[8,52,53,77],add:[11,20,29,53,55,90,96,97,99,104,110,115],add_mask:29,add_ord:11,addclust:[11,85,97],addit:[20,29,35,64,66,71,74,75,85,96,101,108],addition:[76,86,108],adenosin:1,adjac:9,adjust:[20,50,85,96,97,100,106],adjust_count:50,advantag:[70,72],advic:[96,108],advis:114,aff9a30f5949c7a8b8ae437922c39f90:117,affect:[93,96],aforement:114,after:[8,13,34,40,52,53,55,61,62,63,64,67,73,77,85,86,88,92,93,96,97,100,106,108,111,113,114],ag:[8,9,26,104],against:[52,53,96],agatcggaagagc:[8,52,77,96],agg:42,agre:[13,28,55],aim:106,al:[1,20,97,104],alber:0,albericdelajart:0,algebra:114,algo:106,algorithm:[2,11,20,44,55,58,97,106,110,114,117],alia:29,align:[7,13,20,22,32,40,42,45,52,55,59,63,64,65,66,69,80,90,102,104,108,111],align_sampl:8,alignrefreport:8,alignreport:8,alignsamplereport:8,all:[5,8,9,10,11,13,14,15,20,26,28,29,30,33,34,35,36,37,38,39,40,42,44,45,46,47,50,51,52,53,55,59,60,63,64,66,70,72,85,86,90,91,92,93,94,96,97,99,100,102,103,104,105,106,107,109,111,113,114],all_contiguous_read:15,all_pattern:50,all_po:[33,52],allan:0,allc:26,allevi:114,allow:[8,13,15,24,29,30,44,52,53,63,77,97,100,109],allow_dupl:13,allow_gap:29,allow_zero:13,allreadbatch:[15,40],along:[4,53,60,88],alongsid:[63,96],alph:29,alphabet:[29,63],alphanumer:63,alreadi:[8,10,11,13,28,33,34,36,37,38,39,40,47,50,52,53,90,92,103,105,106,110,113,114,115],also:[13,14,34,55,63,64,68,88,91,93,96,97,100,103,104,105,106,111,114],altern:[8,9,11,44,53,64,76,90,100,102,104],although:[9,13,55,96,104],alwai:[24,64,85,96,97,104,117],ambigu:[5,40,41,42,44,52,53,56,88,104],ambrel:[40,44,52,53,106],amid:108,among:[13,20,29,35,50,96,104,114],amount:[52,53,68,106],amplicon:[29,76,100,109],an:[1,5,8,9,11,13,15,16,17,18,20,22,24,26,28,29,30,34,35,40,41,42,44,50,52,53,55,59,60,63,64,70,72,73,76,77,86,88,90,96,97,103,104,105,106,109,110,111,113,114,115],anaa:5,anaconda:114,analag:44,analys:104,analysi:[85,106],analyz:88,ani:[4,5,8,11,13,14,17,18,20,24,26,28,29,33,34,35,36,38,39,40,44,50,52,53,55,59,60,61,63,64,79,85,86,88,89,91,93,96,97,99,100,103,104,105,106,107,108,109,113,115,117],annot:14,anoth:[8,17,26,29,35,62,64,88,96,114],ansi:13,ansi_cod:13,ansicod:13,answer:113,any_nan:20,anyth:97,anywher:[100,106],api:14,app:[33,52,53,66,90,102],appear:[20,35,93,96,103,104,105,117],append:85,append_bool:32,append_fil:32,appli:[35,52,53,109],applic:[94,100],apply_mask:38,approach:[20,85],appropri:[13,25,96],approxim:20,ar:[5,8,9,11,13,15,16,20,21,22,24,26,28,29,30,34,35,38,40,41,42,44,50,52,53,55,57,59,60,61,63,64,66,68,70,72,73,74,75,76,85,86,88,89,91,95,96,97,100,101,103,105,106,107,108,109,111,113,114,115,117],arbitrari:[5,20,29,38,52,53,63,73,74,75,99,104],arbitrarili:[5,38],area:[28,101],aren:[103,105],arg:[7,8,13,17,18,24,25,33,35,36,38,40,41,51],argment:14,args_to_cmd:17,argument:[8,13,14,17,20,24,28,35,44,50,88,91,108,110],around:34,arr1:15,arr2:15,arrai:[5,13,15,16,20,21,29,30,44,57,59,108],array1:15,array2:15,arrow:26,artifact:[85,96,97,104,109],artifactu:96,aruda:0,as_fanc:26,as_list_of_tupl:24,as_match:26,as_plain:26,as_sam:[8,9],as_tuple_str:52,ascii:[5,8,22,44,64],ask:115,aso1:75,aso2:75,aso:75,assembl:13,assert:42,assert_equ:42,assert_rais:42,assign:[11,20,29,34,47,53,55,93,106,109],assign_clust:11,assist:80,associ:[13,60],assum:[8,9,20,35,86,89,91,106,111],assume_nest:28,assumpt:20,atat:[8,9],atc:55,atcctg:55,atcgtcatgtgt:64,atctg:55,attempt:[8,11,20,52,53,77,96,103,105],attr:11,attribut:[5,7,11,13,57,58,59,88,103,105],auc:[28,35,53,101],aucrol:[35,101],auth:[11,14,40],authent:117,author:[3,110],auto:14,auto_default:14,auto_docstr:14,auto_field:[8,11,18,34,36,38,39,40],auto_refram:20,auto_remove_nan:20,auto_removes_nan:20,autofil:[52,53],autom:114,automat:[8,11,13,14,18,20,34,36,38,39,40,85,86,96,102,104,113,117],aux:[7,40],auxiliari:40,av1:114,avail:[58,111,114],averag:[13,50,66,100],avgtabl:50,avgtabul:50,avoid:[8,55,63,96,109,115],ax:[20,28],axi:[20,35],azur:[64,106],b1:55,b723dc6f19f93bca0827155cca36965d:82,b8aafa415ba94b6d8d34e3433316a2a3:78,b:[5,20,26,58,103,105,106,114],babraham:111,background:[6,90,96],backup:18,backup_dir:19,bam:[8,13,22,40,52,53,65,69,77,96,106,108],bam_out:8,bar:[35,53,87,90,100,101,104],barcod:[32,52,53,74,90,96,102],barcode3:74,barcode5:74,barcode_end:[32,52,53],barcode_start:[32,52,53],bare:42,base:[1,5,8,9,10,11,12,13,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,45,46,50,52,53,59,61,62,64,67,76,79,82,85,89,100,106],base_pos_index:15,bash_profil:113,basic:[30,96],batch:[7,11,13,18,38,39,40,52,53,54,56,60,78,82,84,85,90],batch_num:[11,13,40],batch_read_index:15,batch_siz:[40,52,53],batch_to_uniq:11,batch_typ:13,batchedrefseqreport:[13,40],batchedreport:[11,13,38,40],bayesian:[11,78,97],bc18c08eca71f48d57e0119392042cc3:82,bdhkmrsvwy:86,becaus:[5,9,10,20,44,47,53,55,63,64,70,72,85,86,88,93,96,97,103,104,105,106,109,113,114],becom:[5,114],beebe1e830d72da7296aeb62a29e057b:82,been:[20,50,60,96,97,104,108,111,114],befor:[8,13,52,53,62,64,77,85,96,97],began:[11,13,38,77,78,79,81,82,83,84,93],begin:[5,13,20,53,61,64,66,85,86,97,106,120],behavior:[13,104,109,115],behind:86,being:[24,35,36,64,76,85,92,106,113],belong:86,below:[9,20,55,97,100,104,115,117],benefit:[90,106],bernoulli:20,besid:86,best:[5,11,88,96,97],best_ord:11,beta:50,better:[8,9,96,97],between:[11,20,22,26,28,29,34,38,40,41,44,50,52,53,56,59,67,73,79,82,90,93,94,97,100,101,102],beyond:66,bia:[20,50,104],bias:104,bic:[11,85,97],bin:[35,52,53,111,113],binari:[5,13,41,55,68,104],bind:109,binomi:50,bio:111,bioconda:111,bioinformat:111,biolog:[20,109],bit:[5,11,20,29,38,50,55,78,97,104],bitwis:55,blank:[30,52,53,55,63,93],blast:96,block:24,blot:93,blue:13,bnum:60,bodi:86,bohn:1,bold:13,bonu:8,bonus:9,bool:[5,8,10,11,13,15,17,18,20,21,22,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,47,50,52,58,77,79,82],borrow:114,both:[9,13,17,24,29,42,55,64,70,72,77,88,91,96,103,105,106,108,109,114,117],bottom:93,bound:[35,50],bowti:[8,63,111],bowtie2:[8,9,52,53,77,96,111],bowtie2_build_cmd:8,bowtie2_cmd:8,bowtie2_flag:8,bowtie2_index:8,bowtie2_input:8,box:100,bracket:[28,34,65,69],branch:[77,78,79,81,82,83,84],brick:60,brickl:[18,65,69,97,104,106],brickleio:18,brief:[100,114],broadcast:[20,21],broadcast_regex:21,broken:115,brotli:[11,18,38,40,52,53,60],brotli_level:[11,18,38,40,52,53],browser:117,bt2:[53,64,96],bt2_:[8,52,53],bt2_contain:[8,52],bt2_d:[8,52,53],bt2_discord:[8,52],bt2_dovetail:[8,52],bt2_dpad:[8,52,53],bt2_gbar:[8,52,53],bt2_i:[8,52,53],bt2_l:[8,52,53],bt2_local:[8,52],bt2_mix:[8,52],bt2_orient:[8,52,53],bt2_r:[8,52,53],bt2_score_min_e2:[8,52,53],bt2_score_min_loc:[8,52,53],bt2_un:[8,52],bt2_x:[8,52,53],btype:[13,18,60],buffer:75,bug:[13,20,64,96,110],build:[8,11,13,18,22,29,63],build_path:18,builddir:13,buildpar:13,built:[93,96,114],builtin:13,button:117,bv1:114,bv2:114,by_read:50,bytes_per_batch:40,c2c0ee505c970d55d2e17e8a2d8ba48c:82,c2e57a06bcde2a3dd99f8ed9ce7c4947:78,c5cec619b953ff80609f172a04abf6ec:82,c76bc505a886475d93743202a6d61461:78,c:[5,7,8,9,26,29,35,40,42,53,55,61,62,63,64,66,82,88,89,93,104,106,109,111,114],c_:59,cacgagcgatag:64,cach:[13,58],cacodyl:75,caga:5,cagattcgaa:5,cagattcgaaaa:5,cagn:5,cagnttcgan:[5,58],cagnttcganaa:5,calc:50,calc_coeff_determ:20,calc_dt_minut:13,calc_mean_pearson:11,calc_nrmsd:20,calc_nrmsd_group:11,calc_p_clust:20,calc_p_clust_given_noclos:20,calc_p_ends_given_noclos:[20,21],calc_p_ends_observ:20,calc_p_noclos:20,calc_p_noclose_given_end:20,calc_param:20,calc_params_observ:20,calc_pearson:20,calc_pearson_group:11,calc_quantil:20,calc_rank:20,calc_rectangluar_sum:20,calc_rm:20,calc_rms_nrmsd:11,calc_rmsd:20,calc_rmsd_group:11,calc_spanning_sum_slow:21,calc_spearman:20,calc_taken:13,calc_tru:21,calcrectangularsum:21,calcul:[11,13,20,21,55,97,104,106],call:[7,8,13,14,17,24,26,40,41,42,44,51,52,53,64,68,97,103,104,106,114],callabl:[8,11,13,14,17,20,24,34,35,36,38,39,40,50],came:[67,96,100,103,104],can:[4,7,8,13,16,17,20,21,24,29,30,34,35,42,53,59,60,61,62,63,64,67,70,71,72,73,74,75,76,85,86,87,88,89,91,92,93,94,95,97,99,100,101,102,103,104,105,106,107,108,109,111,114,117],cannot:[42,55,68,85,86,91,96,117],canva:100,cap:[20,94],capit:93,care:[85,88],carefulli:96,cast:[13,63],cast_path:13,caus:[9,13,20,34,55,63,93,96,104,106,114],caution:[52,53],cautious:[10,47,53],caveat:97,cd:[26,76,104],ceas:97,cell:[75,104],central:13,certain:[70,88,92],cgroup:[35,52,53],cgroup_tabl:35,chage:28,chain:[13,38],chaineddataset:13,chainedmutsdataset:[11,13,36,38],chanc:97,chang:[11,13,52,53,86,96,97,100,113,114],charact:[5,13,22,26,29,30,41,44,61,63,86,93,96,106],characterist:[28,35,101],chartreus:68,check:[8,13,17,20,21,42,97,103,104,105,106,111,112,115,117],check_all_don:32,check_don:32,check_exist:32,check_fqs_xam:8,check_set:32,check_typ:18,check_valu:20,checksum:[11,13,18,40,78,82,84,118],checksum_kei:38,chemcial:104,chemic:[20,75,104],chicken:97,choic:[5,96,117],choos:[40,50,91,94,100,103,104,105,111],choose_clust:40,chose:94,chosen:[20,96,111],chunk:5,ci_count:50,ci_ratio:50,cigar:[8,41,42,44,45,96],cigar_str:[41,44],cigar_test:45,cigarop:[41,42],cigarop_test:42,circumst:96,citat:0,cl:26,classmethod:[8,11,13,18,21,26,28,29,34,35,36,38,39,40,50],clean:[7,53,90,96,106,110],clean_fasta:10,cleaner:[10,86],cleanfa:[7,86],clearli:55,cli:[7,8,14,51],click:[13,14,35,100,113,115,117],clip3:38,clip5:38,clip:[20,32,42,52,53],close:[9,15,20,21,68,82,104,113],closer:104,clust1:35,clust2:35,clust:[13,33,35,36,50,53,66,78,89,99,100,103,107],clust_head:50,clustbatchio:97,cluster:[7,13,20,36,40,46,50,52,60,69,72,80,90,91,93,96,99,102,108,110],cluster_choic:40,clusterbatchio:11,clusterio:11,clustermutsbatch:11,clustermutsdataset:[11,36,50],clusterreadbatch:11,clusterreaddataset:11,clusterreport:11,clustfreqt:[33,50],clustfreqtableload:50,clustfreqtablewrit:50,clusthead:13,clustpost:[34,50],clustpostableload:50,clustpostablewrit:50,clustreadt:50,clustreadtableload:50,clustreadtablewrit:50,clusttabl:50,clusttabul:50,clutter:96,cmap:35,cmap_class:35,cmd:[17,113],cmds_to_pip:17,cmds_to_seri:17,cmds_to_subshel:17,code:[5,13,22,26,27,29,35,42,44,45,50,59,64,65,69,86,88,100,104,113,114],code_test:27,codestr:35,coeffici:[20,21,53,104],coexist:112,col:11,col_index:35,col_titl:35,collect:[11,29,44,55,68,106,114],color:[13,28,35,65,69,93,96],colorformatt:13,colormap:35,colormapgraph:35,column:[13,20,28,29,35,50,55,73,88,109],com:[0,117,120],combin:[14,20,30,39,91,96,103,105],combine_metadata:33,come:[11,35,41,64,88,90,97],comma:[9,70,72],command:[7,13,17,18,35,40,51,60,61,62,63,64,70,71,76,88,89,91,93,96,97,99,100,102,103,104,105,106,107,108,109,110,111,113,114,115,117],comment:20,common:[13,100,104,106],commonli:[60,104],compar:[5,11,12,20,21,29,30,52,53,90,102,104,109],compare_test:21,compare_window:20,comparison:[7,20,53,96,101],compat:[8,86,114],compel:96,compens:55,compil:26,complement:[29,30,34,37,38,52,53,76,92,109],complementari:29,complet:[96,97],completedprocess:[8,17,22],complex:44,comppair:[35,53],compress:[6,8,11,18,29,38,40,50,52,53,58,64,65,68,69,96,97,104,106,110],compressedseq:[29,58],compris:[13,61,62,63,64,103],compself:[35,53],comput:[11,15,18,20,22,28,29,40,45,52,53,66,85,90,94,96,102,109,111,114,118],compute_auc:28,compute_auc_roc:28,compute_roc_curv:28,compute_rolling_auc:28,concaten:[5,29],concentr:75,concord:[8,52,53,77,96],concordantli:[77,96],conda:[110,112,114],condabin:113,condit:[75,104],conf:113,confid:[50,64],config:13,configur:13,confirm:[11,96,104,106,111,117],conflict:112,conform:97,conform_seri:33,connect:[28,34,47,53,65,69],consecut:[8,9,20,52,53,77,104],consequ:[96,109],consid:[8,9,20,44,52,53,55,96,97,104],consist:[9,63,64,93],constant:[5,27,50],constitu:[13,36,39],constrain:85,constraint:[34,52,53,100],construct:[20,32],consum:[41,44,96],contain:[5,8,13,15,20,24,28,29,34,50,52,53,57,59,60,61,62,63,64,66,68,73,86,88,96,97,99,100,103,104,105,106,109,114],contamin:96,content:[65,103,105,115],contigu:[15,16,28,30,61,109],contiguous_m:15,contiguous_read:15,continu:[20,34,100],contrast:108,control:[35,96,108,111,114],conv_thresh:11,conveni:[13,29,42,44,76,91,108,109],convent:[13,109],converg:[11,20,52,53,78,85,97],convergence_thresh:20,convers:[96,103,114],convert:[8,9,13,20,22,26,29,34,44,64,68,86],coord:[29,34,38,52,53,109],coordin:[11,15,20,21,29,34,38,40,44,50,52,53,66,74,76,90],copi:[4,29,71,73,74,75,76,96,100],core:[7,8,10,11,33,34,35,36,38,39,40,41,42,44,45,50,52,93],corner:[20,117],correct:[5,20,29,50,96,104,111],correctli:[64,111],correl:[11,20,53,97,101,104],correspond:[8,20,28,29,37,44,55,59,64,66,67,96,97,111],corrol:[35,101],corrupt:117,cost:[96,97,104,106],could:[13,29,41,55,63,64,73,85,88,91,96,99,100,106,108,114],count:[8,11,13,15,20,22,26,29,35,38,40,41,42,50,52,53,55,82,85,89,90,96,102,103,104,105],count_base_typ:15,count_cigar_mut:[41,42],count_cigar_read:41,count_cigar_ref:41,count_del:[26,38,52],count_end:15,count_end_coord:15,count_fastq_read:8,count_in:[26,38,52],count_per_po:15,count_per_read:15,count_po:20,count_ref:26,count_single_pair:22,count_sub:26,count_test:16,count_total_read:22,counterpart:96,counts_per_uniq:[11,20],counts_po:20,counts_pos_consensu:20,cours:114,cov:66,cover:[11,15,29,42,50,56,66,88,109],cover_per_po:15,cover_per_read:15,coverag:[26,38,42,50,52,53,88,96,101,104],coverage_matrix:15,cpu:115,cram:[8,22,40,52,53,63,65,69,77,96,106],crash:[24,100],creat:[11,13,20,24,30,40,42,64,96,97,100,101,103,105,108,109,112,115,117],create_path_typ:13,create_report:[32,38],create_temp_sam:40,creation:114,credit:120,criteria:[37,70,90,104,110],criterion:[11,78,97],critic:[13,93],csh:113,csv:[11,29,33,34,35,36,38,50,52,53,66,70,71,72,73,74,75,76,88,89,99,100,107,109],ct2dot:[34,111],ct:[7,28,34,52,53,65,69,100],ct_data:28,ct_file:34,ct_in:28,ct_input:34,ct_out:28,ct_output:34,ct_path:28,ct_pos_5:[47,53],ct_text:28,ct_titl:28,ctatgt:109,ctg:55,ctio:28,ctrl:93,curl:118,current:[11,20,40,44,96,111,114,115],curv:[28,34,35,53,101],custom:[100,104],cut:[5,8,52,53,64,82,96],cut_:[8,52,53],cut_a1:[8,52,53],cut_a2:[8,52,53],cut_discard_trim:[8,52],cut_discard_untrim:[8,52],cut_g1:[8,52,53],cut_g2:[8,52,53],cut_indel:[8,52],cut_m:[8,52,53],cut_nextseq:[8,52],cut_o:[8,52,53],cut_q1:[8,52,53],cut_q2:[8,52,53],cutadapt:[8,52,53,64,77],cutadapt_cmd:8,cutadapt_input_arg:8,cv1:114,cv2:114,cyan:[13,106],cytidin:1,d120b2d3a8f67458bac23e68aad745c:78,d1:55,d295b42cc757255ad29070f00fb6a51d:82,d4361a74f58bfcaab96d9448eb6d91dd:78,d:[26,35,42,53,88,104,113],data1:[11,13,35,36,38],data2:[11,13,35,36,38],data:[11,13,15,18,20,28,35,36,38,39,40,50,52,53,57,59,60,67,69,74,75,77,78,79,80,81,82,83,84,87,89,90,93,95,97,99,100,102,104,106,110],data_head:35,data_kind:35,data_nam:28,data_sect:28,databas:86,datafram:[8,11,15,20,28,33,35,40,50],dataset2_report_fil:13,dataset:[11,13,20,35,36,38,39,40,50,53,90,95,97,110,116,118],dataset_typ:13,date:[75,93],datefmt:13,datetim:[11,13,38],db:[28,34,65,69,100],db_file:34,db_path:28,dbn:62,dcm:93,dd:93,dd_hh:93,de:0,deactiv:[111,112,113],debug:[13,51,53,93,114],dec:55,decid:104,decim:[55,66,67],decod:[5,22],decode_phr:22,decompil:26,decompress:[6,29,58,96,110],decor:[20,25],decreas:[11,85,97],dedupl:13,deem:25,deepest:66,default_kei:13,defeat:96,defin:[7,11,13,14,29,38,40,44,51,53,55,59,73,74,75,76,82,90,102,110],definit:[29,96],degener:29,del:[44,53,66,104],del_ord:11,del_pos3:44,del_pos5:44,delclust:[11,85,97],delet:[8,9,11,26,38,40,42,44,52,53,66,86,88,89,90,96,100,103,104,105,110,114,117],delete_fastq:32,delete_fq:32,delete_temp_sam:40,delete_text_fastq:32,deliber:60,delimit:61,delprof:[35,88,101],delta_log_lik:11,deltaprofilegraph:35,deltaprofilerunn:35,deltaprofilewrit:35,demult:7,demult_on:52,demulti:53,demulti_overwrit:[32,52,53],demulti_workspac:32,demultiplex:[8,32,52,53,63,64,77,90,102],demultiplex_run:32,demultiplex_workspac:32,denomin:[88,104],denot:[8,44,59],dens:60,depdend:111,depend:[13,17,18,24,95,96,103,109,112,113,114],dependency_exist:17,deprec:114,depth:[91,96,104],deriv:[27,29],describ:[9,20,66,113],descript:[14,59,71,73,74,75,76,96,101,106,115],desigin:[52,53],design:[52,53],desir:113,despit:96,destin:[8,10,34,40,47,52,53],destroy_temp_data:32,detail:[4,13,20,35,58,64,86,88,93,96,97,100,101,106,115],determin:[1,8,13,18,20,22,24,25,29,44,53,55,63,96,97,100,106],dev:78,develop:[0,1,93,114],deviat:[20,53,115],df:35,dfc527236af3a5888d3753b2c0041dc3:82,diagon:20,diagram:64,dict:[8,13,14,15,18,22,24,26,28,29,30,32,33,35,36,40,41,42,44,50,59,77,78,81,82,84],dict_to_pair:28,dictionari:[28,32],did:[88,96,104,115],differ:[20,34,35,52,53,55,59,64,79,88,93,94,96,97,100,101,104,106,111,114,116,117],difficult:55,difficulti:68,digest:18,digest_data:18,digit:55,dim:[13,20],dim_test:21,dimens:[13,20],dimension:[20,59],dimethyl:1,dims_test:31,dir:[53,86,103,105,106,108],dir_seg_typ:[8,18,34],direct:[13,44],directli:[13,20,35,63,64,85],directori:[8,9,13,18,25,28,34,36,39,47,50,53,64,66,68,86,88,89,91,96,97,99,100,103,104,105,106,107,108,117],directoy_to_write_to:32,disabl:[11,52,53,93,96,97,104,106],discard:[8,52,53,77,96,104],discontig:38,discontigu:15,discord:[8,52,53,77,96],discordantli:96,discount:[26,38,53,104],discount_mut:[38,52,53],discourag:[13,96,104],discrep:[96,106],discret:100,discuss:115,dispatch:24,displai:100,distanc:[8,34,52,53,77,79,100],distinct:96,distinguish:[96,97],distribut:[4,13,21,50,114],divid:[66,95,106,109],divis:5,dm:[3,20,28,75,96,104,110],dmfastqi:[8,52,53,96],dmfastqx:[8,52,53,96],dmfastqz:[8,52,53,96],dna:[5,8,13,15,18,29,30,34,35,38,40,41,42,44,45,52,58,63,66,86,96,104],doc:113,docdef:14,docstr:[9,14,24],document:[14,44,53,88,96,100,113,120],doe:[13,25,28,34,42,44,52,53,55,62,85,96,97,100,104,106,110,113,114,115,117],doesn:97,doi:20,don:[97,103,105],dot2ct:34,dot:[28,34,65,69],doubl:[28,55,93,96,103,104,105,111],dovetail:[8,52,53,77,96],downgrad:114,download:[113,114,118],downstream:[59,76,109],dozen:114,dpad:53,drag:100,draw:[67,100],dreem:[3,97,110],drop:[14,20,64,104],drop_fail:24,dtime:13,dtype:13,due:[44,96,104,106],duplic:[13,14,30,115],durat:75,dure:[8,44,52,53,60,64,75,77,85,93,96,104,106,109,111,117],e007d6017dae45004c11906a6bc073da:78,e1:55,e2:[53,96],e:[13,20,29,34,41,53,63,64,67,85,86,88,91,94,96,97,101,102,103,104,105,108,109,114],each:[5,8,9,11,13,14,15,20,22,24,26,28,29,30,32,33,34,35,36,37,38,40,41,42,44,47,50,52,53,55,57,58,59,60,61,62,63,64,66,67,68,70,71,72,73,76,85,88,90,92,93,97,100,101,102,103,104,105,106,108,109,111,114,117],easi:[8,20,80],easier:[93,109,113],easiest:[91,113],easili:[103,105],edg:[34,35,109],edit:[8,9,68,88,97],editor:100,edu:[34,111],effect:[109,113],effici:[5,44,58,85],effort:[68,96,112],egg:97,eight:[55,101],either:[4,26,29,35,42,50,55,64,66,88,96,103,104,113],element:[15,20,29,41,44,66,104],elimin:13,els:[13,29,96,97],elsewher:96,em:[11,53,78,97],em_clust:11,em_run:[11,52,53],em_test:12,em_thresh:[11,52,53],emclust:11,empti:[29,30],empty_ok:29,en:[0,113],enabl:[52,53,96,97,106],enc:[53,96,106],encapsul:29,encod:[5,8,13,22,40,44,52,53,56,58,59,61,62,63,77,86,104,106],encode_compar:44,encode_match:[44,45],encode_phr:22,encode_rel:[44,45],encode_test:45,encount:[106,111,113],end3:[11,12,13,15,18,20,22,28,29,40,41,42,50,59],end3s_zero:11,end5:[8,11,12,13,15,18,20,22,28,29,40,41,42,45,50,59],end5s_zero:11,end:[5,8,11,13,14,15,20,21,22,28,29,30,34,38,40,41,42,50,52,53,56,61,66,67,68,76,77,78,79,81,82,83,84,97,104,106,108,109,120],end_count:15,endogen:104,energi:[34,52,53,79,100],ensembl:[50,66,100],ensur:[8,13,15,20,34,63,96,103,104,105,106],ensure_ord:15,ensure_same_length:15,entail:115,enter:[29,108,111,114],entir:[29,35,40,52,55,64,66,93,95,96,97,101,108,109,110],entri:[7,22,51],env:[111,113],environ:[110,112],equal:[8,20,30,34,41,55,97,109],equilater:13,equival:[13,63],eras:[10,44,47,53],erron:[96,104,106],error:[8,13,15,17,21,29,42,44,52,53,63,77,93,96,103,104,105,106,111,113,115],es:13,esac:113,escap:13,especi:[8,96,104,111,113,115],essenti:8,estim:[20,104],et:[1,20,97,104],etc:113,even:[4,8,10,11,13,26,33,34,36,37,38,39,40,47,50,52,53,55,103,105,106],event:93,ever:109,everi:[5,8,11,13,16,20,21,24,26,28,29,30,35,40,41,44,45,50,53,55,59,61,62,63,67,73,80,86,88,91,96,97,104,106,108,111,114],evid:[97,120],exact:[55,115],exactli:[29,35,76,77,96,106,109,111],examin:[96,97],exampl:[8,9,13,26,53,55,56,64,68,70,72,80,87,88,91,92,93,94,96,97,100,103,104,105,106,108,109,110,113,114,115,116,118],exce:[97,104],excel:[70,72,114],except:[13,24,26,30,42,44,80,86,92,93,96,97,104],exception:20,excess:[96,104],exclud:[18,20,38,50,52,53,71,82],exclude_def:14,exclude_default:14,exclude_fil:[38,52,53],exclude_gu:[38,52],exclude_mask:50,exclude_polya:[38,52,53],exclus:104,execut:[40,113],exist:[8,10,11,13,15,17,20,25,28,33,34,36,37,38,39,40,44,47,50,52,53,63,85,86,96,97,103,105,114,115],exit:[8,34,40,52,53],exogen:88,expand_degenerate_seq:[29,30],expect:[8,11,20,21,29,30,42,99,104,115],expect_log_margin:12,expect_membership:12,expedit:114,explan:[53,96,100,106],explicit:[13,35],explicitli:[29,44,59,60,91],export_cmd:8,export_sampl:33,expos:[7,8,100],express:[21,50],ext:[13,35,50],ext_typ:13,extant:[8,44],extend:[29,86],extens:[8,13,35,50,52,53,77,96,106],extern:[7,13,96,106],extra:[14,55,110,111],extra_default:14,extra_docstr:14,extract:[5,8,22,29,53,96],extract_fasta_seqnam:29,extran:96,extrem:[97,106],f9874e5c37b56316d47bacc0a7cc604:84,f:[64,93,96,104],fa:[63,86,96,106,108,117],factor:20,factori:[52,53],faidx:[22,96],fail:[8,24,30,34,52,53,77,85,93,96,106,111],failur:[24,93],fairli:97,fall:20,fals:[5,8,10,11,13,15,18,21,22,24,25,26,28,29,32,33,34,35,36,37,38,39,40,44,47,50,52,58,77,79,96],falsi:30,familiar:[111,114],fanci:26,fashion:35,fast:100,fasta:[7,8,22,28,29,32,40,52,53,65,69,90,96,104,106,108,110,117],fasta_in:10,fasta_out:10,fasta_path:32,fasta_test:30,fastaclean:10,faster:96,fastq1:8,fastq1_path:32,fastq2:8,fastq2_path:32,fastq:[8,9,22,32,40,52,53,63,65,68,69,77,90,91,102,108,111,117],fastq_arg:8,fastq_fil:8,fastq_gz:8,fastq_id:32,fastq_nam:32,fastq_to_dict:32,fastq_to_search:32,fastq_to_writ:32,fastqc:[8,9,52,53,77,104,111],fastqc_cmd:8,fastqi:[8,52,53,96],fastqunit:[8,32],fastqx:[8,32,52,53,91,96],fastqz:[8,52,53,96],fatal:93,favor:[8,9],feat:114,featur:91,feedback:110,fetch:50,fetch_count:50,fetch_ratio:50,few:[5,20,38,82,96],fewer:[20,21,97,104,106],ff:[53,55,64,96],ffff:64,fffff:64,fffffff:64,fffffffff:64,field:[8,11,13,18,34,35,36,38,39,40,44,50,61,66,70,72,80,96,97,106],field_kei:13,field_titl:13,field_typ:13,field_valu:13,figur:[35,55,88],figure_align:8,file:[7,9,10,11,13,18,22,28,29,32,33,34,35,36,37,38,39,40,44,47,50,52,53,57,65,70,72,73,74,75,76,77,80,84,85,87,90,92,102,110,115,118],file_seg_typ:[8,11,18,34,36,38,39,40],file_test:19,fileexistserror:13,fileio:[13,18],fill:[13,20,29,55],fill_whitespac:13,filter:[22,25,32,35,38,53,68,77,88,90,92,102],find:[8,11,13,15,20,35,41,42,44,52,53,55,92,97,103,104,105,106],find_all_t:50,find_ambrel:44,find_best_ord:11,find_cigar_op_po:[41,42],find_ct_fil:34,find_dim:13,find_fil:13,find_files_chain:13,find_op:41,find_po:37,find_pos_t:50,find_read_t:50,find_rels_lin:44,find_root_pair:28,find_tabl:50,finder:50,finds_multigrepped_read:32,finfo:[38,53,104,108],finish:[96,111,114],first:[5,11,13,17,20,29,35,44,55,59,60,61,62,63,66,73,74,75,76,85,86,94,96,97,104,108,109,111],fish:113,fit:[4,13,15,18,26,63],fit_uint_s:13,fit_uint_typ:13,five:[57,59,90],fix:[96,106,115],fl:60,flag:[8,13,22,44,93,104,106],flags_exc:22,flags_req:22,flagstat:[22,40],flagstat_cmd:22,flank:[9,44,109],fmt:13,fmt_fanci:26,fmt_func_arg:24,fmt_plain:26,fmut:[38,53,92,104],fna:63,focu:114,fold:[7,52,61,62,63,67,69,80,90,101,102,108],fold_constraint:[34,52,53],fold_max:[34,52,53],fold_md:[34,52,53],fold_mf:[34,52],fold_perc:[34,52,53],fold_profil:34,fold_sect:34,fold_temp:[34,52,53],foldreport:34,follow:[0,5,8,20,26,29,34,41,50,55,58,59,60,61,62,63,64,66,67,68,82,86,96,97,99,103,104,106,108,109,111,113,114,115,117],forbid:30,forc:[8,10,11,13,18,20,28,29,33,34,35,36,37,38,39,40,47,50,52,53,85,86,93,103,105,108],foreign:96,forg:111,form:[13,15,20,26,55,97],format:[8,13,22,24,26,29,34,44,52,53,86,88,100,104,106,110],format_clust_nam:13,format_exp_count_col:11,format_fasta_name_lin:[29,30],format_fasta_record:[29,30],format_fasta_seq_lin:29,format_metadata:33,format_retitled_ct_lin:34,format_vers:13,formatt:13,fortun:114,forward:[29,34,38,52,53,76,96,109],found:[8,11,16,20,52,53,77,97,104,111,113,115],foundat:4,four:[5,29,42,55,64,66,86,111],fpath:32,fpr:[28,35],fq1:32,fq2:32,fq:[9,64,96,108,117],fq_inp:8,fq_name:96,fq_out:[8,22],fq_pipelin:8,fq_unal:8,fq_unit:[8,32],fqop:8,fqs_pipelin:8,fqunit:[8,32],fqutil:9,fqutil_test:9,fr:[8,52,53,77,96],fraction:[20,37,38,50,52,53,66,82,88,101],fragil:96,fragment:[8,52,53,77],frame:[8,11,15,20,33,35,40,50],frame_test:21,framework:93,free:[4,13,34,52,53,79,100,106],freq:[66,99,107],freqtabl:50,frequenc:50,frmt:13,from3to5:44,from:[5,7,8,9,11,13,14,16,18,20,21,22,24,28,29,30,34,35,36,37,39,40,41,42,44,45,46,50,52,53,55,61,63,64,65,67,69,73,77,86,88,90,93,97,99,100,102,104,106,107,108,109,110,114,115,118,120],from_clust:11,from_count:26,from_ct:28,from_dataset:11,from_dict:13,from_dir:13,from_path:8,from_read:40,from_report_format:26,from_struct_profil:28,front:32,frustrat:114,fse:[78,82,93],fse__averag:79,fse_r1:117,fse_r2:117,full:[11,13,29,30,44,91,96,100,104],fulli:[44,55,96],fulltabul:50,func:[14,20,24],further:[1,88],futur:[64,114,120],fwd:29,fwd_clip:32,fwd_primer:32,g1:[53,96],g2:[53,96],g:[5,8,9,26,29,34,35,38,42,52,53,55,61,62,63,64,66,82,85,88,89,94,96,101,102,103,105,106,108,109,114],gap:[8,29,30,34,38,52,53,59,73,76,82,96,104,109],gap_extend:[8,9],gap_open:[8,9],gave:104,gb:64,gbar:53,gcatgctagcca:64,gctcttccgatct:[8,52,77,96],gencod:86,gener:[4,5,8,9,11,13,26,28,29,30,34,35,45,50,68,87,89,90,91,96,97,104],generate_batch:40,genom:104,get:[8,9,11,13,14,20,21,22,25,28,29,35,37,40,41,50,96,103,105,106,109,113],get_action_nam:35,get_alphaset:29,get_args_count_fastq_read:8,get_batch:[13,40],get_batch_checksum:13,get_batch_path:13,get_batch_typ:[11,13,38,40],get_bound:35,get_bowtie2_index_path:8,get_btype_nam:13,get_byte_dtyp:13,get_cmap:35,get_cmap_typ:35,get_colormap:35,get_common_best_run_attr:11,get_common_ord:11,get_comp:29,get_comp_func:20,get_comp_nam:20,get_comptran:29,get_coords_by_ref:29,get_count_path:11,get_count_per_po:15,get_count_per_read:15,get_cov_matrix:11,get_cover_per_po:15,get_cover_per_read:15,get_coverage_matrix:15,get_ct_fil:28,get_dataset1_load_func:[11,13,36,38],get_dataset1_report_fil:13,get_dataset2_load_func:13,get_dataset2_typ:[11,13,36,38],get_dataset_load_func:[13,36,39],get_db_fil:28,get_db_struct:33,get_dms_fil:28,get_docstr_lin:14,get_dtyp:13,get_edg:35,get_edges_index:35,get_fasta:28,get_fasta_seq:29,get_field:13,get_fields_in_seg_typ:13,get_flagstat:22,get_graph:35,get_graph_typ:35,get_half_coverage_matrix:15,get_hist_trac:35,get_info:15,get_invers:15,get_length:15,get_list_path:37,get_lock:25,get_log_exp_obs_count:11,get_mask:29,get_max_uint:13,get_max_valu:13,get_memb:11,get_mu:11,get_mut_matrix:11,get_non_seq_regex:10,get_nonalphaset:29,get_null_valu:50,get_num_parallel:24,get_oconv_array_float:13,get_oconv_dict_float:13,get_oconv_dict_list_float:13,get_oconv_float:13,get_oconv_list_float:13,get_other_iupac:29,get_param_default:14,get_param_lin:14,get_path:[18,35],get_path_field:35,get_path_seg:35,get_pictran:29,get_prop:11,get_reads_per_batch:40,get_reads_per_po:15,get_ref_metadata:33,get_rel_nam:50,get_rels_per_po:15,get_rels_per_read:15,get_report_typ:[11,13,36,38,39,40],get_roc_trac:35,get_rolling_auc_trac:35,get_sample_data:33,get_sample_metadata:33,get_sample_ref_ext:8,get_sect_coords_prim:29,get_sect_metadata:33,get_seq_base_bar_trac:35,get_seq_base_scatter_trac:35,get_seq_line_trac:35,get_seq_stack_bar_trac:35,get_shared_index:[29,30],get_table_data:33,get_table_find:35,get_table_load:35,get_table_path:11,get_tabulator_writ:50,get_tabulator_writer_typ:50,get_top_logg:13,get_trac:35,get_uint_dtyp:13,get_uint_s:13,get_uint_typ:13,get_uniq_nam:11,get_uniq_read:11,get_varna_color_fil:28,get_verbos:13,get_window:30,get_writer_typ:35,github:[0,44,115,118],give:[13,14,28,66,76,85,88,89,91,96,97,99,100,103,104,105,106,107,108,110,111,114],given:[5,8,11,13,14,17,18,20,22,24,26,28,29,30,34,35,40,41,44,45,47,50,53,55,59,70,72,73,74,75,82,91,93,103,104,105,109,117],glob:91,global:[93,97],gnu:4,go:[52,53,73,88,96,97,100,103,104,105,106,107,108],goe:[41,99,114],good:[55,117],googl:0,gpu:115,grai:[100,108],graph:[7,33,34,52,61,65,69,85,90,102,108,110],graph_filenam:35,graph_kind:35,graph_obj:35,graphbas:35,graphic:88,graphrunn:35,graphwrit:35,greater:[8,9,20,30,85,92,94,96,97,104,109],green:13,grep:[32,52,53],grep_both_fastq:32,grote:0,group:[11,20,29,96,97],gs:[8,52,53,77,96],gt_eq:15,gu:[29,53,104],guarante:97,guess:[20,97],guess_p_clust:20,guess_p_end:20,guess_p_mut_given_span:20,guid:[64,96,100,113],guidanc:111,guidelin:120,gz:[50,64,66,96,99,100,107,108,117],gzip:[8,50,64],ha:[5,9,13,16,20,21,29,41,42,44,55,58,60,63,64,67,87,88,93,96,104,106,109,111,114,115],had:[20,85,96,97,104,111,115],half:20,halfrefpattern:26,halfrelpattern:26,halt:[93,97],handl:[34,86,106,109],handler:13,happen:[20,60,93,104,106],hard:96,harder:44,harvard:0,has_ipath:17,has_mid:15,has_opath:17,hash:29,hashabl:[30,35],have:[4,5,9,20,29,34,38,44,50,55,59,64,73,85,86,91,92,96,97,100,103,104,105,106,108,109,111,113,114,115],head:96,header:[8,13,22,28,35,50,55,64,86,96],header_depth:50,header_row:50,header_test:31,header_typ:50,helix:28,help:[20,53,96],helper:50,henc:[5,55,96],here:[13,59,109],hewhosshouldersblockthesun:0,hex:55,hexadecim:[18,55],hh:93,hi_qual:41,hide:114,high:[8,20,41,52,53,55,77,96],higher:[85,93,104],highest:55,highli:114,hist:[35,53],hist_bin:[35,52,53],hist_margin:[35,52,53],histogram:[35,52,53,66,101],histogramgraph:35,histogramrunn:35,histori:44,histpo:[35,101],histread:[35,101],histrel:35,hl:0,home:[111,113],hook:113,hope:4,hopefulli:120,horizont:[36,90,102,111],hour:96,hover:88,how:[24,28,55,97,104,106,112,113],howev:[55,59,73,91,96,97,104],ht:44,html:[34,35,52,53,88,89,96,111,113],htslib:111,http:[0,4,20,34,44,111,113,117,120],hui:75,human:[41,70,72],humanize_relvec:41,hundr:96,hybrid:24,hyphen:[29,30,109],hyphenate_end:[29,30],hypothet:13,i4d4aceaaaaj:0,i:[13,20,24,26,29,35,41,42,53,57,59,63,64,67,68,73,85,86,88,91,94,96,97,100,103,104,105,109],iconv:13,iconv_array_float:13,iconv_array_int:13,iconv_datetim:13,iconv_dict_str_dict_int_dict_int_int:13,iconv_dict_str_int:13,iconv_int_kei:13,idea:[97,114,117],ideal:[13,55,96,97],ident:[11,13,29,30,34,55,97,100,103,105],identifi:[34,44,96,106],idxstats_cmd:22,ifasta:10,ignor:[20,29,30,36,38,52,53,63,71,85,88,93,99,100,104,106,109],ii:104,iii:[96,104],illeg:[30,63,86],illumina:64,illustr:[55,64,88],imag:120,immedi:[55,93],immobil:104,implement:114,impli:[4,96],implicitli:[44,91],impos:63,imposs:[55,106],improperli:96,improv:[13,96,97,115],in_dir:19,inadvert:117,includ:[11,20,29,34,38,52,53,63,70,72,76,96,99,104,109,111,115],include_nan:29,inclus:[67,76],incompat:[96,106,114],inconsist:[13,63],incorpor:63,incorrect:[64,96,106],incorrectli:64,increas:[52,53,73,85,96,97],increment:59,incur:96,indel:[8,9,40,44,52,53,55,77,96,104,106],independ:[11,20,50,52,53,78,97],index:[5,8,11,13,15,20,22,28,29,32,34,35,36,38,40,41,44,50,52,53,57,58,59,61,63,76,106,111],index_clust:13,index_col:50,index_depth:50,index_fasta_cmd:22,index_ord:13,index_order_clust:13,index_orders_clust:13,index_pfx:8,index_test:16,index_to_po:[29,30],index_to_refseq_po:40,index_to_seq:[29,30],index_toler:[32,52,53],index_xam_cmd:22,indic:[20,24,28,44,55,62,64,73,86,106],indir:13,indiv:[53,88],individu:[0,8,52,73,77,88,91,96,97,102,104,108,110,111],inequ:[8,9],infer:[11,14,41,53,74,75,90,102,104],infer_read:[41,42],infer_test:42,info:[51,53,66,93],inform:[11,13,34,38,44,45,52,53,55,57,59,60,61,62,63,64,66,68,72,78,82,85,88,91,96,97,99,100,101,103,105,106,108,109,115],infrequ:44,init:[38,113],init_arg:28,initi:[8,20,28,44,51,52,53,63,77,82,86,96,97,112],inkscap:88,inn:44,inner:20,inplac:[10,47,53],input:[8,13,17,18,20,28,35,53,85,86,87,90,102,110,115],input_csv:32,input_path:[10,11,13,18,33,34,35,36,37,38,39,40,50,52,53],input_seg:13,input_typ:18,ins:[53,66,104],ins_len:41,ins_po:44,insensit:26,insert:[8,9,26,38,41,42,44,45,52,53,66,88,89,104],insid:106,inspect:14,instal:[100,110,114],instanc:[11,13,26,28,29,30,35,42,94],instanti:[13,30],instead:[10,13,47,53,94,96,106,111,114],instruct:[96,101,111,113],insuffici:[44,96,104],integ:[9,13,15,20,22,29,34,40,41,44,59,61,64,73,74,75,106,109],integr:117,intend:97,interact:[88,100],interchang:[103,105],interest:[50,60,93],interfac:[7,8,13,40,51],interleav:[8,22,52,53,68],interpret:[93,96],interrupt:93,intersect:[26,29],interv:[8,50,52,53,77,100],introduc:[8,106],introduct:[2,8],invalid:[13,30,42,86],invent:[1,114],invers:[8,16,21,26],invert:[16,26],investig:104,involv:13,io:[7,11,13,36,38,39,40,44,113],iopath:17,ipath:17,ir:104,irrelev:68,is_ext:13,is_pair:28,iseq:96,issu:[64,114,115,117],item:[11,13,18,20,24,29,33,35,52],iter:[8,11,13,15,18,20,24,26,28,29,32,34,35,36,38,39,40,42,45,50,52,53,78],iter_align:41,iter_base_typ:15,iter_batch:13,iter_cas:45,iter_clust_index:13,iter_clust_table_data:33,iter_graph:35,iter_hist_trac:35,iter_pos_table_data:33,iter_pos_table_pair:35,iter_pos_table_seri:33,iter_pos_table_struct:33,iter_profil:[35,50],iter_read:15,iter_read_table_data:33,iter_read_table_pair:35,iter_record:40,iter_relvecs_al:[41,42],iter_relvecs_q53:[41,42],iter_roc_trac:35,iter_rolling_auc_trac:35,iter_root_modul:28,iter_seq_base_bar_trac:35,iter_seq_base_scatter_trac:35,iter_seq_line_trac:35,iter_seqbar_stack_trac:35,iter_st:35,iter_table_data:33,iter_window:[15,29],iterread:41,iterrel:41,iterrel_test:42,ith:41,its:[1,5,13,15,17,20,22,24,26,29,34,35,38,40,41,44,50,52,53,55,61,62,63,64,67,73,88,93,96,100,102,103,105,106,109,112,113,114,115],itself:[44,53,60,87,91,93,97,106,109],iupac:[29,86],j:[20,53,103],join:[7,13,17,52,53,69,72,80,90,102],join_clust:[36,52,53],join_sect:36,joinclustermutsdataset:36,joinclusterreaddataset:36,joinclusterreport:36,joineddataset:[13,36],joinmaskmutsdataset:36,joinmaskreaddataset:36,joinmaskreport:36,joinmutsdataset:36,json:[13,66,80,91,96,97,100,103,104,105,106,108],junction:28,just:[20,24,33,52,53,67,97,99,103,104,105,106,111,114],justin:0,justinaruda:0,k:[11,20,32,53,73,85,93,97,100,108],keep:[8,34,38,40,44,52,53,77,96,97,104,109,114],keep_temp:[8,25,32,34,40,52],kei:[8,11,13,14,20,28,29,30,33,41,50,59,66,93],kelvin:[34,52,53,79],kept:[38,82,96,104],key_dint:8,key_dmat:8,key_dsingl:8,key_int:8,key_mat:8,key_mate1:8,key_mate2:8,key_singl:8,key_to_titl:13,keyword:[8,10,11,13,14,17,20,24,33,34,36,37,38,39,40,47,50,51,52,108],kind:[8,35,50,55],kit:96,kladwang:104,know:[20,96,97,115],knowledg:[44,55],known:[15,16,44,96],kwarg:[8,11,13,15,18,20,24,25,28,29,30,33,34,35,36,37,38,39,40,41,50],l:[8,20,52,53,77,106,117],lab:[0,4,20,34],label:[29,44,59,93,117],label_no_close_mut:21,lack:[55,96],lajart:0,larg:[8,64,91,96,104],larger:[85,97,104,106],largest:11,last:[8,11,18,28,29,34,36,38,39,40,59,61,106,109],later:[4,96],latest:[111,113],latter:104,launch:100,lavend:64,lavender_r1:64,layout:100,ldi:[77,78,79,81,82],lead:96,learn:55,least:[20,29,45,82,97,104,106,115],leftov:106,length:[5,8,13,15,16,20,24,29,30,34,38,41,42,44,52,53,58,59,61,63,64,76,77,82,96,104,106],lengthen:[41,42],less:[20,30,45,55,92,93,94,96,97,104,109],lesser:20,let:[112,115],letter:[88,93,104],level:[7,8,11,13,28,29,35,38,40,50,52,53,90,99,103,105,108],level_kei:13,level_nam:13,lib:113,librari:96,licens:[3,110],light:[96,100],like:[13,20,29,64,73,87,88,96,97,104,106,113,114],likelihood:[11,20,52,53,78,97],likewis:55,lilac:64,limit:[29,34,41,52,53,63,79,85,91,96,97,104,106],line1:44,line2:44,line:[7,8,13,22,28,29,30,34,35,40,44,45,51,53,60,64,67,73,74,75,76,93,97,109,113],linear:114,linearli:[5,20,94],link:[13,63,96,113,117],linux:[96,104,106,113],list:[7,8,11,12,13,14,15,17,18,24,26,28,29,30,32,33,34,35,36,38,39,40,41,42,44,50,53,57,59,66,69,77,78,79,81,82,83,84,85,88,90,96,97,99,100,103,104,105,106,107,108,110,114],list_batch_num:15,list_clust:13,list_fqs_xam:8,list_ord:13,list_order_clust:13,list_orders_clust:13,list_po:37,list_rel:42,list_table_fil:35,listdir:8,listpo:[37,71,92],littl:5,ll:115,ln:106,lo_qual:41,load:[11,13,18,34,35,36,38,39,50,80,100],load_all_t:50,load_any_t:50,load_brickl:18,load_ct_struct:34,load_dataset1:13,load_dataset2:13,load_dataset:13,load_func:13,load_pos_t:50,load_read_t:50,load_report:13,load_sect:38,load_tabl:50,load_table_fil:35,loadeddataset:[11,13,38],loadedmutsdataset:[13,40],loader:50,loadfunct:13,loc:[53,96],local:[8,52,53,77,97,113],locat:[20,29,55,74,76,86,96,100,106,108,117],lock:25,lock_temp_dir:[24,25],lockerrfilt:25,log:[5,11,13,17,25,52,53,78,90,97,99,103,105,110,115],log_color:13,log_fil:13,log_lik:11,log_like_prev:11,logarithm:20,logger:13,logmsg:93,logn_exp:11,logrecord:[13,25],longer:[20,100,104,115],longest:13,look:[97,111,113],lookup_kei:13,lookup_titl:13,loop:[13,28],lose:104,lost:[96,104],lot:114,low:[41,42,104,106],low_qual:[41,42],lower:[35,50,93,97,104,106],lower_limit:15,lowercas:[8,9,26,63,86,104],ly:38,m1:111,m2:111,m:[35,42,53,88],macbook:111,maco:[96,104,106,113],made:[13,15,18,36,39,52,53,66,103,105,114],mai:[14,20,24,25,50,59,63,64,73,85,86,92,96,103,104,106,109,111,113,116],main:[8,10,11,13,20,32,33,34,36,38,39,47,50,51,53,64,66,108,117],main_fasta:8,maintain:[13,44],major:[13,34],make:[9,13,18,25,28,34,35,44,55,87,88,93,96,97,101,103,105,108,109,111,113,115],make_dict_from_fasta:32,make_dir:19,make_fil:19,make_head:13,make_index:35,make_lock_temp:25,make_path_subject:35,make_sequence_objects_from_csv:32,make_temp:25,make_temp_backup:18,make_title_action_sampl:35,makes_dict_from_fastq:32,malwar:117,mammalian:96,manag:[13,96,104,106,112],mani:[8,9,38,64,76,82,88,96,109,114,115],manner:[8,68],manual:[86,96,110,114],map:[8,13,15,22,26,28,29,32,35,40,41,52,53,65,69,77,100,104,108],map_nest:28,mapq:[8,44,45,53,96,106],mapseq:[3,20,110],margin:[29,52,53],mark:[8,40,42,52,53],martin:0,mask:[5,7,11,13,29,36,50,60,67,69,71,80,85,89,90,91,99,102,105,107,108],mask_gu:29,mask_nam:[29,38],mask_po:29,mask_polya:29,mask_pos_fmut:38,mask_pos_ninfo:38,mask_read_discontig:38,mask_read_finfo:38,mask_read_fmut:38,mask_read_gap:38,mask_read_init:38,mask_read_kept:38,mask_read_ncov:38,mask_report_fil:11,mask_sect:38,maskbatchio:[38,104],masked_bool:[29,50],masked_int:29,masked_zero:29,maskio:38,maskmutsbatch:38,maskmutsdataset:[11,36,38,50],maskpost:[34,50],maskpostableload:50,maskpostablewrit:50,maskreadbatch:38,maskreaddataset:38,maskreadt:50,maskreadtableload:50,maskreadtablewrit:50,maskreport:38,masktabl:50,masktabul:50,match:[8,9,13,15,21,26,29,35,42,44,45,55,62,63,76,82,88,90,91,96,100,104,106,110],match_longest_ext:13,mate:[8,15,16,52,53,55,59,68,77,96,106],mathew:34,matrix:[8,11,52,53,59,77,114],matthewfallan:0,matti:[0,11,14,40],max:[15,53,85,92,96,97,100,104,106,108],max_clust:[11,52,53],max_em_it:[11,52,53],max_flag:8,max_fmut_po:[37,38,52,53],max_fmut_read:[38,52,53],max_in:[41,42,45],max_ins_bas:41,max_ins_len:41,max_it:[11,20],max_ord:[11,13,15,36,50],max_phred_enc:8,max_po:15,max_proc:[8,10,11,24,33,34,35,36,37,38,39,40,47,50,52,53],max_qual:41,max_read:15,max_se:50,max_siz:40,maxdist:100,maxim:[11,20],maximum:[8,10,11,13,15,20,24,33,34,36,37,38,39,40,41,47,50,52,53,63,77,78,79,82,85,94,100,104,106,108],maxmimum:97,mb:64,md5:[18,40,78,82,84,118],md:[53,100],me:98,mean:[8,9,11,13,20,26,53,78,86,93,96,97,103,105,106],measur:96,mebibyt:40,median:94,medic:0,meet:[37,70,92],megabas:[40,52,53],membership:[11,20],memor:111,memori:[63,95,96,104,106,115],merchant:4,mere:[85,103,105],merg:[8,11,13,14,35,36,39,55,90,102],merge_nondemult_fq:8,merge_param:14,mergeddataset:13,mergedmutsdataset:13,messag:[13,15,21,51,53,86,90,106,110,111,113,115],meta:[33,53,99],metadata:[33,52,53,63,69,86,103,109,110],method:[1,20,21,50,91,96],methodnam:[9,12,16,19,21,23,25,27,30,31,42,45,46],methyl:[20,104],meticul:93,metric:[35,53],mfe:[34,52,53,79,100],miami:60,mib:40,mib_to_byt:40,microsoft:[70,72],mid3:[15,16,18,40,59],mid5:[15,16,18,40,59],middl:[15,96],million:106,min:[53,96,97,104,106,108],min_count:[20,29],min_data:28,min_em_it:[11,52,53],min_field:44,min_finfo_read:[38,52,53],min_gap:[15,20,21],min_it:11,min_length:29,min_mapq:[8,22,40,44,52,53],min_mut_gap:[11,12,36,38,50,52,53],min_ncov_read:[38,52,53],min_ninfo_po:[38,52,53],min_ord:[11,13],min_phr:[40,52,53],min_qual:[40,41,44],min_read:[8,40,52,53],min_siz:40,mind:109,miniconda3:[111,113],miniconda:113,minim:[8,9,20,96,104],minimum:[8,11,13,20,28,34,38,40,44,45,50,52,53,77,78,79,82,96,97,104],minor:[13,93],minu:[20,61,96,106,109],minut:[13,77,78,79,81,82,83,84,96],misalign:[96,104],misformat:30,mismatch:[32,52,53,109],mismatch_threshhold:32,mismatch_toler:[32,52,53],mismatches_allow:32,miss:[20,96,100,111],missing_ok:13,misspel:60,mistak:104,mistyp:111,mix:[20,53,96,106,108,114],mixtur:20,mkcmd:17,mkdir:96,mm:[75,93],mode:[8,13,52,53,64,77,96,106],model:[11,20,100,108],modern:96,modif:104,modifi:[4,10,13,20,25,47,53,86,103,104,105,106],modifif:104,modul:[9,13,14,17,20,23,26,27,29,30,34,38,44,51,93],molecul:[1,20,34,64,96],monitor:[93,96,104,106],more:[4,8,9,11,13,24,26,29,35,36,39,40,44,50,53,55,57,59,60,61,62,63,64,68,76,85,88,89,91,93,96,97,100,103,104,105,106,108,109,114,115],more_typ:13,most:[5,8,13,29,41,44,55,59,60,66,85,88,93,96,104,106],move:[13,44,96],mu:[7,13,85],much:[96,100,104,113,114,115],multi:[13,29,40],multidimension:20,multiindex:[11,13,15,29,35,40],multipl:[5,11,13,15,20,24,29,32,35,50,85,88,90,95,97,99,100,103,104,105,106,107,114],multiplex:[32,53,90,96,102],multipli:[29,97],multirelsgraph:35,multirelsprofilegraph:35,multithread:[52,53],munro:120,mus1:[11,20],mus2:[11,20],must:[5,8,9,13,20,24,29,34,41,50,52,53,55,61,63,64,68,73,74,75,76,79,93,95,96,97,104,106,108,109,111],mut:[11,13,15,18,21,26,38,40,41,44,53,59,104],mut_bit:26,mut_cod:26,mutat:[1,8,9,11,13,15,18,20,21,26,28,34,35,37,38,40,41,42,44,46,50,52,53,55,61,62,67,82,88,90,92,96,101,102,109,110],mutation:100,muts_per_po:[11,12,20],mutsbatch:[13,15,18,40],mutsbatchio:[13,18,40],mutsdataset:[11,13,36,38],mv:96,mycoplasma:96,myfavrna:[74,76],myfil:96,myfile1:96,myfile2:96,mynam:113,mypool:83,mysect:[73,81],n:[5,13,29,35,42,53,58,61,62,63,64,71,73,74,75,86,88,89,96,97,100,106,109,111,114],n_batch:38,n_cl:21,n_data:11,n_param:11,n_po:21,n_pos_tot:[11,20],n_pos_unmask:11,n_proc:[8,11,22,24,34],n_read:[8,21,40],n_reads_clust:50,n_reads_discontig:38,n_reads_init:38,n_reads_kept:38,n_reads_max_fmut:38,n_reads_min_finfo:38,n_reads_min_gap:38,n_reads_min_ncov:38,n_run:11,n_task:24,name:[7,8,10,13,14,18,20,22,24,25,28,29,30,32,34,35,36,38,39,40,50,52,53,54,55,56,60,61,62,63,64,66,67,68,71,73,74,75,76,77,78,79,81,82,83,84,86,88,90,91,93,96,100,107,111,113,114,116],name_lock_temp:25,name_r1:64,name_r2:64,name_temp:25,nan:[20,28,34,50,52,53],nan_test:21,navig:[100,115,117],nbyte:13,ncbi:86,nchar:13,ncl:40,ncol:35,ncov:[38,53,104],ndarrai:[11,12,13,15,18,20,21,28,29,35,38,40,41,50,57,59],nearbi:20,nearest:40,necessarili:[13,63,97],need:[5,8,9,13,14,28,44,68,85,88,96,97,100,106,111,113,114],need_writ:13,neg:[16,20,34,59,64,96],neighborhood:60,neither:[17,29,55,104],nest:[8,28,52,53,66,77],net:111,never:[91,97,106],new_field:8,new_file_nam:32,new_ord:11,new_seg:8,newfil:53,newlin:63,newton:20,next:[42,50,61,66,93],nextseq:[53,96],ng:[7,13],ninfo:[38,53,104,108],no_close_mut:21,no_nan:20,noaso:75,nois:97,non:[5,8,11,13,16,20,21,30,34,50,52,53,59,61,63,64,93,96,97,103,104,105,112],none:[8,11,13,14,15,17,18,20,22,24,26,28,29,32,33,34,35,36,38,40,41,42,50,52,93,103,105],nonneg:106,nonzero:13,nor:[29,109],normal:[13,20,34,52,53,67,79,90,93,110],nos:26,note:[5,20,44,57,59,91,96,104,109,111,114],noth:[13,26,93],notic:93,notimplementederror:44,novaseq:96,novic:113,now:[73,100],np:[15,20],npo:[20,40],nrmsd:[11,20,53,97],nrow:35,ns:5,nt:[5,29,34,38,52,53,59,82,96,104,109],nucleic:[5,29,96],nucleotid:[1,29,52,53,58,63,86,96],num:[13,97,104,106],num_align:66,num_batch:[11,13,15],num_contiguous_read:15,num_discontiguous_read:15,num_level:13,num_nonuniq:11,num_po:15,num_read:[11,13,15,40],num_run:11,num_uniq:11,number:[5,8,9,10,11,13,15,18,20,22,24,28,29,33,34,35,36,37,38,39,40,41,44,46,47,50,52,53,55,57,58,60,63,64,66,67,73,77,78,79,82,84,85,88,91,99,100,101,103,105,106,107,108,109],numer:[22,29,76,85,88],numpi:[11,12,13,15,18,20,21,28,29,30,35,38,40,41,50,57,59,114],nums_batch:13,ny:93,o:[53,68,86,103,105],obei:[61,63],object:[5,8,10,11,13,17,18,19,20,24,26,28,29,32,35,38,40,41,44,57,58,59,65,69,97,104,106],observ:[11,20,50,104,106],obtain:[64,106,117],occupi:[5,29],occur:[13,14,20,29,44,55,93,106,109,115],ochr:64,oconv:13,oconv_array_int:13,oconv_datetim:13,odata:13,odd:97,ofasta:10,off:[20,53],offici:114,offset:[8,22,28],often:[20,29,55,86],oh:55,ok:100,oligonucleotid:109,omit:[29,103,105],onc:[8,13,24,29,55,96,97,103,105,109,111],one:[5,8,9,11,13,15,20,22,24,26,28,29,30,34,35,36,39,40,41,42,44,50,52,53,55,59,62,64,66,67,68,70,73,76,77,85,88,92,93,95,97,104,106,114,115],one_ref:8,onerelgraph:35,onerelprofilegraph:35,ones:[26,96],onestruct:35,onet:35,onetablegraph:35,onetablerunn:35,onetablewrit:35,onli:[5,8,11,13,15,20,26,29,30,33,34,36,37,38,39,40,44,50,52,53,55,62,63,64,66,68,79,85,86,88,91,93,95,96,97,99,100,103,104,105,106,108,111,114],only_head:22,op:[41,42,44],op_consumes_read:44,op_consumes_ref:44,op_is_mut:41,opath:17,open:[8,13,38,40,93,100,106,115,116,117],open_temp_sam:40,oper:[20,28,35,41,42,44,55,101,113,115],opposit:44,optim:[11,44,78,100,102,114],optimum:97,option:[4,7,8,11,13,14,15,17,18,20,22,24,26,29,32,33,35,38,40,41,42,50,51,63,64,68,76,86,88,89,91,92,93,100,103,105,106,108,109,110,111,113],optionfield:13,orcid:0,order1:35,order2:35,order:[5,8,9,11,13,14,20,28,33,35,36,50,52,53,64,73,78,90,96,103,104,109,110],org:[0,4,20,111],organ:32,orient:[8,52,53,77,96],origin:[5,8,10,11,17,18,20,29,30,35,36,47,50,53,58,85,91,96,97,103,105],original_report:11,os:8,other:[11,13,17,20,24,26,28,29,36,39,50,52,53,55,63,64,70,73,85,86,88,94,96,97,100,103,104,105,109,114],otherref:[74,76],otherwis:[13,15,21,24,25,26,28,29,44,52,53,59,66,86,88,96,106],our:[20,97,104],out:[8,10,40,47,52,53,68,85,86,89,91,92,93,96,97,99,100,103,105,106,107,108],out_dir:[8,10,18,32,34,35,36,39,40,47,52,53],out_prefix:8,outdir:13,output:[8,10,11,17,22,28,33,34,35,36,37,38,39,40,42,47,50,52,53,77,80,86,87,90,91,92,102,115],output_func:11,output_path:13,output_seg:13,output_typ:18,outright:96,outsid:[55,96,106],over:[9,15,20,35,50,88,97,104],overal:1,overlap:[5,8,52,53,55,77,96,109],overlook:96,overrid:[13,18],overriden:13,overwrit:[8,28,32,34,52,53,86],own:[52,53,73,88,93,96,111,114,116],p:[53,64,105,109],p_cl:21,p_clust:[12,20,40],p_clust_observ:20,p_end:[12,20,21,40],p_ends_given_noclos:50,p_ends_observ:20,p_mut:[12,21,40],p_mut_given_noclos:50,p_mut_given_span:20,p_mut_given_span_observ:20,p_mut_max:21,p_noclos:20,p_noclose_given_end:20,packag:[110,111,113,114],pad:[5,8,52,53,77],page:[115,117],pain:114,pair:[1,8,11,13,15,20,22,28,29,32,34,35,40,44,52,53,56,59,61,62,68,77,79,100,104,105,106,109],pair_dict:28,pairs_to_dict:28,pairs_to_t:28,pairwis:20,panda:[8,11,13,15,20,28,29,30,33,35,40,50,52],paper:88,parallel:[7,8,10,11,13,32,33,34,35,36,37,38,39,40,47,50,52,53,90,110],parallel_demultiplex:[32,52,53],parallel_grep:32,paralleliz:24,param:[8,14,35],param_default:14,param_doc:14,param_docstr:14,param_lin:14,param_list:14,paramdef:14,paramet:[8,10,11,13,14,15,18,20,21,22,24,26,28,29,33,34,35,36,37,38,39,40,41,44,47,50,51,52,80,87,89,90,96],parent:[8,13],pars:[8,9,13,17,18,29,33,34,36,45],parse_all_scor:9,parse_bowtie2:8,parse_cigar:[44,45],parse_ct:28,parse_db_str:28,parse_energi:34,parse_exp_count_col:11,parse_fasta:[29,30],parse_flagstat:22,parse_head:13,parse_idxstat:22,parse_join_clusts_fil:36,parse_path:18,parse_ref_head:22,parse_refs_metadata:33,parse_rnastructure_ct_titl:34,parse_samples_metadata:33,parse_scor:9,parse_stdout_count_fastq_read:8,parse_top_separ:13,parse_vers:13,parsed_metadata:33,part:[13,28,29,30,53,61,62,63,76,93,96,100],parti:100,partial:96,partialmutsbatch:[11,15,38],partialreadbatch:[11,13,15,38],partialtabul:50,particular:[4,41],particularli:91,partner:[61,81],pass:[13,24,50,60,91,96,105],pass_n_proc:24,past:100,patch:13,path:[8,10,11,13,17,18,19,22,25,28,29,33,34,35,36,37,38,39,40,50,52,65,86,91,92,96,100,103,104,105,106,108,113],path_field:[18,50],path_field_valu:18,path_match:13,path_seg:[39,50],path_subject1:35,path_subject2:35,path_subject:35,patherror:13,pathlib:[8,10,11,13,18,19,22,25,28,29,33,34,35,36,37,38,39,40,50,52],pathtypeerror:13,pathvalueerror:13,pattern:[11,13,15,26,32,38,40,50,52,53,91],pattern_end:32,pattern_kei:38,pattern_start:32,pattern_typ:32,pcc:53,pcr:[29,109],pd:[13,20,29],pdf:[35,52,53,88],pearson:[11,20,53,104],penal:96,penalti:[8,9],penultim:11,per:[11,13,22,28,29,32,35,40,46,50,52,53,64,78,82,87,88,90,96,97,99,100,101,106],per_read:15,percent:[53,100],percentil:20,perfectli:106,perform:[20,96,114],permit:[11,16,50,76,109],phenomena:55,phred:[8,22,40,44,52,53,55,68,77,96],phred_arg:8,phred_enc:[8,32,40,52,53],phred_encod:22,phred_scor:22,phred_test:23,physic:55,physiolog:104,pickl:[18,32,60],pict:29,picto:29,pictogram:[29,30],piec:[64,114],pip:[110,111,112,114],pipelin:[7,8,17],place:[10,13,20,25,47,53,76,85],placehold:25,plain:[26,29],plan:114,platform:96,pleas:[64,115,117],ploq:52,plot:[53,90,102],plotli:35,plu:[7,61,67,86,91,96,109,113],pmut:52,pnext:8,po:[29,38,44,50,53,55,66,88,89,92,99,100,104,107,108],pobabl:20,point:[5,7,11,44,51,96,97,108],poli:[29,38,52,53,82],polya:[29,53,104],pool:[7,13,24,36,38,50,52,53,69,80,90,102,103],pool_sampl:39,pooldataset:[38,39,50],pooleddataset:13,pooledmutsdataset:[13,39],poolreport:39,popul:20,popular:114,portabl:96,portmanteau:60,pos3:15,pos5:15,pos_dtyp:15,pos_gu:38,pos_head:50,pos_index:15,pos_kept:[36,38],pos_max_fmut:38,pos_min_ninfo:38,pos_num:[11,15,40],pos_polya:38,pos_us:38,posgraphrunn:35,posgraphwrit:35,poshistogramgraph:35,poshistogramrunn:35,poshistogramwrit:35,posit:[5,8,10,11,15,16,17,20,21,24,28,29,30,33,34,35,37,38,40,41,42,44,46,47,50,51,52,53,56,58,61,67,69,70,82,87,88,90,91,96,101,102,108,109,110],possibl:[5,13,14,15,29,41,45,50,55,96,97,104,106,107,109,115],post:[8,96],postabl:[33,35,37,50],postableload:50,postablewrit:50,potenti:[17,63],power:64,practic:109,pre:[104,114],preced:44,precis:[13,50],predic:35,predict:[20,34,52,53,61,62,67,79,90,94,101,102,108,111],prefer:[9,117],prefix:[8,33,88,107],prenorm:20,prep:96,prepar:[96,109],prerequisit:[110,111,112],preserv:[64,96,106],prespecifi:97,press:93,presum:104,prev_bic:11,prevent:[8,55,96,103,105],previou:[11,61,85,104],primari:[27,56,93,100],primarili:8,primer:[29,34,38,52,53,76,90,111,114],primer_gap:[29,34,38,52,53],primertupl:29,print:[51,53,93,111,113],print_multi_grep_dict:32,printabl:29,prior:44,prioriti:96,privat:58,probabl:[20,50,64,96,97,106],probe:[20,75,104],problem:[34,63,93,96,97,104,106,114],problemat:104,proc:[53,96,104,106],procedur:[20,86],process:[8,10,11,22,24,33,34,36,37,38,39,40,44,47,50,52,53,60,68,91,95,96,104,106,108,111,117],processor:[96,104,106,111,115],produc:[13,20,34,55,63,80,85,88,103,105,117],product:20,profil:[1,9,20,28,34,35,50,52,61,62,67,79,87,88,90,94,96,100,101,104,109,113],profile_masked_acgtdi:89,profile_masked_m:89,profile_masked_n:89,profile_nam:35,profilegraph:35,profilepost:50,profilerunn:35,profilewrit:35,program:[8,34,40,44,52,53,63,88,93,96,100,104,106,111,115],progress:[93,97],proj1:96,proj2:96,project:[64,68,96,111,113,114],prone:[20,111],prop:85,proper:35,properli:[53,111,113],properti:[8,11,13,15,18,19,26,28,29,30,35,36,38,40,41,44,50,58],proport:[11,20,29,40,66],proportion:94,props_se:11,provid:[20,35,55,66,70,93,96,97,106,109],ps1:113,psm1:113,ptrn_fanci:26,ptrn_plain:26,publish:[4,88,97],purpl:13,purpos:[4,7,20,61,63,80,97,100,106,115],put:[41,73,106,108],py:[7,9,40],python3:113,python:[20,65,69,70,72,93,97,104,106,110,112,114],q0:89,q1:53,q2:53,q:[13,53,93,94],qc:[53,96],qc_extract:[8,52],qmin:44,qname:[44,84,106],qnamesbatch:40,qnamesbatchio:[40,57,106],qq:[13,93],qual:[8,42,44,45],qualiti:[8,22,23,40,41,42,44,45,52,53,77,104,111],quality_cod:22,quantifi:96,quantil:[20,34,35,50,52,53,79,90],queri:96,quiet:[13,93],quit:93,quotient:64,r2:53,r:[20,29,35,53,58,89,99],rais:[11,13,17,20,26,29,30,42,52,53,63,64,86,93],ram:115,ran:[103,105,106],randal:120,random:[11,16,20,25,29,30,50],randomli:[96,97],rang:[29,50,93,109],range_int:[29,50],range_on:29,rangeindex:20,rank:[11,20,44,68],rare:[20,55,104,109],rate:[11,20,21,28,34,35,40,52,53,67,88,90,92,96,101,102,104,110],rather:[18,24,35,44,50,60,114,120],ratio:[34,35,50,52,53,79,89],rational:86,raw:[13,88,117],rc:29,re:[8,26,52,53,77,111,114,115],reach:97,reactiv:[20,28,34],read:[8,9,11,13,15,18,20,21,22,26,29,32,35,38,40,42,44,45,46,50,52,53,54,56,60,63,65,68,69,70,77,80,82,84,88,90,99,100,101,102,108,111,114,120],read_1_id:64,read_2_id:64,read_bas:[26,44],read_dtyp:15,read_head:50,read_id_dict:32,read_index:15,read_nam:40,read_num:[11,15,38,40],read_qual:44,read_weight:[11,15],readabl:[13,41,70,72],readbatch:[13,15,18],readbatchio:[11,13,18,38,40],readgraphrunn:35,readgraphwrit:35,readhistogramgraph:35,readhistogramrunn:35,readhistogramwrit:35,reads_noclose_mut:15,reads_per_po:15,readtabl:[33,50],readtableload:50,readtablewrit:50,reagent:104,real:[11,20,96,97],realiz:[85,97],realli:[57,59],reason:[13,20,96,100,104],reassembl:5,recal:55,recast:18,recast_file_path:18,receiv:[4,24,28,35,55,96,101],recommend:[64,96,100,104,113,114],record:[5,13,22,25,40,44,61,62,63,64,80,93,96,97,100,104,105,106],records_per_batch:40,rectangular:20,recurs:[13,91,96],red:13,redistribut:4,reduc:[13,20,95,106,117],redund:13,ref:[8,9,11,13,18,22,26,28,29,33,34,35,36,39,40,42,44,45,50,52,53,55,59,66,85,86,88,89,91,92,96,97,99,100,103,104,105,106,107,108],ref_bas:[26,44],ref_fil:8,ref_header_cmd:22,ref_sect:29,ref_seq:29,ref_to_align:41,refa:[71,108,109],refb:[71,108,109],refc:109,refer:[5,8,9,11,13,15,18,22,26,28,29,30,33,34,35,36,38,39,40,41,42,44,50,52,53,54,56,59,61,64,65,68,69,71,72,76,77,78,79,81,82,83,84,86,88,90,91,97,99,100,102,103,104,105,107,108,113],refin:20,refio:[13,18,39,40],reflen:[13,15,29,40,44],reflenmutsbatch:[15,40],refram:20,reframe_lik:20,refs_fil:22,refs_file_csv:32,refs_meta:[32,33,52,53],refs_metadata:33,refsect:29,refseq:[13,15,18,29,40,41,42,44,45,50,52,58,106],refseq_fil:40,refseq_file_auto_field:40,refseq_file_path:40,refseq_file_seg_typ:40,refseqio:[18,58,106],refseqmutsbatch:[11,15,38,40],refseqreport:13,refset_path:8,refus:[103,105],regardless:[5,20,93],regener:85,regex:[21,42],region:106,regular:[21,113],regular_grep:32,regularli:114,reinstal:114,rel:[7,8,11,13,15,20,35,38,42,44,50,53,96],rel_cod:50,rel_del_po:44,rel_ins_po:44,rel_nam:35,relat:[7,13,27,38,39,50,54,57,60,63,68,69,80,89,90,91,96,99,100,102,107,108,110],relate_lin:45,relate_test:45,relatebatch:40,relatebatchio:[40,59,106],relatedataset:[38,40,50],relateerror:44,relateio:40,relatenotimplementederror:44,relatereflenbatch:40,relaterefseqbatch:40,relatereport:40,relatetabul:50,relatevalueerror:44,relationship:[13,15,26,35,40,42,44,50,53,56,59,66,87,90,96,101,102,104],relationwrit:40,relclusthead:13,relcolormap:35,relev:[29,115],relhead:13,relhistogramgraph:35,relhistogramrunn:35,relhistogramwrit:35,relmask:38,relpattern:[11,13,15,26,38,50],relpost:50,relpostableload:50,relpostablewrit:50,relreadt:50,relreadtableload:50,relreadtablewrit:50,rels_group:35,rels_per_po:15,rels_per_read:15,reltabl:50,reltypet:50,reltypetableload:50,relvec:[8,41,42],relvecs_to_sam_fil:8,relvecs_to_sam_lin:8,remain:[61,63,86],rememb:113,remov:[20,24,25,29,32,86,104,106,113],remove_nan:20,removes_nan:20,renam:[35,106],rename_column:35,renumb:[7,28,29,53,61],renumber_ct:28,renumber_from:[28,29],renumber_pair:28,renumct:[7,61],reopen:113,repeat:[9,16,34,55,64,73,85,96],repetit:[55,106],replac:[5,13,20,86,91,92,96,113],repli:115,replic:104,report:[8,11,13,34,36,38,39,40,50,52,53,60,69,85,91,108,110],report_fil:[11,13,50],report_fold:32,report_path_auto_field:13,report_path_seg_typ:13,repres:[5,8,22,35,41,44,55,64,103,105],represent:[5,42],reproduc:[76,97,109],request:[64,110],requir:[5,13,34,53,63,68,71,73,74,75,76,85,94,95,96,97,100,104,108,111,113,114],require_depend:17,reran:105,rerun:[85,86,96,97,104,106],resampl:50,reset:44,residu:104,resiz:88,resolv:[32,97],resolve_or_analyze_multigrepped_read:32,resort:96,resourc:85,resp:11,respect:[20,28,29,41,44,59,63,64,93,94,96,97,100,104,107,108,109,114],respond:115,respons:11,resps_se:11,rest:[111,113],restart:113,restor:[5,18,29,85],restore_temp_backup:18,restrict:[63,96],result:[5,11,20,21,24,40,42,52,53,55,65,69,80,85,88,90,96,97,100,101,104,106,107,108,110,116,117],retitl:34,retitle_ct_structur:34,retriev:20,return_docstr:14,rev:[29,44,96],rev_barcod:32,rev_barcode_end:32,rev_barcode_start:32,rev_clip:32,rev_prim:32,rev_secondary_signatur:32,rev_secondary_signature_end:32,rev_secondary_signature_start:32,revers:[5,20,29,30,34,38,52,53,76,96,104,109],reverse_compli:32,reward:96,rf:[53,96],ribosom:96,right:[17,20,86,100,117],risk:[13,96,117],riski:[13,114],rm_temp:25,rmsd:[11,20],rna2dpart:28,rna2dstem:28,rna2dstemloop:28,rna:[0,1,4,5,13,18,20,29,30,34,35,50,52,53,55,58,60,63,64,65,67,68,69,75,77,78,79,81,82,83,84,86,88,90,91,93,95,96,97,99,101,103,104,105,106,107,108,109,112,113,114,115,117],rna_2024:93,rna_yyyi:93,rnajunct:28,rname:44,rnaprofil:[28,34,35],rnasect:28,rnastat:[28,35],rnastructur:[28,34,52,53,111],rnext:8,roc:[28,34,35,61,101],rocgraph:35,rochest:[34,93,111],rocrunn:35,rocwrit:35,roll:[35,53,101],rolling_auc:28,rollingaucgraph:35,rollingaucrunn:35,rollingaucwrit:35,rollingcorrelationgraph:35,rollingcorrelationrunn:35,rollingcorrelationwrit:35,rollinggraph:35,root:[11,20,28,53],round:50,rouskin:[0,1,4],rouskinlab:117,routin:[93,114],row:[20,21,35,50,55,73],row_index:35,row_titl:35,rt:[29,104,109],rule:[61,63,85],run1:11,run2:11,run:[8,9,10,11,17,20,24,25,32,33,34,35,36,37,38,39,40,42,47,50,51,52,64,77,78,80,85,90,92,93,96,100,101,103,104,105,106,110,111,113,114,115],run_cmd:17,run_fastqc:[8,9],run_func:25,run_max_ord:11,run_multi_grep:32,run_ord:11,run_seqkit_grep:32,run_seqkit_grep_funct:32,runorderresult:11,runtest:[9,12,16,19,21,23,25,27,30,31,42,45,46],s41586:20,s:[8,9,13,20,24,35,41,42,44,50,53,55,58,60,63,64,66,73,74,75,76,85,86,87,90,93,96,99,101,103,105,106,109,111,114],safeguard:96,sai:[96,113],salient:93,sam:[7,22,40,44,45,52,53,65,69,77,96,106],sam_head:8,sam_out:8,same:[11,13,15,20,24,28,29,30,35,52,53,55,59,63,64,68,85,86,88,92,96,97,100,103,105,106],samflag:44,sampl:[8,9,11,13,18,20,28,29,33,35,36,39,40,50,52,53,64,65,68,69,72,76,77,78,79,81,82,83,84,85,88,89,90,91,92,97,100,102,103,104,106,107,108,109],sample1:[35,83,108],sample1_r1:96,sample1_r2:96,sample2:[35,83,96],sample3:96,sample4:[96,108],sample5:108,sample6:108,sample_nam:32,sample_r1:[9,96],sample_r2:[9,96],samples_meta:[33,52,53],samples_metadata:33,samread:44,samtool:[22,44,68,96,111],sanit:[13,15,18,40],sanitize_end:15,sanitize_po:15,sanitize_valu:15,sars2:[93,117],sars2_1799:[77,78,79,81,82,83],satisfi:9,save:[11,13,18,58,80,93,97,104,106,114,117],save_brickl:18,scalar:5,scale:[5,20,94,100],scale_test:21,scatter:[35,101],scatterplotgraph:35,scatterplotrunn:35,scatterplotwrit:35,scc:53,scenario:100,scheme:[22,96],scholar:0,school:0,score:[8,9,22,40,44,52,53,55,77,97],scott:0,screen:93,script:7,scroll:111,sdi:88,search:[13,52,53,91,96],search_end_index:32,search_start_ind:32,second:[13,20,29,35,44,55,64,66,96,103,104,105],secondari:[1,20,28,34,52,53,65,69,90,102,108],secondary_signatur:32,secondary_signature_end:32,secondary_signature_start:32,sect:[11,13,18,28,33,35,36,38,50,53,66,85,88,89,92,100,103,104,107],sectio:[11,18,36,38],section3:28,section5:28,section:[11,13,15,18,20,22,28,29,30,34,35,36,38,50,52,53,61,67,69,72,73,78,79,81,82,88,90,93,96,97,102,107,110,111,113],section_end5:11,section_end:66,section_start:66,section_test:30,sectionfind:29,sections_fil:[34,38,52,53],sectiontupl:29,sects_fil:29,see:[4,24,55,57,58,59,60,61,62,63,64,66,68,85,86,88,89,91,96,97,99,100,101,102,103,104,105,106,107,108,109,111,113,114,115],seed:[8,11,50,52,53,77],seem:111,seg_typ:[8,13,18],segment:[5,8,11,13,18,34,35,36,38,39,40,50,96],segment_nam:13,segment_typ:13,seismic:[0,4,13,18,33,51,52,55,60,61,62,63,64,65,67,68,69,73,77,78,79,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,100,101,103,104,105,106,107,108,109,112,113,114,115,116,117],seismicrna:[93,110],select:[8,11,13,18,34,35,36,38,39,40,88,96,100,104],self:[9,15,96,120],semibitcal:26,sensit:[73,74,75,76],separ:[8,9,13,20,21,35,52,53,70,72,73,91,93,104,106,109,114],seq5:[28,29],seq:[7,8,10,11,13,15,18,28,34,35,38,40,41,42,44,45,50,52],seq_fold:32,seq_len:40,seq_length:15,seq_object:32,seq_pos_to_index:[29,30],seq_record:28,seq_typ:[10,29],seqcolormap:35,sequenc:[1,6,8,9,10,13,15,28,29,30,32,34,35,38,40,41,42,44,52,53,54,55,56,59,61,62,65,66,67,68,69,71,72,74,76,82,84,86,90,100,102,108,110],sequence_fold:32,sequence_obj:32,sequence_object:32,seri:[11,15,17,20,24,28,29,30,33,35,40,50,52,62,66,95],serial:53,serv:[20,80,106],session:116,set:[8,13,20,24,29,30,32,38,44,52,53,55,60,76,85,86,87,94,102,109,112,113,118],setup:9,sever:[13,50,87,88,93,96,97,100,104,113,117],sh:113,sha:118,shape:[20,21,104],share:[15,16,29,55,59,64,88,103,105],shasum:117,shell:[17,91,93,113],shellcommand:17,shift:93,shlex:17,shorten:106,shorter:[55,96],should:[4,9,20,21,25,26,46,52,53,55,73,86,88,93,96,97,103,104,105,106,117],show:[55,93],shown:[5,55,57,59],shtml:111,side1:28,side2:28,side:[5,13,86,96],sienna:64,signatur:13,silent:20,silvi:0,sim:[7,8,40,52],sim_test:[9,46],sim_whol:52,similar:[64,68,91,96,97,104,106,111,113,115],similarli:55,simpl:20,simpler:[8,9],simplest:8,simpli:[30,63,73,85,88,109,114],simplic:[57,59],simplif:50,simplifi:[8,9],simul:[7,21,29,40],simulate_batch:40,simulate_p_clust:40,simulate_p_end:40,simulate_p_mut:40,simulate_param:21,simulate_qnames_batch:40,simulate_read:21,simulate_read_nam:40,simulate_rel:40,simulate_relate_batch:40,simultan:[8,10,11,33,34,36,37,38,39,40,47,50,52,53,90,95,114],sinc:[20,44,73,85,96,97,106,109],singl:[8,22,24,52,53,63,68,106],site:[29,104,113],situat:55,six:[55,61,96,101],size:[5,13,15,20,28,29,40,52,53,68,96,97,104],skew:104,skip:106,slash:35,slice:[29,30],slide:[20,28,52,53],slightli:[44,97,117],slower:[96,104,106],small:[5,8,85,91,96,100,104],smaller:[85,96,104,106],smallest:[8,9,11,13],smoothli:109,so:[7,8,11,13,20,24,29,34,44,55,64,66,85,86,91,93,96,97,99,103,104,105,106,109,111,113,114,115],sodium:75,soft:42,softwar:[4,29,64,67,70,72,80,93,100,112,115],softwarea:114,sofwar:112,sole:55,solut:[8,20,97,106],solv:[1,20,97,106,114],some:[34,35,55,85,86,88,94,96,104,106,111],someon:115,someth:[93,115],soon:115,sort:[8,11,15,22],sort_replicate_run:11,sort_xam_cmd:22,sourc:[35,44,52,53,88,106],source_dir:19,source_path:18,sourcebackupdir:19,sourceforg:111,space:[5,58,85,91,96,111],span:[55,109],spare:114,spearman:[20,53,104],spec:44,special:[63,91],special_metadata:33,specif:[8,9,11,13,20,22,29,37,40,44,55,68,92,96,100,103,104,109,111,114,115],specifi:[11,13,20,25,26,41,55,73,76,82,85,88,93,97,103,104,106,108,109],spectrum:100,speed:[44,52,53,95,96,106],spell:111,split:[5,32,40,53,68,90,96,102],split_count:32,split_fastq:32,spot:93,spuriou:96,squar:[11,20,53,100],squeez:50,ss:93,stack:[35,88],stack_end_coord:15,stall:20,stamp:44,standard:[20,29,86,90,96],start:[20,28,29,30,34,52,53,61,63,64,73,85,97,109,113],state:[28,35,88,97],statement:11,statis:96,statist:22,statu:[1,13,93,104],std:78,stdout:[51,53],stem:28,step:[5,8,13,36,39,40,57,67,68,80,85,90,93,96,97,100,102,104,106,107,110],step_del_po:44,still:[20,52,53,85,96,97,99,104,111],stop:[13,85,93,97],storag:[5,68,96],store:[29,58,60,95,96],str:[8,9,10,11,13,14,15,17,18,20,21,22,24,26,28,29,30,32,33,34,35,36,37,38,39,40,41,42,44,45,47,50,52,57,71,74,75,76,77,78,79,81,82,83,84],straightforward:55,strategi:13,stretch:[29,104],strict:[13,104],string:[5,8,9,11,13,24,26,29,35,41,42,44,45,52,53,64,74,75,96],struct:[28,34,35,52,53],struct_fil:[35,52,53],struct_sect:[35,52,53],structonetablegraph:35,structonetablerunn:35,structur:[1,11,20,28,34,35,50,52,53,60,65,67,69,79,88,90,94,102,104,106,108,111],struggl:104,studi:97,style:[13,100],sub:[7,8,13,53,88,89,93],sub_a:66,sub_c:66,sub_g:66,sub_hist:66,sub_n:66,sub_opt:40,sub_rat:66,sub_t:66,subclass:[29,50],subcommand:[53,87,88],subdirectori:13,subject:[35,97],submit:[52,53,88,115],submodul:110,suboptim:[34,52,53,79],subpackag:110,subplot:[35,88],subprocess:[8,17,22],subsect:[28,29],subsequ:[1,59,85],subshel:17,subsitit:88,subsitut:[88,106],subst:45,substep:104,substitit:66,substitut:[8,9,26,40,42,44,55,66,88,96,104,111,116],subtl:97,subtract:20,succe:24,success:[85,97],successfulli:111,suffic:96,suffici:[44,97,120],suggest:[60,115],suit:96,sulfat:1,sum:[20,22],summar:[40,80,96,97,104,106],summari:96,sun:93,super_dir:32,super_fastq:32,super_write_fastq:32,superscript:104,supplement:13,support:[29,63,64,70,72,80,111],suppos:[5,55,57,58,59,60,73,85,92,96,103,105,109,114],suppress:13,sure:[96,100,111,113],surpris:104,suspect:20,swap_po:44,sweep:44,sweep_indel:44,symbol:[13,33],symlink:13,system:[13,28,29,63,75,85,93,96,104,106,111,113,114,115,118],t:[5,8,9,26,29,35,42,53,55,63,64,66,82,86,88,89,97,103,104,105,106],t_or_u:29,taagt___:59,tab:93,tabl:[5,7,11,13,28,29,33,34,35,37,47,55,60,65,66,69,85,88,89,90,102,103,105,108,117],table1:35,table1_fil:35,table2:35,table2_fil:35,table_clust:[50,52],table_fil:[35,37,50],table_per_clust:50,table_per_po:50,table_per_read:50,table_po:[50,52],table_read:[50,52],table_to_dict:28,table_to_pair:28,tableload:50,tablewrit:50,tabul:[50,52,53,107],tabulate_load:50,tacaggtccgcatg:76,tacgtcgtcgtc:64,take:[13,17,18,55,91,96,104,113,114,115],taken:[13,64,77,78,79,81,82,83,84,109],target:[15,16,20,21,40,52,53],task:[8,10,11,24,33,34,36,37,38,39,40,47,50,52,53,90,96,104,106,110,114,120],tatg:109,tcagaacc:59,tcg:109,tct_____:59,teal:64,teal_r2:64,teardown:9,technic:60,tediou:[13,114],tell:[96,97],temp:[8,24,34,40,52,53,100],temp_delete_idsets_to_pickle_dict:32,temp_dir:[8,18,25,32,34,40,52,53],temp_fq1:9,temp_fq2:9,temp_fq:9,temp_sam_path:40,temp_test:25,temperatur:[34,52,53,75,79,100],temperrfilt:25,templat:[8,104],temporari:[8,9,18,25,34,40,52,53,96],tend:104,term:[4,68,96],termin:[96,104,106,116,117],tertiari:1,test:[7,8,11,13,15,18,20,22,24,26,29,40,41,44,48,85,93,114],test_0d:31,test_0d_1dim:31,test_0d_non:31,test_0d_nonzero:31,test_0d_nonzero_extra:31,test_1_clust:46,test_1_dim:21,test_1_series_size_1_min_0_excl_nan:30,test_1_series_size_1_min_0_incl_nan:30,test_1_series_size_1_min_1_excl_nan:30,test_1_series_size_1_min_1_incl_nan:30,test_1_series_size_2_min_1_excl_nan:30,test_1_series_size_2_min_1_incl_nan:30,test_1_series_size_2_min_2_excl_nan:30,test_1_series_size_2_min_2_incl_nan:30,test_1d:[16,31],test_1d_0dim_non:31,test_1d_1d_cross:31,test_1d_1d_separ:31,test_1d_1dim_non:31,test_1d_2d_congru:31,test_1d_2d_cross:31,test_1d_2dim:31,test_1d_2dim_non:31,test_1d_nonzero:31,test_1po:12,test_1pos_2clust:12,test_1x1:21,test_1x1x1:21,test_1x1x2:21,test_2_clust:46,test_2_dim:21,test_2_series_size_1_min_0_excl_nan:30,test_2_series_size_1_min_0_incl_nan:30,test_2_series_size_1_min_1_excl_nan:30,test_2_series_size_1_min_1_incl_nan:30,test_2_series_size_2_min_0_excl_nan:30,test_2_series_size_2_min_0_incl_nan:30,test_2_series_size_2_min_1_excl_nan:30,test_2_series_size_2_min_1_incl_nan:30,test_2_series_size_2_min_2_excl_nan:30,test_2_series_size_2_min_2_incl_nan:30,test_2d:[21,31],test_2d_1dim_non:31,test_2d_2d_congru:31,test_2d_2d_cross:31,test_2d_nonzero:31,test_2pos_gap0:12,test_2pos_gap0_2clust:12,test_2pos_gap1:12,test_2pos_masked0:12,test_2pos_masked1:12,test_2x2:21,test_2x2x1:21,test_2x2x2:21,test_2x2x2x2:21,test_3d:21,test_a:42,test_aa:42,test_aaaa_0in:45,test_aaaaaa_0in:45,test_aacc_1in:45,test_abstract:31,test_abstract_base_class:30,test_acgt_1in:45,test_add_mask:30,test_add_mask_invalid:30,test_add_mask_invert:30,test_add_overlapping_mask:30,test_add_unordered_mask:30,test_agg:42,test_al:31,test_all_match:42,test_all_match_n:42,test_all_zero:21,test_alph:30,test_arrai:21,test_array0d:21,test_array1d:21,test_array1d_all_nan:21,test_array1d_allzero:21,test_array1d_empti:21,test_array1d_exampl:21,test_array1d_extrem:21,test_array1d_nan:21,test_array1d_some_nan:21,test_array2d:21,test_array2d_one_col_nan:21,test_array2d_one_row_nan:21,test_array3d:21,test_array_arrai:21,test_array_datafram:21,test_array_index:21,test_array_index_index:21,test_array_int:21,test_array_non:21,test_array_seri:21,test_array_series_datafram:21,test_array_series_dataframe_mismatch:21,test_average_prefix:31,test_backup_dir:19,test_backup_fil:19,test_bas:46,test_base_nam:30,test_blank:30,test_bool:30,test_both_blank:45,test_both_read:45,test_c:42,test_calc_p_ends_given_observ:21,test_cigar_align_valid:45,test_cigar_init_invalid:42,test_cigar_init_valid:42,test_cigar_lengthen:42,test_cigar_m_aln_valid:42,test_cigar_m_del_valid:42,test_cigar_m_ins_valid:42,test_cigar_m_mat_valid:42,test_cigar_m_scl_valid:42,test_cigar_m_sub_valid:42,test_cigar_match_subst_valid:[42,45],test_cigar_str:42,test_cigar_xeq_aln_valid:42,test_cigar_xeq_del_valid:42,test_cigar_xeq_ins_valid:42,test_cigar_xeq_mat_valid:42,test_cigar_xeq_scl_valid:42,test_cigar_xeq_sub_valid:42,test_clust:[21,31],test_clust_nam:31,test_cluster_prefix:31,test_clusthead:31,test_comp:21,test_contigu:[16,21],test_copi:30,test_datafram:21,test_dataframe_arrai:21,test_dataframe_datafram:21,test_decod:23,test_delete_invalid:42,test_delete_valid:42,test_derived_cod:27,test_dict_str_dna_rna:30,test_diff_end3:30,test_diff_end5:30,test_diff_ful:30,test_diff_length:16,test_diff_mask_nam:30,test_diff_mask_po:30,test_diff_nam:30,test_diff_ref:30,test_diff_seq5:30,test_diff_seq:30,test_different_typ:31,test_drop_arrai:21,test_drop_datafram:21,test_drop_seri:21,test_duplicate_nam:30,test_empti:[21,30,31,45],test_empty_invalid:30,test_encod:23,test_encode_match_hi_qu:45,test_encode_match_lo_qu:45,test_encode_relate_hi_qu:45,test_encode_relate_lo_qu:45,test_equ:21,test_equal_dna_dna:30,test_equal_ful:30,test_equal_mask:30,test_equal_part:30,test_equal_rna_rna:30,test_exists_erase_temp:25,test_exists_keep_temp:25,test_extra_index_nam:31,test_extra_valu:31,test_find_gu:30,test_find_polya:30,test_float:31,test_float_arrai:21,test_float_clust:31,test_float_datafram:21,test_float_float:21,test_float_index:21,test_float_index_index:21,test_float_index_index_index:21,test_float_index_index_int:21,test_float_index_int:21,test_float_int:21,test_float_int_index:21,test_float_non:21,test_float_ord:31,test_float_seri:21,test_format_fasta_name_lin:30,test_format_fasta_record:30,test_format_fasta_seq_lin:30,test_ful:30,test_full_blank_nam:30,test_full_end3:30,test_full_end5:30,test_full_given_nam:30,test_full_length:30,test_full_nam:30,test_full_section_full_length_sub:30,test_full_section_full_sub:30,test_full_section_full_sub_end3:30,test_full_section_full_sub_end5:30,test_full_section_full_sub_nam:30,test_g:42,test_gap_le_zero_le_npo:21,test_get_alphaset:30,test_get_comp:30,test_get_comptran:30,test_get_invers:16,test_get_mask:30,test_get_nonalphaset:30,test_hashable_dna:30,test_hashable_rna:30,test_hyphen:30,test_illegal_prefix:30,test_illegal_suffix:30,test_index:31,test_inequality_min_num_edit:9,test_inequality_subst_vs_indel:9,test_inf:21,test_insert_bare_invalid:42,test_insert_dangling_3_invalid:42,test_insert_dangling_5_invalid:42,test_insert_deletion_invalid:42,test_insert_end3_invalid:42,test_insert_end5_invalid:42,test_insert_non_match_valid:42,test_insert_valid:42,test_invalid:46,test_invalid_bas:30,test_invalid_dim:21,test_invalid_dup_1:30,test_invalid_empty_seq_1:30,test_invalid_empty_seq_2:30,test_invalid_empty_seq_3:30,test_invalid_full_0:30,test_invalid_greater_end_9:30,test_invalid_less_start_2:30,test_invalid_nam:30,test_invalid_noncontig:30,test_invalid_numer:31,test_invalid_quantil:21,test_invalid_seq:30,test_invalid_unsort_1:30,test_invert:21,test_is_invers:16,test_iter_clust_index:31,test_length_0:[16,21],test_length_1:[16,21,42],test_length_2:42,test_length_2_diff:16,test_length_2_min_gap_1:21,test_length_2_sam:16,test_length_3:42,test_length_3_diff_weight:16,test_length_3_min_gap_1:21,test_length_3_min_gap_2:21,test_length_3_same_weight:16,test_length_4_min_gap_1:21,test_length_4_min_gap_2:21,test_length_4_min_gap_3:21,test_level:31,test_level_kei:31,test_level_nam:31,test_line_in_sam_format:9,test_lock:25,test_low_qu:42,test_low_qual_invalid:42,test_low_qual_valid:42,test_mask_gu:30,test_mask_nam:30,test_mask_po:30,test_mask_polya:30,test_masked_bool:30,test_masked_int:30,test_masked_zero:30,test_max_ord:31,test_min_gap_0:21,test_min_ord:31,test_misformat:30,test_missing_index_nam:31,test_missing_valu:31,test_modified_al:31,test_modified_empty_rel:31,test_modified_max_ord:31,test_modified_max_order_0:31,test_modified_min_ord:31,test_modified_non:31,test_modified_nullifi:31,test_modified_rel:31,test_more_mut:21,test_n:42,test_nam:31,test_name_mark:30,test_nan:21,test_ncls1:21,test_ncls2:21,test_neg:[16,31],test_negative_non:31,test_negative_posit:31,test_negative_zero:31,test_negative_zero_allow:31,test_new_erase_temp:25,test_new_keep_temp:25,test_nmut:46,test_no_mut:21,test_no_overwrit:30,test_nocov_valid:42,test_non:31,test_none_2d:31,test_nonnumer:31,test_not_equal_dna_rna:30,test_not_equal_dna_str:30,test_not_equal_rna_str:30,test_np_typ:27,test_npos0_ncls1:21,test_npos1_ncls0:21,test_npos1_ncls1:21,test_npos2_ncls1:21,test_npos_le_zero_le_gap:21,test_num_level:31,test_one_degener:30,test_one_ful:30,test_one_full_nam:30,test_one_invalid:30,test_one_mask:30,test_one_mut:21,test_one_slic:30,test_one_valid:30,test_one_zero_allow:31,test_one_zero_unallow:31,test_ord:31,test_order_nam:31,test_other_dim:16,test_overwrit:30,test_p_clust:21,test_p_noclos:21,test_partial_length:30,test_partial_reflen_equ:30,test_partial_reflen_great:30,test_partial_reflen_less:30,test_partial_seq5_equ:30,test_partial_seq5_great:30,test_partial_seq5_less:30,test_partial_seq5_reflen:30,test_partial_slic:30,test_partial_slice_invalid_end3:30,test_partial_slice_invalid_end5:30,test_partial_slice_invalid_reflen:30,test_partial_slice_invalid_seq5:30,test_partial_trunc_section_trunc_sub:30,test_phr:23,test_picto:30,test_pos_nam:30,test_posit:31,test_positive_invalid_dup:31,test_positive_no_dup:31,test_positive_non:31,test_positive_posit:31,test_positive_valid_dup:31,test_positive_zero:31,test_primary_cod:27,test_qual:23,test_random:30,test_rang:30,test_range_int:30,test_range_on:30,test_read1:45,test_read2:45,test_reduce_0:21,test_reduce_0_and_1:21,test_reduce_non:21,test_rel:31,test_rel_index:31,test_rel_index_invalid_nam:31,test_rel_index_rep:31,test_rel_index_valid_nam:31,test_rel_multiindex:31,test_rel_nam:31,test_relclust:31,test_relclusthead:31,test_relhead:31,test_rels_dupl:31,test_rels_empti:31,test_rels_norm:31,test_rep:16,test_restore_dir:19,test_restore_fil:19,test_reverse_compl:30,test_reverse_transcrib:30,test_same_length:16,test_score_consist:9,test_select_clust:31,test_select_extra:31,test_select_extra_emptystr:31,test_select_extra_non:31,test_select_extra_zero:31,test_select_invalid:31,test_select_invalid_clust:31,test_select_invalid_ord:31,test_select_invalid_rel:31,test_select_non:31,test_select_one_rel:31,test_select_ord:31,test_select_order_clust_empti:31,test_select_order_clust_exist:31,test_select_orders_clusts_exist:31,test_select_rel:31,test_select_two_rel:31,test_seq_index_nam:30,test_seri:21,test_series_arrai:21,test_series_seri:21,test_set_str_dna_rna:30,test_side3_equal_length:9,test_side3_neg_length:9,test_side3_over_length:9,test_side3_under_length:9,test_side3_zero_length:9,test_side5_equal_length:9,test_side5_neg_length:9,test_side5_over_length:9,test_side5_under_length:9,test_side5_zero_length:9,test_signatur:31,test_simul:[21,46],test_siz:[30,31],test_slic:30,test_slice_end3_equ:30,test_slice_end3_great:30,test_slice_end3_less:30,test_slice_end5_end3:30,test_slice_end5_end3_invalid:30,test_slice_end5_equ:30,test_slice_end5_great:30,test_slice_end5_less:30,test_slice_length:30,test_stack:16,test_subst_invalid:42,test_subst_valid:42,test_sum_posit:21,test_sum_zero:21,test_t:42,test_three_overlap:30,test_to_arrai:30,test_transcrib:30,test_tril:21,test_triu:21,test_trunc_section_full_sub:30,test_trunc_section_trunc_sub:30,test_two_degener:30,test_two_disjoint:30,test_two_disjoint_refseq:30,test_two_disjoint_wrong_refseq:30,test_two_ful:30,test_two_invalid:30,test_two_mask:30,test_two_overlap:30,test_two_overlapping_refseq:30,test_two_valid:30,test_typ:42,test_unequ:21,test_unequal_length:16,test_unmask:30,test_unmasked_bool:30,test_unmasked_int:30,test_unmasked_zero:30,test_valid:[30,31],test_valid_blank_lin:30,test_valid_dna:30,test_valid_empti:30,test_valid_empty_1:30,test_valid_empty_seq:30,test_valid_ful:30,test_valid_full_1:30,test_valid_full_9:30,test_valid_nam:30,test_valid_no_po:30,test_valid_noncontig:30,test_valid_noncontig_2:30,test_valid_rna:30,test_valid_slic:30,test_valid_slice_6:30,test_whole_numb:31,test_window_0:30,test_window_float:30,test_window_length:30,test_window_margin:30,test_with_clip:21,test_without_clip:21,test_wrap:25,test_xaax:42,test_zero:31,test_zero_degener:30,test_zero_invalid:30,test_zero_le_gap_lt_npo:21,test_zero_lt_npos_le_gap:21,test_zero_negative_allow:31,test_zero_non:31,test_zero_on:31,test_zero_one_allow:31,test_zero_one_unallow:31,test_zero_two:31,test_zero_valid:30,test_zero_zero:31,test_zero_zero_allow:31,test_zero_zero_unallow:31,testadjustmingap:21,testalignmentscoreparam:9,testanynan:21,testassam:9,testautorefram:21,testautoremovenan:21,testautoremovesnan:21,testcalccoeffdeterm:21,testcalcnrmsd:21,testcalcparam:21,testcalcpclust:21,testcalcpclustgivennoclos:21,testcalcpearson:21,testcalcpend:21,testcalcpendsgivennoclos:21,testcalcpendsobserv:21,testcalcpmutgivenspan:21,testcalcpmutgivenspannoclos:21,testcalcpnoclos:21,testcalcquantil:21,testcalcrank:21,testcalcrm:21,testcalcspearman:21,testcas:[9,12,16,19,21,23,25,27,30,31,42,45,46],testchooseclust:46,testcigarop:42,testclip:21,testclusthead:31,testcomparewindow:21,testconst:[23,27,30,31],testcontiguousm:16,testcountcigarmut:42,testcountendcoord:16,testcountpo:21,testcountspo:21,testcountsposconsensu:21,testdecod:23,testdna:30,testencod:23,testencodematch:45,testencoderel:45,testensuresamelength:16,testequalhead:31,testexpanddegenerateseq:30,testexpect:12,testfindblankrang:9,testfindcigaroppo:42,testfinddim:31,testformat:30,testformatclustnam:31,testgetcomp:21,testgetinvers:16,testgetlength:16,testgetsharedindex:30,testgetwindow:30,testhead:31,testhyphenateend:30,testindexclust:31,testindexord:31,testindexorderclust:31,testindexordersclust:31,testindextopo:30,testindextoseq:30,testinferread:42,testintersect:30,testiterrelvecsal:42,testiterrelvecsq53:42,testlistclust:31,testlistord:31,testlistorderclust:31,testlistordersclust:31,testlocktempdir:25,testmakehead:31,testmaketempbackup:19,testmergerel:45,testnoclosemut:21,testnonan:21,testnorm:21,testparsecigar:45,testparsefasta:30,testparsehead:31,testprivatecalcpnoclosegivenend:21,testpubliccalcpnoclosegivenend:21,testrefram:21,testreframelik:21,testrelaterelatelineambrel:45,testrelclusthead:31,testrelhead:31,testremovenan:21,testremovesnan:21,testrna:30,testrunfastqc:9,testsectionaddmask:30,testsectioncopi:30,testsectionequ:30,testsectioninit:30,testsectionlength:30,testsectionmask:30,testsectionmaskgu:30,testsectionmasknam:30,testsectionmaskpo:30,testsectionmaskpolya:30,testsectionrang:30,testsectionunmask:30,testseqpostoindex:30,testsimulaterel:46,testsimulaterelatebatch:46,teststackendcoord:16,teststandard:21,testsubopt:46,testsubsect:30,testtriangular:31,testtriuallclos:21,testtriudiv:21,testtriudot:21,testtriulog:21,testtriunorm:21,testtriusum:21,testunit:30,testvalidateorderclust:31,testvalidfastaseqnam:30,testwindowtomargin:30,testwinsor:21,testwritefasta:30,testxna:30,text:[13,14,17,28,41,64,68,93,100],tg:55,tgirt:104,th:[13,59],than:[8,9,13,18,20,21,24,30,35,45,50,55,60,76,85,86,88,92,94,97,100,103,104,105,106,109,114,117,120],thank:115,thefs:81,thei:[7,8,26,32,35,55,59,60,85,86,93,96,103,105,106,109,111,113,114],them:[8,15,20,29,53,70,85,86,88,90,91,100,102,103,108,109,111,113,114,117],themselv:[55,88,103,105],thereaft:61,therefor:[20,104,109],thereof:[55,91,96],thi:[5,7,8,9,11,13,20,24,26,29,34,44,51,55,58,60,63,64,66,71,73,74,75,76,80,82,85,86,88,91,92,93,96,97,99,100,103,104,105,106,108,109,110,111,113,114,115,116,117],thing1:76,third:[13,79,100,104],those:[8,10,11,20,29,33,34,36,37,38,39,40,47,50,52,53,55,63,66,73,91,100,103,105,106,115,117],though:55,thousand:96,thread:[32,115],three:[20,68,80,88,91,96,103,104,109],thresh:[53,97],threshold:[20,55,78,85,92,93,96,97],through:[40,45,64,104],throughout:60,thu:[5,8,9,20,34,55,63,64,91,96,97,104,109,114],time:[13,20,24,29,52,53,68,77,78,79,81,82,83,84,85,88,95,97,103,105,106,109,114],titl:[13,28,34,35,61,115],title_action_sampl:35,tlen:8,to_ct:28,to_dict:[13,29],to_dir:13,to_dm:28,to_fasta:28,to_new:8,to_report_format:26,to_varna_color_fil:28,togeth:[30,82,104],toler:[8,32,52,53,77],tomezsko:[1,20,97,104],too:[8,15,20,21,38,82],tool:[63,93,96,97,106],top:[7,11,13,18,28,33,38,40,50,66,96,99,103,104,105,106,108],top_sampl:33,total:[11,20,22,29,41,55,66,104,106],toward:[1,55,104],tpr:[28,35],tr:29,trace:35,traceabl:76,track:44,trail:30,trajectori:[11,97],transcrib:[29,30,104],transcripas:104,transcript:[100,104],transcriptas:[20,104],transcriptom:96,transform:5,translat:[29,41],transpath:13,treat:[8,52,53,55,77,96,97],tree:117,triangl:[13,20],triangular:13,trim:[5,8,52,53,64,77,86,90,102,104,106],triu_log:20,trivial:97,troubleshoot:[90,93,102,112],truncat:13,trust:21,tshape:21,ttcg:5,tttcgctatgtgttac:109,tunnel:44,tupl:[5,8,9,10,11,13,14,18,20,21,24,28,29,32,33,34,35,36,37,38,39,40,42,47,50,52,58],turn:[55,108],tutori:[111,116],twice:[96,100],two:[8,9,11,13,15,17,20,21,29,30,34,35,38,41,44,52,53,55,59,61,62,63,64,73,79,88,97,101,102,104,105,106,109,114],twotabl:35,twotablegraph:35,twotablemergedgraph:35,twotablerunn:35,twotablewrit:35,txt:[13,67],type:[5,8,10,11,13,14,15,18,20,21,22,24,26,28,29,33,34,35,36,38,39,40,41,42,50,52,53,55,57,59,60,64,68,70,71,72,73,74,75,76,77,78,79,81,82,83,84,86,96,97,100,102,104,109,111,113,114,117],typeerror:[13,30],typic:64,u:[5,8,29,34,38,52,53,61,62,63,82,86],ubiquit:114,uint:13,uint_typ:13,uk:111,ulin:13,ultim:[82,115],umber:68,un:[53,64,96],unalign:[8,52,53,64,77],unambigu:41,unbia:20,unbias_test:21,uncertainti:104,unchang:86,unclear:86,uncompress:64,undefin:20,under:[4,28,29,50,96,101,104,113],underli:[20,42],underrepres:104,underw:104,unequ:16,unicod:29,unifi:8,uninstal:[113,114],union:[8,11,13,18,20,24,29,34,36,38,39,40,41],union_dict:32,union_set:32,unioned_set:32,uniq:11,uniq_read:11,uniqid:34,uniqread:11,uniqu:[11,20,34,59,78,96,97,109],unit:[8,29,51,52,53,55,88],unittest:[9,12,16,19,21,23,25,27,30,31,42,45,46,93],univers:35,universal_input_param:35,universal_output_param:35,unjoin:103,unknown:[55,97],unless:[13,104,105,106],unlik:[68,88],unlock:25,unmap:77,unmask:[11,12,20,29,33,50,52,53,66],unmasked_bool:[29,50],unmasked_int:[29,50],unmasked_po:20,unmasked_zero:29,unmatch:42,unmodifi:106,unnecessari:96,unobserv:20,unpair:[28,61],unpickl:18,unpool:105,unsign:13,unsort:30,unsur:114,until:[5,78,86,97,108,113,114],untrim:[53,96],unus:[96,103,105],unwant:[85,96],unzip:[8,52,53,96],up:[41,63,73,91,94,95,96,97,103,104,106,109,112,113,118],updat:[8,11,13,85,93,111,113,114],update_batch:11,update_field:11,update_log_count:11,update_report:11,upgrad:[111,113,114],upon:[41,96,97],upper:[20,35,50,117],upper_limit:15,uppercas:[26,63,86],upstream:[59,76,109],upward:[20,34],url:118,urmc:[34,111],us:[4,5,8,10,11,13,15,18,20,21,22,24,28,29,30,34,35,36,37,38,40,44,45,47,50,52,53,55,65,70,72,76,77,79,85,86,89,90,91,92,93,94,96,97,99,102,103,104,105,106,107,108,111,113,114,115,116,118],usabl:96,usag:[96,104,106],use_ratio:35,user:[0,29,38,55,75,82,96,113],usual:[96,109],ut:75,util:[9,29,66,110],v1:111,v2:[8,111],v6:111,v:[13,35,53,88,93],val:13,valid:[8,13,15,16,20,22,29,30,40,42,44,45,52,53,63,77,86,96,100,103,105],valid_fasta_seqnam:[29,30],validate_int:13,validate_order_clust:13,validate_str:13,validate_top:13,valu:[5,8,11,13,14,15,16,18,20,21,22,24,28,34,36,38,39,40,44,50,59,67,70,72,85,94,100,104,106],valueerror:[11,13,20,26,29,30,42,44],var_param:35,vari:[20,35],variabl:97,variant:86,variat:[20,78],varieti:[60,87],varna:[28,65,69,102],vector:[7,11,13,20,21,38,39,41,42,44,45,50,54,56,57,59,68,78,88,97,104],vectorize_read:44,venv1:114,venv2:114,venv:114,verbatim:96,verbos:[13,51,53,93],veri:[5,64,96,100,104],verifi:[16,29,96,102,113,118],verify_index_nam:29,version:[4,13,44,64,77,78,79,81,82,83,84,96,97,111,112,115,120],versu:96,vertic:[39,90,102],via:[17,20,29,55,58,60,71,76,91,109],view:22,view_xam_cmd:22,viewer:93,violat:20,viral:104,virtual:[110,112],visit:113,visual:[57,59,102],vitro:[75,104],vl00355:57,vshape:21,vv:[13,93],w:53,wa:[0,1,8,9,11,28,52,53,55,64,67,68,75,77,80,85,96,104,111,113],wai:[73,76,85,88,91,96,97,99,100,102,103,104,105,106,107,108,117],wait:93,walkthrough:[110,118],want:[8,9,73,85,91,92,96,97,100,103,105,106,111,114,117],warn:[13,93,99,103,105,115],warranti:4,wast:85,we:[8,9,20,64,96,100,104,113,114,115],weather:32,web:[33,52,53,66,90,102,117],webpag:113,websit:[68,111],weight:[11,15,20],welcom:115,well:[28,40,55,64,70,91,96,109,114],were:[20,28,55,63,77,94,96,97,103,104,105,106,109,113,115,117],wf:[7,63,97,101,102,103,105,106,108],wget:118,what1:15,what2:15,what:[13,15,33,35,55,93,96,104,106,110,115],wheel:114,when:[5,11,15,16,20,34,42,44,45,55,60,73,88,96,101,103,104,105,106,108,114,115],whenev:[68,111],where:[8,9,14,20,24,28,29,34,44,55,60,66,88,93,96,97,100,103,104,105,106,107,108,109,113,115],wherein:[13,59,104],whether:[5,8,13,15,17,21,24,26,30,36,41,44,50,52,53,55,95,96,97,103,104,108,113,117],which:[8,9,11,13,18,20,21,26,28,29,30,32,34,35,44,52,53,55,59,60,61,62,63,64,66,67,68,70,72,73,74,75,76,77,79,80,85,86,87,88,91,92,95,96,97,100,103,104,106,108,109,111,113,114,115,117],white:100,whitespac:[13,30,61,63,86],whole:[7,8,64],whose:[8,10,11,13,20,22,29,33,34,35,36,37,38,39,40,44,47,50,52,53,64,73,76,106,109],why:[112,115],wide:[70,72,80,96],width:[8,52,53,77],window:[15,20,28,29,35,52,53,96,104,106],window_to_margin:[29,30],winmin:[35,52,53],winsor:20,wise:15,wish:85,with_head:22,within:[8,29,55,59,67,91,93,96,104,106],without:[4,20,34,35,52,53,64,67,79,99,104,114],won:97,word:[8,111],work:[1,30,53,55,88,91,96,100,106,111,113,114,115],workflow:[52,64,90,97,101,102,106,110],working_directori:32,workspac:32,wors:20,worsen:97,worst:5,worth:112,would:[9,13,20,21,26,34,44,55,57,58,59,63,64,68,85,88,92,94,96,97,104,106,108,109,113,114,115],wrap:[8,13,24,29],wrapper:34,write:[7,8,10,11,13,28,29,34,35,38,47,50,53,57,61,63,64,68,93,96,97,98,100,103,104,105,106,110],write_al:40,write_batch:11,write_csv:35,write_fasta:[29,30],write_html:35,write_log_count:11,write_mod:13,write_mu:11,write_on:40,write_pdf:35,write_prop:11,write_single_run_t:11,write_temp_ref_fil:8,written:[13,28,36,39,88,93,96,109,114],wrong:[13,96],wrote:115,www:[4,111],x00:[5,58],x02:26,x0c:26,x10:26,x80:26,x9f:[5,58],x:[7,20,21,35,42,53,64,88,91,96,100,108],x_titl:35,xam:[8,9,22,40,57,65,96,106],xam_fil:40,xam_in:8,xam_inp:22,xam_input:40,xam_out:[8,22],xam_pair:22,xam_to_fq_cmd:22,xam_view:40,xamgen_cmd:8,xamgen_test:9,xamop:8,xamview:40,xdata:35,xkcd:120,xna:[8,10,13,15,18,29,30,34,35,38,40,41,42,44,45,52],xna_test:30,xontrib:113,xsh:113,y:[7,21,35,53,64,91,96,108,111],y_titl:35,ydata:35,ye:[26,71,73,74,75,76,113],yellow:13,yield:[8,13,15,26,28,29,34,35,41,42,44,50,96,97,104,108],you:[4,52,53,64,66,67,73,85,87,88,89,91,92,94,97,99,100,101,102,103,104,105,106,107,108,109,111,113,114,115,116,117],your:[4,63,85,89,91,96,97,100,103,104,105,106,108,112,114,115,117,118],yourbigcooldiscoveri:84,yourfavoriterna:84,yoursect:[73,81],yourself:96,yve:[0,14],yvesmartindestaillad:0,yyyi:93,z:[7,53,64,91,96,108],zero:[13,20,30,55,63,109],zip:96,zubradt:[1,104]},titles:["Authors","DMS-MaPseq","DREEM","About","License","Algorithm for Sequence Compression/Decompression","Algorithms","seismicrna package","seismicrna.align package","seismicrna.align.tests package","seismicrna.cleanfa package","seismicrna.cluster package","seismicrna.cluster.tests package","seismicrna.core package","seismicrna.core.arg package","seismicrna.core.batch package","seismicrna.core.batch.tests package","seismicrna.core.extern package","seismicrna.core.io package","seismicrna.core.io.tests package","seismicrna.core.mu package","seismicrna.core.mu.tests package","seismicrna.core.ngs package","seismicrna.core.ngs.tests package","seismicrna.core.parallel package","seismicrna.core.parallel.tests package","seismicrna.core.rel package","seismicrna.core.rel.tests package","seismicrna.core.rna package","seismicrna.core.seq package","seismicrna.core.seq.tests package","seismicrna.core.tests package","seismicrna.demult package","seismicrna.export package","seismicrna.fold package","seismicrna.graph package","seismicrna.join package","seismicrna.lists package","seismicrna.mask package","seismicrna.pool package","seismicrna.relate package","seismicrna.relate.aux package","seismicrna.relate.aux.tests package","seismicrna.relate.c package","seismicrna.relate.py package","seismicrna.relate.py.tests package","seismicrna.relate.tests package","seismicrna.renumct package","seismicrna.sim package","seismicrna.sim.tests package","seismicrna.table package","seismicrna.test package","seismicrna.wf package","Commands, Arguments, Options","Data Structures","Relation Vectors","Relate Data Structures","Read Names Batch","Reference Sequence","Relate Batch","Brickle: Compressed Python Objects","Connectivity Table (CT): RNA secondary structures","Dot-bracket (DB): RNA secondary structures","FASTA: Reference sequences","FASTQ: Sequencing Reads","Data Formats","Sample results: Export data from SEISMIC-RNA to SEISMIC-GRAPH","VARNA Color: Color codes for VARNA","SAM, BAM, and CRAM: Alignment Maps","File Formats","List Formats","List of Positions","Metadata Formats","Metadata for Joined Clusters","Metadata for References","Metadata for Samples","Metadata for Sections","Align Report","Cluster Report","Fold Report","Report Formats","Join Report","Mask Report","Pool Report","Relate Report","Add/Delete Orders to/from an Already-Clustered Dataset","Clean FASTA Files","Graph Results","General parameters for graphing","Profile: Bar graph of relationships(s) per position","How To","List Input Files","List Positions Matching Criteria","Log Messages","Normalize Mutation Rates","Parallelize Tasks","Align: Trim FASTQ files and align them to reference sequences","Cluster: Infer alternative structures by clustering reads\u2019 mutations","Demultiplex: Split multiplexed FASTQ files by their barcodes","Export: Export a file of each sample for the seismic-graph web app","Fold: Predict RNA secondary structures using mutation rates","Graph: Plot data from tables and/or structures and compare samples","Run SEISMIC-RNA","Join: Merge sections (horizontally) from the Mask or Cluster step","Mask: Define mutations and sections to filter reads and positions","Pool: Merge samples (vertically) from the Relate step","Relate: Compute relationships between references and aligned reads","Table: Count mutations for each read and position","Workflow: Run all steps","Define Sections","How to Research RNA Structures with SEISMIC-RNA","Installing with Conda","Install","Prerequisites: Python, pip, and Conda","Virtual Environments","Bugs and Requests","Step-by-step walkthrough","Example dataset","Step-By-Step","What it Does","How to Write this Manual"],titleterms:{"1":64,"1st":64,"2":[64,96],"256":117,"2nd":64,"3":59,"5":59,"default":101,"export":[33,66,99],"long":97,"new":[88,115],"while":[86,104,106],A:104,By:118,To:90,about:[3,73,74,75,76,85,86,92],activ:[111,114],ad:85,adapt:96,add:85,addclust:53,algorithm:[5,6,86],align:[8,9,53,68,77,96,106],all:[88,108],alphabet:64,alreadi:[85,97],altern:97,ambigu:[55,106],an:85,app:99,ar:[93,104],arbitari:104,arg:14,argument:53,assess:96,aucrol:53,author:0,automat:109,aux:[41,42],auxiliari:41,background:[5,85,86,92],bam:68,bar:89,barcod:98,base:[55,96,104],batch:[15,16,57,59,95,97,104,106],benefit:95,between:[55,96,104,106],bodi:[61,62,63],bowti:96,bracket:[62,100],brickl:60,bug:115,build:96,c:43,call:[55,96,119],can:96,caus:[103,105],cgroup:88,channel:96,charact:64,check:[96,113],checksum:117,chemistri:96,choos:96,clean:[10,86],cleanfa:[10,53],cluster:[11,12,53,66,73,78,81,85,88,97,100,103,107],code:67,coexist:114,color:[67,100],come:[93,96],command:[14,53,85,86,92],compar:101,comparison:[11,68],compress:[5,60],comput:[106,117],conda:[111,113],conflict:114,connect:[61,100],consensu:55,content:[60,61,62,63,64,66,67,68],control:93,coordin:109,core:[13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],corrol:53,count:[88,107,119],cover:[55,104],cram:68,crash:[96,104,106],creat:[111,114],criteria:92,ct:[47,61],curl:117,custom:96,cutadapt:96,cycl:96,dark:96,data:[54,56,65,66,88,101,103,105],dataset:[85,117],db:62,deactiv:114,decompress:5,defin:[100,104,109,119],delclust:53,delet:[55,85,97,106],delprof:53,demult:[32,53],demultiplex:[96,98],depend:111,destin:88,dir:88,dm:1,dna:64,doe:119,done:97,dot:[62,100],download:117,dreem:2,duplic:[103,105],each:[89,96,99,107,119],effort:114,encod:[55,64,68,96],end:[55,59,64,96],ended:[64,68,96],enhanc:115,entir:53,environ:[111,114],error:86,exampl:[5,57,58,59,71,73,74,75,76,77,78,79,81,82,83,84,89,117],exclud:104,expect:[96,97],extens:[60,61,62,63,64,66,67,68],extern:17,extra:[53,96],fasta:[10,63,86],fastq:[64,96,98],fastqc:96,featur:115,feedback:115,few:[104,106],fewer:96,field:[71,73,74,75,76,77,78,79,81,82,83,84],file:[8,60,61,62,63,64,66,67,68,69,71,86,88,89,91,93,96,97,98,99,100,103,104,105,106,107,108,109,116,117],filter:[96,104,119],finish:97,five:93,fold:[34,53,79,100],format:[60,61,62,63,64,65,66,67,68,69,70,72,80,93,96],fraction:[89,104],from:[66,85,92,96,101,103,105,117],full:109,further:96,g:104,gener:88,github:117,give:115,got:[103,105],graph:[35,53,66,87,88,89,99,101],group:88,guidelin:115,hang:[96,104,106],header:[61,62,63],higher:97,histpo:53,histread:53,horizont:103,how:[85,86,90,91,92,93,94,96,109,110,114,115,120],illumina:96,index:96,individu:53,infer:97,inform:[89,104],initi:113,input:[60,61,63,64,66,68,71,88,89,91,96,97,99,100,103,104,105,106,107,108],insert:[55,106],instal:[111,112,113],insuffici:106,interfac:14,interleav:[64,96],io:[18,19],irreconcil:55,iter:[41,97],its:111,join:[36,73,81,103],label:64,layer:66,length:109,let:114,level:93,licens:4,line:[14,61,62,63,85,86,92],list:[37,70,71,91,92],listpo:53,local:96,log:93,loss:[103,105],low:[55,96],main:[7,40,52],manag:114,mani:104,manual:120,map:[68,96,106],mapseq:1,mask:[38,53,81,82,97,100,103,104,119],match:92,mate:64,maxim:97,maximum:97,md5:117,membership:97,merg:[103,105],messag:93,metadata:[66,72,73,74,75,76,99],minimum:106,modul:[7,8,10,11,40,41,47,52],mu:[20,21],multipl:[96,109],multiplex:98,mutat:[59,89,94,97,100,104,107,119],name:[11,57,103,105,106,109],ng:[22,23],non:111,normal:[88,94,100],note:[73,74,75,76],number:[59,89,96,97,104],o:88,object:60,one:[96,109],optim:[96,97,103,104,105,106,108],option:[53,96],order:[85,88,97],other:115,out:[88,104],output:[60,61,62,63,64,66,67,68,71,88,89,93,96,97,99,100,103,104,105,106,107,108],overal:96,overwrit:[103,105],packag:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],pair:[55,64,96],parallel:[24,25,95],paramet:[88,100],pars:[60,61,62,63,64,66,67,68],path:[60,61,62,63,64,66,67,68,93],per:[66,89,107],phred:[64,106],pip:113,pipelin:52,plain:[71,73,74,75,76],plot:101,poli:104,pool:[39,83,105],posit:[55,59,66,71,89,92,100,104,107,119],pre:96,predict:100,prerequisit:113,pretti:[71,73,74,75,76],primari:55,primer:109,problem:115,procedur:5,produc:[96,104,106],profil:[53,66,89],purpos:[13,73,74,75,76,85,86,92],py:[44,45],python:[60,111,113],q:88,qualiti:[55,64,68,96,106],quantil:[88,94,100],r:88,rate:[89,94,100],ratio:88,read:[41,55,57,59,64,66,89,96,97,104,106,107,119],real:93,refer:[55,58,63,66,74,96,106,109],rel:[26,27,88],relat:[40,41,42,43,44,45,46,53,55,56,59,84,104,105,106],relationship:[55,88,89,106,107,119],renumb:47,renumct:[47,53],repeat:97,report:[77,78,79,80,81,82,83,84,96,97,100,103,104,105,106,107,115],request:115,research:110,result:[66,87,99],rna:[7,28,61,62,66,100,102,110,111],rnastructur:100,roc:53,run:[53,97,102,108],s:[88,89],sam:[8,68],sampl:[66,75,96,99,101,105],scatter:53,score:[64,68,96,106],secondari:[61,62,100],section:[66,76,100,103,104,109,119],seismic:[7,53,66,99,102,110,111],seismicrna:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],separ:[64,96],seq:[29,30],sequenc:[5,58,63,64,96,104,106,109],set:[64,89,96,97,99,100,103,104,105,106,107,108,114,116],sha:117,share:106,sim:[48,49],simul:8,simultan:109,singl:[64,96],size:106,slowli:96,softwar:114,sofwar:114,sourc:96,space:104,specifi:96,split:98,standard:93,step:[53,103,105,108,116,118,119],structur:[54,56,57,58,59,61,62,97,100,101,110],submodul:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,45,46,47,50,51,52],subpackag:[7,8,11,13,15,18,20,22,24,26,29,40,41,44,48],suppress:107,system:116,tabl:[50,53,61,71,73,74,75,76,92,99,100,101,107,119],take:97,task:95,temporari:[60,61,63,64,68],test:[9,12,16,19,21,23,25,27,30,31,42,45,46,49,51,53],text:[71,73,74,75,76],than:96,them:96,thi:120,time:93,too:[96,97,104],trim:96,troubleshoot:[86,96,97,103,104,105,106,108,111,113],two:96,type:[88,89,101],u:104,unalign:96,unnecessari:97,up:[114,116],url:117,us:[60,61,62,63,64,66,67,68,71,88,100,109,117],util:53,varna:[67,100],vector:[40,55,106],verifi:[97,111,117],version:114,vertic:105,view:93,virtual:[111,114],visual:100,walkthrough:116,web:99,wf:[52,53],wget:117,what:119,which:93,whole:[52,96],why:114,without:[96,97],work:97,workflow:[53,108,119],worth:114,would:[103,105],write:[40,120],xam:68,you:96,your:[111,113,116]}})
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index c81f458f..470cdac8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -26,6 +26,7 @@ dependencies = [
"fastqsplitter>=1.2",
"matplotlib>=3.6",
"numpy>=1.23",
+ "numba>=0.59",
"pandas>=1.5",
"plotly>=5.11",
"pyyaml>=6.0",
diff --git a/src/docs/api/seismicrna.cluster.rst b/src/docs/api/seismicrna.cluster.rst
index c26f8544..3a9081d4 100644
--- a/src/docs/api/seismicrna.cluster.rst
+++ b/src/docs/api/seismicrna.cluster.rst
@@ -6,6 +6,14 @@ seismicrna.cluster package
:undoc-members:
:show-inheritance:
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ seismicrna.cluster.tests
+
Submodules
----------
diff --git a/src/docs/api/seismicrna.cluster.tests.rst b/src/docs/api/seismicrna.cluster.tests.rst
new file mode 100644
index 00000000..74f22c08
--- /dev/null
+++ b/src/docs/api/seismicrna.cluster.tests.rst
@@ -0,0 +1,16 @@
+seismicrna.cluster.tests package
+================================
+
+.. automodule:: seismicrna.cluster.tests
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Submodules
+----------
+
+
+.. automodule:: seismicrna.cluster.tests.em_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.batch.rst b/src/docs/api/seismicrna.core.batch.rst
index 907cfe75..736fa800 100644
--- a/src/docs/api/seismicrna.core.batch.rst
+++ b/src/docs/api/seismicrna.core.batch.rst
@@ -6,6 +6,14 @@ seismicrna.core.batch package
:undoc-members:
:show-inheritance:
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ seismicrna.core.batch.tests
+
Submodules
----------
diff --git a/src/docs/api/seismicrna.core.batch.tests.rst b/src/docs/api/seismicrna.core.batch.tests.rst
new file mode 100644
index 00000000..ab1ccc3b
--- /dev/null
+++ b/src/docs/api/seismicrna.core.batch.tests.rst
@@ -0,0 +1,22 @@
+seismicrna.core.batch.tests package
+===================================
+
+.. automodule:: seismicrna.core.batch.tests
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Submodules
+----------
+
+
+.. automodule:: seismicrna.core.batch.tests.count_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
+.. automodule:: seismicrna.core.batch.tests.index_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.mu.rst b/src/docs/api/seismicrna.core.mu.rst
index 85f25f7b..72ea149c 100644
--- a/src/docs/api/seismicrna.core.mu.rst
+++ b/src/docs/api/seismicrna.core.mu.rst
@@ -13,7 +13,6 @@ Subpackages
:maxdepth: 4
seismicrna.core.mu.tests
- seismicrna.core.mu.unbias
Submodules
----------
@@ -47,3 +46,9 @@ Submodules
:members:
:undoc-members:
:show-inheritance:
+
+
+.. automodule:: seismicrna.core.mu.unbias
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.mu.tests.rst b/src/docs/api/seismicrna.core.mu.tests.rst
index dc379bef..9a899b56 100644
--- a/src/docs/api/seismicrna.core.mu.tests.rst
+++ b/src/docs/api/seismicrna.core.mu.tests.rst
@@ -38,3 +38,9 @@ Submodules
:members:
:undoc-members:
:show-inheritance:
+
+
+.. automodule:: seismicrna.core.mu.tests.unbias_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.mu.unbias.rst b/src/docs/api/seismicrna.core.mu.unbias.rst
deleted file mode 100644
index 9290330f..00000000
--- a/src/docs/api/seismicrna.core.mu.unbias.rst
+++ /dev/null
@@ -1,30 +0,0 @@
-seismicrna.core.mu.unbias package
-=================================
-
-.. automodule:: seismicrna.core.mu.unbias
- :members:
- :undoc-members:
- :show-inheritance:
-
-Subpackages
------------
-
-.. toctree::
- :maxdepth: 4
-
- seismicrna.core.mu.unbias.tests
-
-Submodules
-----------
-
-
-.. automodule:: seismicrna.core.mu.unbias.algo
- :members:
- :undoc-members:
- :show-inheritance:
-
-
-.. automodule:: seismicrna.core.mu.unbias.frame
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.mu.unbias.tests.rst b/src/docs/api/seismicrna.core.mu.unbias.tests.rst
deleted file mode 100644
index d6cc5cce..00000000
--- a/src/docs/api/seismicrna.core.mu.unbias.tests.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-seismicrna.core.mu.unbias.tests package
-=======================================
-
-.. automodule:: seismicrna.core.mu.unbias.tests
- :members:
- :undoc-members:
- :show-inheritance:
-
-Submodules
-----------
-
-
-.. automodule:: seismicrna.core.mu.unbias.tests.algo_test
- :members:
- :undoc-members:
- :show-inheritance:
-
-
-.. automodule:: seismicrna.core.mu.unbias.tests.frame_test
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/src/docs/api/seismicrna.core.rst b/src/docs/api/seismicrna.core.rst
index 50dd5e4d..184e31cd 100644
--- a/src/docs/api/seismicrna.core.rst
+++ b/src/docs/api/seismicrna.core.rst
@@ -34,6 +34,12 @@ Submodules
:show-inheritance:
+.. automodule:: seismicrna.core.dims
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
.. automodule:: seismicrna.core.header
:members:
:undoc-members:
diff --git a/src/docs/api/seismicrna.core.tests.rst b/src/docs/api/seismicrna.core.tests.rst
index 4063bd1a..f8e87be3 100644
--- a/src/docs/api/seismicrna.core.tests.rst
+++ b/src/docs/api/seismicrna.core.tests.rst
@@ -10,6 +10,12 @@ Submodules
----------
+.. automodule:: seismicrna.core.tests.dims_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
.. automodule:: seismicrna.core.tests.header_test
:members:
:undoc-members:
diff --git a/src/docs/api/seismicrna.relate.rst b/src/docs/api/seismicrna.relate.rst
index c8646df9..8f263549 100644
--- a/src/docs/api/seismicrna.relate.rst
+++ b/src/docs/api/seismicrna.relate.rst
@@ -15,6 +15,7 @@ Subpackages
seismicrna.relate.aux
seismicrna.relate.c
seismicrna.relate.py
+ seismicrna.relate.tests
Submodules
----------
@@ -56,6 +57,12 @@ Submodules
:show-inheritance:
+.. automodule:: seismicrna.relate.sim
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+
.. automodule:: seismicrna.relate.write
:members:
:undoc-members:
diff --git a/src/docs/api/seismicrna.relate.tests.rst b/src/docs/api/seismicrna.relate.tests.rst
new file mode 100644
index 00000000..3b2cac38
--- /dev/null
+++ b/src/docs/api/seismicrna.relate.tests.rst
@@ -0,0 +1,16 @@
+seismicrna.relate.tests package
+===============================
+
+.. automodule:: seismicrna.relate.tests
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Submodules
+----------
+
+
+.. automodule:: seismicrna.relate.tests.sim_test
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/src/docs/howto/run/cluster.rst b/src/docs/howto/run/cluster.rst
index 95d53e90..1b737a1c 100644
--- a/src/docs/howto/run/cluster.rst
+++ b/src/docs/howto/run/cluster.rst
@@ -11,17 +11,14 @@ Cluster input file: Mask report
You can give any number of Mask report files as inputs for the Cluster step.
See :doc:`../inputs` for ways to list multiple files.
-For example, to cluster relation vectors of reads from ``sample-1`` masked over
-reference ``ref-1`` section ``abc``, and from ``sample-2`` masked over reference
-``ref-2`` section ``full``, use the command ::
+Cluster all masked reads in ``out``::
- seismic cluster {out}/sample-1/mask/ref-1/abc {out}/sample-2/mask/ref-2/full
+ seismic cluster out
-where ``{out}`` is the path of your output directory from the Relate step.
+Cluster reads from ``sample-1`` masked over reference reference ``ref-1``,
+section ``abc``::
-To cluster all masked relation vectors in ``{out}``, you can use the command ::
-
- seismic cluster {out}
+ seismic cluster out/sample-1/mask/ref-1/abc
Cluster: Settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -105,9 +102,7 @@ You can set the number of independent EM runs using ``--em-runs`` (``-e``).
Cluster: Output files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-All output files go into the directory ``{out}/{sample}/cluster/{ref}/{sect}``,
-where ``{out}`` is the output directory, ``{sample}`` is the sample, ``{ref}``
-is the reference, and ``{sect}`` is the section.
+All output files go into the directory ``OUT/SAMPLE/cluster/REFERENCE/SECTION``.
Cluster output file: Batch of cluster memberships
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
@@ -171,7 +166,7 @@ In your cluster report:
If all runs converged to identical solutions, then every NRMSD would be 0 and
every Correlation would be 1.
Generally, the runs are sufficiently reproducible if runs 1 and 2 have NRMSDs
- less than 0.1 and Correlations greater than 0.95 with respect to run 0.
+ less than 0.05 and Correlations greater than 0.98 with respect to run 0.
If not, then there you have no evidence that run 0 is the global optimum for
that number of clusters, so it would be best to rerun clustering using more
independent runs to increase the chances of finding the global optimum.
diff --git a/src/docs/howto/run/mask.rst b/src/docs/howto/run/mask.rst
index cfe9a379..d424a948 100644
--- a/src/docs/howto/run/mask.rst
+++ b/src/docs/howto/run/mask.rst
@@ -110,20 +110,27 @@ Mask setting: Filter reads
The second substep of masking is filtering reads.
You can filter reads based on three criteria, in this order:
+Filter reads by number of positions covering the section
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+You can require every read to contain a minimum number of bases in the section
+(i.e. set a minimum coverage) using ``--min-ncov-read`` followed by the minimum
+coverage.
+The minimum coverage must be at least 1 because reads that do not cover the
+section at all should always be filtered out.
+Note that this filter considers only positions that were not pre-excluded (see
+:ref:`mask_exclude`).
+
Filter reads by fraction of informative positions
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
-For some applications, such as finding alternative structures, every read must
-span the vast majority of positions in the section of the reference.
-You can set a limit on the minimum number of informative bases in the read,
-as a fraction of the number of non-excluded positions in the section, using
-``--min-finfo-read {f}``.
-For example, to require 95% of the non-excluded positions in the section to be
+You can set a limit on the minimum information in each read, as a fraction of
+the number of non-excluded positions in the read, using ``--min-finfo-read``
+followed by the minimum fraction of informative positions.
+For example, to require 95% of the non-excluded positions in the read to be
informative, use ``--min-finfo-read 0.95``.
-If the section had 296 positions, and 141 remained after excluding positions
-(see :ref:`mask_exclude`), then a read with 137 informative positions would
-have an informed fraction of 97% and be kept, but a read with 133 informative
-positions would have an informed fraction of 94% and be discarded.
+Note that the denominator of this fraction is the number of bases in the read
+that cover the section; it is not just the length of the section or of the read.
Filter reads by fraction of mutated positions
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
diff --git a/src/seismicrna/align/main.py b/src/seismicrna/align/main.py
index 0dfa9077..1ee0d9b8 100644
--- a/src/seismicrna/align/main.py
+++ b/src/seismicrna/align/main.py
@@ -67,73 +67,6 @@
logger = getLogger(__name__)
-# Parameters for command line interface
-params = [
- # Inputs
- arg_fasta,
- opt_fastqx,
- opt_fastqy,
- opt_fastqz,
- opt_dmfastqx,
- opt_dmfastqy,
- opt_dmfastqz,
- opt_phred_enc,
- # Outputs
- opt_out_dir,
- opt_temp_dir,
- opt_force,
- opt_keep_temp,
- # Parallelization
- opt_parallel,
- opt_max_procs,
- # FASTQC
- opt_fastqc,
- opt_qc_extract,
- # Cutadapt
- opt_cutadapt,
- opt_cut_a1,
- opt_cut_g1,
- opt_cut_a2,
- opt_cut_g2,
- opt_cut_o,
- opt_cut_e,
- opt_cut_q1,
- opt_cut_q2,
- opt_cut_m,
- opt_cut_indels,
- opt_cut_discard_trimmed,
- opt_cut_discard_untrimmed,
- opt_cut_nextseq,
- # Bowtie2
- opt_bt2_local,
- opt_bt2_discordant,
- opt_bt2_mixed,
- opt_bt2_dovetail,
- opt_bt2_contain,
- opt_bt2_i,
- opt_bt2_x,
- opt_bt2_score_min_e2e,
- opt_bt2_score_min_loc,
- opt_bt2_s,
- opt_bt2_l,
- opt_bt2_gbar,
- opt_bt2_d,
- opt_bt2_r,
- opt_bt2_dpad,
- opt_bt2_orient,
- opt_bt2_un,
- # Samtools
- opt_min_mapq,
- opt_min_reads,
- opt_cram,
-]
-
-
-@command(CMD_ALIGN, params=params)
-def cli(*args, **kwargs):
- """ Trim FASTQ files and align them to reference sequences. """
- return run(*args, **kwargs)
-
@lock_temp_dir
@docdef.auto()
@@ -262,6 +195,74 @@ def run(*,
min_reads=min_reads,
cram=cram)
+
+# Parameters for command line interface
+params = [
+ # Inputs
+ arg_fasta,
+ opt_fastqx,
+ opt_fastqy,
+ opt_fastqz,
+ opt_dmfastqx,
+ opt_dmfastqy,
+ opt_dmfastqz,
+ opt_phred_enc,
+ # Outputs
+ opt_out_dir,
+ opt_temp_dir,
+ opt_force,
+ opt_keep_temp,
+ # Parallelization
+ opt_parallel,
+ opt_max_procs,
+ # FASTQC
+ opt_fastqc,
+ opt_qc_extract,
+ # Cutadapt
+ opt_cutadapt,
+ opt_cut_a1,
+ opt_cut_g1,
+ opt_cut_a2,
+ opt_cut_g2,
+ opt_cut_o,
+ opt_cut_e,
+ opt_cut_q1,
+ opt_cut_q2,
+ opt_cut_m,
+ opt_cut_indels,
+ opt_cut_discard_trimmed,
+ opt_cut_discard_untrimmed,
+ opt_cut_nextseq,
+ # Bowtie2
+ opt_bt2_local,
+ opt_bt2_discordant,
+ opt_bt2_mixed,
+ opt_bt2_dovetail,
+ opt_bt2_contain,
+ opt_bt2_i,
+ opt_bt2_x,
+ opt_bt2_score_min_e2e,
+ opt_bt2_score_min_loc,
+ opt_bt2_s,
+ opt_bt2_l,
+ opt_bt2_gbar,
+ opt_bt2_d,
+ opt_bt2_r,
+ opt_bt2_dpad,
+ opt_bt2_orient,
+ opt_bt2_un,
+ # Samtools
+ opt_min_mapq,
+ opt_min_reads,
+ opt_cram,
+]
+
+
+@command(CMD_ALIGN, params=params)
+def cli(*args, **kwargs):
+ """ Trim FASTQ files and align them to reference sequences. """
+ return run(*args, **kwargs)
+
########################################################################
# #
# © Copyright 2024, the Rouskin Lab. #
diff --git a/src/seismicrna/align/xamops.py b/src/seismicrna/align/xamops.py
index 7ae6ea94..f1a71124 100644
--- a/src/seismicrna/align/xamops.py
+++ b/src/seismicrna/align/xamops.py
@@ -133,7 +133,6 @@ def bowtie2_cmd(fq_inp: FastqUnit,
"--threads", n_procs,
# Alignment setup
"--local" if bt2_local else "--end-to-end",
- "--non-deterministic",
"--gbar", bt2_gbar,
"--dpad", bt2_dpad,
"-L", bt2_l,
@@ -261,8 +260,8 @@ def xamgen_cmd(fq_inp: FastqUnit,
flags_req=flags_req,
flags_exc=flags_exc,
bam=True,
- n_procs=n_procs)
- sort_xam_step = sort_xam_cmd(None, bam_out, n_procs=n_procs)
+ n_procs=1)
+ sort_xam_step = sort_xam_cmd(None, bam_out, n_procs=1)
return cmds_to_pipe([bowtie2_step, view_xam_step, sort_xam_step])
@@ -287,7 +286,7 @@ def export_cmd(xam_in: Path | None,
sam=True,
with_header=False,
ref=ref,
- n_procs=n_procs)
+ n_procs=1)
# Merge the one header line and the reads for the reference.
merge_step = cmds_to_subshell([echo_step, ref_step])
# Sort reads by name so that mates are adjacent.
@@ -296,7 +295,7 @@ def export_cmd(xam_in: Path | None,
export_step = view_xam_cmd(None,
xam_out,
refs_file=ref_file,
- n_procs=n_procs)
+ n_procs=1)
return cmds_to_pipe([merge_step, sort_step, export_step])
diff --git a/src/seismicrna/cluster/addclust.py b/src/seismicrna/cluster/addclust.py
index 58de0536..7f8207f1 100644
--- a/src/seismicrna/cluster/addclust.py
+++ b/src/seismicrna/cluster/addclust.py
@@ -89,8 +89,8 @@ def update_batches(dataset: ClusterMutsDataset,
checksums = list()
for batch in dataset.iter_batches():
# Merge the original responsibilities with the new ones.
- resps = pd.concat([batch.resps] + [runs.best.get_resps(batch.batch)
- for runs in new_orders],
+ resps = pd.concat([batch.membership] + [runs.best.get_members(batch.batch)
+ for runs in new_orders],
axis=1,
verify_integrity=True)
batch = ClusterBatchIO(sample=dataset.sample,
diff --git a/src/seismicrna/cluster/compare.py b/src/seismicrna/cluster/compare.py
index a560718a..77467cfb 100644
--- a/src/seismicrna/cluster/compare.py
+++ b/src/seismicrna/cluster/compare.py
@@ -170,15 +170,15 @@ def assign_clusterings(mus1: np.ndarray, mus2: np.ndarray):
def calc_rms_nrmsd(run1: EmClustering, run2: EmClustering):
""" Compute the root-mean-square NRMSD between the clusters. """
- costs = np.square(calc_nrmsd_groups(run1.mus, run2.mus))
- assignment = assign_clusterings(run1.mus, run2.mus)
+ costs = np.square(calc_nrmsd_groups(run1.p_mut, run2.p_mut))
+ assignment = assign_clusterings(run1.p_mut, run2.p_mut)
return float(np.sqrt(np.mean([costs[i, j] for i, j in assignment])))
def calc_mean_pearson(run1: EmClustering, run2: EmClustering):
""" Compute the mean Pearson correlation between the clusters. """
- correlations = calc_pearson_groups(run1.mus, run2.mus)
- assignment = assign_clusterings(run1.mus, run2.mus)
+ correlations = calc_pearson_groups(run1.p_mut, run2.p_mut)
+ assignment = assign_clusterings(run1.p_mut, run2.p_mut)
return float(np.mean([correlations[i, j] for i, j in assignment]))
########################################################################
diff --git a/src/seismicrna/cluster/delclust.py b/src/seismicrna/cluster/delclust.py
index bc901f1e..893ca5db 100644
--- a/src/seismicrna/cluster/delclust.py
+++ b/src/seismicrna/cluster/delclust.py
@@ -81,7 +81,7 @@ def update_batches(dataset: ClusterMutsDataset,
ref=dataset.ref,
sect=dataset.sect,
batch=original_batch.batch,
- resps=original_batch.resps.loc[:, orders])
+ resps=original_batch.membership.loc[:, orders])
_, checksum = new_batch.save(top=dataset.top,
brotli_level=brotli_level,
force=True)
diff --git a/src/seismicrna/cluster/em.py b/src/seismicrna/cluster/em.py
index a017d093..b2d43dd6 100644
--- a/src/seismicrna/cluster/em.py
+++ b/src/seismicrna/cluster/em.py
@@ -4,10 +4,21 @@
import numpy as np
import pandas as pd
-from .names import ADJ_NAME, OBS_NAME
+from .names import CLUST_PROP_NAME
from .uniq import UniqReads
+from ..core.batch import get_length
+from ..core.dims import find_dims
from ..core.header import index_order_clusts
-from ..core.mu import calc_f_obs_numpy, calc_mu_adj_numpy, calc_prop_adj_numpy
+from ..core.mu import (READS,
+ POSITIONS,
+ CLUSTERS,
+ calc_p_noclose,
+ calc_p_noclose_given_ends,
+ calc_params,
+ calc_params_observed,
+ calc_p_ends_given_noclose,
+ calc_p_clust_given_noclose,
+ triu_log)
logger = getLogger(__name__)
@@ -15,10 +26,10 @@
FIRST_ITER = 1 # number of the first iteration
-def calc_bic(n_params: int,
- n_data: int,
- log_like: float,
- min_data_param_ratio: float = 10.):
+def _calc_bic(n_params: int,
+ n_data: int,
+ log_like: float,
+ min_data_param_ratio: float = 10.):
""" Compute the Bayesian Information Criterion (BIC) of a model.
Typically, the model with the smallest BIC is preferred.
@@ -53,9 +64,99 @@ def calc_bic(n_params: int,
return n_params * np.log(n_data) - 2. * log_like
+def _zero_masked(p_mut: np.ndarray, unmasked: np.ndarray):
+ """ Set mutation rates of masked positions to zero. """
+ p_mut_unmasked = np.zeros_like(p_mut)
+ p_mut_unmasked[unmasked] = p_mut[unmasked]
+ return p_mut_unmasked
+
+
+def _expectation(p_mut: np.ndarray,
+ p_ends: np.ndarray,
+ p_clust: np.ndarray,
+ end5s: np.ndarray,
+ end3s: np.ndarray,
+ unmasked: np.ndarray,
+ muts_per_pos: list[np.ndarray],
+ min_mut_gap: int):
+ # Validate the dimensions.
+ find_dims([(POSITIONS, CLUSTERS),
+ (POSITIONS, POSITIONS),
+ (CLUSTERS,),
+ (READS,),
+ (READS,)],
+ [p_mut, p_ends, p_clust, end5s, end3s],
+ ["p_mut", "p_ends", "p_clust", "end5s", "end3s"],
+ nonzero=True)
+ # Ensure the mutation rates of masked positions are 0.
+ p_mut = _zero_masked(p_mut, unmasked)
+ # Calculate the end probabilities.
+ p_noclose_given_ends = calc_p_noclose_given_ends(p_mut, min_mut_gap)
+ p_ends_given_noclose = calc_p_ends_given_noclose(p_ends,
+ p_noclose_given_ends)
+ # Calculate the cluster probabilities.
+ p_noclose = calc_p_noclose(p_ends, p_noclose_given_ends)
+ p_clust_given_noclose = calc_p_clust_given_noclose(p_clust, p_noclose)
+ # Compute the probability that a read would have no two mutations
+ # too close given its end coordinates.
+ logp_noclose = triu_log(calc_p_noclose_given_ends(p_mut, min_mut_gap))
+ # Compute the logs of the parameters.
+ with np.errstate(divide="ignore"):
+ # Suppress warnings about taking the log of zero, which is a
+ # valid mutation rate.
+ logp_mut = np.log(p_mut)
+ logp_not = np.log(1. - p_mut)
+ logp_ends_given_noclose = triu_log(p_ends_given_noclose)
+ logp_clust_given_noclose = np.log(p_clust_given_noclose)
+ # For each cluster, calculate the probability that a read up to and
+ # including each position would have no mutations.
+ logp_nomut_incl = np.cumsum(logp_not, axis=0)
+ # For each cluster, calculate the probability that a read up to but
+ # not including each position would have no mutations.
+ logp_nomut_excl = np.vstack([np.zeros_like(p_clust), logp_nomut_incl[:-1]])
+ # For each unique read, calculate the probability that a random read
+ # with the same end coordinates would have no mutations.
+ logp_nomut = logp_nomut_incl[end3s] - logp_nomut_excl[end5s]
+ # For each unique read, compute the joint probability that a random
+ # read would have the same end coordinates, come from each cluster,
+ # and have no mutations; normalize by the fraction of all reads that
+ # have no two mutations too close, i.e. logp_noclose[end5s, end3s].
+ # 2D (unique reads x clusters)
+ logp_joint = (logp_clust_given_noclose[np.newaxis, :]
+ + logp_ends_given_noclose[end5s, end3s]
+ - logp_noclose[end5s, end3s]
+ + logp_nomut)
+ # For each unique read, compute the likelihood of observing it
+ # (including its mutations) by adjusting the above likelihood
+ # of observing the end coordinates with no mutations.
+ for j, mut_reads in zip(unmasked, muts_per_pos, strict=True):
+ logp_joint[mut_reads] += logp_mut[j] - logp_not[j]
+ # For each unique observed read, the marginal probability that a
+ # random read would have the end coordinates and mutations, no
+ # matter which cluster it came from, is the sum of the joint
+ # probability over all clusters (axis 1).
+ # 1D (unique reads)
+ logp_marginal = np.logaddexp.reduce(logp_joint, axis=1)
+ # Calculate the posterior probability that each read came from
+ # each cluster by dividing the joint probability (observing the
+ # read and coming from the cluster) by the marginal probability
+ # (observing the read in any cluster).
+ # 2D (unique reads x clusters)
+ membership = np.exp(logp_joint - logp_marginal[:, np.newaxis])
+ return logp_marginal, membership
+
+
+def _calc_log_like(logp_marginal: np.ndarray, counts_per_uniq: np.ndarray):
+ # Calculate the log likelihood of observing all the reads
+ # by summing the log probability over all reads, weighted
+ # by the number of times each read occurs. Cast to a float
+ # explicitly to verify that the product is a scalar.
+ return float(np.vdot(logp_marginal, counts_per_uniq))
+
+
class EmClustering(object):
- """ Run expectation-maximization to cluster the given bit vectors
- into the specified number of clusters."""
+ """ Run expectation-maximization to cluster the given reads into the
+ specified number of clusters. """
def __init__(self,
uniq_reads: UniqReads,
@@ -69,21 +170,21 @@ def __init__(self,
uniq_reads: UniqReads
Container of unique reads
order: int
- Number of clusters into which to cluster the bit vectors;
+ Number of clusters into which to cluster the reads;
must be a positive integer
min_iter: int
Minimum number of iterations for clustering. Must be a
- positive integer no greater than max_iter.
+ positive integer no greater than `max_iter`.
max_iter: int
Maximum number of iterations for clustering. Must be a
- positive integer no less than min_iter.
+ positive integer no less than `min_iter`.
conv_thresh: float
Stop the algorithm when the difference in log likelihood
between two successive iterations becomes smaller than the
convergence threshold (and at least min_iter iterations have
- run). Must be a positive real number (ideally close to 0).
+ run). Must be a positive real number.
"""
- # Unique bit vectors of mutations
+ # Unique reads of mutations
self.uniq_reads = uniq_reads
# Number of clusters (i.e. order)
if not order >= 1:
@@ -102,20 +203,21 @@ def __init__(self,
if not conv_thresh >= 0.:
raise ValueError(f"conv_thresh must be ≥ 0, but got {conv_thresh}")
self.conv_thresh = conv_thresh
- # Number of reads observed in each cluster, not adjusted
- self.nreads_obs = np.empty(self.order, dtype=float)
- # Log of the fraction observed for each cluster
- self.log_f_obs = np.empty(self.order, dtype=float)
- # Mutation rates of used positions (row) in each cluster (col),
- # adjusted for observer bias
- self.mus = np.empty((self.uniq_reads.num_pos, self.order), dtype=float)
- # Positions of the section that will be used for clustering
- self.unmasked = self.uniq_reads.section.unmasked_bool
- # Likelihood of each vector (col) coming from each cluster (row)
- self.resps = np.empty((self.order, self.uniq_reads.num_uniq),
- dtype=float)
- # Marginal probabilities of observing each bit vector.
- self.log_marginals = np.empty(self.uniq_reads.num_uniq, dtype=float)
+ # Mutation rates adjusted for observer bias.
+ # 2D (all positions x clusters)
+ self.p_mut = np.empty((self.n_pos_total, self.order))
+ # Read end coordinate proportions adjusted for observer bias.
+ # 2D (all positions x all positions)
+ self.p_ends = np.empty((self.n_pos_total, self.n_pos_total))
+ # Cluster proportions adjusted for observer bias.
+ # 1D (clusters)
+ self.p_clust = np.empty(self.order)
+ # Likelihood of each unique read coming from each cluster.
+ # 2D (unique reads x clusters)
+ self.membership = np.empty((self.uniq_reads.num_uniq, self.order))
+ # Marginal likelihoods of observing each unique read.
+ # 1D (unique reads)
+ self.logp_marginal = np.empty(self.uniq_reads.num_uniq)
# Trajectory of log likelihood values.
self.log_likes: list[float] = list()
# Number of iterations.
@@ -123,41 +225,46 @@ def __init__(self,
# Whether the algorithm has converged.
self.converged = False
+ @property
+ def section_end5(self):
+ """ 5' end of the section. """
+ return self.uniq_reads.section.end5
+
+ @cached_property
+ def unmasked(self):
+ """ Unmasked positions (0-indexed). """
+ return self.uniq_reads.section.unmasked_zero
+
@cached_property
- def nreads_total(self):
- """ Total number of reads, including redundant ones. """
- return int(round(self.uniq_reads.counts_per_uniq.sum()))
+ def masked(self):
+ """ Masked positions (0-indexed). """
+ return self.uniq_reads.section.masked_zero
@property
- def sparse_mus(self):
- """ Mutation rates of all positions (row) in each cluster (col),
- including positions that are not used for clustering. The rate
- for every unused position always remains zero. """
- # Initialize an array of zeros with one row for each position in
- # the section and one column for each cluster.
- sparse_mus = np.zeros((self.uniq_reads.section.length, self.order),
- dtype=float)
- # Copy the rows of self.mus that correspond to used positions.
- # The rows for unused positions remain zero (hence "sparse").
- sparse_mus[self.unmasked] = self.mus
- return sparse_mus
+ def n_pos_total(self):
+ """ Number of positions, including those masked. """
+ return self.uniq_reads.section.length
+
+ @cached_property
+ def n_pos_unmasked(self):
+ """ Number of unmasked positions. """
+ return get_length(self.unmasked, "unmasked positions")
+
+ @cached_property
+ def end5s(self):
+ """ 5' end coordinates (0-indexed). """
+ return self.uniq_reads.end5s_zero
+
+ @cached_property
+ def end3s(self):
+ """ 3' end coordinates (0-indexed). """
+ return self.uniq_reads.end3s_zero
@cached_property
def clusters(self):
""" MultiIndex of the order and cluster numbers. """
return index_order_clusts(self.order)
- @property
- def prop_obs(self):
- """ Observed proportion of each cluster, without adjusting for
- observer bias. """
- return self.nreads_obs / np.sum(self.nreads_obs)
-
- @property
- def prop_adj(self):
- """ Proportion of each cluster, adjusted for observer bias. """
- return calc_prop_adj_numpy(self.prop_obs, np.exp(self.log_f_obs))
-
@property
def log_like(self):
""" Return the current log likelihood, which is the last item in
@@ -184,117 +291,102 @@ def delta_log_like(self):
the current iteration. """
return self.log_like - self.log_like_prev
+ @property
+ def n_params(self):
+ """ Number of parameters in the model. """
+ # The parameters estimated by the model are
+ # - the mutation rates for each position in each cluster
+ # - the proportion of each cluster
+ # - the proportion of every pair of read end coordinates
+ # The cluster memberships are latent variables, not parameters.
+ # The degrees of freedom of the mutation rates equals the total
+ # number of unmasked positions times clusters.
+ df_mut = self.n_pos_unmasked * self.order
+ # The degrees of freedom of the coordinate proportions equals
+ # the number of non-zero proportions (which are the only ones
+ # that can be estimated) minus one because of the constraint
+ # that the proportions of all end coordinates must sum to 1.
+ df_ends = np.count_nonzero(
+ self.p_ends[np.triu_indices_from(self.p_ends)]
+ ) - 1
+ # The degrees of freedom of the cluster proportions equals the
+ # number of clusters minus one because of the constraint that
+ # the proportions of all clusters must sum to 1.
+ df_clust = self.order - 1
+ # The number of parameters is the sum of the degrees of freedom.
+ return df_mut + df_ends + df_clust
+
+ @property
+ def n_data(self):
+ """ Number of data points in the model. """
+ # The number of data points is the total number of reads.
+ return self.uniq_reads.num_nonuniq
+
@property
def bic(self):
- """ Compute this model's Bayesian Information Criterion. """
- # The parameters estimated by the model are the mutation rates
- # for each position in each cluster and the proportion of each
- # cluster in the population. By contrast, the cluster membership
- # values are latent variables because each describes one item in
- # the sample (a bit vector), not a parameter of the population.
- # The number of data points is the number of unique bit vectors.
- return calc_bic(self.mus.size + self.prop_adj.size,
- self.uniq_reads.num_uniq,
- self.log_like)
+ """ Bayesian Information Criterion of the model. """
+ return _calc_bic(self.n_params, self.n_data, self.log_like)
def _max_step(self):
""" Run the Maximization step of the EM algorithm. """
- # Calculate the number of reads in each cluster by summing the
- # count-weighted likelihood that each bit vector came from the
- # cluster.
- self.nreads_obs = self.resps @ self.uniq_reads.counts_per_uniq
- # If this iteration is not the first, then use mutation rates
- # from the previous iteration as the initial guess for this one.
- mus_guess = self.sparse_mus if self.iter > FIRST_ITER else None
- # Compute the observed mutation rate at each position (j).
- # To save memory and enable self.sparse_mus to use the observed
- # rates of mutation, overwrite self.mus rather than allocate a
- # new array.
- for j, muts_j in enumerate(self.uniq_reads.muts_per_pos):
- # Calculate the number of mutations at each position in each
- # cluster by summing the count-weighted likelihood that each
- # bit vector with a mutation at (j) came from the cluster,
- # then divide by the count-weighted sum of the number of
- # reads in the cluster to find the observed mutation rate.
- self.mus[j] = ((self.resps[:, muts_j]
- @ self.uniq_reads.counts_per_uniq[muts_j])
- / self.nreads_obs)
- # Solve for the real mutation rates that are expected to yield
- # the observed mutation rates after considering read drop-out.
- self.mus = calc_mu_adj_numpy(self.sparse_mus,
- self.uniq_reads.min_mut_gap,
- mus_guess)[self.unmasked]
+ # Estimate the parameters based on observed data.
+ (p_mut_observed,
+ p_ends_observed,
+ p_clust_observed) = calc_params_observed(
+ self.n_pos_total,
+ self.order,
+ self.unmasked,
+ self.uniq_reads.muts_per_pos,
+ self.end5s,
+ self.end3s,
+ self.uniq_reads.counts_per_uniq,
+ self.membership
+ )
+ if self.iter > 1:
+ # If this iteration is not the first, then use the previous
+ # values of the parameters as the initial guesses.
+ guess_p_mut = self.p_mut
+ guess_p_ends = self.p_ends
+ guess_p_clust = self.p_clust
+ else:
+ # Otherwise, do not guess the initial parameters.
+ guess_p_mut = None
+ guess_p_ends = None
+ guess_p_clust = None
+ # Update the parameters.
+ self.p_mut, self.p_ends, self.p_clust = calc_params(
+ p_mut_observed,
+ p_ends_observed,
+ p_clust_observed,
+ self.uniq_reads.min_mut_gap,
+ guess_p_mut,
+ guess_p_ends,
+ guess_p_clust,
+ prenormalize=False,
+ )
+ # Ensure all masked positions have a mutation rate of 0.
+ if n_nonzero := np.count_nonzero(self.p_mut[self.masked]):
+ logger.warning(
+ f"{n_nonzero} masked position(s) have a mutation rate ≠ 0: "
+ )
+ self.p_mut[self.masked] = 0.
def _exp_step(self):
""" Run the Expectation step of the EM algorithm. """
- # Update the log fraction observed of each cluster.
- self.log_f_obs = np.log(calc_f_obs_numpy(self.sparse_mus,
- self.uniq_reads.min_mut_gap))
- # Compute the logs of the mutation and non-mutation rates.
- with np.errstate(divide="ignore"):
- # Suppress warnings about taking the log of zero, which is a
- # valid mutation rate. Thus, here we CAN compute log of 0,
- # just like Chuck Norris.
- log_mus = np.log(self.mus)
- log_nos = np.log(1. - self.mus)
- # Compute for each cluster and observed bit vector the joint
- # probability that a random read vector would both come from the
- # same cluster and have exactly the same set of bits. To save
- # memory, overwrite self.resps rather than allocate a new array.
- for k in range(self.order):
- # Compute the probability that a bit vector has no mutations
- # given that it comes from cluster (k), which is the sum of
- # all not-mutated log probabilities, sum(log_nos[:, k]),
- # minus the cluster's log fraction observed, log_f_obs[k].
- log_prob_no_muts_given_k = np.sum(log_nos[:, k]) - self.log_f_obs[k]
- # Initialize the log probability for all bit vectors in
- # cluster (k) to the log probability that an observed bit
- # vector comes from cluster (k) (log(prob_obs[k])) and has
- # no mutations given that it came from cluster (k).
- log_prob_no_muts_and_k = (np.log(self.prop_obs[k])
- + log_prob_no_muts_given_k)
- self.resps[k].fill(log_prob_no_muts_and_k)
- # Loop over each position (j); each iteration adds the log
- # PMF for one additional position in each bit vector to the
- # accumulating total log probability of each bit vector.
- # Using accumulation with this loop also uses less memory
- # than would holding the PMF for every position in an array
- # and then summing over the position axis.
- for j in range(self.uniq_reads.num_pos):
- # Compute the probability that each bit vector would
- # have the bit observed at position (j). The probability
- # is modeled using a Bernoulli distribution, with PMF:
- # log_mus[k, j] if muts[j, i] else log_nos[k, j].
- # This PMF could be computed explicitly, such as with
- # scipy.stats.bernoulli.logpmf(muts[j], mus[k, j]).
- # But few of the bits are mutated, so a more efficient
- # (and much, MUCH faster) way is to assume initially
- # that no bit is mutated -- that is, to initialize the
- # probability of every bit vector with the probability
- # that the bit vector has no mutations, as was done.
- # Then, for only the few bits that are mutated, the
- # probability is adjusted by adding the log of the
- # probability that the base is mutated minus the log of
- # the probability that the base is not mutated.
- log_adjust_jk = log_mus[j, k] - log_nos[j, k]
- self.resps[k][self.uniq_reads.muts_per_pos[j]] += log_adjust_jk
- # For each observed bit vector, the marginal probability that a
- # random read would have the same series of bits (regardless of
- # which cluster it came from) is the sum over all clusters of
- # the joint probability of coming from the cluster and having
- # the specific series of bits.
- self.log_marginals = np.logaddexp.reduce(self.resps, axis=0)
- # Calculate the posterior probability that each bit vector came
- # from each cluster by dividing the joint probability (observing
- # the bit vector and coming from the cluster) by the marginal
- # probability (observing the bit vector in any cluster).
- self.resps = np.exp(self.resps - self.log_marginals)
- # Calculate the log likelihood of observing all the bit vectors
- # by summing the log probability over all bit vectors, weighted
- # by the number of times each bit vector occurs. Cast to a float
- # explicitly to verify that the product is a scalar.
- log_like = float(np.vdot(self.log_marginals,
- self.uniq_reads.counts_per_uniq))
+ # Update the marginal probabilities and cluster memberships.
+ self.logp_marginal, self.membership = _expectation(
+ self.p_mut,
+ self.p_ends,
+ self.p_clust,
+ self.end5s,
+ self.end3s,
+ self.unmasked,
+ self.uniq_reads.muts_per_pos,
+ self.uniq_reads.min_mut_gap
+ )
+ # Calculate the log likelihood and append it to the trajectory.
+ log_like = _calc_log_like(self.logp_marginal,
+ self.uniq_reads.counts_per_uniq)
self.log_likes.append(round(log_like, LOG_LIKE_PRECISION))
def run(self, props_seed: int | None = None, resps_seed: int | None = None):
@@ -330,14 +422,14 @@ def run(self, props_seed: int | None = None, resps_seed: int | None = None):
# parameter of a Dirichlet distribution can be 1 but not 0.
conc_params = 1. - np.random.default_rng(props_seed).random(self.order)
# Initialize cluster membership with a Dirichlet distribution.
- self.resps = dirichlet.rvs(alpha=conc_params,
- size=self.uniq_reads.num_uniq,
- random_state=resps_seed).T
+ self.membership = dirichlet.rvs(alpha=conc_params,
+ size=self.uniq_reads.num_uniq,
+ random_state=resps_seed)
# Run EM until the log likelihood converges or the number of
# iterations reaches max_iter, whichever happens first.
self.converged = False
for self.iter in range(1, self.max_iter + 1):
- # Update the mutation rates and cluster proportions.
+ # Update the parameters.
self._max_step()
# Update the cluster membership and log likelihood.
self._exp_step()
@@ -372,125 +464,28 @@ def run(self, props_seed: int | None = None, resps_seed: int | None = None):
@property
def logn_exp(self):
- """ Log number of expected observations of each bit vector. """
- return np.log(self.nreads_total) + self.log_marginals
+ """ Log number of expected observations of each read. """
+ return np.log(self.uniq_reads.num_nonuniq) + self.logp_marginal
def get_props(self):
""" Real and observed log proportion of each cluster. """
- return pd.DataFrame(np.vstack([self.prop_obs, self.prop_adj]).T,
+ return pd.DataFrame(self.p_clust[:, np.newaxis],
index=self.clusters,
- columns=[OBS_NAME, ADJ_NAME])
+ columns=[CLUST_PROP_NAME])
def get_mus(self):
""" Log mutation rate at each position for each cluster. """
- return pd.DataFrame(self.mus,
+ return pd.DataFrame(self.p_mut[self.unmasked],
index=self.uniq_reads.section.unmasked_int,
columns=self.clusters)
- def get_resps(self, batch_num: int):
- """ Responsibilities of the reads in the batch. """
+ def get_members(self, batch_num: int):
+ """ Cluster memberships of the reads in the batch. """
batch_uniq_nums = self.uniq_reads.batch_to_uniq[batch_num]
- return pd.DataFrame(self.resps.T[batch_uniq_nums],
+ return pd.DataFrame(self.membership[batch_uniq_nums],
index=batch_uniq_nums.index,
columns=self.clusters)
- '''
-
- @property
- def logp_contig(self):
- """ Log probability of every bit vector from the most likely to
- the rarest observed bit vector, including any bit vector with an
- intermediate probability that had an observed count of 0. """
- # Find the log probability of the rarest observed bit vector.
- min_logp = np.min(self.log_marginals)
- # Initialize a bit vector iterator for each cluster.
- bvecs = {clust: iter_all_bit_vectors(cmus,
- self.data.section,
- self.data.min_mut_gap)
- for clust, cmus in self.get_mus().items()}
- # For each cluster, iterate through the bit vectors up to and
- # including the rarest observed bit vector; record the log
- # probability of each bit vector encountered.
- logps = dict()
- cump = 0.
- for clust, clust_bvecs in bvecs.items():
- # Initialize the map of bit vectors to log probabilities
- # for this cluster.
- logps[clust] = dict()
- while True:
- # Find the next bit vector; record its log probability.
- bvec, logp = next(clust_bvecs)
- logps[clust][bvec.tobytes().decode()] = logp
- cump += np.exp(logp)
- # Iterate until the log probability falls below that of
- # the rarest bit vector.
- if logp <= min_logp:
- break
- # Find all "non-rare" bit vectors that had a higher probability
- # than the rarest bit vector in any cluster.
- bvecs_non_rare = set.union(*map(set, logps.values()))
- # For each cluster, compute the log probability of all non-rare
- # bit vectors that were not already encountered in the cluster.
- for clust, clust_bvecs in bvecs.items():
- # Find the non-rare bit vectors that were not encountered
- # already in the cluster.
- unseen_non_rare = bvecs_non_rare - set(logps[clust])
- # Iterate until all such bit vectors are encountered.
- while unseen_non_rare:
- # Find the next bit vector; record its log probability.
- bvec, logp = next(clust_bvecs)
- bvec_str = bvec.tobytes().decode()
- logps[clust][bvec_str] = logp
- if bvec_str in unseen_non_rare:
- # This bit vector is no longer unseen.
- unseen_non_rare.remove(bvec_str)
- # Now that all necessary bit vectors have been encountered, join
- # the maps into a single DataFrame (taking the intersection of
- # the indexes) of bit vectors (indexes) and clusters (columns).
- logps_df = pd.concat([pd.Series(clust_logps, name=clust)
- for clust, clust_logps in logps.items()],
- join="inner")
- # Compute the joint probability that a random bit vector would
- # match the bit vector corresponding to a row in logps_df and
- # come from the cluster corresponding to a column in logps_df.
- logps_joint = logps_df + np.log(self.get_props()[self.ADJUSTED])
- # Compute the marginal probability of observing each bit vector,
- # regardless of the cluster from which it came.
- logps_marginal = logsumexp(logps_joint, axis=0)
- # Sort the bit vectors by decreasing log probability.
- return logps_marginal.sort_values(ascending=False)
-
- def output_cdf(self):
- """ Return the cumulative fraction of reads in descending order
- of likelihood. """
-
- # Map each bit vector to its log probability and observed count.
- ns_obs: dict[str, int] = dict()
- logps: dict[int, dict[str, float]] = {c: dict() for c in bvecs}
- # Iterate through each unique bit vector that was observed.
- for bvec_arr, n_obs in zip(self.data.get_matrix(),
- self.data.counts_per_uniq,
- strict=True):
- # Convert the bit vector from an array to a str so that it
- # becomes hashable and internable (unlike bytes).
- bvec_str = bvec_arr.tobytes().decode()
- # Map the bit vector to its observed count.
- ns_obs[bvec_str] = n_obs
- # For each cluster, check if the bit vector has appeared.
- for clust, clogps in logps.items():
- # If the bit vector has not yet appeared, then iterate
- # through the bit vectors until finding it.
- while bvec_str not in clogps:
- # Get the next bit vector and its log likelihood.
- bvec, logp = next(bvecs[clust])
- # Map the bit vector to its log probability.
- clogps[bvec.tobytes().decode()] = logp
- # Find the bit vectors that are
- # Compute the adjusted proportion of each cluster.
- props = self.get_props()[self.ADJUSTED]
-
- '''
-
def __str__(self):
return f"{type(self).__name__} {self.uniq_reads} to order {self.order}"
diff --git a/src/seismicrna/cluster/names.py b/src/seismicrna/cluster/names.py
index 6ee961ad..8cc0fade 100644
--- a/src/seismicrna/cluster/names.py
+++ b/src/seismicrna/cluster/names.py
@@ -7,8 +7,7 @@
"""
BIT_VECTOR_NAME = "Bit Vector"
-OBS_NAME = "Observed"
-ADJ_NAME = "Adjusted"
+CLUST_PROP_NAME = "Proportion"
LOG_OBS_NAME = "Log Observed"
LOG_EXP_NAME = "Log Expected"
diff --git a/src/seismicrna/cluster/save.py b/src/seismicrna/cluster/save.py
index b024c5dc..d3c96834 100644
--- a/src/seismicrna/cluster/save.py
+++ b/src/seismicrna/cluster/save.py
@@ -11,7 +11,7 @@ def write_batches(dataset: MaskMutsDataset,
""" Write the cluster memberships to batch files. """
checksums = list()
for batch_num in dataset.batch_nums:
- resps = pd.concat((runs.best.get_resps(batch_num) for runs in orders),
+ resps = pd.concat((runs.best.get_members(batch_num) for runs in orders),
axis=1)
batch = ClusterBatchIO(sample=dataset.sample,
ref=dataset.ref,
diff --git a/src/seismicrna/core/mu/unbias/tests/__init__.py b/src/seismicrna/cluster/tests/__init__.py
similarity index 99%
rename from src/seismicrna/core/mu/unbias/tests/__init__.py
rename to src/seismicrna/cluster/tests/__init__.py
index 2719edc3..3fe7dc13 100644
--- a/src/seismicrna/core/mu/unbias/tests/__init__.py
+++ b/src/seismicrna/cluster/tests/__init__.py
@@ -1,5 +1,3 @@
-
-
########################################################################
# #
# © Copyright 2024, the Rouskin Lab. #
diff --git a/src/seismicrna/cluster/tests/em_test.py b/src/seismicrna/cluster/tests/em_test.py
new file mode 100644
index 00000000..2a62160a
--- /dev/null
+++ b/src/seismicrna/cluster/tests/em_test.py
@@ -0,0 +1,222 @@
+import unittest as ut
+
+import numpy as np
+
+from seismicrna.cluster.em import _expectation
+
+
+class TestExpectation(ut.TestCase):
+
+ def compare(self,
+ p_mut: np.ndarray,
+ p_ends: np.ndarray,
+ p_clust: np.ndarray,
+ end5s: np.ndarray,
+ end3s: np.ndarray,
+ unmasked: np.ndarray,
+ muts_per_pos: list[np.ndarray],
+ min_mut_gap: int,
+ expect_log_marginals: np.ndarray,
+ expect_memberships: np.ndarray):
+ result_log_marginals, result_memberships = _expectation(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap)
+ self.assertEqual(result_log_marginals.shape, expect_log_marginals.shape)
+ self.assertTrue(np.allclose(result_log_marginals, expect_log_marginals))
+ self.assertEqual(expect_memberships.shape, result_memberships.shape)
+ self.assertTrue(np.allclose(expect_memberships, result_memberships))
+
+ def test_1pos(self):
+ p_mut = np.array([[0.1]])
+ p_ends = np.array([[1.]])
+ p_clust = np.array([1.])
+ end5s = np.array([0, 0])
+ end3s = np.array([0, 0])
+ unmasked = np.array([0])
+ muts_per_pos = [np.array([1])]
+ min_mut_gap = 0
+ expect_log_marginals = np.log([0.9, 0.1])
+ expect_memberships = np.ones((2, 1))
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_2pos_gap0(self):
+ p_mut = np.array([[0.1],
+ [0.2]])
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_clust = np.array([1.])
+ end5s = np.array([0, 0, 0, 0, 0, 0, 1, 1])
+ end3s = np.array([0, 0, 1, 1, 1, 1, 1, 1])
+ unmasked = np.array([0, 1])
+ muts_per_pos = [np.array([1, 3, 5]), np.array([4, 5, 7])]
+ expect_log_marginals = np.log(
+ [0.18, 0.02, 0.36, 0.04, 0.09, 0.01, 0.24, 0.06]
+ )
+ expect_memberships = np.ones((8, 1))
+ min_mut_gap = 0
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_2pos_gap1(self):
+ p_mut = np.array([[0.1],
+ [0.2]])
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_clust = np.array([1.])
+ end5s = np.array([0, 0, 0, 0, 0, 1, 1])
+ end3s = np.array([0, 0, 1, 1, 1, 1, 1])
+ unmasked = np.array([0, 1])
+ muts_per_pos = [np.array([1, 3]), np.array([4, 6])]
+ expect_log_marginals = np.log([0.18 / 0.99,
+ 0.02 / 0.99,
+ 0.36 / 0.99,
+ 0.04 / 0.99,
+ 0.09 / 0.99,
+ 0.24 / 0.99,
+ 0.06 / 0.99])
+ expect_memberships = np.ones((7, 1))
+ min_mut_gap = 1
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_2pos_masked0(self):
+ p_mut = np.array([[0.1],
+ [0.2]])
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_clust = np.array([1.])
+ end5s = np.array([0, 0, 0, 0, 0, 0, 1, 1])
+ end3s = np.array([0, 0, 1, 1, 1, 1, 1, 1])
+ unmasked = np.array([1])
+ muts_per_pos = [np.array([4, 5, 7])]
+ expect_log_marginals = np.log(
+ [0.20, 0.20, 0.40, 0.40, 0.10, 0.10, 0.24, 0.06]
+ )
+ expect_memberships = np.ones((8, 1))
+ for min_mut_gap in [0, 1]:
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_2pos_masked1(self):
+ p_mut = np.array([[0.1],
+ [0.2]])
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_clust = np.array([1.])
+ end5s = np.array([0, 0, 0, 0, 0, 0, 1, 1])
+ end3s = np.array([0, 0, 1, 1, 1, 1, 1, 1])
+ unmasked = np.array([0])
+ muts_per_pos = [np.array([1, 3, 5])]
+ expect_log_marginals = np.log(
+ [0.18, 0.02, 0.45, 0.05, 0.45, 0.05, 0.30, 0.30]
+ )
+ expect_memberships = np.ones((8, 1))
+ for min_mut_gap in [0, 1]:
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_1pos_2clusters(self):
+ p_mut = np.array([[0.1, 0.2]])
+ p_ends = np.array([[1.]])
+ p_clust = np.array([0.4, 0.6])
+ end5s = np.array([0, 0])
+ end3s = np.array([0, 0])
+ unmasked = np.array([0])
+ muts_per_pos = [np.array([1])]
+ min_mut_gap = 0
+ expect_log_marginals = np.log([0.84, 0.16])
+ expect_memberships = np.array([[3. / 7., 4. / 7.],
+ [1. / 4., 3. / 4.]])
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+ def test_2pos_gap0_2clusters(self):
+ p_mut = np.array([[0.1, 0.4],
+ [0.2, 0.3]])
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_clust = np.array([0.4, 0.6])
+ end5s = np.array([0, 0, 0, 0, 0, 0, 1, 1])
+ end3s = np.array([0, 0, 1, 1, 1, 1, 1, 1])
+ unmasked = np.array([0, 1])
+ muts_per_pos = [np.array([1, 3, 5]), np.array([4, 5, 7])]
+ expect_log_marginals = np.log(
+ [0.144, 0.056, 0.270, 0.100, 0.090, 0.040, 0.222, 0.078]
+ )
+ expect_memberships = np.array([[1. / 2., 1. / 2.],
+ [1. / 7., 6. / 7.],
+ [8. / 15., 7. / 15.],
+ [4. / 25., 21. / 25.],
+ [2. / 5., 3. / 5.],
+ [1. / 10., 9. / 10.],
+ [16. / 37., 21. / 37.],
+ [4. / 13., 9. / 13.]])
+ min_mut_gap = 0
+ self.compare(p_mut,
+ p_ends,
+ p_clust,
+ end5s,
+ end3s,
+ unmasked,
+ muts_per_pos,
+ min_mut_gap,
+ expect_log_marginals,
+ expect_memberships)
+
+
+if __name__ == "__main__":
+ ut.main()
diff --git a/src/seismicrna/cluster/uniq.py b/src/seismicrna/cluster/uniq.py
index 03e133f3..9044b5c5 100644
--- a/src/seismicrna/cluster/uniq.py
+++ b/src/seismicrna/cluster/uniq.py
@@ -7,7 +7,7 @@
from .names import BIT_VECTOR_NAME
from ..core.batch import RefseqMutsBatch, get_length
-from ..core.rel import REL_TYPE, RelPattern
+from ..core.rel import RelPattern
from ..core.seq import Section
from ..mask.data import MaskMutsDataset
@@ -28,32 +28,52 @@ def __init__(self,
sample: str,
section: Section,
min_mut_gap: int,
+ ends: tuple[np.ndarray, np.ndarray],
muts_per_pos: list[np.ndarray],
batch_to_uniq: list[pd.Series],
counts_per_uniq: np.ndarray):
self.sample = sample
self.section = section
self.min_mut_gap = min_mut_gap
- if len(muts_per_pos) != self.num_pos:
- raise ValueError(f"Expected {self.num_pos} positions, "
+ if len(muts_per_pos) != (npos := get_length(self.section.unmasked_int,
+ "pos_nums")):
+ raise ValueError(f"Expected {npos} positions, "
f"but got {len(muts_per_pos)}")
self.muts_per_pos = muts_per_pos
self.batch_to_uniq = batch_to_uniq
self.counts_per_uniq = counts_per_uniq
+ for end_coords in ends:
+ if get_length(end_coords) != self.num_uniq:
+ raise ValueError(f"Expected {self.num_uniq} end coordinates, "
+ f"but got {get_length(end_coords)}")
+ self.ends = ends
@property
def ref(self):
""" Reference name. """
return self.section.ref
+ @property
+ def end5s(self):
+ """ 5' end coordinates. """
+ end5s, end3s = self.ends
+ return end5s
+
+ @property
+ def end3s(self):
+ """ 3' end coordinates. """
+ end5s, end3s = self.ends
+ return end3s
+
@cached_property
- def pos_nums(self):
- return self.section.unmasked_int
+ def end5s_zero(self):
+ """ 5' end coordinates (0-indexed from 5' end of section). """
+ return self.end5s - self.section.end5
@cached_property
- def num_pos(self):
- """ Number of positions in each bit vector. """
- return get_length(self.pos_nums, "pos_nums")
+ def end3s_zero(self):
+ """ 3' end coordinates (0-indexed from 5' end of section). """
+ return self.end3s - self.section.end5
@cached_property
def num_batches(self):
@@ -66,25 +86,39 @@ def num_uniq(self):
return get_length(self.counts_per_uniq, "counts")
@cached_property
- def num_reads(self):
- """ Number of total reads (including duplicates). """
- return np.sum(self.counts_per_uniq)
+ def num_nonuniq(self) -> int:
+ """ Number of total reads (including non-unique reads). """
+ return self.counts_per_uniq.sum()
- def get_matrix(self):
- """ Full boolean matrix of the unique bit vectors. """
+ def get_mut_matrix(self):
+ """ Full boolean matrix of the mutations. """
# Initialize an all-False matrix with one row for each unique
- # bit vector and one column for each position.
- full = np.zeros((self.num_uniq, self.num_pos), dtype=bool)
+ # read and one column for each position.
+ muts = np.zeros((self.num_uniq, self.section.length), dtype=bool)
# For each position (j), set the mutated elements to True.
- for j, indexes in enumerate(self.muts_per_pos):
- full[indexes, j] = True
- return full
+ for j, indexes in zip(self.section.unmasked_zero,
+ self.muts_per_pos,
+ strict=True):
+ muts[indexes, j] = True
+ return muts
+
+ def get_cov_matrix(self):
+ """ Full boolean matrix of the covered positions. """
+ # Initialize an all-False matrix with one row for each unique
+ # read and one column for each position.
+ covs = np.zeros((self.num_uniq, self.section.length), dtype=bool)
+ # For each read (i), set the covered elements to True.
+ for i, (end5, end3) in enumerate(zip(self.end5s_zero, self.end3s_zero)):
+ covs[i, end5: (end3 + 1)] = True
+ return covs
def get_uniq_names(self):
""" Unique bit vectors as byte strings. """
- # Get the full boolean matrix of the unique bit vectors and cast
- # the data from boolean to unsigned 8-bit integer type.
- chars = self.get_matrix().astype(REL_TYPE, copy=False)
+ # Get the full boolean matrices of the coverage and mutations of
+ # the unique reads, cast the data from boolean to 8-bit integer
+ # type, and merge them into one matrix via subtraction.
+ chars = (self.get_mut_matrix().astype(np.int8, copy=False)
+ - 2 * (~self.get_cov_matrix()).astype(np.int8, copy=False))
if chars.size > 0:
# Add ord('0') to transform every 0 into b'0' and every 1
# into # b'1', and convert each row (bit vector) into a
@@ -99,47 +133,47 @@ def get_uniq_names(self):
return pd.Index(names, name=BIT_VECTOR_NAME)
def __eq__(self, other):
- if isinstance(other, UniqReads):
- return (self.sample == other.sample
- and self.section == other.section
- and self.min_mut_gap == other.min_mut_gap
- and np.array_equal(self.pos_nums,
- other.pos_nums)
- and all(np.array_equal(m1, m2)
- for m1, m2 in zip(self.muts_per_pos,
- other.muts_per_pos,
- strict=True))
- and self.num_batches == other.num_batches
- and all(b1.equals(b2)
- for b1, b2 in zip(self.batch_to_uniq,
- other.batch_to_uniq,
- strict=True))
- and np.array_equal(self.counts_per_uniq,
- other.counts_per_uniq))
- return NotImplemented
+ if not isinstance(other, UniqReads):
+ return NotImplemented
+ return (self.sample == other.sample
+ and self.section == other.section
+ and self.min_mut_gap == other.min_mut_gap
+ and all(np.array_equal(m1, m2)
+ for m1, m2 in zip(self.muts_per_pos,
+ other.muts_per_pos,
+ strict=True))
+ and self.num_batches == other.num_batches
+ and all(b1.equals(b2)
+ for b1, b2 in zip(self.batch_to_uniq,
+ other.batch_to_uniq,
+ strict=True))
+ and np.array_equal(self.counts_per_uniq,
+ other.counts_per_uniq))
def __str__(self):
return f"{type(self).__name__} of {self.sample} over {self.section}"
-def uniq_reads_to_mutations(uniq_reads: Iterable[tuple],
- pos_nums: Iterable[int]):
+def _uniq_reads_to_ends_muts(uniq_reads: Iterable[tuple[tuple, tuple]],
+ pos_nums: Iterable[int]):
""" Map each position to the numbers of the unique reads that are
mutated at the position. """
- mutations = defaultdict(list)
- for uniq_read_num, read_muts_pos in enumerate(uniq_reads):
- for pos in read_muts_pos:
- mutations[pos].append(uniq_read_num)
- return [np.array(mutations[pos], dtype=int) for pos in pos_nums]
-
-
-def count_uniq_reads(uniq_read_nums: Iterable[list]):
- """ Count the occurrances of each unique value in the original. """
- return np.array(list(map(len, uniq_read_nums)))
-
-
-def batch_to_uniq_read_num(read_nums_per_batch: list[np.ndarray],
- uniq_read_nums: Iterable[list]):
+ end5s = list()
+ end3s = list()
+ muts = defaultdict(list)
+ for uniq_read_num, ((end5, end3), read_muts) in enumerate(uniq_reads):
+ end5s.append(end5)
+ end3s.append(end3)
+ for pos in read_muts:
+ muts[pos].append(uniq_read_num)
+ reads_ends = (np.array(end5s, dtype=int),
+ np.array(end3s, dtype=int))
+ muts_per_pos = [np.array(muts[pos], dtype=int) for pos in pos_nums]
+ return reads_ends, muts_per_pos
+
+
+def _batch_to_uniq_read_num(read_nums_per_batch: list[np.ndarray],
+ uniq_read_nums: Iterable[list]):
""" Map each read's number in its own batch to its unique number in
the pool of all batches. """
# For each batch, initialize a map from the read numbers of the .
@@ -156,6 +190,11 @@ def batch_to_uniq_read_num(read_nums_per_batch: list[np.ndarray],
return batch_to_uniq
+def _count_uniq_reads(uniq_read_nums: Iterable[list]):
+ """ Count the occurrances of each unique value in the original. """
+ return np.fromiter(map(len, uniq_read_nums), dtype=int)
+
+
def get_uniq_reads(pos_nums: Iterable[int],
pattern: RelPattern,
batches: Iterable[RefseqMutsBatch]):
@@ -164,15 +203,24 @@ def get_uniq_reads(pos_nums: Iterable[int],
for batch_num, batch in enumerate(batches):
if batch.batch != batch_num:
raise ValueError(
- f"Batch {batch} is not in order (expected {batch_num})")
+ f"Batch {batch} is not in order (expected {batch_num})"
+ )
+ # Record the number of reads in the batch.
read_nums_per_batch.append(batch.read_nums)
- for read_num, (e, m) in batch.iter_reads(pattern):
- uniq_reads[m].append((batch_num, read_num))
- muts_per_pos = uniq_reads_to_mutations(uniq_reads, pos_nums)
- batch_to_uniq = batch_to_uniq_read_num(read_nums_per_batch,
- uniq_reads.values())
- count_per_uniq = count_uniq_reads(uniq_reads.values())
- return muts_per_pos, batch_to_uniq, count_per_uniq
+ # Find the reads with unique end coordinates and mutations.
+ for (read_num, ((end5, end3), read_muts)) in batch.iter_reads(pattern):
+ # Key each read by its 5' and 3' end coordinates and by the
+ # positions at which it has mutations, so that non-unique
+ # reads map to the same key; record each read as a tuple of
+ # its batch number and its read number within its batch.
+ uniq_reads[((end5, end3), read_muts)].append((batch_num, read_num))
+ # Pre-process the unique reads to extract necessary information.
+ reads_ends, muts_per_pos = _uniq_reads_to_ends_muts(uniq_reads,
+ pos_nums)
+ batch_to_uniq = _batch_to_uniq_read_num(read_nums_per_batch,
+ uniq_reads.values())
+ count_per_uniq = _count_uniq_reads(uniq_reads.values())
+ return reads_ends, muts_per_pos, batch_to_uniq, count_per_uniq
########################################################################
# #
diff --git a/src/seismicrna/core/arg/cli.py b/src/seismicrna/core/arg/cli.py
index ef861901..ae660803 100644
--- a/src/seismicrna/core/arg/cli.py
+++ b/src/seismicrna/core/arg/cli.py
@@ -6,12 +6,11 @@
Define all command line interface (CLI) options and their defaults.
"""
-from datetime import datetime
import logging
import os
+from datetime import datetime
import click
-import numpy as np
from click import Argument, Choice, Option, Parameter, Path
from ..io import DEFAULT_BROTLI_LEVEL
@@ -615,17 +614,17 @@
help="File of arbitrary positions to exclude"
)
-opt_min_ncall_read = Option(
- ("--min-ncall-read",),
+opt_min_ncov_read = Option(
+ ("--min-ncov-read",),
type=int,
default=1,
- help="Minimum number of base calls in a read to keep it"
+ help="Minimum coverage of a read to keep it (nt)"
)
opt_min_finfo_read = Option(
("--min-finfo-read",),
type=float,
- default=0.0,
+ default=0.95,
help="Minimum fraction of information in a read to keep it"
)
@@ -636,13 +635,6 @@
help="Maximum fraction of mutations in a read to keep it"
)
-opt_max_nmut_read = Option(
- ("--max-nmut-read",),
- type=int,
- default=-1,
- help="Maximum number of mutations in a read to keep it (-1 to disable)"
-)
-
opt_min_mut_gap = Option(
("--min-mut-gap",),
type=int,
@@ -697,7 +689,7 @@
opt_em_thresh = Option(
("--em-thresh",),
type=float,
- default=np.log(2.),
+ default=0.1,
help="Maximum change in log likelihood for convergence"
)
diff --git a/src/seismicrna/core/batch/accum.py b/src/seismicrna/core/batch/accum.py
index de5d7ced..980237ad 100644
--- a/src/seismicrna/core/batch/accum.py
+++ b/src/seismicrna/core/batch/accum.py
@@ -3,10 +3,11 @@
import numpy as np
import pandas as pd
+from .index import END_COORDS
from .muts import RefseqMutsBatch
from ..header import make_header
from ..rel import RelPattern
-from ..seq import POS_INDEX, DNA, seq_pos_to_index
+from ..seq import DNA, seq_pos_to_index
def _add_to_rel(added: pd.Series | pd.DataFrame, frame: pd.DataFrame, rel: str):
@@ -28,20 +29,30 @@ def accumulate(batches: Iterable[RefseqMutsBatch],
max_order: int = 0,
pos_nums: np.ndarray | None = None,
per_read: bool = True,
- get_info: bool = True):
+ get_info: bool = True,
+ count_ends: bool = True):
header = make_header(rels=list(patterns), max_order=max_order)
- # Initialize the total read counts.
+ end_counts_index = pd.MultiIndex.from_tuples([], names=END_COORDS)
+ # Initialize the total read counts and end coordinate counts.
if header.clustered():
dtype = float
num_reads = pd.Series(0, index=header.clusts)
+ end_counts = (pd.DataFrame(index=end_counts_index,
+ columns=header.clusts,
+ dtype=dtype)
+ if count_ends else None)
else:
dtype = int
num_reads = 0
+ end_counts = (pd.Series(index=end_counts_index,
+ dtype=dtype)
+ if count_ends else None)
+ zero = dtype(0)
# Initialize the counts per position.
if pos_nums is not None:
- index_per_pos = seq_pos_to_index(refseq, pos_nums, POS_INDEX)
- fits_per_pos = pd.DataFrame(dtype(0), index_per_pos, header.index)
- info_per_pos = (pd.DataFrame(dtype(0), index_per_pos, header.index)
+ index_per_pos = seq_pos_to_index(refseq, pos_nums, 1)
+ fits_per_pos = pd.DataFrame(zero, index_per_pos, header.index)
+ info_per_pos = (pd.DataFrame(zero, index_per_pos, header.index)
if get_info else None)
else:
fits_per_pos = None
@@ -64,13 +75,16 @@ def accumulate(batches: Iterable[RefseqMutsBatch],
f"differ from pos_nums ({pos_nums})")
# Count the total number of reads in the batch.
num_reads += batch.num_reads
+ # Count the end coordinates.
+ if end_counts is not None:
+ end_counts = end_counts.add(batch.end_counts, fill_value=0.)
# Count the positions and/or reads matching each pattern.
if fits_per_read_per_batch is not None:
- fits_per_read_per_batch.append(pd.DataFrame(dtype(0),
+ fits_per_read_per_batch.append(pd.DataFrame(zero,
batch.batch_read_index,
header.index))
if info_per_read_per_batch is not None:
- info_per_read_per_batch.append(pd.DataFrame(dtype(0),
+ info_per_read_per_batch.append(pd.DataFrame(zero,
batch.batch_read_index,
header.index))
for column, pattern in patterns.items():
@@ -86,7 +100,7 @@ def accumulate(batches: Iterable[RefseqMutsBatch],
fits_per_read_per_batch[-1].loc[:, column] = fpr.values
if info_per_read_per_batch is not None:
info_per_read_per_batch[-1].loc[:, column] = ipr.values
-
+
def get_data_per_read(data_per_read_per_batch: pd.DataFrame | None):
if data_per_read_per_batch is not None:
if data_per_read_per_batch:
@@ -99,23 +113,24 @@ def get_data_per_read(data_per_read_per_batch: pd.DataFrame | None):
(fits_per_pos,
info_per_pos),
(get_data_per_read(fits_per_read_per_batch),
- get_data_per_read(info_per_read_per_batch)))
+ get_data_per_read(info_per_read_per_batch)),
+ end_counts)
def accum_per_pos(batches: Iterable[RefseqMutsBatch],
refseq: DNA,
pos_nums: np.ndarray,
patterns: dict[str, RelPattern],
- max_order: int = 0,
- ) -> tuple[int | pd.Series, pd.DataFrame, pd.DataFrame]:
+ max_order: int = 0):
""" Count reads with each relationship at each position in a section
over multiple batches. """
- num_reads, (fpp, ipp), (_, __) = accumulate(batches,
- refseq,
- patterns,
- max_order=max_order,
- pos_nums=pos_nums,
- per_read=False)
+ num_reads, (fpp, ipp), (_, __), ___ = accumulate(batches,
+ refseq,
+ patterns,
+ max_order=max_order,
+ pos_nums=pos_nums,
+ per_read=False,
+ count_ends=False)
return num_reads, fpp, ipp
@@ -123,16 +138,15 @@ def accum_fits(batches: Iterable[RefseqMutsBatch],
refseq: DNA,
pos_nums: np.ndarray,
patterns: dict[str, RelPattern],
- max_order: int = 0,
- ) -> tuple[int | pd.Series, pd.DataFrame, pd.DataFrame]:
+ max_order: int = 0):
""" Count positions and reads fitting each relationship. """
- num_reads, (fpp, _), (fpr, __) = accumulate(batches,
- refseq,
- patterns,
- max_order=max_order,
- pos_nums=pos_nums,
- get_info=False)
- return num_reads, fpp, fpr
+ num_reads, (fpp, _), (fpr, __), ends = accumulate(batches,
+ refseq,
+ patterns,
+ max_order=max_order,
+ pos_nums=pos_nums,
+ get_info=False)
+ return num_reads, fpp, fpr, ends
########################################################################
# #
diff --git a/src/seismicrna/core/batch/count.py b/src/seismicrna/core/batch/count.py
index f1ac93f1..0ac56312 100644
--- a/src/seismicrna/core/batch/count.py
+++ b/src/seismicrna/core/batch/count.py
@@ -4,39 +4,62 @@
import numpy as np
import pandas as pd
-from .index import get_length, count_base_types, iter_base_types
+from .index import (END_COORDS,
+ count_base_types,
+ get_length,
+ has_mids,
+ iter_base_types,
+ stack_end_coords)
from ..rel import MATCH, NOCOV, RelPattern
from ..seq import POS_NAME, DNA
+def count_end_coords(end5s: np.ndarray,
+ end3s: np.ndarray,
+ weights: pd.DataFrame | None = None):
+ """ Count each pair of 5' and 3' end coordinates. """
+ # Make a MultiIndex of all 5' and 3' coordinates.
+ index = pd.MultiIndex.from_frame(pd.DataFrame(stack_end_coords(end5s,
+ end3s),
+ columns=END_COORDS,
+ copy=False))
+ # Convert the read weights into a Series/DataFrame with that index.
+ if weights is not None:
+ weights = pd.DataFrame(weights.values, index, weights.columns)
+ else:
+ weights = pd.Series(1., index)
+ # Sum the weights for each unique pair of 5'/3' coordinates.
+ return weights.groupby(level=list(range(weights.index.nlevels))).sum()
+
+
def get_half_coverage_matrix(pos_nums: np.ndarray,
pos5s: np.ndarray,
pos3s: np.ndarray):
- # Determine and validate the dimensions.
- num_pos = get_length(pos_nums)
- nreads = get_length(pos5s, "5' end positions")
- # Reshape the positions and 5'/3' ends to row and column vectors.
- pos_row = pos_nums.reshape((1, num_pos))
- end5s_col = pos5s.reshape((nreads, 1))
- end3s_col = pos3s.reshape((nreads, 1))
- # Generate a boolean matrix where each element indicates whether
+ # Reshape the positions and 5'/3' ends to row and column vectors,
+ # then make a boolean matrix where each element indicates whether
# the read (row) covers the position (column).
- return np.logical_and(end5s_col <= pos_row, pos_row <= end3s_col)
+ return np.logical_and(pos5s[:, np.newaxis] <= pos_nums[np.newaxis, :],
+ pos_nums[np.newaxis, :] <= pos3s[:, np.newaxis])
def get_coverage_matrix(pos_index: pd.Index,
end5s: np.ndarray,
- mid5s: np.ndarray,
- mid3s: np.ndarray,
+ mid5s: np.ndarray | None,
+ mid3s: np.ndarray | None,
end3s: np.ndarray,
read_nums: np.ndarray):
pos_nums = pos_index.get_level_values(POS_NAME).values
- return pd.DataFrame(np.logical_or(get_half_coverage_matrix(pos_nums,
- end5s,
- mid3s),
- get_half_coverage_matrix(pos_nums,
- mid5s,
- end3s)),
+ if has_mids(mid5s, mid3s):
+ # If 5' and 3' middle coordinates are present, then take the
+ # union of the coverage of both mates.
+ coverage_matrix = np.logical_or(
+ get_half_coverage_matrix(pos_nums, end5s, mid3s),
+ get_half_coverage_matrix(pos_nums, mid5s, end3s)
+ )
+ else:
+ # Otherwise, just take the coverage between the 5' and 3' ends.
+ coverage_matrix = get_half_coverage_matrix(pos_nums, end5s, end3s)
+ return pd.DataFrame(coverage_matrix,
index=read_nums,
columns=pos_index,
copy=False)
diff --git a/src/seismicrna/core/batch/index.py b/src/seismicrna/core/batch/index.py
index 2e082639..41d86b31 100644
--- a/src/seismicrna/core/batch/index.py
+++ b/src/seismicrna/core/batch/index.py
@@ -6,12 +6,7 @@
from ..seq import BASE_NAME
from ..types import fit_uint_type, get_uint_type, UINT_NBYTES
-# Whether numbers are 0-indexed or 1-indexed.
-BATCH_INDEX = 0
-POS_INDEX = 1
-
# Missing identifiers.
-NO_POS = POS_INDEX - 1
NO_READ = -1
# Indexes of read and batch numbers.
@@ -19,10 +14,15 @@
BATCH_NUM = "Batch Number"
RB_INDEX_NAMES = [BATCH_NUM, READ_NUM]
+# Indexes of read end coordinates.
+END5_COORD = "5' End"
+END3_COORD = "3' End"
+END_COORDS = END5_COORD, END3_COORD
+
def list_batch_nums(num_batches: int):
""" List the batch numbers. """
- return list(range(BATCH_INDEX, BATCH_INDEX + num_batches))
+ return list(range(num_batches))
def get_length(array: np.ndarray, what: str = "array") -> int:
@@ -59,11 +59,12 @@ def get_inverse(target: np.ndarray, what: str = "array"):
def ensure_same_length(arr1: np.ndarray,
arr2: np.ndarray,
- what1: str,
- what2: str):
+ what1: str = "array1",
+ what2: str = "array2"):
if (len1 := get_length(arr1, what1)) != (len2 := get_length(arr2, what2)):
raise ValueError(
- f"Lengths differ between {what1} ({len1}) and {what2} ({len2})")
+ f"Lengths differ between {what1} ({len1}) and {what2} ({len2})"
+ )
return len1
@@ -72,16 +73,36 @@ def ensure_order(array1: np.ndarray,
what1: str = "array1",
what2: str = "array2",
gt_eq: bool = False):
- num_reads = ensure_same_length(array1, array2, what1, what2)
- ineq_func, ineq_sign = (np.less, '<') if gt_eq else (np.greater, '>')
+ """ Ensure that `array1` is ≤ or ≥ `array2`, element-wise.
+
+ Parameters
+ ----------
+ array1: np.ndarray
+ Array 1 (same length as `array2`).
+ array2: np.ndarray
+ Array 2 (same length as `array1`).
+ what1: str = "array1"
+ What `array1` contains (only used for error messages).
+ what2: str = "array2"
+ What `array2` contains (only used for error messages).
+ gt_eq: bool = False
+ Ensure `array1 ≥ array2` if True, otherwise `array1 ≤ array2`.
+
+ Returns
+ -------
+ int
+ Shared length of `array1` and `array2`.
+ """
+ length = ensure_same_length(array1, array2, what1, what2)
+ ineq_func, ineq_sign = (np.less, "<") if gt_eq else (np.greater, ">")
if np.any(is_err := ineq_func(array1, array2)):
- index = pd.Index(np.arange(num_reads)[is_err], name=READ_NUM)
+ index = pd.Index(np.arange(length)[is_err], name=READ_NUM)
errors = pd.DataFrame.from_dict({what1: pd.Series(array1[is_err],
index=index),
what2: pd.Series(array2[is_err],
index=index)})
raise ValueError(f"Got {what1} {ineq_sign} {what2}:\n{errors}")
- return num_reads
+ return length
def sanitize_values(values: Iterable[int],
@@ -116,60 +137,92 @@ def sanitize_values(values: Iterable[int],
def sanitize_pos(positions: Iterable[int], seq_length: int):
""" Validate and sort positions, and return them as an array. """
- return sanitize_values(positions, POS_INDEX, seq_length, "positions")
+ return sanitize_values(positions, 1, seq_length, "positions")
+
+def has_mids(mid5s: np.ndarray | None, mid3s: np.ndarray | None):
+ """ Whether the 5' and 3' middle coordinates exist. """
+ if isinstance(mid5s, np.ndarray) and isinstance(mid3s, np.ndarray):
+ # They exist if they are both arrays and have the same length.
+ ensure_same_length(mid5s,
+ mid3s,
+ "5' middle coordinates",
+ "3' middle coordinates")
+ return True
+ if mid5s is None and mid3s is None:
+ # They do not exist if they are both None.
+ return False
+ # All other cases are invalid.
+ raise ValueError(
+ f"Inconsistent 5' and 3' middle coordinates:\n{mid5s}\nand\n{mid3s}"
+ )
-def contiguous_mates(mid5s: np.ndarray, mid3s: np.ndarray):
+
+def contiguous_mates(mid5s: np.ndarray | None, mid3s: np.ndarray | None):
""" Return whether the two mates form a contiguous read. """
+ ensure_same_length(mid5s,
+ mid3s,
+ "5' middle coordinates",
+ "3' middle coordinates")
return np.less_equal(mid5s, mid3s + 1)
def sanitize_ends(max_pos: int,
end5s: list[int] | np.ndarray,
- mid5s: list[int] | np.ndarray,
- mid3s: list[int] | np.ndarray,
+ mid5s: list[int] | np.ndarray | None,
+ mid3s: list[int] | np.ndarray | None,
end3s: list[int] | np.ndarray):
pos_dtype = fit_uint_type(max_pos)
end5s = np.asarray(end5s, pos_dtype)
- mid5s = np.asarray(mid5s, pos_dtype)
- mid3s = np.asarray(mid3s, pos_dtype)
end3s = np.asarray(end3s, pos_dtype)
# Verify 5' end ≥ min position
ensure_order(end5s,
- np.broadcast_to(POS_INDEX, end5s.shape),
+ np.broadcast_to(1, end5s.shape),
"5' end positions",
- f"minimum position ({POS_INDEX})",
+ f"minimum position (1)",
gt_eq=True)
- # Verify 5' end ≤ 5' mid
- ensure_order(end5s, mid5s, "5' end positions", "5' middle positions")
- # Verify 5' end ≤ 3' mid
- ensure_order(end5s, mid3s, "5' end positions", "3' middle positions")
- # Verify 5' mid ≤ 3' end
- ensure_order(mid5s, end3s, "5' middle positions", "3' end positions")
- # Verify 3' mid ≤ 3' end
- ensure_order(mid3s, end3s, "3' middle positions", "3' end positions")
+ # Verify 5' end ≤ 3' end
+ ensure_order(end5s,
+ end3s,
+ "5' end positions",
+ "3' end positions")
# Verify 3' end ≤ max position
ensure_order(end3s,
np.broadcast_to(max_pos, end3s.shape),
"3' end positions",
f"maximum position ({max_pos})")
- # Check which reads are made of contiguous mates, i.e. the mates
- # overlap or at least abut with no gap between.
- is_contiguous = contiguous_mates(mid5s, mid3s)
- if np.all(is_contiguous):
- # In the special case that all mates are contiguous (which is
- # very common with short read sequencing data and hence worth
- # optimizing), nullify the middle positions to save space.
- mid5s = None
- mid3s = None
- else:
- # For contiguous mates, set the 5' and 3' ends of both mates to
- # the 5' and 3' ends of the contiguous region that they cover.
- mid5s[is_contiguous] = end5s[is_contiguous]
- mid3s[is_contiguous] = end3s[is_contiguous]
+ if has_mids(mid5s, mid3s):
+ # Verify 5' end ≤ 5' mid
+ ensure_order(end5s, mid5s, "5' end positions", "5' middle positions")
+ # Verify 5' mid ≤ 3' end
+ ensure_order(mid5s, end3s, "5' middle positions", "3' end positions")
+ # Verify 5' end ≤ 3' mid
+ ensure_order(end5s, mid3s, "5' end positions", "3' middle positions")
+ # Verify 3' mid ≤ 3' end
+ ensure_order(mid3s, end3s, "3' middle positions", "3' end positions")
+ # Check which reads are made of contiguous mates, i.e. the mates
+ # overlap or at least abut with no gap between.
+ is_contiguous = contiguous_mates(mid5s, mid3s)
+ if np.all(is_contiguous):
+ # If all mates are contiguous (which is common in short read
+ # sequencing data and hence worth optimizing), nullify the
+ # 5' and 3' middle coordinates to reduce space.
+ mid5s = None
+ mid3s = None
+ else:
+ # For contiguous mates, set the 5' and 3' middle coordinates
+ # to the 5' and 3' ends of the contiguous region they cover.
+ mid5s[is_contiguous] = end5s[is_contiguous]
+ mid3s[is_contiguous] = end3s[is_contiguous]
return end5s, mid5s, mid3s, end3s
+def stack_end_coords(end5s: np.ndarray, end3s: np.ndarray):
+ """ Return the 5' and 3' ends as one 2D array. """
+ ensure_same_length(end5s, end3s, "5' end coordinates", "3' end coordinates")
+ return np.stack([end5s, end3s], axis=1)
+
+
def count_base_types(base_pos_index: pd.Index):
""" Return the number of each type of base in the index of positions
and bases. """
diff --git a/src/seismicrna/core/batch/muts.py b/src/seismicrna/core/batch/muts.py
index 729af06f..1ea654ac 100644
--- a/src/seismicrna/core/batch/muts.py
+++ b/src/seismicrna/core/batch/muts.py
@@ -6,7 +6,8 @@
import numpy as np
import pandas as pd
-from .count import (get_count_per_pos,
+from .count import (count_end_coords,
+ get_count_per_pos,
get_count_per_read,
get_coverage_matrix,
get_cover_per_pos,
@@ -14,7 +15,12 @@
get_reads_per_pos,
get_rels_per_pos,
get_rels_per_read)
-from .index import POS_INDEX, iter_windows, sanitize_ends, sanitize_pos
+from .index import (contiguous_mates,
+ ensure_same_length,
+ has_mids,
+ iter_windows,
+ sanitize_ends,
+ sanitize_pos)
from .read import ReadBatch, PartialReadBatch
from ..rel import REL_TYPE, RelPattern
from ..seq import BASE_NAME, DNA, seq_pos_to_index
@@ -29,18 +35,29 @@ class MutsBatch(ReadBatch, ABC):
def __init__(self, *,
muts: dict[int, dict[int, list[int] | np.ndarray]],
end5s: list[int] | np.ndarray,
- mid5s: list[int] | np.ndarray,
- mid3s: list[int] | np.ndarray,
+ mid5s: list[int] | np.ndarray | None,
+ mid3s: list[int] | np.ndarray | None,
end3s: list[int] | np.ndarray,
sanitize: bool = True,
**kwargs):
super().__init__(**kwargs)
- (self.end5s,
- self._mid5s,
- self._mid3s,
- self.end3s) = (sanitize_ends(self.max_pos, end5s, mid5s, mid3s, end3s)
- if sanitize
- else (end5s, mid5s, mid3s, end3s))
+ if sanitize:
+ # Sanitize all coordinates, which can be slow.
+ end5s, mid5s, mid3s, end3s = sanitize_ends(self.max_pos,
+ end5s,
+ mid5s,
+ mid3s,
+ end3s)
+ else:
+ # Only ensure mid5s and mid3s are consistent, which is fast.
+ has_mids(mid5s, mid3s)
+ ensure_same_length(end5s, end3s, "end5s", "end3s")
+ # Store the coordinates.
+ self.end5s = end5s
+ self._mid5s = mid5s
+ self._mid3s = mid3s
+ self.end3s = end3s
+ # Validate and store the mutations.
self.muts = {pos: {REL_TYPE(rel): np.asarray(reads, self.read_dtype)
for rel, reads in muts[pos].items()}
for pos in (sanitize_pos(muts, self.max_pos)
@@ -69,17 +86,54 @@ def pos_nums(self) -> np.ndarray:
@property
def mid5s(self):
- return self._mid5s if self._mid5s is not None else self.end5s
+ return self._mid5s
@property
def mid3s(self):
- return self._mid3s if self._mid3s is not None else self.end3s
+ return self._mid3s
@property
def read_weights(self) -> pd.DataFrame | None:
""" Weights for each read when computing counts. """
return None
+ @cached_property
+ def contiguous_reads(self) -> np.ndarray:
+ """ Whether each read is made of contiguous mates. """
+ if has_mids(self.mid5s, self.mid3s):
+ return contiguous_mates(self.mid5s, self.mid3s)
+ # If the 5' and 3' middle coordinates are absent, then every
+ # read is assumed to be contiguous.
+ return np.ones(self.num_reads, dtype=bool)
+
+ @cached_property
+ def all_contiguous_reads(self) -> bool:
+ """ Whether all reads are contiguous. """
+ if has_mids(self.mid5s, self.mid3s):
+ return np.all(self.contiguous_reads)
+ return True
+
+ @cached_property
+ def num_contiguous_reads(self):
+ """ Number of contiguous reads. """
+ if has_mids(self.mid5s, self.mid3s):
+ n = int(np.sum(self.contiguous_reads))
+ if n > self.num_reads:
+ raise ValueError(f"{self} cannot have more contiguous reads "
+ f"({n}) than total reads ({self.num_reads})")
+ return n
+ return self.num_reads
+
+ @cached_property
+ def num_discontiguous_reads(self):
+ """ Number of discontiguous reads. """
+ return self.num_reads - self.num_contiguous_reads
+
+ @cached_property
+ def end_counts(self):
+ """ Counts of end coordinates. """
+ return count_end_coords(self.end5s, self.end3s, self.read_weights)
+
class ReflenMutsBatch(MutsBatch, ABC):
""" Batch of mutational data with only a known reference length. """
@@ -95,10 +149,10 @@ def max_pos(self) -> int:
class RefseqMutsBatch(MutsBatch, ABC):
""" Batch of mutational data with a known reference sequence. """
-
+
def __init__(self, *, refseq: DNA, **kwargs):
- super().__init__(**kwargs)
self.refseq = refseq
+ super().__init__(**kwargs)
@property
def max_pos(self):
@@ -106,7 +160,7 @@ def max_pos(self):
@cached_property
def pos_index(self):
- return seq_pos_to_index(self.refseq, self.pos_nums, POS_INDEX)
+ return seq_pos_to_index(self.refseq, self.pos_nums, 1)
@cached_property
def count_base_types(self):
@@ -177,8 +231,8 @@ def count_per_read(self, pattern: RelPattern):
self.rels_per_read,
self.read_weights)
- def nonprox_muts(self, pattern: RelPattern, min_gap: int):
- """ List the reads with non-proximal mutations. """
+ def reads_noclose_muts(self, pattern: RelPattern, min_gap: int):
+ """ List the reads with no two mutations too close. """
if min_gap < 0:
raise ValueError(f"min_gap must be ≥ 0, but got {min_gap}")
if min_gap == 0:
@@ -212,6 +266,10 @@ def nonprox_muts(self, pattern: RelPattern, min_gap: int):
def iter_reads(self, pattern: RelPattern):
""" Yield the 5'/3' end/middle positions and the positions that
are mutated in each read. """
+ if self.num_discontiguous_reads:
+ raise ValueError(f"Iteration over {self} is not supported "
+ f"because it has {self.num_discontiguous_reads} "
+ "(> 0) discontiguous read(s)")
reads_per_pos = self.reads_per_pos(pattern)
# Find the maximum number of mutations in any read.
max_mut_count = max(sum(map(Counter, reads_per_pos.values()),
@@ -230,15 +288,13 @@ def iter_reads(self, pattern: RelPattern):
mut_counts = np.count_nonzero(mut_pos, axis=1)
# For each read, yield the 5'/3' end/middle positions and the
# mutated positions as a tuple.
- for read_num, end5, mid5, mid3, end3, muts, count in zip(self.read_nums,
- self.end5s,
- self.mid5s,
- self.mid3s,
- self.end3s,
- mut_pos,
- mut_counts,
- strict=True):
- yield read_num, ((end5, mid5, mid3, end3), tuple(muts[:count]))
+ for read_num, end5, end3, muts, count in zip(self.read_nums,
+ self.end5s,
+ self.end3s,
+ mut_pos,
+ mut_counts,
+ strict=True):
+ yield read_num, ((end5, end3), tuple(muts[:count]))
class PartialMutsBatch(PartialReadBatch, MutsBatch, ABC):
diff --git a/src/seismicrna/core/batch/tests/__init__.py b/src/seismicrna/core/batch/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/seismicrna/core/batch/tests/count_test.py b/src/seismicrna/core/batch/tests/count_test.py
new file mode 100644
index 00000000..fdba1953
--- /dev/null
+++ b/src/seismicrna/core/batch/tests/count_test.py
@@ -0,0 +1,174 @@
+import unittest as ut
+
+import numpy as np
+import pandas as pd
+
+from seismicrna.core.batch.count import count_end_coords
+from seismicrna.core.batch.index import END5_COORD, END3_COORD
+
+
+class TestCountEndCoords(ut.TestCase):
+
+ def test_length_0(self):
+ end5s = np.array([], dtype=int)
+ end3s = np.array([], dtype=int)
+ result = count_end_coords(end5s, end3s)
+ self.assertIsInstance(result, pd.Series)
+ self.assertEqual(result.size, 0)
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([], dtype=int)
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([], dtype=int)
+ ))
+ self.assertTrue(np.array_equal(
+ result.values,
+ np.array([])
+ ))
+
+ def test_length_1(self):
+ end5s = np.array([4], dtype=int)
+ end3s = np.array([6], dtype=int)
+ result = count_end_coords(end5s, end3s)
+ self.assertIsInstance(result, pd.Series)
+ self.assertEqual(result.size, 1)
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([4])
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([6])
+ ))
+ self.assertTrue(np.array_equal(
+ result.values,
+ np.array([1])
+ ))
+
+ def test_length_2_diff(self):
+ end5s = np.array([4, 1], dtype=int)
+ end3s = np.array([6, 8], dtype=int)
+ result = count_end_coords(end5s, end3s)
+ self.assertIsInstance(result, pd.Series)
+ self.assertEqual(result.size, 2)
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([1, 4])
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([8, 6])
+ ))
+ self.assertTrue(np.array_equal(
+ result.values,
+ np.array([1, 1])
+ ))
+
+ def test_length_2_same(self):
+ end5s = np.array([4, 4], dtype=int)
+ end3s = np.array([6, 6], dtype=int)
+ result = count_end_coords(end5s, end3s)
+ self.assertIsInstance(result, pd.Series)
+ self.assertEqual(result.size, 1)
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([4])
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([6])
+ ))
+ self.assertTrue(np.array_equal(
+ result.values,
+ np.array([2])
+ ))
+
+ def test_length_3_diff_weights(self):
+ end5s = np.array([4, 1, 0], dtype=int)
+ end3s = np.array([6, 8, 3], dtype=int)
+ weights = pd.DataFrame(np.array([[2., 3.],
+ [4., 5.],
+ [6., 7.]]),
+ columns=["a", "b"])
+ result = count_end_coords(end5s, end3s, weights)
+ self.assertIsInstance(result, pd.DataFrame)
+ self.assertEqual(result.shape, weights.shape)
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([0, 1, 4])
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([3, 8, 6])
+ ))
+ self.assertEqual(result.columns.to_list(),
+ weights.columns.to_list())
+ self.assertTrue(np.array_equal(
+ result.values,
+ weights.values[[2, 1, 0]]
+ ))
+
+ def test_length_3_same_weights(self):
+ end5s = np.array([4, 1, 4], dtype=int)
+ end3s = np.array([6, 8, 6], dtype=int)
+ weights = pd.DataFrame(np.array([[2., 3.],
+ [4., 5.],
+ [6., 7.]]),
+ columns=["a", "b"])
+ result = count_end_coords(end5s, end3s, weights)
+ self.assertIsInstance(result, pd.DataFrame)
+ self.assertEqual(result.shape, (2, 2))
+ self.assertIsInstance(result.index, pd.MultiIndex)
+ self.assertEqual(result.index.names, [END5_COORD, END3_COORD])
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END5_COORD),
+ np.array([1, 4])
+ ))
+ self.assertTrue(np.array_equal(
+ result.index.get_level_values(END3_COORD),
+ np.array([8, 6])
+ ))
+ self.assertEqual(result.columns.to_list(),
+ weights.columns.to_list())
+ self.assertTrue(np.array_equal(
+ result.values,
+ np.array([[4., 5.],
+ [8., 10.]])
+ ))
+
+
+if __name__ == "__main__":
+ ut.main()
+
+########################################################################
+# #
+# © Copyright 2024, the Rouskin Lab. #
+# #
+# This file is part of SEISMIC-RNA. #
+# #
+# SEISMIC-RNA is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# SEISMIC-RNA is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
+# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
+# Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with SEISMIC-RNA; if not, see . #
+# #
+########################################################################
diff --git a/src/seismicrna/core/batch/tests/index_test.py b/src/seismicrna/core/batch/tests/index_test.py
new file mode 100644
index 00000000..9decc7e2
--- /dev/null
+++ b/src/seismicrna/core/batch/tests/index_test.py
@@ -0,0 +1,145 @@
+import unittest as ut
+
+import numpy as np
+
+from seismicrna.core.batch.index import (contiguous_mates,
+ ensure_same_length,
+ get_inverse,
+ get_length,
+ stack_end_coords)
+
+rng = np.random.default_rng()
+
+
+class TestGetLength(ut.TestCase):
+
+ def test_1d(self):
+ """ A 1D array has a length. """
+ for length in range(10):
+ array = rng.random(length)
+ self.assertEqual(get_length(array), length)
+
+ def test_other_dims(self):
+ """ Non-1D arrays are not valid. """
+ for d in range(4):
+ if d == 1:
+ continue
+ for length in range(10):
+ array = rng.random((length,) * d)
+ self.assertRaisesRegex(ValueError,
+ f"x must have 1 dimension, but got {d}",
+ get_length,
+ array, "x")
+
+
+class TestEnsureSameLength(ut.TestCase):
+
+ def test_same_length(self):
+ """ The length is returned when the arrays share the length. """
+ for length in range(10):
+ x = rng.random(length)
+ y = rng.random(length)
+ self.assertEqual(ensure_same_length(x, y), length)
+
+ def test_diff_lengths(self):
+ """ Unequal lengths are not permitted. """
+ for length1 in range(5):
+ x = rng.random(length1)
+ for length2 in range(5):
+ if length1 == length2:
+ continue
+ y = rng.random(length2)
+ self.assertRaisesRegex(ValueError,
+ "Lengths differ",
+ ensure_same_length,
+ x, y)
+
+ def test_other_dims(self):
+ """ Non-1D arrays are not valid. """
+ for length in range(5):
+ for d1 in range(4):
+ x = rng.random((length,) * d1)
+ for d2 in range(4):
+ if d1 == 1 == d2:
+ continue
+ y = rng.random((length,) * d2)
+ self.assertRaisesRegex(
+ ValueError,
+ f"{'x' if d1 != 1 else 'y'} must have 1 dimension",
+ ensure_same_length,
+ x, y, "x", "y"
+ )
+
+
+class TestGetInverse(ut.TestCase):
+
+ def test_get_inverse(self):
+ """ Invert an array with a known inverse. """
+ target = np.array([4, 7, 3, 8, 1])
+ expect = np.array([-1, 4, -1, 2, 0, -1, -1, 1, 3])
+ self.assertTrue(np.array_equal(get_inverse(target), expect))
+
+ def test_is_inverse(self):
+ """ Verify every position in the inverse of a random array. """
+ target = rng.choice(16, 8, replace=False)
+ inverse = get_inverse(target)
+ for i, inv in enumerate(inverse):
+ if inv == -1:
+ self.assertNotIn(i, target)
+ else:
+ self.assertEqual(i, target[inv])
+
+ def test_negative(self):
+ """ Negative values in the target are not permitted. """
+ target = np.array([4, 7, -3, 8, 1])
+ self.assertRaisesRegex(ValueError,
+ "test_negative has negative values",
+ get_inverse,
+ target,
+ "test_negative")
+
+ def test_repeated(self):
+ """ Repeated values in the target are not permitted. """
+ target = np.array([4, 7, 3, 8, 7, 1])
+ self.assertRaisesRegex(ValueError,
+ "test_repeated has repeated values",
+ get_inverse,
+ target,
+ "test_repeated")
+
+
+class TestContiguousMates(ut.TestCase):
+
+ def test_contiguous(self):
+ """ Contiguous mates can be found from mid5s and mid3s. """
+ mid5s = np.array([1, 1, 6, 6, 6])
+ mid3s = np.array([1, 2, 3, 4, 5])
+ expect = np.array([True, True, False, False, True])
+ self.assertTrue(np.array_equal(contiguous_mates(mid5s, mid3s), expect))
+
+ def test_unequal_lengths(self):
+ """ Unequal lengths are not permitted. """
+ mid5s = np.array([1, 1, 6, 6])
+ mid3s = np.array([1, 2, 3, 4, 5])
+ self.assertRaisesRegex(ValueError,
+ "Lengths differ",
+ contiguous_mates,
+ mid5s,
+ mid3s)
+
+
+class TestStackEndCoords(ut.TestCase):
+
+ def test_stack(self):
+ for length in range(10):
+ end5s = rng.integers(0, 10, length)
+ end3s = rng.integers(0, 10, length)
+ result = stack_end_coords(end5s, end3s)
+ self.assertIsInstance(result, np.ndarray)
+ self.assertEqual(result.shape, (length, 2))
+ self.assertTrue(np.array_equal(result[:, 0], end5s))
+ self.assertTrue(np.array_equal(result[:, 1], end3s))
+
+
+if __name__ == "__main__":
+ ut.main()
diff --git a/src/seismicrna/core/dims.py b/src/seismicrna/core/dims.py
new file mode 100644
index 00000000..421c2bae
--- /dev/null
+++ b/src/seismicrna/core/dims.py
@@ -0,0 +1,114 @@
+from typing import Iterable, Sequence
+
+import numpy as np
+
+
+def find_dims(dims: Sequence[Sequence[str | None]],
+ arrays: Sequence[np.ndarray],
+ names: Sequence[str] | None = None,
+ nonzero: Iterable[str] | bool = False):
+ """ Check the dimensions of the arrays.
+
+ Parameters
+ ----------
+
+ """
+ # Ensure that nonzero is either True or a list of str.
+ if nonzero is False:
+ nonzero = list()
+ elif nonzero is not True:
+ nonzero = list(map(str, nonzero))
+ # Verify there are the same number of arrays, dimensions, and names.
+ if (n := len(arrays)) != len(dims):
+ raise ValueError("The numbers of arrays and dimensions must equal, "
+ f"but got {n} array(s) and {len(dims)} dimension(s)")
+ if names is not None:
+ if len(names) != n:
+ raise ValueError("The numbers of arrays and names must equal, "
+ f"but got {n} array(s) and {len(names)} name(s)")
+ else:
+ names = [f"array{i}" for i in range(n)]
+ # Check the dimensions of the arrays.
+ sizes = dict()
+ for array, dim, name in zip(arrays, dims, names, strict=True):
+ if not isinstance(array, np.ndarray):
+ raise TypeError(f"Each array must be a NumPy NDArray, "
+ f"but got {type(array).__name__} for {repr(name)}")
+ # Count the named and extra dimensions for this array.
+ if len(dim) > 0 and dim[-1] is None:
+ # The last dimension is None, so subtract it from the number
+ # of named dimensions.
+ n_named = len(dim) - 1
+ # Extra dimensions in the array are allowed.
+ extras = True
+ else:
+ # All dimensions are named.
+ n_named = len(dim)
+ # Extra dimensions in the array are forbidden.
+ extras = False
+ # Verify the array has a valid number of dimensions.
+ if array.ndim != n_named:
+ if not extras:
+ raise ValueError(f"Array {repr(name)} must have {n_named} "
+ f"dimension(s), but got {array.ndim}")
+ if array.ndim < n_named:
+ raise ValueError(f"Array {repr(name)} must have ≥ {n_named} "
+ f"dimension(s), but got {array.ndim}")
+ # Check each named dimension of the array.
+ for i in range(n_named):
+ if not isinstance(dim[i], str):
+ raise TypeError("The name of each dimension must be str, "
+ f"but got {type(dim[i]).__name__}")
+ # Get the size of this dimension in the array.
+ size = array.shape[i]
+ if (other_size := sizes.get(dim[i])) is not None:
+ # A dimension of this name was already encountered.
+ if size != other_size:
+ raise ValueError("Got multiple sizes for dimension "
+ f"{repr(dim[i])}: {other_size} ≠ {size}")
+ else:
+ # This is the first time this dimension was encountered.
+ # Validate the size.
+ if not isinstance(size, int):
+ raise TypeError(f"Size of dimension {repr(dim[i])} must "
+ f"be int, but got {type(size).__name__}")
+ if nonzero is True:
+ min_size = 1
+ elif nonzero is False:
+ min_size = 0
+ else:
+ min_size = 1 if dim[i] in nonzero else 0
+ if size < min_size:
+ raise ValueError(f"Size of dimension {repr(dim[i])} must "
+ f"be ≥ {min_size}, but got {size}")
+ sizes[dim[i]] = size
+ # Check if any dimensions in nonzero were not defined.
+ if nonzero is not True:
+ for dim in nonzero:
+ if dim not in sizes:
+ raise ValueError(f"Unknown dimension for nonzero: {repr(dim)}")
+ # Return the size of each dimension.
+ return sizes
+
+
+def triangular(n: int):
+ """ The `n` th triangular number (`n` ≥ 0): number of items in an
+ equilateral triangle with `n` items on each side.
+
+ Parameters
+ ----------
+ n: int
+ Index of the triangular number to return; equivalently, the side
+ length of the equilateral triangle.
+
+ Returns
+ -------
+ int
+ The triangular number with index `n`; equivalently, the number
+ of items in the equilateral triangle of side length `n`.
+ """
+ if not isinstance(n, int):
+ raise TypeError(f"n must be int, but got {type(n).__name__}")
+ if n < 0:
+ raise ValueError(f"n must be ≥ 0, but got {n}")
+ return (n * n + n) // 2
diff --git a/src/seismicrna/core/io/brickle.py b/src/seismicrna/core/io/brickle.py
index 2864614e..fea809b6 100644
--- a/src/seismicrna/core/io/brickle.py
+++ b/src/seismicrna/core/io/brickle.py
@@ -28,7 +28,7 @@ def save_brickle(item: Any,
quality=brotli_level)
with open(file, write_mode(force, binary=True)) as f:
f.write(data)
- logger.debug(f"Wrote {item} (brotli level {brotli_level}) to {file}")
+ logger.info(f"Wrote {item} (brotli level {brotli_level}) to {file}")
checksum = digest_data(data)
logger.debug(f"Computed MD5 checksum of {file}: {checksum}")
return checksum
diff --git a/src/seismicrna/core/mu/__init__.py b/src/seismicrna/core/mu/__init__.py
index 08a72b5d..403bd186 100644
--- a/src/seismicrna/core/mu/__init__.py
+++ b/src/seismicrna/core/mu/__init__.py
@@ -1,5 +1,7 @@
-from .frame import *
from .compare import *
+from .dim import *
+from .frame import *
+from .nan import *
from .scale import *
from .unbias import *
diff --git a/src/seismicrna/core/mu/tests/unbias_test.py b/src/seismicrna/core/mu/tests/unbias_test.py
new file mode 100644
index 00000000..f7c6284b
--- /dev/null
+++ b/src/seismicrna/core/mu/tests/unbias_test.py
@@ -0,0 +1,1106 @@
+import unittest as ut
+from itertools import product
+
+import numpy as np
+
+from seismicrna.core.mu.unbias import (_clip,
+ _normalize,
+ _adjust_min_gap,
+ _triu_log,
+ _triu_sum,
+ _triu_norm,
+ _triu_dot,
+ _triu_div,
+ _triu_allclose,
+ _calc_rectangular_sum,
+ _calc_p_ends_observed,
+ _calc_p_nomut_window,
+ _calc_p_noclose_given_ends,
+ _calc_p_mut_given_span_noclose,
+ _calc_p_mut_given_span,
+ _calc_p_ends,
+ calc_p_clust,
+ calc_p_noclose,
+ calc_p_noclose_given_ends,
+ calc_p_ends_given_noclose,
+ calc_p_clust_given_noclose,
+ calc_params)
+
+rng = np.random.default_rng(seed=28)
+
+
+def no_close_muts(read: np.ndarray, min_gap: int):
+ """ Return True if the read has no two mutations separated by fewer
+ than `min_gap` non-mutated positions, otherwise False. """
+ n_pos, = read.shape
+ if min_gap <= 0 or n_pos <= 1:
+ return True
+ # Close mutations are separated from each other by less than min_gap
+ # non-mutated bits. Equivalently, the difference in their positions
+ # (their distance) is < min_gap + 1, or ≤ min_gap. These distances
+ # are computed as the differences (using np.diff) in the positions
+ # of consecutive mutations (using np.flatnonzero).
+ diffs = np.diff(np.flatnonzero(read))
+ return diffs.size == 0 or np.min(diffs) > min_gap
+
+
+def label_no_close_muts(muts: np.ndarray, min_gap: int):
+ """ Return a 1D vector that is True for every row in `muts` that
+ has no two mutations that are too close, otherwise False. """
+ n_reads, n_pos = muts.shape
+ return np.fromiter((no_close_muts(muts[i], min_gap)
+ for i in range(n_reads)),
+ dtype=bool)
+
+
+def simulate_reads(n_reads: int, p_mut: np.ndarray, p_ends: np.ndarray):
+ """ Simulate `n_reads` reads based on the mutation rates (`p_mut`)
+ and the distributions of end coordinates (`p_ends`). """
+ n_pos, = p_mut.shape
+ if p_ends.shape != (n_pos, n_pos):
+ raise ValueError(f"p_ends must have dimensions {n_pos, n_pos}, "
+ f"but got {p_ends.shape}")
+ # To sample end coordinates, first find the row and column indexes
+ # of the upper triangle of the matrix.
+ rows, cols = np.triu_indices(n_pos)
+ # Extract the end coordinate probabilities from the upper triangle.
+ p_ends_triu = p_ends[rows, cols]
+ # Sample the end coordinates with replacement.
+ end_indexes = rng.choice(p_ends_triu.size,
+ n_reads,
+ p=p_ends_triu,
+ replace=True)
+ end5s = rows[end_indexes]
+ end3s = cols[end_indexes]
+ # Make a boolean array like `muts` where each element indicates
+ # whether the read covers the position.
+ info = np.empty((n_reads, n_pos))
+ for pos in range(n_pos):
+ info[:, pos] = np.logical_and(end5s <= pos, pos <= end3s)
+ # Simulate reads as a boolean array where each row is a read, each
+ # column is a position, and each element indicates whether the read
+ # has a mutation at the position.
+ muts = np.logical_and(np.less(rng.random((n_reads, n_pos)), p_mut), info)
+ return muts, info, end5s, end3s
+
+
+def simulate_params(n_pos: int, n_cls: int, p_mut_max: float = 1.):
+ """ Return `p_mut`, `p_ends`, and `p_cls` parameters. """
+ p_mut = p_mut_max * rng.random((n_pos, n_cls))
+ p_ends = np.triu(1. - rng.random((n_pos, n_pos)))
+ p_ends /= np.sum(p_ends)
+ p_cls = 1. - rng.random(n_cls)
+ p_cls /= np.sum(p_cls)
+ return p_mut, p_ends, p_cls
+
+
+class TestCalcPEndsGivenNoClose(ut.TestCase):
+
+ def test_npos0_ncls1(self):
+ p_ends = np.ones((0, 0))
+ p_noclose_given_ends = np.ones((0, 0, 1))
+ self.assertRaisesRegex(ValueError,
+ "Size of dimension 'positions' must be ≥ 1, "
+ "but got 0",
+ calc_p_ends_given_noclose,
+ p_ends,
+ p_noclose_given_ends)
+
+ def test_npos1_ncls0(self):
+ p_ends = np.ones((1, 1))
+ p_noclose_given_ends = np.ones((1, 1, 0))
+ self.assertRaisesRegex(ValueError,
+ "Size of dimension 'clusters' must be ≥ 1, "
+ "but got 0",
+ calc_p_ends_given_noclose,
+ p_ends,
+ p_noclose_given_ends)
+
+ def test_npos1_ncls1(self):
+ p_ends = np.ones((1, 1))
+ expect = np.ones((1, 1, 1))
+ for p in [0.01, 0.1, 1.0]:
+ p_noclose_given_ends = np.full((1, 1, 1), p)
+ result = calc_p_ends_given_noclose(p_ends, p_noclose_given_ends)
+ self.assertTrue(np.array_equal(result, expect))
+
+ def test_npos2_ncls1(self):
+ p_ends = np.array([[0.2, 0.5],
+ [0.0, 0.3]])
+ p_noclose_given_ends = np.array([[[0.9], [0.6]],
+ [[0.0], [0.8]]])
+ expect = np.array([[[3. / 12.], [5. / 12.]],
+ [[0. / 12.], [4. / 12.]]])
+ result = calc_p_ends_given_noclose(p_ends, p_noclose_given_ends)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+
+class TestCalcPClustGivenNoClose(ut.TestCase):
+
+ def test_ncls1(self):
+ p_clust = np.ones((1,))
+ expect = np.ones((1,))
+ for npos in range(1, 5):
+ with self.subTest(npos=npos):
+ p_ends = np.ones((npos, npos))
+ p_noclose_given_ends = np.ones((npos, npos, 1))
+ p_noclose = calc_p_noclose(p_ends, p_noclose_given_ends)
+ result = calc_p_clust_given_noclose(p_clust, p_noclose)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+ def test_ncls2(self):
+ p_clust = np.ones((1,))
+ expect = np.ones((1,))
+ for npos in range(1, 5):
+ with self.subTest(npos=npos):
+ p_ends = np.ones((npos, npos))
+ p_noclose_given_ends = np.ones((npos, npos, 1))
+ p_noclose = calc_p_noclose(p_ends, p_noclose_given_ends)
+ result = calc_p_clust_given_noclose(p_clust, p_noclose)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+
+class TestNoCloseMuts(ut.TestCase):
+
+ def test_no_muts(self):
+ n_pos = 5
+ read = np.zeros(n_pos, dtype=bool)
+ for g in range(read.size):
+ self.assertTrue(no_close_muts(read, g))
+
+ def test_one_mut(self):
+ n_pos = 5
+ for i in range(n_pos):
+ read = np.zeros(n_pos, dtype=bool)
+ read[i] = 1
+ for g in range(read.size):
+ self.assertTrue(no_close_muts(read, g))
+
+ def test_more_muts(self):
+ mut_gaps = {
+ # 2 mutations (n = 10)
+ (0, 0, 0, 1, 1): 0,
+ (0, 0, 1, 0, 1): 1,
+ (0, 0, 1, 1, 0): 0,
+ (0, 1, 0, 0, 1): 2,
+ (0, 1, 0, 1, 0): 1,
+ (0, 1, 1, 0, 0): 0,
+ (1, 0, 0, 0, 1): 3,
+ (1, 0, 0, 1, 0): 2,
+ (1, 0, 1, 0, 0): 1,
+ (1, 1, 0, 0, 0): 0,
+ # 3 mutations (n = 10)
+ (0, 0, 1, 1, 1): 0,
+ (0, 1, 0, 1, 1): 0,
+ (0, 1, 1, 0, 1): 0,
+ (0, 1, 1, 1, 0): 0,
+ (1, 0, 0, 1, 1): 0,
+ (1, 0, 1, 0, 1): 1,
+ (1, 0, 1, 1, 0): 0,
+ (1, 1, 0, 0, 1): 0,
+ (1, 1, 0, 1, 0): 0,
+ (1, 1, 1, 0, 0): 0,
+ # 4 mutations (n = 5)
+ (0, 1, 1, 1, 1): 0,
+ (1, 0, 1, 1, 1): 0,
+ (1, 1, 0, 1, 1): 0,
+ (1, 1, 1, 0, 1): 0,
+ (1, 1, 1, 1, 0): 0,
+ # 5 mutations (n = 1)
+ (1, 1, 1, 1, 1): 0,
+ }
+ for read, mut_gap in mut_gaps.items():
+ for min_gap in range(len(read)):
+ self.assertEqual(no_close_muts(np.array(read), min_gap),
+ mut_gap >= min_gap)
+
+
+class TestClip(ut.TestCase):
+
+ def test_with_clip(self):
+ n_pos = 64
+ n_nan = 16
+ min_scale = 1
+ max_scale = 10
+ nan_indexes = rng.choice(n_pos, n_nan, replace=False)
+ for scale in range(min_scale, max_scale + 1):
+ # Generate random mutation rates, some of which may not be
+ # in the range [0, 1].
+ mus = scale * rng.random(n_pos, dtype=float) - (scale - 1) / 2.
+ # Set several values to NaN to ensure that clip can also
+ # replace missing values with 0.
+ mus[nan_indexes] = np.nan
+ # Confirm that the values are NaN.
+ self.assertEqual(np.count_nonzero(np.isnan(mus)), n_nan)
+ clipped = _clip(mus)
+ # Test that all clipped mutation rates are in [0, 1].
+ self.assertTrue(np.all(clipped >= 0.) and np.all(clipped <= 1.))
+ # Test that NaN values in mus become 0 values in clipped.
+ self.assertEqual(np.count_nonzero(clipped[nan_indexes]), 0)
+ self.assertFalse(np.any(np.isnan(clipped)))
+ self.assertTrue(np.all(np.isnan(mus[nan_indexes])))
+
+ def test_without_clip(self):
+ mus = rng.random(64, dtype=float)
+ # All values are in [0, 1] and so should not be clipped.
+ self.assertTrue(np.allclose(mus, _clip(mus)))
+
+
+class TestNormalize(ut.TestCase):
+
+ def test_sum_positive(self):
+ for ndim in range(1, 4):
+ for dims in product(range(5), repeat=ndim):
+ x = 1. - rng.random(dims)
+ result = _normalize(x)
+ self.assertEqual(result.shape, x.shape)
+ if x.size > 0:
+ self.assertTrue(np.isclose(result.sum(), 1.))
+ ratio = x / result
+ self.assertTrue(np.allclose(ratio, ratio[(0,) * ndim]))
+
+ def test_sum_zero(self):
+ for ndim in range(1, 4):
+ for dims in product(range(5), repeat=ndim):
+ x = np.zeros(dims)
+ result = _normalize(x)
+ self.assertEqual(result.shape, x.shape)
+ if x.size > 0:
+ self.assertTrue(np.isclose(result.sum(), 1.))
+ ratio = x / result
+ self.assertTrue(np.allclose(ratio, ratio[(0,) * ndim]))
+
+
+class TestTriuLog(ut.TestCase):
+
+ def compare(self, result: np.ndarray, expect: np.ndarray):
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.all(np.logical_or(np.isclose(result, expect),
+ np.isnan(expect))))
+
+ def test_2d(self):
+ a = np.array([[1., 2.],
+ [0., 3.]])
+ expect = np.array([[0., np.log(2.)],
+ [np.nan, np.log(3.)]])
+ result = _triu_log(a)
+ self.compare(result, expect)
+
+ def test_3d(self):
+ a = np.array([[[1., 4.], [2., 5.]],
+ [[0., 1.], [3., 6.]]])
+ expect = np.array([[[0., np.log(4.)], [np.log(2.), np.log(5.)]],
+ [[np.nan, np.nan], [np.log(3.), np.log(6.)]]])
+ result = _triu_log(a)
+ self.compare(result, expect)
+
+
+class TestTriuAllClose(ut.TestCase):
+
+ def test_equal(self):
+ for npos in range(4):
+ for extra in range(3):
+ for extras in product(range(4), repeat=extra):
+ dims = (npos, npos) + extras
+ a = rng.random(dims)
+ self.assertTrue(_triu_allclose(a, a.copy()))
+
+ def test_triu(self):
+ for npos in range(2, 4):
+ a = rng.random((npos, npos))
+ self.assertTrue(_triu_allclose(a, np.triu(a)))
+
+ def test_tril(self):
+ for npos in range(2, 4):
+ a = rng.random((npos, npos))
+ self.assertFalse(_triu_allclose(a, np.tril(a)))
+
+
+class TestTriuDot(ut.TestCase):
+
+ def test_1x1(self):
+ a = np.array([[2.]])
+ b = np.array([[4.]])
+ expect = np.array(8.)
+ self.assertTrue(np.array_equal(_triu_dot(a, b), expect))
+
+ def test_1x1x1(self):
+ a = np.array([[[2.]]])
+ b = np.array([[[4.]]])
+ expect = np.array([8.])
+ self.assertTrue(np.array_equal(_triu_dot(a, b), expect))
+
+ def test_2x2(self):
+ a = np.array([[2., 3.],
+ [5., 7.]])
+ b = np.array([[4., 8.],
+ [16., 32.]])
+ expect = np.array(256.)
+ self.assertTrue(np.array_equal(_triu_dot(a, b), expect))
+
+ def test_2x2x2(self):
+ a = np.array([[[2., 20.], [3., 30.]],
+ [[5., 50.], [7., 70.]]])
+ b = np.array([[[4., 40.], [8., 80.]],
+ [[16., 160.], [32., 320.]]])
+ expect = np.array([256., 25600.])
+ self.assertTrue(np.array_equal(_triu_dot(a, b), expect))
+
+
+class TestTriuDiv(ut.TestCase):
+
+ def test_1x1(self):
+ n = rng.random()
+ d = 1. - rng.random()
+ expect = np.array([[n / d]])
+ self.assertTrue(np.array_equal(_triu_div(np.array([[n]]),
+ np.array([[d]])),
+ expect))
+
+ def test_1x1x1(self):
+ n = rng.random()
+ d = 1. - rng.random()
+ expect = np.array([[[n / d]]])
+ self.assertTrue(np.array_equal(_triu_div(np.array([[[n]]]),
+ np.array([[[d]]])),
+ expect))
+
+ def test_2x2(self):
+ numer = np.array([[12., 3.],
+ [20., 56.]])
+ denom = np.array([[2., 3.],
+ [5., 7.]])
+ expect = np.array([[6., 1.],
+ [np.nan, 8.]])
+ self.assertTrue(_triu_allclose(_triu_div(numer, denom), expect))
+
+ def test_2x2x2(self):
+ numer = np.array([[[2., 20.], [2., 36.]],
+ [[3., 7.], [12., 40.]]])
+ denom = np.array([[[1., 5.], [2., 6.]],
+ [[3., 7.], [4., 8.]]])
+ expect = np.array([[[2., 4.], [1., 6.]],
+ [[np.nan, np.nan], [3., 5.]]])
+ self.assertTrue(_triu_allclose(_triu_div(numer, denom), expect))
+
+
+class TestTriuSum(ut.TestCase):
+
+ def test_all_zero(self):
+ for ndim in range(2, 6):
+ array = rng.random((0,) * ndim)
+ expect = np.zeros((0,) * (ndim - 2))
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_1x1(self):
+ x = rng.random()
+ array = np.array([[x]])
+ expect = np.array(x)
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_1x1x1(self):
+ x = rng.random()
+ array = np.array([[[x]]])
+ expect = np.array([x])
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_1x1x2(self):
+ x = rng.random()
+ y = rng.random()
+ array = np.array([[[x, y]]])
+ expect = np.array([x, y])
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_2x2(self):
+ array = np.array([[1., 2.],
+ [3., 4.]])
+ expect = np.array(7.)
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_2x2x1(self):
+ array = np.array([[[1.], [2.]],
+ [[3.], [4.]]])
+ expect = np.array([7.])
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_2x2x2(self):
+ array = np.array([[[1., 5.], [2., 6.]],
+ [[3., 7.], [4., 8.]]])
+ expect = np.array([7., 19.])
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+ def test_2x2x2x2(self):
+ array = np.array([[[[1., 5.],
+ [9., 13.]], [[2., 6.],
+ [10., 14.]]],
+ [[[3., 7.],
+ [11., 15.]], [[4., 8.],
+ [12., 16.]]]])
+ expect = np.array([[7., 19.],
+ [31., 43.]])
+ self.assertTrue(np.array_equal(_triu_sum(array), expect))
+
+
+class TestTriuNorm(ut.TestCase):
+
+ def test_1x1(self):
+ array = rng.random((1, 1))
+ expect = np.ones_like(array)
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_1x1x1(self):
+ array = rng.random((1, 1, 1))
+ expect = np.ones_like(array)
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_1x1x2(self):
+ array = rng.random((1, 1, 2))
+ expect = np.ones_like(array)
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_2x2(self):
+ array = np.array([[1., 2.],
+ [3., 4.]])
+ expect = np.array([[1. / 7., 2. / 7.],
+ [3. / 7., 4. / 7.]])
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_2x2x1(self):
+ array = np.array([[[1.], [2.]],
+ [[3.], [4.]]])
+ expect = np.array([[[1. / 7.], [2. / 7.]],
+ [[3. / 7.], [4. / 7.]]])
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_2x2x2(self):
+ array = np.array([[[1., 5.], [2., 6.]],
+ [[3., 7.], [4., 8.]]])
+ expect = np.array([[[1. / 7., 5. / 19.], [2. / 7., 6. / 19.]],
+ [[3. / 7., 7. / 19.], [4. / 7., 8. / 19.]]])
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+ def test_2x2x2x2(self):
+ array = np.array([[[[1., 5.],
+ [9., 13.]], [[2., 6.],
+ [10., 14.]]],
+ [[[3., 7.],
+ [11., 15.]], [[4., 8.],
+ [12., 16.]]]])
+ expect = np.array([[[[1. / 7., 5. / 19.],
+ [9. / 31., 13. / 43]], [[2. / 7., 6. / 19.],
+ [10. / 31, 14. / 43]]],
+ [[[3. / 7., 7. / 19.],
+ [11. / 31, 15. / 43]], [[4. / 7., 8. / 19.],
+ [12. / 31, 16. / 43]]]])
+ self.assertTrue(np.array_equal(_triu_norm(array), expect))
+
+
+class TestAdjustMinGap(ut.TestCase):
+
+ def test_zero_le_gap_lt_npos(self):
+ for npos in range(10):
+ for gap in range(npos):
+ with self.subTest(npos=npos, gap=gap):
+ self.assertEqual(_adjust_min_gap(npos, gap), gap)
+
+ def test_zero_lt_npos_le_gap(self):
+ for gap in range(10):
+ for npos in range(1, gap + 1):
+ with self.subTest(npos=npos, gap=gap):
+ self.assertEqual(_adjust_min_gap(npos, gap), npos - 1)
+
+ def test_npos_le_zero_le_gap(self):
+ for npos in range(-4, 1):
+ for gap in range(5):
+ with self.subTest(npos=npos, gap=gap):
+ self.assertEqual(_adjust_min_gap(npos, gap), 0)
+
+ def test_gap_le_zero_le_npos(self):
+ for npos in range(5):
+ for gap in range(-4, 1):
+ with self.subTest(npos=npos, gap=gap):
+ self.assertEqual(_adjust_min_gap(npos, gap), 0)
+
+
+class TestPrivateCalcPNoCloseGivenEnds(ut.TestCase):
+ """ Test _calc_p_nomut_window and _calc_p_noclose_given_ends. """
+
+ def test_min_gap_0(self):
+ for npos in range(10):
+ with self.subTest(npos=npos):
+ mu = rng.random((npos, 1))
+ nm = _calc_p_nomut_window(mu, 0)
+ nm_expect = np.ones((1, npos + 1, 1))
+ self.assertTrue(np.array_equal(nm, nm_expect))
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.ones((npos, npos, 1))
+ self.assertTrue(np.array_equal(nc, nc_expect))
+
+ def test_length_0(self):
+ mu = np.zeros((0, 1))
+ for min_gap in range(4):
+ with self.subTest(min_gap=min_gap):
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.ones((1, 1, 1))
+ self.assertTrue(np.array_equal(nm, nm_expect))
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.ones((0, 0, 1))
+ self.assertTrue(np.array_equal(nc, nc_expect))
+
+ def test_length_1(self):
+ for x in [0., 0.01, 0.1, 1.]:
+ mu = np.array([[x]])
+ for min_gap in range(4):
+ with self.subTest(x=x, min_gap=min_gap):
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.ones((1, 2, 1))
+ self.assertTrue(np.array_equal(nm, nm_expect))
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.ones((1, 1, 1))
+ self.assertTrue(np.array_equal(nc, nc_expect))
+
+ def _check_1_cluster(self, x, x_expect):
+ self.assertEqual(x.shape, x_expect.shape)
+ self.assertTrue(np.all(np.logical_or(np.isclose(x, x_expect),
+ np.isnan(x_expect))))
+
+ def test_length_2_min_gap_1(self):
+ mu = np.array([[0.1, 0.2]]).reshape((2, 1))
+ min_gap = 1
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1.],
+ [np.nan, 0.9, 0.8],
+ ]).reshape((2, 3, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98],
+ [np.nan, 1.],
+ ]).reshape((2, 2, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_length_3_min_gap_1(self):
+ mu = np.array([[0.1, 0.2, 0.3]]).reshape((3, 1))
+ min_gap = 1
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1., 1.],
+ [np.nan, 0.9, 0.8, 0.7],
+ ]).reshape((2, 4, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98, 0.926],
+ [1., 1., 0.94],
+ [np.nan, 1., 1.],
+ ]).reshape((3, 3, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_length_3_min_gap_2(self):
+ mu = np.array([[0.1, 0.2, 0.3]]).reshape((3, 1))
+ min_gap = 2
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1., 1.],
+ [np.nan, 0.9, 0.8, 0.7],
+ [np.nan, np.nan, 0.72, 0.56],
+ ]).reshape((3, 4, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98, 0.902],
+ [1., 1., 0.94],
+ [1., 1., 1.],
+ ]).reshape((3, 3, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_length_4_min_gap_1(self):
+ mu = np.array([[0.1, 0.2, 0.3, 0.4]]).reshape((4, 1))
+ min_gap = 1
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1., 1., 1.],
+ [np.nan, 0.9, 0.8, 0.7, 0.6],
+ ]).reshape((2, 5, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98, 0.926, 0.83],
+ [1., 1., 0.94, 0.844],
+ [np.nan, 1., 1., 0.88],
+ [np.nan, np.nan, 1., 1.],
+ ]).reshape((4, 4, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_length_4_min_gap_2(self):
+ mu = np.array([[0.1, 0.2, 0.3, 0.4]]).reshape((4, 1))
+ min_gap = 2
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1., 1., 1.],
+ [np.nan, 0.9, 0.8, 0.7, 0.6],
+ [np.nan, np.nan, 0.72, 0.56, 0.42],
+ ]).reshape((3, 5, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98, 0.902, 0.7652],
+ [1., 1., 0.94, 0.788],
+ [1., 1., 1., 0.88],
+ [np.nan, 1., 1., 1.],
+ ]).reshape((4, 4, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_length_4_min_gap_3(self):
+ mu = np.array([[0.1, 0.2, 0.3, 0.4]]).reshape((4, 1))
+ min_gap = 3
+ nm = _calc_p_nomut_window(mu, min_gap)
+ nm_expect = np.array([
+ [1., 1., 1., 1., 1.],
+ [np.nan, 0.9, 0.8, 0.7, 0.6],
+ [np.nan, np.nan, 0.72, 0.56, 0.42],
+ [np.nan, np.nan, np.nan, 0.504, 0.336],
+ ]).reshape((4, 5, 1))
+ self._check_1_cluster(nm, nm_expect)
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ nc_expect = np.array([
+ [1., 0.98, 0.902, 0.7428],
+ [1., 1., 0.94, 0.788],
+ [1., 1., 1., 0.88],
+ [1., 1., 1., 1.],
+ ]).reshape((4, 4, 1))
+ self._check_1_cluster(nc, nc_expect)
+
+ def test_clusters(self):
+ for ncls in range(4):
+ for npos in range(5):
+ for min_gap in range(npos):
+ with self.subTest(npos=npos, ncls=ncls, min_gap=min_gap):
+ mu = rng.random((npos, ncls))
+ nm = _calc_p_nomut_window(mu, min_gap)
+ self.assertEqual(nm.shape, (min_gap + 1, npos + 1, ncls))
+ nc = _calc_p_noclose_given_ends(mu, nm)
+ self.assertEqual(nc.shape, (npos, npos, ncls))
+ for k in range(ncls):
+ mu_k = mu[:, k].reshape((npos, 1))
+ nm_k = _calc_p_nomut_window(mu_k, min_gap)
+ self.assertEqual(nm_k.shape,
+ (min_gap + 1, npos + 1, 1))
+ self.assertTrue(np.allclose(np.triu(nm[:, :, k]),
+ np.triu(nm_k[:, :, 0])))
+ nc_k = _calc_p_noclose_given_ends(mu_k, nm_k)
+ self.assertEqual(nc_k.shape,
+ (npos, npos, 1))
+ self.assertTrue(np.allclose(np.triu(nc[:, :, k]),
+ np.triu(nc_k[:, :, 0])))
+
+
+class TestPublicCalcPNoCloseGivenEnds(ut.TestCase):
+
+ def test_1_dim(self):
+ max_n = 5
+ max_g = 4
+ for n_pos in range(max_n + 1):
+ for gap in range(max_g + 1):
+ p_noclose_given_ends = calc_p_noclose_given_ends(
+ rng.random(n_pos), gap
+ )
+ self.assertIsInstance(p_noclose_given_ends, np.ndarray)
+ self.assertEqual(p_noclose_given_ends.shape, (n_pos, n_pos))
+
+ def test_2_dim(self):
+ max_n = 5
+ max_c = 5
+ max_g = 4
+ for n_pos in range(max_n + 1):
+ for n_clust in range(max_c + 1):
+ for gap in range(max_g + 1):
+ p_noclose_given_ends = calc_p_noclose_given_ends(
+ rng.random((n_pos, n_clust)), gap
+ )
+ self.assertIsInstance(p_noclose_given_ends, np.ndarray)
+ self.assertEqual(p_noclose_given_ends.shape,
+ (n_pos, n_pos, n_clust))
+
+ def test_invalid_dim(self):
+ for n_dim in range(5):
+ if n_dim == 1 or n_dim == 2:
+ # Skip the dimensions that are valid.
+ continue
+ err_msg = ("p_mut_given_span must have 1 or 2 dimensions, "
+ f"but got {n_dim}")
+ for size in range(5):
+ dims = (size,) * n_dim
+ for gap in range(5):
+ self.assertRaisesRegex(ValueError,
+ err_msg,
+ calc_p_noclose_given_ends,
+ rng.random(dims),
+ gap)
+
+
+class CalcRectangularSum(ut.TestCase):
+
+ @staticmethod
+ def calc_spanning_sum_slow(array: np.ndarray):
+ spanning_sum = np.empty(array.shape[1:])
+ for j in range(array.shape[0]):
+ spanning_sum[j] = np.sum(array[:(j + 1), j:], axis=(0, 1))
+ return spanning_sum
+
+ def test_2d(self):
+ for n in range(5):
+ with self.subTest(n=n):
+ array = rng.random((n, n))
+ fast_sum = _calc_rectangular_sum(array)
+ slow_sum = self.calc_spanning_sum_slow(array)
+ self.assertEqual(fast_sum.shape, (n,))
+ self.assertEqual(slow_sum.shape, (n,))
+ self.assertTrue(np.allclose(fast_sum, slow_sum))
+
+ def test_3d(self):
+ for n in range(5):
+ for k in range(3):
+ with self.subTest(n=n, k=k):
+ array = rng.random((n, n, k))
+ fast_sum = _calc_rectangular_sum(array)
+ slow_sum = self.calc_spanning_sum_slow(array)
+ self.assertEqual(fast_sum.shape, (n, k))
+ self.assertEqual(slow_sum.shape, (n, k))
+ self.assertTrue(np.allclose(fast_sum, slow_sum))
+
+
+class TestCalcPMutGivenSpanNoClose(ut.TestCase):
+
+ def test_simulated(self):
+ from scipy.stats import binom
+ confidence = 0.999
+ # Simulate reads.
+ n_pos = 6
+ n_reads = 1_000_000
+ p_mut_max = 0.5
+ p_mut, p_ends, p_cls = simulate_params(n_pos, 1, p_mut_max)
+ muts, info, end5s, end3s = simulate_reads(n_reads, p_mut[:, 0], p_ends)
+ # Test each minimum gap between mutations (min_gap).
+ for min_gap in [0, 3, n_pos]:
+ with self.subTest(min_gap=min_gap):
+ # Determine which reads have no two mutations too close.
+ has_no_close = label_no_close_muts(muts, min_gap)
+ # Calculate the theoretical probability of no mutations
+ # in each window.
+ p_nomut_window_theory = _calc_p_nomut_window(p_mut, min_gap)
+ # Calculate the theoretical probability of no mutations
+ # being too close for each pair of end coordinates.
+ p_noclose_given_ends_theory = _calc_p_noclose_given_ends(
+ p_mut,
+ p_nomut_window_theory
+ )
+ # Compare the simulated probability of no mutations
+ # being too close for each pair of end coordinates.
+ for end5 in range(n_pos):
+ for end3 in range(end5, n_pos):
+ if end5 == end3:
+ # The read must have no close mutations.
+ self.assertEqual(
+ p_noclose_given_ends_theory[end5, end3, 0],
+ 1.
+ )
+ else:
+ # Count the reads with those coordinates.
+ end53s = np.logical_and(end5s == end5,
+ end3s == end3)
+ # Find the fraction of simualted reads with
+ # those coordinates without close mutations.
+ p_noclose_given_ends_simulated = (
+ np.sum(np.logical_and(end53s, has_no_close))
+ / np.sum(end53s)
+ )
+ # Compute the confidence interval for the
+ # proportion of reads.
+ n_expect = round(n_reads * p_ends[end5, end3])
+ p_expect = p_noclose_given_ends_theory[
+ end5, end3, 0
+ ]
+ inter_lo, inter_up = binom.interval(confidence,
+ n_expect,
+ p_expect)
+ # Ensure the interval based on theoretical
+ # probability agrees with the simulation.
+ self.assertGreaterEqual(
+ p_noclose_given_ends_simulated,
+ inter_lo / n_expect
+ )
+ self.assertLessEqual(
+ p_noclose_given_ends_simulated,
+ inter_up / n_expect
+ )
+ # Compute the theoretical proportion of reads aligning
+ # to each pair of 5' and 3' coordinates.
+ p_ends_given_noclose_theory = calc_p_ends_given_noclose(
+ p_ends,
+ p_noclose_given_ends_theory
+ ).reshape((n_pos, n_pos))
+ # Compare to the simulated proportion of reads aligning
+ # to each pair of coordinates.
+ p_noclose = calc_p_noclose(p_ends, p_noclose_given_ends_theory)
+ n_expect = np.round(p_ends_given_noclose_theory
+ * (p_noclose * n_reads))
+ inter_lo, inter_up = binom.interval(confidence,
+ n_expect,
+ p_ends_given_noclose_theory)
+ inter_lo = _triu_div(inter_lo, n_expect)
+ inter_up = _triu_div(inter_up, n_expect)
+ end5s_noclose = end5s[has_no_close]
+ end3s_noclose = end3s[has_no_close]
+ for end5 in range(n_pos):
+ for end3 in range(end5, n_pos):
+ p_ends_given_noclose_simulated = np.mean(np.logical_and(
+ end5s_noclose == end5,
+ end3s_noclose == end3
+ ))
+ self.assertGreaterEqual(p_ends_given_noclose_simulated,
+ inter_lo[end5, end3])
+ self.assertLessEqual(p_ends_given_noclose_simulated,
+ inter_up[end5, end3])
+ # Compute the expected coverage at each position.
+ n_expect = np.zeros(n_pos, dtype=int)
+ for end5 in range(n_pos):
+ for end3 in range(end5, n_pos):
+ n_expect[end5: end3 + 1] += round(n_reads
+ * p_ends[end5, end3])
+ # Calculate the theoretical probability of a mutation at
+ # each position given no mutations are too close.
+ p_mut_given_noclose_theory = _calc_p_mut_given_span_noclose(
+ p_mut,
+ p_ends,
+ p_noclose_given_ends_theory,
+ p_nomut_window_theory
+ ).reshape(n_pos)
+ # Compare the simulated probabilities of mutations given
+ # no mutations are too close.
+ p_mut_given_noclose_simulated = (np.sum(muts[has_no_close], axis=0)
+ /
+ np.sum(info[has_no_close], axis=0))
+ inter_lo, inter_up = binom.interval(confidence,
+ n_expect,
+ p_mut_given_noclose_theory)
+ self.assertTrue(np.all(p_mut_given_noclose_simulated
+ >= inter_lo / n_expect))
+ self.assertTrue(np.all(p_mut_given_noclose_simulated
+ <= inter_up / n_expect))
+
+ def test_clusters(self):
+ n_pos = 16
+ max_clusters = 3
+ max_gap = 3
+ # Test each number of clusters.
+ for n_cls in range(1, max_clusters + 1):
+ p_mut, p_ends, p_cls = simulate_params(n_pos, n_cls)
+ # Test each minimum gap between mutations.
+ for min_gap in range(max_gap + 1):
+ with self.subTest(n_cls=n_cls, min_gap=min_gap):
+ # Compute the mutation rates with no two mutations
+ # too close for all clusters simultaneously.
+ p_nomut_window = _calc_p_nomut_window(p_mut, min_gap)
+ p_noclose_given_ends = _calc_p_noclose_given_ends(
+ p_mut, p_nomut_window
+ )
+ p_mut_given_span_noclose = _calc_p_mut_given_span_noclose(
+ p_mut, p_ends, p_noclose_given_ends, p_nomut_window
+ )
+ # Compare to computing each cluster individually.
+ for k in range(n_cls):
+ self.assertTrue(np.allclose(
+ p_mut_given_span_noclose[:, k],
+ _calc_p_mut_given_span_noclose(
+ p_mut[:, [k]],
+ p_ends,
+ p_noclose_given_ends[:, :, [k]],
+ p_nomut_window[:, :, [k]],
+ ).reshape(n_pos)
+ ))
+
+
+class TestCalcPMutGivenSpan(ut.TestCase):
+
+ def test_invert(self):
+ """ Test the inverse of `_calc_p_mut_given_span_noclose`. """
+ n_pos = 16
+ max_p_mut = 0.5
+ max_clusters = 3
+ max_gap = 3
+ for n_cls in range(1, max_clusters):
+ p_mut, p_ends, p_cls = simulate_params(n_pos, n_cls, max_p_mut)
+ for min_gap in range(max_gap + 1):
+ # Compute the mutation rates without mutations too close.
+ p_nomut_window = _calc_p_nomut_window(p_mut, min_gap)
+ p_noclose_given_ends = _calc_p_noclose_given_ends(
+ p_mut, p_nomut_window
+ )
+ p_mut_given_span_noclose = _calc_p_mut_given_span_noclose(
+ p_mut, p_ends, p_noclose_given_ends, p_nomut_window
+ )
+ p_mut_given_span = _calc_p_mut_given_span(
+ p_mut_given_span_noclose,
+ min_gap,
+ p_ends,
+ p_mut_given_span_noclose,
+ )
+ self.assertEqual(p_mut_given_span.shape, p_mut.shape)
+ self.assertTrue(np.allclose(p_mut_given_span,
+ p_mut,
+ atol=1.e-4,
+ rtol=1.e-3))
+
+
+class TestCalcPEnds(ut.TestCase):
+
+ def test_invert(self):
+ """ Test the inverse of `calc_p_ends_given_noclose`. """
+ n_pos = 16
+ max_p_mut = 0.5
+ max_clusters = 3
+ max_gap = 3
+ for n_cls in range(1, max_clusters):
+ p_mut, p_ends, p_cls = simulate_params(n_pos, n_cls, max_p_mut)
+ for min_gap in range(max_gap + 1):
+ # Compute the coordinate distributions without mutations
+ # too close.
+ p_noclose_given_ends = _calc_p_noclose_given_ends(
+ p_mut, _calc_p_nomut_window(p_mut, min_gap)
+ )
+ p_ends_given_noclose = calc_p_ends_given_noclose(
+ p_ends, p_noclose_given_ends
+ )
+ # Infer the original distribution of all reads.
+ p_ends_inferred = _calc_p_ends(p_ends_given_noclose,
+ p_noclose_given_ends,
+ p_mut,
+ p_cls)
+ self.assertEqual(p_ends_inferred.shape, p_ends.shape)
+ self.assertTrue(_triu_allclose(p_ends_inferred, p_ends))
+
+
+class TestCalcPNoClose(ut.TestCase):
+
+ def test_p_noclose(self):
+ p_ends = np.array([[0.2, 0.5],
+ [0.4, 0.3]])
+ p_noclose_given_ends = np.array([[[0.2, 0.4], [0.1, 0.2]],
+ [[0.3, 0.6], [0.4, 0.8]]])
+ expect = np.array([0.21, 0.42])
+ result = calc_p_noclose(p_ends, p_noclose_given_ends)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+
+class TestCalcPClust(ut.TestCase):
+
+ def test_p_clust(self):
+ p_clust_given_observed = np.array([0.2, 0.5, 0.3])
+ p_noclose = np.array([0.8, 0.4, 0.5])
+ expect = np.array([0.25, 1.25, 0.60]) / 2.1
+ result = calc_p_clust(p_clust_given_observed, p_noclose)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+
+class TestCalcPEndsObserved(ut.TestCase):
+
+ def test_calc_p_ends_given_observed(self):
+ npos = 3
+ end5s = np.array([2, 0, 0, 1, 1, 2, 0, 0])
+ end3s = np.array([2, 1, 2, 2, 1, 2, 0, 1])
+ weights = np.array([[0.1, 0.2],
+ [0.2, 0.3],
+ [0.3, 0.4],
+ [0.4, 0.5],
+ [0.5, 0.6],
+ [0.6, 0.7],
+ [0.7, 0.8],
+ [0.8, 0.9]])
+ expect = np.array([[[0.7, 0.8], [1.0, 1.2], [0.3, 0.4]],
+ [[0.0, 0.0], [0.5, 0.6], [0.4, 0.5]],
+ [[0.0, 0.0], [0.0, 0.0], [0.7, 0.9]]])
+ result = _calc_p_ends_observed(npos, end5s, end3s, weights)
+ self.assertEqual(result.shape, expect.shape)
+ self.assertTrue(np.allclose(result, expect))
+
+
+class TestCalcParams(ut.TestCase):
+
+ def test_infer(self):
+ n_pos = 16
+ max_p_mut = 0.5
+ max_clusters = 3
+ max_gap = 3
+ for n_cls in range(1, max_clusters):
+ p_mut, p_ends, p_cls = simulate_params(n_pos, n_cls, max_p_mut)
+ for min_gap in range(max_gap + 1):
+ # Compute the mutation rates and distributions of end
+ # coordinates without mutations too close.
+ p_nomut_window = _calc_p_nomut_window(p_mut, min_gap)
+ p_noclose_given_ends = _calc_p_noclose_given_ends(
+ p_mut, p_nomut_window
+ )
+ p_noclose = calc_p_noclose(p_ends, p_noclose_given_ends)
+ p_mut_given_span_noclose = _calc_p_mut_given_span_noclose(
+ p_mut, p_ends, p_noclose_given_ends, p_nomut_window
+ )
+ p_ends_given_noclose = calc_p_ends_given_noclose(
+ p_ends, p_noclose_given_ends
+ )
+ p_clust_given_noclose = calc_p_clust_given_noclose(
+ p_cls, p_noclose
+ )
+ # Infer the original parameters using those of the reads
+ # without mutations too close.
+ (p_mut_inferred,
+ p_ends_inferred,
+ p_cls_inferred) = calc_params(
+ p_mut_given_span_noclose,
+ p_ends_given_noclose,
+ p_clust_given_noclose,
+ min_gap,
+ )
+ self.assertEqual(p_mut_inferred.shape, p_mut.shape)
+ self.assertTrue(np.allclose(p_mut_inferred,
+ p_mut,
+ atol=1.e-4,
+ rtol=1.e-2))
+ self.assertEqual(p_ends_inferred.shape, p_ends.shape)
+ self.assertTrue(_triu_allclose(p_ends_inferred, p_ends))
+ self.assertEqual(p_cls_inferred.shape, p_cls.shape)
+ self.assertTrue(np.allclose(p_cls_inferred,
+ p_cls,
+ atol=1.e-3,
+ rtol=1.e-2))
+
+
+if __name__ == "__main__":
+ ut.main()
+
+########################################################################
+# #
+# © Copyright 2024, the Rouskin Lab. #
+# #
+# This file is part of SEISMIC-RNA. #
+# #
+# SEISMIC-RNA is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# SEISMIC-RNA is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
+# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
+# Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with SEISMIC-RNA; if not, see . #
+# #
+########################################################################
diff --git a/src/seismicrna/core/mu/unbias.py b/src/seismicrna/core/mu/unbias.py
new file mode 100644
index 00000000..bdc2502b
--- /dev/null
+++ b/src/seismicrna/core/mu/unbias.py
@@ -0,0 +1,1286 @@
+"""
+
+Mutation Rate Core Module
+
+========================================================================
+
+The functions in this module serve two main purposes:
+ 1. Adjust mutation rates to correct for observer bias.
+ 2. Normalize and winsorize mutation rates
+
+------------------------------------------------------------------------
+
+Adjust mutation rates to correct for observer bias
+
+Our lab has found that pairs of mutations in DMS-MaPseq data rarely have
+fewer than three non-mutated bases separating them. We suspect that the
+reverse transcriptase is prone to falling off or stalling at locations
+in the RNA where DMS has methylated bases that are too close.
+
+Regardless of the reason, mutations on nearby bases are not independent,
+which violates a core assumption of the Bernoulli mixture model that we
+use in the expectation-maximization clustering algorithm. Namely, that
+mutations occur independently of each other, such that the likelihood of
+observing a bit vector is the product of the mutation rate of each base
+that is mutated and one minus the mutation rate ("non-mutation rate") of
+each base that is not mutated.
+
+In order to use the Bernoulli mixture model for expectation-maximization
+clustering, we modify it such that bases separated by zero, one, or two
+other bases are no longer assumed to mutate independently. Specifically,
+since pairs of close mutations are rare, we add the assumption that no
+mutations separated by fewer than three non-mutated bases may occur, and
+exclude the few bit vectors that have such close mutations.
+
+When these bit vectors are assumed to exist in the original population
+of RNA molecules but not appear in the observed data, the mutation rates
+that are observed will differ from the real, underlying mutation rates,
+which would include the unobserved bit vectors. The real mutation rates
+must therefore be estimated from the observed mutation rates.
+
+It is relatively easy to estimate the observed mutation rates given the
+real mutation rates, but there is no closed-form solution that we know
+of to estimate the real mutation rates from the observed mutation rates.
+Thus, we use an iterative approach, based on Newton's method for finding
+the roots of functions. We initially guess the real mutation rates. Each
+iteration, we estimate the mutation rates that would have been observed
+given our current guess of the real mutation rates, and then subtract
+the mutation rates that were actually observed. This difference would be
+zero if we had accurately guessed the real mutation rates. Thus, we use
+Newton's method to solve for the real mutation rates that minimize this
+difference. The details are described in the comments of this module and
+in Tomezsko et al. (2020) (https://doi.org/10.1038/s41586-020-2253-5).
+
+------------------------------------------------------------------------
+
+Normalize and winsorize mutation rates
+
+The mutation rates of an RNA may vary among different samples because of
+variations in the chemical probing and mutational profiling procedure.
+Thus, it is often helpful to compute "normalized" mutation rates that
+can be compared directly across different samples and used to predict
+secondary structures.
+
+This module currently provides a simple method for normalizing mutation
+rates. First, a specific quantile of the dataset is chosen, such as 0.95
+(i.e. the 95th percentile). The mutation rate with this quantile is set
+to 1.0, and all other mutation rates are scaled linearly.
+
+If the chosen quantile is less than 1.0, then any mutation rates above
+the quantile will be scaled to values greater than 1.0. Since these high
+mutation rates may be exceptionally reactive bases, it is often helpful
+to cap the normalized mutation rates to a maximum of 1.0. The winsorize
+function in this module performs normalization and then sets any value
+greater than 1.0 to 1.0.
+
+"""
+
+import warnings
+from logging import getLogger
+from typing import Iterable
+
+import numpy as np
+from numba import jit, NumbaPerformanceWarning
+
+from ..dims import find_dims
+
+logger = getLogger(__name__)
+
+# Disable performance warnings from Numba.
+warnings.filterwarnings("ignore", category=NumbaPerformanceWarning)
+
+# Define dimensions
+READS = "reads"
+POSITIONS = "positions"
+CLUSTERS = "clusters"
+
+
+@jit()
+def _clip(x: np.ndarray):
+ """ Fill NaN with 0, infinity with 1, and restrict all values to the
+ interval [0, 1].
+
+ Parameters
+ ----------
+ x: np.ndarray
+ Values to fill and clip.
+
+ Returns
+ -------
+ np.ndarray
+ Array of the same shape as `x` with all values ≥ 0 and ≤ 1.
+ """
+ return np.clip(np.nan_to_num(x), 0., 1.)
+
+
+@jit()
+def _normalize(x: np.ndarray):
+ """ Normalize the values to sum to 1, or if they sum to 0, then
+ return an array with the same value for each element. """
+ x_sum = np.sum(x)
+ if x_sum == 0.:
+ if x.size == 0:
+ # Handle the edge case of size zero, which would raise a
+ # ZeroDivisionError if handled in the next branch.
+ return np.ones_like(x)
+ # If the sum of the input array is 0 and the array has at least
+ # 1 element, then return an array of the same size as the input
+ # where all elements are equal and sum to 1.
+ return np.full_like(x, 1. / x.size)
+ # Divide each element by the sum of all elements so the resulting
+ # array has the same size as the input and all elements sum to 1.
+ return x / x_sum
+
+
+@jit()
+def _triu_log(a: np.ndarray):
+ """ Calculate the logarithm of the upper triangle(s) of array `a`.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `a` has at least 2 dimensions.
+ - The first two dimensions of `a` have equal length.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array of whose upper triangle to compute the logarithm.
+
+ Returns
+ -------
+ np.ndarray
+ Logarithm of the upper triangle(s) of `a`.
+ """
+ log = np.empty_like(a)
+ for j in range(a.shape[0]):
+ log[j, j:] = np.log(a[j, j:])
+ return log
+
+
+def triu_log(a: np.ndarray):
+ """ Calculate the logarithm of the upper triangle(s) of array `a`.
+ In the result, elements below the main diagonal are undefined.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array (≥ 2 dimensions) of whose upper triangle to compute the
+ logarithm; the first 2 dimensions must have equal lengths.
+
+ Returns
+ -------
+ np.ndarray
+ Logarithm of the upper triangle(s) of `a`.
+ """
+ if a.ndim < 2:
+ raise ValueError(f"a must have ≥ 2 dimensions, but got {a.ndim}")
+ npos = a.shape[0]
+ if a.shape[:2] != (npos, npos):
+ raise ValueError("The first 2 dimensions of a must have equal lengths, "
+ f"but got dimensions {a.shape}")
+ return _triu_log(a)
+
+
+@jit()
+def _triu_sum(a: np.ndarray):
+ """ Calculate the sum over the upper triangle(s) of array `a`.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `a` has at least 2 dimensions.
+ - The first two dimensions of `a` have equal length.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array whose upper triangle to sum.
+
+ Returns
+ -------
+ np.ndarray
+ Sum of the upper triangle(s), with the same shape as the third
+ and subsequent dimensions of `a`.
+ """
+ sums = np.zeros(a.shape[2:])
+ # Sum over axes 0 and 1.
+ for j in range(a.shape[0]):
+ sums += a[j, j:].sum(axis=0)
+ return sums
+
+
+@jit()
+def _triu_norm(a: np.ndarray):
+ """ Normalize the upper triangle of array `a` to sum to 1.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `a` has at least 2 dimensions.
+ - The first two dimensions of `a` have equal length.
+ - The elements of the upper triangle of `a` do not sum to 0.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array to normalize.
+
+ Returns
+ -------
+ np.ndarray
+ Array of the same shape as `a` but scaled so that the
+ """
+ # Divide by the sum over axes 0 and 1.
+ return a / _triu_sum(a)
+
+
+@jit()
+def _triu_div(numer: np.ndarray, denom: np.ndarray):
+ """ Divide the upper triangles of `numer` and `denom`.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `numer` has at least 2 dimensions.
+ - The first two dimensions of `numer` have equal length.
+ - `denom` has the same first 2 dimensions as `numer`.
+ - `numer` and `denom` can be broadcast to each other.
+ - No value in the upper triangle of `denom` is 0.
+
+ Parameters
+ ----------
+ numer: np.ndarray
+ Numerator of division.
+ denom: np.ndarray
+ Denominator of division.
+
+ Returns
+ -------
+ np.ndarray
+ Quotient of the upper triangles; values below the main diagonal
+ are undefined.
+ """
+ quotient = np.empty(np.broadcast_shapes(numer.shape, denom.shape))
+ for j in range(numer.shape[0]):
+ quotient[j, j:] = numer[j, j:] / denom[j, j:]
+ return quotient
+
+
+@jit()
+def _triu_dot(a: np.ndarray, b: np.ndarray):
+ """ Dot product of `a` and `b` over their first 2 dimensions.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `a` and `b` both have at least 2 dimensions.
+ - The first and second dimensions of `a` are equal.
+ - The first and second dimensions of `b` are equal.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array 1.
+ b: np.ndarray
+ Array 2.
+
+ Returns
+ -------
+ np.ndarray
+ Dot product of `a` and `b` over their first 2 dimensions.
+ """
+ dot = np.zeros(np.broadcast_shapes(a.shape, b.shape)[2:])
+ # Dot product over axes 0 and 1.
+ for j in range(a.shape[0]):
+ dot += np.sum(a[j, j:] * b[j, j:], axis=0)
+ return dot
+
+
+@jit()
+def _triu_allclose(a: np.ndarray,
+ b: np.ndarray,
+ rtol: float = 1.e-3,
+ atol: float = 1.e-6):
+ """ Whether the upper triangles of `a` and `b` are all close.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `a` and `b` both have at least 2 dimensions.
+ - The first and second dimensions of `a` are equal.
+ - The first and second dimensions of `b` are equal.
+
+ Parameters
+ ----------
+ a: np.ndarray
+ Array 1.
+ b: np.ndarray
+ Array 2.
+ rtol: float = 1.0e-3
+ Relative tolerance.
+ atol: float = 1.0e-6
+ Absolute tolerance.
+
+ Returns
+ -------
+ bool
+ Whether all elements of the upper triangles of `a` and `b` are
+ close using the function `np.allclose`.
+ """
+ for j in range(a.shape[0]):
+ if not np.allclose(a[j, j:], b[j, j:], rtol=rtol, atol=atol):
+ return False
+ return True
+
+
+@jit()
+def _adjust_min_gap(num_pos: int, min_gap: int):
+ """ Given the number of positions (`npos`) and the desired minimum
+ gap between mutations (`min_gap`), find the minimum gap between
+ mutations that is no smaller than 0 and, if possible, no larger
+ than 1 less than the number of positions.
+
+ Parameters
+ ----------
+ num_pos: int
+ Number of positions in the reference section.
+ min_gap: int
+ Minimum number of non-mutated bases between two mutations.
+
+ Returns
+ -------
+ int
+ Adjusted minimum gap between mutations.
+ """
+ return max(min(min_gap, num_pos - 1), 0)
+
+
+@jit()
+def _calc_p_nomut_window(p_mut_given_span: np.ndarray, min_gap: int):
+ """ Given underlying mutation rates (`p_mut_given_span`), find the
+ probability of no mutations in each window of size 0 to `min_gap`.
+
+ Parameters
+ ----------
+ p_mut_given_span: ndarray
+ 2D (positions x clusters) array of the underlying mutation rates
+ (i.e. the probability that a read has a mutation at position (j)
+ given that it contains that position).
+ min_gap: int
+ Minimum number of non-mutated bases between two mutations.
+
+ Returns
+ -------
+ np.ndarray
+ 3D (window x positions x clusters) array of the probability that
+ (window) consecutive bases, ending at position (position), would
+ have 0 mutations at all.
+ """
+ # Find and validate the dimensions.
+ npos, ncls = p_mut_given_span.shape
+ min_gap = _adjust_min_gap(npos, min_gap)
+ # Determine the shape of the array to return.
+ p_nomut_window_shape = min_gap + 1, npos + 1, ncls
+ if min_gap == 0:
+ # If min_gap == 0, then only size-0 windows must be considered,
+ # which always have 0 mutations.
+ return np.ones(p_nomut_window_shape)
+ # Compute product of the non-mutation rates over each window ranging
+ # in size from 0 to min_gap; element [g, j, k] is the product of all
+ # non-mutation rates from position (j - g) to (j - 1) for cluster k.
+ p_nomut_window = np.empty(p_nomut_window_shape)
+ # For window size 0, every window represents 0 positions, for which
+ # the probability of having 0 mutations is always 1.
+ p_nomut_window[0] = 1.
+ # For window size 1, every window represents exactly 1 position, so
+ # the product over the window is just the non-mutation rate of the
+ # corresponding position.
+ p_nomut_window[1, 1:] = 1. - p_mut_given_span
+ # For each window size from 2 to min_gap, calculate the probability
+ # of there being no mutations in each window of that size.
+ for size in range(2, p_nomut_window.shape[0]):
+ shift = size - 1
+ p_nomut_window[size, size:] = (p_nomut_window[1, size:]
+ * p_nomut_window[shift, shift: -1])
+ return p_nomut_window
+
+
+@jit()
+def _calc_p_noclose_given_ends(p_mut_given_span: np.ndarray,
+ p_nomut_window: np.ndarray):
+ """ Given underlying mutation rates (`p_mut_given_span`), calculate
+ the probability that a read starting at position (a) and ending at
+ position (b) would have no two mutations too close, for each (a) and
+ (b) where 1 ≤ a ≤ b ≤ L (biological coordinates) or 0 ≤ a ≤ b < L
+ (Python coordinates).
+
+ Parameters
+ ----------
+ p_mut_given_span: np.ndarray
+ 2D (positions x clusters) array of the underlying mutation rates
+ (i.e. the probability that a read has a mutation at position (j)
+ given that it contains that position).
+ p_nomut_window: np.ndarray
+ 3D (window x positions x clusters) array of the probability that
+ (window) consecutive bases, ending at position (position), would
+ have zero mutations at all.
+
+ Returns
+ -------
+ np.ndarray
+ 3D (positions x positions x clusters) array of the probability
+ that a random read starting at position (a) (row) and ending at
+ position (b) (column) would have no two mutations too close.
+ """
+ # Find and validate the dimensions.
+ npos, ncls = p_mut_given_span.shape
+ inc_gap = p_nomut_window.shape[0]
+ min_gap = inc_gap - 1
+ if min_gap == 0:
+ # If min_gap == 0, then no mutations can be too close, so the
+ # probability of not having two mutations too close is 1.
+ return np.ones((npos, npos, ncls))
+ # For each pair of positions (i, j), find the probability that a
+ # random bit vector from (i) to (j), inclusive, would have no two
+ # mutations closer than min_gap positions: p_noclose_given_ends[i, j].
+ p_noclose_given_ends = np.empty((npos, npos, ncls))
+ # Fill the main diagonal and the (min_gap) diagonals below the main
+ # diagonal with ones.
+ for j in range(npos):
+ p_noclose_given_ends[j, max(j - min_gap, 0): (j + 1)] = 1.
+ # The probabilities follow a recurrence relation that is assumed to
+ # have no closed-form solution but can be computed via a loop that
+ # fills p_noclose_given_ends one column (j) at a time.
+ window_indexes = np.minimum(np.arange(npos, 0, -1), min_gap)
+ for j in range(1, npos):
+ # If position (j) is mutated (probability = p_mut_given_pos[j]),
+ # then no two mutations from (i) to (j) are too close iff none
+ # of the previous (min_gap) positions, i.e. (j - min_gap) to
+ # (j - 1), are mutated (probability = p_nomut_window[j]); and if
+ # no two mutations from (i) to (j - (min_gap + 1)) are too close
+ # (probability = p_noclose_given_ends[i, j - (min_gap + 1)]).
+ p_noclose_given_ends_mutj = (
+ p_nomut_window[window_indexes[(npos - j):], j]
+ * p_noclose_given_ends[:j, max(j - inc_gap, 0)]
+ )
+ # Otherwise, no two mutations from (i) to (j) are too close iff
+ # the same is true from positions (i) to (j - 1) (probability
+ # = p_noclose_given_ends[i, j - 1]).
+ p_noclose_given_ends_nomutj = p_noclose_given_ends[:j, j - 1]
+ # The probability that no two mutations from (i) to (j) are too
+ # close is the weighted sum of these mutually exclusive events.
+ p_noclose_given_ends[:j, j] = (
+ p_noclose_given_ends_mutj * p_mut_given_span[j]
+ + p_noclose_given_ends_nomutj * p_nomut_window[1, j + 1]
+ )
+ return p_noclose_given_ends
+
+
+@jit()
+def _calc_rectangular_sum(array: np.ndarray):
+ """ For each element of the main diagonal, calculate the sum over
+ the rectangular array from that element to the upper right corner.
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `array` has at least 2 dimensions.
+ - The first and second dimensions of `array` have equal lengths.
+
+ Parameters
+ ----------
+ array: np.ndarray
+ Array of at least two dimensions for which to calculate the sum
+ of each rectangular array from each element on the main diagonal
+ to the upper right corner.
+
+ Returns
+ -------
+ np.ndarray
+ Array with all but the first dimension of `array` indicating the
+ sum of the array from each element on the main diagonal to the
+ upper right corner of `array`.
+ """
+ npos = array.shape[0]
+ dims = array.shape[1:]
+ # For each position, calculate the total area of all rows up to and
+ # including that position and of all columns up to but not including
+ # that position.
+ rows_area = np.empty(dims)
+ cols_area = np.empty(dims)
+ if npos > 0:
+ # Initialize the first element of each array.
+ rows_area[0] = array[0].sum(axis=0)
+ cols_area[0] = 0.
+ # Calculate every successive element.
+ for j in range(1, npos):
+ i = j - 1
+ rows_area[j] = rows_area[i] + array[j, j:].sum(axis=0)
+ cols_area[j] = cols_area[i] + array[:j, i].sum(axis=0)
+ # For each position, the area of the rectangular array from that
+ # position to the upper right corner equals the area of the rows up
+ # to and including that position minus the area of the columns up to
+ # but not including that position.
+ return rows_area - cols_area
+
+
+@jit()
+def _calc_p_mut_given_span_noclose(p_mut_given_span: np.ndarray,
+ p_ends: np.ndarray,
+ p_noclose_given_ends: np.ndarray,
+ p_nomut_window: np.ndarray):
+ """ Calculate the mutation rates of only reads with no two mutations
+ too close. """
+ # Find the dimensions.
+ npos, ncls = p_mut_given_span.shape
+ inc_gap = p_nomut_window.shape[0]
+ min_gap = inc_gap - 1
+ if min_gap == 0:
+ # If min_gap == 0, then no mutations can be too close, so return
+ # the original mutation rates.
+ return p_mut_given_span
+ # Calculate the probability that a read spanning each position would
+ # have no two mutations too close.
+ p_noclose_given_span = _calc_rectangular_sum(p_noclose_given_ends
+ * np.expand_dims(p_ends, 2))
+ # Compute the mutation rates given no two mutations are too close
+ # one position (j) at a time.
+ p_mut_given_span_noclose = p_mut_given_span / p_noclose_given_span
+ for j in range(npos):
+ nrows = j + 1
+ ncols = npos - j
+ # For each starting position (a), calculate the probability of
+ # no two mutations too close from (a) to (j).
+ p_noclose_a = np.empty((ncls, nrows))
+ for a in range(nrows):
+ # Number of bases 5' of (j) that must have no mutations:
+ # the smallest of (min_gap) and (j - a).
+ nomut = min(min_gap, j - a)
+ # Probability of no close mutations, (a) to (j - 1 - nomut):
+ # p_noclose_given_ends[a, max(j - 1 - nomut, a)]
+ # Probability of no mutations over the (nomut)-sized window
+ # from (j - nomut) to (j - 1).
+ # p_nomut_window[nomut, j]
+ # Probability of no close mutations from (a) to (j).
+ p_noclose_a[:, a] = (
+ p_noclose_given_ends[a, max(j - 1 - nomut, a)]
+ * p_nomut_window[nomut, j]
+ )
+ # For each ending position (b), calculate the probability of
+ # no two mutations too close from (j) to (b).
+ p_noclose_b = np.empty((ncls, ncols))
+ for b in range(j, npos):
+ # Number of bases 3' of (j) that must have no mutations:
+ # the smallest of (min_gap) and (b - j).
+ nomut = min(min_gap, b - j)
+ # Probability of no mutations over the (nomut)-sized window
+ # from (j + 1) to (j + nomut):
+ # p_nomut_window[nomut, j + 1 + nomut]
+ # Probability of no close mutations, (j + 1 + nomut) to (b):
+ # p_noclose_given_ends[min(j + 1 + nomut, b), b]
+ # Probability of no close mutations from (j) to (b).
+ p_noclose_b[:, b - j] = (
+ p_nomut_window[nomut, nrows + nomut]
+ * p_noclose_given_ends[min(nrows + nomut, b), b]
+ )
+ # The probability that a read has a mutation at position (j)
+ # given that it has no two mutations too close is the weighted
+ # sum of such probabilities for all (a) and (b).
+ for k in range(ncls):
+ p_mut_given_span_noclose[j, k] *= (p_noclose_a[k]
+ @ p_ends[:nrows, -ncols:]
+ @ p_noclose_b[k])
+ return p_mut_given_span_noclose
+
+
+def _calc_p_mut_given_span(p_mut_given_span_observed: np.ndarray,
+ min_gap: int,
+ p_ends: np.ndarray,
+ init_p_mut_given_span: np.ndarray, *,
+ f_tol: float = 5e-1,
+ f_rtol: float = 5e-1,
+ x_tol: float = 1e-4,
+ x_rtol: float = 5e-1):
+ """ Calculate the underlying mutation rates including for reads with
+ two mutations too close based on the observed mutation rates. """
+ # Validate the dimensionality of the arguments.
+ if p_mut_given_span_observed.ndim == 1:
+ # If p_mut_given_span_noclose has 1 dimension, then convert it
+ # to 2 dimensions, calculate, and convert back to 1 dimension.
+ return _calc_p_mut_given_span(
+ p_mut_given_span_observed[:, np.newaxis],
+ min_gap,
+ p_ends,
+ init_p_mut_given_span,
+ f_tol=f_tol,
+ f_rtol=f_rtol,
+ x_tol=x_tol,
+ x_rtol=x_rtol,
+ )[:, 0]
+ dims = find_dims([(POSITIONS, CLUSTERS)],
+ [p_mut_given_span_observed],
+ ["p_mut_given_span_observed"],
+ nonzero=True)
+ min_gap = _adjust_min_gap(dims[POSITIONS], min_gap)
+ if min_gap == 0:
+ # No two mutations can be too close.
+ return p_mut_given_span_observed
+
+ # Use the Newton-Krylov method to solve for the total mutation rates
+ # (including reads with two mutations too close) that result in zero
+ # difference between theoretically observed and actually observed
+ # mutation rates.
+
+ def objective(p_mut_given_span: np.ndarray):
+ """ Calculate the difference between the observed mutation rates
+ and the mutation rates of reads with no two mutations too close
+ assuming the true mutaiton rates are `p_mut_given_span`. """
+ p_nomut_window = _calc_p_nomut_window(p_mut_given_span, min_gap)
+ p_noclose_given_ends = _calc_p_noclose_given_ends(p_mut_given_span,
+ p_nomut_window)
+ return p_mut_given_span_observed - _calc_p_mut_given_span_noclose(
+ p_mut_given_span,
+ p_ends,
+ p_noclose_given_ends,
+ p_nomut_window
+ )
+
+ # Import scipy here instead of at the top of this module because
+ # its import is slow enough to impact global startup time.
+ from scipy.optimize import newton_krylov
+
+ return _clip(newton_krylov(objective,
+ init_p_mut_given_span,
+ f_tol=f_tol,
+ f_rtol=f_rtol,
+ x_tol=x_tol,
+ x_rtol=x_rtol))
+
+
+def _calc_p_ends(p_ends_observed: np.ndarray,
+ p_noclose_given_ends: np.ndarray,
+ p_mut_given_span: np.ndarray,
+ p_clust: np.ndarray):
+ """ Calculate the proportion of total reads with each pair of 5' and
+ 3' coordinates.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - Every value in the upper triangle of `p_ends_observed` is
+ ≥ 0 and ≤ 1; no values below the main diagonal are used.
+ - The upper triangle of `p_ends_observed` sums to 1.
+ - `min_gap` is a non-negative integer.
+ - Every value in `p_mut_given_span` is ≥ 0 and ≤ 1.
+
+ Parameters
+ ----------
+ p_ends_observed: np.ndarray
+ 3D (positions x positions x clusters) array of the proportion of
+ observed reads in each cluster beginning at the row position and
+ ending at the column position.
+ p_noclose_given_ends: np.ndarray
+ 3D (positions x positions x clusters) array of the pobabilities
+ that a read with 5' and 3' coordinates corresponding to the row
+ and column would have no two mutations too close.
+ p_mut_given_span: np.ndarray
+ 2D (positions x clusters) array of the total mutation rate at
+ each position in each cluster.
+ p_clust: np.ndarray
+ 1D (clusters) array of the proportion of each cluster.
+
+ Returns
+ -------
+ np.ndarray
+ 2D (positions x positions) array of the proportion of reads
+ beginning at the row position and ending at the column position.
+ This array is assumed to be identical for all clusters.
+ """
+ # Validate the dimensionality of the arguments.
+ if p_ends_observed.ndim == 2:
+ # If p_ends_observed has 2 dimensions, then promote it to 3
+ # dimensions first.
+ return _calc_p_ends(p_ends_observed[:, :, np.newaxis],
+ p_noclose_given_ends,
+ p_mut_given_span,
+ p_clust)
+ dims = find_dims([(POSITIONS, POSITIONS, CLUSTERS),
+ (POSITIONS, POSITIONS, CLUSTERS),
+ (POSITIONS, CLUSTERS),
+ (CLUSTERS,)],
+ [p_ends_observed,
+ p_noclose_given_ends,
+ p_mut_given_span,
+ p_clust],
+ ["p_ends_observed",
+ "p_noclose_given_ends",
+ "p_mut_given_span",
+ "p_clust"],
+ nonzero=True)
+ # Calculate the proportion of total reads that would have each
+ # pair of end coordinates.
+ p_ends = _triu_norm(_triu_div(p_ends_observed, p_noclose_given_ends))
+ # Return a consensus distribution among all clusters.
+ if dims[CLUSTERS] == 1:
+ return p_ends[:, :, 0]
+ return np.average(p_ends, axis=2, weights=p_clust)
+
+
+def calc_p_noclose(p_ends: np.ndarray,
+ p_noclose_given_ends: np.ndarray):
+ """ Calculate the proportion of each cluster considering only reads
+ with no two mutations too close. """
+ # Validate the dimensionality of the arguments.
+ find_dims([(POSITIONS, POSITIONS), (POSITIONS, POSITIONS, CLUSTERS)],
+ [p_ends, p_noclose_given_ends],
+ ["p_ends", "p_noclose_given_ends"],
+ nonzero=True)
+ # Compute the weighted sum of the probabilities that reads from each
+ # cluster would have no two mutations too close.
+ return _triu_dot(p_ends[:, :, np.newaxis], p_noclose_given_ends)
+
+
+def calc_p_clust(p_clust_observed: np.ndarray, p_noclose: np.ndarray):
+ """ Cluster proportion among all reads.
+
+ Parameters
+ ----------
+ p_clust_observed: np.ndarray
+ Proportion of each cluster among reads with no two mutations too
+ close.
+ 1D (clusters)
+ p_noclose: np.ndarray
+ Probability that a read from each cluster would have no two
+ mutations too close.
+ 1D (clusters)
+
+ Returns
+ -------
+ np.ndarray
+ Proportion of each cluster among all reads.
+ 1D (clusters)
+ """
+ # Validate the dimensions.
+ find_dims([(CLUSTERS,), (CLUSTERS,)],
+ [p_clust_observed, p_noclose],
+ ["p_clust_observed", "p_noclose"],
+ nonzero=True)
+ # The cluster proportions among all reads are obtained by weighting
+ # each cluster proportion among reads with no two mutations too
+ # close by the reciprocal of the probability that no two mutations
+ # are too close in that cluster, then normalizing so the sum is 1.
+ return _normalize(p_clust_observed / p_noclose)
+
+
+def calc_p_clust_given_noclose(p_clust: np.ndarray, p_noclose: np.ndarray):
+ """ Cluster proportions among reads with no two mutations too close.
+
+ Parameters
+ ----------
+ p_clust: np.ndarray
+ Proportion of each cluster among all reads.
+ 1D (clusters)
+ p_noclose: np.ndarray
+ Probability that a read from each cluster would have no two
+ mutations too close.
+ 1D (clusters)
+
+ Returns
+ -------
+ np.ndarray
+ Proportion of each cluster among reads with no two mutations too
+ close.
+ 1D (clusters)
+ """
+ # Validate the dimensions.
+ find_dims([(CLUSTERS,), (CLUSTERS,)],
+ [p_clust, p_noclose],
+ ["p_clust", "p_noclose"],
+ nonzero=True)
+ # The cluster proportions among reads with no two mutations too
+ # close are obtained by weighting each cluster proportion by the
+ # probability that no two mutations are too close in that cluster,
+ # then normalizing so the sum is 1.
+ return _normalize(p_clust * p_noclose)
+
+
+def calc_p_noclose_given_ends(p_mut_given_span: np.ndarray, min_gap: int):
+ """ Given underlying mutation rates (`p_mut_given_span`), calculate
+ the probability that a read starting at position (a) and ending at
+ position (b) would have no two mutations too close (i.e. separated
+ by fewer than `min_gap` non-mutated positions), for each combination
+ of (a) and (b) such that 1 ≤ a ≤ b ≤ L (in biological coordinates)
+ or 0 ≤ a ≤ b < L (in Python coordinates).
+
+ Parameters
+ ----------
+ p_mut_given_span: ndarray
+ A 2D (positions x clusters) array of the underlying mutation
+ rates, i.e. the probability that a read has a mutation at
+ position (j) given that it contains position (j).
+ min_gap: int
+ Minimum number of non-mutated bases between two mutations;
+ must be ≥ 0.
+
+ Returns
+ -------
+ np.ndarray
+ 3D (positions x positions x clusters) array of the probability
+ that a random read starting at position (a) (row) and ending at
+ position (b) (column) would have no two mutations too close.
+ """
+ if p_mut_given_span.ndim == 2:
+ p_mut_given_span = _clip(p_mut_given_span)
+ return _calc_p_noclose_given_ends(p_mut_given_span,
+ _calc_p_nomut_window(p_mut_given_span,
+ min_gap))
+ if p_mut_given_span.ndim == 1:
+ return calc_p_noclose_given_ends(
+ p_mut_given_span[:, np.newaxis], min_gap
+ ).reshape((p_mut_given_span.size, p_mut_given_span.size))
+ raise ValueError("p_mut_given_span must have 1 or 2 dimensions, "
+ f"but got {p_mut_given_span.ndim}")
+
+
+def calc_rectangluar_sum(array: np.ndarray):
+ """ For each element of the main diagonal, calculate the sum over
+ the rectangular array from that element to the upper right corner.
+
+ Parameters
+ ----------
+ array: np.ndarray
+ Array of at least two dimensions for which to calculate the sum
+ of each rectangular array from each element on the main diagonal
+ to the upper right corner. The first two dimensions must have
+ equal lengths.
+
+ Returns
+ -------
+ np.ndarray
+ Array with all but the first dimension of `array` indicating the
+ sum of the array from each element on the main diagonal to the
+ upper right corner of `array`.
+ """
+ # Validate the dimensions.
+ find_dims([(POSITIONS, POSITIONS, None)], [array])
+ return _calc_rectangular_sum(array)
+
+
+def calc_params(p_mut_given_span_observed: np.ndarray,
+ p_ends_observed: np.ndarray,
+ p_clust_observed: np.ndarray,
+ min_gap: int,
+ guess_p_mut_given_span: np.ndarray | None = None,
+ guess_p_ends: np.ndarray | None = None,
+ guess_p_clust: np.ndarray | None = None, *,
+ prenormalize: bool = True,
+ max_iter: int = 128,
+ convergence_thresh: float = 1.e-4,
+ **kwargs):
+ """ Calculate the three sets of parameters based on observed data.
+
+ Parameters
+ ----------
+ p_mut_given_span_observed: np.ndarray
+ Observed probability that each position is mutated given that no
+ two mutations are too close:
+ 2D array (positions x clusters)
+ p_ends_observed: np.ndarray
+ Observed proportion of reads aligned with each pair of 5' and 3'
+ end coordinates given that no two mutations are too close:
+ 3D array (positions x positions x clusters)
+ p_clust_observed: np.ndarray
+ Observed proportion of reads in each cluster given that no two
+ mutations are too close:
+ 1D array (clusters)
+ min_gap: int
+ Minimum number of non-mutated bases between two mutations. Must
+ be a non-negative integer.
+ guess_p_mut_given_span: np.ndarray | None = None
+ Initial guess for the probability that each position is mutated.
+ If given, must be a 2D array (positions x clusters); defaults to
+ `p_mut_given_span_observed`.
+ guess_p_ends: np.ndarray | None = None
+ Initial guess for the proportion of total reads aligned to each
+ pair of 5' and 3' end coordinates. If given, must be a 2D array
+ (positions x positions); defaults to `p_ends_observed`.
+ guess_p_clust: np.ndarray | None = None
+ Initial guess for the proportion of total reads in each cluster.
+ If given, must be a 1D array (clusters); defaults to
+ `p_clust_observed`.
+ prenormalize: bool = True
+ Fill missing values in `guess_p_mut_given_span`, `guess_p_ends`,
+ and `guess_p_clust`, and clip every value to be ≥ 0 and ≤ 1.
+ Ensure the proportions in `guess_p_clust` and the upper triangle
+ of `guess_p_ends` sum to 1.
+ max_iter: int = 128
+ Maximum number of iterations in which to refine the parameters.
+ convergence_thresh: float = 1.e-4
+ Convergence threshold based on the root-mean-square difference
+ in mutation rates between consecutive iterations.
+ **kwargs
+ Additional keyword arguments for `_calc_p_mut_given_span`.
+ """
+ # Validate the dimensions.
+ dims = find_dims([(POSITIONS, CLUSTERS),
+ (POSITIONS, POSITIONS, CLUSTERS),
+ (CLUSTERS,)],
+ [p_mut_given_span_observed,
+ p_ends_observed,
+ p_clust_observed],
+ ["p_mut_given_span_observed",
+ "p_ends_observed",
+ "p_clust_observed"],
+ nonzero=True)
+ # Normalize the values.
+ min_gap = _adjust_min_gap(dims[POSITIONS], min_gap)
+ if prenormalize:
+ p_mut_given_span_observed = _clip(p_mut_given_span_observed)
+ p_ends_observed = _triu_norm(_clip(p_ends_observed))
+ p_clust_observed = _normalize(_clip(p_clust_observed))
+ # Determine the initial guess for the mutation rates.
+ if guess_p_mut_given_span is None:
+ # If no initial guess was given, then use the mutation rates of
+ # the observed reads.
+ guess_p_mut_given_span = p_mut_given_span_observed
+ elif guess_p_mut_given_span.shape != p_mut_given_span_observed.shape:
+ raise ValueError("If given, guess_p_mut_given_span must have the same "
+ "dimensions as p_mut_given_span_observed, but got "
+ f"{guess_p_mut_given_span.shape} "
+ f"≠ {p_mut_given_span_observed.shape}")
+ elif prenormalize:
+ # Ensure the initial mutation rates are clipped.
+ guess_p_mut_given_span = _clip(guess_p_mut_given_span)
+ # Determine the initial guess for the cluster proportions.
+ if guess_p_clust is None:
+ # If no initial guess was given, then use the proportions of the
+ # observed reads.
+ guess_p_clust = p_clust_observed
+ elif guess_p_clust.shape != p_clust_observed.shape:
+ raise ValueError(
+ "If given, guess_p_clust must have the same dimensions as "
+ f"p_clust_observed, but got {guess_p_clust.shape} "
+ f"≠ {p_clust_observed.shape}"
+ )
+ elif prenormalize:
+ # Ensure the initial cluster proportions sum to 1.
+ guess_p_clust = _normalize(_clip(guess_p_clust))
+ # Determine the initial guess for the read coordinate distribution.
+ if guess_p_ends is None:
+ # If no initial guess was given, then use the coordinates of
+ # the observed reads.
+ if dims[CLUSTERS] == 1:
+ guess_p_ends = p_ends_observed[:, :, 0]
+ else:
+ guess_p_ends = np.average(p_ends_observed,
+ axis=2,
+ weights=guess_p_clust)
+ elif guess_p_ends.shape != p_ends_observed.shape[:2]:
+ raise ValueError(
+ "If given, guess_p_ends must have dimensions (positions x "
+ f"positions), but got {guess_p_ends.shape} "
+ f"≠ {p_ends_observed.shape[:2]}"
+ )
+ elif prenormalize:
+ # Ensure the initial coordinate distributions are normalized.
+ guess_p_ends = _triu_norm(_clip(guess_p_ends))
+ # Iteratively update the mutation rates and read coordinates.
+ for i in range(max_iter):
+ # Update the mutation rates using the read coordinates.
+ next_p_mut_given_span = _calc_p_mut_given_span(p_mut_given_span_observed,
+ min_gap,
+ guess_p_ends,
+ guess_p_mut_given_span,
+ **kwargs)
+ # Compute the RMSD change in mutation rates.
+ rmsd_p_mut_given_span = np.sqrt(np.mean(np.square(
+ next_p_mut_given_span - guess_p_mut_given_span
+ )))
+ # Update guess_p_mut_given_span for the next iteration.
+ guess_p_mut_given_span = next_p_mut_given_span
+ # Check for convergence using the RMSD change.
+ if rmsd_p_mut_given_span <= convergence_thresh:
+ break
+ # Compute the probability that reads with each end coordinates
+ # would have no two mutations too close.
+ p_noclose_given_ends = _calc_p_noclose_given_ends(
+ guess_p_mut_given_span,
+ _calc_p_nomut_window(guess_p_mut_given_span, min_gap)
+ )
+ # Update the distribution of read end coordinates and clusters
+ # using the mutation rates.
+ guess_p_ends = _calc_p_ends(p_ends_observed,
+ p_noclose_given_ends,
+ guess_p_mut_given_span,
+ guess_p_clust)
+ guess_p_clust = calc_p_clust(p_clust_observed,
+ calc_p_noclose(guess_p_ends,
+ p_noclose_given_ends))
+ else:
+ logger.warning("Mutation rates and distribution of read coordinates "
+ f"failed to converge in {max_iter} iterations.")
+ return guess_p_mut_given_span, guess_p_ends, guess_p_clust
+
+
+def calc_p_ends_given_noclose(p_ends: np.ndarray,
+ p_noclose_given_ends: np.ndarray):
+ """ Calculate the proportion of reads with no two mutations too
+ close with each pair of 5' and 3' coordinates.
+
+ Assumptions
+ -----------
+ - `p_ends` has 2 dimensions: (positions x clusters)
+ - Every value in the upper triangle of `p_ends` is ≥ 0 and ≤ 1;
+ no values below the main diagonal are used.
+ - The upper triangle of `p_ends` sums to 1.
+ - `min_gap` is a non-negative integer.
+ - `p_mut_given_span` has 2 dimensions:
+ (positions x clusters)
+ - Every value in `p_mut_given_span` is ≥ 0 and ≤ 1.
+ - There is at least 1 cluster.
+
+ Parameters
+ ----------
+ p_ends: np.ndarray
+ 2D (positions x positions) array of the proportion of reads in
+ each cluster beginning at the row position and ending at the
+ column position.
+ p_noclose_given_ends: np.ndarray
+ 3D (positions x positions x clusters) array of the pobabilities
+ that a read with 5' and 3' coordinates corresponding to the row
+ and column would have no two mutations too close.
+
+ Returns
+ -------
+ np.ndarray
+ 3D (positions x positions x clusters) array of the proportion of
+ reads without mutations too close, beginning at the row position
+ and ending at the column position, in each cluster.
+ """
+ # Validate the dimensions of the arguments.
+ find_dims([(POSITIONS, POSITIONS), (POSITIONS, POSITIONS, CLUSTERS)],
+ [p_ends, p_noclose_given_ends],
+ ["p_ends", "p_noclose_given_ends"],
+ nonzero=True)
+ # Calculate the proportion of total reads that would have each
+ # pair of end coordinates.
+ return _triu_norm(p_ends[:, :, np.newaxis] * p_noclose_given_ends)
+
+
+@jit()
+def _calc_p_ends_observed(npos: int,
+ end5s: np.ndarray,
+ end3s: np.ndarray,
+ weights: np.ndarray):
+ """ Calculate the proportion of each pair of 5'/3' end coordinates
+ in `end5s` and `end3s`, weighted by `weights`.
+
+ This function is meant to be called by another function that has
+ validated the arguments; hence, this function makes assumptions:
+
+ - `npos` is a non-negative integer.
+ - `end5s` and `end3s` are each a 1D array of integers whose length
+ equals the number of reads.
+ - `weights` is a 2D array of floats whose length
+ - All integers in `end5s` and `end3s` are ≥ 0 and < `npos`.
+ - All weights in `weights` are ≥ 0.
+ - The sum of `weights` is > 0.
+
+ Parameters
+ ----------
+ npos: int
+ Number of positions.
+ end5s: np.ndarray
+ 5' end coordinates of the reads: 1D array (reads)
+ end3s: np.ndarray
+ 3' end coordinates of the reads: 1D array (reads)
+ weights: np.ndarray
+ Number of times each read occurs in each cluster:
+ 2D array (reads x clusters)
+
+ Returns
+ -------
+ np.ndarray
+ Fraction of reads with each 5' (row) and 3' (column) coordinate:
+ 3D array (positions x positions x clusters)
+ """
+ nreads, ncls = weights.shape
+ p_ends = np.zeros((npos, npos, ncls))
+ for i in range(nreads):
+ p_ends[end5s[i], end3s[i]] += weights[i]
+ return p_ends
+
+
+def calc_p_ends_observed(npos: int,
+ end5s: np.ndarray,
+ end3s: np.ndarray,
+ weights: np.ndarray | None = None,
+ check_values: bool = True):
+ """ Calculate the proportion of each pair of 5'/3' end coordinates
+ observed in `end5s` and `end3s`, optionally weighted by `weights`.
+
+ Parameters
+ ----------
+ npos: int
+ Number of positions.
+ end5s: np.ndarray
+ 5' end coordinates of the reads: 1D array (reads)
+ end3s: np.ndarray
+ 3' end coordinates of the reads: 1D array (reads)
+ weights: np.ndarray | None = None
+ Number of times each read occurs in each cluster:
+ 2D array (reads x clusters)
+ check_values: bool = True
+ Check that `end5s`, `end3s`, and `weights` are all valid.
+
+ Returns
+ -------
+ np.ndarray
+ Fraction of reads with each 5' (row) and 3' (column) coordinate:
+ 3D array (positions x positions x clusters)
+ """
+ if npos < 0:
+ raise ValueError(f"Number of positions must be ≥ 0, but got {npos}")
+ # Validate the dimensions.
+ if weights is None:
+ # Assume all reads are equally likely and there is one cluster.
+ return calc_p_ends_observed(npos,
+ end5s,
+ end3s,
+ weights=np.ones_like(end5s),
+ check_values=check_values)
+ if weights.ndim == 1:
+ # There is one cluster: return a 2D array for that cluster.
+ return calc_p_ends_observed(npos,
+ end5s,
+ end3s,
+ weights=weights[:, np.newaxis],
+ check_values=check_values)[:, :, 0]
+ find_dims([(READS,), (READS,), (READS, CLUSTERS)],
+ [end5s, end3s, weights],
+ ["end5s", "end3s", "weights"],
+ nonzero=True)
+ if check_values:
+ # Validate the values.
+ if np.min(end5s) < 0:
+ raise ValueError(
+ f"All end5s must be ≥ 0, but got {end5s[end5s < 0]}"
+ )
+ if np.max(end5s) >= npos:
+ raise ValueError(
+ f"All end5s must be < {npos}, but got {end5s[end5s >= npos]}"
+ )
+ if np.min(end3s) < 0:
+ raise ValueError(
+ f"All end3s must be ≥ 0, but got {end3s[end3s < 0]}"
+ )
+ if np.max(end3s) >= npos:
+ raise ValueError(
+ f"All end3s must be < {npos}, but got {end3s[end3s >= npos]}"
+ )
+ if np.min(weights) < 0.:
+ raise ValueError(
+ f"All weights must be ≥ 0, but got {weights[weights < 0.]}"
+ )
+ if np.min(weights_sum := weights.sum(axis=0)) <= 0.:
+ raise ValueError("The sum of weights must be > 0, "
+ f"but got {weights_sum[weights_sum < 0.]}")
+ # Call the compiled function.
+ return _calc_p_ends_observed(npos, end5s, end3s, weights)
+
+
+def calc_params_observed(n_pos_total: int,
+ order: int,
+ unmasked_pos: Iterable[int],
+ muts_per_pos: Iterable[np.ndarray],
+ end5s: np.ndarray,
+ end3s: np.ndarray,
+ counts_per_uniq: np.ndarray,
+ membership: np.ndarray):
+ """ Calculate the observed estimates of the parameters.
+
+ Parameters
+ ----------
+ n_pos_total: int
+ Total number of positions in the section.
+ order: int
+ Order of clustering.
+ unmasked_pos: Iterable[int]
+ Unmasked positions; must be zero-indexed with respect to the
+ 5' end of the section.
+ muts_per_pos: Iterable[np.ndarray]
+ For each unmasked position, numbers of all reads with a mutation
+ at that position.
+ end5s: np.ndarray
+ Coordinates of the 5' ends of all reads; must be 0-indexed with
+ respect to the 5' end of the section.
+ end3s: np.ndarray
+ Coordinates of the 3' ends of all reads; must be 0-indexed with
+ respect to the 5' end of the section.
+ counts_per_uniq: np.ndarray
+ Number of times each unique read occurs.
+ membership: np.ndarray
+ Cluster memberships of each read: 2D array (reads x clusters)
+
+ Returns
+ -------
+ tuple[np.ndarray, np.ndarray, np.ndarray]
+
+ """
+ # Count each unique read in each cluster.
+ # 2D (unique reads x clusters)
+ n_each_read_each_clust = counts_per_uniq[:, np.newaxis] * membership
+ # Count the total number of reads in each cluster.
+ # 1D (clusters)
+ n_reads_per_clust = np.sum(n_each_read_each_clust, axis=0)
+ # Calculate the observed proportion of reads in each cluster.
+ # 1D (clusters)
+ p_clust_observed = n_reads_per_clust / n_reads_per_clust.sum()
+ # Calculate the proportion of each unique read in each cluster.
+ # 2D (unique reads x clusters)
+ p_each_read_each_clust = n_each_read_each_clust / n_reads_per_clust
+ # Calculate the proportion of observed reads with each pair of
+ # 5' and 3' end coordinates.
+ # 3D (all positions x all positions x clusters)
+ p_ends_observed = calc_p_ends_observed(n_pos_total,
+ end5s,
+ end3s,
+ p_each_read_each_clust,
+ check_values=False)
+ # Count the observed reads that cover each position.
+ # 2D (all positions x clusters)
+ n_reads_per_pos = (calc_rectangluar_sum(p_ends_observed)
+ * n_reads_per_clust)
+ # Count the observed mutations at each position.
+ # 2D (all positions x clusters)
+ n_muts_per_pos = np.zeros((n_pos_total, order))
+ for j, mut_reads in zip(unmasked_pos, muts_per_pos, strict=True):
+ # Calculate the number of mutations at each position in each
+ # cluster by summing the count-weighted likelihood that each
+ # read with a mutation at (j) came from the cluster.
+ n_muts_per_pos[j] = counts_per_uniq[mut_reads] @ membership[mut_reads]
+ # Calculate the observed mutation rate at each position.
+ # 2D (all positions x clusters)
+ p_mut_observed = n_muts_per_pos / n_reads_per_pos
+ return p_mut_observed, p_ends_observed, p_clust_observed
+
+########################################################################
+# #
+# © Copyright 2024, the Rouskin Lab. #
+# #
+# This file is part of SEISMIC-RNA. #
+# #
+# SEISMIC-RNA is free software; you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# SEISMIC-RNA is distributed in the hope that it will be useful, but #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
+# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
+# Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with SEISMIC-RNA; if not, see . #
+# #
+########################################################################
diff --git a/src/seismicrna/core/mu/unbias/__init__.py b/src/seismicrna/core/mu/unbias/__init__.py
deleted file mode 100644
index f86e3425..00000000
--- a/src/seismicrna/core/mu/unbias/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from .algo import *
-from .frame import *
-
-########################################################################
-# #
-# © Copyright 2024, the Rouskin Lab. #
-# #
-# This file is part of SEISMIC-RNA. #
-# #
-# SEISMIC-RNA is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# SEISMIC-RNA is distributed in the hope that it will be useful, but #
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
-# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
-# Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with SEISMIC-RNA; if not, see . #
-# #
-########################################################################
diff --git a/src/seismicrna/core/mu/unbias/algo.py b/src/seismicrna/core/mu/unbias/algo.py
deleted file mode 100644
index 4b81524f..00000000
--- a/src/seismicrna/core/mu/unbias/algo.py
+++ /dev/null
@@ -1,398 +0,0 @@
-"""
-
-Mutation Rate Core Module
-
-========================================================================
-
-The functions in this module serve two main purposes:
- 1. Adjust mutation rates to correct for observer bias.
- 2. Normalize and winsorize mutation rates
-
-------------------------------------------------------------------------
-
-Adjust mutation rates to correct for observer bias
-
-Our lab has found that pairs of mutations in DMS-MaPseq data rarely have
-fewer than three non-mutated bases separating them. We suspect that the
-reverse transcriptase is prone to falling off or stalling at locations
-in the RNA where DMS has methylated bases that are too close.
-
-Regardless of the reason, mutations on nearby bases are not independent,
-which violates a core assumption of the Bernoulli mixture model that we
-use in the expectation-maximization clustering algorithm. Namely, that
-mutations occur independently of each other, such that the likelihood of
-observing a bit vector is the product of the mutation rate of each base
-that is mutated and one minus the mutation rate ("non-mutation rate") of
-each base that is not mutated.
-
-In order to use the Bernoulli mixture model for expectation-maximization
-clustering, we modify it such that bases separated by zero, one, or two
-other bases are no longer assumed to mutate independently. Specifically,
-since pairs of close mutations are rare, we add the assumption that no
-mutations separated by fewer than three non-mutated bases may occur, and
-exclude the few bit vectors that have such close mutations.
-
-When these bit vectors are assumed to exist in the original population
-of RNA molecules but not appear in the observed data, the mutation rates
-that are observed will differ from the real, underlying mutation rates,
-which would include the unobserved bit vectors. The real mutation rates
-must therefore be estimated from the observed mutation rates.
-
-It is relatively easy to estimate the observed mutation rates given the
-real mutation rates, but there is no closed-form solution that we know
-of to estimate the real mutation rates from the observed mutation rates.
-Thus, we use an iterative approach, based on Newton's method for finding
-the roots of functions. We initially guess the real mutation rates. Each
-iteration, we estimate the mutation rates that would have been observed
-given our current guess of the real mutation rates, and then subtract
-the mutation rates that were actually observed. This difference would be
-zero if we had accurately guessed the real mutation rates. Thus, we use
-Newton's method to solve for the real mutation rates that minimize this
-difference. The details are described in the comments of this module and
-in Tomezsko et al. (2020) (https://doi.org/10.1038/s41586-020-2253-5).
-
-------------------------------------------------------------------------
-
-Normalize and winsorize mutation rates
-
-The mutation rates of an RNA may vary among different samples because of
-variations in the chemical probing and mutational profiling procedure.
-Thus, it is often helpful to compute "normalized" mutation rates that
-can be compared directly across different samples and used to predict
-secondary structures.
-
-This module currently provides a simple method for normalizing mutation
-rates. First, a specific quantile of the dataset is chosen, such as 0.95
-(i.e. the 95th percentile). The mutation rate with this quantile is set
-to 1.0, and all other mutation rates are scaled linearly.
-
-If the chosen quantile is less than 1.0, then any mutation rates above
-the quantile will be scaled to values greater than 1.0. Since these high
-mutation rates may be exceptionally reactive bases, it is often helpful
-to cap the normalized mutation rates to a maximum of 1.0. The winsorize
-function in this module performs normalization and then sets any value
-greater than 1.0 to 1.0.
-
-"""
-
-from logging import getLogger
-
-import numpy as np
-
-logger = getLogger(__name__)
-
-# Maximum allowed mutation rate.
-EPSILON = 1.e-6
-MAX_MU = 1. - EPSILON
-
-
-def clip(mus: np.ndarray):
- """ Check if any mutation rates are < 0, ≥ 1, or NaN. If so, then
- fill any NaN values with 0 and clip all values to [0, 1). """
- if mus.size == 0:
- # There is nothing to clip.
- return mus
- mu_min = np.min(mus)
- mu_max = np.max(mus)
- if mu_min < 0. or mu_max > MAX_MU or np.isnan(mu_min) or np.isnan(mu_max):
- clipped = np.clip(np.nan_to_num(mus), 0., MAX_MU)
- logger.warning(f"Mutation rates outside [0, {MAX_MU}]:\n"
- f"{mus[np.nonzero(mus != clipped)]}")
- return clipped
- return mus
-
-
-def _calc_obs(mu_adj: np.ndarray, min_gap: int):
- """ Calculate the probability that a bit vector generated randomly
- from the given mutation rates would not have any mutations closer
- than `min_gap`. Note that `mus` is transposed relative
- to all other uses, so that its shape is (positions x clusters).
- Transposition makes the indexing easier because this function uses
- the positions as the primary axis and clusters as secondary.
-
- Parameters
- ----------
- mu_adj: ndarray
- A (positions x clusters) array of the adjusted mutation rates,
- i.e. corrected for the observer bias.
- min_gap: int
- Minimum number of non-mutated bases between two mutations;
- must be ≥ 0.
-
- Returns
- -------
- tuple[ndarray, ndarray]
- - A 1D array of the probability for each cluster that, given the
- real mutation rates for each position in each cluster, a
- randomly generated bit vector coming from the cluster would
- have no two mutations closer than `min_gap` positions.
- - A 2D (positions x clusters) array of the mutation rates that
- would be observed given the real mutation rates and the
- minimum gap between two mutations.
- """
- if min_gap < 0:
- raise ValueError(f"min_gap must be ≥ 0, but got {min_gap}")
- # Determine the number of positions and clusters.
- dims = mu_adj.shape
- npos, ncls = dims
- # The number of non-mutated bases next to a mutated base cannot
- # exceed the total number of positions minus one.
- if min_gap >= npos:
- min_gap = npos - 1
- if min_gap == 0 or npos == 0 or ncls == 0:
- # No mutations can be too close, so all observed probabilities
- # are 1.0 and the observed mutation rates equal the real rates.
- return np.ones(ncls), mu_adj.copy()
- # Compute the adjusted non-mutation rates (nu = 1 - mu).
- nu_adj = 1. - mu_adj
- # Verify that all positions mutate with probabilty < 1.
- if np.count_nonzero(nu_adj) < nu_adj.size:
- raise ValueError(f"Got mutation rates of 1.0 in {mu_adj}")
- # Compute the cumulative sums of the log non-mutation rates.
- # Sum logarithms instead of multiply for better numerical stability.
- # The cumulative sums are split into three sections:
- end1begin2 = 1 + min_gap
- end2begin3 = end1begin2 + npos
- # - log_nu_cumsum[0: 1 + min_gap]
- # all 0.0
- log_nu_cumsum = np.zeros((end2begin3 + min_gap, ncls), dtype=float)
- # - log_nu_cumsum[1 + min_gap: 1 + min_gap + npos]
- # cumulative sums of log non-mutation rates
- log_nu_cumsum[end1begin2: end2begin3] = np.cumsum(np.log(nu_adj), axis=0)
- # - log_nu_cumsum[1 + min_gap + npos: 1 + min_gap + npos + min_gap]
- # all equal to final cumulative sum, log_nu_cumsum[min_gap + npos]
- log_nu_cumsum[end2begin3:] = log_nu_cumsum[end2begin3 - 1]
- # For each window of (min_gap) positions, find the probability that
- # the window has no mutations, assuming mutations are independent.
- # The log probability is the sum over the window, which equals the
- # cumulative sum at the end of the window minus the cumulative sum
- # one index before the beginning of the window. Then apply np.exp().
- # The dimensions of nu_win are (1 + npos + min_gap, ncls).
- nu_win = np.exp(log_nu_cumsum[min_gap:] - log_nu_cumsum[: end2begin3])
- # For each position (j) in the sequence, calculate the probability
- # f_obs[j] that no two mutations are too close, given that no two
- # mutations after position (j) are too close.
- # Equivalently, it is the probability that no two mutations from the
- # beginning of the sequence up to position (j) are too close:
- # If position (j) is mutated, then no two mutations up to (j) are
- # too close iff none of the previous (min_gap) positions are mutated
- # (P = pj_qwin[j]) and no two mutations before that window are too
- # close (P = f_obs[j - (1 + min_gap)]).
- # If position (j) is not mutated (P = nu_adj[j]), then no two
- # mutations from the beginning up to (j) are too close iff no two
- # mutations up to (j - 1) are too close (P = f_obs[j - 1]).
- # Combining these two situations gives this recurrence relation:
- # f_obs[j] = (pj_qwin[j] * f_obs[j - (1 + min_gap)]
- # + nu_adj[j] * f_obs[j - 1])
- # The initial condition is f_obs[0] = 1.0 because there are
- # certainly no two mutations that are too close within the first
- # one position in the sequence.
- f_obs_prev = np.ones(dims, dtype=float)
- f_obs_next = np.ones(dims, dtype=float)
- # Keep track of the probabilities that none of the (min_gap) bases
- # preceding (following) base (j) are mutated and that there are no
- # mutations within (min_gap) positions before (after) those bases.
- f_obs_win_prev = np.ones(dims, dtype=float)
- f_obs_win_next = np.ones(dims, dtype=float)
- # This recurrence relation has no simple closed-form solution, and
- # likely no closed-form solution at all, so compute it iteratively:
- for jp in range(1, npos):
- # Probability that none of the preceding (min_gap) bases are
- # mutated and no mutations before them are too close.
- f_obs_win_prev[jp] = (nu_win[jp] *
- f_obs_prev[(jp - end1begin2) % npos])
- # Probability that no two mutations from the beginning to (jp)
- # are too close.
- f_obs_prev[jp] = (mu_adj[jp] * f_obs_win_prev[jp] +
- nu_adj[jp] * f_obs_prev[jp - 1])
- for jn in range(npos - 2, -1, -1):
- # Probability that none of the following (min_gap) bases are
- # mutated and no mutations after them are too close.
- f_obs_win_next[jn] = (nu_win[jn + end1begin2] *
- f_obs_next[(jn + end1begin2) % npos])
- # Probability that no two mutations from (jn) to the end are too
- # close.
- f_obs_next[jn] = (mu_adj[jn] * f_obs_win_next[jn] +
- nu_adj[jn] * f_obs_next[jn + 1])
- # The probability that a randomly generated bit vector has no two
- # mutations that are too close is the probability that no two
- # mutations are too close after and including the first position.
- f_obs = f_obs_next[0]
- # For each position (j), calculate the observed mutation rates given
- # the real mutation rates.
- # Start by calculating the joint probability that a bit vector is
- # observed (i.e. has no mutations that are too close together) and
- # position (j) is mutated: the product of the probabilities that
- # - position (j) is mutated: p_adj[j]
- # - no bases within (min_gap) positions before (j) are mutated and
- # no two mutations before them are too close: f_obs_win_prev[j]
- # - no bases within (min_gap) positions after (j) are mutated and no
- # two mutations after them are too close: f_obs_win_next[j]
- # Then compute the conditional probability that position (j) is
- # mutated, given that the bit vector has no two mutations that are
- # too close, by dividing the joint probability by the probability
- # that no two mutations are too close: f_obs.
- mu_obs = mu_adj * f_obs_win_prev * f_obs_win_next / f_obs
- return f_obs, mu_obs
-
-
-def _calc_f_obs_clipped(mus_adj: np.ndarray, min_gap: int):
- """ Return a 1D array of the probability for each cluster that,
- given the real mutation rates for each position in each cluster, a
- randomly generated bit vector coming from the cluster would have no
- two mutations closer than min_gap positions. """
- return _calc_obs(mus_adj, min_gap)[0]
-
-
-def calc_f_obs_numpy(mus_adj: np.ndarray, min_gap: int):
- """ Return a 1D array of the probability for each cluster that,
- given the real mutation rates for each position in each cluster, a
- randomly generated bit vector coming from the cluster would have no
- two mutations closer than min_gap positions. """
- if mus_adj.ndim == 2:
- return _calc_f_obs_clipped(clip(mus_adj), min_gap)
- if mus_adj.ndim == 1:
- return float(np.squeeze(calc_f_obs_numpy(mus_adj.reshape((-1, 1)),
- min_gap),
- axis=0))
- raise ValueError(f"Expected 1 or 2 dimensions, but got {mus_adj.ndim}")
-
-
-def _calc_mu_obs(mus_adj: np.ndarray, min_gap: int):
- """ A 2D (positions x clusters) array of the mutation rates that
- would be observed given the real mutation rates and the minimum gap
- between two mutations. """
- return _calc_obs(clip(mus_adj), min_gap)[1]
-
-
-def _diff_adj_obs(mus_adj: np.ndarray, mus_obs: np.ndarray, min_gap: int):
- """ Compute the difference between the mutation rates that would be
- observed if `mus_adj` were the real mutation rates (including
- unobserved reads), and the actual observed mutation rates.
-
- Parameters
- ----------
- mus_adj: ndarray
- A (positions x clusters) array of the current guesses of each
- cluster's real mutation rates.
- mus_obs: ndarray
- A (positions x clusters) array of the actual observed mutation
- rates, from the weighted average over all bit vectors.
- min_gap: int
- Minimum permitted gap between two mutations.
-
- Returns
- -------
- ndarray
- A (positions x clusters) array of the difference between each
- expected-to-be-observed and each actual observed mutation rate.
- """
- return _calc_mu_obs(mus_adj, min_gap) - mus_obs
-
-
-def calc_mu_adj_numpy(mus_obs: np.ndarray, min_gap: int,
- mus_guess: np.ndarray | None = None,
- f_tol: float = 5e-1,
- f_rtol: float = 5e-1,
- x_tol: float = 1e-4,
- x_rtol: float = 5e-1):
- """ Given observed mutation rates `mus_obs` (which do not include
- any reads that dropped out because they had mutations closer than
- `min_gap` nt apart), estimate the real mutation rates that include
- these unobserved reads.
-
- Parameters
- ----------
- mus_obs: ndarray
- A (positions x clusters) array of the observed mutation rates,
- which do not include unobserved reads that dropped out.
- min_gap: int
- Minimum permitted gap between two mutations.
- mus_guess: ndarray
- Initial guess of the real mutation rates. If given, must be the
- same shape as mus_obs. If omitted, defaults to mus_obs, which is
- usually close to the optimal value.
- f_tol: float = 5e-1
- Absolute tolerance in residual.
- f_rtol: float = 5e-1
- Relative tolerance in residual.
- x_tol: float = 1e-4
- Absolute tolerance in step.
- x_rtol: float = 5e-1
- Relative tolerance in step.
-
- Returns
- -------
- ndarray
- A (positions x clusters) array of the real mutation rates that
- would be expected to yield the observed mutation rates.
- """
- # Import scipy here instead of at the top of this module because
- # its import is slow enough to impact global startup time.
- from scipy.optimize import newton_krylov
- if mus_obs.ndim == 1:
- # Expand the mutation rates from a vector into a matrix with one
- # column (cluster), calculate, and squeeze back into a vector.
- return np.squeeze(calc_mu_adj_numpy(mus_obs.reshape(-1, 1), min_gap),
- axis=1)
- if mus_obs.ndim != 2:
- # Only matrices (positions x clusters) are supported hereafter.
- raise ValueError(f"Expected 1 or 2 dimensions, but got {mus_obs.ndim}")
- # Clip any invalid mutation rates.
- mus_obs = clip(mus_obs)
- if mus_obs.size == 0:
- # If the array is empty, then there are no real mutation rates.
- return mus_obs
- # Determine the initial guess of the real mutation rates.
- if mus_guess is None:
- mus_guess = mus_obs
- else:
- # The dimensions of the guess and the mutation rates must match.
- if mus_guess.shape != mus_obs.shape:
- raise ValueError(f"Dimensions of mus_guess {mus_guess.shape} and "
- f"mus_obs {mus_obs.shape} differed")
- # Clip any invalid guessed mutation rates.
- mus_guess = clip(mus_guess)
- # Solve for the "real" mutation rates that yield minimal difference
- # between the mutation rates that would be expected to be observed
- # given the real mutation rates (i.e. when reads with mutations too
- # close are removed from the real mutation rates) and the actual
- # observed mutation rates. Use Newton's method, which finds the
- # parameters of a function that make it evaluate to zero, with the
- # Krylov approximation of the Jacobian, which improves performance.
- return clip(newton_krylov(lambda mus_iter: _diff_adj_obs(mus_iter,
- mus_obs,
- min_gap),
- mus_guess,
- f_tol=f_tol,
- f_rtol=f_rtol,
- x_tol=x_tol,
- x_rtol=x_rtol))
-
-
-def calc_prop_adj_numpy(prop_obs: np.ndarray, f_obs: np.ndarray):
- """ Calculate the adjusted proportion of the clusters given their
- observed proportions and the observer bias. """
- weighted_prop_obs = prop_obs / f_obs
- return weighted_prop_obs / np.sum(weighted_prop_obs)
-
-########################################################################
-# #
-# © Copyright 2024, the Rouskin Lab. #
-# #
-# This file is part of SEISMIC-RNA. #
-# #
-# SEISMIC-RNA is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# SEISMIC-RNA is distributed in the hope that it will be useful, but #
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
-# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
-# Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with SEISMIC-RNA; if not, see . #
-# #
-########################################################################
diff --git a/src/seismicrna/core/mu/unbias/frame.py b/src/seismicrna/core/mu/unbias/frame.py
deleted file mode 100644
index a75052d1..00000000
--- a/src/seismicrna/core/mu/unbias/frame.py
+++ /dev/null
@@ -1,108 +0,0 @@
-import pandas as pd
-
-from .algo import calc_f_obs_numpy, calc_mu_adj_numpy, calc_prop_adj_numpy
-from ...seq import Section
-
-
-def _mus_to_matrix(mus: pd.Series | pd.DataFrame, section: Section):
- return mus.reindex(index=section.range,
- fill_value=0.).values.reshape((section.length, -1))
-
-
-def calc_f_obs_frame(mu_adj: pd.DataFrame | pd.Series,
- section: Section,
- min_gap: int):
- """ Calculate the observed fraction of reads in each cluster given
- their mutation rates adjusted for observer bias.
-
- Parameters
- ----------
- mu_adj: pd.DataFrame
- Adjusted fraction of mutated bits at each non-excluded position
- (index) in each cluster (column). All values must be in [0, 1).
- section: Section
- The section over which to compute mutation rates, including all
- positions that were excluded.
- min_gap: int
- Minimum number of non-mutated bases between two mutations.
- Must be ≥ 0.
-
- Returns
- -------
- pd.Series | float
- For each cluster, the fraction of all bit vectors coming from
- that cluster that would be observed.
- """
- f_obs = calc_f_obs_numpy(_mus_to_matrix(mu_adj, section), min_gap)
- if isinstance(mu_adj, pd.DataFrame):
- return pd.Series(f_obs, index=mu_adj.columns)
- elif isinstance(mu_adj, pd.Series):
- return float(f_obs.item())
- raise TypeError(f"Expected mu_adj to be a Series or DataFrame, but got "
- f"{type(mu_adj).__name__}")
-
-
-def calc_mu_adj_frame(mu_obs: pd.DataFrame | pd.Series,
- section: Section,
- min_gap: int):
- """ Correct the mutation rates of a DataFrame for observer bias.
-
- Parameters
- ----------
- mu_obs: pd.DataFrame
- Fraction of mutated bits at each non-excluded position (index)
- in each cluster (column). All values must be in [0, 1).
- section: Section
- The section over which to compute mutation rates, including all
- positions that were excluded.
- min_gap: int
- Minimum number of non-mutated bases between two mutations.
- Must be ≥ 0.
-
- Returns
- -------
- pd.DataFrame | pd.Series
- Data frame of the adjusted mutation rates with the same index
- and columns as `mu_obs`.
- """
- mu_adj = calc_mu_adj_numpy(_mus_to_matrix(mu_obs, section), min_gap)
- if isinstance(mu_obs, pd.DataFrame):
- mu_adj_frame = pd.DataFrame(mu_adj, section.range, mu_obs.columns)
- elif isinstance(mu_obs, pd.Series):
- mu_adj_frame = pd.Series(mu_adj.reshape(section.length), section.range)
- else:
- raise TypeError(f"Expected mu_obs to be a Series or DataFrame, but got "
- f"{type(mu_obs).__name__}")
- return mu_adj_frame.loc[mu_obs.index]
-
-
-def calc_prop_adj_frame(prop_obs: pd.Series, f_obs: pd.Series):
- """ Calculate the adjusted proportion of the clusters given their
- observed proportions and the observer bias. """
- if not (clusters := prop_obs.index).equals(f_obs.index):
- raise ValueError(f"Got different clusters for observed proportions of "
- f"clusters {clusters} and fraction of reads observed "
- f"in each cluster {f_obs.index}")
- return pd.Series(calc_prop_adj_numpy(prop_obs.values, f_obs.values),
- index=clusters)
-
-########################################################################
-# #
-# © Copyright 2024, the Rouskin Lab. #
-# #
-# This file is part of SEISMIC-RNA. #
-# #
-# SEISMIC-RNA is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# SEISMIC-RNA is distributed in the hope that it will be useful, but #
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
-# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
-# Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with SEISMIC-RNA; if not, see . #
-# #
-########################################################################
diff --git a/src/seismicrna/core/mu/unbias/tests/algo_test.py b/src/seismicrna/core/mu/unbias/tests/algo_test.py
deleted file mode 100644
index af85e4d0..00000000
--- a/src/seismicrna/core/mu/unbias/tests/algo_test.py
+++ /dev/null
@@ -1,428 +0,0 @@
-"""
-
-Tests for Mutation Rate Core Module
-
-========================================================================
-
-"""
-
-import unittest as ut
-from logging import Filter, LogRecord
-
-import numpy as np
-
-from seismicrna.core.mu.unbias.algo import (MAX_MU,
- _calc_mu_obs,
- calc_mu_adj_numpy,
- calc_f_obs_numpy,
- clip,
- logger as algo_logger)
-
-rng = np.random.default_rng()
-
-
-def has_close_muts(bitvec: np.ndarray, min_gap: int):
- """ Return True if the bit vector has two mutations separated by
- fewer than `min_gap` non-mutated bits, otherwise False. """
- if bitvec.ndim != 1:
- raise ValueError(f"bitvec must have 1 dimension, but got {bitvec.ndim}")
- if min_gap < 0:
- raise ValueError(f"min_gap must be ≥ 0, but got {min_gap}")
- if min_gap == 0:
- # Two mutations cannot be separated by fewer than 0 positions.
- return False
- # Close mutations are separated from each other by less than min_gap
- # non-mutated bits. Equivalently, the difference in their positions
- # (their distance) is < min_gap + 1, or ≤ min_gap. These distances
- # are computed as the differences (using np.diff) in the positions
- # of consecutive mutations (using np.flatnonzero).
- dists = np.diff(np.flatnonzero(bitvec))
- return dists.size > 0 and np.min(dists) <= min_gap
-
-
-def label_close_muts(bitvecs: np.ndarray, min_gap: int):
- """ Return a 1D vector that is True for every row in `bitvecs` that
- has two mutations that are too close, and otherwise False. """
- if bitvecs.ndim != 2:
- raise ValueError(
- f"bitvects must have 2 dimensions, but got {bitvecs.ndim}")
- return np.array([has_close_muts(bitvec, min_gap) for bitvec in bitvecs])
-
-
-def drop_close_muts(bitvecs: np.ndarray, min_gap: int):
- """ Return a new array without every row in `bitvecs` that has two
- mutations that are too close. """
- return bitvecs[np.logical_not(label_close_muts(bitvecs, min_gap))]
-
-
-class TestHasCloseMuts(ut.TestCase):
- """ Test function `has_close_muts`. """
-
- def test_no_muts(self):
- """ Test that a bit vector with no mutations returns False. """
- n_pos = 5
- bitvec = np.zeros(n_pos, dtype=bool)
- for g in range(bitvec.size):
- self.assertFalse(has_close_muts(bitvec, g))
-
- def test_one_mut(self):
- """ Test that a bit vector with one mutation returns False. """
- n_pos = 5
- for i in range(n_pos):
- bitvec = np.zeros(n_pos, dtype=bool)
- bitvec[i] = 1
- for g in range(bitvec.size):
- self.assertFalse(has_close_muts(bitvec, g))
-
- def test_more_muts(self):
- """ Test every bit vector with 2 - 5 mutations. """
- bitvecs_gaps = {
- # 2 mutations (n = 10)
- (0, 0, 0, 1, 1): 0,
- (0, 0, 1, 0, 1): 1,
- (0, 0, 1, 1, 0): 0,
- (0, 1, 0, 0, 1): 2,
- (0, 1, 0, 1, 0): 1,
- (0, 1, 1, 0, 0): 0,
- (1, 0, 0, 0, 1): 3,
- (1, 0, 0, 1, 0): 2,
- (1, 0, 1, 0, 0): 1,
- (1, 1, 0, 0, 0): 0,
- # 3 mutations (n = 10)
- (0, 0, 1, 1, 1): 0,
- (0, 1, 0, 1, 1): 0,
- (0, 1, 1, 0, 1): 0,
- (0, 1, 1, 1, 0): 0,
- (1, 0, 0, 1, 1): 0,
- (1, 0, 1, 0, 1): 1,
- (1, 0, 1, 1, 0): 0,
- (1, 1, 0, 0, 1): 0,
- (1, 1, 0, 1, 0): 0,
- (1, 1, 1, 0, 0): 0,
- # 4 mutations (n = 5)
- (0, 1, 1, 1, 1): 0,
- (1, 0, 1, 1, 1): 0,
- (1, 1, 0, 1, 1): 0,
- (1, 1, 1, 0, 1): 0,
- (1, 1, 1, 1, 0): 0,
- # 5 mutations (n = 1)
- (1, 1, 1, 1, 1): 0,
- }
- for bitvec, bit_gap in bitvecs_gaps.items():
- for min_gap in range(len(bitvec)):
- self.assertEqual(has_close_muts(np.array(bitvec), min_gap),
- bit_gap < min_gap)
-
-
-class TestClip(ut.TestCase):
- """ Test function `mu.clip`. """
-
- def test_with_clip(self):
- """ Test that values outside [0, MAX_MU] are clipped. """
- n_pos = 64
- n_nan = 16
- min_scale = 1
- max_scale = 10
- nan_indexes = rng.choice(n_pos, n_nan, replace=False)
-
- class ClipFilter(Filter):
- """ Suppress warnings about invalid mutation rates. """
-
- def filter(self, rec: LogRecord):
- """ Suppress warnings about invalid mutation rates. """
- msg = f"Mutation rates outside [0, {MAX_MU}]"
- return not rec.msg.startswith(msg)
-
- for scale in range(min_scale, max_scale + 1):
- # Generate random mutation rates, some of which may not be
- # in the range [0, 1].
- mus = scale * rng.random(n_pos, dtype=float) - (scale - 1) / 2.
- # Set several values to NaN to ensure that clip can also
- # replace missing values with 0.
- mus[nan_indexes] = np.nan
- # Confirm that the values are NaN.
- self.assertEqual(np.count_nonzero(np.isnan(mus)), n_nan)
- # Suppress the warnings that mu.clip() issues for mutation
- # rates being outside the bounds, since in this case they
- # are out of bounds deliberately.
- algo_logger.addFilter(clip_filter := ClipFilter())
- try:
- # Clip the mutation rates to the bounds.
- clipped = clip(mus)
- finally:
- # Re-enable the warnings for mu.clip().
- algo_logger.removeFilter(clip_filter)
- # Test that all clipped mutation rates are in [0, MAX_MU].
- self.assertTrue(np.all(clipped >= 0.) and np.all(clipped <= MAX_MU))
- # Test that NaN values in mus become 0 values in clipped.
- self.assertEqual(np.count_nonzero(clipped[nan_indexes]), 0)
- self.assertFalse(np.any(np.isnan(clipped)))
- self.assertTrue(np.all(np.isnan(mus[nan_indexes])))
-
- def test_without_clip(self):
- """ Test that values inside [0, MAX_MU] are not clipped. """
- mus = rng.random(64, dtype=float) * MAX_MU
- self.assertTrue(np.allclose(mus, clip(mus)))
-
-
-class TestCalcFObsNumpy(ut.TestCase):
- """ Test function `mu.calc_f_obs_numpy`. """
-
- @ut.skip("Takes a long time to run: burdensome while debugging other tests")
- def test_obs_empirical(self):
- """ Test that this function accurately predicts the fraction of
- bit vectors without mutations that are too close. """
- n_pos = 16
- min_m, max_m = 0.01, 0.1
- # Choose the number of vectors to simulate as follows:
- # The number of bit vectors with mutations that are too close
- # follows a binomial distribution, whose std. dev. is
- # sqrt(p * (1 - p) * n).
- # The proportion of bit vectors is the above divided by n:
- # sqrt(p * (1 - p) / n).
- # Choosing a tolerance of 3 std. dev. around the mean yields
- # 3 * sqrt(p * (1 - p) / n) ≤ tol
- # Solving for n (the number of vectors) gives
- # n ≥ p * (1 - p) / (tol / 3)^2 = p * (1 - p) * (2 / tol)^2
- nstdev = 3. # number of standard deviations on each side
- tol = 5.e-4 # absolute tolerance for np.isclose
- n_vec = round(max_m * (1. - max_m) * (nstdev / tol) ** 2)
- # Choose random mutation rates.
- mus = min_m + rng.random(n_pos) * (max_m - min_m)
- # Test each minimum gap between mutations (g).
- for g in [0, 3, n_pos]:
- with self.subTest(g=g):
- # Generate random bit vectors with the expected mutation
- # rates and determine how many have mutations too close.
- n_close = sum(has_close_muts(np.less(rng.random(n_pos), mus), g)
- for _ in range(n_vec))
- # Find the simulated observed fraction of bit vectors.
- f_obs_sim = 1. - n_close / n_vec
- # Predict the observed fraction.
- f_obs_prd = calc_f_obs_numpy(mus, g)
- # Compare the empirical and predicted mutation rates.
- self.assertTrue(np.isclose(f_obs_sim, f_obs_prd,
- atol=tol, rtol=0.))
-
- def test_f_multiplex(self):
- """ Test that running 1 - 5 clusters simultaneously produces the
- same results as running each cluster separately. """
- n_pos = 16
- max_k = 5
- max_g = 4
- max_m = 0.2
- # Test each number of clusters (k).
- for k in range(max_k + 1):
- # Test each minimum gap between mutations (g).
- for g in range(max_g + 1):
- with self.subTest(k=k, g=g):
- # Generate random real mutation rates.
- mus = rng.random((n_pos, k)) * max_m
- # Compute the observed fractions simultaneously.
- f_obs_sim = calc_f_obs_numpy(mus, g)
- # Compute the fractions separately.
- f_obs_sep = np.empty_like(f_obs_sim)
- for i in range(k):
- f_obs_sep[i] = calc_f_obs_numpy(mus[:, i], g)
- # Compare the results.
- self.assertTrue(np.allclose(f_obs_sim, f_obs_sep))
-
- def test_1_dim(self):
- """ Test that giving a 1D array returns a float. """
- max_n = 5
- max_g = 4
- for n_pos in range(max_n + 1):
- for gap in range(max_g + 1):
- self.assertIsInstance(calc_f_obs_numpy(np.zeros((n_pos,)), gap),
- float)
-
- def test_2_dim(self):
- """ Test that giving a 2D array returns a 1D array with a value
- for each cluster. """
- max_n = 5
- max_c = 5
- max_g = 4
- for n_pos in range(max_n + 1):
- for n_clust in range(max_c + 1):
- for gap in range(max_g + 1):
- f_obs = calc_f_obs_numpy(np.zeros((n_pos, n_clust)), gap)
- self.assertIsInstance(f_obs, np.ndarray)
- self.assertEqual(f_obs.ndim, 1)
- self.assertEqual(f_obs.shape, (n_clust,))
-
- def test_invalid_dim(self):
- """ Test that other dimensionalities raise an error. """
- for n_dim in range(5):
- if n_dim == 1 or n_dim == 2:
- # Skip the dimensions that are valid.
- continue
- err_msg = f"Expected 1 or 2 dimensions, but got {n_dim}"
- for size in range(5):
- dims = (size,) * n_dim
- for gap in range(5):
- self.assertRaisesRegex(ValueError, err_msg,
- calc_f_obs_numpy,
- np.zeros(dims), gap)
-
-
-class TestCalcMuObs(ut.TestCase):
- """ Test function `mu._calc_mu_obs`. """
-
- @ut.skip("Takes a long time to run: burdensome while debugging other tests")
- def test_obs_empirical(self):
- """ Test that this function accurately predicts the mutation
- rates that are actually observed when simulated bit vectors are
- filtered to remove mutations that are too close. """
- n_pos = 10
- min_m, max_m = 0.01, 0.1
- # Choose the number of vectors to simulate as follows:
- # The number of mutations at each position in the simulated bit
- # vectors follows a binomial distribution, whose std. dev. is
- # sqrt(p * (1 - p) * n).
- # The proportion of mutations is the above divided by n:
- # sqrt(p * (1 - p) / n).
- # Choosing a tolerance of 3 std. dev. around the mean yields
- # 3 * sqrt(p * (1 - p) / n) ≤ tol
- # Solving for n (the number of vectors) gives
- # n ≥ p * (1 - p) / (tol / 3)^2 = p * (1 - p) * (2 / tol)^2
- nstdev = 3. # number of standard deviations on each side
- tol = 5.e-4 # absolute tolerance for np.allclose
- n_vec = round(max_m * (1. - max_m) * (nstdev / tol) ** 2)
- # Generate random real mutation rates.
- mus = min_m + rng.random(n_pos) * (max_m - min_m)
- # Generate random bit vectors with the expected mutation rates.
- bvecs = None
- while bvecs is None or not np.allclose(np.mean(bvecs, axis=0), mus,
- atol=tol, rtol=0.):
- bvecs = np.less(rng.random((n_vec, n_pos)), mus)
- # Test each minimum gap between mutations (g).
- for g in [0, 3, n_pos]:
- with self.subTest(g=g):
- # Drop bit vectors with mutations too close.
- bvecs_g = drop_close_muts(bvecs, g)
- # Compute the empirically observed mutation rates.
- mus_obs_emp = np.mean(bvecs_g, axis=0)
- # Predict the observed mutation rates with calc_mu_obs.
- mus_obs_prd = _calc_mu_obs(mus.reshape((-1, 1)), g).reshape(-1)
- # Compare the empirical and predicted mutation rates.
- self.assertTrue(np.allclose(mus_obs_emp, mus_obs_prd,
- atol=tol, rtol=0.))
-
- def test_mu_multiplex(self):
- """ Test that running 1 - 5 clusters simultaneously produces the
- same results as running each cluster separately. """
- n_pos = 16
- max_k = 5
- max_g = 4
- max_m = 0.2
- # Test each number of clusters (k).
- for k in range(max_k + 1):
- # Test each minimum gap between mutations (g).
- for g in range(max_g + 1):
- with self.subTest(k=k, g=g):
- # Generate random real mutation rates.
- mus = rng.random((n_pos, k)) * max_m
- # Adjust all rates simultaneously.
- mus_obs_sim = _calc_mu_obs(mus, g)
- # Adjust the rates of each cluster (i) separately.
- mus_obs_sep = np.empty_like(mus_obs_sim)
- for i in range(k):
- mus_i = mus[:, i].reshape((n_pos, 1))
- mus_obs_i = _calc_mu_obs(mus_i, g).reshape(n_pos)
- mus_obs_sep[:, i] = mus_obs_i
- # Compare the results.
- self.assertTrue(np.allclose(mus_obs_sim, mus_obs_sep))
-
- def test_inv_calc_mu_adj(self):
- """ Test that this function inverts `mu.calc_mu_adj`. """
- n_pos = 16
- max_k = 5
- max_g = 4
- max_m = 0.1
- # Test each number of clusters (k).
- for k in range(max_k + 1):
- # Generate random observed mutation rates.
- mus_obs = rng.random((n_pos, k)) * max_m
- # Test each minimum gap between mutations (g).
- for g in range(max_g + 1):
- with self.subTest(k=k, g=g):
- # Compute the adjusted mutation rates.
- mus_adj = calc_mu_adj_numpy(mus_obs, g)
- # Recompute the observed mutation rates.
- mus_reobs = _calc_mu_obs(mus_adj, g)
- # Compare observed and reobserved mutation rates.
- self.assertTrue(np.allclose(mus_obs, mus_reobs))
-
-
-class TestCalcMuAdjNumpy(ut.TestCase):
- """ Test function `mu.calc_mu_adj_numpy`. """
-
- def test_mu_multiplex(self):
- """ Test that running 1 - 5 clusters simultaneously produces the
- same results as running each cluster separately. """
- n_pos = 16
- max_k = 5
- max_g = 4
- max_m = 0.1
- # Test each number of clusters (k).
- for k in range(max_k + 1):
- # Test each minimum gap between mutations (g).
- for g in range(max_g + 1):
- with self.subTest(k=k, g=g):
- # Generate random observed mutation rates.
- mus_obs = rng.random((n_pos, k)) * max_m
- # Adjust all rates simultaneously.
- mus_adj_sim = calc_mu_adj_numpy(mus_obs, g)
- # Adjust the rates of each cluster (i) separately.
- mus_adj_sep = np.empty_like(mus_obs)
- for i in range(k):
- obs_i = mus_obs[:, i].reshape((n_pos, 1))
- adj_i = calc_mu_adj_numpy(obs_i, g).reshape(n_pos)
- mus_adj_sep[:, i] = adj_i
- # Compare the results.
- self.assertTrue(np.allclose(mus_adj_sim, mus_adj_sep))
-
- def test_inv_calc_mu_obs(self):
- """ Test that this function inverts `mu._calc_mu_obs`. """
- n_pos = 16
- max_k = 5
- max_g = 4
- max_m = 0.2
- # Test each number of clusters (k).
- for k in range(max_k + 1):
- # Generate random real mutation rates.
- mus = rng.random((n_pos, k)) * max_m
- # Test each minimum gap between mutations (g).
- for g in range(max_g + 1):
- with self.subTest(k=k, g=g):
- # Compute the observed mutation rates.
- mus_obs = _calc_mu_obs(mus, g)
- # Adjust the observed mutation rates.
- mus_adj = calc_mu_adj_numpy(mus_obs, g)
- # Test if adjusted and initial mutation rates match.
- self.assertTrue(np.allclose(mus_adj, mus))
-
-
-if __name__ == "__main__":
- ut.main()
-
-########################################################################
-# #
-# © Copyright 2024, the Rouskin Lab. #
-# #
-# This file is part of SEISMIC-RNA. #
-# #
-# SEISMIC-RNA is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# SEISMIC-RNA is distributed in the hope that it will be useful, but #
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
-# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
-# Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with SEISMIC-RNA; if not, see . #
-# #
-########################################################################
diff --git a/src/seismicrna/core/mu/unbias/tests/frame_test.py b/src/seismicrna/core/mu/unbias/tests/frame_test.py
deleted file mode 100644
index 16f33dd6..00000000
--- a/src/seismicrna/core/mu/unbias/tests/frame_test.py
+++ /dev/null
@@ -1,144 +0,0 @@
-import unittest as ut
-
-import numpy as np
-import pandas as pd
-
-from seismicrna.core.mu import (calc_f_obs_numpy,
- calc_mu_adj_numpy,
- calc_f_obs_frame,
- calc_mu_adj_frame)
-from seismicrna.core.seq import DNA, Section, seq_pos_to_index
-
-rng = np.random.default_rng()
-
-
-class TestCalcDataFrame(ut.TestCase):
- """ Test functions `mu.calc_mu_adj_df` and mu.calc_f_obs_df. """
-
- def test_equals_numpy(self):
- """ Check if the output of `calc_mu_adj_df` equals that of
- `calc_mu_adj_numpy` """
- max_mu = 0.1
- start = 1
- gaps = [0, 3]
- for length in range(1, 10):
- # Generate a random reference sequence.
- refseq = DNA.random(length)
- # Make a section for the sequence.
- section = Section("myref", refseq)
- for n_pos in range(length):
- # Choose a random set of positions, and sort them.
- pos = np.sort(rng.choice(length, n_pos, replace=False))
- # Make an index from those positions.
- index = seq_pos_to_index(refseq, pos + start, start)
- for n_clust in range(5):
- clusters = pd.Index([f"Cluster-{i}"
- for i in range(1, n_clust + 1)])
- # Generate random mutation rates.
- mus_obs_values = max_mu * rng.random((n_pos, n_clust))
- mus_obs_df = pd.DataFrame(mus_obs_values,
- index=index,
- columns=clusters)
- # To run calc_mu_adj_numpy, create an array of the
- # mutation rates where values in missing positions
- # are set to 0.
- mus_obs_np = np.zeros((length, n_clust))
- for i_value, i_numpy in enumerate(pos):
- mus_obs_np[i_numpy] = mus_obs_values[i_value]
- for gap in gaps:
- # Run calc_mu_adj_df.
- mus_adj_df = calc_mu_adj_frame(mus_obs_df, section, gap)
- # Run calc_mu_adj_numpy.
- mus_adj_np = calc_mu_adj_numpy(mus_obs_np, gap)
- # Compare the results.
- self.assertIsInstance(mus_adj_df, pd.DataFrame)
- self.assertTrue(np.allclose(mus_adj_df.values,
- mus_adj_np[pos]))
- self.assertTrue(index.equals(mus_adj_df.index))
- self.assertTrue(clusters.equals(mus_adj_df.columns))
- # Run calc_f_obs_df.
- f_obs_df = calc_f_obs_frame(mus_adj_df, section, gap)
- # Run calc_f_obs_numpy.
- f_obs_np = calc_f_obs_numpy(mus_adj_np, gap)
- # Compare the results.
- self.assertIsInstance(f_obs_df, pd.Series)
- self.assertTrue(np.allclose(f_obs_df.values,
- f_obs_np))
- self.assertTrue(clusters.equals(f_obs_df.index))
-
-
-class TestCalcSeries(ut.TestCase):
- """ Test `mu.calc_mu_adj_series` and mu.calc_f_obs_series. """
-
- def test_equals_numpy(self):
- """ Check if the output of `calc_mu_adj_df` equals that of
- `calc_mu_adj_numpy` """
- max_mu = 0.1
- start = 1
- gaps = [0, 3]
- for length in range(1, 10):
- # Generate a random reference sequence.
- refseq = DNA.random(length)
- # Make a section for the sequence.
- section = Section("myref", refseq)
- for n_pos in range(length):
- # Choose a random set of positions, and sort them.
- pos = np.sort(rng.choice(length, n_pos, replace=False))
- # Make an index from those positions.
- index = seq_pos_to_index(refseq, pos + start, start)
- # Generate random mutation rates.
- mus_obs_values = max_mu * rng.random(n_pos)
- mus_obs_series = pd.Series(mus_obs_values, index=index)
- # To run calc_mu_adj_numpy, create an array of the
- # mutation rates where values in missing positions
- # are set to 0.
- mus_obs_np = np.zeros(length)
- for i_value, i_numpy in enumerate(pos):
- mus_obs_np[i_numpy] = mus_obs_values[i_value]
- for gap in gaps:
- # Run calc_mu_adj_series.
- mus_adj_series = calc_mu_adj_frame(mus_obs_series,
- section,
- gap)
- # Run calc_mu_adj_numpy.
- mus_adj_np = calc_mu_adj_numpy(mus_obs_np, gap)
- # Compare the results.
- self.assertIsInstance(mus_adj_series, pd.Series)
- self.assertTrue(np.array_equal(mus_adj_series.values,
- mus_adj_np[pos]))
- self.assertTrue(index.equals(mus_adj_series.index))
- # Run calc_f_obs_series.
- f_obs_series = calc_f_obs_frame(mus_adj_series,
- section,
- gap)
- # Run calc_f_obs_numpy.
- f_obs_np = calc_f_obs_numpy(mus_adj_np, gap)
- # Compare the results.
- self.assertIsInstance(f_obs_series, float)
- self.assertIsInstance(f_obs_np, float)
- self.assertEqual(f_obs_series, f_obs_np)
-
-
-if __name__ == "__main__":
- ut.main()
-
-########################################################################
-# #
-# © Copyright 2024, the Rouskin Lab. #
-# #
-# This file is part of SEISMIC-RNA. #
-# #
-# SEISMIC-RNA is free software; you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# SEISMIC-RNA is distributed in the hope that it will be useful, but #
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- #
-# ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General #
-# Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with SEISMIC-RNA; if not, see . #
-# #
-########################################################################
diff --git a/src/seismicrna/core/report.py b/src/seismicrna/core/report.py
index a9a435f5..73f1bd17 100644
--- a/src/seismicrna/core/report.py
+++ b/src/seismicrna/core/report.py
@@ -47,6 +47,7 @@
opt_cram,
opt_min_reads,
opt_min_mapq,
+ opt_min_ncov_read,
opt_fold_temp,
opt_fold_md,
opt_fold_mfe,
@@ -354,6 +355,7 @@ def oconv_datetime(dtime: datetime):
"Maximum Fraction of Mutations per Position",
float,
oconv=get_oconv_float())
+MinNCovReadF = OptionField(opt_min_ncov_read)
MinMutGapF = Field("min_mut_gap",
"Minimum Gap Between Mutations (nt)",
int)
@@ -432,6 +434,12 @@ def oconv_datetime(dtime: datetime):
NumReadsInitF = Field("n_reads_init",
"Number of Reads Initially Given",
int)
+NumReadsLoNCovF = Field("n_reads_min_ncov",
+ "Number of Reads Cut -- Too Few Covered Positions",
+ int)
+NumReadsDiscontigF = Field("n_reads_discontig",
+ "Number of Reads Cut -- Discontiguous Mates",
+ int)
NumReadsLoInfoF = Field("n_reads_min_finfo",
"Number of Reads Cut -- Too Few Informative Positions",
int)
@@ -445,7 +453,7 @@ def oconv_datetime(dtime: datetime):
"Number of Reads Ultimately Kept",
int)
NumUniqReadKeptF = Field("n_uniq_reads",
- "Number of Unique Bit Vectors",
+ "Number of Unique Reads",
int)
# Cluster fields
diff --git a/src/seismicrna/core/rna/pair.py b/src/seismicrna/core/rna/pair.py
index 97dbc37b..f270c51f 100644
--- a/src/seismicrna/core/rna/pair.py
+++ b/src/seismicrna/core/rna/pair.py
@@ -3,7 +3,7 @@
import pandas as pd
-from ..seq import POS_INDEX, POS_NAME, Section
+from ..seq import POS_NAME, Section
logger = getLogger(__name__)
@@ -16,8 +16,8 @@ def pairs_to_dict(pairs: Iterable[tuple[int, int]]):
def add_pair(a: int, b: int):
""" Add a base pair at position `at` to position `to`. """
- if a < POS_INDEX:
- raise ValueError(f"Position must be ≥ {POS_INDEX}, but got {a}")
+ if a < 1:
+ raise ValueError(f"Position must be ≥ 1, but got {a}")
# Find the current pairing partner at this position.
if (to2 := pair_dict.get(a)) is None:
# There is no pairing partner at this position: add it.
diff --git a/src/seismicrna/core/seq/fasta.py b/src/seismicrna/core/seq/fasta.py
index 5cf2df39..e08c55ca 100644
--- a/src/seismicrna/core/seq/fasta.py
+++ b/src/seismicrna/core/seq/fasta.py
@@ -148,7 +148,7 @@ def write_fasta(fasta: Path,
if name in names:
raise ValueError(f"Duplicate reference name: '{name}'")
f.write(format_fasta_record(name, seq, wrap))
- logger.debug(f"Wrote reference '{name}' ({len(seq)} nt) "
+ logger.info(f"Wrote reference '{name}' ({len(seq)} nt) "
f"to {fasta}")
names.add(name)
except Exception as error:
diff --git a/src/seismicrna/core/seq/section.py b/src/seismicrna/core/seq/section.py
index 1ad41b24..0c851437 100644
--- a/src/seismicrna/core/seq/section.py
+++ b/src/seismicrna/core/seq/section.py
@@ -23,9 +23,6 @@
logger = getLogger(__name__)
-# Positions are 1-indexed.
-POS_INDEX = 1
-
# Names of the section index levels.
POS_NAME = "Position"
BASE_NAME = "Base"
@@ -443,6 +440,13 @@ def masked_int(self) -> np.ndarray:
# Do not cache this method since self._masks can change.
return reduce(np.union1d, self._masks.values(), np.array([], int))
+ @property
+ def masked_zero(self) -> np.ndarray:
+ """ Masked positions as integers (0-indexed with respect to the
+ first position in the section). """
+ # Do not cache this method since self.masked_int can change.
+ return self.masked_int - self.end5
+
@property
def masked_bool(self) -> np.ndarray:
""" Masked positions as a boolean array. """
@@ -457,10 +461,17 @@ def unmasked_bool(self) -> np.ndarray:
@property
def unmasked_int(self) -> np.ndarray:
- """ Unmasked positions as integers. """
+ """ Unmasked positions as integers (1-indexed). """
# Do not cache this method since self.unmasked_bool can change.
return self.range_int[self.unmasked_bool]
+ @property
+ def unmasked_zero(self) -> np.ndarray:
+ """ Unmasked positions as integers (0-indexed with respect to
+ the first position in the section). """
+ # Do not cache this method since self.unmasked_int can change.
+ return self.unmasked_int - self.end5
+
@property
def unmasked(self):
""" Index of unmasked positions in the section. """
@@ -796,7 +807,7 @@ class SectionFinder(Section):
def __init__(self,
ref: str,
seq: DNA, *,
- seq5: int = POS_INDEX,
+ seq5: int = 1,
end5: int | None = None,
end3: int | None = None,
fwd: DNA | None = None,
diff --git a/src/seismicrna/core/seq/tests/section_test.py b/src/seismicrna/core/seq/tests/section_test.py
index 50d1bbc6..d48dfccf 100644
--- a/src/seismicrna/core/seq/tests/section_test.py
+++ b/src/seismicrna/core/seq/tests/section_test.py
@@ -5,7 +5,6 @@
from seismicrna.core.seq.section import (BASE_NAME,
FULL_NAME,
- POS_INDEX,
POS_NAME,
SEQ_INDEX_NAMES,
Section,
@@ -26,10 +25,6 @@ class TestConstants(ut.TestCase):
def test_full_name(self):
self.assertEqual(FULL_NAME, "full")
- def test_pos_index(self):
- """ Test that sequence positions are 1-indexed. """
- self.assertEqual(POS_INDEX, 1)
-
def test_pos_name(self):
self.assertEqual(POS_NAME, "Position")
@@ -867,6 +862,17 @@ def test_masked_int(self):
expect = np.array([49, 52, 54, 55, 58])
self.assertTrue(np.array_equal(section.masked_int, expect))
+ def test_masked_zero(self):
+ seq = DNA("CCCGCATCCCGACCAACACTAAGA")
+ seq5 = 38
+ end5 = 46
+ end3 = 58
+ section = Section("myref", seq, seq5=seq5, end5=end5, end3=end3)
+ section.add_mask("mymask1", [49, 54, 58])
+ section.add_mask("mymask2", [55, 49, 52])
+ expect = np.array([3, 6, 8, 9, 12])
+ self.assertTrue(np.array_equal(section.masked_zero, expect))
+
class TestSectionUnmasked(ut.TestCase):
@@ -892,6 +898,17 @@ def test_unmasked_int(self):
expect = np.array([46, 47, 48, 50, 51, 53, 56, 57])
self.assertTrue(np.array_equal(section.unmasked_int, expect))
+ def test_unmasked_zero(self):
+ seq = DNA("CCCGCATCCCGACCAACACTAAGA")
+ seq5 = 38
+ end5 = 46
+ end3 = 58
+ section = Section("myref", seq, seq5=seq5, end5=end5, end3=end3)
+ section.add_mask("mymask1", [49, 54, 58])
+ section.add_mask("mymask2", [55, 49, 52])
+ expect = np.array([0, 1, 2, 4, 5, 7, 10, 11])
+ self.assertTrue(np.array_equal(section.unmasked_zero, expect))
+
def test_unmasked(self):
seq = DNA("CCCGCATCCCGACCAACACTAAGA")
seq5 = 38
diff --git a/src/seismicrna/core/tests/dims_test.py b/src/seismicrna/core/tests/dims_test.py
new file mode 100644
index 00000000..0d9e4a61
--- /dev/null
+++ b/src/seismicrna/core/tests/dims_test.py
@@ -0,0 +1,245 @@
+import unittest as ut
+
+import numpy as np
+
+from seismicrna.core.dims import find_dims, triangular
+
+
+class TestFindDims(ut.TestCase):
+
+ def test_empty(self):
+ arrays = []
+ dims = []
+ self.assertEqual(find_dims(dims, arrays), {})
+
+ def test_0d(self):
+ arrays = [np.zeros(())]
+ dims = [()]
+ self.assertEqual(find_dims(dims, arrays), {})
+
+ def test_1d(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [("x",)]
+ self.assertEqual(find_dims(dims, arrays), {"x": x})
+
+ def test_2d(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y))]
+ dims = [("x", "y")]
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+
+ def test_1d_1d_separate(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros(x), np.zeros(y)]
+ dims = [("x",), ("y",)]
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+
+ def test_1d_1d_crossed(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros(x), np.zeros(y)]
+ dims = [("x",), ("x",)]
+ if x == y:
+ self.assertEqual(find_dims(dims, arrays), {"x": x})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Got multiple sizes for dimension",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_1d_2d_congruent(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros(x), np.zeros((y, x))]
+ dims = [("x",), ("y", "x")]
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+
+ def test_1d_2d_crossed(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros(y), np.zeros((y, x))]
+ dims = [("x",), ("y", "x")]
+ if x == y:
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Got multiple sizes for dimension",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_2d_2d_congruent(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y)), np.zeros((y, x))]
+ dims = [("x", "y"), ("y", "x")]
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+
+ def test_2d_2d_crossed(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y)), np.zeros((y, x))]
+ dims = [("x", "y"), ("x", "y")]
+ if x == y:
+ self.assertEqual(find_dims(dims, arrays), {"x": x, "y": y})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Got multiple sizes for dimension",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_0d_none(self):
+ arrays = [np.zeros(())]
+ dims = [(None,)]
+ self.assertEqual(find_dims(dims, arrays), {})
+
+ def test_0d_1dim(self):
+ arrays = [np.zeros(())]
+ dims = [("x",)]
+ self.assertRaisesRegex(ValueError,
+ "Array 'array0' must have 1",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_1d_0dim_none(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [(None,)]
+ self.assertEqual(find_dims(dims, arrays), {})
+
+ def test_1d_1dim_none(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [("x", None)]
+ self.assertEqual(find_dims(dims, arrays), {"x": x})
+
+ def test_1d_2dim(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [("x", "y")]
+ self.assertRaisesRegex(ValueError,
+ "Array 'array0' must have 2",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_1d_2dim_none(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [("x", "y", None)]
+ self.assertRaisesRegex(ValueError,
+ "Array 'array0' must have ≥ 2",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_2d_1dim_none(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y))]
+ dims = [("x", None)]
+ self.assertEqual(find_dims(dims, arrays), {"x": x})
+
+ def test_none_2d(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y))]
+ dims = [(None, "y")]
+ self.assertRaisesRegex(TypeError,
+ "The name of each dimension must be str",
+ find_dims,
+ dims,
+ arrays)
+
+ def test_0d_nonzero(self):
+ arrays = [np.zeros(())]
+ dims = [(None,)]
+ self.assertEqual(find_dims(dims, arrays, nonzero=True), {})
+
+ def test_0d_nonzero_extra(self):
+ arrays = [np.zeros(())]
+ dims = [(None,)]
+ self.assertRaisesRegex(ValueError,
+ "Unknown dimension for nonzero: 'x'",
+ find_dims,
+ dims,
+ arrays,
+ nonzero="x")
+
+ def test_1d_nonzero(self):
+ for x in range(5):
+ arrays = [np.zeros(x)]
+ dims = [("x",)]
+ if x:
+ self.assertEqual(find_dims(dims, arrays, nonzero="x"), {"x": x})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Size of dimension 'x' must be ≥ 1, "
+ "but got 0",
+ find_dims,
+ dims,
+ arrays,
+ nonzero="x")
+
+ def test_2d_nonzero(self):
+ for x in range(5):
+ for y in range(5):
+ arrays = [np.zeros((x, y))]
+ dims = [("x", "y")]
+ if x:
+ self.assertEqual(find_dims(dims, arrays, nonzero="x"),
+ {"x": x, "y": y})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Size of dimension 'x' must be ≥ 1, "
+ "but got 0",
+ find_dims,
+ dims,
+ arrays,
+ nonzero="x")
+ if y:
+ self.assertEqual(find_dims(dims, arrays, nonzero="y"),
+ {"x": x, "y": y})
+ else:
+ self.assertRaisesRegex(ValueError,
+ "Size of dimension 'y' must be ≥ 1, "
+ "but got 0",
+ find_dims,
+ dims,
+ arrays,
+ nonzero="y")
+ self.assertRaisesRegex(ValueError,
+ "Unknown dimension for nonzero: 'z'",
+ find_dims,
+ dims,
+ arrays,
+ nonzero="z")
+
+
+class TestTriangular(ut.TestCase):
+
+ def test_whole_numbers(self):
+ for n in range(10):
+ self.assertEqual(triangular(n), sum(range(1, n + 1)))
+
+ def test_negative(self):
+ self.assertRaisesRegex(ValueError,
+ "n must be ≥ 0, but got -1",
+ triangular,
+ -1)
+
+ def test_float(self):
+ self.assertRaisesRegex(TypeError,
+ "n must be int, but got float",
+ triangular,
+ 1.)
+
+
+if __name__ == "__main__":
+ ut.main()
diff --git a/src/seismicrna/core/version.py b/src/seismicrna/core/version.py
index 9119adbb..18175d26 100644
--- a/src/seismicrna/core/version.py
+++ b/src/seismicrna/core/version.py
@@ -6,7 +6,7 @@
logger = getLogger(__name__)
-__version__ = "0.14.1"
+__version__ = "0.15.0"
VERSION_DELIM = "."
diff --git a/src/seismicrna/export/web.py b/src/seismicrna/export/web.py
index 11a3c848..4fca2676 100644
--- a/src/seismicrna/export/web.py
+++ b/src/seismicrna/export/web.py
@@ -29,8 +29,7 @@
from ..table.base import (Table,
PosTable,
ReadTable,
- ClustFreqTable,
- R_ADJ_TITLE)
+ ClustFreqTable)
logger = getLogger(__name__)
@@ -195,10 +194,9 @@ def iter_read_table_data(table: ReadTable, order: int, clust: int):
def iter_clust_table_data(table: ClustFreqTable, order: int, clust: int):
- reads_adj = table.data.loc[R_ADJ_TITLE]
- clust_count = reads_adj[table.header.select(order=order,
- clust=clust)].squeeze()
- order_count = reads_adj[table.header.select(order=order)].sum().squeeze()
+ clust_count = table.data[table.header.select(order=order,
+ clust=clust)].squeeze()
+ order_count = table.data[table.header.select(order=order)].sum().squeeze()
proportion = (round(clust_count / order_count, PRECISION)
if order_count > 0
else np.nan)
diff --git a/src/seismicrna/mask/batch.py b/src/seismicrna/mask/batch.py
index fc2b9489..b8d3e32d 100644
--- a/src/seismicrna/mask/batch.py
+++ b/src/seismicrna/mask/batch.py
@@ -1,4 +1,5 @@
from abc import ABC
+from logging import getLogger
from typing import Iterable
import numpy as np
@@ -6,8 +7,11 @@
from ..core.batch import (RefseqMutsBatch,
PartialMutsBatch,
PartialReadBatch,
+ has_mids,
sanitize_pos)
+logger = getLogger(__name__)
+
class MaskReadBatch(PartialReadBatch):
@@ -21,12 +25,21 @@ def read_nums(self):
class MaskMutsBatch(MaskReadBatch, RefseqMutsBatch, PartialMutsBatch, ABC):
- pass
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ if self.num_discontiguous_reads:
+ raise ValueError(
+ f"{self} has {self.num_discontiguous_reads} discontiguous "
+ "paired-end reads, which are not (yet) supported for masking"
+ )
def apply_mask(batch: RefseqMutsBatch,
reads: Iterable[int] | None = None,
- positions: Iterable[int] | None = None):
+ positions: Iterable[int] | None = None,
+ clip5: int | None = None,
+ clip3: int | None = None):
# Determine masked read numbers.
masked_reads = (np.setdiff1d(batch.read_nums, reads)
if reads is not None
@@ -37,27 +50,55 @@ def apply_mask(batch: RefseqMutsBatch,
# Select mutations at each position.
muts = dict()
for pos in positions if positions is not None else batch.pos_nums:
+ if clip5 is not None and pos < clip5:
+ logger.warning(f"Skipped clipped position {pos} (< {clip5})")
+ continue
+ if clip3 is not None and pos > clip3:
+ logger.warning(f"Skipped clipped position {pos} (> {clip3})")
+ continue
muts[pos] = dict()
# Remove masked reads with each type of mutation at this position.
for mut, pos_mut_reads in batch.muts.get(pos, dict()).items():
muts[pos][mut] = (np.setdiff1d(pos_mut_reads,
- masked_reads,
- assume_unique=True)
+ masked_reads,
+ assume_unique=True)
if reads is not None
else pos_mut_reads)
if reads is not None:
+ # Select specific read indexes.
read_nums = np.asarray(reads, dtype=batch.read_dtype)
read_indexes = batch.read_indexes[read_nums]
end5s = batch.end5s[read_indexes]
- mid5s = batch.mid5s[read_indexes]
- mid3s = batch.mid3s[read_indexes]
end3s = batch.end3s[read_indexes]
+ if has_mids(batch.mid5s, batch.mid3s):
+ mid5s = batch.mid5s[read_indexes]
+ mid3s = batch.mid3s[read_indexes]
+ else:
+ mid5s = None
+ mid3s = None
else:
+ # Use all reads.
read_nums = batch.read_nums
end5s = batch.end5s
+ end3s = batch.end3s
mid5s = batch.mid5s
mid3s = batch.mid3s
- end3s = batch.end3s
+ # Clip the 5' and 3' end and middle coordinates.
+ if clip5 is not None or clip3 is not None:
+ if clip5 is not None and clip3 is not None and clip5 > clip3:
+ raise ValueError("Must have clip5 ≤ clip3, "
+ f"but got {clip5} > {clip3}")
+ if clip5 is not None:
+ end5s = np.maximum(end5s, clip5)
+ if clip3 is not None:
+ end3s = np.minimum(end3s, clip3)
+ if clip5 is not None and mid5s is not None:
+ mid5s = np.minimum(end3s, np.maximum(mid5s, clip5))
+ if clip3 is not None and mid3s is not None:
+ mid3s = np.maximum(end5s, np.minimum(mid3s, clip3))
+ sanitize = True
+ else:
+ sanitize = False
return MaskMutsBatch(batch=batch.batch,
refseq=batch.refseq,
muts=muts,
@@ -66,7 +107,7 @@ def apply_mask(batch: RefseqMutsBatch,
mid5s=mid5s,
mid3s=mid3s,
end3s=end3s,
- sanitize=False)
+ sanitize=sanitize)
########################################################################
# #
diff --git a/src/seismicrna/mask/data.py b/src/seismicrna/mask/data.py
index be240f0e..bd0ef026 100644
--- a/src/seismicrna/mask/data.py
+++ b/src/seismicrna/mask/data.py
@@ -67,7 +67,9 @@ def section(self):
def _chain(self, batch1: RelateRefseqBatch, batch2: MaskBatchIO):
return apply_mask(batch1,
batch2.read_nums,
- getattr(self.data2, "pos_kept"))
+ self.section.unmasked_int,
+ clip5=self.section.end5,
+ clip3=self.section.end3)
load_mask_dataset = LoadFunction(MaskMutsDataset)
diff --git a/src/seismicrna/mask/main.py b/src/seismicrna/mask/main.py
index b7b23b8e..a8437a9e 100644
--- a/src/seismicrna/mask/main.py
+++ b/src/seismicrna/mask/main.py
@@ -20,6 +20,7 @@
opt_exclude_polya,
opt_exclude_gu,
opt_exclude_file,
+ opt_min_ncov_read,
opt_min_finfo_read,
opt_max_fmut_read,
opt_min_mut_gap,
@@ -36,41 +37,25 @@
logger = getLogger(__name__)
-params = [
- # Input/output paths
- arg_input_path,
- # Sections
- opt_coords,
- opt_primers,
- opt_primer_gap,
- opt_sections_file,
- # Mutation counting
- opt_count_del,
- opt_count_ins,
- opt_discount_mut,
- # Filtering
- opt_exclude_polya,
- opt_exclude_gu,
- opt_exclude_file,
- opt_min_finfo_read,
- opt_max_fmut_read,
- opt_min_mut_gap,
- opt_min_ninfo_pos,
- opt_max_fmut_pos,
- # Compression
- opt_brotli_level,
- # Parallelization
- opt_max_procs,
- opt_parallel,
- # Effort
- opt_force,
-]
-
-@command(CMD_MASK, params=params)
-def cli(*args, **kwargs):
- """ Define mutations and sections to filter reads and positions. """
- return run(*args, **kwargs)
+def load_sections(input_path: Iterable[str | Path],
+ coords: Iterable[tuple[str, int, int]],
+ primers: Iterable[tuple[str, DNA, DNA]],
+ primer_gap: int,
+ sections_file: Path | None = None):
+ """ Open sections of relate reports. """
+ # Load all datasets, grouped by their reference names.
+ datasets = defaultdict(list)
+ for dataset in load_datasets(input_path, load_relate_pool_dataset):
+ datasets[dataset.ref].append(dataset)
+ # Determine the sections for each reference in the datasets.
+ sections = RefSections({(loader.ref, loader.refseq)
+ for loader in chain(*datasets.values())},
+ coords=coords,
+ primers=primers,
+ primer_gap=primer_gap,
+ sects_file=sections_file)
+ return datasets, sections
@docdef.auto()
@@ -88,11 +73,12 @@ def run(input_path: tuple[str, ...], *,
exclude_polya: int,
exclude_gu: bool,
exclude_file: str | None,
+ min_ninfo_pos: int,
+ max_fmut_pos: float,
+ min_ncov_read: int,
min_finfo_read: float,
max_fmut_read: int,
min_mut_gap: int,
- min_ninfo_pos: int,
- max_fmut_pos: float,
# Compression
brotli_level: int,
# Parallelization
@@ -122,6 +108,7 @@ def run(input_path: tuple[str, ...], *,
exclude_file=(Path(exclude_file)
if exclude_file
else None),
+ min_ncov_read=min_ncov_read,
min_finfo_read=min_finfo_read,
max_fmut_read=max_fmut_read,
min_mut_gap=min_mut_gap,
@@ -139,24 +126,42 @@ def run(input_path: tuple[str, ...], *,
return list(map(Path, reports))
-def load_sections(input_path: Iterable[str | Path],
- coords: Iterable[tuple[str, int, int]],
- primers: Iterable[tuple[str, DNA, DNA]],
- primer_gap: int,
- sections_file: Path | None = None):
- """ Open sections of relate reports. """
- # Load all datasets, grouped by their reference names.
- datasets = defaultdict(list)
- for dataset in load_datasets(input_path, load_relate_pool_dataset):
- datasets[dataset.ref].append(dataset)
- # Determine the sections for each reference in the datasets.
- sections = RefSections({(loader.ref, loader.refseq)
- for loader in chain(*datasets.values())},
- coords=coords,
- primers=primers,
- primer_gap=primer_gap,
- sects_file=sections_file)
- return datasets, sections
+params = [
+ # Input/output paths
+ arg_input_path,
+ # Sections
+ opt_coords,
+ opt_primers,
+ opt_primer_gap,
+ opt_sections_file,
+ # Mutation counting
+ opt_count_del,
+ opt_count_ins,
+ opt_discount_mut,
+ # Filtering
+ opt_exclude_polya,
+ opt_exclude_gu,
+ opt_exclude_file,
+ opt_min_ninfo_pos,
+ opt_max_fmut_pos,
+ opt_min_ncov_read,
+ opt_min_finfo_read,
+ opt_max_fmut_read,
+ opt_min_mut_gap,
+ # Compression
+ opt_brotli_level,
+ # Parallelization
+ opt_max_procs,
+ opt_parallel,
+ # Effort
+ opt_force,
+]
+
+
+@command(CMD_MASK, params=params)
+def cli(*args, **kwargs):
+ """ Define mutations and sections to filter reads and positions. """
+ return run(*args, **kwargs)
########################################################################
# #
diff --git a/src/seismicrna/mask/report.py b/src/seismicrna/mask/report.py
index 4532dc36..efb3aae4 100644
--- a/src/seismicrna/mask/report.py
+++ b/src/seismicrna/mask/report.py
@@ -26,10 +26,13 @@
PosCutLoInfoF,
PosCutHiMutF,
PosKeptF,
+ MinNCovReadF,
MinInfoReadF,
MaxMutReadF,
MinMutGapF,
NumReadsInitF,
+ NumReadsDiscontigF,
+ NumReadsLoNCovF,
NumReadsLoInfoF,
NumReadsHiMutF,
NumReadsCloseMutF,
@@ -79,11 +82,14 @@ def fields(cls):
PosCutHiMutF,
PosKeptF,
# Read filtering parameters.
+ MinNCovReadF,
MinInfoReadF,
MaxMutReadF,
MinMutGapF,
# Read filtering results.
NumReadsInitF,
+ NumReadsDiscontigF,
+ NumReadsLoNCovF,
NumReadsLoInfoF,
NumReadsHiMutF,
NumReadsCloseMutF,
diff --git a/src/seismicrna/mask/write.py b/src/seismicrna/mask/write.py
index 6f4d94e9..fd644f96 100644
--- a/src/seismicrna/mask/write.py
+++ b/src/seismicrna/mask/write.py
@@ -14,8 +14,8 @@
from .batch import apply_mask
from .io import MaskBatchIO
from .report import MaskReport
+from ..core.arg import docdef
from ..core.batch import RefseqMutsBatch, accum_per_pos
-from ..core.io import DEFAULT_BROTLI_LEVEL
from ..core.rel import RelPattern
from ..core.seq import FIELD_REF, POS_NAME, Section, index_to_pos
from ..core.write import need_write
@@ -30,6 +30,8 @@ class RelMasker(object):
PATTERN_KEY = "pattern"
MASK_READ_INIT = "read-init"
+ MASK_READ_DISCONTIG = "read-discontig"
+ MASK_READ_NCOV = "read-ncov"
MASK_READ_FINFO = "read-finfo"
MASK_READ_FMUT = "read-fmut"
MASK_READ_GAP = "read-gap"
@@ -38,19 +40,21 @@ class RelMasker(object):
MASK_POS_FMUT = "pos-fmut"
CHECKSUM_KEY = MaskReport.get_batch_type().btype()
+ @docdef.auto()
def __init__(self,
dataset: RelateDataset | PoolDataset,
section: Section,
pattern: RelPattern, *,
- exclude_polya: int = 0,
- exclude_gu: bool = False,
- exclude_file: Path | None = None,
- min_mut_gap: int = 0,
- min_finfo_read: float = 0.,
- max_fmut_read: float = 1.,
- min_ninfo_pos: int = 0,
- max_fmut_pos: float = 1.,
- brotli_level: int = DEFAULT_BROTLI_LEVEL):
+ exclude_polya: int,
+ exclude_gu: bool,
+ exclude_file: Path | None,
+ min_ncov_read: int,
+ min_finfo_read: float,
+ max_fmut_read: float,
+ min_mut_gap: int,
+ min_ninfo_pos: int,
+ max_fmut_pos: float,
+ brotli_level: int):
"""
Parameters
----------
@@ -60,30 +64,6 @@ def __init__(self,
The section over which to mask
pattern: RelPattern
Relationship pattern
- exclude_polya: int = 0
- Exclude stretches of consecutive A bases at least this long.
- If 0, exclude no bases. Must be ≥ 0.
- exclude_gu: bool = False
- Whether to exclude G and U bases.
- exclude_file: Path | None = None
- File of additional, arbitrary positions to exclude.
- min_mut_gap: int = 0
- Filter out reads with any two mutations separated by fewer
- than `min_mut_gap` positions. Adjacent mutations have a
- gap of 0. If 0, keep all. Must be ≥ 0, < length_of_section.
- min_finfo_read: float = 0.0
- Filter out reads with less than this fraction of informative
- bases (i.e. match or mutation). If 0.0, keep all. Must be
- ≥ 0, ≤ 1.
- max_fmut_read: float = 1.0
- Filter out reads with more than this fraction of mutated
- bases. If 1.0, keep all. Must be ≥ 0, ≤ 1.
- min_ninfo_pos: int = 0
- Filter out positions with less than this number of informative
- bases. Must be ≥ 0.
- max_fmut_pos: float = 1.0
- Filter out positions with more than this fraction of mutated
- reads. Must be ≥ 0, ≤ 1.
"""
# Set the general parameters.
self.dataset = dataset
@@ -98,6 +78,7 @@ def __init__(self,
self.exclude_gu = exclude_gu
self.exclude_pos = self._get_exclude_pos(exclude_file)
# Set the parameters for filtering reads.
+ self.min_ncov_read = min_ncov_read
self.min_mut_gap = min_mut_gap
self.min_finfo_read = min_finfo_read
self.max_fmut_read = max_fmut_read
@@ -108,9 +89,9 @@ def __init__(self,
f"min_ninfo_pos must be ≥ 0, but got {min_ninfo_pos}"
)
self.min_ninfo_pos = min_ninfo_pos
- if not 0. <= max_fmut_pos <= 1.:
+ if not 0. <= max_fmut_pos < 1.:
raise ValueError(
- f"max_fmut_pos Must be ≥ 0, ≤ 1, but got {max_fmut_pos}"
+ f"max_fmut_pos Must be ≥ 0, < 1, but got {max_fmut_pos}"
)
self.max_fmut_pos = max_fmut_pos
# Set the parameters for saving files.
@@ -122,6 +103,14 @@ def __init__(self,
def n_reads_init(self):
return self._n_reads[self.MASK_READ_INIT]
+ @property
+ def n_reads_min_ncov(self):
+ return self._n_reads[self.MASK_READ_NCOV]
+
+ @property
+ def n_reads_discontig(self):
+ return self._n_reads[self.MASK_READ_DISCONTIG]
+
@property
def n_reads_min_finfo(self):
return self._n_reads[self.MASK_READ_FINFO]
@@ -196,10 +185,32 @@ def _get_exclude_pos(self, exclude_file: Path | None):
exclude_pos = list()
return np.asarray(exclude_pos, dtype=int)
+ def _filter_discontig_read(self, batch: RefseqMutsBatch):
+ """ Filter out reads with discontiguous mates. """
+ # Find the reads with contiguous mates.
+ reads = batch.read_nums[batch.contiguous_reads]
+ logger.debug(f"{self} kept {reads.size} reads with coverage "
+ f"≥ {self.min_ncov_read} in {batch}")
+ # Return a new batch of only those reads.
+ return apply_mask(batch, reads)
+
+ def _filter_min_ncov_read(self, batch: RefseqMutsBatch):
+ """ Filter out reads with too few covered positions. """
+ if self.min_ncov_read < 1:
+ raise ValueError(f"min_ncov_read must be ≥ 1, but got "
+ f"{self.min_ncov_read}")
+ # Find the reads with sufficiently many covered positions.
+ reads = batch.read_nums[batch.cover_per_read.values.sum(axis=1)
+ >= self.min_ncov_read]
+ logger.debug(f"{self} kept {reads.size} reads with coverage "
+ f"≥ {self.min_ncov_read} in {batch}")
+ # Return a new batch of only those reads.
+ return apply_mask(batch, reads)
+
def _filter_min_finfo_read(self, batch: RefseqMutsBatch):
""" Filter out reads with too few informative positions. """
if not 0. <= self.min_finfo_read <= 1.:
- raise ValueError(f"min_finfo_read Must be ≥ 0, ≤ 1, but got "
+ raise ValueError(f"min_finfo_read must be ≥ 0, ≤ 1, but got "
f"{self.min_finfo_read}")
if self.min_finfo_read == 0.:
# All reads have sufficiently many informative positions.
@@ -208,8 +219,7 @@ def _filter_min_finfo_read(self, batch: RefseqMutsBatch):
return batch
# Find the reads with sufficiently many informative positions.
info, muts = batch.count_per_read(self.pattern)
- with np.errstate(invalid="ignore"):
- finfo_read = info.values / self.pos_kept.size
+ finfo_read = info.values / batch.cover_per_read.values.sum(axis=1)
reads = info.index[finfo_read >= self.min_finfo_read]
logger.debug(f"{self} kept {reads.size} reads with informative "
f"fractions ≥ {self.min_finfo_read} in {batch}")
@@ -219,7 +229,7 @@ def _filter_min_finfo_read(self, batch: RefseqMutsBatch):
def _filter_max_fmut_read(self, batch: RefseqMutsBatch):
""" Filter out reads with too many mutations. """
if not 0. <= self.max_fmut_read <= 1.:
- raise ValueError(f"max_fmut_read Must be ≥ 0, ≤ 1, but got "
+ raise ValueError(f"max_fmut_read must be ≥ 0, ≤ 1, but got "
f"{self.max_fmut_read}")
if self.max_fmut_read == 1.:
# All reads have sufficiently few mutations.
@@ -246,7 +256,7 @@ def _mask_min_mut_gap(self, batch: RefseqMutsBatch):
logger.debug(f"{self} skipped filtering reads with pairs of "
f"mutations too close in {batch}")
return batch
- reads = batch.nonprox_muts(self.pattern, self.min_mut_gap)
+ reads = batch.reads_noclose_muts(self.pattern, self.min_mut_gap)
logger.debug(f"{self} kept {reads.size} reads with no two mutations "
f"separated by < {self.min_mut_gap} nt in {batch}")
return apply_mask(batch, reads)
@@ -261,9 +271,16 @@ def _exclude_positions(self):
def _filter_batch_reads(self, batch: RefseqMutsBatch):
""" Remove the reads in the batch that do not pass the filters
and return a new batch without those reads. """
+ # Determine the initial number of reads in the batch.
+ self._n_reads[self.MASK_READ_INIT] += (n := batch.num_reads)
+ # Remove reads with discontiguous mates.
+ batch = self._filter_discontig_read(batch)
+ self._n_reads[self.MASK_READ_DISCONTIG] += (n - (n := batch.num_reads))
# Keep only the unmasked positions.
batch = apply_mask(batch, positions=self.pos_kept)
- self._n_reads[self.MASK_READ_INIT] += (n := batch.num_reads)
+ # Remove reads with too few covered positions.
+ batch = self._filter_min_ncov_read(batch)
+ self._n_reads[self.MASK_READ_NCOV] += (n - (n := batch.num_reads))
# Remove reads with too few informative positions.
batch = self._filter_min_finfo_read(batch)
self._n_reads[self.MASK_READ_FINFO] += (n - (n := batch.num_reads))
@@ -346,10 +363,13 @@ def create_report(self, began: datetime, ended: datetime):
pos_min_ninfo=self.pos_min_ninfo,
pos_max_fmut=self.pos_max_fmut,
pos_kept=self.pos_kept,
+ min_ncov_read=self.min_ncov_read,
min_finfo_read=self.min_finfo_read,
max_fmut_read=self.max_fmut_read,
min_mut_gap=self.min_mut_gap,
n_reads_init=self.n_reads_init,
+ n_reads_min_ncov=self.n_reads_min_ncov,
+ n_reads_discontig=self.n_reads_discontig,
n_reads_min_finfo=self.n_reads_min_finfo,
n_reads_max_fmut=self.n_reads_max_fmut,
n_reads_min_gap=self.n_reads_min_gap,
diff --git a/src/seismicrna/relate/aux/infer.py b/src/seismicrna/relate/aux/infer.py
index a618e86c..99a604be 100644
--- a/src/seismicrna/relate/aux/infer.py
+++ b/src/seismicrna/relate/aux/infer.py
@@ -16,7 +16,7 @@
ANY_N,
IRREC,
NOCOV)
-from ...core.seq import BASEN, POS_INDEX, DNA
+from ...core.seq import BASEN, DNA
def infer_read(refseq: DNA,
@@ -58,8 +58,8 @@ def infer_read(refseq: DNA,
"""
# Validate the relation vector and reference sequence.
- if end5 < POS_INDEX:
- raise ValueError(f"end5 must be ≥ {POS_INDEX}, but got {end5}")
+ if end5 < 1:
+ raise ValueError(f"end5 must be ≥ 1, but got {end5}")
if end3 > len(refseq):
raise ValueError(f"end3 must be ≤ {len(refseq)}, but got {end3}")
if muts:
diff --git a/src/seismicrna/relate/batch.py b/src/seismicrna/relate/batch.py
index f5c9515d..ecc8fe12 100644
--- a/src/seismicrna/relate/batch.py
+++ b/src/seismicrna/relate/batch.py
@@ -7,8 +7,8 @@
MutsBatch,
ReflenMutsBatch,
RefseqMutsBatch,
+ ensure_same_length,
get_length)
-from ..core.seq import POS_INDEX
class QnamesBatch(AllReadBatch):
@@ -26,19 +26,11 @@ class RelateBatch(MutsBatch, AllReadBatch, ABC):
@cached_property
def num_reads(self):
- nums_reads = list(set(map(get_length, (self.end5s,
- self.mid5s,
- self.mid3s,
- self.end3s))))
- if len(nums_reads) != 1:
- raise ValueError(f"Got inconsistent numbers of reads: {nums_reads}")
- return nums_reads[0]
+ return ensure_same_length(self.end5s, self.end3s, "end5s", "end3s")
@cached_property
def pos_nums(self):
- return np.arange(POS_INDEX,
- POS_INDEX + self.max_pos,
- dtype=self.pos_dtype)
+ return np.arange(1, self.max_pos + 1, dtype=self.pos_dtype)
class RelateReflenBatch(RelateBatch, ReflenMutsBatch):
diff --git a/src/seismicrna/relate/io.py b/src/seismicrna/relate/io.py
index 2fd327fd..a5d334dd 100644
--- a/src/seismicrna/relate/io.py
+++ b/src/seismicrna/relate/io.py
@@ -6,7 +6,6 @@
from .batch import QnamesBatch, RelateReflenBatch
from ..core import path
-from ..core.batch import POS_INDEX
from ..core.io import MutsBatchIO, ReadBatchIO, RefIO
@@ -65,9 +64,9 @@ def from_reads(reads: Iterable[tuple[str, int, int, int, int, dict[int, int]]],
for pos, rel in poss.items():
muts[pos][rel].append(read)
# Validate the positions.
- if min(muts) < POS_INDEX:
- raise ValueError(f"All positions must be ≥ {POS_INDEX}, but got "
- f"{[x for x in sorted(muts) if x < POS_INDEX]}")
+ if min(muts) < 1:
+ raise ValueError(f"All positions must be ≥ 1, but got "
+ f"{[x for x in sorted(muts) if x < 1]}")
if max(muts) > reflen:
raise ValueError(f"All positions must be ≤ {reflen}, but got "
f"{[x for x in sorted(muts) if x > reflen]}")
@@ -80,10 +79,10 @@ def from_reads(reads: Iterable[tuple[str, int, int, int, int, dict[int, int]]],
ref=ref,
reflen=reflen,
batch=batch,
- end5s=end5s,
- mid5s=mid5s,
- mid3s=mid3s,
- end3s=end3s,
+ end5s=np.asarray(end5s),
+ mid5s=np.asarray(mid5s),
+ mid3s=np.asarray(mid3s),
+ end3s=np.asarray(end3s),
muts=muts)
return name_batch, rel_batch
diff --git a/src/seismicrna/relate/py/relate.py b/src/seismicrna/relate/py/relate.py
index b090332f..876e0991 100644
--- a/src/seismicrna/relate/py/relate.py
+++ b/src/seismicrna/relate/py/relate.py
@@ -33,7 +33,6 @@ def __init__(self, flag: int):
flag: int
The integer value of the SAM flag. For documentation, see
https://samtools.github.io/hts-specs/
-
"""
if not 0 <= flag <= MAX_FLAG:
raise RelateValueError(f"Invalid flag: {repr(flag)}")
@@ -72,7 +71,7 @@ def __init__(self, line: str):
self.qual = fields[10]
if len(self.seq) != len(self.qual):
raise RelateValueError(f"Lengths of seq ({len(self.seq)}) and qual "
- f"string {len(self.qual)} did not match.")
+ f"string {len(self.qual)} did not match")
def __str__(self):
attrs = {attr: getattr(self, attr) for attr in self.__slots__[1:]}
diff --git a/src/seismicrna/relate/sam.py b/src/seismicrna/relate/sam.py
index a70c3b42..03c83cd9 100644
--- a/src/seismicrna/relate/sam.py
+++ b/src/seismicrna/relate/sam.py
@@ -4,7 +4,6 @@
from typing import Callable, TextIO
from ..core import path
-from ..core.batch import BATCH_INDEX
from ..core.ngs import (SAM_DELIM,
count_total_reads,
run_view_xam,
@@ -23,7 +22,8 @@ def _range_of_records(get_records_func: Callable):
@wraps(get_records_func)
def wrapper(sam_file: TextIO, start: int, stop: int):
logger.debug(
- f"Reading records from {sam_file.name} from {start} to {stop}")
+ f"Reading records from {sam_file.name} from {start} to {stop}"
+ )
sam_file.seek(start)
records = get_records_func(sam_file)
n_records = 0
@@ -166,7 +166,7 @@ def _iter_batch_indexes(self):
# has at least one line) times the number of mates per record.
n_skip = (self.n_per_batch - 1) * (self.paired + 1)
# Count the batches.
- batch = BATCH_INDEX
+ batch = 0
with self.open_temp_sam() as sam_file:
# Current position in the SAM file.
position = sam_file.tell()
diff --git a/src/seismicrna/relate/sim.py b/src/seismicrna/relate/sim.py
new file mode 100644
index 00000000..e1667b14
--- /dev/null
+++ b/src/seismicrna/relate/sim.py
@@ -0,0 +1,310 @@
+from datetime import datetime
+from pathlib import Path
+
+import numpy as np
+import pandas as pd
+
+from .io import QnamesBatchIO, RelateBatchIO
+from .report import RelateReport
+from .write import get_reads_per_batch, mib_to_bytes
+from ..core.batch import END_COORDS, END5_COORD, END3_COORD, get_length
+from ..core.dims import triangular
+from ..core.io import RefseqIO
+from ..core.rel import SUB_A, SUB_C, SUB_G, SUB_T
+from ..core.seq import (BASEA,
+ BASEC,
+ BASEG,
+ BASET,
+ DNA,
+ index_to_pos,
+ index_to_seq,
+ seq_pos_to_index)
+from ..core.write import need_write
+
+rng = np.random.default_rng()
+
+
+def _list_naturals(n: int):
+ """ List natural numbers. """
+ return np.arange(1, n + 1)
+
+
+def _check_naturals(values: np.ndarray, what: str = "values"):
+ """ Raise ValueError if the values are not monotonically increasing
+ natural numbers. """
+ length = get_length(values, what)
+ if not np.array_equal(values, np.arange(1, length + 1)):
+ raise ValueError(f"{what} must be numbered 1 to {length}, "
+ f"but got {values}")
+ return np.asarray(values, dtype=int)
+
+
+def sub_options(base: str):
+ """ Valid substitutions for a given reference base. """
+ if base == BASEA:
+ return [SUB_C, SUB_G, SUB_T]
+ if base == BASEC:
+ return [SUB_A, SUB_G, SUB_T]
+ if base == BASEG:
+ return [SUB_A, SUB_C, SUB_T]
+ if base == BASET:
+ return [SUB_A, SUB_C, SUB_G]
+ raise ValueError(f"Invalid base: {repr(base)}")
+
+
+def index_to_refseq_pos(index: pd.MultiIndex):
+ # Determine the reference sequence.
+ refseq = index_to_seq(index)
+ # Validate the sequence positions.
+ pos = _check_naturals(index_to_pos(index), "positions")
+ return refseq, pos
+
+
+def choose_clusters(p_clust: pd.Series, n_reads: int):
+ """ Choose a cluster for each read. """
+ # Validate the cluster proportions.
+ if not isinstance(p_clust, pd.Series):
+ raise TypeError("p_clust must be Series, "
+ f"but got {type(p_clust).__name__}")
+ clusters = _check_naturals(p_clust.index, "clusters")
+ # Choose a cluster for each read.
+ return rng.choice(clusters, n_reads, p=p_clust.values)
+
+
+def simulate_p_mut(refseq: DNA, ncls: int):
+ """ Simulate mutation rates. """
+ return pd.DataFrame(
+ rng.random((len(refseq), ncls)),
+ seq_pos_to_index(refseq, _list_naturals(len(refseq)), 1),
+ _list_naturals(ncls)
+ )
+
+
+def simulate_p_ends(npos: int, min_size: int = 1, max_size: int | None = None):
+ """ Simulate proportions of end coordinates. """
+ p_ends = pd.Series(
+ 1. - rng.random(triangular(npos)),
+ pd.MultiIndex.from_arrays(
+ [a + 1 for a in np.triu_indices(npos)],
+ names=END_COORDS
+ )
+ )
+ # Validate the read size limits.
+ if not 1 <= min_size <= npos:
+ raise ValueError(f"min_size must be ≥ 1 and ≤ {npos}, "
+ f"but got {min_size}")
+ if max_size is None:
+ max_size = npos
+ elif not min_size <= max_size <= npos:
+ raise ValueError(f"max_size must be ≥ {min_size} and ≤ {npos}, "
+ f"but got {min_size}")
+ # Remove coordinates with improper sizes.
+ if min_size > 1 or max_size < npos:
+ end5s = p_ends.index.get_level_values(END5_COORD).values
+ end3s = p_ends.index.get_level_values(END3_COORD).values
+ sizes = end3s - end5s + 1
+ p_ends = p_ends.loc[np.logical_and(min_size <= sizes,
+ sizes <= max_size)]
+ return p_ends / p_ends.sum()
+
+
+def simulate_p_clust(ncls: int):
+ p_clust = pd.Series(1. - rng.random(ncls), _list_naturals(ncls))
+ return p_clust / p_clust.sum()
+
+
+def simulate_read_name(batch_num: int, read_num: int):
+ return f"Batch:{batch_num};Read:{read_num}"
+
+
+def simulate_qnames_batch(sample: str,
+ ref: str,
+ batch: int,
+ n_reads: int):
+ return QnamesBatchIO(sample=sample,
+ ref=ref,
+ batch=batch,
+ names=[simulate_read_name(batch, read)
+ for read in range(n_reads)])
+
+
+def simulate_relate_batch(sample: str,
+ ref: str,
+ batch: int,
+ n_reads: int,
+ p_mut: pd.DataFrame,
+ p_ends: pd.Series,
+ cluster_choices: np.ndarray):
+ """ Simulate a relate batch. """
+ # Validate the mutation rates.
+ if not isinstance(p_mut, pd.DataFrame):
+ raise TypeError("p_mut must be DataFrame, "
+ f"but got {type(p_mut).__name__}")
+ refseq, positions = index_to_refseq_pos(p_mut.index)
+ clusters = _check_naturals(p_mut.columns, "clusters")
+ # Validate the end coordinates.
+ if not isinstance(p_ends, pd.Series):
+ raise TypeError("p_ends must be Series, "
+ f"but got {type(p_ends).__name__}")
+ if tuple(p_ends.index.names) != END_COORDS:
+ raise ValueError(f"p_ends index must have names {END_COORDS}, "
+ f"but got {p_ends.index.names}")
+ reads = np.arange(n_reads)
+ # Choose 5' and 3' end coordinates for each read.
+ coords = rng.choice(p_ends.size, n_reads, p=p_ends.values)
+ end5_choices = p_ends.index.get_level_values(END5_COORD).values[coords]
+ end3_choices = p_ends.index.get_level_values(END3_COORD).values[coords]
+ # Validate the cluster choices.
+ if not isinstance(cluster_choices, np.ndarray):
+ raise TypeError("cluster_choices must be ndarray, "
+ f"but got {type(cluster_choices).__name__}")
+ # Determine which reads come from each cluster.
+ in_cluster = {cluster: reads[cluster_choices == cluster]
+ for cluster in clusters}
+ # Simulate mutations for each position.
+ muts = dict()
+ for pos, base in zip(positions, refseq, strict=True):
+ pos_sub_options = sub_options(base)
+ muts[pos] = {sub: np.array([], dtype=int) for sub in pos_sub_options}
+ # Determine for which reads the position is within the ends.
+ in_ends = reads[np.logical_and(end5_choices <= pos,
+ pos <= end3_choices)]
+ # Simulate mutations for each cluster.
+ for cluster in clusters:
+ # Determine which reads can be mutated.
+ read_options = np.intersect1d(in_ends,
+ in_cluster[cluster],
+ assume_unique=True)
+ # Simulate the number of reads with mutations.
+ n_muts = rng.binomial(get_length(read_options),
+ p_mut.at[(pos, base), cluster])
+ # Choose reads with mutations at the position.
+ read_choices = rng.choice(read_options, n_muts, replace=False)
+ # Choose a type of subsitution for each mutated read.
+ sub_choices = rng.choice(pos_sub_options, read_choices.size)
+ # Record the reads with each type of substitution.
+ for sub in pos_sub_options:
+ muts[pos][sub] = np.hstack([muts[pos][sub],
+ read_choices[sub_choices == sub]])
+ # Assemble a simulated RelateBatchIO.
+ return RelateBatchIO(sample=sample,
+ ref=ref,
+ reflen=len(refseq),
+ batch=batch,
+ end5s=end5_choices,
+ mid5s=end5_choices,
+ mid3s=end3_choices,
+ end3s=end3_choices,
+ muts=muts)
+
+
+def simulate_batch(sample: str,
+ ref: str,
+ batch: int,
+ n_reads: int,
+ p_mut: pd.DataFrame,
+ p_ends: pd.Series,
+ cluster_choices: np.ndarray):
+ qnames_batch = simulate_qnames_batch(sample, ref, batch, n_reads)
+ relate_batch = simulate_relate_batch(sample, ref, batch, n_reads,
+ p_mut, p_ends, cluster_choices)
+ return qnames_batch, relate_batch
+
+
+def generate_batch(out_dir: Path, brotli_level: int, *args, **kwargs):
+ qnames_batch, relate_batch = simulate_batch(*args, **kwargs)
+ _, relate_check = relate_batch.save(out_dir, brotli_level, force=True)
+ _, qnames_check = qnames_batch.save(out_dir, brotli_level, force=True)
+ return qnames_check, relate_check
+
+
+def generate_batches(refseq: DNA,
+ n_reads: int,
+ batch_size: float,
+ cluster_choices: np.ndarray,
+ *args,
+ **kwargs):
+ qnames_checks = list()
+ relate_checks = list()
+ # Determine the numbers of batches and reads per batch.
+ n_reads_per_batch = get_reads_per_batch(mib_to_bytes(batch_size),
+ len(refseq))
+ n_batches_full, n_reads_extra = divmod(n_reads, n_reads_per_batch)
+ # Generate every full-size batch.
+ for batch in range(n_batches_full):
+ first = n_reads_per_batch * batch
+ last = n_reads_per_batch + first
+ qnames_check, relate_check = generate_batch(
+ *args,
+ batch=batch,
+ n_reads=n_reads_per_batch,
+ cluster_choices=cluster_choices[first: last],
+ **kwargs
+ )
+ qnames_checks.append(qnames_check)
+ relate_checks.append(relate_check)
+ # Generate the last batch, which may have fewer reads.
+ if n_reads_extra:
+ first = n_reads_per_batch * n_batches_full
+ last = n_reads
+ qnames_check, relate_check = generate_batch(
+ *args,
+ batch=n_batches_full,
+ n_reads=n_reads_extra,
+ cluster_choices=cluster_choices[first: last],
+ **kwargs
+ )
+ qnames_checks.append(qnames_check)
+ relate_checks.append(relate_check)
+ # Collect the checksums into one dictionary.
+ checksums = {RelateBatchIO.btype(): relate_checks,
+ QnamesBatchIO.btype(): qnames_checks}
+ return checksums
+
+
+def simulate_relate(out_dir: Path,
+ sample: str,
+ ref: str,
+ refseq: DNA,
+ n_reads: int,
+ brotli_level: int,
+ force: bool,
+ *args,
+ **kwargs):
+ """ Simulate an entire relate step. """
+ report_file = RelateReport.build_path(top=out_dir,
+ sample=sample,
+ ref=ref)
+ if need_write(report_file, force):
+ began = datetime.now()
+ # Write the reference sequence to a file.
+ refseq_file = RefseqIO(sample=sample, ref=ref, refseq=refseq)
+ _, refseq_checksum = refseq_file.save(out_dir, brotli_level, force=True)
+ # Simulate and write the batches.
+ checksums = generate_batches(out_dir=out_dir,
+ sample=sample,
+ ref=ref,
+ refseq=refseq,
+ n_reads=n_reads,
+ brotli_level=brotli_level,
+ *args,
+ **kwargs)
+ ns_batches = sorted(set(map(len, checksums.values())))
+ if len(ns_batches) != 1:
+ raise ValueError("Expected exactly 1 number of batches, "
+ f"but got {ns_batches}")
+ n_batches = ns_batches[0]
+ ended = datetime.now()
+ # Write the report.
+ report = RelateReport(sample=sample,
+ ref=ref,
+ min_mapq=-1,
+ min_reads=n_reads,
+ n_reads_rel=n_reads,
+ n_batches=n_batches,
+ checksums=checksums,
+ refseq_checksum=refseq_checksum,
+ began=began,
+ ended=ended)
+ report.save(out_dir, force=True)
+ return report_file
diff --git a/src/seismicrna/relate/tests/__init__.py b/src/seismicrna/relate/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/seismicrna/relate/tests/sim_test.py b/src/seismicrna/relate/tests/sim_test.py
new file mode 100644
index 00000000..fcdba179
--- /dev/null
+++ b/src/seismicrna/relate/tests/sim_test.py
@@ -0,0 +1,169 @@
+import unittest as ut
+from pathlib import Path
+from string import ascii_letters
+
+import numpy as np
+import pandas as pd
+from scipy.stats import binom
+
+from seismicrna.core.batch import END5_COORD, END3_COORD
+from seismicrna.core.seq import DNA
+from seismicrna.relate.sim import (_list_naturals,
+ choose_clusters,
+ simulate_p_mut,
+ simulate_p_ends,
+ simulate_p_clust,
+ simulate_relate_batch,
+ simulate_relate,
+ sub_options)
+
+rng = np.random.default_rng()
+
+
+class TestSubOptions(ut.TestCase):
+
+ def test_bases(self):
+ self.assertEqual(sub_options("A"), [2 ** 5, 2 ** 6, 2 ** 7])
+ self.assertEqual(sub_options("C"), [2 ** 4, 2 ** 6, 2 ** 7])
+ self.assertEqual(sub_options("G"), [2 ** 4, 2 ** 5, 2 ** 7])
+ self.assertEqual(sub_options("T"), [2 ** 4, 2 ** 5, 2 ** 6])
+
+ def test_invalid(self):
+ for letter in ascii_letters:
+ if letter not in "ACGT":
+ self.assertRaisesRegex(ValueError,
+ f"Invalid base: '{letter}'",
+ sub_options,
+ letter)
+
+
+class TestChooseClusters(ut.TestCase):
+
+ def test_1_cluster(self):
+ """ With 1 cluster, all reads should be from that cluster. """
+ p_clust = simulate_p_clust(1)
+ for n_reads in range(5):
+ with self.subTest(n_reads=n_reads):
+ expect = np.ones(n_reads, dtype=int)
+ result = choose_clusters(p_clust, n_reads)
+ self.assertIsInstance(result, np.ndarray)
+ self.assertIs(result.dtype, expect.dtype)
+ self.assertTrue(np.array_equal(result, expect))
+
+ def test_2_clusters(self):
+ """ With 2 clusters. """
+ confidence = 0.9995
+ # Vary the proportion of cluster 1.
+ for p1 in np.linspace(0., 1., 5):
+ p_clust = pd.Series([p1, 1. - p1], [1, 2])
+ for n_reads in [0, 1, 100, 10000]:
+ with self.subTest(p1=p1, n_reads=n_reads):
+ result = choose_clusters(p_clust, n_reads)
+ self.assertIsInstance(result, np.ndarray)
+ n1 = np.count_nonzero(result == 1)
+ n2 = np.count_nonzero(result == 2)
+ self.assertEqual(n1 + n2, n_reads)
+ # Verify the number of reads assigned to cluster 1
+ # follows a binomial distribution.
+ lo, up = binom.interval(confidence, n_reads, p1)
+ self.assertGreaterEqual(n1, lo)
+ self.assertLessEqual(n1, up)
+
+
+class TestSimulateRelateBatch(ut.TestCase):
+
+ def test_nmut(self):
+ """ Test number of mutated reads per position. """
+ confidence = 0.9999
+ n_reads = 20_000
+ # Vary the number of positions.
+ for npos in range(1, 10):
+ # Define the positions and sequence.
+ refseq = DNA.random(npos)
+ # Simulate proportions of end coordinates.
+ p_ends = simulate_p_ends(npos)
+ # Estimate the fraction of reads covering each position.
+ positions = _list_naturals(npos)
+ coverage = pd.Series(
+ [p_ends.values[np.logical_and(
+ pos >= p_ends.index.get_level_values(END5_COORD),
+ pos <= p_ends.index.get_level_values(END3_COORD)
+ )].sum() for pos in positions],
+ index=positions
+ )
+ # Vary the number of clusters.
+ for ncls in range(1, 4):
+ # Simulate mutation rates for each position.
+ p_mut = simulate_p_mut(refseq, ncls)
+ # Choose a cluster for each read.
+ p_clust = simulate_p_clust(ncls)
+ cluster_choices = choose_clusters(p_clust, n_reads)
+ # Simulate the batch.
+ batch = simulate_relate_batch(
+ "sample", "ref", 0, n_reads, p_mut, p_ends, cluster_choices
+ )
+ # Count the reads with mutations at each position.
+ for pos, muts in batch.muts.items():
+ base = refseq[pos - 1]
+ # Check the types of substitutions.
+ self.assertEqual(sorted(muts), sub_options(base))
+ # Count all mutated reads at this position.
+ n_mut_reads = sum(map(len, muts.values()))
+ # Compute a confidence interval.
+ p_mut_reads = coverage[pos] * np.vdot(
+ p_mut.loc[pos].values, p_clust.values
+ )
+ lo, up = binom.interval(confidence, n_reads, p_mut_reads)
+ self.assertGreaterEqual(n_mut_reads, lo)
+ self.assertLessEqual(n_mut_reads, up)
+
+
+class TestSimulateRelate(ut.TestCase):
+
+ def test_simulate(self):
+ # Define parameters.
+ npos = 300
+ nreads = 100_000
+ ncls = 2
+ batch_size = 16.
+ # Simulate the reference sequence.
+ refseq = DNA.random(npos)
+ # Simulate proportions of end coordinates.
+ p_ends = simulate_p_ends(npos)
+ # Choose a cluster for each read.
+ p_clust = simulate_p_clust(ncls)
+ cluster_choices = choose_clusters(p_clust, nreads)
+ # Simulate mutation rates for each position.
+ p_mut = simulate_p_mut(refseq, ncls)
+ # Simulate the relate step.
+ report_file = simulate_relate(out_dir=Path.cwd(),
+ sample="sample",
+ ref="ref",
+ refseq=refseq,
+ batch_size=batch_size,
+ n_reads=nreads,
+ p_mut=p_mut,
+ p_ends=p_ends,
+ cluster_choices=cluster_choices,
+ brotli_level=5,
+ force=False)
+ '''
+ # Count the reads with mutations at each position.
+ for pos, muts in batch.muts.items():
+ base = refseq[pos - 1]
+ # Check the types of substitutions.
+ self.assertEqual(sorted(muts), sub_options(base))
+ # Count all mutated reads at this position.
+ n_mut_reads = sum(map(len, muts.values()))
+ # Compute a confidence interval.
+ p_mut_reads = coverage[pos] * np.vdot(
+ p_mut.loc[pos].values, p_clust.values
+ )
+ lo, up = binom.interval(confidence, n_reads, p_mut_reads)
+ self.assertGreaterEqual(n_mut_reads, lo)
+ self.assertLessEqual(n_mut_reads, up)
+ '''
+
+
+if __name__ == "__main__":
+ ut.main()
diff --git a/src/seismicrna/table/base.py b/src/seismicrna/table/base.py
index 7eef9c18..15350b4e 100644
--- a/src/seismicrna/table/base.py
+++ b/src/seismicrna/table/base.py
@@ -21,8 +21,6 @@
# General fields
READ_TITLE = "Read Name"
-R_OBS_TITLE = "Reads Observed"
-R_ADJ_TITLE = "Reads Adjusted"
# Count relationships
COVER_REL = "Covered"
@@ -102,11 +100,6 @@ def kind(cls) -> str:
def by_read(cls) -> bool:
""" Whether the table contains data for each read. """
- @classmethod
- @abstractmethod
- def transposed(cls) -> bool:
- """ Whether the data is saved as its transpose. """
-
@classmethod
@abstractmethod
def header_type(cls) -> type[Header]:
@@ -146,6 +139,11 @@ def ext(cls):
""" Table's file extension: either '.csv' or '.csv.gz'. """
return path.CSVZIP_EXT if cls.gzipped() else path.CSV_EXT
+ @classmethod
+ @abstractmethod
+ def series(cls) -> bool:
+ """ Whether the data is a Series rather than a DataFrame. """
+
@property
@abstractmethod
def top(self) -> Path:
@@ -168,8 +166,8 @@ def sect(self) -> str:
@cached_property
@abstractmethod
- def data(self) -> pd.DataFrame:
- """ Table's data frame. """
+ def data(self) -> pd.DataFrame | pd.Series:
+ """ Table's data. """
@cached_property
def header(self):
@@ -203,10 +201,6 @@ def __str__(self):
class RelTypeTable(Table, ABC):
""" Table with multiple types of relationships. """
- @classmethod
- def transposed(cls):
- return False
-
@classmethod
def _format_data(cls,
data: pd.DataFrame, *,
@@ -225,6 +219,15 @@ def _format_data(cls,
data = data[data.columns[0]]
return data
+ @classmethod
+ def series(cls):
+ return False
+
+ @cached_property
+ @abstractmethod
+ def data(self) -> pd.DataFrame:
+ """ Table's data. """
+
@abstractmethod
def _fetch_data(self,
columns: pd.Index,
@@ -666,9 +669,14 @@ def path_segs(cls):
return path.FREQ_TABLE_SEGS
@classmethod
- def transposed(cls):
+ def series(cls):
return True
+ @cached_property
+ @abstractmethod
+ def data(self) -> pd.Series:
+ """ Table's data. """
+
# Table by Source and Index ############################################
diff --git a/src/seismicrna/table/calc.py b/src/seismicrna/table/calc.py
index 3c4a36a8..731577c1 100644
--- a/src/seismicrna/table/calc.py
+++ b/src/seismicrna/table/calc.py
@@ -16,13 +16,15 @@
SUB_G_REL,
SUB_T_REL,
INFOR_REL,
- R_ADJ_TITLE,
- R_OBS_TITLE,
TABLE_RELS)
from ..cluster.data import ClusterMutsDataset
-from ..core.batch import accum_fits
-from ..core.header import Header, make_header
-from ..core.mu import calc_f_obs_frame, calc_mu_adj_frame
+from ..core.batch import END5_COORD, END3_COORD, accum_fits
+from ..core.dims import triangular
+from ..core.header import ORDER_NAME, Header, make_header
+from ..core.mu import (calc_p_ends_observed,
+ calc_p_noclose,
+ calc_p_noclose_given_ends,
+ calc_params)
from ..core.rel import RelPattern, HalfRelPattern
from ..core.seq import Section
from ..mask.data import MaskMutsDataset
@@ -118,21 +120,44 @@ def _counts(self):
@property
def _num_reads(self):
""" Raw number of reads. """
- num_reads, per_pos, per_read = self._counts
+ num_reads, per_pos, per_read, end_counts = self._counts
return num_reads
@property
def _counts_per_pos(self):
""" Raw counts per position. """
- num_reads, per_pos, per_read = self._counts
+ num_reads, per_pos, per_read, end_counts = self._counts
return per_pos
@property
def _counts_per_read(self):
""" Raw counts per read. """
- num_reads, per_pos, per_read = self._counts
+ num_reads, per_pos, per_read, end_counts = self._counts
return per_read
+ @property
+ def _end_counts(self):
+ """ Raw counts for each pair of end coordinates. """
+ num_reads, per_pos, per_read, end_counts = self._counts
+ return end_counts
+
+ @cached_property
+ def p_ends_given_noclose(self):
+ """ Probability of each end coordinate. """
+ # Ensure end_counts has 2 dimensions.
+ if self._end_counts.ndim == 1:
+ end_counts = self._end_counts.values[:, np.newaxis]
+ else:
+ end_counts = self._end_counts.values
+ return calc_p_ends_observed(
+ self.section.length,
+ (self._end_counts.index.get_level_values(END5_COORD).values
+ - self.section.end5),
+ (self._end_counts.index.get_level_values(END3_COORD).values
+ - self.section.end5),
+ end_counts,
+ )
+
@cached_property
def table_per_pos(self):
return self._format_table(self._counts_per_pos,
@@ -160,6 +185,8 @@ def get_null_value(cls):
@cached_property
def _adjusted(self):
return adjust_counts(super().table_per_pos,
+ self.p_ends_given_noclose,
+ self._num_reads,
self.section,
self.dataset.min_mut_gap)
@@ -167,8 +194,8 @@ def _adjusted(self):
def table_per_pos(self):
# Count every type of relationship at each position, in the same
# way as for the superclass, then adjust for observer bias.
- counts_adj, f_obs = self._adjusted
- return counts_adj
+ n_rels, n_clust = self._adjusted
+ return n_rels
class AvgTabulator(Tabulator, ABC):
@@ -192,17 +219,6 @@ class ClustTabulator(PartialTabulator, ABC):
def max_order(self):
return self.dataset.max_order
- @cached_property
- def num_reads_obs(self):
- """ Observed number of reads in each cluster. """
- return self._num_reads
-
- @cached_property
- def num_reads_adj(self):
- """ Adjusted number of reads in each cluster. """
- counts_adj, f_obs = self._adjusted
- return self.num_reads_obs / f_obs
-
@cached_property
def clust_header(self):
""" Header of the per-cluster data. """
@@ -210,9 +226,10 @@ def clust_header(self):
@cached_property
def table_per_clust(self):
- """ Observed and adjusted numbers of reads in each cluster. """
- return pd.DataFrame.from_dict({R_OBS_TITLE: self.num_reads_obs,
- R_ADJ_TITLE: self.num_reads_adj}).T
+ """ Number of reads in each cluster. """
+ n_rels, n_clust = self._adjusted
+ n_clust.name = "Number of Reads"
+ return n_clust
# Helper functions #####################################################
@@ -228,10 +245,6 @@ def _iter_mut_patterns():
yield INSRT_REL, HalfRelPattern.from_counts(count_ins=True)
-def list_mut_patterns():
- return list(_iter_mut_patterns())
-
-
def _iter_patterns(mask: RelPattern | None = None):
""" Yield a RelPattern for every type of relationship. """
# Count everything except for no coverage.
@@ -241,7 +254,7 @@ def _iter_patterns(mask: RelPattern | None = None):
# Count all types of mutations, relative to reference matches.
yield MUTAT_REL, RelPattern.muts().intersect(mask)
# Count each type of mutation, relative to reference matches.
- for mut, pattern in list_mut_patterns():
+ for mut, pattern in _iter_mut_patterns():
yield mut, RelPattern(pattern, HalfRelPattern.refs()).intersect(mask)
@@ -250,16 +263,60 @@ def all_patterns(mask: RelPattern | None = None):
return dict(_iter_patterns(mask))
-def adjust_counts(counts_obs: pd.DataFrame,
+def _get_clusters(n_reads_clust: pd.Series | int):
+ """ Determine the clusters. """
+ if isinstance(n_reads_clust, int):
+ return None
+ if isinstance(n_reads_clust, pd.Series):
+ return n_reads_clust.index
+ raise TypeError("n_reads_clust must be an int or Series, "
+ f"but got {type(n_reads_clust).__name__}")
+
+
+def _calc_n_reads(n_reads_clust: pd.Series | int):
+ """ Total number of reads among all clusters. """
+ if isinstance(n_reads_clust, int):
+ return n_reads_clust
+ if isinstance(n_reads_clust, pd.Series):
+ # Calculate the number of reads for each order.
+ n_reads_order = n_reads_clust.groupby(level=ORDER_NAME).sum()
+ # The numbers of reads should be identical.
+ n_reads_order_1 = int(n_reads_order.loc[1])
+ if not np.allclose(n_reads_order, n_reads_order_1):
+ raise ValueError("Numbers of reads per order should match, "
+ f"but got {n_reads_order}")
+ return n_reads_order_1
+ raise TypeError("n_reads_clust must be an int or Series, "
+ f"but got {type(n_reads_clust).__name__}")
+
+
+def _insert_masked(p_mut: pd.Series | pd.DataFrame,
+ section: Section):
+ """ 2D array where masked positions are filled with 0. """
+ # Fill masked positions with 0.
+ p_mut = p_mut.reindex(index=section.range, fill_value=0.)
+ # Convert to a 2D NumPy array.
+ return p_mut.values.reshape((section.length, -1))
+
+
+def _order_indices(order: int):
+ """ First and last indices of the order in the array. """
+ last = triangular(order)
+ first = last - order
+ return first, last
+
+
+def adjust_counts(table_per_pos: pd.DataFrame,
+ p_ends_given_noclose: np.ndarray,
+ n_reads_clust: pd.Series | int,
section: Section,
min_mut_gap: int):
- """
- Adjust the given table of masked/clustered bit counts per position
- to correct for observer bias. The table is mutated in-place.
+ """ Adjust the given table of masked/clustered counts per position
+ to correct for observer bias.
Parameters
----------
- counts_obs: DataFrame
+ p_mut_given_noclose: DataFrame
Counts of the bits for each type of relation (column) at each
position (index) in the section of interest.
section: Section
@@ -267,54 +324,122 @@ def adjust_counts(counts_obs: pd.DataFrame,
min_mut_gap: int
Minimum number of non-mutated bases permitted between mutations.
"""
- # Initialize an empty DataFrame of the adjusted counts with the same
- # index and columns as the observed counts.
- counts_adj = pd.DataFrame(np.nan,
- index=counts_obs.index,
- columns=counts_obs.columns)
- # Compute the observed fraction of mutations at each position.
+ # Determine which positions are unmasked.
+ unmask = section.unmasked_bool
+ # Calculate the number of reads with no two mutations too close.
+ n_reads_noclose = _calc_n_reads(n_reads_clust)
+ # Calculate the fraction of reads with no two mutations too close in
+ # each cluster.
+ p_clust_given_noclose = np.atleast_1d(n_reads_clust / n_reads_noclose)
+ if p_clust_given_noclose.ndim != 1:
+ raise ValueError("p_clust_given_noclose must have 1 dimension, "
+ f"but got {p_clust_given_noclose.ndim}")
+ # Calculate the fraction of mutations at each position among reads
+ # with no two mutations too close.
with np.errstate(divide="ignore"):
# Ignore division by zero, which is acceptable here because any
- # NaN values will be zeroed out subsequently.
- fmuts_obs = counts_obs[MUTAT_REL] / counts_obs[INFOR_REL]
- # Fill any missing (NaN) values with zero.
- fmuts_obs.fillna(0., inplace=True)
- # Adjust the fraction of mutations to correct the observer bias.
- fmuts_adj = calc_mu_adj_frame(fmuts_obs, section, min_mut_gap)
- # Compute the fraction of all reads that would be observed.
- f_obs = calc_f_obs_frame(fmuts_adj, section, min_mut_gap)
+ # resulting NaN values are zeroed by nan_to_num.
+ p_mut_given_noclose = np.nan_to_num(_insert_masked(
+ table_per_pos[MUTAT_REL] / table_per_pos[INFOR_REL],
+ section
+ ))
+ # Determine the clusters.
+ clusters = _get_clusters(n_reads_clust)
+ # Calculate the parameters.
+ if clusters is None:
+ # Calculate the parameters.
+ p_mut, p_ends, p_clust = calc_params(
+ p_mut_given_noclose,
+ p_ends_given_noclose,
+ p_clust_given_noclose,
+ min_mut_gap
+ )
+ # Compute the probability that reads would have no two mutations
+ # too close.
+ p_noclose_given_clust = calc_p_noclose(
+ p_ends,
+ calc_p_noclose_given_ends(p_mut, min_mut_gap)
+ )
+ # Drop the cluster dimension from the parameters.
+ if p_mut.shape != (section.length, 1):
+ raise ValueError(f"p_mut must have shape {(section.length, 1)}, "
+ f"but got {p_mut.shape}")
+ p_mut = p_mut.reshape((-1,))
+ if p_clust.shape != (1,):
+ raise ValueError(
+ f"p_clust must have shape {1,}, but got {p_clust.shape}"
+ )
+ p_clust = float(p_clust[0])
+ if not np.isclose(p_clust, 1.):
+ raise ValueError(f"p_clust must equal 1., but got {p_clust}")
+ if p_noclose_given_clust.shape != (1,):
+ raise ValueError(f"p_noclose_given_clust must have shape {1,}, "
+ f"but got {p_noclose_given_clust.shape}")
+ p_noclose_given_clust = float(p_noclose_given_clust[0])
+ else:
+ # Calculate the parameters for each order separately.
+ p_mut = np.empty_like(p_mut_given_noclose)
+ p_clust = np.empty_like(p_clust_given_noclose)
+ p_noclose_given_clust = np.empty_like(p_clust_given_noclose)
+ for order in clusters.get_level_values(ORDER_NAME):
+ i, j = _order_indices(order)
+ # Calculate the parameters for each cluster.
+ p_mut[:, i: j], p_ends, p_clust[i: j] = calc_params(
+ p_mut_given_noclose[:, i: j],
+ p_ends_given_noclose[:, :, i: j],
+ p_clust_given_noclose[i: j],
+ min_mut_gap
+ )
+ # Compute the probability that reads from each cluster would
+ # have no two mutations too close.
+ p_noclose_given_clust[i: j] = calc_p_noclose(
+ p_ends,
+ calc_p_noclose_given_ends(p_mut[:, i: j], min_mut_gap)
+ )
+ # Remove masked positions from the mutation rates.
+ p_mut = p_mut[unmask]
+ # Create the table of adjusted counts.
+ # Initialize an empty DataFrame of the adjusted counts with the same
+ # index and columns as the observed counts.
+ n_rels = pd.DataFrame(np.nan, table_per_pos.index, table_per_pos.columns)
+ # Calculate the probability that a read from any cluster would have
+ # no two mutations too close.
+ p_noclose = np.vdot(p_noclose_given_clust, p_clust)
+ # Calculate the total number of reads.
+ n_reads_total = n_reads_noclose / p_noclose
# Assume that the observance bias affects the counts of covered and
- # informative bases equally, so that we can define f_obs as follows:
- # f_obs := ninfo_obs / ninfo_adj
+ # informative bases equally, so p_noclose_given_ends is defined as:
+ # p_noclose_given_ends := ninfo_obs / n_info
# from which we can estimate the informative bases after adjustment:
- # ninfo_adj = ninfo_obs / f_obs
- ninfo_adj = counts_obs.loc[:, INFOR_REL] / f_obs
- counts_adj.loc[:, INFOR_REL] = ninfo_adj.values
- counts_adj.loc[:, COVER_REL] = (counts_obs.loc[:, COVER_REL] / f_obs).values
+ # n_info = ninfo_obs / p_noclose_given_ends
+ n_cov = table_per_pos.loc[unmask, COVER_REL].values / p_noclose_given_clust
+ n_info = table_per_pos.loc[unmask, INFOR_REL].values / p_noclose_given_clust
+ n_rels.loc[unmask, COVER_REL] = n_cov
+ n_rels.loc[unmask, INFOR_REL] = n_info
# From the definition of the adjusted fraction of mutations:
- # fmuts_adj := nmuts_adj / ninfo_adj
+ # p_mut := n_mut / n_info
# we can also estimate the mutated bases after adjustment:
- # nmuts_adj = fmuts_adj * ninfo_adj
- nmuts_adj = fmuts_adj * ninfo_adj
- counts_adj.loc[:, MUTAT_REL] = nmuts_adj.values
+ n_mut = p_mut * n_info
+ n_rels.loc[unmask, MUTAT_REL] = n_mut
# From the definition of informative bases:
- # ninfo_adj := nrefs_adj + nmuts_adj
+ # n_info := n_ref + n_mut
# we can estimate the matched bases after adjustment:
- # nrefs_adj = ninfo_adj - nmuts_adj
- nrefs_adj = ninfo_adj - nmuts_adj
- counts_adj.loc[:, MATCH_REL] = nrefs_adj.values
- # Compute the factor by which nmuts was adjusted for each position.
+ n_ref = n_info - n_mut
+ n_rels.loc[unmask, MATCH_REL] = n_ref
+ # Compute the factor by which n_mut was scaled for each position.
with np.errstate(divide="ignore"):
# Division by 0 is possible if no mutations were observed at a
# given position, resulting in a NaN value at that position.
- adj_factor = nmuts_adj / counts_obs.loc[:, MUTAT_REL]
+ scale = n_mut / table_per_pos.loc[unmask, MUTAT_REL].values
# Replace NaN values with 1 so that missing values do not propagate
# during multiplication.
- adj_factor = adj_factor.fillna(1.)
- # Adjust every subtype of mutation by this factor.
+ scale = np.nan_to_num(scale, nan=1.)
+ # Scale every subtype of mutation by this factor.
for mut in SUBMUTS:
- counts_adj.loc[:, mut] = (counts_obs.loc[:, mut] * adj_factor).values
- return counts_adj, f_obs
+ n_rels.loc[unmask, mut] = scale * table_per_pos.loc[unmask, mut].values
+ # Calculate the number of reads in each cluster.
+ n_clust = pd.Series(p_clust * n_reads_total, index=clusters)
+ return n_rels, n_clust
def tabulate_loader(dataset: (RelateDataset
diff --git a/src/seismicrna/table/load.py b/src/seismicrna/table/load.py
index 7167891c..180432d3 100644
--- a/src/seismicrna/table/load.py
+++ b/src/seismicrna/table/load.py
@@ -56,19 +56,31 @@ def sect(self) -> str:
@cached_property
def data(self):
- data = (pd.read_csv(self.path,
- index_col=self.header_rows(),
- header=self.index_cols()).T
- if self.transposed() else
- pd.read_csv(self.path,
- index_col=self.index_cols(),
- header=self.header_rows()))
- # Any numeric data in the header will be read as strings and
- # must be cast to integers, which can be done with parse_header.
- header = parse_header(data.columns)
- # The columns must be replaced with the header index explicitly
- # in order for the type casting to take effect.
- data.columns = header.index
+ data = pd.read_csv(self.path,
+ index_col=self.index_cols(),
+ header=self.header_rows())
+ if self.series():
+ # Squeeze the data into a Series.
+ data = data.squeeze(axis=1)
+ if not isinstance(data, pd.Series):
+ raise ValueError(f"{self} must have Series-compatible data, "
+ f"but got {data}")
+ # Any numeric data in the header will be read as strings and
+ # must be cast to integers using parse_header.
+ header = parse_header(data.index)
+ # The index must be replaced with the header index for the
+ # type casting to take effect.
+ data.index = header.index
+ else:
+ if not isinstance(data, pd.DataFrame):
+ raise ValueError(f"{self} must have DataFrame-compatible data, "
+ f"but got {data}")
+ # Any numeric data in the header will be read as strings and
+ # must be cast to integers using parse_header.
+ header = parse_header(data.columns)
+ # The columns must be replaced with the header index for the
+ # type casting to take effect.
+ data.columns = header.index
return data
diff --git a/src/seismicrna/table/main.py b/src/seismicrna/table/main.py
index 683fe046..31c79056 100644
--- a/src/seismicrna/table/main.py
+++ b/src/seismicrna/table/main.py
@@ -21,20 +21,6 @@
logger = getLogger(__name__)
-params = [arg_input_path,
- opt_table_pos,
- opt_table_read,
- opt_table_clust,
- opt_force,
- opt_max_procs,
- opt_parallel]
-
-
-@command(CMD_TABLE, params=params)
-def cli(*args, **kwargs):
- """ Count mutations for each read and position; output tables. """
- return run(*args, **kwargs)
-
@docdef.auto()
def run(input_path: tuple[str, ...], *,
@@ -73,6 +59,21 @@ def run(input_path: tuple[str, ...], *,
force=force),
pass_n_procs=False)))
+
+params = [arg_input_path,
+ opt_table_pos,
+ opt_table_read,
+ opt_table_clust,
+ opt_force,
+ opt_max_procs,
+ opt_parallel]
+
+
+@command(CMD_TABLE, params=params)
+def cli(*args, **kwargs):
+ """ Count mutations for each read and position; output tables. """
+ return run(*args, **kwargs)
+
########################################################################
# #
# © Copyright 2024, the Rouskin Lab. #
diff --git a/src/seismicrna/table/write.py b/src/seismicrna/table/write.py
index 5d9615df..c14a093b 100644
--- a/src/seismicrna/table/write.py
+++ b/src/seismicrna/table/write.py
@@ -63,8 +63,7 @@ def columns(self):
def write(self, force: bool):
""" Write the table's rounded data to the table's CSV file. """
if need_write(self.path, force):
- data = self.data.T if self.transposed() else self.data
- data.round(decimals=PRECISION).to_csv(self.path)
+ self.data.round(decimals=PRECISION).to_csv(self.path)
return self.path
diff --git a/src/seismicrna/test/main.py b/src/seismicrna/test/main.py
index b3ca9a88..c32571d5 100644
--- a/src/seismicrna/test/main.py
+++ b/src/seismicrna/test/main.py
@@ -19,24 +19,15 @@
from seismicrna.core.arg import CMD_TEST, docdef, opt_verbose
-# Parameters for command line interface
-params = [opt_verbose]
-
-
-@command(CMD_TEST, params=params)
-def cli(**kwargs):
- """ Run all unit tests. """
- return run(**kwargs)
-
@docdef.auto()
def run(verbose: int):
""" Run all unit tests. """
# Discover all unit test modules.
main_dir = dirname(dirname(__file__))
- # The line top_level_dir=dirname(main_dir) is needed to make Python
- # treat seismicrna as a package, so that the relative imports work.
- # Omitting this line leads to an ImportError during every test.
+ # The argument top_level_dir=dirname(main_dir) is needed to make
+ # Python treat seismicrna as a package, so relative imports work.
+ # Omitting this argument causes an ImportError during every test.
suite = ut.TestLoader().discover(main_dir,
pattern="*test.py",
top_level_dir=dirname(main_dir))
@@ -45,6 +36,16 @@ def run(verbose: int):
runner.run(suite)
+# Parameters for command line interface
+params = [opt_verbose]
+
+
+@command(CMD_TEST, params=params)
+def cli(**kwargs):
+ """ Test if SEISMIC-RNA is working properly. """
+ return run(**kwargs)
+
+
if __name__ == "__main__":
# Run all unit tests by executing this script on the command line.
run(verbose=0)
diff --git a/src/seismicrna/wf/main.py b/src/seismicrna/wf/main.py
index 9f251656..4b6a2526 100644
--- a/src/seismicrna/wf/main.py
+++ b/src/seismicrna/wf/main.py
@@ -41,43 +41,11 @@
from ..graph.profile import ProfileRunner
from ..graph.roc import ROCRunner
-graph_options = [opt_cgroup,
- opt_hist_bins,
- opt_hist_margin,
- opt_struct_file,
- opt_struct_sect,
- opt_window,
- opt_winmin,
- opt_csv,
- opt_html,
- opt_pdf]
-
-params = merge_params([opt_demultiplex],
- demultiplex_mod.params,
- align_mod.params,
- relate_mod.params,
- pool_mod.params,
- mask_mod.params,
- cluster_mod.params,
- join_mod.params,
- table_mod.params,
- [opt_fold],
- fold_mod.params,
- [opt_export],
- export_mod.params,
- graph_options)
-
def as_tuple_str(items: Iterable):
return tuple(map(str, items))
-@command(CMD_WORKFLOW, params=params)
-def cli(*args, **kwargs):
- """ Run the entire workflow. """
- return run(*args, **kwargs)
-
-
@docdef.auto()
def run(*,
# Arguments
@@ -162,6 +130,7 @@ def run(*,
exclude_polya: int,
exclude_gu: bool,
exclude_file: str | None,
+ min_ncov_read: int,
min_finfo_read: float,
max_fmut_read: int,
min_mut_gap: int,
@@ -323,6 +292,7 @@ def run(*,
exclude_polya=exclude_polya,
exclude_gu=exclude_gu,
exclude_file=exclude_file,
+ min_ncov_read=min_ncov_read,
min_finfo_read=min_finfo_read,
max_fmut_read=max_fmut_read,
min_mut_gap=min_mut_gap,
@@ -472,6 +442,39 @@ def run(*,
force=force,
)
+
+graph_options = [opt_cgroup,
+ opt_hist_bins,
+ opt_hist_margin,
+ opt_struct_file,
+ opt_struct_sect,
+ opt_window,
+ opt_winmin,
+ opt_csv,
+ opt_html,
+ opt_pdf]
+
+params = merge_params([opt_demultiplex],
+ demultiplex_mod.params,
+ align_mod.params,
+ relate_mod.params,
+ pool_mod.params,
+ mask_mod.params,
+ cluster_mod.params,
+ join_mod.params,
+ table_mod.params,
+ [opt_fold],
+ fold_mod.params,
+ [opt_export],
+ export_mod.params,
+ graph_options)
+
+
+@command(CMD_WORKFLOW, params=params)
+def cli(*args, **kwargs):
+ """ Run the entire workflow. """
+ return run(*args, **kwargs)
+
########################################################################
# #
# © Copyright 2024, the Rouskin Lab. #
|