biopipen 0.24.0__py3-none-any.whl → 0.24.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of biopipen might be problematic. Click here for more details.

Files changed (33) hide show
  1. biopipen/__init__.py +1 -1
  2. biopipen/ns/cellranger.py +31 -0
  3. biopipen/ns/cellranger_pipeline.py +95 -0
  4. biopipen/reports/cellranger/CellRangerCount.svelte +5 -2
  5. biopipen/reports/cellranger/CellRangerSummary.svelte +16 -0
  6. biopipen/reports/cellranger/CellRangerVdj.svelte +5 -2
  7. biopipen/scripts/cellranger/CellRangerSummary.R +189 -0
  8. biopipen/scripts/scrna/CellsDistribution.R +4 -5
  9. biopipen/scripts/scrna/MarkersFinder.R +2 -3
  10. biopipen/scripts/scrna/MetaMarkers.R +3 -4
  11. biopipen/scripts/scrna/RadarPlots.R +2 -3
  12. biopipen/scripts/scrna/ScFGSEA.R +2 -3
  13. biopipen/scripts/scrna/SeuratClusterStats-hists.R +1 -1
  14. biopipen/scripts/scrna/SeuratClusterStats.R +0 -1
  15. biopipen/scripts/scrna/SeuratPreparing.R +13 -10
  16. biopipen/scripts/scrna/TopExpressingGenes.R +2 -3
  17. biopipen/scripts/scrna_metabolic_landscape/MetabolicFeatures.R +2 -3
  18. biopipen/scripts/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.R +1 -2
  19. biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.R +1 -2
  20. biopipen/scripts/tcr/CDR3AAPhyschem.R +0 -1
  21. biopipen/scripts/tcr/CloneResidency.R +5 -6
  22. biopipen/scripts/tcr/Immunarch-diversity.R +2 -2
  23. biopipen/scripts/tcr/Immunarch-kmer.R +1 -1
  24. biopipen/scripts/tcr/Immunarch-spectratyping.R +2 -2
  25. biopipen/scripts/tcr/Immunarch-vjjunc.R +1 -1
  26. biopipen/scripts/tcr/Immunarch.R +0 -1
  27. biopipen/scripts/tcr/TCRClusterStats.R +4 -5
  28. biopipen/utils/gsea.R +7 -2
  29. biopipen/utils/misc.R +11 -8
  30. {biopipen-0.24.0.dist-info → biopipen-0.24.2.dist-info}/METADATA +1 -1
  31. {biopipen-0.24.0.dist-info → biopipen-0.24.2.dist-info}/RECORD +33 -30
  32. {biopipen-0.24.0.dist-info → biopipen-0.24.2.dist-info}/entry_points.txt +1 -0
  33. {biopipen-0.24.0.dist-info → biopipen-0.24.2.dist-info}/WHEEL +0 -0
biopipen/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.24.0"
1
+ __version__ = "0.24.2"
biopipen/ns/cellranger.py CHANGED
@@ -50,6 +50,7 @@ class CellRangerCount(Proc):
50
50
  script = "file://../scripts/cellranger/CellRangerCount.py"
51
51
  plugin_opts = {
52
52
  "report": "file://../reports/cellranger/CellRangerCount.svelte",
53
+ "report_paging": 5,
53
54
  }
54
55
 
55
56
 
@@ -98,4 +99,34 @@ class CellRangerVdj(Proc):
98
99
  script = "file://../scripts/cellranger/CellRangerVdj.py"
99
100
  plugin_opts = {
100
101
  "report": "file://../reports/cellranger/CellRangerVdj.svelte",
102
+ "report_paging": 5,
103
+ }
104
+
105
+
106
+ class CellRangerSummary(Proc):
107
+ """Summarize cellranger metrics
108
+
109
+ Input:
110
+ indirs: The directories containing cellranger results
111
+ from `CellRangerCount`/`CellRangerVdj`.
112
+
113
+ Output:
114
+ outdir: The output directory
115
+
116
+ Envs:
117
+ group (type=auto): The group of the samples for boxplots.
118
+ If `None`, don't do boxplots.
119
+ It can be a dict of group names and sample names, e.g.
120
+ `{"group1": ["sample1", "sample2"], "group2": ["sample3"]}`
121
+ or a file containing the group information, with the first column
122
+ being the sample names and the second column being the group names.
123
+ The file should be tab-delimited with no header.
124
+ """
125
+ input = "indirs:dirs"
126
+ output = "outdir:dir:{{in.indirs | first | stem | append: '-etc.summary'}}"
127
+ lang = config.lang.rscript
128
+ script = "file://../scripts/cellranger/CellRangerSummary.R"
129
+ envs = {"group": None}
130
+ plugin_opts = {
131
+ "report": "file://../reports/cellranger/CellRangerSummary.svelte",
101
132
  }
@@ -0,0 +1,95 @@
1
+ """The cellranger pipelines
2
+
3
+ Primarily cellranger process plus summary for summarizing the metrics for
4
+ multiple samples.
5
+ """
6
+ from __future__ import annotations
7
+ from typing import TYPE_CHECKING
8
+
9
+ from diot import Diot
10
+ from pipen_args.procgroup import ProcGroup
11
+
12
+ if TYPE_CHECKING:
13
+ from pipen import Proc
14
+
15
+
16
+ class CellRangerCountPipeline(ProcGroup):
17
+ """The cellranger count pipeline
18
+
19
+ Run cellranger count for multiple samples and summarize the metrics.
20
+ """
21
+ DEFAULTS = Diot(input=None)
22
+
23
+ def post_init(self):
24
+ """Check if the input is a list of fastq files"""
25
+ if (
26
+ not isinstance(self.opts.input, (list, tuple))
27
+ or len(self.opts.input) == 0
28
+ or not isinstance(self.opts.input[0], (list, tuple))
29
+ ):
30
+ raise TypeError(
31
+ "The input of `CellRangerCountPipeline` should be a list of lists of "
32
+ "fastq files."
33
+ )
34
+
35
+ @ProcGroup.add_proc
36
+ def p_cellranger_count(self) -> Proc:
37
+ """Build CellRangerCount process"""
38
+ from .cellranger import CellRangerCount as _CellRangerCount
39
+
40
+ class CellRangerCount(_CellRangerCount):
41
+ input_data = self.opts.input
42
+
43
+ return CellRangerCount
44
+
45
+ @ProcGroup.add_proc
46
+ def p_cellranger_count_summary(self) -> Proc:
47
+ """Build CellRangerCountSummary process"""
48
+ from .cellranger import CellRangerSummary
49
+
50
+ class CellRangerCountSummary(CellRangerSummary):
51
+ requires = self.p_cellranger_count
52
+ input_data = lambda ch: [list(ch.iloc[:, 0])]
53
+
54
+ return CellRangerCountSummary
55
+
56
+
57
+ class CellRangerVdjPipeline(ProcGroup):
58
+ """The cellranger vdj pipeline
59
+
60
+ Run cellranger vdj for multiple samples and summarize the metrics.
61
+ """
62
+ DEFAULTS = Diot(input=None)
63
+
64
+ def post_init(self):
65
+ """Check if the input is a list of fastq files"""
66
+ if (
67
+ not isinstance(self.opts.input, (list, tuple))
68
+ or len(self.opts.input) == 0
69
+ or not isinstance(self.opts.input[0], (list, tuple))
70
+ ):
71
+ raise TypeError(
72
+ "The input of `CellRangerVdjPipeline` should be a list of lists of "
73
+ "fastq files."
74
+ )
75
+
76
+ @ProcGroup.add_proc
77
+ def p_cellranger_vdj(self) -> Proc:
78
+ """Build CellRangerVdj process"""
79
+ from .cellranger import CellRangerVdj as _CellRangerVdj
80
+
81
+ class CellRangerVdj(_CellRangerVdj):
82
+ input_data = self.opts.input
83
+
84
+ return CellRangerVdj
85
+
86
+ @ProcGroup.add_proc
87
+ def p_cellranger_vdj_summary(self) -> Proc:
88
+ """Build CellRangerVdjSummary process"""
89
+ from .cellranger import CellRangerSummary
90
+
91
+ class CellRangerVdjSummary(CellRangerSummary):
92
+ requires = self.p_cellranger_vdj
93
+ input_data = lambda ch: [list(ch.iloc[:, 0])]
94
+
95
+ return CellRangerVdjSummary
@@ -1,11 +1,14 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
+ <script>
3
+ import { Iframe } from "$libs";
4
+ </script>
2
5
 
3
6
  {%- macro report_job(job, h=1) -%}
4
- <iframe
7
+ <Iframe
5
8
  src="{{job.out.outdir}}/outs/web_summary.html"
6
9
  width="100%"
7
10
  frameborder="0"
8
- style="min-height: 60vh"></iframe>
11
+ style="min-height: 60vh" />
9
12
  {%- endmacro -%}
10
13
 
11
14
  {%- macro head_job(job) -%}
@@ -0,0 +1,16 @@
1
+ {% from "utils/misc.liq" import report_jobs -%}
2
+
3
+ <script>
4
+ import { Image, DataTable, Descr } from "$libs";
5
+ </script>
6
+
7
+ {%- macro report_job(job, h=1) -%}
8
+ {{ job | render_job: h=h }}
9
+ {%- endmacro -%}
10
+
11
+
12
+ {%- macro head_job(job) -%}
13
+ <h1>{{job.out.outdir | stem | escape}}</h1>
14
+ {%- endmacro -%}
15
+
16
+ {{ report_jobs(jobs, head_job, report_job) }}
@@ -1,11 +1,14 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
+ <script>
3
+ import { Iframe } from "$libs";
4
+ </script>
2
5
 
3
6
  {%- macro report_job(job, h=1) -%}
4
- <iframe
7
+ <Iframe
5
8
  src="{{job.out.outdir}}/outs/web_summary.html"
6
9
  width="100%"
7
10
  frameborder="0"
8
- style="min-height: 60vh"></iframe>
11
+ style="min-height: 60vh" />
9
12
  {%- endmacro -%}
10
13
 
11
14
  {%- macro head_job(job) -%}
@@ -0,0 +1,189 @@
1
+ source("{{biopipen_dir}}/utils/misc.R")
2
+ library(rlang)
3
+ library(dplyr)
4
+ library(ggplot2)
5
+ library(ggprism)
6
+
7
+ theme_set(theme_prism())
8
+
9
+ indirs <- {{in.indirs | r}}
10
+ outdir <- {{out.outdir | r}}
11
+ joboutdir <- {{job.outdir | r}}
12
+ group <- {{envs.group | r}}
13
+
14
+ if (is.character(group)) {
15
+ group <- read.csv(group, header = FALSE, row.names = NULL)
16
+ colnames(group) <- c("Sample", "Group")
17
+ } else if (is.list(group)) {
18
+ group <- do_call(
19
+ rbind,
20
+ lapply(names(group), function(n) data.frame(Sample = group[[n]], Group = n))
21
+ )
22
+ } else if (!is.null(group)) {
23
+ stop(paste0("Invalid group: ", paste0(group, collapse = ", ")))
24
+ }
25
+
26
+ cellranger_type <- NULL
27
+ log_info("Reading and merging metrics for each sample ...")
28
+ metrics <- NULL
29
+ for (indir in indirs) {
30
+ sample <- basename(indir)
31
+ log_debug("- Reading metrics for sample: ", sample)
32
+ metric <- read.csv(
33
+ file.path(indir, "outs", "metrics_summary.csv"),
34
+ header = TRUE, row.names = NULL, check.names = FALSE)
35
+ metric$Sample <- sample
36
+ sample_cellranger_type <- ifelse(
37
+ file.exists(file.path(indir, "outs", "clonotypes.csv")),
38
+ "vdj",
39
+ "count" # support more types in the future
40
+ )
41
+ cellranger_type <- cellranger_type %||% sample_cellranger_type
42
+ if (cellranger_type != sample_cellranger_type) {
43
+ stop("Multiple types of CellRanger output detected. Should be either count or vdj.")
44
+ }
45
+ if (!is.null(metrics)) {
46
+ missing_cols <- setdiff(colnames(metrics), colnames(metric))
47
+ if (length(missing_cols) > 0) {
48
+ log_warn('- Missing columns: {paste0(missing_cols, collapse = ", ")} in sample: {sample}')
49
+ metric[missing_cols] <- NA
50
+ }
51
+ missing_cols <- setdiff(colnames(metric), colnames(metrics))
52
+ if (length(missing_cols) > 0) {
53
+ log_warn('- Missing columns: {paste0(missing_cols, collapse = ", ")} in samples before {sample}')
54
+ metrics[missing_cols] <- NA
55
+ }
56
+ }
57
+ metrics <- rbind(metrics, metric)
58
+ }
59
+
60
+ if (is.null(metrics)) {
61
+ stop("No samples found, check the input directories.")
62
+ }
63
+
64
+ percent_columns <- sapply(colnames(metrics), function(x) {
65
+ is.character(metrics[[x]]) && grepl("%", metrics[[x]][1]) && x != "Sample"
66
+ })
67
+ percent_columns <- colnames(metrics)[percent_columns]
68
+ # Remove %
69
+ metrics <- metrics %>%
70
+ mutate(across(all_of(percent_columns), ~as.numeric(gsub("%", "", .x)))) %>%
71
+ rename_with(.fn = function(x) { paste0(x, " (%)") }, .cols = percent_columns) %>%
72
+ mutate(across(-Sample, ~as.numeric(gsub(",", "", .x))))
73
+
74
+ # Save metrics
75
+ write.table(
76
+ metrics,
77
+ file.path(outdir, "metrics.txt"),
78
+ sep = "\t",
79
+ quote = FALSE,
80
+ row.names = FALSE
81
+ )
82
+
83
+ add_report(
84
+ list(kind = "descr", content = "Metrics for all samples"),
85
+ list(kind = "table", src = file.path(outdir, "metrics.txt")),
86
+ h1 = "Metrics of all samples"
87
+ )
88
+
89
+ if (cellranger_type == "vdj") {
90
+ METRIC_DESCR = list(
91
+ `Estimated Number of Cells` = "The number of barcodes estimated to correspond to GEMs containing cells. See VDJ Cell Calling Algorithm.",
92
+ `Mean Read Pairs per Cell` = "Number of input read pairs divided by the estimated number of cells.",
93
+ `Number of Cells With Productive V-J Spanning Pair` = "Number of cell barcodes for which at least one productive sequence was found for each of TRA and TRB (or heavy and light chains, for Ig).",
94
+ `Number of Read Pairs` = "Total number of read pairs that were assigned to this library in demultiplexing.",
95
+ `Valid Barcodes` = "Fraction of reads with barcodes that match the whitelist after barcode correction.",
96
+ `Q30 Bases in Barcode` = "Fraction of cell barcode bases with Q-score greater than or equal to 30.",
97
+ `Q30 Bases in RNA Read 1` = "Fraction of read 1 bases with Q-score greater than or equal to 30. (Likewise for read 2.)",
98
+ `Q30 Bases in Sample Index` = "Fraction of sample index bases with Q-score greater than or equal to 30.",
99
+ `Q30 Bases in UMI` = "Fraction of UMI bases with Q-score ≥ 30.",
100
+ `Reads Mapped to Any V(D)J Gene` = "Fraction of reads that partially or wholly map to a V(D)J gene segment.",
101
+ `Reads Mapped to TRA` = "Fraction of reads that map partially or wholly to a TRA gene segment.",
102
+ `Mean Used Read Pairs per Cell` = "Mean number of read pairs used in assembly per cell barcode. These reads must have a cell barcode, map to a V(D)J gene, and have a UMI with sufficient read support, counted after subsampling.",
103
+ `Fraction Reads in Cells` = "Number of reads with cell barcodes divided by the number of reads with valid barcodes.",
104
+ `Median TRA UMIs per Cell` = "Median number of UMIs assigned to a TRA contig per cell.",
105
+ `Paired Clonotype Diversity` = "Effective diversity of the paired clonotypes, computed as the Inverse Simpson Index of the clonotype frequencies. A value of 1 indicates a minimally diverse sample - only one distinct clonotype was detected. A value equal to the estimated number of cells indicates a maximally diverse sample.",
106
+ `Cells With TRA Contig` = "Fraction of cell barcodes with at least one TRA contig annotated as a full or partial V(D)J gene.",
107
+ `Cells With CDR3-annotated TRA Contig` = "Fraction of cell barcodes with at least one TRA contig where a CDR3 was detected.",
108
+ `Cells With V-J Spanning Contig` = "Fraction of cell barcodes with at least one full-length contig.",
109
+ `Cells With V-J Spanning TRA Contig` = "Fraction of cell barcodes with at least one full-length TRA contig.",
110
+ `Cells With Productive TRA Contig` = "Fraction of cell barcodes with at least one full-length TRA contig that is productive.",
111
+ `Cells With Productive V-J Spanning Pair` = "Fraction of cell barcodes with at least one contig for each chain of the receptor pair that is productive."
112
+ )
113
+ } else {
114
+ METRIC_DESCR = list(
115
+ `Estimated Number of Cells` = "The number of barcodes associated with cell-containing partitions, estimated from the barcode UMI count distribution.",
116
+ `Mean Reads per Cell` = "The total number of reads divided by the estimated number of cells.",
117
+ `Median Genes per Cell` = "Median number of read pairs sequenced from the cells assigned to this sample. In case of multiplexing, only cell-associated barcodes assigned exactly one CMO can be assigned to a sample.",
118
+ `Number of Reads` = "Total number of sequencing reads.",
119
+ `Valid Barcodes` = "Fraction of reads with cell-barcodes that match the whitelist.",
120
+ `Sequencing Saturation` = 'Fraction of reads originating from an already-observed UMI. This is a function of library complexity and sequencing depth. More specifically, this is a ratio where: the denominator is the number of confidently-mapped reads with a valid cell-barcode and valid UMI, and the numerator is the subset of those reads that had a non-unique combination of (cell-barcode, UMI, gene). This metric was called "cDNA PCR Duplication" in versions of Cell Ranger prior to 1.2.',
121
+ `Q30 Bases in Barcode` = "Fraction of bases with Q-score at least 30 in the cell barcode sequences. This is the i7 index (I1) read for the Single Cell 3' v1 chemistry and the R1 read for the Single Cell 3' v2 chemistry.",
122
+ `Q30 Bases in RNA` = "Fraction of bases with Q-score at least 30 in the RNA read sequences. This is Illumina R1 for the Single Cell 3' v1 chemistry and Illumina R2 for the Single Cell 3' v2 chemistry.",
123
+ `Q30 Bases in UMI` = "Fraction of bases with Q-score at least 30 in the UMI sequences. This is the R2 read for the Single Cell 3' v1 chemistry and the R1 read for the Single Cell 3' v2 chemistry.",
124
+ `Reads Mapped to Genome` = "Fraction of reads that mapped to the genome.",
125
+ `Reads Mapped Confidently to Genome` = "Fraction of reads that mapped uniquely to the genome. If a read mapped to exonic loci from a single gene and also to non-exonic loci, it is considered uniquely mapped to one of the exonic loci.",
126
+ `Reads Mapped Confidently to Intergenic Regions` = "Fraction of reads that mapped to the intergenic regions of the genome with a high mapping quality score as reported by the aligner.",
127
+ `Reads Mapped Confidently to Intronic Regions` = "Fraction of reads that mapped to the intronic regions of the genome with a high mapping quality score as reported by the aligner.",
128
+ `Reads Mapped Confidently to Exonic Regions` = "Fraction of reads that mapped to the exonic regions of the genome with a high mapping quality score as reported by the aligner.",
129
+ `Reads Mapped Confidently to Transcriptome` = "Fraction of reads that mapped to a unique gene in the transcriptome with a high mapping quality score as reported by the aligner. The read must be consistent with annotated splice junctions when include-introns=false. These reads are considered for UMI counting.",
130
+ `Reads Confidently Mapped Antisense` = "Fraction of reads confidently mapped to the transcriptome, but on the opposite strand of their annotated gene. A read is counted as antisense if it has any alignments that are consistent with an exon of a transcript but antisense to it, and has no sense alignments.",
131
+ `Total Genes Detected Median UMI Counts per Cell` = "The number of genes with at least one UMI count in any cell."
132
+ )
133
+ }
134
+ log_info("Plotting metrics ...")
135
+ for (metric in colnames(metrics)) {
136
+ if (metric == "Sample") { next }
137
+ metric_name <- sub(" \\(%\\)$", "", metric)
138
+ log_info("- {metric_name}")
139
+
140
+ add_report(
141
+ list(
142
+ kind = "descr",
143
+ content = METRIC_DESCR[[metric_name]] %||% paste0("Metric: ", metric)
144
+ ),
145
+ h1 = metric
146
+ )
147
+
148
+ # barplot
149
+ p <- ggplot(metrics, aes(x = Sample, y = !!sym(metric))) +
150
+ geom_bar(stat = "identity", fill = "steelblue") +
151
+ labs(x = "Sample", y = metric) +
152
+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
153
+
154
+ figfile <- file.path(outdir, paste0(slugify(metric), ".barplot.png"))
155
+ png(figfile, height = 600, res = 100, width = nrow(metrics) * 30 + 200)
156
+ print(p)
157
+ dev.off()
158
+
159
+ add_report(
160
+ list(src = figfile, name = "By Sample"),
161
+ ui = "table_of_images",
162
+ h1 = metric
163
+ )
164
+
165
+ if (is.null(group)) { next }
166
+ # boxplot, if group is provided
167
+ # group: Sample, Group
168
+ pdata <- group %>%
169
+ left_join(metrics, by = "Sample") %>%
170
+ mutate(Group = factor(Group, levels = unique(Group)))
171
+
172
+ p <- ggplot(pdata, aes(x = Group, y = !!sym(metric))) +
173
+ geom_boxplot(fill = "steelblue") +
174
+ labs(x = "Group", y = metric) +
175
+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
176
+
177
+ figfile <- file.path(outdir, paste0(slugify(metric), ".boxplot.png"))
178
+ png(figfile, height = 600, res = 100, width = length(unique(pdata$Group)) * 30 + 200)
179
+ print(p)
180
+ dev.off()
181
+
182
+ add_report(
183
+ list(src = figfile, name = "By Group"),
184
+ ui = "table_of_images",
185
+ h1 = metric
186
+ )
187
+ }
188
+
189
+ save_report(joboutdir)
@@ -8,7 +8,6 @@ library(dplyr)
8
8
  library(ggplot2)
9
9
  library(ggVennDiagram)
10
10
  library(UpSetR)
11
- library(slugify)
12
11
  library(circlize)
13
12
  library(ComplexHeatmap)
14
13
 
@@ -127,8 +126,8 @@ casename_info <- function(casename, create = FALSE) {
127
126
  casename = casename,
128
127
  section = sec_case_names[1],
129
128
  case = cname,
130
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
131
- case_slug = slugify(cname, tolower = FALSE)
129
+ section_slug = slugify(sec_case_names[1]),
130
+ case_slug = slugify(cname)
132
131
  )
133
132
  out$sec_dir <- file.path(outdir, out$section_slug)
134
133
  if (create) {
@@ -139,7 +138,7 @@ casename_info <- function(casename, create = FALSE) {
139
138
 
140
139
  plot_heatmap <- function(group, meta, case, info, cluster_order_val) {
141
140
  log_info(paste("- Running heatmap for case:", info$casename, "group:", group))
142
- hmfile <- file.path(info$sec_dir, paste0(info$case_slug, ".", slugify(group, tolower = FALSE), ".heatmap.png"))
141
+ hmfile <- file.path(info$sec_dir, paste0(info$case_slug, ".", slugify(group), ".heatmap.png"))
143
142
 
144
143
  # A matrix: 10 × 8 of type int
145
144
  # g3 g6 g0 g1 g7 g5 g4 g8
@@ -435,7 +434,7 @@ do_overlap <- function(section) {
435
434
  stop(paste0("Not enough cases for overlap for section: ", section))
436
435
  }
437
436
 
438
- sec_dir <- file.path(outdir, slugify(section, tolower = FALSE))
437
+ sec_dir <- file.path(outdir, slugify(section))
439
438
  venn_plot <- file.path(sec_dir, "venn.png")
440
439
  venn_p <- ggVennDiagram(overlap_cases, label_percent_digit = 1) +
441
440
  scale_fill_distiller(palette = "Reds", direction = 1) +
@@ -14,7 +14,6 @@ library(future)
14
14
  library(tidyseurat)
15
15
  library(ggVennDiagram)
16
16
  library(UpSetR)
17
- library(slugify)
18
17
 
19
18
  log_info("Setting up EnrichR ...")
20
19
  setEnrichrSite("Enrichr")
@@ -205,8 +204,8 @@ casename_info <- function(casename, create = FALSE) {
205
204
  casename = casename,
206
205
  section = sec_case_names[1],
207
206
  case = cname,
208
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
209
- case_slug = slugify(cname, tolower = FALSE)
207
+ section_slug = slugify(sec_case_names[1]),
208
+ case_slug = slugify(cname)
210
209
  )
211
210
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
212
211
  if (create) {
@@ -12,7 +12,6 @@ library(ggplot2)
12
12
  library(ggprism)
13
13
  library(parallel)
14
14
  library(tidyseurat)
15
- library(slugify)
16
15
 
17
16
  setEnrichrSite("Enrichr")
18
17
 
@@ -133,8 +132,8 @@ casename_info <- function(casename, create = FALSE) {
133
132
  casename = casename,
134
133
  section = sec_case_names[1],
135
134
  case = cname,
136
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
137
- case_slug = slugify(cname, tolower = FALSE)
135
+ section_slug = slugify(sec_case_names[1]),
136
+ case_slug = slugify(cname)
138
137
  )
139
138
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
140
139
  if (create) {
@@ -283,7 +282,7 @@ do_case <- function(casename) {
283
282
  # Plot the top 10 genes in each group with violin plots
284
283
  geneplots <- list()
285
284
  for (gene in markers$gene) {
286
- outfile <- file.path(plotdir, paste0(slugify(gene, tolower = FALSE), ".png"))
285
+ outfile <- file.path(plotdir, paste0(slugify(gene), ".png"))
287
286
  p <- ggplot(df, aes_string(x="GROUP", y=bQuote(gene), fill="GROUP")) +
288
287
  geom_violin(alpha = .8) +
289
288
  geom_boxplot(width=0.1, fill="white") +
@@ -7,7 +7,6 @@ library(tidyr)
7
7
  library(tibble)
8
8
  library(ggplot2)
9
9
  library(ggradar)
10
- library(slugify)
11
10
  library(ggprism)
12
11
 
13
12
  # input/output
@@ -143,8 +142,8 @@ casename_info <- function(casename, create = FALSE) {
143
142
  casename = casename,
144
143
  section = sec_case_names[1],
145
144
  case = cname,
146
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
147
- case_slug = slugify(cname, tolower = FALSE)
145
+ section_slug = slugify(sec_case_names[1]),
146
+ case_slug = slugify(cname)
148
147
  )
149
148
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
150
149
  if (create) {
@@ -4,7 +4,6 @@ source("{{biopipen_dir}}/utils/mutate_helpers.R")
4
4
  library(rlang)
5
5
  library(Seurat)
6
6
  library(tidyseurat)
7
- library(slugify)
8
7
 
9
8
  srtfile <- {{in.srtobj | r}} # nolint
10
9
  outdir <- {{out.outdir | r}} # nolint
@@ -122,8 +121,8 @@ casename_info <- function(casename, create = FALSE) {
122
121
  casename = casename,
123
122
  section = sec_case_names[1],
124
123
  case = cname,
125
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
126
- case_slug = slugify(cname, tolower = FALSE)
124
+ section_slug = slugify(sec_case_names[1]),
125
+ case_slug = slugify(cname)
127
126
  )
128
127
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
129
128
  if (create) {
@@ -64,7 +64,7 @@ if (is.null(hists) || length(hists) == 0) {
64
64
  hists[[name]] <- list_update(hists_defaults, hists[[name]])
65
65
  case <- hists[[name]]
66
66
 
67
- odir <- file.path(outdir, "hists", slugify(name, tolower = FALSE))
67
+ odir <- file.path(outdir, "hists", slugify(name))
68
68
  dir.create(odir, recursive=TRUE, showWarnings=FALSE)
69
69
 
70
70
  h1 <- name
@@ -1,7 +1,6 @@
1
1
  source("{{biopipen_dir}}/utils/misc.R")
2
2
  source("{{biopipen_dir}}/utils/mutate_helpers.R")
3
3
  source("{{biopipen_dir}}/utils/plot.R")
4
- library(slugify)
5
4
  library(Seurat)
6
5
  library(rlang)
7
6
  library(dplyr)
@@ -5,7 +5,6 @@ library(future)
5
5
  library(bracer)
6
6
  library(ggplot2)
7
7
  library(tidyseurat)
8
- library(slugify)
9
8
 
10
9
  metafile = {{in.metafile | quote}}
11
10
  rdsfile = {{out.rdsfile | quote}}
@@ -17,13 +16,17 @@ options(future.globals.maxSize = 80000 * 1024^2)
17
16
  options(Seurat.object.assay.version = "v5")
18
17
  plan(strategy = "multicore", workers = envs$ncores)
19
18
 
19
+ .stringify_list <- function(x) {
20
+ paste(sapply(names(x), function(n) paste(n, x[[n]], sep = " = ") ), collapse = "; ")
21
+ }
22
+
20
23
  add_report(
21
24
  list(
22
25
  kind = "descr",
23
26
  name = "Filters applied",
24
27
  content = paste0(
25
28
  "<p>Cell filters: ", html_escape(envs$cell_qc), "</p>",
26
- "<p>Gene filters: ", html_escape(envs$gene_qc), "</p>"
29
+ "<p>Gene filters: ", html_escape(.stringify_list(envs$gene_qc)), "</p>"
27
30
  )
28
31
  ),
29
32
  h1 = "Filters and QC"
@@ -177,7 +180,7 @@ for (feat in feats) {
177
180
  position = position_jitterdodge(jitter.width = 0.4, dodge.width = 0.9)
178
181
  ) + scale_color_manual(values = c("#181818", pal_biopipen()(1)), breaks = c(TRUE, FALSE))
179
182
 
180
- vlnplot = file.path(plotsdir, paste0(slugify(feat, tolower = FALSE), ".vln.png"))
183
+ vlnplot = file.path(plotsdir, paste0(slugify(feat), ".vln.png"))
181
184
  png(
182
185
  vlnplot,
183
186
  width = 800 + length(samples) * 15, height = 600, res = 100
@@ -221,7 +224,7 @@ for (feat in setdiff(feats, "nCount_RNA")) {
221
224
  NoLegend() +
222
225
  scale_color_manual(values = c("#181818", pal_biopipen()(1)), breaks = c(TRUE, FALSE))
223
226
 
224
- scatfile = file.path(plotsdir, paste0(slugify(feat, tolower = FALSE), "-nCount_RNA.scatter.png"))
227
+ scatfile = file.path(plotsdir, paste0(slugify(feat), "-nCount_RNA.scatter.png"))
225
228
  png(scatfile, width = 800, height = 600, res = 100)
226
229
  print(scat_p)
227
230
  dev.off()
@@ -302,7 +305,7 @@ if (envs$use_sct) {
302
305
  log_info("- Running SCTransform ...")
303
306
  SCTransformArgs <- envs$SCTransform
304
307
  # log to stdout but don't populate it to running log
305
- print(" SCTransform: {.formatArgs(SCTransformArgs)}")
308
+ print(paste0(" SCTransform: ", .formatArgs(SCTransformArgs)))
306
309
  log_debug(" SCTransform: {.formatArgs(SCTransformArgs)}")
307
310
  SCTransformArgs$object <- sobj
308
311
  sobj <- do_call(SCTransform, SCTransformArgs)
@@ -310,21 +313,21 @@ if (envs$use_sct) {
310
313
  } else {
311
314
  log_info("- Running NormalizeData ...")
312
315
  NormalizeDataArgs <- envs$NormalizeData
313
- print(" NormalizeData: {.formatArgs(NormalizeDataArgs)}")
316
+ print(paste0(" NormalizeData: ", .formatArgs(NormalizeDataArgs)))
314
317
  log_debug(" NormalizeData: {.formatArgs(NormalizeDataArgs)}")
315
318
  NormalizeDataArgs$object <- sobj
316
319
  sobj <- do_call(NormalizeData, NormalizeDataArgs)
317
320
 
318
321
  log_info("- Running FindVariableFeatures ...")
319
322
  FindVariableFeaturesArgs <- envs$FindVariableFeatures
320
- print(" FindVariableFeatures: {.formatArgs(FindVariableFeaturesArgs)}")
323
+ print(paste0(" FindVariableFeatures: ", .formatArgs(FindVariableFeaturesArgs)))
321
324
  log_debug(" FindVariableFeatures: {.formatArgs(FindVariableFeaturesArgs)}")
322
325
  FindVariableFeaturesArgs$object <- sobj
323
326
  sobj <- do_call(FindVariableFeatures, FindVariableFeaturesArgs)
324
327
 
325
328
  log_info("- Running ScaleData ...")
326
329
  ScaleDataArgs <- envs$ScaleData
327
- print(" ScaleData: {.formatArgs(ScaleDataArgs)}")
330
+ print(paste0(" ScaleData: ", .formatArgs(ScaleDataArgs)))
328
331
  log_debug(" ScaleData: {.formatArgs(ScaleDataArgs)}")
329
332
  ScaleDataArgs$object <- sobj
330
333
  sobj <- do_call(ScaleData, ScaleDataArgs)
@@ -333,7 +336,7 @@ if (envs$use_sct) {
333
336
  log_info("- Running RunPCA ...")
334
337
  RunPCAArgs <- envs$RunPCA
335
338
  RunPCAArgs$npcs <- if (is.null(RunPCAArgs$npcs)) { 50 } else { min(RunPCAArgs$npcs, ncol(sobj) - 1) }
336
- print(" RunPCA: {.formatArgs(RunPCAArgs)}")
339
+ print(paste0(" RunPCA: ", .formatArgs(RunPCAArgs)))
337
340
  log_debug(" RunPCA: {.formatArgs(RunPCAArgs)}")
338
341
  RunPCAArgs$object <- sobj
339
342
  sobj <- do_call(RunPCA, RunPCAArgs)
@@ -367,7 +370,7 @@ if (!envs$no_integration) {
367
370
  if (is.null(IntegrateLayersArgs$new.reduction)) {
368
371
  IntegrateLayersArgs$new.reduction <- new_reductions[[method]]
369
372
  }
370
- print(" IntegrateLayers: {.formatArgs(IntegrateLayersArgs)}")
373
+ print(paste0(" IntegrateLayers: ", .formatArgs(IntegrateLayersArgs)))
371
374
  log_debug(" IntegrateLayers: {.formatArgs(IntegrateLayersArgs)}")
372
375
  IntegrateLayersArgs$object <- sobj
373
376
  sobj <- do_call(IntegrateLayers, IntegrateLayersArgs)
@@ -5,7 +5,6 @@ library(tibble)
5
5
  library(enrichR)
6
6
  library(rlang)
7
7
  library(dplyr)
8
- library(slugify)
9
8
  library(ggprism)
10
9
 
11
10
  setEnrichrSite("Enrichr")
@@ -134,8 +133,8 @@ casename_info <- function(casename, create = FALSE) {
134
133
  casename = casename,
135
134
  section = sec_case_names[1],
136
135
  case = cname,
137
- section_slug = slugify(sec_case_names[1], tolower = FALSE),
138
- case_slug = slugify(cname, tolower = FALSE)
136
+ section_slug = slugify(sec_case_names[1]),
137
+ case_slug = slugify(cname)
139
138
  )
140
139
  out$casedir <- file.path(outdir, out$section_slug, out$case_slug)
141
140
  if (create) {
@@ -3,7 +3,6 @@ source("{{biopipen_dir}}/utils/gsea.R")
3
3
 
4
4
  library(parallel)
5
5
  library(Seurat)
6
- library(slugify)
7
6
 
8
7
  sobjfile <- {{ in.sobjfile | r }}
9
8
  outdir <- {{ out.outdir | r }}
@@ -44,7 +43,7 @@ sobj <- readRDS(sobjfile)
44
43
  do_one_group <- function(obj, features, group, outputdir, h1) {
45
44
  log_info(paste("- Processing group", grouping, ":", group))
46
45
  groupname = paste0(grouping_prefix, group)
47
- odir = file.path(outputdir, slugify(groupname, tolower = FALSE))
46
+ odir = file.path(outputdir, slugify(groupname))
48
47
  dir.create(odir, showWarnings = FALSE)
49
48
 
50
49
  classes = as.character(obj@meta.data[[grouping]])
@@ -109,7 +108,7 @@ do_one_subset <- function(s, subset_col, subset_prefix) {
109
108
  outputdir <- file.path(outdir, "ALL")
110
109
  subset_obj <- sobj
111
110
  } else {
112
- outputdir <- file.path(outdir, slugify(paste0(subset_prefix, s), tolower = FALSE))
111
+ outputdir <- file.path(outdir, slugify(paste0(subset_prefix, s)))
113
112
  subset_code <- paste0("subset(sobj, subset = ", subset_col, "=='", s, "')")
114
113
  subset_obj <- eval(parse(text = subset_code))
115
114
  }
@@ -4,7 +4,6 @@ source("{{biopipen_dir}}/utils/gsea.R")
4
4
  library(parallel)
5
5
  library(scater)
6
6
  library(Seurat)
7
- library(slugify)
8
7
 
9
8
  sobjfile <- {{ in.sobjfile | r }}
10
9
  outdir <- {{ out.outdir | r }}
@@ -139,7 +138,7 @@ do_one_group <- function(group) {
139
138
  )
140
139
  obj = eval(parse(text = group_code))
141
140
  groupname = paste0(grouping_prefix, group)
142
- groupdir = file.path(outdir, slugify(groupname, tolower = FALSE))
141
+ groupdir = file.path(outdir, slugify(groupname))
143
142
  dir.create(groupdir, showWarnings = FALSE)
144
143
 
145
144
  report = list()
@@ -8,7 +8,6 @@ library(ggprism)
8
8
  library(Matrix)
9
9
  library(sparseMatrixStats)
10
10
  library(Seurat)
11
- library(slugify)
12
11
 
13
12
  sobjfile <- {{ in.sobjfile | r }}
14
13
  outdir <- {{ out.outdir | r }}
@@ -53,7 +52,7 @@ do_one_subset <- function(s, subset_col, subset_prefix) {
53
52
  subset_dir = file.path(outdir, "ALL")
54
53
  subset_obj = sobj
55
54
  } else {
56
- subset_dir = file.path(outdir, slugify(paste0(subset_prefix, s), tolower = FALSE))
55
+ subset_dir = file.path(outdir, slugify(paste0(subset_prefix, s)))
57
56
  subset_code = paste0("subset(sobj, subset = ", subset_col, " == '", s, "')")
58
57
  subset_obj = eval(parse(text = subset_code))
59
58
  }
@@ -9,7 +9,6 @@ library(hash)
9
9
  library(glmnet)
10
10
  library(broom.mixed)
11
11
  library(stringr)
12
- library(slugify)
13
12
 
14
13
  immdatafile = {{in.immdata | quote}}
15
14
  srtobjfile = {{in.srtobj | r}}
@@ -10,7 +10,6 @@ library(ggplot2)
10
10
  library(ggprism)
11
11
  library(ggVennDiagram)
12
12
  library(UpSetR)
13
- library(slugify)
14
13
 
15
14
  theme_set(theme_prism())
16
15
 
@@ -163,19 +162,19 @@ perpare_case <- function(casename, case) {
163
162
 
164
163
  # Create case-specific directories
165
164
  # Scatter plots
166
- scatter_dir <- file.path(outdir, slugify(casename, tolower = FALSE), "scatter")
165
+ scatter_dir <- file.path(outdir, slugify(casename), "scatter")
167
166
  dir.create(scatter_dir, recursive = TRUE, showWarnings = FALSE)
168
167
 
169
168
  # Venn diagrams
170
- venn_dir <- file.path(outdir, slugify(casename, tolower = FALSE), "venn")
169
+ venn_dir <- file.path(outdir, slugify(casename), "venn")
171
170
  dir.create(venn_dir, recursive = TRUE, showWarnings = FALSE)
172
171
 
173
172
  # Upset plots
174
- upset_dir <- file.path(outdir, slugify(casename, tolower = FALSE), "upset")
173
+ upset_dir <- file.path(outdir, slugify(casename), "upset")
175
174
  dir.create(upset_dir, recursive = TRUE, showWarnings = FALSE)
176
175
 
177
176
  # Counts
178
- counts_dir <- file.path(outdir, slugify(casename, tolower = FALSE), "counts")
177
+ counts_dir <- file.path(outdir, slugify(casename), "counts")
179
178
  dir.create(counts_dir, recursive = TRUE, showWarnings = FALSE)
180
179
 
181
180
  case
@@ -396,7 +395,7 @@ headings <- function(section, casename, subject) {
396
395
  }
397
396
 
398
397
  handle_subject <- function(i, subjects, casename, case) {
399
- casedir = file.path(outdir, slugify(casename, tolower = FALSE))
398
+ casedir = file.path(outdir, slugify(casename))
400
399
  # Generate a residency table
401
400
  # | CDR3.aa | Tumor | Normal |
402
401
  # | SEABESRWEFAEF | 0 | 10 |
@@ -657,9 +657,9 @@ run_div_case = function(casename) {
657
657
  log_info("Processing case: {casename} ...")
658
658
  case = div_cases[[casename]]
659
659
  if (case$method == "raref") {
660
- ddir = file.path(outdir, "rarefraction", slugify(casename, tolower = FALSE))
660
+ ddir = file.path(outdir, "rarefraction", slugify(casename))
661
661
  } else {
662
- ddir = file.path(div_dir, slugify(casename, tolower = FALSE))
662
+ ddir = file.path(div_dir, slugify(casename))
663
663
  }
664
664
  dir.create(ddir, recursive = TRUE, showWarnings = FALSE)
665
665
 
@@ -87,7 +87,7 @@ for (name in names(cases)) {
87
87
  do_one_case_kmer = function(name, case, kmer_dir) {
88
88
  # print(paste0(" Case: ", name))
89
89
  log_info("Processing case: {name} ...")
90
- odir = file.path(kmer_dir, slugify(name, tolower = FALSE))
90
+ odir = file.path(kmer_dir, slugify(name))
91
91
  dir.create(odir, showWarnings = FALSE)
92
92
 
93
93
  if (!is.null(case$subset)) {
@@ -44,7 +44,7 @@ if (is.null(spects$cases) || length(spects$cases) == 0) {
44
44
  do_one_case_spectratyping = function(name, case, spect_dir) {
45
45
  # print(paste0(" Case: ", name))
46
46
  log_info("- Processing case: {name} ...")
47
- odir = file.path(spect_dir, slugify(name, tolower = FALSE))
47
+ odir = file.path(spect_dir, slugify(name))
48
48
  dir.create(odir, showWarnings = FALSE)
49
49
 
50
50
  if (!is.null(case$subset)) {
@@ -61,7 +61,7 @@ do_one_case_spectratyping = function(name, case, spect_dir) {
61
61
  .quant = case$quant,
62
62
  .col = case$col
63
63
  )
64
- spectfile = file.path(odir, paste0(slugify(sample, tolower = FALSE), ".spect"))
64
+ spectfile = file.path(odir, paste0(slugify(sample), ".spect.png"))
65
65
  png(
66
66
  spectfile,
67
67
  res = case$devpars$res,
@@ -47,7 +47,7 @@ dir.create(vjjunc_dir, showWarnings = FALSE)
47
47
 
48
48
  do_one_case_vjjunc <- function(name, case) {
49
49
  log_info("Processing case: {name} ...")
50
- odir = file.path(vjjunc_dir, slugify(name, tolower = FALSE))
50
+ odir = file.path(vjjunc_dir, slugify(name))
51
51
  dir.create(odir, showWarnings = FALSE)
52
52
 
53
53
  if (!is.null(case$subset)) {
@@ -12,7 +12,6 @@ library(glue)
12
12
  library(tidyr)
13
13
  library(tibble)
14
14
  library(logger)
15
- library(slugify)
16
15
 
17
16
  log_info("Loading arguments ...")
18
17
  theme_set(theme_prism())
@@ -6,7 +6,6 @@ library(dplyr)
6
6
  library(rlang)
7
7
  library(immunarch)
8
8
  library(ggprism)
9
- library(slugify)
10
9
 
11
10
  immfile = {{in.immfile | quote}}
12
11
  outdir = {{out.outdir | quote}}
@@ -56,7 +55,7 @@ sample_diversity_cases = expand_cases(sample_diversity_envs)
56
55
  cluster_size_distribution = function(name) {
57
56
  log_info("- Working on cluster size distribution: {name}")
58
57
 
59
- odir = file.path(outdir, "ClusterSizeDistribution", slugify(name, tolower = FALSE))
58
+ odir = file.path(outdir, "ClusterSizeDistribution", slugify(name))
60
59
  dir.create(odir, showWarnings = FALSE, recursive = TRUE)
61
60
  case = cluster_size_cases[[name]]
62
61
 
@@ -100,7 +99,7 @@ cluster_size_distribution = function(name) {
100
99
  shared_clusters = function(name) {
101
100
  log_info("- Working on shared clusters: {name}")
102
101
 
103
- odir = file.path(outdir, "SharedClusters", slugify(name, tolower = FALSE))
102
+ odir = file.path(outdir, "SharedClusters", slugify(name))
104
103
  dir.create(odir, showWarnings = FALSE, recursive = TRUE)
105
104
  case = shared_clusters_cases[[name]]
106
105
  if (!is.null(case$grouping)) {
@@ -169,7 +168,7 @@ shared_clusters = function(name) {
169
168
  }
170
169
 
171
170
  shared_clusters_by_grouping = function(name) {
172
- odir = file.path(outdir, "SharedClusters", slugify(name, tolower = FALSE))
171
+ odir = file.path(outdir, "SharedClusters", slugify(name))
173
172
  case = shared_clusters_cases[[name]]
174
173
 
175
174
  data = list()
@@ -241,7 +240,7 @@ div_methods = list(
241
240
  sample_diversity = function(name) {
242
241
  log_info("- Working on sample diversity: {name}")
243
242
 
244
- odir = file.path(outdir, "SampleDiversity", slugify(name, tolower = FALSE))
243
+ odir = file.path(outdir, "SampleDiversity", slugify(name))
245
244
  dir.create(odir, showWarnings = FALSE, recursive = TRUE)
246
245
  case = sample_diversity_cases[[name]]
247
246
 
biopipen/utils/gsea.R CHANGED
@@ -1,8 +1,13 @@
1
1
  library(ggplot2)
2
2
  library(dplyr)
3
3
  library(tibble)
4
- library(slugify)
5
4
 
5
+ .slugify <- function(x, non_alphanum_replace="-", collapse_replace=TRUE, tolower=FALSE) {
6
+ x <- gsub("[^[:alnum:]_]", non_alphanum_replace, x)
7
+ if(collapse_replace) x <- gsub(paste0(non_alphanum_replace, "+"), non_alphanum_replace, x)
8
+ if(tolower) x <- tolower(x)
9
+ x
10
+ }
6
11
 
7
12
  localizeGmtfile <- function(gmturl, cachedir = tempdir()) {
8
13
  # Download the GMT file and save it to cachedir
@@ -176,7 +181,7 @@ runFGSEA = function(
176
181
  dev.off()
177
182
 
178
183
  for (pathway in topPathways) {
179
- enrfig = file.path(outdir, paste0("fgsea_", slugify(pathway), ".png"))
184
+ enrfig = file.path(outdir, paste0("fgsea_", .slugify(pathway), ".png"))
180
185
  png(enrfig, res=100, width=1000, height=800)
181
186
  print(plotEnrichment(
182
187
  envs$pathways[[pathway]],
biopipen/utils/misc.R CHANGED
@@ -22,14 +22,17 @@ bQuote <- function(x) {
22
22
  }
23
23
  }
24
24
 
25
- slugify <- function(x, non_alphanum_replace="", space_replace="_", tolower=TRUE) {
26
- x <- gsub("[^[:alnum:] ]", non_alphanum_replace, x)
27
- x <- trimws(x)
28
- x <- gsub("[[:space:]]", space_replace, x)
29
-
30
- if(tolower) { x <- tolower(x) }
31
-
32
- return(x)
25
+ #' Slugify a string
26
+ #' @param x A string
27
+ #' @param non_alphanum_replace Replace non-alphanumeric characters
28
+ #' @param collapse_replace Collapse consecutive non-alphanumeric character replacements
29
+ #' @param tolower Convert to lowercase
30
+ #' @return A slugified string
31
+ slugify <- function(x, non_alphanum_replace="-", collapse_replace=TRUE, tolower=FALSE) {
32
+ x <- gsub("[^[:alnum:]_]", non_alphanum_replace, x)
33
+ if(collapse_replace) x <- gsub(paste0(non_alphanum_replace, "+"), non_alphanum_replace, x)
34
+ if(tolower) x <- tolower(x)
35
+ x
33
36
  }
34
37
 
35
38
  do_call <- function (what, args, quote = FALSE, envir = parent.frame()) {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: biopipen
3
- Version: 0.24.0
3
+ Version: 0.24.2
4
4
  Summary: Bioinformatics processes/pipelines that can be run from `pipen run`
5
5
  License: MIT
6
6
  Author: pwwang
@@ -1,4 +1,4 @@
1
- biopipen/__init__.py,sha256=DxtMZD542lg_xb6icrE2d5JOY8oUi-v34i2Ar63ddvs,23
1
+ biopipen/__init__.py,sha256=UBF3OYTcBAovta3ux5ybxb0MZYAGpGO79WH_ax2NGeI,23
2
2
  biopipen/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  biopipen/core/config.py,sha256=edK5xnDhM8j27srDzsxubi934NMrglLoKrdcC8qsEPk,1069
4
4
  biopipen/core/config.toml,sha256=Rn7Cta7WsMtmQkKGC4h9d5dU_STaIVBgR8UliiGgL6o,1757
@@ -10,7 +10,8 @@ biopipen/ns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  biopipen/ns/bam.py,sha256=5AsYrB0mtr_mH6mCL6gjJ5rC4NywpjFkpFjUrBGp7Fk,9301
11
11
  biopipen/ns/bcftools.py,sha256=puCDfIL-1z6cz2y1Rlz-ESNIr8xJgeIjEQ440qicCvM,3467
12
12
  biopipen/ns/bed.py,sha256=UN38qUChDeE-ipuSBY8RVLwvJqM2wxSRmlhOiDo4JG0,5395
13
- biopipen/ns/cellranger.py,sha256=vwyPNaiRIFMp1e8kSJ1UNsE9ZcUykNniakKE-BqZR60,3681
13
+ biopipen/ns/cellranger.py,sha256=2FwE8YNsGEXn-vS0AmO7m5xmlTgNQjL1lhWUeJ6XNJA,4796
14
+ biopipen/ns/cellranger_pipeline.py,sha256=D6gvIeasHjDCdro7f4wjomxRYTtsJT77Ld47XzlU3Fw,2891
14
15
  biopipen/ns/cnv.py,sha256=vq6dZfEOyuVuqg3nP6FQtNmQ-JocpBJMX9IYlZ0OPD0,6803
15
16
  biopipen/ns/cnvkit.py,sha256=5mA2Q8-YDs4g1HoxtpB_NWnyZYwEThNr3s3wlubLQrQ,31130
16
17
  biopipen/ns/cnvkit_pipeline.py,sha256=2fJLn70L2jJ81ZMNdnU84Sf3HoKA2CSnHuDzLGR8jmw,36854
@@ -29,8 +30,9 @@ biopipen/ns/web.py,sha256=3zucrDo-IVsSnIvlw-deoScuxqWa6OMTm8Vo-R4E44Q,2224
29
30
  biopipen/reports/bam/CNAClinic.svelte,sha256=D4IxQcgDCPQZMbXog-aZP5iJEQTK2N4i0C60e_iXyfs,213
30
31
  biopipen/reports/bam/CNVpytor.svelte,sha256=s03SlhbEPd8-_44Dy_cqE8FSErhUdqStLK39te5o7ZE,1364
31
32
  biopipen/reports/bam/ControlFREEC.svelte,sha256=OwN96RW0dN-gtQ1zWKbXYZCYkkrOC0RQmP3UG4x7zqU,837
32
- biopipen/reports/cellranger/CellRangerCount.svelte,sha256=l153cN-4F1aTN6TP9t-BkxMFiIyTsD2uOnRQOcWefqo,418
33
- biopipen/reports/cellranger/CellRangerVdj.svelte,sha256=l153cN-4F1aTN6TP9t-BkxMFiIyTsD2uOnRQOcWefqo,418
33
+ biopipen/reports/cellranger/CellRangerCount.svelte,sha256=InkkGold9Vta8vSPeE7WgFuFWuMVBkQvwc2yxWFGVM4,466
34
+ biopipen/reports/cellranger/CellRangerSummary.svelte,sha256=WEYPwmcmgtSqpFpTvNPV40yZR-7ERa5LgZni2RXxUZQ,348
35
+ biopipen/reports/cellranger/CellRangerVdj.svelte,sha256=InkkGold9Vta8vSPeE7WgFuFWuMVBkQvwc2yxWFGVM4,466
34
36
  biopipen/reports/cnv/AneuploidyScore.svelte,sha256=x0LbhqjauZpqMzmzDWmYgx-rEh5Tzo8qBrXcLcM0h78,1020
35
37
  biopipen/reports/cnv/AneuploidyScoreSummary.svelte,sha256=AWlns70mChJGhH3z8r5uXuI4tc7VbVN_cOUdqBr3ZKg,4414
36
38
  biopipen/reports/cnv/TMADScoreSummary.svelte,sha256=tJutaMOqeXxKroAosOIqOJVyhTTFet-soMwuOYVHTYU,2060
@@ -78,6 +80,7 @@ biopipen/scripts/bed/BedConsensus.py,sha256=gfAxuIalvCEpS0tiOyAJGPYGgHN0L-hm0K37
78
80
  biopipen/scripts/bed/BedLiftOver.sh,sha256=Y4gBsz9w4zhE29UmWojO6F4PXMMMWC1uCzjrxa19eOs,256
79
81
  biopipen/scripts/bed/BedtoolsMerge.py,sha256=TjKO5MpUzDj931bQAWku2660MVSiZzdMHt_v2Xbt0IE,355
80
82
  biopipen/scripts/cellranger/CellRangerCount.py,sha256=ZDcry8suLhulXiTsl01LGKmSJkewJ-TgHazLtfsBr6U,2516
83
+ biopipen/scripts/cellranger/CellRangerSummary.R,sha256=8EqP4j074RLi5Adw47xyqQwkDEcvSS6Yfk0UgKKYOuo,11045
81
84
  biopipen/scripts/cellranger/CellRangerVdj.py,sha256=-QbhPKqFBZ15Es6NJaU7Lwf1KQW_3Lyv0aISh-Urk2M,2504
82
85
  biopipen/scripts/cnv/AneuploidyScore.R,sha256=liAN8u8_lj8voJ01oBW9Dw09yi388KF5f_gwPOv0wdE,8437
83
86
  biopipen/scripts/cnv/AneuploidyScoreSummary.R,sha256=9Zni5zqYfzevs5XSAt3fqD9WZ_RWr_ByUnXReKLLWoY,12337
@@ -113,47 +116,47 @@ biopipen/scripts/scrna/CellTypeAnnotation-hitype.R,sha256=6_DBAlLKcHqaMyWGZWvTd4
113
116
  biopipen/scripts/scrna/CellTypeAnnotation-sccatch.R,sha256=1ejye0hs-EOwzzdP9gFWSLPcF6dOAA6VmNKXEjmS11E,1654
114
117
  biopipen/scripts/scrna/CellTypeAnnotation-sctype.R,sha256=1nKRtzhVoJ9y0yMg1sgI6u7czsrk2cN0FvNUCZo8l-o,3878
115
118
  biopipen/scripts/scrna/CellTypeAnnotation.R,sha256=6Le1SvZcKI8D0SLkFZ5SibGsW9ZWqirnBl3Q1BNZOuU,513
116
- biopipen/scripts/scrna/CellsDistribution.R,sha256=UDsiZp94oxyENpDS6H649SfeaTFMX5Ip1gG0mBJukkA,16647
119
+ biopipen/scripts/scrna/CellsDistribution.R,sha256=r9XJwA-VZ2JP8TZEe4OS8Ah1b06yd58HrfAyPi4Be1M,16562
117
120
  biopipen/scripts/scrna/DimPlots.R,sha256=-mXOTMnpPxvR30XLjwcohFfFx7xTqWKKiICwJiD6yEo,1554
118
121
  biopipen/scripts/scrna/ExprImpution-alra.R,sha256=w3W1txJcdWg52-SETY2Z0lO7maDNfiMjBYIGN587YW0,843
119
122
  biopipen/scripts/scrna/ExprImpution-rmagic.R,sha256=jYIfqZpnvjKJkvItLnemPVtUApHBYQi1_L8rHVbEe1M,735
120
123
  biopipen/scripts/scrna/ExprImpution-scimpute.R,sha256=mg40qCUW7-nP5oHPvARq7dmtoahM0GRFWXQpum0BXVk,1082
121
124
  biopipen/scripts/scrna/ExprImpution.R,sha256=7768ezrr59xUZDXq8lO9jj2XhnkSsx-xxBmOD9_DO7c,313
122
- biopipen/scripts/scrna/MarkersFinder.R,sha256=60a4IVT2wmNa9ofuFRmJpw23XOh7v6uLyDy_VZkkoJY,26345
123
- biopipen/scripts/scrna/MetaMarkers.R,sha256=kgjk65EmewZ1uh8AoiENDLmNFe4lzmYvssJeINZ1JDo,12479
125
+ biopipen/scripts/scrna/MarkersFinder.R,sha256=82XTp_8o4nBQ7yklqI5NoYW_4StLIdBj60M-AqhZnw4,26294
126
+ biopipen/scripts/scrna/MetaMarkers.R,sha256=CyKRW81WFMv00W5mHbloaYrsq7B1niAFFtypf9Meezo,12411
124
127
  biopipen/scripts/scrna/ModuleScoreCalculator.R,sha256=JSHd-_-KiFqW8avCGxgU4T-C5BtDr2u0kwIvEu2lFIg,4188
125
- biopipen/scripts/scrna/RadarPlots.R,sha256=iR4JKtO2b3hGfqv_KAI7BR9tq02EAYfKeqp7tzAicKs,14808
128
+ biopipen/scripts/scrna/RadarPlots.R,sha256=0A4rX0ngx3S0TDx-HMgLNIa6w5551vPvpTQZuZSb7J0,14757
126
129
  biopipen/scripts/scrna/SCImpute.R,sha256=dSJOHhmJ3x_72LBRXT72dbCti5oiB85CJ-OjWtqONbk,2958
127
- biopipen/scripts/scrna/ScFGSEA.R,sha256=E6Rx-0TjplP_nptDCE-LqMyipsOFaMU3hM7FjjFFFDY,7538
130
+ biopipen/scripts/scrna/ScFGSEA.R,sha256=POyFFDmtDteVw0wN3ADkh85JhQvMPw3diW_Dg9NXMVM,7487
128
131
  biopipen/scripts/scrna/SeuratClusterStats-dimplots.R,sha256=pZKv1SnSNEGXDeE0_2VYp0GAikYitohW2FR5YGKjs8Q,2351
129
132
  biopipen/scripts/scrna/SeuratClusterStats-features.R,sha256=SaKTJloP1fttRXZQeb2ApX0ej7al13wOoEYkthSk13k,15489
130
- biopipen/scripts/scrna/SeuratClusterStats-hists.R,sha256=GTZfs1yOkuoMUM1Zb19i_My8B8b1Qtve8je55pU_w-g,5054
133
+ biopipen/scripts/scrna/SeuratClusterStats-hists.R,sha256=YhuD-GePjJPSkR0iLRgV_hiGHD_bnOIKp-LB6GCwquo,5037
131
134
  biopipen/scripts/scrna/SeuratClusterStats-ngenes.R,sha256=GVKIXFNS_syCuSN8oxoBkjxxAeI5LdSxh-qLVkUsbDA,2146
132
135
  biopipen/scripts/scrna/SeuratClusterStats-stats.R,sha256=CE9989SaO75_KYEEVqivEbUoTcUOtiTkRGWLNtWzxI8,6450
133
- biopipen/scripts/scrna/SeuratClusterStats.R,sha256=PeXa3r2VTo0Q1rdXpSfAOIbYSJAcA8WUNM-tJkNUcPg,1284
136
+ biopipen/scripts/scrna/SeuratClusterStats.R,sha256=ouWoj7Q644uG3MUlT23AES8f74g38-jPtPhINSvoUas,1267
134
137
  biopipen/scripts/scrna/SeuratClustering.R,sha256=kAvQq3RV86_KSv9NlUtUeQrPKkbhSsnv6Q4DoiTu8M0,6403
135
138
  biopipen/scripts/scrna/SeuratFilter.R,sha256=BrYK0MLdaTtQvInMaQsmOt7oH_hlks0M1zykkJtg2lM,509
136
139
  biopipen/scripts/scrna/SeuratLoading.R,sha256=ekWKnHIqtQb3kHVQiVymAHXXqiUxs6KKefjZKjaykmk,900
137
140
  biopipen/scripts/scrna/SeuratMap2Ref.R,sha256=tisYmoSaCX8Kl8y6euuuUroWdDsJ2NGI27J5AWr9Niw,4392
138
141
  biopipen/scripts/scrna/SeuratMetadataMutater.R,sha256=Pp4GsF3hZ6ZC2vroC3LSBmVa4B1p2L3hbh981yaAIeQ,1093
139
- biopipen/scripts/scrna/SeuratPreparing.R,sha256=KNrBPibqANhCsCctOGCOMPLTjDDd-iDRpMSCXkPuUQU,12994
142
+ biopipen/scripts/scrna/SeuratPreparing.R,sha256=cgXWon2it6g4y-yrYk_zhivViOX8ZVf36u3wb9lKtj0,13133
140
143
  biopipen/scripts/scrna/SeuratSplit.R,sha256=vdK11V39_Uo_NaOh76QWCtxObGaEr5Ynxqq0hTiSvsU,754
141
144
  biopipen/scripts/scrna/SeuratSubClustering.R,sha256=L1SwKhNNKvsQGrcj0ZjScW9BLuvdO2pg7U48Ospsot8,6096
142
145
  biopipen/scripts/scrna/SeuratSubset.R,sha256=yVA11NVE2FSSw-DhxQcJRapns0tNNHdyDYi5epO6SKM,1776
143
146
  biopipen/scripts/scrna/SeuratTo10X.R,sha256=T2nJBTwOe12AIKC2FZsMSv6xx3s-67CYZokpz5wshqY,2679
144
- biopipen/scripts/scrna/TopExpressingGenes.R,sha256=m1BEpDfrzD9rJ2wEwA355GMqBq8Wfc_PzCjtLavB68Q,7754
147
+ biopipen/scripts/scrna/TopExpressingGenes.R,sha256=J6tM54HStWkguUwFoIHRo_EAtCUKOuCBEfInzRfDYMQ,7703
145
148
  biopipen/scripts/scrna/Write10X.R,sha256=OMhXvJwvaH-aWsMpijKrvXQVabc1qUu5ZEwiLAhkDeY,285
146
149
  biopipen/scripts/scrna/sctype.R,sha256=NaUJkABwF5G1UVm1CCtcMbwLSj94Mo24mbYCKFqo1Bw,6524
147
- biopipen/scripts/scrna_metabolic_landscape/MetabolicFeatures.R,sha256=UbNoyspFB8166VgbkkFyTS6tkA-7ybylfvO50eqNnBU,4841
148
- biopipen/scripts/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.R,sha256=Kv69CkVm67K3w5EEcPQr7SlaWFpPwqTI0DVSUn62Rj0,5230
150
+ biopipen/scripts/scrna_metabolic_landscape/MetabolicFeatures.R,sha256=b77yG5FeRse3bNfFgLIEYGHNZzydAn1OeyyR_n5Ju60,4790
151
+ biopipen/scripts/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.R,sha256=ic8Fy8QqYDGh_izmvZVJ3KL66podg_CSF5ITL3FZsvo,5196
149
152
  biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayActivity.R,sha256=95DLX1Rz0tobOuDZ8V9YdGgO0KiNthhccoeeOK21tno,16216
150
- biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.R,sha256=0MIRrUjCtTDkUiL6GfKbtjC7bLlt50AGWFv4fl4e72k,9856
153
+ biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.R,sha256=EpV4Wqj1dLqtaJyIJo6dN6vxeRH6elLibbHpK_N37bE,9822
151
154
  biopipen/scripts/tcgamaf/Maf2Vcf.py,sha256=Cxh7fiSNCxWDTfIJqZDOOnaSrw-85S_fH2U-PWY03hc,704
152
155
  biopipen/scripts/tcgamaf/MafAddChr.py,sha256=V10HMisl12O3ZfXuRmFNdy5p-3mr43WCvy0GHxSpwfA,494
153
156
  biopipen/scripts/tcgamaf/maf2vcf.pl,sha256=hJKcH-NbgWK6fmK7f3qex7ozJJl-PqCNPXqpwfcHwJg,22707
154
157
  biopipen/scripts/tcr/Attach2Seurat.R,sha256=C91TAh1cLSxWkdFPf84pbxlpTYMuWq_rduG4eiIkXZI,1345
155
- biopipen/scripts/tcr/CDR3AAPhyschem.R,sha256=rvXa9z7EY745Su0bzz0WpBd6QxXMGrzV_Eq7Ur9xb_g,16645
156
- biopipen/scripts/tcr/CloneResidency.R,sha256=C0XlkKOvWL0SeSCfhJ4BvqmxUQjx7Se6_PdzZk2HvgQ,21749
158
+ biopipen/scripts/tcr/CDR3AAPhyschem.R,sha256=-0BS6cdt5GfQJphA3HlDgGjWr4XFF-7INLJyMBHQNAc,16628
159
+ biopipen/scripts/tcr/CloneResidency.R,sha256=yE1Why0spX557D9aIQummoxXIdXBC6jt3YB5kIL1jt0,21647
157
160
  biopipen/scripts/tcr/CloneSizeQQPlot.R,sha256=5FPfWQjxTsv59KSDQaDWj3C95zPQMngKG7qOf95NEzI,4527
158
161
  biopipen/scripts/tcr/GIANA/GIANA.py,sha256=0qLhgCWxT8K-4JvORA03CzBPTT5pd4Di5B_DgrHXbFA,47198
159
162
  biopipen/scripts/tcr/GIANA/GIANA4.py,sha256=Z7Q3cUr1Pvmy4CFADN0P7i9g1-HbzWROMqk5HvL_F1Q,45762
@@ -161,20 +164,20 @@ biopipen/scripts/tcr/GIANA/Imgt_Human_TRBV.fasta,sha256=XUwDPXJxVH5O9Q0gCL6EILKX
161
164
  biopipen/scripts/tcr/GIANA/query.py,sha256=5NWSEDNrJomMt48tzLGpRwJTZB0zQxvMVTilyG8osX8,7298
162
165
  biopipen/scripts/tcr/Immunarch-basic.R,sha256=g64RXmiPw73vbnwrKoRaNs1d3O6mRV9uhcAFkBV0g3U,3121
163
166
  biopipen/scripts/tcr/Immunarch-clonality.R,sha256=48rbPCWka4eNEy-fjM0BlKDkMYdG2zlB8Sly1B4xdUI,3858
164
- biopipen/scripts/tcr/Immunarch-diversity.R,sha256=BDIhh1lbiaAEm-AQO0nb0mBmtQBA9yG_AP6N6zW8QOc,28330
167
+ biopipen/scripts/tcr/Immunarch-diversity.R,sha256=C1qx50K2eIZ2c590jumGe1BpMmgohlaP-wVkmwzHa2E,28296
165
168
  biopipen/scripts/tcr/Immunarch-geneusage.R,sha256=c0C8-KtKI2q6O9xZ9f5COefQbPlshT2hz1f36qpnW34,6817
166
- biopipen/scripts/tcr/Immunarch-kmer.R,sha256=4BUDiclarawetjUdBmrCTfHZOTjRpE5TDxDGI_CtYds,6229
169
+ biopipen/scripts/tcr/Immunarch-kmer.R,sha256=ttDKwPTde_DN2xekRF2LBrc_o8wQjxXa49VAzmUzQl8,6212
167
170
  biopipen/scripts/tcr/Immunarch-overlap.R,sha256=GVt-qJPtd6NEe5njAqNStf2AP6pLkv7Ittw0YT_qdNY,7465
168
- biopipen/scripts/tcr/Immunarch-spectratyping.R,sha256=6_DOKzEbUJzQix7R4hSc4DxWCHXiBgZwR8yyttS0h7c,2912
171
+ biopipen/scripts/tcr/Immunarch-spectratyping.R,sha256=jm8qI_A6HBgr1RT6-kq13z46_3aXHwz_LbQk4Ggeq9Y,2882
169
172
  biopipen/scripts/tcr/Immunarch-tracking.R,sha256=0tiywpGhd3H0REp4xrhOlkWzJM4ntrQjrVesHbEWT40,4374
170
- biopipen/scripts/tcr/Immunarch-vjjunc.R,sha256=gnLYaUS9uhwTcTqqba2ZmsepuBWcAw3pr1q3FUFQJFs,4451
171
- biopipen/scripts/tcr/Immunarch.R,sha256=DjSLeEkB01inDS6iSCnQqQhRBJ20IbZn55nefL0gmQU,3054
173
+ biopipen/scripts/tcr/Immunarch-vjjunc.R,sha256=vSVPdRPSlpAfuX4ynA2UjfUC0_61yMAaPieJM-5J4sw,4434
174
+ biopipen/scripts/tcr/Immunarch.R,sha256=FVPK5qu6twSSJJNDCAZO4wNned6uIOBZHgBNeIgLmKw,3037
172
175
  biopipen/scripts/tcr/Immunarch2VDJtools.R,sha256=QB9ILGbnsfoWaRANK6ceb14wpSWy8F1V1EdEmfIqiks,706
173
176
  biopipen/scripts/tcr/ImmunarchFilter.R,sha256=o25O36FwH_0w6F8DFQ0SfpcwDzlzaGefXqr9ESrvb4k,3974
174
177
  biopipen/scripts/tcr/ImmunarchLoading.R,sha256=l_l-gojiCKI_MWgIUe2zG5boVtNipBv4rACRJEcrnFE,5734
175
178
  biopipen/scripts/tcr/ImmunarchSplitIdents.R,sha256=FGCeGV0uSmFU91lKkldUAeV4A2m3hHw5X4GNi8ffGzI,1873
176
179
  biopipen/scripts/tcr/SampleDiversity.R,sha256=jQ1OU3b8vswD8tZhLt3fkcqJKrl2bhQX0giHM2rXz3Y,2643
177
- biopipen/scripts/tcr/TCRClusterStats.R,sha256=3YxIfsTBbFFI6fBTU3gM60bGuVv52PmL7bs16_WciGw,12089
180
+ biopipen/scripts/tcr/TCRClusterStats.R,sha256=D7q1svXQxl1uOya8bePvR9e6NJXjCjXbPsXnEPTWdlE,12004
178
181
  biopipen/scripts/tcr/TCRClustering.R,sha256=-BWbDqvDBEpfVaxrVvzVHK5bm6FCOFmGHydg1c3EgAM,8747
179
182
  biopipen/scripts/tcr/TESSA.R,sha256=bfOixWLZy8yi0MzXncP67KjtCukwXEzsK5fCdMzB5VM,6822
180
183
  biopipen/scripts/tcr/TESSA_source/Atchley_factors.csv,sha256=SumqDOqP67P54uM7Cuc5_O_rySTWcGo7eX3psMSPX9s,763
@@ -210,9 +213,9 @@ biopipen/utils/caching.R,sha256=qANQqH8p-VpvD8V4VSoqSfp0TFr4esujC7x3OFZsJMw,1687
210
213
  biopipen/utils/common_docstrs.py,sha256=ro9dUXeHMXBaqb-hTafwrG6xW5IOBEeiUM2_REjFoCo,5842
211
214
  biopipen/utils/gene.R,sha256=BzAwlLA8hO12vF-3t6IwEuTEeLa_jBll4zm_5qe3qoE,1243
212
215
  biopipen/utils/gene.py,sha256=qE_BqTayrJWxRdniffhcz6OhZcw9GUoOrj2EtFWH9Gw,2246
213
- biopipen/utils/gsea.R,sha256=rB_wHUBrn9SihMy_ICSRSgj-e48SGm_ZYs1oZtFgroA,7284
216
+ biopipen/utils/gsea.R,sha256=UMQOlWGstQTOBScvy1wIzrB7I3CE28Xo2v1sy4lmJ-M,7549
214
217
  biopipen/utils/io.R,sha256=jIYdqdn0iRWfQYAZa5CjXi3fikqmYvPPLIXhobRe8sw,537
215
- biopipen/utils/misc.R,sha256=nkjiAsEsilq0AeiKRDNqrhTx-1Grqg-rFlkjOEOEDYg,5224
218
+ biopipen/utils/misc.R,sha256=sB2cM-sJn9H90FAZD89uNUYPU5k_6BT8d_nG33fI7d4,5520
216
219
  biopipen/utils/misc.py,sha256=Pmh3CBiKJ3vC_RqorfOfRAvTVKXrGDJT8DMLfYbTivs,3055
217
220
  biopipen/utils/mutate_helpers.R,sha256=Bqy6Oi4rrPEPJw0Jq32bVAwwBfZv7JJL9jFcK5x-cek,17649
218
221
  biopipen/utils/plot.R,sha256=pzl37PomNeUZPxohHZ2w93j3Fc4T0Qrc62FF-9MTKdw,4417
@@ -220,7 +223,7 @@ biopipen/utils/reference.py,sha256=6bPSwQa-GiDfr7xLR9a5T64Ey40y24yn3QfQ5wDFZkU,4
220
223
  biopipen/utils/rnaseq.R,sha256=Ro2B2dG-Z2oVaT5tkwp9RHBz4dp_RF-JcizlM5GYXFs,1298
221
224
  biopipen/utils/single_cell.R,sha256=bKduqOQjSC8BtZJuwfUShR49omoEMbB57n3Gi6dYlqA,4147
222
225
  biopipen/utils/vcf.py,sha256=ajXs0M_QghEctlvUlSRjWQIABVF02wPdYd-0LP4mIsU,9377
223
- biopipen-0.24.0.dist-info/METADATA,sha256=DNnxF-VG418LTtxJbvpZ9ebR8R7fgOaTb2mgFo9IBO8,932
224
- biopipen-0.24.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
225
- biopipen-0.24.0.dist-info/entry_points.txt,sha256=16Apdku3RFwghe1nb0JR7eVo4IzLae6hCWjU1VxYUn0,525
226
- biopipen-0.24.0.dist-info/RECORD,,
226
+ biopipen-0.24.2.dist-info/METADATA,sha256=it_bxwfsavzwDtAkIWf2RxQIcmbr0810VrAEonBE9DQ,932
227
+ biopipen-0.24.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
228
+ biopipen-0.24.2.dist-info/entry_points.txt,sha256=O7K7PHoJi-4tERYpqmryuTvrFNEsptMpqliZzB2oBQQ,577
229
+ biopipen-0.24.2.dist-info/RECORD,,
@@ -3,6 +3,7 @@ bam=biopipen.ns.bam
3
3
  bcftools=biopipen.ns.bcftools
4
4
  bed=biopipen.ns.bed
5
5
  cellranger=biopipen.ns.cellranger
6
+ cellranger_pipeline=biopipen.ns.cellranger_pipeline
6
7
  cnv=biopipen.ns.cnv
7
8
  cnvkit=biopipen.ns.cnvkit
8
9
  cnvkit_pipeline=biopipen.ns.cnvkit_pipeline