From 27adc7f7518812746f80c6d83dcf1ab05c1e57fe Mon Sep 17 00:00:00 2001 From: Jessica Way Date: Tue, 15 Oct 2024 11:29:43 -0600 Subject: [PATCH 1/8] Updating PR template (#1382) * Updating PR template --- pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pull_request_template.md b/pull_request_template.md index cb89332bc9..59feb86a68 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -9,7 +9,7 @@ _You can delete these instructions once you have written your PR description._ ---- ### Checklist -If you can answer "yes" to the following items, please add a checkmark next to the appropriate checklist item(s) **and** notify our WARP documentation team by tagging either @ekiernan or @kayleemathews in a comment on this PR. +If you can answer "yes" to the following items, please add a checkmark next to the appropriate checklist item(s) **and** notify our WARP team by tagging @broadinstitute/warp-admins in a comment on this PR. - [ ] Did you add inputs, outputs, or tasks to a workflow? - [ ] Did you modify, delete or move: file paths, file names, input names, output names, or task names? From 5c8cc8afd5ae18337525d964b08e758da467ed19 Mon Sep 17 00:00:00 2001 From: Nikelle Petrillo <38223776+nikellepetrillo@users.noreply.github.com> Date: Fri, 18 Oct 2024 08:50:39 -0400 Subject: [PATCH 2/8] Np deprecate cemba (#1386) * pin all latest docker version * move cemba to deprecated folder * Updated pipeline_versions.txt with all pipeline version information * update cemba readme * update cemba readme * update cemba readme * changelogs --------- Co-authored-by: GitHub Action --- .../BuildCembaReferences.changelog.md | 12 ++++++++++++ .../BuildCembaReferences.options.json | 0 .../build_cemba_references/BuildCembaReferences.wdl | 0 .../build_bisulfite_references.py | 0 .../BuildCembaReferences.GRCh38.inputs.json | 0 .../BuildCembaReferences.GRCm38.inputs.json | 0 .../cemba/cemba_methylcseq/CEMBA.changelog.md | 5 +++++ .../cemba/cemba_methylcseq/CEMBA.methods.md | 0 .../pipelines}/cemba/cemba_methylcseq/CEMBA.png | Bin .../pipelines}/cemba/cemba_methylcseq/CEMBA.wdl | 2 +- .../pipelines}/cemba/cemba_methylcseq/README.md | 0 .../example_inputs/CEMBA.inputs.json | 0 .../example_inputs/CEMBA.options.json | 0 pipeline_versions.txt | 2 -- .../BuildCembaReferences.changelog.md | 7 ------- .../CEMBA_MethylC_Seq_Pipeline/README.md | 4 ++-- 16 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md rename {pipelines => deprecated/pipelines}/cemba/build_cemba_references/BuildCembaReferences.options.json (100%) rename {pipelines => deprecated/pipelines}/cemba/build_cemba_references/BuildCembaReferences.wdl (100%) rename {pipelines => deprecated/pipelines}/cemba/build_cemba_references/build_bisulfite_references.py (100%) rename {pipelines => deprecated/pipelines}/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCh38.inputs.json (100%) rename {pipelines => deprecated/pipelines}/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCm38.inputs.json (100%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/CEMBA.changelog.md (69%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/CEMBA.methods.md (100%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/CEMBA.png (100%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/CEMBA.wdl (99%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/README.md (100%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/example_inputs/CEMBA.inputs.json (100%) rename {pipelines => deprecated/pipelines}/cemba/cemba_methylcseq/example_inputs/CEMBA.options.json (100%) delete mode 100644 pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md diff --git a/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md b/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md new file mode 100644 index 0000000000..bfa1bee7dc --- /dev/null +++ b/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md @@ -0,0 +1,12 @@ +# 1.0.1 +2024-10-16 (Date of Last Commit) + +* The CEMBA workflow is deprecated and is no longer supported. However, the CEMBA documentation is still available. See [CEMBA Pipeline Overview](https://broadinstitute.github.io/warp/docs/Pipelines/CEMBA_MethylC_Seq_Pipeline/README) on the [WARP documentation site](https://broadinstitute.github.io/warp/)! + +# 1.0.0 +2020-11-15 (Date of Last Commit) + +###Initial release of BuildCembareferences Pipeline +Builds genomic reference files for [CEMBA pipeline](https://broadinstitute.github.io/warp/docs/Pipelines/CEMBA_MethylC_Seq_Pipeline/README) + +* Added version number to the BuildCembaReferences workflow diff --git a/pipelines/cemba/build_cemba_references/BuildCembaReferences.options.json b/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.options.json similarity index 100% rename from pipelines/cemba/build_cemba_references/BuildCembaReferences.options.json rename to deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.options.json diff --git a/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl b/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl similarity index 100% rename from pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl rename to deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl diff --git a/pipelines/cemba/build_cemba_references/build_bisulfite_references.py b/deprecated/pipelines/cemba/build_cemba_references/build_bisulfite_references.py similarity index 100% rename from pipelines/cemba/build_cemba_references/build_bisulfite_references.py rename to deprecated/pipelines/cemba/build_cemba_references/build_bisulfite_references.py diff --git a/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCh38.inputs.json b/deprecated/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCh38.inputs.json similarity index 100% rename from pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCh38.inputs.json rename to deprecated/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCh38.inputs.json diff --git a/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCm38.inputs.json b/deprecated/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCm38.inputs.json similarity index 100% rename from pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCm38.inputs.json rename to deprecated/pipelines/cemba/build_cemba_references/input_files/BuildCembaReferences.GRCm38.inputs.json diff --git a/pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md similarity index 69% rename from pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md rename to deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md index 0a7178369f..9dc8a0f319 100644 --- a/pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md +++ b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.changelog.md @@ -1,3 +1,8 @@ +# 1.1.8 +2024-10-16 (Date of Last Commit) + +* The CEMBA workflow is deprecated and is no longer supported. However, the CEMBA documentation is still available. See [CEMBA Pipeline Overview](https://broadinstitute.github.io/warp/docs/Pipelines/CEMBA_MethylC_Seq_Pipeline/README) on the [WARP documentation site](https://broadinstitute.github.io/warp/)! + # 1.1.7 2024-09-06 (Date of Last Commit) diff --git a/pipelines/cemba/cemba_methylcseq/CEMBA.methods.md b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.methods.md similarity index 100% rename from pipelines/cemba/cemba_methylcseq/CEMBA.methods.md rename to deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.methods.md diff --git a/pipelines/cemba/cemba_methylcseq/CEMBA.png b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.png similarity index 100% rename from pipelines/cemba/cemba_methylcseq/CEMBA.png rename to deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.png diff --git a/pipelines/cemba/cemba_methylcseq/CEMBA.wdl b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl similarity index 99% rename from pipelines/cemba/cemba_methylcseq/CEMBA.wdl rename to deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl index 1779c89194..3c23723a02 100644 --- a/pipelines/cemba/cemba_methylcseq/CEMBA.wdl +++ b/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl @@ -57,7 +57,7 @@ workflow CEMBA { } # version of this pipeline - String pipeline_version = "1.1.7" + String pipeline_version = "1.1.8" # trim off hardcoded sequence adapters call Trim as TrimAdapters { diff --git a/pipelines/cemba/cemba_methylcseq/README.md b/deprecated/pipelines/cemba/cemba_methylcseq/README.md similarity index 100% rename from pipelines/cemba/cemba_methylcseq/README.md rename to deprecated/pipelines/cemba/cemba_methylcseq/README.md diff --git a/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.inputs.json b/deprecated/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.inputs.json similarity index 100% rename from pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.inputs.json rename to deprecated/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.inputs.json diff --git a/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.options.json b/deprecated/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.options.json similarity index 100% rename from pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.options.json rename to deprecated/pipelines/cemba/cemba_methylcseq/example_inputs/CEMBA.options.json diff --git a/pipeline_versions.txt b/pipeline_versions.txt index 58e9900074..6911635220 100644 --- a/pipeline_versions.txt +++ b/pipeline_versions.txt @@ -38,5 +38,3 @@ Optimus 7.7.0 2024-09-24 atac 2.3.1 2024-09-11 SmartSeq2SingleSample 5.1.21 2024-09-11 SlideSeq 3.4.2 2024-09-24 -BuildCembaReferences 1.0.0 2020-11-15 -CEMBA 1.1.7 2024-09-06 diff --git a/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md b/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md deleted file mode 100644 index 7120bb57d4..0000000000 --- a/pipelines/cemba/build_cemba_references/BuildCembaReferences.changelog.md +++ /dev/null @@ -1,7 +0,0 @@ -# 1.0.0 -2020-11-15 (Date of Last Commit) - -###Initial release of BuildCembareferences Pipeline -Builds genomic reference files for [CEMBA pipeline](https://broadinstitute.github.io/warp/docs/Pipelines/CEMBA_MethylC_Seq_Pipeline/README) - -* Added version number to the BuildCembaReferences workflow diff --git a/website/docs/Deprecated_Pipelines/CEMBA_MethylC_Seq_Pipeline/README.md b/website/docs/Deprecated_Pipelines/CEMBA_MethylC_Seq_Pipeline/README.md index af41088ee8..0938488887 100644 --- a/website/docs/Deprecated_Pipelines/CEMBA_MethylC_Seq_Pipeline/README.md +++ b/website/docs/Deprecated_Pipelines/CEMBA_MethylC_Seq_Pipeline/README.md @@ -5,9 +5,9 @@ slug: /Pipelines/CEMBA_MethylC_Seq_Pipeline/README # CEMBA Overview :::warning -9/12/2024 +10/16/2024 -We are deprecating the CEMBA pipeline. Although the code will continue to be available, we are no longer supporting it. A possible alternative is the [Single-nucleus Methyl-seq and Chromatin Capture](../../Pipelines/snM3C/README.md) workflow. +The CEMBA pipeline has been officially deprecated, with support ending on October 16, 2024. Users currently utilizing this pipeline are advised to transition to other options. A recommended alternative is the [Single-nucleus Methyl-seq and Chromatin Capture](../../Pipelines/snM3C/README.md) workflow, which offers similar capabilities for methylation and chromatin analysis. ::: | Pipeline Version | Date Updated | Documentation Author | Questions or Feedback | From 52b47622298ca62c1ddddef20296d7acddf9233d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 09:34:58 -0400 Subject: [PATCH 3/8] Bump follow-redirects from 1.14.9 to 1.15.6 in /website (#1241) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.9 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.9...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nikelle Petrillo <38223776+nikellepetrillo@users.noreply.github.com> --- website/yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index dd38b210a0..d83beb382b 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -5344,15 +5344,10 @@ flux@^4.0.1: fbemitter "^3.0.0" fbjs "^3.0.0" -follow-redirects@^1.0.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== fork-ts-checker-webpack-plugin@^6.5.0: version "6.5.3" From d9871fd0ee66b3aabc8e2ef523733700849e30b5 Mon Sep 17 00:00:00 2001 From: aawdeh Date: Fri, 18 Oct 2024 09:56:52 -0400 Subject: [PATCH 4/8] PD-2758: Start Slidetags WDL (#1377) --- .dockstore.yml | 4 + beta-pipelines/skylab/slidetags/SlideTags.wdl | 36 ++++++++ .../skylab/slidetags/scripts/CREDITS.md | 11 +++ .../slidetags/scripts/spatial-count.wdl | 90 +++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 beta-pipelines/skylab/slidetags/SlideTags.wdl create mode 100644 beta-pipelines/skylab/slidetags/scripts/CREDITS.md create mode 100644 beta-pipelines/skylab/slidetags/scripts/spatial-count.wdl diff --git a/.dockstore.yml b/.dockstore.yml index d7bf17f613..366840f7d4 100644 --- a/.dockstore.yml +++ b/.dockstore.yml @@ -130,3 +130,7 @@ workflows: - name: VariantCalling subclass: WDL primaryDescriptorPath: /pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl + + - name: SlideTags + subclass: WDL + primaryDescriptorPath: /beta-pipelines/skylab/slidetags/SlideTags.wdl diff --git a/beta-pipelines/skylab/slidetags/SlideTags.wdl b/beta-pipelines/skylab/slidetags/SlideTags.wdl new file mode 100644 index 0000000000..976133327a --- /dev/null +++ b/beta-pipelines/skylab/slidetags/SlideTags.wdl @@ -0,0 +1,36 @@ +version 1.0 + +import "scripts/spatial-count.wdl" as SpatialCount + +workflow SlideTags { + + String pipeline_version = "1.0.0" + + input { + String id + Array[String] fastq_paths + Array[String] pucks + Int mem_GiB = 64 + Int disk_GiB = 128 + String docker = "us.gcr.io/broad-gotc-prod/slide-tags:1.0.0" + } + + parameter_meta { + fastq_paths: "Array of paths to spatial fastq files" + pucks: "Array of paths to puck files" + mem_GiB: "Memory in GiB to allocate to the task" + disk_GiB: "Disk in GiB to allocate to the task" + docker: "Docker image to use" + } + + call SpatialCount.count as spatial_count { + input: + fastq_paths = fastq_paths, + pucks = pucks, + mem_GiB = mem_GiB, + disk_GiB = disk_GiB, + docker = docker + } + +} + diff --git a/beta-pipelines/skylab/slidetags/scripts/CREDITS.md b/beta-pipelines/skylab/slidetags/scripts/CREDITS.md new file mode 100644 index 0000000000..920e7cee08 --- /dev/null +++ b/beta-pipelines/skylab/slidetags/scripts/CREDITS.md @@ -0,0 +1,11 @@ +# Credits + +This project uses code from the following sources: + +- **Spatial Count Workflow** + URL: [https://github.com/MacoskoLab/Macosko-Pipelines/blob/main/spatial-count/spatial-count.wdl](https://github.com/MacoskoLab/Macosko-Pipelines/blob/main/spatial-count/spatial-count.wdl) + This code was adapted and modified from the Macosko Lab's pipeline repository. + +Additional modifications include output handling and script download changes. + +Please refer to the original source for the full context of the workflow. diff --git a/beta-pipelines/skylab/slidetags/scripts/spatial-count.wdl b/beta-pipelines/skylab/slidetags/scripts/spatial-count.wdl new file mode 100644 index 0000000000..481da62fec --- /dev/null +++ b/beta-pipelines/skylab/slidetags/scripts/spatial-count.wdl @@ -0,0 +1,90 @@ +version 1.0 + +task count { + input { + Array[String] fastq_paths + Array[String] pucks + Int mem_GiB + Int disk_GiB + String docker + } + command <<< + set -euo pipefail + set -x + + echo "<< starting spatial-count >>" + + gcloud config set storage/process_count 16 + gcloud config set storage/thread_count 2 + + # Download the script -- put this script into a docker + wget https://raw.githubusercontent.com/MacoskoLab/Macosko-Pipelines/5c74e9e6148102081827625b9ce91ec2b7ba3541/spatial-count/spatial-count.jl + + echo "FASTQs: ~{length(fastq_paths)} paths provided" + echo "Pucks: ~{length(pucks)} puck(s) provided" + + # Assert that the fastqs exist + fastqs=(~{sep=' ' fastq_paths}) + for fastq in "${fastqs[@]}" ; do + if ! gsutil stat "$fastq" &> /dev/null ; then + echo "ERROR: gsutil stat command failed on fastq $fastq" + exit 1 + fi + done + + # Download the fastqs + echo "Downloading fastqs:" + mkdir fastqs + gcloud storage cp ~{sep=' ' fastq_paths} fastqs + + # Assert that the pucks exist + pucks=(~{sep=' ' pucks}) + for puck in "${pucks[@]}" ; do + if ! gsutil stat "$puck" &> /dev/null ; then + echo "ERROR: gsutil stat command failed on puck $puck" + exit 1 + fi + done + + # Download the pucks + echo "Downloading pucks:" + mkdir pucks + gcloud storage cp ~{sep=' ' pucks} pucks + + # Run the script + echo ; echo "Running spatial-count.jl" + ## julia --threads=4 /spatial-count.jl fastqs pucks . + julia --threads=4 spatial-count.jl fastqs pucks . + + if [[ -f SBcounts.h5 ]] ; then + echo ; echo "Success, uploading counts" + echo "true" > DONE + else + echo ; echo "ERROR: CANNOT FIND: SBcounts.h5" + fi + + echo; echo "Writing logs:" + echo; echo "fastqs size:"; du -sh fastqs + echo; echo "pucks size:"; du -sh pucks + echo; echo "output size:"; du -sh SBcounts.h5 + echo; echo "FREE SPACE:"; df -h + + cat stdout stderr > spatial-count.log + echo "<< completed spatial-count >>" + >>> + + output { + Boolean DONE = read_boolean("DONE") + File sb_counts = "SBcounts.h5" + File spatial_log = "spatial-count.log" + + } + runtime { + docker: docker + memory: "~{mem_GiB} GB" + disks: "local-disk ~{disk_GiB} SSD" + cpu: 1 + preemptible: 0 + } +} + From 7ecac80bf7c5f8f7ce3cfc27a8bac2a31f355882 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 14:01:19 -0400 Subject: [PATCH 5/8] Bump jinja2 from 3.1.2 to 3.1.3 in /verification/test-wdls/scripts (#1176) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nikelle Petrillo <38223776+nikellepetrillo@users.noreply.github.com> --- verification/test-wdls/scripts/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/verification/test-wdls/scripts/requirements.txt b/verification/test-wdls/scripts/requirements.txt index 58bc30385a..de9e3e0771 100644 --- a/verification/test-wdls/scripts/requirements.txt +++ b/verification/test-wdls/scripts/requirements.txt @@ -1 +1 @@ -jinja2==3.1.2 \ No newline at end of file +jinja2==3.1.3 \ No newline at end of file From 23d2cbc956e3e4c66ec1f790f97f3cde9f00edf6 Mon Sep 17 00:00:00 2001 From: ekiernan <55763654+ekiernan@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:32:23 -0400 Subject: [PATCH 6/8] Adding STAR aligner metrics and snm3c diagram (#1394) Added documentation for STAR aligner metrics and new diagram for snm3c --- .../docs/Pipelines/Optimus_Pipeline/README.md | 2 +- .../Optimus_Pipeline/starsolo-metrics.md | 104 ++++++++++++++++++ website/docs/Pipelines/snM3C/README.md | 3 +- .../docs/Pipelines/snM3C/snm3C_diagram.png | Bin 0 -> 57291 bytes 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 website/docs/Pipelines/Optimus_Pipeline/starsolo-metrics.md create mode 100644 website/docs/Pipelines/snM3C/snm3C_diagram.png diff --git a/website/docs/Pipelines/Optimus_Pipeline/README.md b/website/docs/Pipelines/Optimus_Pipeline/README.md index 6bbc24f6b7..9c1395ed4e 100644 --- a/website/docs/Pipelines/Optimus_Pipeline/README.md +++ b/website/docs/Pipelines/Optimus_Pipeline/README.md @@ -260,7 +260,7 @@ The following table lists the output files produced from the pipeline. For sampl | matrix_col_index | `_sparse_counts_col_index.npy` | Index of genes in count matrix. | NPY | | cell_metrics | `.cell-metrics.csv.gz` | Matrix of metrics by cells. | Compressed CSV | | gene_metrics | `.gene-metrics.csv.gz` | Matrix of metrics by genes. | Compressed CSV | -| aligner_metrics | `.star_metrics.tar` | Tarred metrics files produced by the STARsolo aligner; contains align features, cell reads, summary, and UMI per cell metrics files. | TXT | +| aligner_metrics | `.star_metrics.tar` | Tarred metrics files produced by the STARsolo aligner; contains align features, cell reads, summary, and UMI per cell metrics files. See the [STARsolo metrics](./starsolo-metrics.md) for more information about these files. | TXT | | library_metrics | `__library_metrics.csv` | Optional CSV file containing all library-level metrics calculated with STARsolo for gene expression data. See the [Library-level metrics](./Library-metrics.md) for how metrics are calculated. | CSV | | multimappers_EM_matrix | `UniqueAndMult-EM.mtx` | Optional output produced when `soloMultiMappers` is "EM"; see STARsolo [documentation](https://github.com/alexdobin/STAR/blob/master/docs/STARsolo.md#multi-gene-reads) for more information. | MTX | | multimappers_Uniform_matrix | `UniqueAndMult-Uniform.mtx` | Optional output produced when `soloMultiMappers` is "Uniform"; see STARsolo [documentation](https://github.com/alexdobin/STAR/blob/master/docs/STARsolo.md#multi-gene-reads) for more information. | MTX | diff --git a/website/docs/Pipelines/Optimus_Pipeline/starsolo-metrics.md b/website/docs/Pipelines/Optimus_Pipeline/starsolo-metrics.md new file mode 100644 index 0000000000..bd830a8d4c --- /dev/null +++ b/website/docs/Pipelines/Optimus_Pipeline/starsolo-metrics.md @@ -0,0 +1,104 @@ +# STAR Aligner Metrics +The STAR aligner produces multiple text files containing library-level summary metrics, cell-level metrics, and UMI metrics. The Optimus workflow compresses these files into a single TAR. These outputs are directly from the aligner as different batches of the data are analyzed in parallel. + +The STAR aligner metrics are supplemental to the [library-level metrics CSV](./Library-metrics.md) that is also produced by Optimus. Several of the calculations produced in the library metrics are directly based on the STAR aligner metrics. + +The following sections describe these outputs. + +## Align Features Metrics +The Align feature text file contains library-level metrics produced by the STARsolo alignment detailing the alignment of reads to genomic features during single-cell RNA-seq analysis. These metrics indicate how well reads map to specific genomic features or whether they failed to map due to various reasons. For example: +**noUnmapped** represents the number of reads that were not aligned to any feature in the genome. +**noNoFeature** reflects reads that were aligned but did not map to any specific feature such as exons or genes. +**MultiFeature** counts reads that were aligned to multiple features. +**yesWLmatch** and **yesCellBarcodes** track how well reads match the barcode whitelist, an important step in identifying valid cell barcodes, which helps demultiplex the single-cell RNA-seq data​. + +Each of the table metrics gives insights into different stages of read alignment, from barcode matching to gene feature mapping, allowing you to assess the quality and accuracy of the alignment step in the pipeline. + + +| Metrics name | Description | +| --- | --- | +| noUnmapped | Number of unmapped reads | +| noNoFeature | Number of reads not mapped to a feature. | +| MultiFeature | Number of reads aligned to multiple features. | +| subMultiFeatureMultiGenomic | Number of reads mapping to multiple genomic loci and multiple features. | +| noTooManyWLmatches | Number of reads not counted because their barcoded pair has too many matches to the whitelist. | +| noMMtoWLwithoutExact | Number of reads not counted because their barcoded pair has mismatches to the whitelist and there's no more reads supporting that barcode. | +| yesWLmatch | Number of reads whose barcoded pair has a match to the whitelist. | +| yessubWLmatchExact | Number of reads with cell barcode exactly matched to the whitelist (a subset of yesWLmatch). | +| yessubWLmatch_UniqueFeature | Number of reads matched to the WL and unique feature (a subset of yesWLmatch). | +| yesCellBarcodes | Number of reads associated with a valid cell barcode. | +| yesUMIs | Number of reads associated with a valid UMI. | + + + + + + +## Cell Read Metrics + +The **cell read metrics** text file provides cell barcode-level information about the reads; for instance: +**cbMatch** counts the number of reads that successfully matched the cell barcode. +**cbPerfect** gives the number of reads with a perfect match to a cell barcode, while **cbMMunique** and **cbMMmultiple** measure mismatches that still align uniquely or to multiple barcodes, respectively. +**genomeU** and **genomeM** count reads mapped to one or multiple loci in the genome, respectively. +**exonic** and **intronic** track reads mapping to annotated exons or introns, helping distinguish between different gene regions in the analysis. + +These metrics are important for assessing the quality of individual cell barcodes. + +| Metrics | Description | +| --- | --- | +| CB | Cell barcode | +| cbMatch | Number of reads that matched the cell barcode. | +| cbPerfect | Number of perfect matches on cell barcode. | +| cbMMunique | Number of reads with cell barcodes that map with mismatches to one barcode in the passlist. | +| cbMMmultiple | Number of reads with cell barcodes that map with mismatches to multiple barcodes in the passlist. | +| genomeU | Number of reads mapping to one locus in the genome. | +| genomeM | Number of reads mapping to multiple loci in the genome. | +| featureU | Number of reads mapping to one feature (Gene, GeneFull, etc). | +| featureM | Number of reads mapping to multiple features. | +| exonic | Number of reads mapping to annotated exons. | +| intronic | Number of reads mapping to annotated introns; these are only calculated for --soloFeatures GeneFull_Ex50pAS and/or GeneFull_ExonOverIntron. | +| exonicAS | Number of reads mapping antisense to annotated exons. | +| intronicAS | Number of reads mapping antisense to annotated introns; these are only calculated for --soloFeatures GeneFull_Ex50pAS. | +| mito | Number of reads mapping to the mitochondrial genome. | +| countedU | Number of unique-gene reads whose UMIs contributed to counts in the matrix.mtx (eads with valid CB/UMI/gene). | +| countedM | Number of multi-gene reads whose UMIs contributed to counts in the matrix.mtx. | +| nUMIunique | Total number of counted UMI for unique-gene reads. | +| nGenesUnique | Number of genes for unique-gene reads. | +| nUMImulti | Total number of counted UMI for multi-gene reads. | +| nGenesMulti | Number of genes for multi-gene reads. | + +## Summary.txt + +The **summary** text file contains additional library-level metrics produced by the STARsolo aligner, such as: +**Number of reads**, which reflects the total reads processed, and **reads with valid barcodes**, which indicates how many reads matched the barcode whitelist. +**Sequencing saturation** shows the completeness of sequencing, where higher values indicate fewer additional reads are needed to capture new UMIs. +Metrics like **Q30 Bases in CB+UMI** and **Q30 Bases in RNA read** give insights into sequencing quality, showing how many reads had high-quality base calls. +Other key metrics, such as **reads mapped to the genome: Unique+Multiple** and **estimated number of cells**, provide a sense of how well reads were mapped to the genome and how many cells were identified. +These summary metrics help users assess the overall quality and completeness of their single-cell RNA-seq data, serving as a useful checkpoint for determining whether the data is suitable for further analysis. + +| Metric | Description | +| --- | --- | +| Number of Reads | Number of reads in the library. | +| Reads With Valid Barcodes | Fraction of reads with valid barcodes. | +| Sequencing Saturation | Proportion of unique molecular identifiers (UMIs) that have been sequenced at least once compared to the total number of possible UMIs in the sample; calculated as: 1-(yesUMIs/yessubWLmatch_UniqueFeature). | +| Q30 Bases in CB+UMI | Fraction of high-quality reads in the cell barcode and UMI read. | +| Q30 Bases in RNA read | Fraction of high-quality reads in the RNA read. | +| Reads Mapped to Genome: Unique+Multiple | Fraction of unique and multimapped reads that mapped to the genome. | +| Reads Mapped to Genome: Unique | Fraction of unique reads that mapped to the genome. | +| Reads Mapped to genes: Unique+Multiple | Fraction of reads that mapped to genes as defined by the –solo-feature parameter. | +| Reads Mapped to Genes: Unique| Fraction of unique reads that mapped to genes. | +| Estimated Number of Cells | Number of barcodes that STARsolo flagged as cells based on UMIs. | +| Unique Reads in Cells Mapped to genes | Total number of unique reads that mapped to genes across all cells | +| Fraction of Unique Reads in Cells | Fraction of unique reads across all cells. | +| Mean Reads per Cell | Mean number of reads per cell. | +| Median Reads per Cell | Median number of reads per cell. | +| UMIs in Cells | Number of UMIs per cell. | +| Mean UMI per Cell | Mean number of UMIs per cell. | +| Median UMI per Cell | Median number of UMI per cell. | +| Mean Genes per Cell | Mean number of genes expressed per cell. | +| Median Genes per Cell | Median number of genes per cell. | +| Total Genes Detected | Total number of genes detected in the overall library. | + + +## UMI per cell +The UMI per cell text file is a list of UMI counts per every cell. It contains two columns. The first column contains the number of UMIs per each barcode entry. The second column indicates whether a barcode was flagged as a cell. A 1 indicates that it passed filtering criteria to be considered a cell and 0 indicates that it did not pass. diff --git a/website/docs/Pipelines/snM3C/README.md b/website/docs/Pipelines/snM3C/README.md index fe5e0fa2f9..733a443a53 100644 --- a/website/docs/Pipelines/snM3C/README.md +++ b/website/docs/Pipelines/snM3C/README.md @@ -6,8 +6,9 @@ slug: /Pipelines/snm3C/README | Pipeline Version | Date Updated | Documentation Authors | Questions or Feedback | | :----: | :---: | :----: | :--------------: | -| [snm3C_v4.0.1](https://github.com/broadinstitute/warp/releases) | March, 2024 | Kaylee Mathews | Please [file an issue in WARP](https://github.com/broadinstitute/warp/issues). | +| [snm3C_v4.0.1](https://github.com/broadinstitute/warp/releases) | October, 2024 | Kaylee Mathews | Please [file an issue in WARP](https://github.com/broadinstitute/warp/issues). | +![snm3C_diagram](snm3C_diagram.png) ## Introduction to snm3C diff --git a/website/docs/Pipelines/snM3C/snm3C_diagram.png b/website/docs/Pipelines/snM3C/snm3C_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd55b6c2d57742326ccefb6e6141f4b5b132333 GIT binary patch literal 57291 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 ZjBFkLW17GqG~VZ4$w(?nl#3Y#{5P*glOq5C literal 0 HcmV?d00001 From b8612dec30800556a1605ea5c672923e9bc01d24 Mon Sep 17 00:00:00 2001 From: ekiernan <55763654+ekiernan@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:39:14 -0400 Subject: [PATCH 7/8] removed underscore from NHashID key (#1393) * removed underscore from NHashID key --- pipeline_versions.txt | 6 +++--- pipelines/skylab/atac/atac.changelog.md | 5 +++++ pipelines/skylab/atac/atac.wdl | 5 ++--- pipelines/skylab/multiome/Multiome.changelog.md | 5 +++++ pipelines/skylab/multiome/Multiome.wdl | 2 +- pipelines/skylab/paired_tag/PairedTag.changelog.md | 5 +++++ pipelines/skylab/paired_tag/PairedTag.wdl | 2 +- 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/pipeline_versions.txt b/pipeline_versions.txt index 6911635220..66a514f5a9 100644 --- a/pipeline_versions.txt +++ b/pipeline_versions.txt @@ -30,11 +30,11 @@ ExomeReprocessing 3.3.1 2024-09-17 BuildIndices 3.0.0 2023-12-06 scATAC 1.3.2 2023-08-03 snm3C 4.0.4 2024-08-06 -Multiome 5.7.0 2024-09-24 -PairedTag 1.7.0 2024-09-24 +Multiome 5.7.1 2024-10-18 +PairedTag 1.7.1 2024-10-18 MultiSampleSmartSeq2 2.2.22 2024-09-11 MultiSampleSmartSeq2SingleNucleus 2.0.1 2024-09-24 Optimus 7.7.0 2024-09-24 -atac 2.3.1 2024-09-11 +atac 2.3.2 2024-10-18 SmartSeq2SingleSample 5.1.21 2024-09-11 SlideSeq 3.4.2 2024-09-24 diff --git a/pipelines/skylab/atac/atac.changelog.md b/pipelines/skylab/atac/atac.changelog.md index d64620354a..34b5704e59 100644 --- a/pipelines/skylab/atac/atac.changelog.md +++ b/pipelines/skylab/atac/atac.changelog.md @@ -1,3 +1,8 @@ +# 2.3.2 +2024-10-18 (Date of Last Commit) + +* Removed the underscore of the NHashID in the ATAC library metrics CSV + # 2.3.1 2024-09-11 (Date of Last Commit) diff --git a/pipelines/skylab/atac/atac.wdl b/pipelines/skylab/atac/atac.wdl index 8918a8d8ad..2acb133c2b 100644 --- a/pipelines/skylab/atac/atac.wdl +++ b/pipelines/skylab/atac/atac.wdl @@ -46,7 +46,7 @@ workflow ATAC { String adapter_seq_read3 = "TCGTCGGCAGCGTCAGATGTGTATAAGAGACAG" } - String pipeline_version = "2.3.1" + String pipeline_version = "2.3.2" # Determine docker prefix based on cloud provider String gcr_docker_prefix = "us.gcr.io/broad-gotc-prod/" @@ -559,8 +559,7 @@ task CreateFragmentFile { data = pp.recipe_10x_metrics("~{bam}", "~{bam_base_name}.fragments.tsv", "temp_metrics.h5ad", is_paired=True, barcode_tag="CB", chrom_sizes=chrom_size_dict, gene_anno=atac_gtf, peaks=None) # Add NHashID to metrics - nhash_ID_value = "XXX" - data = OrderedDict({'NHash_ID': atac_nhash_id, **data}) + data = OrderedDict({'NHashID': atac_nhash_id, **data}) # Flatten the dictionary flattened_data = [] for category, metrics in data.items(): diff --git a/pipelines/skylab/multiome/Multiome.changelog.md b/pipelines/skylab/multiome/Multiome.changelog.md index 40e399d729..378678f9ba 100644 --- a/pipelines/skylab/multiome/Multiome.changelog.md +++ b/pipelines/skylab/multiome/Multiome.changelog.md @@ -1,3 +1,8 @@ +# 5.7.1 +2024-10-18 (Date of Last Commit) + +* Removed the underscore of the NHashID in the ATAC library metrics CSV to match the gene expression library metrics + # 5.7.0 2024-09-24 (Date of Last Commit) * Added a python implementation of DoubletFinder to calculate doublet scores in gene expression data; percent doublets are now available as a library-level metric and individual doublet scores for cell barcodes are in the h5ad diff --git a/pipelines/skylab/multiome/Multiome.wdl b/pipelines/skylab/multiome/Multiome.wdl index ce14e6c476..821e5bead6 100644 --- a/pipelines/skylab/multiome/Multiome.wdl +++ b/pipelines/skylab/multiome/Multiome.wdl @@ -9,7 +9,7 @@ import "../../../tasks/broad/Utilities.wdl" as utils workflow Multiome { - String pipeline_version = "5.7.0" + String pipeline_version = "5.7.1" input { diff --git a/pipelines/skylab/paired_tag/PairedTag.changelog.md b/pipelines/skylab/paired_tag/PairedTag.changelog.md index ab5104b3b8..f6ce64b4ca 100644 --- a/pipelines/skylab/paired_tag/PairedTag.changelog.md +++ b/pipelines/skylab/paired_tag/PairedTag.changelog.md @@ -1,3 +1,8 @@ +# 1.7.1 +2024-10-18 (Date of Last Commit) + +* Removed the underscore of the NHashID in the ATAC library metrics CSV + # 1.7.0 2024-09-24 (Date of Last Commit) * Added a python implementation of DoubletFinder to calculate doublet scores in gene expression data; percent doublets are now available as a library-level metric and individual doublet scores for cell barcodes are in the h5ad diff --git a/pipelines/skylab/paired_tag/PairedTag.wdl b/pipelines/skylab/paired_tag/PairedTag.wdl index 938acb24b9..83b470ba47 100644 --- a/pipelines/skylab/paired_tag/PairedTag.wdl +++ b/pipelines/skylab/paired_tag/PairedTag.wdl @@ -8,7 +8,7 @@ import "../../../tasks/broad/Utilities.wdl" as utils workflow PairedTag { - String pipeline_version = "1.7.0" + String pipeline_version = "1.7.1" input { From 548f6d2d94eb85cd18613f1729f0d3e8386cd3b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:49:21 -0400 Subject: [PATCH 8/8] Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /website (#1249) Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nikelle Petrillo <38223776+nikellepetrillo@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index d83beb382b..cd6182cb2b 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -9252,9 +9252,9 @@ webpack-bundle-analyzer@^4.5.0: ws "^7.3.1" webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3"