biopipen 0.21.2__py3-none-any.whl → 0.22.1__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 (62) hide show
  1. biopipen/__init__.py +1 -1
  2. biopipen/core/filters.py +142 -0
  3. biopipen/ns/scrna.py +19 -1
  4. biopipen/ns/tcr.py +30 -10
  5. biopipen/reports/delim/SampleInfo.svelte +2 -22
  6. biopipen/reports/scrna/CellsDistribution.svelte +4 -39
  7. biopipen/reports/scrna/MarkersFinder.svelte +6 -126
  8. biopipen/reports/scrna/MetaMarkers.svelte +3 -75
  9. biopipen/reports/scrna/RadarPlots.svelte +4 -20
  10. biopipen/reports/scrna/ScFGSEA.svelte +4 -23
  11. biopipen/reports/scrna/SeuratClusterStats.svelte +3 -69
  12. biopipen/reports/scrna/SeuratPreparing.svelte +3 -26
  13. biopipen/reports/scrna/TopExpressingGenes.svelte +3 -41
  14. biopipen/reports/scrna_metabolic_landscape/MetabolicFeatures.svelte +17 -16
  15. biopipen/reports/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.svelte +13 -16
  16. biopipen/reports/scrna_metabolic_landscape/MetabolicPathwayActivity.svelte +44 -52
  17. biopipen/reports/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.svelte +2 -8
  18. biopipen/reports/tcr/CDR3AAPhyschem.svelte +18 -65
  19. biopipen/reports/tcr/CloneResidency.svelte +3 -93
  20. biopipen/reports/tcr/Immunarch.svelte +4 -168
  21. biopipen/reports/tcr/TCRClusterStats.svelte +3 -45
  22. biopipen/reports/tcr/TESSA.svelte +11 -28
  23. biopipen/scripts/delim/SampleInfo.R +41 -7
  24. biopipen/scripts/scrna/CellsDistribution.R +127 -16
  25. biopipen/scripts/scrna/MarkersFinder.R +245 -100
  26. biopipen/scripts/scrna/MetaMarkers.R +163 -82
  27. biopipen/scripts/scrna/RadarPlots.R +163 -110
  28. biopipen/scripts/scrna/ScFGSEA.R +51 -11
  29. biopipen/scripts/scrna/SeuratClusterStats-dimplots.R +26 -13
  30. biopipen/scripts/scrna/SeuratClusterStats-features.R +58 -53
  31. biopipen/scripts/scrna/SeuratClusterStats-stats.R +39 -21
  32. biopipen/scripts/scrna/SeuratClusterStats.R +4 -2
  33. biopipen/scripts/scrna/SeuratClustering.R +73 -26
  34. biopipen/scripts/scrna/SeuratMetadataMutater.R +13 -1
  35. biopipen/scripts/scrna/SeuratPreparing.R +93 -19
  36. biopipen/scripts/scrna/TopExpressingGenes.R +100 -18
  37. biopipen/scripts/scrna_metabolic_landscape/MetabolicFeatures.R +21 -8
  38. biopipen/scripts/scrna_metabolic_landscape/MetabolicFeaturesIntraSubset.R +25 -3
  39. biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayActivity.R +1 -0
  40. biopipen/scripts/scrna_metabolic_landscape/MetabolicPathwayHeterogeneity.R +14 -3
  41. biopipen/scripts/tcr/Attach2Seurat.R +2 -1
  42. biopipen/scripts/tcr/CDR3AAPhyschem.R +123 -10
  43. biopipen/scripts/tcr/CloneResidency.R +114 -34
  44. biopipen/scripts/tcr/Immunarch-basic.R +18 -4
  45. biopipen/scripts/tcr/Immunarch-clonality.R +14 -0
  46. biopipen/scripts/tcr/Immunarch-diversity.R +123 -18
  47. biopipen/scripts/tcr/Immunarch-geneusage.R +23 -1
  48. biopipen/scripts/tcr/Immunarch-kmer.R +45 -3
  49. biopipen/scripts/tcr/Immunarch-overlap.R +62 -0
  50. biopipen/scripts/tcr/Immunarch-spectratyping.R +18 -2
  51. biopipen/scripts/tcr/Immunarch-tracking.R +24 -1
  52. biopipen/scripts/tcr/Immunarch-vjjunc.R +17 -2
  53. biopipen/scripts/tcr/Immunarch.R +7 -0
  54. biopipen/scripts/tcr/ImmunarchLoading.R +22 -23
  55. biopipen/scripts/tcr/TCRClusterStats.R +124 -11
  56. biopipen/scripts/tcr/TCRClustering.R +8 -9
  57. biopipen/scripts/tcr/TESSA.R +66 -41
  58. biopipen/utils/misc.R +96 -1
  59. {biopipen-0.21.2.dist-info → biopipen-0.22.1.dist-info}/METADATA +1 -1
  60. {biopipen-0.21.2.dist-info → biopipen-0.22.1.dist-info}/RECORD +62 -62
  61. {biopipen-0.21.2.dist-info → biopipen-0.22.1.dist-info}/WHEEL +0 -0
  62. {biopipen-0.21.2.dist-info → biopipen-0.22.1.dist-info}/entry_points.txt +0 -0
biopipen/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.21.2"
1
+ __version__ = "0.22.1"
biopipen/core/filters.py CHANGED
@@ -7,6 +7,7 @@ from typing import Any, List, Mapping
7
7
 
8
8
  from argx import Namespace
9
9
  from liquid.filters.manager import FilterManager
10
+ from pipen_report.filters import register_component, render_ui, _tag
10
11
 
11
12
  filtermanager = FilterManager()
12
13
 
@@ -206,3 +207,144 @@ def r(
206
207
  return r(vars(obj), ignoreintkey, todot, sortkeys, skip, _i)
207
208
 
208
209
  return repr(obj)
210
+
211
+
212
+ @register_component("fgsea")
213
+ def _render_fgsea(
214
+ cont: Mapping[str, Any],
215
+ job: Mapping[str, Any],
216
+ level: int,
217
+ na_arg: str = "10",
218
+ ) -> str:
219
+ """Render fgsea report"""
220
+ # cont["dir"] is required
221
+ n_pathways = int(na_arg)
222
+ pathways = []
223
+ with Path(cont["dir"]).joinpath("fgsea.txt").open() as f:
224
+ next(f) # skip header
225
+ for line in f:
226
+ pathway, _ = line.split("\t", 1)
227
+ pathways.append(pathway)
228
+ if len(pathways) >= n_pathways:
229
+ break
230
+
231
+ components = [
232
+ # Summary
233
+ {
234
+ "title": "Enrichment Analysis Summary",
235
+ "ui": "tabs",
236
+ "contents": [
237
+ {
238
+ "title": "Plot",
239
+ "ui": "flat",
240
+ "contents": [
241
+ {
242
+ "kind": "image",
243
+ "src": str(Path(cont["dir"]).joinpath("gsea_table.png")),
244
+ }
245
+ ],
246
+ },
247
+ {
248
+ "title": "Table",
249
+ "ui": "flat",
250
+ "contents": [
251
+ {
252
+ "kind": "table",
253
+ "src": str(Path(cont["dir"]).joinpath("fgsea.txt")),
254
+ }
255
+ ],
256
+ },
257
+ ]
258
+ },
259
+ # Pathways
260
+ {
261
+ "title": f"Enriched Pathways (Top {n_pathways})",
262
+ "ui": "table_of_images",
263
+ "contents": [
264
+ {
265
+ "src": str(Path(cont["dir"]) / f"fgsea_{pw.replace('/', '-')}.png"),
266
+ "title": pw,
267
+ }
268
+ for pw in pathways
269
+ ]
270
+ },
271
+ ]
272
+
273
+ return render_ui(components, "accordion", job, level)
274
+
275
+
276
+ @register_component("pdf")
277
+ def _render_pdf(
278
+ cont: Mapping[str, Any],
279
+ job: Mapping[str, Any],
280
+ level: int,
281
+ ) -> str:
282
+ """Render pdf report"""
283
+ # cont["src"] is required
284
+ height = cont.get("height", "600")
285
+ return _tag(
286
+ "embed",
287
+ src=str(cont["src"]),
288
+ type="application/pdf",
289
+ width="100%",
290
+ height=height,
291
+ )
292
+
293
+
294
+ @register_component("gsea")
295
+ def _render_gsea(
296
+ cont: Mapping[str, Any],
297
+ job: Mapping[str, Any],
298
+ level: int,
299
+ ) -> str:
300
+ """Render gsea report"""
301
+ # cont["dir"] is required
302
+ raise NotImplementedError()
303
+
304
+
305
+ @register_component("enrichr")
306
+ def _render_enrichr(
307
+ cont: Mapping[str, Any],
308
+ job: Mapping[str, Any],
309
+ level: int,
310
+ ) -> str:
311
+ """Render enrichr report"""
312
+ # cont["dir"] is required
313
+ dbs = [sumfile.stem[8:] for sumfile in Path(cont["dir"]).glob("Enrichr-*.txt")]
314
+ components = []
315
+
316
+ for db in dbs:
317
+ components.append(
318
+ {
319
+ "title": db,
320
+ "ui": "tabs",
321
+ "contents": [
322
+ {
323
+ "title": "Plot",
324
+ "ui": "flat",
325
+ "contents": [
326
+ {
327
+ "kind": "image",
328
+ "src": str(
329
+ Path(cont["dir"]).joinpath(f"Enrichr-{db}.png")
330
+ ),
331
+ }
332
+ ],
333
+ },
334
+ {
335
+ "title": "Table",
336
+ "ui": "flat",
337
+ "contents": [
338
+ {
339
+ "kind": "table",
340
+ "src": str(
341
+ Path(cont["dir"]).joinpath(f"Enrichr-{db}.txt")
342
+ ),
343
+ }
344
+ ],
345
+ },
346
+ ],
347
+ }
348
+ )
349
+
350
+ return render_ui(components, "accordion", job, level)
biopipen/ns/scrna.py CHANGED
@@ -257,6 +257,16 @@ class SeuratClustering(Proc):
257
257
  `object` is specified internally, and `-` in the key will be replaced with `.`.
258
258
  - resolution (type=float): The resolution of the clustering
259
259
  - <more>: See <https://satijalab.org/seurat/reference/findclusters>
260
+ cache (type=auto): Whether to cache the seurat object with cluster information.
261
+ If `True`, the seurat object will be cached in the job output directory, which will be not cleaned up when job is rerunning.
262
+ The cached seurat object will be saved as `<signature>.cached.RDS` file, where `<signature>` is the signature determined by
263
+ the input and envs of the process.
264
+ See <https://github.com/satijalab/seurat/issues/7849>, <https://github.com/satijalab/seurat/issues/5358> and
265
+ <https://github.com/satijalab/seurat/issues/6748> for more details.
266
+ To not use the cached seurat object, you can either set `cache` to `False` or delete the cached file at
267
+ `.pipen/<Pipeline>/SeuratClustering/0/output/<signature>.cached.RDS`.
268
+ You can also specify the directory to save the cached seurat object by setting `cache` to the directory path.
269
+
260
270
 
261
271
  Requires:
262
272
  r-seurat:
@@ -286,6 +296,7 @@ class SeuratClustering(Proc):
286
296
  "RunUMAP": {"reduction": "pca", "dims": 30},
287
297
  "FindNeighbors": {},
288
298
  "FindClusters": {"resolution": 0.8},
299
+ "cache": True,
289
300
  }
290
301
  script = "file://../scripts/scrna/SeuratClustering.R"
291
302
 
@@ -418,6 +429,7 @@ class SeuratClusterStats(Proc):
418
429
  - group-by: Same as `ident`. How the points are colored.
419
430
  - split-by: The column name in metadata to split the cells into different plots.
420
431
  - shape-by: The column name in metadata to use as the shape.
432
+ - subset: An expression to subset the cells, will be passed to `tidyrseurat::filter()`.
421
433
  - devpars (ns): The device parameters for the plots.
422
434
  - res (type=int): The resolution of the plots.
423
435
  - height (type=int): The height of the plots.
@@ -482,6 +494,7 @@ class SeuratClusterStats(Proc):
482
494
  "group-by": None,
483
495
  "split-by": None,
484
496
  "shape-by": None,
497
+ "subset": None,
485
498
  "reduction": "dim",
486
499
  "devpars": {"res": 100, "height": 800, "width": 1000},
487
500
  },
@@ -642,6 +655,7 @@ class CellsDistribution(Proc):
642
655
  Ignored if `cells_order` is specified.
643
656
  subset: An expression to subset the cells, will be passed to `dplyr::filter()` on metadata.
644
657
  This will be applied prior to `each`.
658
+ descr: The description of the case, will be shown in the report.
645
659
  devpars (ns): The device parameters for the plots.
646
660
  - res (type=int): The resolution of the plots
647
661
  - height (type=int): The height of the plots
@@ -676,6 +690,7 @@ class CellsDistribution(Proc):
676
690
  "cells_orderby": None,
677
691
  "cells_n": 10,
678
692
  "subset": None,
693
+ "descr": None,
679
694
  "devpars": {},
680
695
  "each": None,
681
696
  "section": "DEFAULT",
@@ -1669,7 +1684,7 @@ class RadarPlots(Proc):
1669
1684
  "cluster_order": [],
1670
1685
  "breaks": [],
1671
1686
  "direction": "intra-cluster",
1672
- "section": None,
1687
+ "section": "DEFAULT",
1673
1688
  "devpars": {
1674
1689
  "res": 100,
1675
1690
  "width": 1200,
@@ -1719,6 +1734,8 @@ class MetaMarkers(Proc):
1719
1734
  dbs (list): The dbs to do enrichment analysis for significant
1720
1735
  markers See below for all libraries.
1721
1736
  <https://maayanlab.cloud/Enrichr/#libraries>
1737
+ subset: The subset of the cells to do the analysis.
1738
+ An expression passed to `dplyr::filter()`.
1722
1739
  p_adjust (choice): The method to adjust the p values, which can be used to filter the significant markers.
1723
1740
  See also <https://rdrr.io/r/stats/p.adjust.html>
1724
1741
  - holm: Holm-Bonferroni method
@@ -1759,6 +1776,7 @@ class MetaMarkers(Proc):
1759
1776
  "group-by": None,
1760
1777
  "idents": None,
1761
1778
  "each": None,
1779
+ "subset": None,
1762
1780
  "prefix_each": True,
1763
1781
  "p_adjust": "BH",
1764
1782
  "dbs": [
biopipen/ns/tcr.py CHANGED
@@ -40,11 +40,13 @@ class ImmunarchLoading(Proc):
40
40
 
41
41
  Output:
42
42
  rdsfile: The RDS file with the data and metadata
43
- metatxt: The meta data of the cells, used to attach to the Seurat object
43
+ metatxt: The meta data at cell level, which can be used to attach to the Seurat object
44
44
 
45
45
  Envs:
46
46
  prefix: The prefix to the barcodes. You can use placeholder like `{Sample}_`
47
- to use the meta data from the `immunarch` object.
47
+ to use the meta data from the `immunarch` object. The prefixed barcodes will
48
+ be saved in `out.metatxt`. The `immunarch` object keeps the original barcodes, but
49
+ the prefix is saved at `immdata$prefix`.
48
50
 
49
51
  /// Note
50
52
  This option is useful because the barcodes for the cells from scRNA-seq
@@ -65,10 +67,16 @@ class ImmunarchLoading(Proc):
65
67
  paired chain data. For `single`, only TRB chain will be kept
66
68
  at `immdata$data`, information for other chains will be
67
69
  saved at `immdata$tra` and `immdata$multi`.
68
- metacols (list): The columns to be exported to the text file.
70
+ extracols (list): The extra columns to be exported to the text file.
69
71
  You can refer to the
70
72
  [immunarch documentation](https://immunarch.com/articles/v2_data.html#immunarch-data-format)
71
- for the full list of the columns.
73
+ to get a sense for the full list of the columns.
74
+ The columns may vary depending on the data source.
75
+ The columns from `immdata$meta` and some core columns, including
76
+ `Barcode`, `CDR3.aa`, `Clones`, `Proportion`, `V.name`, `J.name`, and
77
+ `D.name` will be exported by default. You can use this option to
78
+ specify the extra columns to be exported.
79
+
72
80
  """ # noqa: E501
73
81
  input = "metafile:file"
74
82
  output = [
@@ -80,7 +88,7 @@ class ImmunarchLoading(Proc):
80
88
  "tmpdir": config.path.tmpdir,
81
89
  "prefix": "{Sample}_",
82
90
  "mode": "single",
83
- "metacols": ["Clones", "Proportion", "CDR3.aa"],
91
+ "extracols": [],
84
92
  }
85
93
  script = "file://../scripts/tcr/ImmunarchLoading.R"
86
94
 
@@ -322,6 +330,7 @@ class Immunarch(Proc):
322
330
  prefix: The prefix to the barcodes. You can use placeholder like `{Sample}_`
323
331
  The prefixed barcodes will be used to match the barcodes in `in.metafile`.
324
332
  Not used if `in.metafile` is not specified.
333
+ If `None` (default), `immdata$prefix` will be used.
325
334
  volumes (ns): Explore clonotype volume (sizes).
326
335
  - by: Groupings when visualize clonotype volumes, passed to the `.by` argument of `vis(imm_vol, .by = <values>)`.
327
336
  Multiple columns should be separated by `,`.
@@ -682,7 +691,7 @@ class Immunarch(Proc):
682
691
  lang = config.lang.rscript
683
692
  envs = {
684
693
  "mutaters": {},
685
- "prefix": "{Sample}_",
694
+ "prefix": None,
686
695
  # basic statistics
687
696
  "volumes": {
688
697
  "by": None,
@@ -1179,6 +1188,10 @@ class TCRClustering(Proc):
1179
1188
  For GIANA, using TRBV mutations is not supported
1180
1189
  - GIANA: by Li lab at UT Southwestern Medical Center
1181
1190
  - ClusTCR: by Sebastiaan Valkiers, etc
1191
+ prefix: The prefix to the barcodes. You can use placeholder like `{Sample}_`
1192
+ The prefixed barcodes will be used to match the barcodes in `in.metafile`.
1193
+ Not used if `in.metafile` is not specified.
1194
+ If `None` (default), `immdata$prefix` will be used.
1182
1195
  python: The path of python with `GIANA`'s dependencies installed
1183
1196
  or with `clusTCR` installed. Depending on the `tool` you choose.
1184
1197
  args (type=json): The arguments for the clustering tool
@@ -1202,6 +1215,7 @@ class TCRClustering(Proc):
1202
1215
  lang = config.lang.rscript
1203
1216
  envs = {
1204
1217
  "tool": "GIANA", # or ClusTCR
1218
+ "prefix": None,
1205
1219
  "on_multi": False,
1206
1220
  "python": config.lang.python,
1207
1221
  "args": {},
@@ -1507,7 +1521,8 @@ class TESSA(Proc):
1507
1521
  [link](https://www.nature.com/articles/s42256-021-00383-2)
1508
1522
 
1509
1523
  Input:
1510
- immdata: The data loaded by `immunarch::repLoad()`, saved in RDS format
1524
+ immdata: The immunarch object in RDS file or text file of TCR data loaded by
1525
+ [`ImmunarchLoading`](!!#biopipennstcrimmunarchloading)
1511
1526
  srtobj: The `Seurat` object, saved in RDS format, with dimension
1512
1527
  reduction performed if you want to use them to represent the
1513
1528
  transcriptome of T cells.
@@ -1522,8 +1537,13 @@ class TESSA(Proc):
1522
1537
 
1523
1538
  Envs:
1524
1539
  python: The path of python with `TESSA`'s dependencies installed
1525
- prefix: The prefix to the barcodes of TCR data. You can use placeholder
1526
- like `{Sample}_` to use the meta data from the immunarch object.
1540
+ prefix: The prefix of the cell barcodes in the `Seurat` object.
1541
+ Once could use a fixed prefix, or a placeholder with the column
1542
+ name in meta data. For example, `"{Sample}_"` will replace the
1543
+ placeholder with the value of the column `Sample` in meta data.
1544
+ If `in.immdata` is text file, the prefix will be ignored and the
1545
+ barcode should be already prefixed.
1546
+ If `None` and `in.immdata` is RDS file, `immdata$prefix` will be used.
1527
1547
  within_sample (flag): Whether the TCR networks are constructed only
1528
1548
  within TCRs from the same sample/patient (True) or with all the
1529
1549
  TCRs in the meta data matrix (False).
@@ -1548,7 +1568,7 @@ class TESSA(Proc):
1548
1568
  lang = config.lang.rscript
1549
1569
  envs = {
1550
1570
  "python": config.lang.python,
1551
- "prefix": "{Sample}_",
1571
+ "prefix": None,
1552
1572
  "assay": "RNA",
1553
1573
  "within_sample": False,
1554
1574
  "predefined_b": False,
@@ -1,31 +1,11 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
2
 
3
3
  <script>
4
- import { Image, DataTable } from "$libs";
4
+ import { Image, DataTable, Descr } from "$libs";
5
5
  </script>
6
6
 
7
7
  {%- macro report_job(job, h=1) -%}
8
-
9
- {% if envs.stats %}
10
- <h{{h}}>Sample Information</h{{h}}>
11
- {% endif %}
12
- {% if envs.exclude_cols and isinstance(envs.exclude_cols, str) %}
13
- {% set excluded_cols = envs.exclude_cols | replace: " ", "" | split: "," %}
14
- {% else %}
15
- {% set excluded_cols = envs.exclude_cols %}
16
- {% endif %}
17
-
18
- <DataTable
19
- data={ {{ job.out.outfile | datatable: sep="\t", excluded=excluded_cols }} }
20
- pageSize={50}
21
- />
22
-
23
- {% if envs.stats %}
24
- <h{{h}}>Statistics</h{{h}}>
25
- {%- set stat_imgs = job.outdir | glob: "*.png" -%}
26
- {{- table_of_images(stat_imgs) -}}
27
- {% endif %}
28
-
8
+ {{ job | render_job: h=h }}
29
9
  {%- endmacro -%}
30
10
 
31
11
  {%- macro head_job(job) -%}
@@ -1,50 +1,15 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
2
  <script>
3
- import { Image } from "$libs";
3
+ import { Image, DataTable, Descr } from "$libs";
4
+ import { Tabs, Tab, TabContent } from "$ccs";
4
5
  </script>
5
6
 
6
7
  {%- macro report_job(job, h=1) -%}
7
- {%- set secdirs = job.out.outdir | glob: "*" -%}
8
- {%- if len(secdirs) == 1 -%}
9
- {%- set secname = secdirs | first | basename -%}
10
- {%- if secdirs[0] | joinpaths: "venn.png" | exists -%}
11
- {%- if secname == "DEFAULT" -%}
12
- <h{{h}}>Case overlapping</h{{h}}>
13
- {%- else -%}
14
- <h{{h}}>{{ secname | escape }} - Case overlapping</h{{h}}>
15
- {%- endif -%}
16
- {{ table_of_images(
17
- [joinpaths(secdirs[0], "venn.png"), joinpaths(secdirs[0], "upset.png")],
18
- ["Venn plot", "Upset plot"]) }}
19
- {%- endif -%}
20
- {%- for plotfile in secdirs[0] | glob: "case-*.png" -%}
21
- {%- if secname == "DEFAULT" -%}
22
- <h{{h}}>{{ plotfile | stem | escape }}</h{{h}}>
23
- {%- else -%}
24
- <h{{h}}>{{ secname | escape }} - {{ plotfile | stem | escape }}</h{{h}}>
25
- {%- endif -%}
26
- <Image src={{plotfile | quote}} />
27
- {%- endfor -%}
28
- {%- else -%}
29
- {%- for secdir in secdirs -%}
30
- {%- set sec = secdir | basename -%}
31
- <h{{h}}>{{sec | escape}}</h{{h}}>
32
- {%- if secdir | joinpaths: "venn.png" | exists -%}
33
- <h{{h+1}}>Case overlapping</h{{h+1}}>
34
- {{ table_of_images(
35
- [joinpaths(secdir, "venn.png"), joinpaths(secdir, "upset.png")],
36
- ["Venn plot", "Upset plot"]) }}
37
- {%- endif -%}
38
- {%- for plotfile in secdir | glob: "case-*.png" -%}
39
- <h{{h+1}}>{{ plotfile | stem }}</h{{h+1}}>
40
- <Image src={{plotfile | quote}} />
41
- {%- endfor -%}
42
- {%- endfor -%}
43
- {%- endif -%}
8
+ {{ job | render_job: h=h }}
44
9
  {%- endmacro -%}
45
10
 
46
11
  {%- macro head_job(job) -%}
47
- <h1>{{job.in.srtobj | stem0 | escape}}</h1>
12
+ <h1>{{job.in.srtobj | stem0 | escape}}</h1>
48
13
  {%- endmacro -%}
49
14
 
50
15
  {{ report_jobs(jobs, head_job, report_job) }}
@@ -1,138 +1,18 @@
1
1
  {% from "utils/misc.liq" import report_jobs -%}
2
- {% from "utils/gsea.liq" import enrichr_report -%}
2
+
3
3
  <script>
4
- import { Image, DataTable } from "$libs";
5
- import { Tabs, Tab, TabContent, InlineNotification } from "$ccs";
4
+ import { Image, DataTable, Descr } from "$libs";
5
+ import { Tabs, Tab, TabContent, InlineNotification, Accordion, AccordionItem } from "$ccs";
6
6
  </script>
7
7
 
8
8
 
9
9
  {%- macro report_job(job, h=1) -%}
10
- {%- set alldirs = job.out.outdir | glob: "*" -%}
11
- {%- set ovdir = job.out.outdir | joinpaths: "OVERLAPS" -%}
12
- {%- set secdirs = [] -%}
13
- {%- for adir in alldirs -%}
14
- {%- if basename(adir) != "OVERLAPS" -%}
15
- {%- set _ = secdirs.append(adir) -%}
16
- {%- endif -%}
17
- {%- endfor -%}
18
-
19
- {%- if len(secdirs) == 1 -%}
20
- {%- set secname = secdirs | first | basename -%}
21
- {%- for casedir in secdirs[0] | glob: "*" -%}
22
- {%- if secname == "DEFAULT" -%}
23
- <h{{h}}>{{casedir | basename | escape}}</h{{h}}>
24
- {%- else -%}
25
- <h{{h}}>{{secname | escape}} - {{casedir | basename | escape}}</h{{h}}>
26
- {%- endif -%}
27
- {%- if casedir | joinpaths: "error.txt" | exists -%}
28
- <InlineNotification
29
- hideCloseButton
30
- lowContrast
31
- kind="warning"
32
- subtitle={{ casedir | joinpaths: "error.txt" | read | quote }}
33
- />
34
- {%- else -%}
35
- <h{{h+1}}>Markers</h{{h+1}}>
36
- <Tabs>
37
- <Tab label="Markers" />
38
- <Tab label="Volcano Plot" />
39
- <Tab label="Dot Plot" />
40
- <svelte:fragment slot="content">
41
- <TabContent>
42
- <DataTable
43
- src={{ casedir | joinpaths: "markers.txt" | quote }}
44
- data={ {{ casedir | joinpaths: "markers.txt" | datatable: sep="\t", nrows=100 }} }
45
- />
46
- </TabContent>
47
- <TabContent>
48
- <Image src={{ casedir | joinpaths: "volcano.png" | quote }} />
49
- </TabContent>
50
- <TabContent>
51
- <Image src={{ casedir | joinpaths: "dotplot.png" | quote }} />
52
- </TabContent>
53
- </svelte:fragment>
54
- </Tabs>
55
-
56
- <h{{h+1}}>Enrichment analysis</h{{h+1}}>
57
- {{ enrichr_report(casedir) }}
58
- {%- endif -%}
59
- {%- endfor -%}
60
- {%- else -%}
61
- {%- for secdir in secdirs -%}
62
- {%- set sec = secdir | basename -%}
63
- <h{{h}}>{{sec | escape}}</h{{h}}>
64
- {%- for casedir in secdir | glob: "*" -%}
65
- <h{{h+1}}>{{casedir | basename | escape}}</h{{h+1}}>
66
- {%- if casedir | joinpaths: "error.txt" | exists -%}
67
- <InlineNotification
68
- hideCloseButton
69
- lowContrast
70
- kind="warning"
71
- subtitle={{ casedir | joinpaths: "error.txt" | read | quote }}
72
- />
73
- {%- else -%}
74
- <h{{h+2}}>Markers</h{{h+2}}>
75
- <Tabs>
76
- <Tab label="Markers" />
77
- <Tab label="Volcano Plot" />
78
- <Tab label="Dot Plot" />
79
- <svelte:fragment slot="content">
80
- <TabContent>
81
- <DataTable
82
- src={{ casedir | joinpaths: "markers.txt" | quote }}
83
- data={ {{ casedir | joinpaths: "markers.txt" | datatable: sep="\t", nrows=100 }} }
84
- />
85
- </TabContent>
86
- <TabContent>
87
- <Image src={{ casedir | joinpaths: "volcano.png" | quote }} />
88
- </TabContent>
89
- <TabContent>
90
- <Image src={{ casedir | joinpaths: "dotplot.png" | quote }} />
91
- </TabContent>
92
- </svelte:fragment>
93
- </Tabs>
94
-
95
- <h{{h+2}}>Enrichment analysis</h{{h+2}}>
96
- {{ enrichr_report(casedir) }}
97
- {%- endif -%}
98
- {%- endfor -%}
99
- {%- endfor -%}
100
- {%- endif -%}
101
-
102
- {%- if ovdir | exists -%}
103
- <h{{h}}>Overlapping Markers</h{{h}}>
104
- {%- for casedir in ovdir | glob: "*" -%}
105
- <h{{h+1}}>{{casedir | basename | escape}}</h{{h+1}}>
106
- <Tabs>
107
- {%- if casedir | joinpaths: "venn.png" | exists -%}
108
- <Tab label="Venn Diagram" />
109
- {%- endif -%}
110
- <Tab label="UpSet Plot" />
111
- <Tab label="Marks" />
112
- <svelte:fragment slot="content">
113
- {%- if casedir | joinpaths: "venn.png" | exists -%}
114
- <TabContent>
115
- <Image src={{ casedir | joinpaths: "venn.png" | quote }} />
116
- </TabContent>
117
- {%- endif -%}
118
- <TabContent>
119
- <Image src={{ casedir | joinpaths: "upset.png" | quote }} />
120
- </TabContent>
121
- <TabContent>
122
- <DataTable
123
- src={{ casedir | joinpaths: "markers.txt" | quote }}
124
- data={ {{ casedir | joinpaths: "markers.txt" | datatable: sep="\t" }} }
125
- />
126
- </TabContent>
127
- </svelte:fragment>
128
- </Tabs>
129
- {%- endfor -%}
130
- {%- endif -%}
10
+ {{ job | render_job: h=h }}
131
11
  {%- endmacro -%}
132
12
 
133
13
 
134
14
  {%- macro head_job(job) -%}
135
- <h1>{{job.in.srtobj | stem | escape}}</h1>
15
+ <h1>{{job.in.srtobj | stem | escape}}</h1>
136
16
  {%- endmacro -%}
137
17
 
138
- {{ report_jobs(jobs, head_job, report_job) }}
18
+ {{ report_jobs(jobs, head_job, report_job) }}
@@ -1,85 +1,13 @@
1
1
  {% from "utils/misc.liq" import report_jobs, table_of_images -%}
2
2
  {% from "utils/gsea.liq" import enrichr_report -%}
3
3
  <script>
4
- import { Image, DataTable } from "$libs";
5
- import { Tabs, Tab, TabContent, InlineNotification } from "$ccs";
4
+ import { Image, DataTable, Descr } from "$libs";
5
+ import { Tabs, Tab, TabContent, InlineNotification, Accordion, AccordionItem } from "$ccs";
6
6
  </script>
7
7
 
8
8
 
9
9
  {%- macro report_job(job, h=1) -%}
10
- {%- set secdirs = job.out.outdir | glob: "*" -%}
11
- {%- if len(secdirs) == 1 -%}
12
- {%- set secname = secdirs | first | basename -%}
13
- {%- for casedir in secdirs[0] | glob: "*" -%}
14
- {%- if secname == "DEFAULT" -%}
15
- <h{{h}}>{{casedir | basename | escape}}</h{{h}}>
16
- {%- else -%}
17
- <h{{h}}>{{secname | escape}} - {{casedir | basename | escape}}</h{{h}}>
18
- {%- endif -%}
19
- {%- if casedir | joinpaths: "error.txt" | exists -%}
20
- <InlineNotification
21
- hideCloseButton
22
- lowContrast
23
- kind="warning"
24
- subtitle={{ casedir | joinpaths: "error.txt" | read | quote }}
25
- />
26
- {%- else -%}
27
- <h{{h+1}}>Markers</h{{h+1}}>
28
- <Tabs>
29
- <Tab label="Top 10 genes" />
30
- <Tab label="Table of top 100 genes" />
31
- <div slot="content">
32
- <TabContent>
33
- {{ table_of_images(glob(casedir, "plots", "*.png"), col = 4) }}
34
- </TabContent>
35
- <TabContent>
36
- <DataTable
37
- src={{ casedir | joinpaths: "markers.txt" | quote }}
38
- data={ {{ casedir | joinpaths: "markers.txt" | datatable: sep="\t", nrows=100 }} }
39
- />
40
- </TabContent>
41
- </div>
42
- </Tabs>
43
-
44
- <h{{h+1}}>Enrichment analysis</h{{h+1}}>
45
- {{ enrichr_report(casedir) }}
46
- {%- endif -%}
47
- {%- endfor -%}
48
- {%- else -%}
49
- {%- for secdir in secdirs -%}
50
- {%- set sec = secdir | basename -%}
51
- <h{{h}}>{{sec | escape}}</h{{h}}>
52
- {%- for casedir in secdir | glob: "*" -%}
53
- <h{{h+1}}>{{casedir | basename | escape}}</h{{h+1}}>
54
- {%- if casedir | joinpaths: "error.txt" | exists -%}
55
- <InlineNotification
56
- hideCloseButton
57
- lowContrast
58
- kind="warning"
59
- subtitle={{ casedir | joinpaths: "error.txt" | read | quote }}
60
- />
61
- {%- else -%}
62
- <h{{h+2}}>Markers</h{{h+2}}>
63
- <Tabs>
64
- <Tab label="Top 10 genes" />
65
- <Tab label="Table of top 100 genes" />
66
- <TabContent>
67
- {{ table_of_images(glob(casedir, "plots", "*.png"), col = 4) }}
68
- </TabContent>
69
- <TabContent>
70
- <DataTable
71
- src={{ casedir | joinpaths: "markers.txt" | quote }}
72
- data={ {{ casedir | joinpaths: "markers.txt" | datatable: sep="\t", nrows=100 }} }
73
- />
74
- </TabContent>
75
- </Tabs>
76
-
77
- <h{{h+2}}>Enrichment analysis</h{{h+2}}>
78
- {{ enrichr_report(casedir) }}
79
- {%- endif -%}
80
- {%- endfor -%}
81
- {%- endfor -%}
82
- {%- endif -%}
10
+ {{ job | render_job: h=h }}
83
11
  {%- endmacro -%}
84
12
 
85
13