From 3e1e1816320bd7ad8e41ee81d2e7e923fa508761 Mon Sep 17 00:00:00 2001 From: "Gervaise H. Henry" <gervaise.henry@utsouthwestern.edu> Date: Wed, 8 Jul 2020 17:08:01 -0500 Subject: [PATCH] Add cellranger 4.0.0 --- CHANGELOG.md | 12 +++++ astrocyte_pkg.yml | 6 ++- workflow/conf/aws.config | 44 ++++++++++++++++++ workflow/conf/bicf_logo.png | Bin 0 -> 24863 bytes workflow/conf/biohpc.config | 73 ++++++++++++++++++++++++++++++ workflow/conf/cluster.config | 30 ++++++++++++ workflow/conf/local.config | 3 ++ workflow/conf/multiqc_config.yaml | 62 +++++++++++++++++++++++++ workflow/main.nf | 61 +++++++++++++++++++++++-- workflow/nextflow.config | 2 +- 10 files changed, 286 insertions(+), 7 deletions(-) create mode 100644 workflow/conf/aws.config create mode 100644 workflow/conf/bicf_logo.png create mode 100644 workflow/conf/biohpc.config create mode 100644 workflow/conf/cluster.config create mode 100755 workflow/conf/local.config create mode 100755 workflow/conf/multiqc_config.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index e85dc43..8c1414a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# v2.2.0-indev +**User Facing** +* Add cellranger version 4.0.0 +* Add references version 2020-A (GRCh38, mm10, mix) + +**Background** + +*Known Bugs* +* Vizapp does not yet work for Astrocyte +* Running in CLI: to set --fastq path of file/s needs to be in quotes + + # v2.1.1 **User Facing** * Check Design File for spaces in name and file contents diff --git a/astrocyte_pkg.yml b/astrocyte_pkg.yml index e128e1f..29f82cd 100755 --- a/astrocyte_pkg.yml +++ b/astrocyte_pkg.yml @@ -100,12 +100,15 @@ workflow_parameters: - id: genome type: select choices: + - ['GRCh38-2020-A', 'Human GRCh38 release 98'] - ['GRCh38-3.0.0', 'Human GRCh38 release 93'] - ['GRCh38-1.2.0', 'Human GRCh38 release 84'] - ['hg19-3.0.0', 'Human GRCh37 (hg19) release 87'] - ['hg19-1.2.0', 'Human GRCh37 (hg19) release 84'] + - ['mm10-2020-A', 'Mouse GRCm38 (mm10) release 98'] - ['mm10-3.0.0', 'Mouse GRCm38 (mm10) release 93'] - ['mm10-1.2.0', 'Mouse GRCm38 (mm10) release 84'] + - ['GRCh38_and_mm10-2020-A', 'Human GRCh38 + Mouse GRCm38 (mm10) release 98'] - ['GRCh38_and_mm10-3.1.0', 'Human GRCh38 + Mouse GRCm38 (mm10) release 93'] - ['hg19_and_mm10-3.0.0', 'Human GRCh37 (hg19) + Mouse GRCm38 (mm10) release 93'] - ['hg19_and_mm10-1.2.0', 'Human GRCh37 (hg19) + Mouse GRCm38 (mm10) release 84'] @@ -146,8 +149,9 @@ workflow_parameters: - id: version type: select - default: '3.1.0' + default: '4.0.0' choices: + - ['4.0.0', '4.0.0'] - ['3.1.0', '3.1.0'] - ['3.0.2', '3.0.2'] - ['2.1.1', '2.1.1'] diff --git a/workflow/conf/aws.config b/workflow/conf/aws.config new file mode 100644 index 0000000..6caee14 --- /dev/null +++ b/workflow/conf/aws.config @@ -0,0 +1,44 @@ +workDir = 's3://' +aws.client.storageEncryption = 'AES256' +aws { + region = '' + batch { + cliPath = '/home/ec2-user/miniconda/bin/aws' + } +} + +process { + executor = 'awsbatch' + queue = 'default-' + cpus = 1 + memory = '1 GB' + + withLabel: checkDesignFile { + cpus = 2 + memory = '1 GB' + } + withLabel: count211 { + cpus = 2 + memory = '30 GB' + } + withLabel: count220 { + cpus = 2 + memory = '30 GB' + } + withLabel: count302 { + cpus = 2 + memory = '30 GB' + } + withLabel: count310 { + cpus = 2 + memory = '30 GB' + } + withLabel: versions { + cpus = 3 + memory = '1 GB' + } + withLabel: multiqc { + cpus = 1 + memory = '1 GB' + } +} diff --git a/workflow/conf/bicf_logo.png b/workflow/conf/bicf_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8015590c5a94f92c39ec2470bd02baa3d09077 GIT binary patch literal 24863 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 ZPL2w7h5Opc`wjr0sj7RwT-iG8e*l&whlBtC literal 0 HcmV?d00001 diff --git a/workflow/conf/biohpc.config b/workflow/conf/biohpc.config new file mode 100644 index 0000000..983b458 --- /dev/null +++ b/workflow/conf/biohpc.config @@ -0,0 +1,73 @@ +params { + // Reference file paths on BioHPC + genomes { + 'GRCh38-2020-A' { + loc = '/project/apps_database/cellranger/refdata-gex-' + } + 'GRCh38-3.0.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'GRCh38-1.2.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'hg19-3.0.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'hg19-1.2.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'mm10-2020-A' { + loc = '/project/apps_database/cellranger/refdata-gex-' + } + 'mm10-3.0.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'mm10-1.2.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'GRCh38_and_mm10-2020-A' { + loc = '/project/apps_database/cellranger/refdata-gex-' + } + 'GRCh38_and_mm10-3.1.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'hg19_and_mm10-3.0.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'hg19_and_mm10-1.2.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + 'ercc92-1.2.0' { + loc = '/project/apps_database/cellranger/refdata-cellranger-' + } + } + // Chemistry mapping parameter + chemistry { + 'auto' { + param = 'auto' + } + '3GEXv1' { + param = 'SC3Pv1' + } + '3GEXv2' { + param = 'SC3Pv2' + } + '3GEXv3' { + param = 'SC3Pv3' + } + '5GEX' { + param = 'fiveprime' + } + } +} + +singularity { + enabled = true + cacheDir = '/project/BICF/BICF_Core/shared/gudmap/singularity_cache/' +} + +env { + http_proxy = 'http://proxy.swmed.edu:3128' + https_proxy = 'http://proxy.swmed.edu:3128' + all_proxy = 'http://proxy.swmed.edu:3128' +} diff --git a/workflow/conf/cluster.config b/workflow/conf/cluster.config new file mode 100644 index 0000000..7322376 --- /dev/null +++ b/workflow/conf/cluster.config @@ -0,0 +1,30 @@ +process { + executor = 'slurm' + queue = '32GB' + clusterOptions = '--hold' + + withLabel: trackStart { + executor = 'local' + } + withLabel: checkDesignFile { + executor = 'local' + } + withLabel: count211 { + queue = '128GB,256GB,256GBv1,384GB' + } + withLabel: count220 { + queue = '128GB,256GB,256GBv1,384GB' + } + withLabel: count302 { + queue = '128GB,256GB,256GBv1,384GB' + } + withLabel: count310 { + queue = '128GB,256GB,256GBv1,384GB' + } + withLabel: versions { + executor = 'local' + } + withLabel: multiqc { + executor = 'local' + } +} diff --git a/workflow/conf/local.config b/workflow/conf/local.config new file mode 100755 index 0000000..9ca703b --- /dev/null +++ b/workflow/conf/local.config @@ -0,0 +1,3 @@ +process { + executor = 'local' +} \ No newline at end of file diff --git a/workflow/conf/multiqc_config.yaml b/workflow/conf/multiqc_config.yaml new file mode 100755 index 0000000..2ff18a7 --- /dev/null +++ b/workflow/conf/multiqc_config.yaml @@ -0,0 +1,62 @@ +# Custom Logo +custom_logo: 'bicf_logo.png' +custom_logo_url: 'https://www.utsouthwestern.edu/labs/bioinformatics/' +custom_logo_title: 'Bioinformatics Core Facility' + +report_header_info: + - Contact E-mail: 'bicf@utsouthwestern.edu' + - Application Type: 'cellranger_count' + - Department: 'Bioinformatic Core Facility, Department of Bioinformatics' + + +# Title to use for the report. +title: BICF CellRanger Count Analysis Report + +report_comment: > + This report has been generated by the <a href="https://git.biohpc.swmed.edu/BICF/Astrocyte/cellranger_count" + target="_blank">BICF/cellranger_count</a> pipeline. + +custom_data: + metrics_summary: + file_format: 'tsv' + id: 'metrics_summary' + contents: 'Estimated Number of Cells Mean Reads per Cell Median Genes per Cell Number of Reads Valid Barcodes Sequencing Saturation Q30 Bases in Barcode Q30 Bases in RNA Read Q30 Bases in UMI Reads Mapped to Genome Reads Mapped Confidently to Genome Reads Mapped Confidently to Intergenic Regions Reads Mapped Confidently to Intronic Regions Reads Mapped Confidently to Exonic Regions Reads Mapped Confidently to Transcriptome Reads Mapped Antisense to Gene Fraction Reads in Cells Total Genes Detected Median UMI Counts per Cell' + section_name: 'Metrics Summary' + plot_type: 'generalstats' + +sp: + metrics_summary: + fn: 'metrics_summary_mqc.tsv' + +table_columns_placement: + metrics_summary: + Estimated Number of Cells: 1 + Mean Reads per Cell: 2 + Median Genes per Cell: 3 + Number of Reads: 4 + Sequencing Saturation: 5 + Reads Mapped Confidently to Genome: 6 + Reads Mapped Confidently to Transcriptome: 7 + Fraction Reads in Cells: 8 + Total Genes Detected: 9 + Median UMI Counts per Cell: 10 + Valid Barcodes: 1100 + Reads Mapped Antisense to Gene: 1200 + +table_columns_visible: + metrics_summary: + Q30 Bases in Barcode: False + Q30 Bases in RNA Read: False + Q30 Bases in UMI: False + Reads Mapped to Genome: False + Reads Mapped Confidently to Intergenic Regions: False + Reads Mapped Confidently to Intronic Regions: False + Reads Mapped Confidently to Exonic Regions: False + +thousandsSep_format: '' + +report_section_order: + software_versions: + order: -1100 + software_references: + order: -1200 diff --git a/workflow/main.nf b/workflow/main.nf index f110f31..d727bb8 100755 --- a/workflow/main.nf +++ b/workflow/main.nf @@ -21,12 +21,12 @@ main.nf params.name = "run" params.fastq = "test_data/mu.v3s1r500/*.fastq.gz" params.designFile = "test_data/mu.v3s1r500/design.csv" -params.genome = 'mm10-3.0.0' -params.genomeLocation = '/project/apps_database/cellranger/refdata-cellranger-' +params.genome = 'mm10-2020-A' +params.genomeLocation = '/project/apps_database/cellranger/refdata-gex-' params.expectCells = 10000 params.forceCells = 0 params.kitVersion = '3GEXv3' -params.version = '3.1.0' +params.version = '4.0.0' params.astrocyte = false params.outDir = "${baseDir}/output" @@ -60,7 +60,7 @@ if (params.astrocyte) { params.genomeLocationFull = params.genomeLocation+params.genome // Define variables from input -pipelineVersion = "2.1.1" +pipelineVersion = "2.2.0-indev" name = params.name designLocation = Channel .fromPath(params.designFile) @@ -158,21 +158,26 @@ samples.into { samples211 samples302 samples310 + samples400 } refLocation.into { refLocation211 refLocation302 refLocation310 + refLocation400 } expectCells211 = expectCells expectCells302 = expectCells expectCells310 = expectCells +expectCells3400 = expectCells forceCells211 = forceCells forceCells302 = forceCells forceCells310 = forceCells +forceCells400 = forceCells chemistryParam211 = chemistryParam chemistryParam302 = chemistryParam chemistryParam310 = chemistryParam +chemistryParam400 = chemistryParam /* @@ -314,6 +319,52 @@ process count310 { } } +/* + * count400: run cellranger count version 4.0.0 + */ +process count400 { + tag "${sample}" + publishDir "${outDir}/${task.process}", mode: 'copy' + queue '128GB,256GB,256GBv1,384GB' + module 'cellranger/4.0.0' + + input: + set sample, file("${sample}_S?_L001_R1_001.fastq.gz"), file("${sample}_S?_L001_R2_001.fastq.gz"), file(script) from samples400 + file ref from refLocation310.first() + expectCells400 + forceCells400 + chemistryParam400 + + output: + file("**/outs/**") into outPaths400 + file("*_metrics_summary.tsv") into metricsSummary400 + + when: + version == '4.0.0' + + script: + if (forceCells400 == 0) { + """ + hostname + ulimit -u 16384 + ulimit -a + bash filename_check.sh -r ${ref} + cellranger count --id=${sample} --transcriptome=./${ref} --fastqs=. --sample=${sample} --expect-cells=${expectCells310} --chemistry=${chemistryParam310} + sed -E 's/("([^"]*)")?(,|\$)/\\2\t/g' ${sample}/outs/metrics_summary.csv | tr -d "," | sed "s/^/${sample}\t/" > ${sample}_metrics_summary.tsv + """ + } + else { + """ + hostname + ulimit -u 16384 + ulimit -a + bash filename_check.sh -r ${ref} + cellranger count --id=${sample} --transcriptome=./${ref} --fastqs=. --sample=${sample} --force-cells=${forceCells310} --chemistry=${chemistryParam310} + sed -E 's/("([^"]*)")?(,|\$)/\\2\t/g' ${sample}/outs/metrics_summary.csv | tr -d "," | sed "s/^/${sample}\t/" > ${sample}_metrics_summary.tsv + """ + } +} + /* * versions: collect all versions into a single yml */ @@ -343,7 +394,7 @@ process versions { } // Collect all metrics summaries reguardless of cellranger version -metricsSummary = metricsSummary211.mix(metricsSummary302, metricsSummary310) +metricsSummary = metricsSummary211.mix(metricsSummary302, metricsSummary310, metricsSummary400) /* * multiqc: create multiqc report diff --git a/workflow/nextflow.config b/workflow/nextflow.config index 5a622ec..c402bf3 100644 --- a/workflow/nextflow.config +++ b/workflow/nextflow.config @@ -47,6 +47,6 @@ manifest { homePage = 'https://git.biohpc.swmed.edu/BICF/Astrocyte/cellranger_count' description = 'This pipeline is a wrapper for the cellranger count tool from 10x Genomics. It takes fastq files from 10x Genomics Single Cell Gene Expression libraries, performs alignment, filtering, barcode counting, and UMI counting. It uses the Chromium cellular barcodes to generate gene-barcode matrices, determine clusters, and perform gene expression analysis.' mainScript = 'main.nf' - version = '2.1.1' + version = '2.2.0-indev' nextflowVersion = '>=0.31.0' } -- GitLab