diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 19d907385821582ee042178815224b877eb8f20e..e7e7a07b8f13d737e841d098f775585ae8452035 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,8 +2,8 @@ before_script: - module load astrocyte - module load python/3.6.1-2-anaconda - pip install --user pytest-pythonpath==0.7.1 pytest-cov==2.5.1 + - module load nextflow/20.01.0 - module load singularity/3.0.2 - - module load nextflow/19.09.0 - mkdir -p test_data/hu.v2s1r500 - mkdir -p test_data/hu.v3s1r500 - mkdir -p test_data/mu.v3s1r500 @@ -30,7 +30,7 @@ astrocyte_cli: artifacts: expire_in: 2 days retry: - max: 1 + max: 0 when: - always @@ -44,7 +44,8 @@ astrocyte_cli: - master - tags script: - - singularity run 'docker://bicf/cellranger2.1.1:2.0.0' cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 + - module load cellranger/2.1.1 + - cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 artifacts: name: "$CI_JOB_NAME" when: always @@ -52,29 +53,7 @@ astrocyte_cli: - test/outs/web_summary.html expire_in: 2 days retry: - max: 1 - when: - - always - -2.2.2_test: - stage: container_test - only: - - branches - except: - refs: - - develop - - master - - tags - script: - - singularity run 'docker://bicf/cellranger2.2.0:2.0.0' cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 - artifacts: - name: "$CI_JOB_NAME" - when: always - paths: - - test/outs/web_summary.html - expire_in: 2 days - retry: - max: 1 + max: 0 when: - always @@ -88,7 +67,8 @@ astrocyte_cli: - master - tags script: - - singularity run 'docker://bicf/cellranger3.0.2:2.0.0' cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 + - module load cellranger/3.0.2 + - cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 artifacts: name: "$CI_JOB_NAME" when: always @@ -96,7 +76,7 @@ astrocyte_cli: - test/outs/web_summary.html expire_in: 2 days retry: - max: 1 + max: 0 when: - always @@ -110,7 +90,8 @@ astrocyte_cli: - master - tags script: - - singularity run 'docker://bicf/cellranger3.1.0:2.0.0' cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 + - module load cellranger/3.1.0 + - cellranger count --id=test --transcriptome=/project/apps_database/cellranger/refdata-cellranger-GRCh38-3.0.0 --fastqs=./test_data/hu.v2s1r500 --sample=pbmc_1k_v2 --chemistry=SC3Pv2 artifacts: name: "$CI_JOB_NAME" when: always @@ -120,7 +101,7 @@ astrocyte_cli: - test/outs/web_summary.html expire_in: 2 days retry: - max: 1 + max: 0 when: - always @@ -133,7 +114,7 @@ GRCh38-3.0.0: except: - tags script: - - nextflow -q run workflow/main.nf -profile biohpc,cluster --fastq "test_data/hu.v3s1r500/*.fastq.gz" --designFile "test_data/hu.v3s1r500/design.csv" --genome 'GRCh38-3.0.0' --kitVersion '3GEXv3' --version '3.1.0' --ci true + - nextflow run workflow/main.nf -profile biohpc,cluster --fastq "test_data/hu.v3s1r500/*.fastq.gz" --designFile "test_data/hu.v3s1r500/design.csv" --genome 'GRCh38-3.0.0' --kitVersion '3GEXv3' --version '3.1.0' --ci true - pytest -m count310 artifacts: name: "$CI_JOB_NAME" @@ -144,7 +125,7 @@ GRCh38-3.0.0: - workflow/output/multiqc/run/multiqc_report.html expire_in: 2 days retry: - max: 1 + max: 0 when: - always @@ -157,7 +138,7 @@ mm10-3.0.0: except: - tags script: - - nextflow -q run workflow/main.nf -profile biohpc,cluster --fastq "test_data/mu.v3s1r500/*.fastq.gz" --designFile "test_data/mu.v3s1r500/design.csv" --genome 'mm10-3.0.0' --kitVersion '3GEXv3' --version '3.1.0' --ci true + - nextflow run workflow/main.nf -profile biohpc,cluster --fastq "test_data/mu.v3s1r500/*.fastq.gz" --designFile "test_data/mu.v3s1r500/design.csv" --genome 'mm10-3.0.0' --kitVersion '3GEXv3' --version '3.1.0' --ci true - pytest -m count310 artifacts: name: "$CI_JOB_NAME" @@ -168,7 +149,7 @@ mm10-3.0.0: - workflow/output/multiqc/run/multiqc_report.html expire_in: 2 days retry: - max: 1 + max: 0 when: - always @@ -179,7 +160,7 @@ mm10-3.0.0: - master - tags script: - - nextflow -q run workflow/main.nf -profile biohpc,cluster --fastq "test_data/hu.v3s2r10k/*.fastq.gz" --designFile "test_data/hu.v3s2r10k/design.csv" --genome 'GRCh38-3.0.0' --kitVersion 'auto' --version '3.1.0' --ci true + - nextflow run workflow/main.nf -profile biohpc,cluster --fastq "test_data/hu.v3s2r10k/*.fastq.gz" --designFile "test_data/hu.v3s2r10k/design.csv" --genome 'GRCh38-3.0.0' --kitVersion 'auto' --version '3.1.0' --ci true - pytest -m count310 artifacts: name: "$CI_JOB_NAME" @@ -191,6 +172,6 @@ mm10-3.0.0: - workflow/output/multiqc/run/multiqc_report.html expire_in: 2 days retry: - max: 1 + max: 0 when: - always diff --git a/README.md b/README.md index e8fe72a632ec289314bce36b0fdcae53f929ef66..1edd5a8db23b710ef8e58fc406ae15592295df6d 100755 --- a/README.md +++ b/README.md @@ -111,8 +111,8 @@ To Run: ``` * Design example: -| Sample | fastq_R1 | fastq_R2 | -|---------|------------------------------------|------------------------------------| +| Sample | fastq_R1 | fastq_R2 | +|--------|----------|----------| | sample1 | pbmc_1k_v2_S1_L001_R1_001.fastq.gz | pbmc_1k_v2_S1_L001_R2_001.fastq.gz | | sample2 | pbmc_1k_v2_S2_L001_R1_001.fastq.gz | pbmc_1k_v2_S2_L001_R2_001.fastq.gz | | sample2 | pbmc_1k_v2_S2_L002_R1_001.fastq.gz | pbmc_1k_v2_S2_L002_R2_001.fastq.gz | diff --git a/astrocyte_pkg.yml b/astrocyte_pkg.yml index a58689f2e250269d7020a1d64524d5b8612ced26..e128e1ff61f118e1ab733268460d82bd14836654 100755 --- a/astrocyte_pkg.yml +++ b/astrocyte_pkg.yml @@ -150,7 +150,6 @@ workflow_parameters: choices: - ['3.1.0', '3.1.0'] - ['3.0.2', '3.0.2'] - - ['2.2.0', '2.2.0'] - ['2.1.1', '2.1.1'] required: true description: | diff --git a/docs/references.md b/docs/references.md index ea483c496889564a214e995e17e2b56e4991a557..37f42d86af5542e91c79e088be69f4f10a386a57 100644 --- a/docs/references.md +++ b/docs/references.md @@ -1,13 +1,13 @@ ### References -1. **python**: - * Anaconda (Anaconda Software Distribution, [https://anaconda.com](https://anaconda.com)) +1. **Nextflow**: + * Di Tommaso P., Chatzou M., Floden E. W., Barja P. P., Palumbo E., and Notredame C. 2017. Nextflow enables reproducible computational workflows. Nature biotechnology 35(4): 316. doi:[10.1038/nbt.3820](https://doi.org/10.1038/nbt.3820) 2. **cellranger** * Cellranger count [https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/count](https://support.10xgenomics.com/single-cell-gene-expression/software/pipelines/latest/using/count) -3. **MultiQc**: - * Ewels P., Magnusson M., Lundin S. and Käller M. 2016. MultiQC: Summarize analysis results for multiple tools and samples in a single report. Bioinformatics 32(19): 3047–3048. doi:[10.1093/bioinformatics/btw354](https://dx.doi.org/10.1093/bioinformatics/btw354) +3. **python**: + * Anaconda (Anaconda Software Distribution, [https://anaconda.com](https://anaconda.com)) -4. **Nextflow**: - * Di Tommaso P., Chatzou M., Floden E. W., Barja P. P., Palumbo E., and Notredame C. 2017. Nextflow enables reproducible computational workflows. Nature biotechnology 35(4): 316. doi:[10.1038/nbt.3820](https://doi.org/10.1038/nbt.3820) +4. **MultiQc**: + * Ewels P., Magnusson M., Lundin S. and Käller M. 2016. MultiQC: Summarize analysis results for multiple tools and samples in a single report. Bioinformatics 32(19): 3047–3048. doi:[10.1093/bioinformatics/btw354](https://dx.doi.org/10.1093/bioinformatics/btw354) diff --git a/workflow/conf/aws.config b/workflow/conf/aws.config index 6caee145d38bebcca65b4cb71b99e7dc10e930e9..86a5b3187b7418a2bdc16c1c6cedb4473a204177 100644 --- a/workflow/conf/aws.config +++ b/workflow/conf/aws.config @@ -1,4 +1,4 @@ -workDir = 's3://' +workDir = 's3://gudmap.rbk/work' aws.client.storageEncryption = 'AES256' aws { region = '' @@ -9,7 +9,6 @@ aws { process { executor = 'awsbatch' - queue = 'default-' cpus = 1 memory = '1 GB' @@ -21,10 +20,6 @@ process { cpus = 2 memory = '30 GB' } - withLabel: count220 { - cpus = 2 - memory = '30 GB' - } withLabel: count302 { cpus = 2 memory = '30 GB' diff --git a/workflow/conf/biohpc.config b/workflow/conf/biohpc.config index 56d5b65c6196d6bf9a841561bd85330cd758f775..1da174a128ff30cb2a47790566792d5f4d267cee 100644 --- a/workflow/conf/biohpc.config +++ b/workflow/conf/biohpc.config @@ -52,11 +52,6 @@ params { } } -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' diff --git a/workflow/conf/cluster.config b/workflow/conf/cluster.config index 7322376199a795c72f973f2bf14ae75c1c2c6e7b..f5842a64b6edbbb40708720592025b3965fe7a17 100644 --- a/workflow/conf/cluster.config +++ b/workflow/conf/cluster.config @@ -12,9 +12,6 @@ process { withLabel: count211 { queue = '128GB,256GB,256GBv1,384GB' } - withLabel: count220 { - queue = '128GB,256GB,256GBv1,384GB' - } withLabel: count302 { queue = '128GB,256GB,256GBv1,384GB' } diff --git a/workflow/conf/ondemand.config b/workflow/conf/ondemand.config new file mode 100644 index 0000000000000000000000000000000000000000..d89352bbf93ab79507d6ac6c28f471a63bed80a5 --- /dev/null +++ b/workflow/conf/ondemand.config @@ -0,0 +1,3 @@ +process { + queue = 'highpriority-3278a8b0-1fc8-11ea-b1ac-021e2396e2cc' +} diff --git a/workflow/conf/spot.config b/workflow/conf/spot.config new file mode 100644 index 0000000000000000000000000000000000000000..6f1bfe0669f9052ac0bec7514b9628305560d682 --- /dev/null +++ b/workflow/conf/spot.config @@ -0,0 +1,3 @@ +process { + queue = 'default-3278a8b0-1fc8-11ea-b1ac-021e2396e2cc' +} diff --git a/workflow/main.nf b/workflow/main.nf index b796771930a3b3dbc908ffb145ebd887153c3e42..4ceed7a75f55ca37b624750c353649e281a0df25 100755 --- a/workflow/main.nf +++ b/workflow/main.nf @@ -8,6 +8,15 @@ main.nf * */ +// ######## #### ###### ######## +// ## ## ## ## ## ## +// ## ## ## ## ## +// ######## ## ## ###### +// ## ## ## ## ## +// ## ## ## ## ## ## +// ######## #### ###### ## + + // Define Input variables params.name = "run" params.fastq = "test_data/mu.v3s1r500/*.fastq.gz" @@ -26,10 +35,6 @@ if (params.kitVersion == "3GEXv3" && params.version == '2.1.1') { print("Cellranger Version 2.1.1 requires kitVersion 2") System.exit(32) } -if (params.kitVersion == "3GEXv3" && params.version == '2.2.0') { - print("Cellranger Version 2.2.0 requires kitVersion 2") - System.exit(32) -} // Define variables if astrocyte (or from config) if (params.astrocyte) { @@ -55,6 +60,7 @@ if (params.astrocyte) { params.genomeLocationFull = params.genomeLocation+params.genome // Define variables from input +pipelineVersion = "2.x.x-indev" name = params.name designLocation = Channel .fromPath(params.designFile) @@ -81,6 +87,7 @@ references = "${baseDir}/../docs/references.md" * trackStart: track start of pipeline */ params.ci = false +params.dev = false process trackStart { script: """ @@ -91,11 +98,13 @@ process trackStart { curl -H 'Content-Type: application/json' -X PUT -d '{ \ "sessionId": "${workflow.sessionId}", \ "pipeline": "cellranger_count", \ + "pipelineVersion": "${pipelineVersion}", \ "start": "${workflow.start}", \ "astrocyte": ${params.astrocyte}, \ "status": "started", \ "nextflowVersion": "${workflow.nextflow.version}", - "ci": ${params.ci}}' \ + "ci": ${params.ci}, + "dev": ${params.dev}}' \ "https://xku43pcwnf.execute-api.us-east-1.amazonaws.com/ProdDeploy/pipeline-tracking" """ } @@ -105,7 +114,7 @@ process trackStart { */ process checkDesignFile { tag "${name}" - container = 'bicf/python3:2.0.0' + module 'python/3.6.1-2-anaconda' input: file designLocation @@ -137,26 +146,21 @@ samples = designPaths // Duplicate variables samples.into { samples211 - samples220 samples302 samples310 } refLocation.into { refLocation211 - refLocation220 refLocation302 refLocation310 } expectCells211 = expectCells -expectCells220 = expectCells expectCells302 = expectCells expectCells310 = expectCells forceCells211 = forceCells -forceCells220 = forceCells forceCells302 = forceCells forceCells310 = forceCells chemistryParam211 = chemistryParam -chemistryParam220 = chemistryParam chemistryParam302 = chemistryParam chemistryParam310 = chemistryParam @@ -164,10 +168,10 @@ chemistryParam310 = chemistryParam * count211: run cellranger count version 2.1.1 */ process count211 { - queue '128GB,256GB,256GBv1,384GB' tag "${sample}" publishDir "${outDir}/${task.process}", mode: 'copy' - container 'bicf/cellranger2.1.1:2.0.0' + queue '128GB,256GB,256GBv1,384GB' + module 'cellranger/2.1.1' input: set sample, file("${sample}_S1_L00?_R1_001.fastq.gz"), file("${sample}_S1_L00?_R2_001.fastq.gz") from samples211 @@ -206,60 +210,15 @@ process count211 { } } -/* - * count220: run cellranger count version 2.2.0 - */ -process count220 { - queue '128GB,256GB,256GBv1,384GB' - tag "${sample}" - publishDir "${outDir}/${task.process}", mode: 'copy' - container 'bicf/cellranger2.2.0:2.0.0' - - input: - set sample, file("${sample}_S1_L00?_R1_001.fastq.gz"), file("${sample}_S1_L00?_R2_001.fastq.gz") from samples220 - file ref from refLocation220.first() - expectCells220 - forceCells220 - chemistryParam220 - - output: - file("**/outs/**") into outPaths220 - file("*_metrics_summary.tsv") into metricsSummary220 - - when: - version == '2.2.0' - - script: - if (forceCells220 == 0) { - """ - hostname - ulimit -u 16384 - ulimit -a - bash ${baseDir}/scripts/filename_check.sh -r ${ref} - cellranger count --id=${sample} --transcriptome=./${ref} --fastqs=. --sample=${sample} --expect-cells=${expectCells220} --chemistry=${chemistryParam220} - 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 ${baseDir}/scripts/filename_check.sh -r ${ref} - cellranger count --id=${sample} --transcriptome=./${ref} --fastqs=. --sample=${sample} --force-cells=${forceCells220} --chemistry=${chemistryParam220} - sed -E 's/("([^"]*)")?(,|\$)/\\2\t/g' ${sample}/outs/metrics_summary.csv | tr -d "," | sed "s/^/${sample}\t/" > ${sample}_metrics_summary.tsv - """ - } -} /* * count302: run cellranger count version 3.0.2 */ process count302 { - queue '128GB,256GB,256GBv1,384GB' tag "${sample}" publishDir "${outDir}/${task.process}", mode: 'copy' - container 'bicf/cellranger3.0.2:2.0.0' + queue '128GB,256GB,256GBv1,384GB' + module 'cellranger/3.0.2' input: set sample, file("${sample}_S?_L001_R1_001.fastq.gz"), file("${sample}_S?_L001_R2_001.fastq.gz") from samples302 @@ -302,10 +261,10 @@ process count302 { * count310: run cellranger count version 3.1.0 */ process count310 { - queue '128GB,256GB,256GBv1,384GB' tag "${sample}" publishDir "${outDir}/${task.process}", mode: 'copy' - container 'bicf/cellranger3.1.0:2.0.0' + queue '128GB,256GB,256GBv1,384GB' + module 'cellranger/3.1.0' input: set sample, file("${sample}_S?_L001_R1_001.fastq.gz"), file("${sample}_S?_L001_R2_001.fastq.gz") from samples310 @@ -345,13 +304,13 @@ process count310 { } /* - * versions: collect too versions into a single yml + * versions: collect all versions into a single yml */ process versions { tag "${name}" - container 'bicf/python3:2.0.0' input: + file versions_pythonScript output: file("*.yaml") into yamlPaths @@ -359,17 +318,19 @@ process versions { script: """ hostname + ulimit -u 16384 ulimit -a - echo ${workflow.nextflow.version} > version_nextflow.txt - echo ${version} > version_cellranger.txt - multiqc --version | tr -d 'multiqc, version ' > version_multiqc.txt + echo "${workflow.nextflow.version}" > version_nextflow.txt + echo "${pipelineVersion}" > version_pipeline.txt + echo "${version}" > version_cellranger.txt + bash versions_python.sh > version_python.txt python3 "${baseDir}/scripts/generate_versions.py" -f version_*.txt -o versions python3 "${baseDir}/scripts/generate_references.py" -r "${references}" -o references """ } // Collect all metrics summaries reguardless of cellranger version -metricsSummary = metricsSummary211.mix(metricsSummary220, metricsSummary302, metricsSummary310) +metricsSummary = metricsSummary211.mix(metricsSummary302, metricsSummary310) /* * multiqc: create multiqc report diff --git a/workflow/nextflow.config b/workflow/nextflow.config index b05454d76d7f73ef9e519d33530d746af19af762..32b90f699ad2e153e38a1d9d6a914a109ce05c6a 100644 --- a/workflow/nextflow.config +++ b/workflow/nextflow.config @@ -1,39 +1,24 @@ profiles { + standard { + includeConfig 'configs/biohpc.config' + } biohpc { - includeConfig 'conf/biohpc.config' + includeConfig 'configs/biohpc.config' } local { - includeConfig 'conf/local.config' + includeConfig 'configs/local.config' } cluster { - includeConfig 'conf/cluster.config' + includeConfig 'configs/cluster.config' } aws { - includeConfig 'conf/aws.config' - } -} - -process { - withName:checkDesignFile { - container = 'bicf/python3:2.0.0' - } - withName:count211 { - container = 'bicf/cellranger2.1.1:2.0.0' - } - withName:count220 { - container = 'bicf/cellranger2.2.0:2.0.0' - } - withName:count302 { - container = 'bicf/cellranger3.0.2:2.0.0' - } - withName:count310 { - container = 'bicf/cellranger3.1.0:2.0.0' + includeConfig 'configs/aws.config' } - withName:versions { - container = 'bicf/python3:2.0.0' + ondemand { + includeConfig 'configs/ondemand.config' } - withName:multiqc { - container = 'bicf/multiqc:2.0.0' + spot { + includeConfig 'configs/spot.config' } } @@ -62,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 = 'publish_2.0.4' + version = '2.x.x-indev' nextflowVersion = '>=0.31.0' } diff --git a/workflow/scripts/generate_versions.py b/workflow/scripts/generate_versions.py index ddcda535f6bf1f8350f5aa148af517f2c421c272..978aedc56c4774b2e6a3556ff0c0f7dccb76eadf 100755 --- a/workflow/scripts/generate_versions.py +++ b/workflow/scripts/generate_versions.py @@ -24,9 +24,10 @@ logger.propagate = False logger.setLevel(logging.INFO) SOFTWARE_REGEX = { + 'Pipeline': ['version_pipeline.txt', r"(\S+)"], 'Nextflow': ['version_nextflow.txt', r"(\S+)"], - 'Cellranger Count': ['version_cellranger.txt', r"(\S+)"], - 'MultiQC': ['version_multiqc.txt', r"(\S+)"], + 'cellranger count': ['version_cellranger.txt', r"(\S+)"], + 'python': ['version_python.txt', r"(\S+)"], } @@ -72,9 +73,10 @@ def main(): out_filename = output + '_mqc.yaml' results = OrderedDict() + results['Pipeline'] = '<span style="color:#999999;\">N/A</span>' results['Nextflow'] = '<span style="color:#999999;\">N/A</span>' - results['Cellranger Count'] = '<span style="color:#999999;\">N/A</span>' - results['MultiQC'] = '<span style="color:#999999;\">N/A</span>' + results['cellranger count'] = '<span style="color:#999999;\">N/A</span>' + results['python'] = '<span style="color:#999999;\">N/A</span>' # Check for version files: check_files(files) @@ -106,4 +108,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/workflow/scripts/versions_python.sh b/workflow/scripts/versions_python.sh new file mode 100644 index 0000000000000000000000000000000000000000..ff79391c3bec5b92eea8d8376c57682201c34271 --- /dev/null +++ b/workflow/scripts/versions_python.sh @@ -0,0 +1,9 @@ +#!/bin/bash +#versions_python.sh +#* +#* -------------------------------------------------------------------------- +#* Licensed under MIT (https://git.biohpc.swmed.edu/BICF/Astrocyte/cellranger_count/blob/develop/LICENSE) +#* -------------------------------------------------------------------------- +#* + +python --version |& grep 'Python ' | sed -n -e 's/^Python //p'